如何实现模幂运算?
How to implement modular exponentiation?
我正在尝试这样计算:a^b mod c,其中三个数字都很大。
我尝试过的事情:
Python 的 pow() 函数需要几个小时,但尚未产生结果。 (如果有人能告诉我它是如何实现的,那将非常有帮助!)
我实现的一个从右到左的二进制方法,用 O(log e) 时间,大约需要 30~40 小时(不想等那么久)。
各种递归方法产生分段错误(在我更改递归限制后)
我可以做哪些优化?
听起来您正在尝试评估 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。
我正在尝试这样计算:a^b mod c,其中三个数字都很大。
我尝试过的事情:
Python 的 pow() 函数需要几个小时,但尚未产生结果。 (如果有人能告诉我它是如何实现的,那将非常有帮助!)
我实现的一个从右到左的二进制方法,用 O(log e) 时间,大约需要 30~40 小时(不想等那么久)。
各种递归方法产生分段错误(在我更改递归限制后)
我可以做哪些优化?
听起来您正在尝试评估 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。