模块化指数

时间:2012-07-12 09:18:51

标签: c modulus exponentiation

在C / C ++中,如何计算(a^b)%m哪里b不适合64位?换句话说,有没有办法使用b%m代替b计算上述值?

是否有任何算法可以在O(log(b))时间或O(log(b%m))时间内计算上述结果?

1 个答案:

答案 0 :(得分:8)

根据Euler's theorem,如果am是互质的:

ab mod m = ab mod phi(m) mod m

因此,如果b很大,您可以使用值b % phi(m)代替bphi(m)Euler's totient function,如果您知道m的素数分解,则可以轻松计算出来。

以这种方式减少b的值后,使用Exponentiation by squaring计算O(log (b % phi(m)))中的模幂运算。