Why does the function not work properly when processing numbers?

so I’m trying to get the of a given number. The thing is, the code prints the wrong message and it also doesn’t work with all numbers. Why is that?

This is the part to get the factors:

thefactors = []
            d = 2
            while d*d <= number:
                while (number % d) == 0:
                    factors.append(d) 
                    number //= d
                d += 1
                break

            if number > 1:
                factors.append(number)
                print('The factors of {} are:'.format(number), thefactors)

What’s going on and how do I fix it?

Answer

The issue I see is that you are both checking that the square of d is less than n (d*d <= n or d**2 <= n) AND that you reassign n when a factor is discovered (n //= d). This is not including the unnecessary break statement.

Here’s what I did:

>>> def factorization(n):
        factors = []
        d = 2
        while d <= n:
            if n % d == 0:
                factors.append(d)
                n //= d
                d = 2
            else:
                d += 1
        return factors

>>> factorization(104)
[2, 2, 2, 13]
>>> factorization(9)
[3, 3]
>>> 

This method implicitly checks that d**2 is less than or equal to n, since, to satisfy the while condition, n // d must be less than or equal to d, thus d**2 must be less than or equal to n.

To print the prime factorization:

>>> num = 104
>>> factors = factorization(num)
>>> print(f"The prime factors of {num} are {factors}")
The prime factors of 104 are [2, 2, 2, 13]
>>> print(f"The prime factors of {num} are {', '.join(factors)}")
The prime factors of 104 are 2, 2, 2, 13