母函数可以用于数列,概率,组合数学中,是个极其强大的工具。
定义
对于一个数列 a0,a1,a2,a3… ,定义 G(x)=a0+a1x+a2x2+a3x3… 为其母函数(这里对是否无穷项并没有什么要求)。
看起来没什么用,但是我们看一个例子:
已知母函数 G(x)=C0n+C1nx+C2nx2+C3nx3… 。
很明显,这是个二项式展开式,那我们不妨将其写成 G(x)=(x+1)n 。这里母函数的作用就体现出来了。我们可以将一个无穷式变成一个收敛形式,便于计算处理。
普通型母函数
首先来看看几个常见普通母函数:
-
G(x)=11−x=1+x+x2+x3+…
由等比数列求和公式可知 G(x)=a1(1−qn)1−q ,这里的话 q=x,a1=1 。由于 x 可以是任何数,我们不妨设其小于 1 。那么 qn 趋近于 0 ,就得到收敛形式。
-
G(x)=11−kx=1+kx+k2x2+k3x3…
证明同上。
-
G(x)=1(1−x)n=C0n+0−1+C1n+1−1x+C2n+2−1x2+C3n+3−1x3⋯+Ckn+k−1xk…
证明:数学归纳法。
假设 n 的情况成立,那么对于 n+1 :
G(x)=1(1−x)n+1=1(1−x)n1(1−x)此时对于第k项有:ak=k∑i=1Cin+i−1=Ckn+1+k−1
这里用到了 Cnm=Cn−1m−1+Cnm−1,最后的递归边界由于 C0n−1=C0n+1−1 所以就可以滚雪球上去。
虽然好像母函数主要是被用在组合上,但是用其来解数列递推式也非常香(初赛的递推数列题可以用母函数暴力推),这里以斐波那契数列为例:
已知 fn+1=fn+fn−1 。
那么对于其母函数 T ,有:
T=f0+f1x+f2x2+f3x3+…xT=f0x+f1x2+f2x3+…x2T=f0x2+f1x3+…(1)(2)(3)∴T−f0−f1x=xT−f0x+x2T解得:T=11−x−x2
那么我们有了斐波那契数列母函数的收敛形式,只要将其向几个基本的母函数上靠,期望就能得到通项:
T=1−(√5−12−x)(−√5−12−x)(4)
可以看出其中有黄金分割率,看起来离正解不远了,我们设其为 ϕ1 和 ϕ2 然后继续:
T=1−ϕ1ϕ2(1−1ϕ1x)(1−1ϕ2x)=1(1−1ϕ1x)(1−1ϕ2x)
然后再裂个项:
T=1√5(−ϕ21−1ϕ1x+ϕ11−1ϕ2x)
根据几个基本母函数,斐波那契的通项为:
Fn=1√5[(1+√52)n+1−(1−√52)n+1]
除了解递推数列通项,普通型母函数还可以解一些无重复项的组合问题,如质数分解问题,将一个数 n 分解成质数和的形式,有多少种本质不同的方法。
根据题意构建方程:
G(x)=(1+x2+x4+x6+⋯)×(1+x3+x6+⋯)×(1+x5+x10⋯)×⋯
化简后 n 次项的系数即为方法数。
用这种方法甚至可以解决如凑零钱之类的 dp 问题,但根据上例可以发现,系数是要手动爆枚的,所以复杂度上来说并没有什么实际意义。
指数型母函数
基本形式如下:
G(x)=∞∑i=0xii!=1+x+x22!+x33!+x44!+⋯
可以注意到阶乘的形式很特别,易联想到 Taylor 展开 ,因为 x 取值并没有什么关系,我们就取 ex 作为其收敛形式(与 ex 在 0 处的展开式相同)。
那么同样,常见的指数型母函数有:
- G(x)=ex+e−x2=∑∞i=0x2i(2i)!=1+x22!+x44!+⋯
- G(x)=ex−e−x2=∑∞i=0x2i+1(2i+1)!=x+x33!+⋯
皆为 Taylor 展开式。
指数型母函数主要是为求解有重复项的组合问题,比如 1,1,2,3 可以组合成的四位数个数,明显是 4!2! 个,这就是为何下面要除阶乘。
注意,最终我们需要的是 xnn! 前的系数,可以发现,下面没有阶乘的项乘出来会自动个乘阶乘,而有阶乘的会把重复部分除掉,刚好达到预计效果。
如果还不明白可以找个例子手动操作一遍。
指数型母函数大多可以通过 Taylor 展开找到通项,这是其优点。
如,求 1,3,5,7,9 可以组成的 n 位数个数。其中 3,7 分别出现偶数次。
依照题意构建母函数:
T=(1+x22!+x44!+⋯)2×(1+x+x22!+x33!+x44!+⋯)3=(ex+e−x2)2×e3x=14(e5x+2e3x+ex)=14∞∑i=0(5i+2×3i+1)xii!
那么第 n 项的系数是: 5n+2×3n+14 。
-EOF-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫