-
(快速幂) O(logb)
时间复杂度分析:每次对b进行右移操作
(a b ) % p = ((a % p ) (b % p) ) % p ; (a + b ) % p = ((a % p ) + (b % p) ) % p ;
证明仅以a b % p;
a = c1 p + d1 ; b = c2 p + d2;
(a b) % p = (c1 p + d1 ) (c2 p+ d2 ) % p = (d1d2)%p;本题逻辑核心!!
b可以拆成2的幂次方
$b = C_{k}2^{k}C_{k-1}2^{k-1}….C_{1}2^{1}*C_{0}2^{0}$
所以对于(a^b)%p式子的展开$a^{b} = a^{C_{k}2^{k}}*a^{C_{k-1}2^{k-1}}…a^{C_{0}2^{0}}$
$1a^{C_{0}2^{0}}\%p = ((1\%p) (a^{C_{1}2^{1}}\%p) \% p)$
$a^{b}\%p = ((1a^{C_{0}2^{0}})\%p (a^{C_{1}2^{1}}\%p)\%p……$
a(x1)a(x2)%p) (a(x3)%p) ) %p
1*a(x1)*a(x2)%p = ( (1*a(x1)%p) * (a(x2)%p) )%p 1*a(x1)%p = ( (1%p) * (a(x1)%p) )%p 所以res初始化值为1%p 算法即是从下向上实现 2.理解a = a *a % p 迭代a: ( res * (a(xn)%p) )%p 其中的a(xn)%p = a(xn-1)*a(xn-1)%p