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

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

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

$ \mathfrak{Generating Function}$

生成函数所蕴含的思想

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

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

\(\text{Double Deck}\) 问题

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

我们将其转化,设 \(z_i\) 是第 \(i\) 张牌被选择的次数,则对 \((z_1,z_2,\cdots,z_n)\),有 \(z_i \in \{0,1,2\}\)\(\sum z_i=m\)

然后,我们可以用一个单项式表示一个选择的方法,\(ax_1^{k_1}x_2^{k_2}\cdots x_n^{k_n}\) 表示第 \(i\) 张牌选择 \(k_i\) 个的方法种数。

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

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

\((1+x+x^2)^n=\sum_{k\le n}{n\choose k}(x+x^2)^k=\sum_{m}(\sum_{\ell}{n \choose m-\ell}{m-\ell \choose \ell})x^m\)

所以第 \(m\) 项的系数就是 \((\sum_{\ell}{n \choose m-\ell}{m-\ell \choose \ell})\)

普通生成函数

\(\text{ordinary generating function}\) 是一个级数 \(\sum_{n=0}^\infty a_nx^n\),对于计算机人来说,它就像是一种编码,把 \(\{a_i\}\) 这个序列用另一种方式写了出来。

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

抽象代数

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

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

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

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

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

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

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

数学分析

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

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

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

  • 对于 \(A(x)=\sum_n^{\infty}a_nx^n\)\(B(x)=\sum_n^{\infty}b_nx^n\),如果对于 \(0\) 在复平面上的邻域 \((0,\delta)\) 中的任意 \(x_0\) 都有 \(A(x)=B(x)\),则对任意的 \(i\) 都有 \(a_i=b_i\)

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

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

生成函数的运算

加法

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

\((\sum a_nx^n)+(\sum b_nx^n)=\sum(a_n+b_n)x^n\)

乘法

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

\((\sum a_nx^n)*(\sum b_nx^n)=\sum (\sum_{k\le n}a_kb_{n-k})x^n\)

几何级数

从数分的角度上讲,因为我们无时无刻不认为生成函数这个“无穷级数”收敛,所以生成函数 \(\sum{\alpha^nx^n}=\dfrac{1}{1-\alpha x}\)

从形式幂级数的角度上讲,\(\dfrac{1}{1-\alpha x}\) 是一个记号。

也就是 \(\sum{\alpha^nx^n}\)\(\mathbb{C}[[x]]\) 上的乘法逆元。也就是 \((1-\alpha x)\sum{\alpha^nx^n}=1\)。但是因为逆元的可乘性,\(\sum{a^nx^n}\)\(\sum{b^n x^n}\) 的积的逆元就是两者逆元的积 \(\dfrac{1}{1-ax}\dfrac{1}{1-bx}\)

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

\[\dfrac{1}{1-ax}+\dfrac{1}{1-bx}=A(x)+B(x)=\sum{(a^n+b^n)x^n} \]

\[=(\sum_n^{\infty}\sum_{k\le n}a^{k}b^{n-k}x^k-\sum_n^{\infty}\sum_{k\ge 1}a^kb^{n-k}x^n)+ \]

\[(\sum_n^{\infty}\sum_{k\le n}a^{k}b^{n-k}x^k-\sum_n^{\infty}\sum_{k\le n-1}a^kb^{n-k}x^n) \]

\[=2\sum_n^{\infty}\sum_{k\le n}a^{k}b^{n-k}x^k-\sum_n^{\infty}\sum_{k\in[0,n-1]}a^{k+1}b^{n-k}x^n-\sum_n^{\infty}\sum_{k\in[0,n-1]}a^{k}b^{n-k-1}x^n \]

\[=2\sum_n^{\infty}\sum_{k\le n}a^{k}b^{n-k}x^k-ax\sum_n^{\infty}\sum_{k\le n}a^{k}b^{n-k}-bx\sum_n^{\infty}\sum_{k\le n}a^{k}b^{n-k} \]

\[=2A(x)B(x)-axA(x)B(x)-bxA(x)B(x) \]

\[=\dfrac{1-ax+1-bx}{(1-ax)(1-bx)} \]

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

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

微分

\[G'(x)=\sum_{n=0}^{\infty}(n+1)g_{n+1}x^n \]

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

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

泰勒展开

\[G(x)=\sum_{n=0}^{\infty}\dfrac{G^{(n)}(0)}{n!}x^n \]

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

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

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

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

\(\text{multiset}\) 问题

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

\(S=\{x_1,x_2,\cdots,x_n\}\)\(multiset\) 个数可以用 \((1+x_1+x_1^2+\cdots)\cdots(1+x_n+x_n^2+\cdots)\) 来生成。

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

也就是 \((1-x)^{-n}\)

然后我们用牛顿公式展开

\(=\sum_{k\ge 0}\dfrac{(-n)(-n-1)\cdots(-n-k+1)(-1)^k}{k!}x^k\)

\(=\sum_{k\ge 0}\dfrac{(n)(n+1)\cdots(n+k-1)}{k!}x^k\)

\(=\sum_{k\ge 0}{n+k-1\choose k}x^k\)

  • 牛顿公式:\((1+x)^a=\sum_{k\ge 0}\dfrac{(a)(a-1)\cdots(a-k+1)}{k!}x^k\)。证明:对 \((1+x)^a\) 进行泰勒展开即可。

斐波那契数列

斐波那契数列是一个数列 \(\{f_i\}\) 满足 \(f_{i-2}+f_{i-1}=f_i,f_0=1,f_1=1\)

我们考虑它的生成函数 \(F(x)=\sum_{n\ge 0}f_n x^n\),明显的,\(f_{i-2}+f_{i-1}=f_i\) 意即 \(x^2F(x)+xF(x)+1=F(x)\)\(+1\) 是为了配平常数项为 \(1\))。

解此方程得 \(F(x)=\dfrac{1}{x^2+x-1}\)

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

\[\phi_-=\dfrac{-\sqrt{5}+1}{2},\phi_+=\dfrac{\sqrt{5}+1}{2} \]

\[1-x-x^2=(1-\phi_+x)(1-\phi_-x) \]

\[F(x)=\dfrac{1}{x^2+x-1}=\dfrac{1}{(1-\phi_+x)(1-\phi_-x)} \]

则待定系数 \(a,b\)

\[F(x)=\dfrac{a}{(1-\phi_+x)}+\dfrac{b}{(1-\phi_-x)} \]

\[a(1-\phi_-x)+b(1-\phi_+x)=1 \]

解得 \(a=-\dfrac{1}{\sqrt{5}}\phi_-,b=\dfrac{1}{\sqrt{5}}\phi_+\)

由于 \(kA(x)=\sum_{n\ge 0}{ka_n x^n},(A(x)+B(x))=\sum_{n\ge 0}{(a_n+b_n)x^n}\)

以及 \(\dfrac{1}{1-ax}=\sum_{n\ge 0}a^nx^n\)

\[F(x)=a(\sum_{n\ge 0}{\phi_-^n x^n})+b(\sum_{n\ge 0}{\phi_+^n x^n})=\dfrac{1}{\sqrt{5}}\sum_{n\ge 0}{-\phi_-^{n+1} x^n}+\dfrac{1}{\sqrt{5}}\sum_{n\ge 0}{\phi_+^{n+1} x^n} \]

\[=\dfrac{1}{\sqrt{5}}\sum_{n\ge 0}{(\phi_+^{n+1}-\phi_-^{n+1}) x^n}=\sum_{n\ge 0}{\dfrac{(\phi_+^{n+1}-\phi_-^{n+1})}{\sqrt{5}} x^n} \]

展开 \(\phi_-\)\(\phi_+\),就得到我们的最终 \(\{f_n\}\)

\[f_n=\dfrac{(\dfrac{\sqrt{5}+1}{2})^{n+1}-(\dfrac{-\sqrt{5}+1}{2})^{n+1}}{\sqrt{5}} \]

卡特兰数

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

  • \(C_n\) 表示有 \(n+1\) 个叶子节点的满二叉树个数。

然后我们考虑如何求卡特兰数,设其生成函数为 \(F(x)=\sum_{n=0}^{\infty}C_nx^n\)

根据定义,有递推公式 \(C_n=\sum_{k=0}^{n-1}C_kC_{n-k-1}\)\(C_0=1\)

所以,有 \(F(x)=\sum_{n=0}^{\infty}C_nx^n=C_0+\sum_{n=1}^{\infty}(\sum_{k=0}^{n-1}C_kC_{n-k-1})x^n\)

然后我们考虑去把后面的 \(\sum_{n=1}^{\infty}(\sum_{k=0}^{n-1}C_kC_{n-k-1})x^n\) 凑成 \(F(x)\) 的表达式,这个东西看起来很像卷积,那么往卷积公式 \(F(x)^2=\sum_{n=0}^{\infty}\sum_{k=0}^{n}C_kC_{n-k}x^n\) 上凑。

我们发现如果令 \(n'=n-1\),那么 \(\sum_{n=1}^{\infty}(\sum_{k=0}^{n-1}C_kC_{n-k-1})x^n\) 就等于 \(\sum_{n'=0}^{\infty}(\sum_{k=0}^{n'}C_kC_{n'-k})x^{n'+1}\),然后提出一个 \(x\),就变成了卷积的形式。所以我们得到

\[F(x)=1+xF(x)^2 \]

解这个方程得到 \(F(x)=\dfrac{1\pm\sqrt{1-4x}}{2x}\)

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

\[代数是慷慨的,它提供给人们的常常比人们要求的还要多。——达朗贝尔 \]

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

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

\(\lim_{n\rightarrow 0}\dfrac{1+\sqrt{1-4x}}{2x}=\infty\)

\(\lim_{n\rightarrow 0}\dfrac{1-\sqrt{1-4x}}{2x}=1\)

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

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

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

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

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

所以,我们得到了卡特兰数的生成函数的封闭形式 \(F(x)=\dfrac{1-(1-4x)^{1/2}}{2x}\)

首先根据牛顿公式展开 \((1-4x)^{1/2}=\sum_{n=0}^{\infty}\binom{1/2}{n}(-4x)^n\)

然后拆出常数项 \(1+\sum_{n=1}^{\infty}\binom{1/2}{n}(-4x)^n\),提出一个 \(-4x\) 得到 \(1-4x\sum_{n=0}^{\infty}\binom{1/2}{n+1}(-4x)^n\)。代入原式得到 \(2\sum_{n=0}^{\infty}\binom{1/2}{n+1}(-4x)^n\)

我们得到 \(C_n=2\binom{1/2}{n+1}(-4)^n\),拆开得到

\(C_n=2\dfrac{(1/2)(1/2-1)(1/2-2)\cdots (1/2-n)}{(n+1)!}(-4)^n\)

\(=\dfrac{(1-2)(1-4)\cdots(1-2n)}{(n+1)!}(-2)^n\)

\(=\dfrac{1\cdot 3\cdot 5\cdots(2n-1)}{(n+1)!}2^n\)

\(=\dfrac{(2n)!}{(n+1)!n!}\)

\(=\dfrac{1}{n+1}\binom{2n}{n}\)

这就是卡特兰数。

多边形的三角形划分

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

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

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

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

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

\(T_n\) 为对长度 \(n\) 的序列进行快速排序的期望复杂度。

则有 \(T_n=\dfrac{1}{n}\sum_{k=1}^{n}(n-1+T_{k-1}+T_{n-k})\)\(T_0=0\)\(T_1=0\)

然后设 \(F(x)=\sum_{n=0}^{\infty}T_nx^n\),拆开两边,得到

\(nT_n=\sum_{k=1}^n(n-1)+2\sum_{k=0}^{n-1}T_k\)

写成生成函数的形式,为

\(\sum_{n=0}^{\infty}nT_nx^n=\sum_{n=0}^{\infty}n(n-1)x^n+2\sum_{n=0}^{\infty}\sum_{k=0}^{n-1}T_kx^n\)

然后凑成 \(F(x)=\sum_{n=0}^{\infty}T_nx^n\) 的形式。

\(n'=n-1\)\(\sum_{n=0}^{\infty}nT_nx^n=x\sum_{n'=0}^{\infty}(n'+1)T_{n'+1}x^{n'}=xF'(x)\)

\(\sum_{n=0}^{\infty}n(n-1)x^n=2x^2\sum_{n=0}^{\infty}\dfrac{n(n-1)}{2}x^{n-2}=\dfrac{2x^2}{(1-x)^3}\)

\(n'=n-1\)\(2\sum_{n=0}^{\infty}\sum_{k=0}^{n-1}T_kx^n=2x\sum_{n'=0}^{\infty}\sum_{k=0}^{n'}T_kx^{n'}=\dfrac{2xF(x)}{1-x}\)

\(xF'(x)=\dfrac{2x^2}{(1-x)^3}+\dfrac{2xF(x)}{1-x}\)

\(F'(x)-\dfrac{2F(x)}{1-x}=\dfrac{2x}{(1-x)^3}\)

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

\[u(x)=e^{\int P(x) dx},y=\dfrac{1}{u(x)}\int u(x)Q(x) dx \]

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

\(y=\dfrac{G(x)}{u(x)}\)\(u(x)\) 的定义如上

\(y'=\dfrac{u(x)G'(x)-u'(x)G(x)}{u^2(x)}\)

\(=\dfrac{e^{\int P(x) dx}G'(x)-P(x)G(x)e^{\int P(x) dx}}{e^{2\int P(x) dx}}\)

\(=\dfrac{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)=\int u(x)Q(x)dx\)

即可得此公式。

然后,我们套用此公式,令 \(P(x)=-\dfrac{2}{1-x}\)\(Q(x)=\dfrac{2x}{(1-x)^3}\)

即可得到 \(u(x)=e^{\int -2/(1-x)dx}\)

\(\int \dfrac{2}{x-1}dx=2\int \dfrac{1}{x-1}dx=2\int \dfrac{1}{x-1}d(x-1)=2\ln|x-1|\),我们不在乎 \(x\) 的取值,所以把绝对值去掉,\(2\ln(x-1)\)\(u(x)=(x-1)^2\)

\(\int u(x)Q(x)dx=\int (x-1)^2\dfrac{2x}{(1-x)^3}dx=\int \dfrac{2x}{(1-x)}dx\)

\(=-\int \dfrac{2x}{x-1}dx=-\int (2-\dfrac{2}{x-1})dx=-2x\)

posted @ 2023-03-10 14:19  jucason_xu  阅读(103)  评论(1编辑  收藏  举报