快速幂,二进制取幂(Binary Exponentiation,也称平方法),是一个在 Θ ( log n ) \Theta(\log n) Θ(logn) 的时间内计算 a n a^n an 的小技巧,而暴力的计算需要 Θ ( n ) \Theta(n) Θ(n) 的时间。而这个技巧也常常用在非计算的场景,因为它可以应用在任何具有结合律的运算中。其中显然的是它可以应用于模意义下取幂、矩阵幂等运算,我们接下来会讨论。
算法描述
计算 a a a 的 n n n 次方表示将 n n n 个 a a a 乘在一起: a n = a × a ⋯ × a ⏟ n 个 a a^{n} = \underbrace{a \times a \cdots \times a}_{n\text{ 个 a}} an=n 个 a a×a⋯×a。然而当 a , n a,n a,n 太大的时侯,这种方法就不太适用了。不过我们知道: a b + c = a b ⋅ a c , a 2 b = a b ⋅ a b = ( a b ) 2 a^{b+c} = a^b \cdot a^c,\,\,a^{2b} = a^b \cdot a^b = (a^b)^2 ab+c=ab⋅ac,a2b=ab⋅