python - Python 中的模幂算法

标签 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 时开始失败,我不太清楚为什么。

最佳答案

我的猜测是 Python 的 pow() 在底层对 double 起作用。第一个失败的值(38508450670424585)的对数基数 2 大约是 55,但是 double 的精度只有 53 位,因此不一定能表示大于 2^53 的整数确切地。我的猜测是,如果您检查最后一个成功的数字的对数基数 2(即对于 x=16),它将小于 53。

关于python - Python 中的模幂算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22887498/

相关文章:

algorithm - 拓扑搜索和广度优先搜索

c++ - 内置模组 ('%' ) 与自定义模组函数 : improve the performance of modulus operation

rust - 如何在不溢出的情况下对另一个数字进行算术模运算?

python - 来自 pandas 数据帧行的具有分隔范围的 2D numpy 数组

python - 对元组排序时忽略不可排序的数据类型

java - 如何随机排列列表中的特定元素集?

validation - 如何创建类型安全的范围受限数字类型?

Python:将字母数字字符串可逆地编码为整数

python - Pyinotify/Watchdog 在一次编辑中触发修改事件两次

algorithm - 出现n次的最长子串