生成函数

Junity 发布于 3 天前 89 次阅读 最后更新于 3 天前 1017 字 预计阅读时间: 5 分钟


AI 摘要

引言:生成函数是解决序列问题的强力工具,将序列操作转化为函数操作。通过定义序列的普通生成函数(OGF)并利用其线性、卷积、前缀和等特性,可将复杂问题简化。重点介绍了生成函数的封闭形式和利用部分分式求解通项的方法,并以斐波那契数列为例展示了比内公式的推导过程。

生成函数是一种用于解决与序列有关的问题的强力工具。通过生成函数,我们可以将一个序列映射为一个函数,并将对序列的操作映射为对这个函数的操作,从而轻松解出在序列视角下难以解决的问题。

类似傅里叶变换和拉普拉斯变换,生成函数的本质是 从另一个方式看待序列 ,或是 在另一个“同构”的空间中处理序列问题

生成函数的定义

对于一个序列 {ai},它的 普通生成函数 (OGF) 定义如下:

f(s)=i=0aisi

其中,s 是一个形式变量,可以表示任何使这个求和收敛的数。
例如,对于数列 an=n ,它的生成函数就是 f(s)=s1+2s2+3s3...
在本文中我们使用 OGF(an) 来表示数列 an 的生成函数。

生成函数的性质

前面说到过,我们可以将对序列的操作变为对生成函数的操作。生成函数与原序列有以下性质:

  1. 序列之和的生成函数是生成函数之和 :对于序列 an,bn ,有 OGF(an+bn)=OGF(an)+OGF(bn)
  2. 序列乘标量的生成函数是生成函数乘标量:对于序列 an ,有 OGF(kan)=kOGF(an)
  3. 序列的卷积的生成函数是生成函数之积 :对于序列 an,bn ,有 OGF(an×bn)=OGF(an)OGF(bn)
  4. 前缀和性质 :对于序列 an ,若 bn=i=0nai ,则 OGF(bn)=OGF(an)1s ,其中 s 是生成函数中的形式变量。
  5. 差分性质:对于序列 an ,若 bn=anan1,b0=a0 ,则 OGF(bn)=(1s)OGF(an) ,其中 s 是生成函数中的形式变量。

生成函数的封闭形式

生成函数的真正强大之处在于,它可以借助序列自身的特性写成一个简单的封闭形式。考虑斐波那契数列 fibn ,它的生成函数为 f(s)=i=1fibisi 。我们将前面两项单列出来:

f(s)=s+i=2fibisi

因为 fibn=fibn1+fibn2 ,代入可知:

f(s)=s+i=2(fibi1+fibi2)si=s+i=2fibi1si+i=2fibi2si

我们将 s 从后面两项中提取出来,使得 fib 的下标与 s 的幂次统一:

f(s)=s+si=2fibi1si1+s2i=2fibi2si2=s+s(f(s))+s2(f(s))=s+sf(s)+s2f(s)

这是一个一次方程,可以解得 f(s)=s1ss2

由封闭解解出通项

现在的问题是,如何由这个数列得到斐波那契数列的通项?我们首先介绍一下 几何级数

几何级数是这样的级数:s=1+x+x2+... 。当 1<x<1 时,因为 s=sx+1 ,因此 s=11x 我们可以利用这一点,把 f(s) 进行展开:

f(s)=s11(s+s2)=si=0(s+s2)i=si=0j=0i(ij)sjs2(ij)=i=0j=0i(ij)s2ij+1

通过把这个级数进一步展开,我们就可以得到斐波那契数列的通项公式。但实际上由于用到了二项式定理,这个展开会非常麻烦,因此我们可以在使用几何级数进行展开之前,先使用 部分分式 将原式拆成两个简单的分式:

s1ss2=A1as+B1bs{a=1+52b=152A=15B=15s1ss2=1511as15B1bs=15i=0(as)i(bs)i=15i=0(aibi)si=i=015((1+52)i(152)i)si

因此,fibn=15((1+52)n(152)n) 。这个公式被称为 比内公式

除了使用几何级数以外,我们还可以使用 泰勒展开 来进行还原:泰勒公式将函数写成多项式的形式,而这天然就和我们想要的形式一致。考虑 f(s)=ex ,进行泰勒展开可知 f(s)=i=0xii! 可知,ex 是数列 an=1n! 的生成函数。

此作者没有提供个人介绍。
最后更新于 2025-04-23