我创建了一个计算大型模块指数的函数。我知道这个函数内置于python语言中。对于大于17位的数字,我的功能不正确,我无法弄清楚原因。非常感谢任何帮助。
from random import randint
def modpow(x,n,m):
if n == 0:
return 1
elif n == 1:
return x
elif n%2 == 0:
return modpow(x*(x%m),n/2,m)%m
elif n%2 == 1:
return (x * modpow(x*(x%m),(n-1)/2,m)%m )%m
for i in range(5,32):
x = ''
n = ''
m = ''
for j in range(i):
x += str(randint(0,9))
n += str(randint(0,9))
m += str(randint(0,9))
x = int(x)
n = int(n)
m = int(m)
if pow(x,n,m) != modpow(x,n,m):
print(i,x,n,m)
示例输出:
17 38508450670424585 67111951647554134 59005802612594983
18 24027200512104766 205942669690724726 816654795945860553
...
我已经多次运行它并且总是在i = 17时开始失败,我不太清楚为什么。
答案 0 :(得分:-1)
我的猜测是Python的pow()
在double
下工作。失败的第一个值(38508450670424585)的日志基数2约为55,但double
只有53位精度,因此大于2 ^ 53的整数必须完全表示。我的猜测是,如果你检查最后一个成功的数字的基数2(即x = 16),它将小于53.