生成函数基础

生成函数引入

“生成函数是数列与函数之间的桥梁.”我们通过生成函数,将数列问题转化为函数的问题,并借助函数的处理办法来求数列的一些性质.

具体地,对一个数列{fn},我们称函数F(x)=i=0fixi为它的生成函数.

常见的生成函数

我们想用生成函数,首先要把数列转化成生成函数.我们考虑数列fn=pn,则其生成函数F(x)=i=0pixi.值得注意的是,生成函数中,我们重点研究每一项的系数,但并不研究x的值是多少,以及f(x)的值是多少,我们在后面将看到这一点.因此,只要存在一个x满足你的推导所需性质,你的推导就是对的.

因此,我们构造一个x0,使得px(0,1),发现上面的级数是收敛的,根据等比数列求和公式,则有:

F(x)=i=0pixi=limn(px)n+11px1=11px1  11px=i=0pixi  <1,p1,p2,p3,p4,>

特别的,将p=1代入,则有

1  11x=i=0xi  <1,1,1,1,1,>

有时我们需要从F(x)推出其生成的数列,对分式我们常采取裂项的手段(后面会有所体现),然而,当面对一些不那么熟悉的函数时,我们也有特殊手段.

根据泰勒展开,我们有:

F(x)=i=0F(i)(x)i!

因此,我们有:

2  sinx=xx33!+x55!x77!+   <0,1,0,13!,0,15!,>

3  ex=1+x+x22!+x33!+x44!+   <1,1,12!,13!,14!,15!,>

在处理这些问题时,我们通常可以直接考虑每一项的系数除以阶乘后的值,以更方便的探究性质.

根据牛顿二项式定理,我们有:

4  (1x)α=i=0(i+α1α1)xi  <(α1α1),(αα1),>

生成函数的简单常用变换

先来考虑加减,我们设F(x),G(x)是两个生成函数,则有

F(x)+G(x)=i=0(fi+gi)xi5  F(x)±G(x)  fn±gn

在考虑将F(x)乘以一个常数,有:

cF(x)=i=0cfixi6  cF(x)  cfn

显然上面两个操作对应了数列的加减和数乘.

我们考虑两个数列所对应的两个生成函数F(x)G(x)乘起来会得到什么结果.

F(x)G(x)=i=0fixij=0gjxj=i=0j=0ifjgij xi7  F(x)G(x) <f0g0,f0g1+f1g0,f0g2+f1g1+f2g0,>

我们发现生成函数的积似乎对应着数列的卷积.让我们将其特殊化:

  1. G(x)=x,即gn=[n=1],则有:

F(x)G(x)=i=0j=0ifjgij xi=i=1fi1 xi7.1  xF(x)=i=1fi1 xi  <0,f0,f1,f2,>

我们发现,把一个函数乘以x就是把数列向右移一位,最前面补0.那自然的,F(x)f0x就是将数列左移一位.

  1. G(x)=11x,根据推论1,gn=1.则有:

F(x)G(x)=i=0j=0ifjgij xi=i=0j=0ifj xi7.2  F(x)1x=i=1j=0ifj  <f0,f0+f1,f0+f1+f2,>

我们发现,将一个函数除以1x就是在对数列做前缀和.那么自然的,将一个函数乘以1x就是在对数列做差分.

再来考虑对F(x)求导会得到什么:

F(x)=i=0(i+1)fi+1xi8  F(x) <f1,2f2,3f3,>

我们发现,这样可以得到每一项向前平移一项再乘以该项的序号.

学习上列变换,目的就在于表示出一个复杂数列所对应的生成函数,再通过一些手段计算出第n项的系数,即为我们想要的数列的第n项.

例1 有数列fn,满足f0=0,f1=1,且对任意i>1,有fi=fi2+fi1.求fn的通项公式.

解:

我们尝试求解fn对应的生成函数F(x),根据斐波那契数列性质,我们利用推论7.1尝试错位相减:

(1)F(x)=f0+f1x+f2x2+f3x3+f4x4+(2)xF(x)=0+f0x+f1x2+f2x3+f3x4+(3)x2F(x)=0+0x+f0x2+f1x3+f2x4+(1)(2)(3),:F(x)xF(x)x2F(x)=0+x+0+0+0+

由此,我们得到F(x)=x1xx2,接下来尝试将其拆项:

F(x)=x1xx2(待定系数)=A1(1+52)x+B1(152)x(4)=15(11(1+52)x11(152)x)

接下来考察这是什么数列,根据公式1以及加减和数乘变换,生成函数(4)对应数列的第n项为15((1+52)n(152)n),则有:

fn=15((1+52)n(152)n)


正如上所述,生成函数可以求解通项公式,但是从另一个角度,一个数列的前缀和也是一个数列,且由前缀和变换可以快速得到其生成函数,因此,生成函数也是求解前缀和的利器.让我们看下面的例子.

例2 化简:i=1nipi.

这道题固然有初等解法,但是生成函数做法将更具有一般性.

初等解法

我们设数列an=npn,Sn=i=1nai,根据经典套路,我们考虑做差:

Sn=p+2p2+3p3++(n1)pn1+npnpSn=0+p2+2p3++(n2)pn1+(n1)pn+npn+1

上下相减,即得:

(1p)Sn=i=1npinpn+1Sn=ppn+11pnpn+11p=p+(pnn1)pn+1(1p)2

即为所求.


我们考虑数列fn=npn的生成函数是什么,我们当然可以如下考虑:

i=1nipi=ni=1npii=1n(ni)pi

考虑前后分别求解,前面是等比数列求和,后面可以考虑使用数列fn=pn,gn=n卷积得到,也可以使用生成函数求解.

这样的思路是可行的,但是我们有更简单的做法:考虑数列fn=pn,发现所需要的数列恰好是f乘以对应项标号后左移一位,可以将F(x)求导后得到,进而求解前缀和.

F(x)=11px  fn=pnG(x)=F(x)=p(1px)2  gn=<p,2p2,3p3,>

发现这个形式已经很好了,我们只要求前n1项的前缀和即为答案.写出答案数列的生成函数并尝试拆项:

S(x)=G(x)1x=p(1px)2(1x)(待定系数)=A1px+B(1px)2+C1x=p2(p1)2 11px+p2p1 1(1px)2+p(p1)2 11x

根据公式1以及牛顿二项式定理,这个形式就可以还原为数列了:

sn=pn+2(p1)2+p2 pn(n+1)p1+p(p1)2=(p(n+1)(n+1)1)pn+2+p(p1)2

因此:

sn1=(pnn1)pn+1+p(p1)2

即为所求.


生成函数与数论

让我们重新表示一个数列的生成函数,这次我们不再使用多项式,而改用迪利克雷生成函数,具体的,对于数列{fn},我们定义它的迪利克雷生成函数为:

F(x)=i=1fi 1ix

如不加特殊声明,本小节中的生成函数均指迪利克雷生成函数.

为什么我们要使用这个生成函数?这个生成函数与数论又有什么关系?我们知道,在前面的生成函数定义中,生成函数相乘意味着对应数列的卷积.让我们来考察一下在这个定义下,F(x)G(x)有什么样的性质.

F(x)G(x)=i=1fi 1ixj=1gj 1jx=i=1j=1figj1(ij)x=i=1d|ifdgi/d 1ixhn=d|ifdgi/d=(fg)(n)

可以发现,在这样的定义下,生成函数的乘积对应着数列的迪利克雷卷积,这可以引发我们的许多联想.
让我们引入黎曼-Zeta函数.

ζ(x)=i=11ix↔<1,1,1,>

根据莫比乌斯反演,μ1=ϵ,因此有:

1ζ(x)=i=1μ(i)1ix↔<μ(1),μ(2),μ(3),>

这也是莫比乌斯反演的另一种形式.

小结

我们重复一遍:“生成函数是数列与函数之间的桥梁.”我们通过生成函数,将数列问题转化为函数的问题,并借助函数的处理办法来求数列的一些性质.

我们可以用生成函数解决一些数列通项求解,前缀和求解问题,并以此来解决一些计数题目.

posted @   snowycat1234  阅读(156)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示