为什么python算法中给定数字的最大素数因子有效?

时间:2016-05-13 04:31:05

标签: python python-3.x primes prime-factoring

我无法理解我在本网站上遇到的以下代码块。它创建了一个函数来找出给定数字的最大素数因子。它在下面给出:

def prime_factors(n):
"""Returns all the prime factors of a positive integer"""
factors = []
d = 2
while n > 1:
    while n % d == 0:
        factors.append(d)
        n /= d
    d = d + 1

return factors
pfs = prime_factors(1000)
largest_prime_factor = max(pfs) # The largest element in the prime 

我怀疑函数prime_factors(n)会返回n因子而不是素数因子,因为while循环只是检查dn的因子,而不是它是否也应该是素数。

请指出我是否错了,以及你的逻辑背后的原因。此外,如果我是正确的,那么请简单地提供一个合适的代码块及其背后的逻辑。尽量保持代码尽可能简单。

2 个答案:

答案 0 :(得分:2)

请注意,在内循环中,迭代时n除以d

while n % d == 0:
    factors.append(d)
    n /= d

这意味着,在每次迭代之后,n的新值不再可以被d整除。

举一个例子,让我们说n = 3000,它有一个不是素数的因子15。但是,由于n首先由d = 3d = 5传递,因此当d到达15时,n将是&3 #39; s不能被515整除,因此非素数因子n % d == 0现在不会通过VALUES \([0-9]+,

答案 1 :(得分:2)

此功能正确,注意第二块时间。它将连续地将给定数字除以d变量,当除法结果有余数时,它将离开此块并将d递增1,然后它将再次运行。

考虑到这一点,这个函数会将数字除以2而不留下余数,然后它将移动到下一个不会留下余数的数字。最后,结果只包含素数。

它会是这样的:

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

print(prime_factors(1000)) # will print [2, 2, 2, 5, 5, 5]