Python中的模块化指数算法

时间:2014-04-05 22:09:59

标签: python algorithm modular-arithmetic

我创建了一个计算大型模块指数的函数。我知道这个函数内置于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时开始失败,我不太清楚为什么。

1 个答案:

答案 0 :(得分:-1)

我的猜测是Python的pow()double下工作。失败的第一个值(38508450670424585)的日志基数2约为55,但double只有53位精度,因此大于2 ^ 53的整数必须完全表示。我的猜测是,如果你检查最后一个成功的数字的基数2(即x = 16),它将小于53.