素数因子化+优化中的递归问题

时间:2012-11-20 23:01:41

标签: python recursion prime-factoring

我正在为任何数字的因子创建一个模块。在其中,我还有两个函数(一个导致调用另一个函数)找到数字的素数因子,n。

出现的问题是递归错误(如果我的递归定义是正确的)。 当我为一个数字调用函数时,它会打印所有素数因子,然后它会添加最后两个素数因子并再次打印它,并重复执行,显然没有结束。

到目前为止我的代码:

def primeFactors(n):
   from primenum2 import isPrime
   from math import sqrt
   global pFact, y
   x, pFact, y = 2, [], 0
   if isPrime(n):
      return n
   else:
      while x <= sqrt(n):
         if isPrime(x) and (n%x==0):
            pFact.append(x)
            y = n / x
            if isPrime(y):
               pFact.append(y)
               print pFact
               break
            else:
               primeFactors2(y)
         else:
            x += 1

#NEW FUNCTION - I made two functions to avoid another recursion error that was occuring.

def primeFactors2(y):
   from primenum2 import isPrime
   from math import sqrt
   z = 2
   while z <= sqrt(y):
      if isPrime(z) and (y%z==0):
         pFact.append(z)
         y = y / z
         if isPrime(y):
            pFact.append(y)
            print pFact
            break
         else:
            primeFactors2(y)
      else:
         z += 1

当我输入(在Shell中)时:primeFactors(600851475143)&lt; ---这是Project Euler最初的

预期输出(我已经解决了问题):[71, 839, 1471, 6857L]

实际输出:

[71, 839, 1471, 6857L]
[71, 839, 1471, 6857L, 1471, 6857L]
[71, 839, 1471, 6857L, 1471, 6857L, 71, 839, 1471, 6857L]
[71, 839, 1471, 6857L, 1471, 6857L, 71, 839, 1471, 6857L, 1471, 6857L]
[71, 839, 1471, 6857L, 1471, 6857L, 71, 839, 1471, 6857L, 1471, 6857L, 71, 839, 1471, 6857L]

它一遍又一遍地执行此操作,将1471和6857L附加到列表中,然后再次打印它。然后,它再次添​​加所有素数因子,然后再次打印。不知道为什么会这样做。任何输入都非常感谢。另外,如果有任何方法可以使这段代码更快/更Pythonic,请告诉我:)谢谢

1 个答案:

答案 0 :(得分:2)

你做的太多了。您不需要isPrime或递归函数。这是基于试验分割的最简单可能的整数因子函数的伪代码:

define factors(n)
  f := 2
  while f * f <= n
    if n % f == 0
      output f
      n := n / f
    else
      f := f + 1
  output n

虽然这对于Project Euler#3来说已经足够了,但有更好的方法来计算整数。当你准备好了,我谦虚地推荐{@ 3}}在我的博客上,其中包括这个因子分解算法,以及其他一些,用五种语言实现,包括Python。