文章目录
- 1.何为快速幂
- 1.1学习快速幂的好文章
- 1.2快速幂取模代码(对1000取模)
- 2.矩阵快速幂
1.何为快速幂
补充一个公式证明:
1.1学习快速幂的好文章
http://t.csdn.cn/agKop
1.2快速幂取模代码(对1000取模)
ll fastPower(ll base,ll power){
ll result=1;
while(power>0){
if(power&1) result=result*base%1000;
power>>=1;
base=(base*base)%1000;
}
return result;
}
2.矩阵快速幂
顾名思义,就是快速地求矩阵的幂。B站上Schtonn UP主的视频特别好,我就是看他的才看懂的。视频名称:看图学会矩阵快速幂(求斐波那契数列)
现在我简单讲一下。
斐波那契数列:
根据第二个式子,我们可以定义一个矩阵来表示f(x)的状态。如图:
那么,f(x+1)的状态就应该是:
那么,如何由f(x)状态转为f(x+1)状态呢?
引入另一个矩阵M,我们需要找到这个矩阵M的具体值,使得
根据矩阵乘法的规则可知,M矩阵应是两行两列(M有两列才可以分别和f(x-1),f(x-2)相乘,又因为右边式子有两行,所以说明M有两行)
那么设:
则有:
得:
由
得 a=1,b=1,c=1,d=0,即:
把M矩阵乘以我们定义的矩阵,就相当于把当前矩阵转移到了下一个状态。比如M乘以f(x)状态的矩阵,就得到f(x+1)状态的矩阵。
那么我们把矩阵M乘以n次,再乘以f(x),是不是就得到f(x+n)状态的矩阵?也就得到了f(x+n)的值。
设这里f(x)的状态表示x=3时f(3)的状态。
那么
就表示f(x+2)也就是f(5)时的状态。我算出来是等于3f(x-1)+2f(x-2),而f(x-1)=f(2)=1,f(x-2)=f(1)=1。
所以f(5)=3f(x-1)+2f(x-2)=5。
斐波拉契为:1 1 2 3 5
也可验证上述结论正确。
现在,我们可以得出结论:
就是往后推算K位。
此时我们再定义一个初始矩阵
也就是
所以
得出的矩阵里的数相加就是斐波那契数列的第k+2位的值。