对于数列a[n],递推公式为a[n+1]=pa[n]+qa[n-1],其特征方程为x^2=px+q (一个数列:X(n+2)=C1X(n+1)+C2X(n);设r,s使X(n+2)-rX(n+1)=s[X(n+1)-rXn];所以X(n+2)=(s+r)X(n+1)-srXn;C1=s+r并且C2=-sr;消去s就导出特征方程式r^2-C1*r-C2=0),即x^2-px-q=0,(1)若方程有两相异根α,β,则a[n]=c1·α^n+c2·β^n。(2)若方程有两等根α=β,则a[n]=(c1+nc2)·α^[n-1],其中 c1,c2 可由初始条件确定,初始条件通常为a[1]与a[2]。
解法一:用循环运算,记录前两个值,再求该值。
解法二:用上面罗列的特征方程求解:F(n)=F(n-1)+F(n-2),得F(n)的特征方程为x^2=x+1,有根x1=(1+5^0.5)/2且x2=(1-5^0.5)/2。F(n)=A*(x1)^n+B*(x2)^n。通过F(0)=0,F(1)=1,解得A=5^(0.5)/5,B=-5^0.5/5。
解法三:分治策略。(Fn Fn-1)=(Fn-1 Fn-2)*A,求解得A=,(Fn Fn-1)=(F1 F0)*An-1。求解矩阵A的方幂用2进制快速求幂法:
a^m(mod n)算法,原理很简单,如a41就是a(101001)二进制,在从高位递推下去即可。
c=1;//c一开始取值是1很关键
for(j=k to 0)do{
c=c*c(mod n);
if(bj==1) thenc=c*a(mod n)
}
return c;