如何 pow 和 mod 大数字
How to pow and mod giant numbers
我想对一个数进行次幂运算,然后将它与另一个数相乘,最后 mod 它。
Python 的 pow 函数,需要 3 个参数不能用于我的用例场景,所以我试图找到快速的替代方法。
示例:
我知道我能做到
9^10%2
作为
pow(9, 10, 2)
但是我做不到
(8*9^10)%2
功能相同
我已经试过了(数字仅供参考,实数要大很多)
pow(9, 10)*8 % 2 # tooks too long
pow(9, 10, 2)*8 # returns wrong answer
我希望我的数字计算得非常快,即使它们高达 10^18。对于其中的 20 个数字,我的时间要求是 2 秒。
None 上述解决方案对我来说并不适用,它们要么太慢,要么没有 return 正确答案。
您的第二个解决方案包含一个不正确的假设,即以下内容为真。直觉上,这不可能是真的,因为第一个表达式可能与 c*(n-1)
一样大,但第二个表达式必须严格小于 n
((a^b)%n)*c == (c*a^b))%n
来自 Wikipedia 的正确身份:
ab mod n = [(a mod n)(b mod n)] mod n.
我们可以通过归纳来概括这一点(证明作为练习留给 reader):
所以你的表达应该是:
(pow(9, 10, 2) * (8 % 2)) % 2
# OR
(pow(9, 10, 2) * 8) % 2
我想对一个数进行次幂运算,然后将它与另一个数相乘,最后 mod 它。
Python 的 pow 函数,需要 3 个参数不能用于我的用例场景,所以我试图找到快速的替代方法。
示例:
我知道我能做到
9^10%2
作为
pow(9, 10, 2)
但是我做不到
(8*9^10)%2
功能相同
我已经试过了(数字仅供参考,实数要大很多)
pow(9, 10)*8 % 2 # tooks too long
pow(9, 10, 2)*8 # returns wrong answer
我希望我的数字计算得非常快,即使它们高达 10^18。对于其中的 20 个数字,我的时间要求是 2 秒。
None 上述解决方案对我来说并不适用,它们要么太慢,要么没有 return 正确答案。
您的第二个解决方案包含一个不正确的假设,即以下内容为真。直觉上,这不可能是真的,因为第一个表达式可能与 c*(n-1)
一样大,但第二个表达式必须严格小于 n
((a^b)%n)*c == (c*a^b))%n
来自 Wikipedia 的正确身份:
ab mod n = [(a mod n)(b mod n)] mod n.
我们可以通过归纳来概括这一点(证明作为练习留给 reader):
所以你的表达应该是:
(pow(9, 10, 2) * (8 % 2)) % 2
# OR
(pow(9, 10, 2) * 8) % 2