嗨我正在编写一个代码来计算P ^ Q,其中
P, Q are positive integers which can have number of digits upto 100000
我希望结果为
result = (P^Q)modulo(10^9+7)
示例:
P = 34534985349875439875439875349875
Q = 93475349759384754395743975349573495
Answer = 735851262
我尝试使用这个技巧:
(P^Q)modulo(10^9+7) = (P*P*...(Q times))modulo(10^9+7)
(P*P*...(Q times))modulo(10^9+7) = ((Pmodulo(10^9+7))*(Pmodulo(10^9+7))...(Q times))modulo(10^9+7)
由于P和Q都非常大,我应该将它们存储在一个数组中并逐位进行模数化。
有没有有效的方法可以做到这一点,或者我缺少一些数论算法?
提前致谢
答案 0 :(得分:3)
这是一种相当有效的方式:
1)计算p1 = P modulo 10 ^ 9 + 7
2)计算q1 = Q模10 ^ 9 + 6
3)然后P ^ Q模10 ^ 9 + 7等于p1 ^ q1模10 ^ 9 + 7.由于费马的小定理,这个相等是正确的。请注意,p1和q1足够小以适合32位整数,因此您可以使用标准整数类型实现二进制指数(对于中间计算,64位整数类型就足够了,因为初始值适合32位)。