对fibonacci数列的分析

来源:互联网 发布:网上教师兼职网络平台 编辑:程序博客网 时间:2024/05/16 14:46

      首先,为了方便描述,我们进行如下定义:

      (1)我们用Fi(有时为了避免歧义,需要在i的两边加上中括号,而在一般情况下,为了简便起见就不加括号了)表示fibonacci数列的第i项,fibonacci数列是这样的一个数列:F1=1,F2=1,Fn=Fn-1+Fn-2,n为任意的整数.(注意,fibonacci数列是有负数项的).

[一]fibonacci数列的组合意义

      我们考虑一块1*n的矩形地面(或者其他的什么鬼东西),用1*1和1*2的砖块填充它的方案数.

      我们用Gi表示1*n的矩形地面被1*2和1*1的砖块填充的方案数.

      考虑最后一块砖是1*1还是1*2,我们得到:Gi=Gi-1+Gi-2.

      考虑边界条件,我们有:G1=1,G2=2.

      所以,Gi=F[i+1].由于G序列与F序列的关系以及G序列的意义,下文中经常会用G代替F,以使一些定理的形式更加直观,优美.

      由于这是下文分析fibonacci数列的一个重要的工具,所以我们现在这里做一些约定:称1*1的砖块为A类砖,1*2的砖块为B类砖,一个A类砖的位置就是它在平面中的位置,一个B类砖的位置是它的左端在平面中的位置.间隔为两个地板间的间隙,一个间隔要么被一个B类砖覆盖,要么是2个砖块间的间隙,为了简便起见,将"覆盖一个1*n的矩形平面"简称为"覆盖n","一个1*n的平面的覆盖方案"简称为"n的一个覆盖".

      若无特殊说明,下文中出现的变量都是整数.

[二]利用fibonacci数列的组合意义来分析fibonacci的性质

      (1)G[n]-1=G[n-2]+G[n-3]+G[n-4]+...+G[3]+G[2]+G[1]+G[0],n-2>0

      考虑至少用一个B类砖覆盖n,它的方案数显然为G[n]-1.由于至少有一个B类砖,让我们对最后一个B类砖的位置分情况讨论:

      若最后一个B类砖在最后(即最后一个B类砖后没有A类砖),那么覆盖的方案数为F[n-2].

      如果最后一个B类砖后有1个A类砖,那么覆盖的方案数为:G[n-3]

      如果最后一个B类砖后有2个A类砖,那么覆盖的方案数为:G[n-4]

      ...

      如果最后一个B类砖后有n-2个A类砖,那么覆盖的方案数为:G[0]

      因此,G[n]-1=G[n-2]+G[n-3]+G[n-4]+...+G[3]+G[2]+G[1]+G[0],n-2>0

      (2)G[2N+1]=G[2N]+G[2N-2]+G[2N-4]+...+G[4]+G[3]+G[2]+G[0],n>0

      考虑2n+1的一个覆盖,它的方案数显然为G[2n+1].

      由于2n+1是一个奇数,所以他至少有一个A类砖,且最后一个A类砖的位置必然是奇数.

      对最后一个A类砖的位置进行分类讨论:

      若它的位置为2n+1,则方案数为:G[2n]

      若他的位置为2n-1,则方案数为:G[2n-2]

      若他的位置为2n-3,则方案数为:G[2n-4]

      ...

      若他的位置为1,则方案数为:G[0]

      因此,G[2N+1]=G[2N]+G[2N-2]+G[2N-4]+...+G[4]+G[3]+G[2]+G[0],n>0

      讲完这两个,应该算是了解了冰山一角了.虽然这两个公式有点鸡肋,但给了我们一些有益的启示.下面大部分都是一些有用的了.

      (3)G[m+n]=G[m-1]*G[n-1]+G[m]*G[n]

      我们考虑覆盖一个m+n的方案数,根据定义,它显然是G[m+n].

      接着,让我们考虑第m个间隔,即将前m个格子与后n个格子分开的那个间隔.

      如果第m个间隔被一个B类砖跨越,那么左边只剩下m-1个格子,右边只剩下n-1个格子,根据乘法原理,这种情况的方案数为G[m-1]*G[n-1]

      如果第m个间隔没有被B类砖跨越,那么这个间隔就将最后的方案分成了互不相关的2部分,根据乘法原理,这种情况的方案数为G[m]*G[n].

      因此,G[m+n]=Gm*Gn+G[m-1]*G[n-1].如果用F来表示的话,就是:F[m+n+1]=F[m]*F[n]+F[m+1]*F[n+1]或F[m+n]=F[m]*F[n-1]+F[m+1]*F[n].这是一个很重要的结论.

      利用数学归纳法也可以证明这个结论,不过略显麻烦,且不容易理解.

      (4)F[n]|F[m],n|m

      证明:这个定理可以使用组合意义来解释,不过更为简洁的证明是利用数学归纳法.这里只介绍数学归纳法.

      令m=kn,k为任意的整数.

      显然,当k=1时,F[n]|f[m].

      若F[n]|F[kn],则:F[(k+1)n]=F[kn+n]=F[kn]*F[n-1]+F[kn+1]*F[n].由于F[n]|F[kn]且F[n]|F[n],所以F[n]|F[(k+1)n]

      证毕.

      (5)GCD(F[N],F[M])=F[GCD(N,M)]

      我认为这个性质是fibonacci数列最美妙的性质之一.我目前还没有想到或者看到组合意义上的解释,所以直接讲证明.

      设n=km+r,则:

      gcd(F[N],F[M])=gcd(F[M],F[KM+R]) =GCD(F[M],F[KM]*F[R-1]+F[KM+1]*F[R])=GCD(F[M],F[KM+1]*F[R]).

      因为F[KM+1]与F[M]互质,所以GCD(F[N],F[M])=GCD(F[M],F[R]).

      回忆一下欧几里得算法,GCD(M,N)=GCD(M,R),R=N%M,我们发现,这个式子的转化与欧几里得算法的过程一模一样.

      因此,GCD(F[N],F[M])=F[GCD(N,M)].

      讲清楚这个性质,fibonacci数列的分析方法也应该会了个大概了.历史上有很多通项或递推公式很奇葩的数列,分析他们的性质时可以利用他们的现实意义来进行启发式的联想.通过这种分析方式,也可以揭示一些有趣的性质的本质.


BY QW

转载请注明出处