快速幂
记录一下几个快速幂算法模板
- 快速幂
- 模意义下的快速幂
- 矩阵快速幂
经典快速幂
原理
对于任意一个整数,我们都可以将其表示为一系列 2 的幂的和即:
其中
于是对于
也就是我们可以通过计算其中的每一项并求积来计算
又由
所以为了计算
- 首先判断此处的
是不为- 若
,那么我们无需计算这一项
- 若
,那么我们将当前的结果乘上
- 若
- 为了不重复计算,我们可以由前一次的
的平方,计算得下一次所需要的
实现
1 | ll qpow(ll a, ll n){ |
模运算的法则:
1 | ll qpow(ll a, ll n, ll mod){ |
复杂度分析
循环执行次数也即是
矩阵快速幂
原理
原理类似,算法类似,矩阵的幂也可以拆开算,时间复杂度也是压成
(这里认为计算矩阵乘法的时间复杂度是
实现
先给出matrix
类的实现
1 | class matrix { |
因为有操作符重载,实现看着其实没区别
1 | matrix qpow(matrix a, ll n) { |
贴一个测试程序
1 |
|
斐波那契数列
这边贴一个矩阵快速幂求斐波那契的例子
1 |
|