模块化指数

sab*_*ari 2 c exponentiation modulus

在C/C++我怎样才能计算(a^b)%m其中b不适合64位?换句话说,有没有办法用b%m而不是b?来计算上述值.

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

int*_*jay 8

根据欧拉定理,如果a并且m是互质的:

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

所以如果b很大,你可以使用值b % phi(m)而不是b.phi(m)欧拉的函数,如果你知道的是素数因子分解,可以很容易地计算出它m.

一旦你b以这种方式减小了值,就可以通过平方来计算模幂运算O(log (b % phi(m))).