如何实现模幂运算?

How to implement modular exponentiation?

我正在尝试这样计算:a^b mod c,其中三个数字都很大。

我尝试过的事情:

  1. Python 的 pow() 函数需要几个小时,但尚未产生结果。 (如果有人能告诉我它是如何实现的,那将非常有帮助!)

  2. 我实现的一个从右到左的二进制方法,用 O(log e) 时间,大约需要 30~40 小时(不想等那么久)。

  3. 各种递归方法产生分段错误(在我更改递归限制后)

我可以做哪些优化?

听起来您正在尝试评估 pow(a, b) % c。您应该使用 3 参数形式 pow(a, b, c),它利用了 a * b mod c == a mod c * b mod c 这一事实,这意味着您可以在计算 a ^ b 时减少子积,而不是让先做所有的乘法。

Python 使用 Karatsuba 乘法,因此 运行 乘法时间为 O(n^1.585)。但是除法仍然是 O(n^2).

对于求幂,Python 使用从左到右的方法,5 位 window。 (它一次消耗 5 位而不是 1 位。它确实使用更多内存但通常会更快。)

为了加快计算速度,您可能需要查看 gmpy2。它包装了 GMP 多精度库并且会更快。我 运行 进行了快速测试,我认为它会快 ~100 倍。

免责声明:我维护 gmpy2。