我正在尝试计算这样的东西:a ^ b mod c,其中所有三个数字都很大。
我尝试过的事情:
Python的pow()函数需要花费数小时才能产生结果。 (如果有人能告诉我它是如何实施的,那将非常有帮助!)
我用O(log e)时间实现的从右到左的二进制方法大约需要30~40个小时(不要等那么久)。
各种递归方法产生分段错误(在我更改递归限制之后)
我可以进行任何优化吗?
答案 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。