Python 2.7使用memoize

时间:2015-11-01 00:35:57

标签: python python-2.7 recursion memoization

我正在尝试修改一个使用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示例,我也不太明白如何使用它。似乎我遇到的每一个例子都是截然不同的。

1 个答案:

答案 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