Numbers factorization











up vote
1
down vote

favorite












The task is to write function that foldes number into prime factors. By given number 'n' this function should return a list of tuples p_i,c^i, for example if input is 100, the output is (2,2),(5,2).
So, here is how i try to write it:



def factor(n):
c = 1
pre_ans = list()
temp_n=n
for i in range(2,temp_n+1):
if (is_prime(i) == True) and (temp_n % i == 0):
for j in range (2,temp_n+1):
if (temp_n % (i ** j) == 0):
pre_ans.append((i,j))
temp_n /= (i **j)
pre_ans.append((i,c))
temp_n /= i
print(pre_ans)


It works wrong but I can't find a mistake :(










share|improve this question






















  • is_prime is function: def is_prime(n): return n > 1 and all(n % i != 0 for i in range(2, n))
    – Daniil
    Nov 10 at 20:46












  • What is your question?
    – roganjosh
    Nov 10 at 20:52










  • Also, why haven't you included is_prime as a properly edited function in your question? Please edit it in.
    – roganjosh
    Nov 10 at 20:53










  • my question is that why this exact code does not work right, though i find it ideologically correct. If i'm doing smth wrong, then please correct me
    – Daniil
    Nov 10 at 20:59










  • Please provide an example of your code's output for a given input.
    – roeen30
    Nov 10 at 21:27















up vote
1
down vote

favorite












The task is to write function that foldes number into prime factors. By given number 'n' this function should return a list of tuples p_i,c^i, for example if input is 100, the output is (2,2),(5,2).
So, here is how i try to write it:



def factor(n):
c = 1
pre_ans = list()
temp_n=n
for i in range(2,temp_n+1):
if (is_prime(i) == True) and (temp_n % i == 0):
for j in range (2,temp_n+1):
if (temp_n % (i ** j) == 0):
pre_ans.append((i,j))
temp_n /= (i **j)
pre_ans.append((i,c))
temp_n /= i
print(pre_ans)


It works wrong but I can't find a mistake :(










share|improve this question






















  • is_prime is function: def is_prime(n): return n > 1 and all(n % i != 0 for i in range(2, n))
    – Daniil
    Nov 10 at 20:46












  • What is your question?
    – roganjosh
    Nov 10 at 20:52










  • Also, why haven't you included is_prime as a properly edited function in your question? Please edit it in.
    – roganjosh
    Nov 10 at 20:53










  • my question is that why this exact code does not work right, though i find it ideologically correct. If i'm doing smth wrong, then please correct me
    – Daniil
    Nov 10 at 20:59










  • Please provide an example of your code's output for a given input.
    – roeen30
    Nov 10 at 21:27













up vote
1
down vote

favorite









up vote
1
down vote

favorite











The task is to write function that foldes number into prime factors. By given number 'n' this function should return a list of tuples p_i,c^i, for example if input is 100, the output is (2,2),(5,2).
So, here is how i try to write it:



def factor(n):
c = 1
pre_ans = list()
temp_n=n
for i in range(2,temp_n+1):
if (is_prime(i) == True) and (temp_n % i == 0):
for j in range (2,temp_n+1):
if (temp_n % (i ** j) == 0):
pre_ans.append((i,j))
temp_n /= (i **j)
pre_ans.append((i,c))
temp_n /= i
print(pre_ans)


It works wrong but I can't find a mistake :(










share|improve this question













The task is to write function that foldes number into prime factors. By given number 'n' this function should return a list of tuples p_i,c^i, for example if input is 100, the output is (2,2),(5,2).
So, here is how i try to write it:



def factor(n):
c = 1
pre_ans = list()
temp_n=n
for i in range(2,temp_n+1):
if (is_prime(i) == True) and (temp_n % i == 0):
for j in range (2,temp_n+1):
if (temp_n % (i ** j) == 0):
pre_ans.append((i,j))
temp_n /= (i **j)
pre_ans.append((i,c))
temp_n /= i
print(pre_ans)


It works wrong but I can't find a mistake :(







python python-3.x primes factorization






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 10 at 20:46









Daniil

62




62












  • is_prime is function: def is_prime(n): return n > 1 and all(n % i != 0 for i in range(2, n))
    – Daniil
    Nov 10 at 20:46












  • What is your question?
    – roganjosh
    Nov 10 at 20:52










  • Also, why haven't you included is_prime as a properly edited function in your question? Please edit it in.
    – roganjosh
    Nov 10 at 20:53










  • my question is that why this exact code does not work right, though i find it ideologically correct. If i'm doing smth wrong, then please correct me
    – Daniil
    Nov 10 at 20:59










  • Please provide an example of your code's output for a given input.
    – roeen30
    Nov 10 at 21:27


















  • is_prime is function: def is_prime(n): return n > 1 and all(n % i != 0 for i in range(2, n))
    – Daniil
    Nov 10 at 20:46












  • What is your question?
    – roganjosh
    Nov 10 at 20:52










  • Also, why haven't you included is_prime as a properly edited function in your question? Please edit it in.
    – roganjosh
    Nov 10 at 20:53










  • my question is that why this exact code does not work right, though i find it ideologically correct. If i'm doing smth wrong, then please correct me
    – Daniil
    Nov 10 at 20:59










  • Please provide an example of your code's output for a given input.
    – roeen30
    Nov 10 at 21:27
















is_prime is function: def is_prime(n): return n > 1 and all(n % i != 0 for i in range(2, n))
– Daniil
Nov 10 at 20:46






is_prime is function: def is_prime(n): return n > 1 and all(n % i != 0 for i in range(2, n))
– Daniil
Nov 10 at 20:46














What is your question?
– roganjosh
Nov 10 at 20:52




What is your question?
– roganjosh
Nov 10 at 20:52












Also, why haven't you included is_prime as a properly edited function in your question? Please edit it in.
– roganjosh
Nov 10 at 20:53




Also, why haven't you included is_prime as a properly edited function in your question? Please edit it in.
– roganjosh
Nov 10 at 20:53












my question is that why this exact code does not work right, though i find it ideologically correct. If i'm doing smth wrong, then please correct me
– Daniil
Nov 10 at 20:59




my question is that why this exact code does not work right, though i find it ideologically correct. If i'm doing smth wrong, then please correct me
– Daniil
Nov 10 at 20:59












Please provide an example of your code's output for a given input.
– roeen30
Nov 10 at 21:27




Please provide an example of your code's output for a given input.
– roeen30
Nov 10 at 21:27












2 Answers
2






active

oldest

votes

















up vote
0
down vote













Your general idea is ok. However there are some minor issues with the following part of your code:



for j in range (2,temp_n+1):
if (temp_n % (i ** j) == 0):
pre_ans.append((i,j))
temp_n /= (i **j)
pre_ans.append((i,c))
temp_n /= i


In fact the main problem is that you need to iterate in the other direction in this statement for j in range (2,temp_n+1). If you rewrite it like



def factor(n):
c = 1
pre_ans = list()
temp_n=n
for i in range(2,temp_n+1):
if (is_prime(i) == True) and (temp_n % i == 0):
for j in range (temp_n+1, 0,-1):
if (temp_n % (i ** j) == 0):
pre_ans.append((i,j))
temp_n /= (i **j)
print(pre_ans)


it will work. The whole code can also get written a bit shorter:



from collections import Counter

def factor(n):
lst =
for i in range(2, n+1):
while n % i == 0:
lst.append(i)
n = n / i
return Counter(lst).items()

print(factor(100))





share|improve this answer



















  • 1




    What does this have to do with the question at all?
    – roganjosh
    Nov 10 at 20:54










  • It's not a short solution. Where are you processing a list of tuples and where are you giving out prime factors? It's almost like you've just dumped code from another question.
    – roganjosh
    Nov 10 at 20:59










  • @roganjosh A list of tupels is returned by the Counter function. Don't need to do this by myself.
    – quant
    Nov 10 at 21:05


















up vote
0
down vote













Fixed the code. This is working version



def factor(n):
c = 1
pre_ans = list()
temp_n=n
for i in range(2, n // 2 + 1):
if (is_prime(i) == True):
k = 1
while temp_n % (i ** k) == 0:
if temp_n % (i ** (k + 1)) == 0:
k += 1
else:
k += 1
break
if k > 1:
pre_ans.append((i, k - 1))
return pre_ans





share|improve this answer








New contributor




Daniil is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.


















    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














     

    draft saved


    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53243241%2fnumbers-factorization%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes








    up vote
    0
    down vote













    Your general idea is ok. However there are some minor issues with the following part of your code:



    for j in range (2,temp_n+1):
    if (temp_n % (i ** j) == 0):
    pre_ans.append((i,j))
    temp_n /= (i **j)
    pre_ans.append((i,c))
    temp_n /= i


    In fact the main problem is that you need to iterate in the other direction in this statement for j in range (2,temp_n+1). If you rewrite it like



    def factor(n):
    c = 1
    pre_ans = list()
    temp_n=n
    for i in range(2,temp_n+1):
    if (is_prime(i) == True) and (temp_n % i == 0):
    for j in range (temp_n+1, 0,-1):
    if (temp_n % (i ** j) == 0):
    pre_ans.append((i,j))
    temp_n /= (i **j)
    print(pre_ans)


    it will work. The whole code can also get written a bit shorter:



    from collections import Counter

    def factor(n):
    lst =
    for i in range(2, n+1):
    while n % i == 0:
    lst.append(i)
    n = n / i
    return Counter(lst).items()

    print(factor(100))





    share|improve this answer



















    • 1




      What does this have to do with the question at all?
      – roganjosh
      Nov 10 at 20:54










    • It's not a short solution. Where are you processing a list of tuples and where are you giving out prime factors? It's almost like you've just dumped code from another question.
      – roganjosh
      Nov 10 at 20:59










    • @roganjosh A list of tupels is returned by the Counter function. Don't need to do this by myself.
      – quant
      Nov 10 at 21:05















    up vote
    0
    down vote













    Your general idea is ok. However there are some minor issues with the following part of your code:



    for j in range (2,temp_n+1):
    if (temp_n % (i ** j) == 0):
    pre_ans.append((i,j))
    temp_n /= (i **j)
    pre_ans.append((i,c))
    temp_n /= i


    In fact the main problem is that you need to iterate in the other direction in this statement for j in range (2,temp_n+1). If you rewrite it like



    def factor(n):
    c = 1
    pre_ans = list()
    temp_n=n
    for i in range(2,temp_n+1):
    if (is_prime(i) == True) and (temp_n % i == 0):
    for j in range (temp_n+1, 0,-1):
    if (temp_n % (i ** j) == 0):
    pre_ans.append((i,j))
    temp_n /= (i **j)
    print(pre_ans)


    it will work. The whole code can also get written a bit shorter:



    from collections import Counter

    def factor(n):
    lst =
    for i in range(2, n+1):
    while n % i == 0:
    lst.append(i)
    n = n / i
    return Counter(lst).items()

    print(factor(100))





    share|improve this answer



















    • 1




      What does this have to do with the question at all?
      – roganjosh
      Nov 10 at 20:54










    • It's not a short solution. Where are you processing a list of tuples and where are you giving out prime factors? It's almost like you've just dumped code from another question.
      – roganjosh
      Nov 10 at 20:59










    • @roganjosh A list of tupels is returned by the Counter function. Don't need to do this by myself.
      – quant
      Nov 10 at 21:05













    up vote
    0
    down vote










    up vote
    0
    down vote









    Your general idea is ok. However there are some minor issues with the following part of your code:



    for j in range (2,temp_n+1):
    if (temp_n % (i ** j) == 0):
    pre_ans.append((i,j))
    temp_n /= (i **j)
    pre_ans.append((i,c))
    temp_n /= i


    In fact the main problem is that you need to iterate in the other direction in this statement for j in range (2,temp_n+1). If you rewrite it like



    def factor(n):
    c = 1
    pre_ans = list()
    temp_n=n
    for i in range(2,temp_n+1):
    if (is_prime(i) == True) and (temp_n % i == 0):
    for j in range (temp_n+1, 0,-1):
    if (temp_n % (i ** j) == 0):
    pre_ans.append((i,j))
    temp_n /= (i **j)
    print(pre_ans)


    it will work. The whole code can also get written a bit shorter:



    from collections import Counter

    def factor(n):
    lst =
    for i in range(2, n+1):
    while n % i == 0:
    lst.append(i)
    n = n / i
    return Counter(lst).items()

    print(factor(100))





    share|improve this answer














    Your general idea is ok. However there are some minor issues with the following part of your code:



    for j in range (2,temp_n+1):
    if (temp_n % (i ** j) == 0):
    pre_ans.append((i,j))
    temp_n /= (i **j)
    pre_ans.append((i,c))
    temp_n /= i


    In fact the main problem is that you need to iterate in the other direction in this statement for j in range (2,temp_n+1). If you rewrite it like



    def factor(n):
    c = 1
    pre_ans = list()
    temp_n=n
    for i in range(2,temp_n+1):
    if (is_prime(i) == True) and (temp_n % i == 0):
    for j in range (temp_n+1, 0,-1):
    if (temp_n % (i ** j) == 0):
    pre_ans.append((i,j))
    temp_n /= (i **j)
    print(pre_ans)


    it will work. The whole code can also get written a bit shorter:



    from collections import Counter

    def factor(n):
    lst =
    for i in range(2, n+1):
    while n % i == 0:
    lst.append(i)
    n = n / i
    return Counter(lst).items()

    print(factor(100))






    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited Nov 10 at 21:09

























    answered Nov 10 at 20:52









    quant

    1,43411226




    1,43411226








    • 1




      What does this have to do with the question at all?
      – roganjosh
      Nov 10 at 20:54










    • It's not a short solution. Where are you processing a list of tuples and where are you giving out prime factors? It's almost like you've just dumped code from another question.
      – roganjosh
      Nov 10 at 20:59










    • @roganjosh A list of tupels is returned by the Counter function. Don't need to do this by myself.
      – quant
      Nov 10 at 21:05














    • 1




      What does this have to do with the question at all?
      – roganjosh
      Nov 10 at 20:54










    • It's not a short solution. Where are you processing a list of tuples and where are you giving out prime factors? It's almost like you've just dumped code from another question.
      – roganjosh
      Nov 10 at 20:59










    • @roganjosh A list of tupels is returned by the Counter function. Don't need to do this by myself.
      – quant
      Nov 10 at 21:05








    1




    1




    What does this have to do with the question at all?
    – roganjosh
    Nov 10 at 20:54




    What does this have to do with the question at all?
    – roganjosh
    Nov 10 at 20:54












    It's not a short solution. Where are you processing a list of tuples and where are you giving out prime factors? It's almost like you've just dumped code from another question.
    – roganjosh
    Nov 10 at 20:59




    It's not a short solution. Where are you processing a list of tuples and where are you giving out prime factors? It's almost like you've just dumped code from another question.
    – roganjosh
    Nov 10 at 20:59












    @roganjosh A list of tupels is returned by the Counter function. Don't need to do this by myself.
    – quant
    Nov 10 at 21:05




    @roganjosh A list of tupels is returned by the Counter function. Don't need to do this by myself.
    – quant
    Nov 10 at 21:05












    up vote
    0
    down vote













    Fixed the code. This is working version



    def factor(n):
    c = 1
    pre_ans = list()
    temp_n=n
    for i in range(2, n // 2 + 1):
    if (is_prime(i) == True):
    k = 1
    while temp_n % (i ** k) == 0:
    if temp_n % (i ** (k + 1)) == 0:
    k += 1
    else:
    k += 1
    break
    if k > 1:
    pre_ans.append((i, k - 1))
    return pre_ans





    share|improve this answer








    New contributor




    Daniil is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.






















      up vote
      0
      down vote













      Fixed the code. This is working version



      def factor(n):
      c = 1
      pre_ans = list()
      temp_n=n
      for i in range(2, n // 2 + 1):
      if (is_prime(i) == True):
      k = 1
      while temp_n % (i ** k) == 0:
      if temp_n % (i ** (k + 1)) == 0:
      k += 1
      else:
      k += 1
      break
      if k > 1:
      pre_ans.append((i, k - 1))
      return pre_ans





      share|improve this answer








      New contributor




      Daniil is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.




















        up vote
        0
        down vote










        up vote
        0
        down vote









        Fixed the code. This is working version



        def factor(n):
        c = 1
        pre_ans = list()
        temp_n=n
        for i in range(2, n // 2 + 1):
        if (is_prime(i) == True):
        k = 1
        while temp_n % (i ** k) == 0:
        if temp_n % (i ** (k + 1)) == 0:
        k += 1
        else:
        k += 1
        break
        if k > 1:
        pre_ans.append((i, k - 1))
        return pre_ans





        share|improve this answer








        New contributor




        Daniil is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
        Check out our Code of Conduct.









        Fixed the code. This is working version



        def factor(n):
        c = 1
        pre_ans = list()
        temp_n=n
        for i in range(2, n // 2 + 1):
        if (is_prime(i) == True):
        k = 1
        while temp_n % (i ** k) == 0:
        if temp_n % (i ** (k + 1)) == 0:
        k += 1
        else:
        k += 1
        break
        if k > 1:
        pre_ans.append((i, k - 1))
        return pre_ans






        share|improve this answer








        New contributor




        Daniil is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
        Check out our Code of Conduct.









        share|improve this answer



        share|improve this answer






        New contributor




        Daniil is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
        Check out our Code of Conduct.









        answered Nov 11 at 17:31









        Daniil

        62




        62




        New contributor




        Daniil is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
        Check out our Code of Conduct.





        New contributor





        Daniil is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
        Check out our Code of Conduct.






        Daniil is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
        Check out our Code of Conduct.






























             

            draft saved


            draft discarded



















































             


            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53243241%2fnumbers-factorization%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Xamarin.iOS Cant Deploy on Iphone

            Glorious Revolution

            Dulmage-Mendelsohn matrix decomposition in Python