组合数学课程笔记(三):生成函数

离散和连续的不期而遇,
抽象与数分的阴阳交融。

我将以加与乘的生铁铸就组合的奇迹,
这世间都要把你的伟岸与光辉所传颂。

GeneratingFunction

生成函数所蕴含的思想

生成函数的主要思想是用简单的加法乘法运算,组合出强大的复杂的数列。你会惊讶于这些简单的东西经过组合之后竟然有如此强大的能量!或许,这也是 组合数学 其名的来历。

这一思想的直接运用,就是数解空间的大小,即解的数量。

Double Deck 问题

给定两副完全一样的牌,各有 n 张,现在选 m 张,有多少种选法?

我们将其转化,设 zi 是第 i 张牌被选择的次数,则对 (z1,z2,,zn),有 zi{0,1,2}zi=m

然后,我们可以用一个单项式表示一个选择的方法,ax1k1x2k2xnkn 表示第 i 张牌选择 ki 个的方法种数。

我们就可以用简单的 (1+x+x2) 组合出问题的答案:(1+x+x2)n 的第 m 项的系数。

而我们用两次二项式定理拆开,能得到

(1+x+x2)n=kn(nk)(x+x2)k=m((nm)(m))xm

所以第 m 项的系数就是 ((nm)(m))

普通生成函数

ordinary generating function 是一个级数 n=0anxn,对于计算机人来说,它就像是一种编码,把 {ai} 这个序列用另一种方式写了出来。

在这种情况下,代数运算成为了基础的零件,供我们利用生成函数之间的运算生成某个答案。答案的形式往往是级数某一项的系数。

抽象代数

抽象代数是我们严格的定义生成函数的方式。

从抽象代数的角度来说,生成函数是一个 形式幂级数,而在形式幂级数上定义加法和乘法就可以构成一个环 C[[x]]。它是形式的,也就是只有加法和乘法。

这个环有很多便于我们理解的性质。

  1. 在环上的加法和乘法是通常意义的,也就是,我们可以直接用多项式的卷积理解它。

  2. 环上的乘法幺元是 1,也就是我们通常理解的自然数 1

同时,因为它是环,那么 0 以外的每个元素都存在乘法逆元。

这样,我们就可以表示元素 F(x) 的逆元,即若 F(x)G(x)=1,则称 G(x)F(x) 的逆元,表示为 F(x)1 或者 1F(x)

数学分析

数学分析是我们感性而经验性的理解生成函数的方式,但是它也是严格的。

从定义上说,形式幂级数和普通的无穷级数具有千丝万缕的联系,所以我们可以方便的把数分中无穷级数的性质拓展到生成函数去。

首先,从数分角度理解生成函数的基础是这个定理:

  • 对于 A(x)=nanxnB(x)=nbnxn,如果对于 0 在复平面上的邻域 (0,δ) 中的任意 x0 都有 A(x)=B(x),则对任意的 i 都有 ai=bi

然后,我们就可以理解成,生成函数是一个本身的函数性质不重要的数学结构,同时,因为对于任何无穷级数总有收敛半径 r 使得复平面上 0 的半径为 r 的邻域内级数都收敛,我们不妨就认为它总是只在这个收敛半径内取值。从而方便的进行求逆、微分等运算。

在数分角度上理解生成函数,意味着所有的运算,加法、乘法、微分、积分、泰勒展开、求逆,都可以用普通的为我们所熟悉的方式来理解和运用,这是非常可贵的,在实际运用中具有重要的性质。

生成函数的运算

加法

加法是本身形式幂级数所定义的运算,是简单和常规的。

(anxn)+(bnxn)=(an+bn)xn

乘法

乘法也是形式幂级数所定义的,又名为卷积

(anxn)(bnxn)=(knakbnk)xn

几何级数

从数分的角度上讲,因为我们无时无刻不认为生成函数这个“无穷级数”收敛,所以生成函数 αnxn=11αx

从形式幂级数的角度上讲,11αx 是一个记号。

也就是 αnxnC[[x]] 上的乘法逆元。也就是 (1αx)αnxn=1。但是因为逆元的可乘性,anxnbnxn 的积的逆元就是两者逆元的积 11ax11bx

如果我们再深究下去,我们会发现,

11ax+11bx=A(x)+B(x)=(an+bn)xn

=(nknakbnkxknk1akbnkxn)+

(nknakbnkxknkn1akbnkxn)

=2nknakbnkxknk[0,n1]ak+1bnkxnnk[0,n1]akbnk1xn

=2nknakbnkxkaxnknakbnkbxnknakbnk

=2A(x)B(x)axA(x)B(x)bxA(x)B(x)

=1ax+1bx(1ax)(1bx)

也就是,逆元记号的加法完全符合分数的运算法则!!!

或许,我们不应该用“美妙”之类的词汇形容它,因为这种性质是由相似的定义决定的。但是,它就像前路绘制好的风景,只是等待着你,等待着发现美的你。

微分

G(x)=n=0(n+1)gn+1xn

从数分的角度来说,这是简单的。

从抽象代数的角度来说,我们不能去研究值域的收敛和极限,但是我们可以定义一个 微分算子,也就是,这个形式是我们直接所定义出来的。因为这里只涉及幂,所以不需要进行普适的函数的定义。

泰勒展开

G(x)=n=0G(n)(0)n!xn

对数分来说,这是简单的。

但是代数这里确实说不过去了,因为我们带入值本身是不合法的。

不过我们仔细思考一下,代入 0 相当于什么呢?相当于只取 G(x) 的常数项。那么我们也可以直接定义算子 0G(x) 代替 G(0),表示 G(x) 的常数项。然后就可以直接做了。

使用生成函数解决组合计数问题

multiset 问题

这个问题我们研究过,我们知道它等价于十二重计数法的第 IV 个。但是我们可以用生成函数的语言来表示。

S={x1,x2,,xn}multiset 个数可以用 (1+x1+x12+)(1+xn+xn2+) 来生成。

然后,因为我们不需要区分这些数到底是什么,所以就是 (1+x+x2+)n

也就是 (1x)n

然后我们用牛顿公式展开

=k0(n)(n1)(nk+1)(1)kk!xk

=k0(n)(n+1)(n+k1)k!xk

=k0(n+k1k)xk

  • 牛顿公式:(1+x)a=k0(a)(a1)(ak+1)k!xk。证明:对 (1+x)a 进行泰勒展开即可。

斐波那契数列

斐波那契数列是一个数列 {fi} 满足 fi2+fi1=fi,f0=1,f1=1

我们考虑它的生成函数 F(x)=n0fnxn,明显的,fi2+fi1=fi 意即 x2F(x)+xF(x)+1=F(x)+1 是为了配平常数项为 1)。

解此方程得 F(x)=1x2+x1

通过有理分式的知识,我们知道,设

ϕ=5+12,ϕ+=5+12

1xx2=(1ϕ+x)(1ϕx)

F(x)=1x2+x1=1(1ϕ+x)(1ϕx)

则待定系数 a,b

F(x)=a(1ϕ+x)+b(1ϕx)

a(1ϕx)+b(1ϕ+x)=1

解得 a=15ϕ,b=15ϕ+

由于 kA(x)=n0kanxn,(A(x)+B(x))=n0(an+bn)xn

以及 11ax=n0anxn

F(x)=a(n0ϕnxn)+b(n0ϕ+nxn)=15n0ϕn+1xn+15n0ϕ+n+1xn

=15n0(ϕ+n+1ϕn+1)xn=n0(ϕ+n+1ϕn+1)5xn

展开 ϕϕ+,就得到我们的最终 {fn}

fn=(5+12)n+1(5+12)n+15

卡特兰数

卡特兰数的定义方法有很多,但是为了方便定义其递归形式,我们还是使用如下定义:

  • Cn 表示有 n+1 个叶子节点的满二叉树个数。

然后我们考虑如何求卡特兰数,设其生成函数为 F(x)=n=0Cnxn

根据定义,有递推公式 Cn=k=0n1CkCnk1C0=1

所以,有 F(x)=n=0Cnxn=C0+n=1(k=0n1CkCnk1)xn

然后我们考虑去把后面的 n=1(k=0n1CkCnk1)xn 凑成 F(x) 的表达式,这个东西看起来很像卷积,那么往卷积公式 F(x)2=n=0k=0nCkCnkxn 上凑。

我们发现如果令 n=n1,那么 n=1(k=0n1CkCnk1)xn 就等于 n=0(k=0nCkCnk)xn+1,然后提出一个 x,就变成了卷积的形式。所以我们得到

F(x)=1+xF(x)2

解这个方程得到 F(x)=1±14x2x

但是现在遇到了问题,我们得到了两个解。可是卡特兰数的定义是唯一的。

现在我们遇到麻烦了。第一个想法是求助于解析。因为我们知道,即使没有抽象代数中形式幂级数的定义,在柯西-维尔斯特拉斯定理的帮助下,生成函数的定义也是完备的。

果然,解析给了我们良好的答案,我们在 0 的邻域内求极限,得到

limn01+14x2x=

limn0114x2x=1

所以我们舍掉第一个根而选用第二个。

但是作为基准的抽象代数呢?

我们发现,对于一个级数来说,一定存在收敛半径。但是第一个根如果作为级数来看,它在 0 处是发散的。

这就引起了我们的警觉,第一个根根本就没法展开成级数形式!

实际上,在不同的域上解方程,其解的情况是不同的。解一元二次方程,在实数域上可能无解,在复数域上就一定有两个根,而在形式幂级数环上,这个方程就只有一个根。这是形式幂级数环上的幂零根性质导致的。

所以,我们得到了卡特兰数的生成函数的封闭形式 F(x)=1(14x)1/22x

首先根据牛顿公式展开 (14x)1/2=n=0(1/2n)(4x)n

然后拆出常数项 1+n=1(1/2n)(4x)n,提出一个 4x 得到 14xn=0(1/2n+1)(4x)n。代入原式得到 2n=0(1/2n+1)(4x)n

我们得到 Cn=2(1/2n+1)(4)n,拆开得到

Cn=2(1/2)(1/21)(1/22)(1/2n)(n+1)!(4)n

=(12)(14)(12n)(n+1)!(2)n

=135(2n1)(n+1)!2n

=(2n)!(n+1)!n!

=1n+1(2nn)

这就是卡特兰数。

多边形的三角形划分

三角形是二维平面上的单纯形。也就是,我们不能通过它的顶点之间的连接将其划分成其他的二维图形。

n 边形则可以划分成若干个三角形。现在如果我们将多边形的顶点视作互不相同的,求其划分方法。

我们可以将其一一对应到二叉树上,我们定义一个起始节点,将每个小的三角形看作叶子节点,那么我们可以分治的考虑,将剩下的多边形划分成两边,一边归入左子树,另一边归入右子树,就可以一一对应到有 n2 个叶子节点的满二叉树,划分方案数是 Cn3

快速排序的平均复杂度分析

我们知道,快速排序在最坏的情况下复杂度是 Θ(n2) 的。而其平均复杂度是 O(nlnn),平均复杂度就是对于一个序列 A 的所有排列,其比较次数的平均值,也就是比较次数的期望。

Tn 为对长度 n 的序列进行快速排序的期望复杂度。

则有 Tn=1nk=1n(n1+Tk1+Tnk)T0=0T1=0

然后设 F(x)=n=0Tnxn,拆开两边,得到

nTn=k=1n(n1)+2k=0n1Tk

写成生成函数的形式,为

n=0nTnxn=n=0n(n1)xn+2n=0k=0n1Tkxn

然后凑成 F(x)=n=0Tnxn 的形式。

n=n1n=0nTnxn=xn=0(n+1)Tn+1xn=xF(x)

n=0n(n1)xn=2x2n=0n(n1)2xn2=2x2(1x)3

n=n12n=0k=0n1Tkxn=2xn=0k=0nTkxn=2xF(x)1x

xF(x)=2x2(1x)3+2xF(x)1x

F(x)2F(x)1x=2x(1x)3

这是一个线性常微分方程,一阶线性常微分方程 y+P(x)y=Q(x) 有通解

u(x)=eP(x)dx,y=1u(x)u(x)Q(x)dx

Ex:一阶线性常微分方程通解公式证明

y=G(x)u(x)u(x) 的定义如上

y=u(x)G(x)u(x)G(x)u2(x)

=eP(x)dxG(x)P(x)G(x)eP(x)dxe2P(x)dx

=G(x)P(x)G(x)u(x)

G(x)P(x)G(x)+P(x)G(x)=u(x)Q(x)

G(x)=u(x)Q(x)

G(x)=u(x)Q(x)dx

即可得此公式。

然后,我们套用此公式,令 P(x)=21xQ(x)=2x(1x)3

即可得到 u(x)=e2/(1x)dx

2x1dx=21x1dx=21x1d(x1)=2ln|x1|,我们不在乎 x 的取值,所以把绝对值去掉,2ln(x1)u(x)=(x1)2

u(x)Q(x)dx=(x1)22x(1x)3dx=2x(1x)dx

=2xx1dx=(22x1)dx=2x

posted @   jucason_xu  阅读(202)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示