为什么这两个expmod实现对于大值有所不同?

时间:2011-12-20 15:07:11

标签: python algorithm

我写了几个用于执行expmod的功能,即(x ** y) % n。这些都是标准功能,我已经检查并重新检查了两者,但找不到任何愚蠢的错误。

这是递归的:

def expmod(x,y,m):
    if y == 0: return 1
    if y % 2 == 0:
        return square(expmod(x,y/2,m)) % m # def square(x): return x*x
    else:
        return (x * expmod(x,y-1,m)) % m

...这里是非递归的:

def non_recursive_expmod(x,y,m):
    x = x % m
    y = y % m
    result = 1
    while y > 0:
        if(y%2 == 1):
            result = (result * x) % m
        x = (x*x) % m
        y = y/2
    return result

他们同意小的价值观:

>>> expmod(123,456,789) - non_recursive_expmod(123,456,789)
0

...但不适合较大的那些:

>>> expmod(24354321,5735275,654) - non_recursive_expmod(24354321,5735275,654)
-396L

发生了什么事?

2 个答案:

答案 0 :(得分:2)

您的函数non_recursive_expmod中包含一些可疑步骤:在开头删除%mx的{​​{1}}。两者都不需要。

此外,使用y确保y的除法是整数除法。

总的来说,功能应如下所示:

y = y // 2

答案 1 :(得分:0)

非递归不会减少y,如果它是奇数,甚至部分需要其他情况y == 1