浅谈递推与生成函数的应用

      这几天看了点组合数学的东西,以前一直以为排列计数之类的东西挺简单的,研究了几天感觉真是相当的难,那本书没坚持看完,看过的也没记住多少,感觉递推和生成函数那章有点意思,就写点这方面的,其他的有机会再好好钻研一下。

    递推关系,相信大家都接触过,经常用于定义一个数列,比如著名的婓波那契序列:f0 =0,f1 =1,......fn =fn-1 +fn-2 (n>=3).给定数列的初始元素值,其它元素根据前面的元素值可以推算出来。但是我现在希望能找到一个fn 的通项公式,使它不依赖于前面元素的值,这样我们可以直接写出这个数列的任意元素的值,而不用一个一个的推算得来。如果有一个公式可以直接把婓波那契序列的第n项写出来,会不会觉得很神奇呀,下面我们就来把这个公式给找出来。

    中心思想就是模仿微分方程的解题思路,先假设,再带入,设fn =c * Xn ,然后再将其带入递推关系式中,就以婓波那契序列为例,将fn =c * Xn 带入fn =fn-1 +fn-2,可得 c * Xn =c * Xn-1 +c * Xn-2 ,化简得,X2 -X-1=0,这就是这个递推关系的特征方程,很容易解方程得到两个解:X1 =(1+51/2 )/2和X2 =(1-51/2 )/2,根据所求特征方程的解,可以写出fn 的通项公式,fn =C1 * (X1 )n +C2 * (X2 )n ,将f0 =0,f1 =1带入可得C1= (51/2 -2)/51/2 和C2= (51/2 +2)/51/2 ,将C1 ,C2, X1, X2上式即可得到fn的通项公式。你可能觉得奇怪,这个数列的每一项都是整数,怎么通项中有带根号的项,你可以自己验证一下,算出来的结果正好都是整数。

    推广开来,我可以写出递推关系的一般表达式:hn-a1*hn-1-a2*hn-2... ...-ak*hn-k=bn(ak不为0且n>=k),其中a1,a2,... ...an-k为常数,若bn=0,程该递推方程是齐次的,否则就是非齐次的。

    针对齐次方程(bn=0), 设通解为hn=c * Xn ,带入递推方程可得xk-a1*xk-1-a2*xk-2...... ak=0,解方程得X1,X2,...... Xk,这些值成为原递推方程的特征解。若解得的各个跟互不相同,则hn的通项公式为hn=C1 * (X1 )n +C2 * (X2 )n+... ...Ck * (Xk )n,若存在重跟,则在通项公式中与它对应的项相应的乘n即可。例如,若X1=X2,则通项公式改为hn=C1 * (X1 )n +C2 *n* (X2 )n+... ...Ck * (Xk )n;若X1=X2=X3,则通项公式改为hn=C1 * (X1 )n +C2 *n* (X2 )n+C3*n*n* (X3 )n+... ...Ck * (Xk )n;然后再根据初始条件,分别求出系数C1,C2,... ...Ck的值即可。

    若是非齐次方程,可以先求出对应的齐次方程的通项公式,设为fn ,然后找原递推方程的一个特解,设为sn ,则非齐次方程的通解为hn=fn +sn ,fn可有上面的方法求出,那我们如何找到递推方程的特解呢?这是一个比较难的问题,我们只关注一下其中最简单的两种,即bn为多项式或指数形式的情况,若bn为多项式,递推方程的特解的形式是跟bn齐次的多项式;若bn为指数函数an,则特解的形式为c * an,这里要注意,如果a恰好与X1,X2,...... Xk的某个值相等,那么特解的形式要相应的乘以n。下面我们来看个简单的例子,加深一下了解:

       设递推方程为:hn=3*hn-1+3n,初始条件h0=2 ,求数列的通项公式。

       根据上述解题步骤,其对应的齐次方程为hn=3 * hn-1 ,设通项fn=c * Xn ,带入齐次递推方程,得X=3,故齐次方程的通项形式为fn=c * 3n;接下来求原递推方程的特解,由于bn=3n,不妨设特解形式为sn =b * 3n带入原递推方程化简可得b=b+1,这显然不可能,仔细一看,原来指数中的3恰好为齐次方程的特征解,故特解的形式应该为sn =b * 3n*n,带入原递推方程,可得b=1,于是特解为sn = 3n * n,所以原递推方程的解为hn=fn +sn =c * 3n+3n * n ,由初始条件h0=2可知,c=2,所以hn=2 * 3n+3n * n=(2+n)*3n

 

       下面来介绍生成函数的方法,这中方法适合求解计数问题。

       令h0,h1,... ...hn...... 为一无穷数列,则它的生成函数为一个无穷级数:

                              g(x)=h0+h1*X+h2*X2+... ...+  hn*Xn+... ...

       而有限序列h0,h1,... ...hn可以看成是形为h0,h1,... ...h,0,0.... 的无限序列,其生成函数为

                               g(x)=h0+h1*X+h2*X2+... ...+  hn*Xn

       例如,每一项都为1的无穷序列1,1,1... ... 的生成函数为

                               g(x)=1+X+X2+X3+... ...,这是一个等比数列的和,在其收敛域内,其值为g(x)=1/(1-x),我们可以理解为函数1/(1-x)中包含了一个每一项都为1的无穷序列的信息。

        再举个例子,令m为一整数,关于二项式系数Cm,0 ,Cm,1 ,Cm,2 ... ... Cm,m的生成函数为

                               g(x)=Cm,0 +Cm,1 * X +Cm,2 *X2 ... ... Cm,m*Xm=(1+X)m

       首先,我们需要把以前学过的二项式公式进行一下扩展,公式如下所示:

                               (a+b)m=Cm,0 *bm+Cm,1 * a*bm-1 +Cm,2 *a2*bm-2 ... ... Cm,m*am,

以前我们限定m必须为正整数,现在我们把它扩展为整个实数范围内,扩展后的每一项计算方法不变

                               Cm,r=m*(m-1)*(m-2)*......*(m-r+1) / (r!) , r=0,1,2,3,... n ,......,

因此,对于任意一个实数m,二项式公式扩展为

                                (a+b)m=Cm,0 *bm+Cm,1 * a*bm-1 +Cm,2 *a2*bm-2 ... ... Cm,m*am+Cm,m+1*am+1 *b-1+... ...

即它有无穷多的项,以前所学的公式只是m为整数的条件下的一种特殊情况,在这种情况下,对所有的n>m,Cm,n=0.

        根据扩展的二项式公式,可以求得当m为负整数时,Cm,r=m*(m-1)*(m-2)*......*(m-r+1) / (r!)

                                                                                    =(-1)r*(-m)*(-m+1)*(-m+2)*......*(-m+r-1)/(r!)

                                                                                    =(-1)r*C-m+r-1,r

         上述结果应尽量记住,因为后面会经常用到上述公式。

         下面我们来看一个比较有启发性的例子,考虑方程X1+X2+... ...+Xk=n (其中,n=0,1,2... ...),设其非负整数解的个数为hn ,显然h0,h1,h2,... ...hn... ...构成一个无穷数列,其对应的生成函数为:

                                 g(x)=h0+h1*X+h2*X2+... ...+  hn*Xn+... ...

    先把原方程的解答放一边,考虑一个多项式相乘的例子,如(1+X+X2+X3)*(1+X+X2)*(1+X+X2+X3+X4),现在我想知道结果中X3的系数,就是我会列举所有可能的组合情况,分别是1*1*X3,1*X*X2,1*X2*X,X*1*X2,X*X*X,X*X2*1,X2*1*X,X2*X*1,X3*1*1,总共有九种情况,因此我可以判定X3的系数为9.再仔细想想这个过程,由于1可以表示成X0,上面九个子项中X的指数和加起来都为3,如果限定X1只能取0,1,2,3,X2只能取0,1,2,X3只能取0,1,2,3,4,那么上述九个子项正好跟X1+X2+X3=3 的所有非负整数解是一一对应的,也就是说我们可以把这个求方程非负整数接个数的问题转化为一个求多项式系数的问题。

    现在,我们在回到原来的方程,现在要求满足方程X1+X2+... ...+Xk=n (其中,n=0,1,2... ...)的非负整数解的个数,我们首先将这个问题等价成一个求多项式系数的问题呢,很显然,由于这里没有对各项的上界进行限制,我们可以模仿上面的多项式,如下:

                        (1+X+X2+X3+...)*(1+X+X2+X3+...)*(1+X+X2+X3+...)...(一共k个),即(1+X+X2+X3+...)k

      而原来的问题就转化为求(1+X+X2+X3+...)中Xn的系数,这个系数就是无穷数列h0,h1,h2,... ...hn... ...的通项公式。那我们怎样才能求出Xn的系数呢,考虑我们已经掌握的技术,在X的收敛域内,1+X+X2+X3+...=1/(1-x),用一下这个公式,(1+X+X2+X3+...)k =(1/(1-x))k=(1-X)-k,很简洁吧,刚才大量的信息都表示到(1-X)-k里面了,现在我们只要求出(1-X)-k中Xn的系数即可,可是这怎么求呢,考虑一下我们现在掌握的知识,对了,刚才我已经把二项式公式扩展到整个实数范围了,不记得的话再仔细看看前面的公式,根据公式可知,包含Xn的项为C-k,n(-X)n=(-1)n*Ck+n-1,n*(-1)n*Xn=Ck+n-1,n*Xn,即Xn的系数为Ck+n-1,n,所以原方程X1+X2+... ...+Xk=n (其中,n=0,1,2... ...)的非负整数解的个数为Ck+n-1,n

      再看个例子来了解一下生成函数在计数方面的用处,假设商店有四种水果,苹果,香蕉,橘子和梨,现在某顾客来购买水果,要求苹果数是偶数,香蕉数是5的倍数,橘子数最多是4个,而梨的个数为0或1,现在假如一共要买n个水果,请问他有多少选择?

      我们可以将这个问题转化成求多项式系数的问题,从而利用推广的二项式公式进行求解,设买n个水果时用户有hn种选择,则无穷序列h0,h1,... ...hn...... 的生成函数为

            g(x)=(1+X2+X4+... ...)*(1+X5+X10+... ...)*(1+X2+X3+... ...)*(1+X)

hn即为g(X)中Xn的系数,化简得

           g(X)=(1/(1-X2)) *(1/(1-X5))*((1-X5)/(1-X))*(1+X)

                  =1/(1-X)2

         易知,Xn的系数为Cn+2-1,n=n+1,所以顾客共有n+1种选择。

 

     下面讨论下递归和生成函数之间的关系,显然,根据初始条件和递推方程我们可以得到一个无穷数列,这个数列有它自己对应的生成函数,如果我们可以先求出这个生成函数,那也就很容易写出这个递推方程的任意一项了。我们来找几个具体的例子应用一下这个思想。

      求解满足初始值 h0=1,h1=-2 的递推关系 hn=5hn-1-6hn-2(n>=2)

       令g(x)=h0+h1*X+h2*X2+... ...+  hn*Xn+... ...

        两边同乘以-5X,得-5*X*g(x)=-5*h0*X+(-5)*h1*X2+(-5)h2*X3+... ...+  (-5)*hn*Xn+1+... ...

        两边同乘以6X2,得6*X2*g(X)=6*h0*X2+6*h1*X3+6*h2*X4+... ...+ 6* hn*Xn+2+... ...

       将这三个方程相加得到

                       (1-5X+6X2)*g(X)=h0+(h1-5*h0)*X  +(h2-5*h1+6*h0)*X2+...+(hn-5hn-1+6hn-2)Xn+... ...  

        根据递推方程,化简上式,得

                        (1-5X+6X2)*g(X)=1-7*X

                        所以g(X)=(1-7*X)/(1-5X+6X2

                                     =5/(1-2*X) -4/(1-3*X)

                          而1/(1-2X)=1+ (2*X) +(2*X) 2+(2*X) 3+... ...

                             1/(1-3X)=1+ (3*X) +(3*X) 2+(3*X) 3+... ...

          因此,g(X)=5*(1+ (2*X) +(2*X) 2+(2*X) 3+... ...)-4*(1+ (3*X) +(3*X) 2+(3*X) 3+... ...)

                          =1+(-2)*X+(-15)*X2+......+(5*2n-4*3n)*Xn+......

        于是我们得到hn=5*2n-4*3n

 

       除了普通的生成函数,还有一种特殊的指数生成函数,有兴趣的同学可以继续研究,我这里就不再写了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值