在C / C ++中,如何计算(a^b)%m
哪里b
不适合64位?换句话说,有没有办法使用b%m
代替b
计算上述值?
是否有任何算法可以在O(log(b))
时间或O(log(b%m))
时间内计算上述结果?
答案 0 :(得分:8)
根据Euler's theorem,如果a
和m
是互质的:
ab mod m = ab mod phi(m) mod m
因此,如果b
很大,您可以使用值b % phi(m)
代替b
。 phi(m)
为Euler's totient function,如果您知道m
的素数分解,则可以轻松计算出来。
以这种方式减少b
的值后,使用Exponentiation by squaring计算O(log (b % phi(m)))
中的模幂运算。