我写了几个用于执行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
发生了什么事?
答案 0 :(得分:2)
您的函数non_recursive_expmod
中包含一些可疑步骤:在开头删除%m
和x
的{{1}}。两者都不需要。
此外,使用y
确保y
的除法是整数除法。
总的来说,功能应如下所示:
y = y // 2
答案 1 :(得分:0)
非递归不会减少y,如果它是奇数,甚至部分需要其他情况y == 1