我正在尝试修改一个使用Pollard Rho方法来计算整数因子的函数,但是我尝试使用memoize并没有改进能够将特定数字(N = 7331117)计算为该函数应该能够facotr。
尝试前:
import fractions
def pollard_Rho(n):
def f(xn):
if xn == 0:
return 2
return f(xn - 1) ** 2 + 1
i = 0
x = f(i)
y = f(f(i))
d = fractions.gcd(abs(x - y), n)
while d == 1:
i = i + 1
d = fractions.gcd(abs(x - y), n)
root1 = d
root2 = n / d
print i + 1
return (root1, root2)
记忆尝试:
def pollard_Rho(n):
class memoize:
def __init__(self, function):
self.function = function
self.memoized = {}
def __call__(self, *args):
try:
return self.memoized[args]
except KeyError:
self.memoized[args] = self.function(*args)
return self.memoized[args]
@memoize
def f(xn):
if xn == 0:
return 2
return f(xn - 1) ** 2 + 1
i = 0
x = f(i)
y = f(f(i))
d = fractions.gcd(abs(x - y), n)
while d == 1:
i = i + 1
d = fractions.gcd(abs(x - y), n)
root1 = d
root2 = n / d
print i + 1
return (root1, root2)
现在两个代码都没有产生任何错误,但这两个代码也会产生任何结果。
的输出
print pollard_Rho(7331117)
应该是(641,11437)(我知道这是因为我写过的另一个分解函数)但实际发生的是代码运行了3次迭代的while循环,之后什么也没发生。有没有人有任何建议?
对于这个模糊的问题,很抱歉,有没有人对提高代码能力的一般因素有什么建议?也许通过一种比递归函数更有效的方法? 7331116和7331118因素非常精细,到目前为止,使用这种方法只有7331117似乎是一个难以解决的问题。
可能我没有正确使用memoize,因为即使查看stackoverflow示例,我也不太明白如何使用它。似乎我遇到的每一个例子都是截然不同的。
答案 0 :(得分:0)
似乎您的算法因某些原因无效。为了看看发生了什么,我去了算法的维基百科网站,并从那里实现了常规版本,它没有问题。比我用递归版替换了我的g函数,我得到了以下错误
File "rho.py", line 25, in f_fun
return 2 if xn == 0 else f_fun(xn - 1) ** 2 + 1
RecursionError: maximum recursion depth exceeded
看起来你不能通过常规递归来实现它。我建议将你的递归转换为折叠或生成器。
这是我尝试过的代码:
https://gist.github.com/huseyinyilmaz/73c1ac42b2a20d24d3b5
更新: 这是您的缓存版本,它仍然有最大的深度问题。 (python 2实现) https://gist.github.com/huseyinyilmaz/bb26ac172fbec4c655d3