比如我们已经知道f1=1,f2=1,fn=a*fn-2+b*fn-1。用普通方法求fn就是一个循环。从3循环到n,时间复杂度为O(n)。下面用另一种方法求fn的值。
设矩阵 A = B =
则A*B= * =
A*A*B = A*(A*B) = *=
A*A*….*B=A(n-2) *B = 式(1)
如何求一个数a的b次幂a^b(使用快速幂算法,时间复杂度为lgn)。
假设b=6,用二制表示就是2^2*1+2^1*1+2^0*0 (6的二进制为110)
则a^b=a^(2^2+2^1)=a^(2^2)*a^(2^1) 注:A^(x+y)=A^x*A^y
求a^b的C伪代码
result=1;
while(b!=0)
{
if(b& 1)
result= result*a
a= a*a;
b= b>>1;
}
利用式1求f(1000)的值,需要进行大概10次的矩阵乘法运算,每次矩阵乘法需要8次乘法运算和4次加算法运算共需要大约120次运算就可以求出f(1000)的值。比原来的1000次运算快了近10倍。构造矩阵主要是为了能够使用快速幂来加快运算。