我叫张小黑
张小黑的挣扎生活
posts - 66,  comments - 109,  trackbacks - 0

常系数线性递推的第n项及前n项和

 

(一)Fibonacci数列f[n]=f[n-1]+f[n-2],f[1]=f[2]=1的第n项的快速求法(不考虑高精度).

 

解法:

考虑1×2的矩阵【f[n-2],f[n-1]】。根据fibonacci数列的递推关系,我们希望通过乘以一个2×2的矩阵,得到矩阵【f[n-1],f[n]=f[n-1],f[n-1]+f[n-2]

很容易构造出这个2×2矩阵A,即:

0

1

1

1

所以,有【f[1],f[2]】×A=【f[2],f[3]

又因为矩阵乘法满足结合律,故有:

f[1],f[2]】×A n-1=f[n],f[n+1]

这个矩阵的第一个元素即为所求。

 

至于如何快速求出A n-1,相信大家都会,即递归地:n为偶数时,An=(A n/2)2n为奇数时,An=(A n/2)2*A

 

问题(一)解决。

 

(二)数列f[n]=f[n-1]+f[n-2]+1,f[1]=f[2]=1的第n项的快速求法(不考虑高精度).

解法:

      仿照前例,考虑1×3的矩阵【f[n-2],f[n-1],1】,希望求得某3×3的矩阵A,使得此1×3的矩阵乘以A得到矩阵:【f[n-1],f[n],1】=【f[n-1],f[n-1]+f[n-2]+1,1

容易构造出这个3×3的矩阵A,即:

0

1

0

1

1

0

0

1

1

问题(二)解决。

 

 

(三)数列f[n]=f[n-1]+f[n-2]+n+1,f[1]=f[2]=1的第n项的快速求法(不考虑高精度).

解法:

      仿照前例,考虑1×4的矩阵【f[n-2],f[n-1],n,1】,希望求得某4×4的矩阵A,使得此1×4的矩阵乘以A得到矩阵:

f[n-1],f[n],n+1,1】=【f[n-1],f[n-1]+f[n-2]+n+1,n+1,1

容易构造出这个4×4的矩阵A,即:

0

1

0

0

1

1

0

0

0

1

1

0

0

1

1

1

问题(三)解决……

 

(四)数列f[n]=f[n-1]+f[n-2],f[1]=f[2]=1n项和s[n]的快速求法(不考虑高精度).

解法:

      虽然我们有S[n]=F[n+2]-1,但本文不考虑此方法,我们想要得到更一般的方法。

      考虑(一)的矩阵A,容易发现我们要求【f[1],f[2]】×(A+A2+A3+…+AN-1)。很多人使用一种很数学的方法构造一个2r*2rrA的阶数,这里为2)的矩阵来计算,这种方法比较麻烦且很慢,这里不再介绍。下面考虑一种新方法。

      仿照之前的思路,考虑1×3的矩阵【f[n-2],f[n-1],s[n-2]】,我们希望通过乘以一个3×3的矩阵A,得到1×3的矩阵:

f[n-1],f[n],s[n-1]=f[n-1],f[n-1]+f[n-2],s[n-2]+f[n-1]

容易得到这个3×3的矩阵是:

0

1

0

1

1

1

0

0

1

然后…………容易发现,这种方法的矩阵规模是(r+1)*(r+1),比之前流行的方法好得多。

 

(五)数列f[n]=f[n-1]+f[n-2]+n+1,f[1]=f[2]=1n项和s[n]的快速求法(不考虑高精度).

解法:

      结合(三)(四),容易想到……

考虑1×5的矩阵【f[n-2],f[n-1],s[n-2],n,1,

我们需要找到一个5×5的矩阵A,使得它乘以A得到如下1×5的矩阵:

f[n-1],f[n],s[n-1],n+1,1

=f[n-1], f[n-1]+f[n-2]+n+1,s[n-2]+f[n-1],n+1,1

容易构造出A为:

0

1

0

0

0

1

1

1

0

0

0

0

1

0

0

0

1

0

1

0

0

1

0

1

1

然后……问题解决。

 

一般地,如果有f[n]=p*f[n-1]+q*f[n-2]+r*n+s

可以构造矩阵A为:

0

q

0

0

0

1

p

1

0

0

0

0

1

0

0

0

r

0

1

0

0

s

0

1

1

 

 

更一般的,对于f[n]=Sigma(a[n-i]*f[n-i])+Poly(n),其中0<i<=某常数c, Poly (n)表示n的多项式,我们依然可以构造类似的矩阵A来解决问题。

Degree(Poly(n))=d, 并规定Poly(n)=0时,d=-1,此时对应于常系数线性齐次递推。则本方法求前n项和的复杂度为:

((c+1)+(d+1))3*logn

此方法高效、一般、统一、和谐

posted on 2008-03-15 21:05 zoyi 阅读(240) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


欢迎光临 我的白菜菜园

<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(8)

随笔分类

随笔档案

文章档案

相册

acmer

online judge

队友

技术

朋友

搜索

  •  

最新评论

阅读排行榜

评论排行榜