如何实现模幂运算?

时间:2018-02-12 02:10:02

标签: python algorithm pow modular-arithmetic cryptanalysis

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

我尝试过的事情:

  1. Python的pow()函数需要花费数小时才能产生结果。 (如果有人能告诉我它是如何实施的,那将非常有帮助!)

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

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

  4. 我可以进行任何优化吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

为了加快计算速度,您可能需要查看gmpy2。它包装了GMP多精度库,速度更快。我跑了一个快速测试,我认为它会快〜100倍。

免责声明:我维持gmpy2。