组合数学课程笔记(三):生成函数
序
离散和连续的不期而遇,
抽象与数分的阴阳交融。
我将以加与乘的生铁铸就组合的奇迹,
这世间都要把你的伟岸与光辉所传颂。
生成函数所蕴含的思想
生成函数的主要思想是用简单的加法乘法运算,组合出强大的复杂的数列。你会惊讶于这些简单的东西经过组合之后竟然有如此强大的能量!或许,这也是 组合数学 其名的来历。
这一思想的直接运用,就是数解空间的大小,即解的数量。
问题
给定两副完全一样的牌,各有
我们将其转化,设
然后,我们可以用一个单项式表示一个选择的方法,
我们就可以用简单的
而我们用两次二项式定理拆开,能得到
所以第
普通生成函数
在这种情况下,代数运算成为了基础的零件,供我们利用生成函数之间的运算生成某个答案。答案的形式往往是级数某一项的系数。
抽象代数
抽象代数是我们严格的定义生成函数的方式。
从抽象代数的角度来说,生成函数是一个 形式幂级数,而在形式幂级数上定义加法和乘法就可以构成一个环
这个环有很多便于我们理解的性质。
-
在环上的加法和乘法是通常意义的,也就是,我们可以直接用多项式的卷积理解它。
-
环上的乘法幺元是
,也就是我们通常理解的自然数 。
同时,因为它是环,那么
这样,我们就可以表示元素
数学分析
数学分析是我们感性而经验性的理解生成函数的方式,但是它也是严格的。
从定义上说,形式幂级数和普通的无穷级数具有千丝万缕的联系,所以我们可以方便的把数分中无穷级数的性质拓展到生成函数去。
首先,从数分角度理解生成函数的基础是这个定理:
- 对于
和 ,如果对于 在复平面上的邻域 中的任意 都有 ,则对任意的 都有 。
然后,我们就可以理解成,生成函数是一个本身的函数性质不重要的数学结构,同时,因为对于任何无穷级数总有收敛半径
在数分角度上理解生成函数,意味着所有的运算,加法、乘法、微分、积分、泰勒展开、求逆,都可以用普通的为我们所熟悉的方式来理解和运用,这是非常可贵的,在实际运用中具有重要的性质。
生成函数的运算
加法
加法是本身形式幂级数所定义的运算,是简单和常规的。
乘法
乘法也是形式幂级数所定义的,又名为卷积
几何级数
从数分的角度上讲,因为我们无时无刻不认为生成函数这个“无穷级数”收敛,所以生成函数
从形式幂级数的角度上讲,
也就是
如果我们再深究下去,我们会发现,
也就是,逆元记号的加法完全符合分数的运算法则!!!
或许,我们不应该用“美妙”之类的词汇形容它,因为这种性质是由相似的定义决定的。但是,它就像前路绘制好的风景,只是等待着你,等待着发现美的你。
微分
从数分的角度来说,这是简单的。
从抽象代数的角度来说,我们不能去研究值域的收敛和极限,但是我们可以定义一个 微分算子,也就是,这个形式是我们直接所定义出来的。因为这里只涉及幂,所以不需要进行普适的函数的定义。
泰勒展开
对数分来说,这是简单的。
但是代数这里确实说不过去了,因为我们带入值本身是不合法的。
不过我们仔细思考一下,代入
使用生成函数解决组合计数问题
问题
这个问题我们研究过,我们知道它等价于十二重计数法的第
然后,因为我们不需要区分这些数到底是什么,所以就是
也就是
然后我们用牛顿公式展开
- 牛顿公式:
。证明:对 进行泰勒展开即可。
斐波那契数列
斐波那契数列是一个数列
我们考虑它的生成函数
解此方程得
通过有理分式的知识,我们知道,设
则待定系数
解得
由于
以及
展开
卡特兰数
卡特兰数的定义方法有很多,但是为了方便定义其递归形式,我们还是使用如下定义:
表示有 个叶子节点的满二叉树个数。
然后我们考虑如何求卡特兰数,设其生成函数为
根据定义,有递推公式
所以,有
然后我们考虑去把后面的
我们发现如果令
解这个方程得到
但是现在遇到了问题,我们得到了两个解。可是卡特兰数的定义是唯一的。
现在我们遇到麻烦了。第一个想法是求助于解析。因为我们知道,即使没有抽象代数中形式幂级数的定义,在柯西-维尔斯特拉斯定理的帮助下,生成函数的定义也是完备的。
果然,解析给了我们良好的答案,我们在
所以我们舍掉第一个根而选用第二个。
但是作为基准的抽象代数呢?
我们发现,对于一个级数来说,一定存在收敛半径。但是第一个根如果作为级数来看,它在
这就引起了我们的警觉,第一个根根本就没法展开成级数形式!
实际上,在不同的域上解方程,其解的情况是不同的。解一元二次方程,在实数域上可能无解,在复数域上就一定有两个根,而在形式幂级数环上,这个方程就只有一个根。这是形式幂级数环上的幂零根性质导致的。
所以,我们得到了卡特兰数的生成函数的封闭形式
首先根据牛顿公式展开
然后拆出常数项
我们得到
这就是卡特兰数。
多边形的三角形划分
三角形是二维平面上的单纯形。也就是,我们不能通过它的顶点之间的连接将其划分成其他的二维图形。
而
我们可以将其一一对应到二叉树上,我们定义一个起始节点,将每个小的三角形看作叶子节点,那么我们可以分治的考虑,将剩下的多边形划分成两边,一边归入左子树,另一边归入右子树,就可以一一对应到有
快速排序的平均复杂度分析
我们知道,快速排序在最坏的情况下复杂度是
设
则有
然后设
写成生成函数的形式,为
然后凑成
设
设
这是一个线性常微分方程,一阶线性常微分方程
Ex:一阶线性常微分方程通解公式证明
设
则
即可得此公式。
然后,我们套用此公式,令
即可得到
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现