模块化指数
在C / C ++中,如何计算(a^b)%m
,其中b
不适合64位? 换句话说,有没有办法用b%m
而不是b
来计算上述值?
是否有任何算法可以在O(log(b))
时间或O(log(b%m))
时间内计算上述结果?
根据欧拉定理 ,如果a
和m
是互质的:
a b mod m = a b mod phi(m) mod m
因此,如果b
很大,您可以使用值b % phi(m)
而不是b
。 phi(m)
是Euler的整数函数 ,如果你知道m
的素因子分解,就可以很容易地计算出它。
一旦以这种方式减小了b
的值,就可以通过平方来计算Ex中的模幂运算O(log (b % phi(m)))
。