Lagrange 反演入门
公式推导
应用(感恩 gpt)
它们的共同价值是:不用先解出 \(T(x)\),就能求出由 \(T(x)\) 构成的表达式的系数。下面通过六组例子,把这句话具体化。
1.最基本的用途:从递归结构直接得到计数公式
考虑“有根有序树”:每个结点可以有任意多个孩子,并且孩子之间有顺序。用 \(x\) 记录结点数,令 \(T(x)\) 为它的生成函数。
根结点贡献 \(x\),根的孩子可以是 \(0,1,2,\ldots\) 棵这样的树,因此
这里
想求恰有 \(n\) 个结点的树的数量,就是求 \([x^n]T\)。取 \(H(t)=t\),得到
这就是 Catalan 数 \(C_{n-1}\)。例如 \(n=4\) 时有
棵。
这里最值得体会的过程是:
你甚至不需要解那个二次方程。
2.把 \(T\) 换成 \(T^k\):从一棵树变成森林
仍然使用上面的有根有序树:
现在要数的是:依次摆放的 \(k\) 棵非空树,总结点数为 \(n\)。
每棵树对应一个 \(T\),所以生成函数为 \(T^k\)。取 \(H(t)=t^k\):
代入 \(\Phi(t)=(1-t)^{-1}\):
例如,两棵树共有四个结点:
也可以直接检查。两棵树的大小只能是
相应方案数为
这个例子说明 \(H\) 的作用:\(\Phi\) 决定基本对象怎样递归构造,\(H\) 决定你怎样组织这些基本对象。
例如:
| 表达式 | 在这个例子中的意义 |
|---|---|
| \(T\) | 一棵非空树 |
| \(T^k\) | 恰好 \(k\) 棵树组成的有序森林 |
| \(\displaystyle \frac1{1-T}\) | 任意多棵树组成的有序森林,包括空森林 |
最后一个也能直接代入公式。取 \(H(t)=(1-t)^{-1}\),对 \(n\ge1\):
因此任意有序森林的计数又是 Catalan 数 \(C_n\)。
3.在 \(\Phi\) 中加入参数:精确统计每种度数的结点
前面只统计总结点数。现在进一步问:
有多少棵有根有序树,恰有 \(n_0\) 个叶子、\(n_1\) 个一元结点、\(n_2\) 个二元结点,等等?
这里“\(j\) 元结点”指有 \(j\) 个孩子的结点。
让 \(y_j\) 记录 \(j\) 元结点数,就有
因为一个有 \(j\) 个孩子的根,贡献为
于是
再提取 \(y_0^{n_0}y_1^{n_1}\cdots\) 的系数。要得到这个单项式,必须在 \(n\) 个因子中分别选择 \(n_j\) 次 \(y_jt^j\),所以:
前提是
第一个条件是总结点数;第二个条件是所有结点的孩子数之和等于边数。
例如,恰有三个叶子、两个二元结点:
数量为
再如,恰有三个叶子、一个一元结点、两个二元结点:
数量为
这个例子的用途很广:当题目要求限制叶子数、分叉数、各种结点类型的数量时,可以把这些统计量放进 \(\Phi\) 的系数中。
这里的 \(y_j\) 只是辅助变量,Lagrange 反演仍然针对 \(x\) 使用。
4.换成指数生成函数:求有标号树的数量
现在考虑顶点标号为 \(1,\ldots,n\) 的有根树,孩子之间没有顺序。
这时使用指数生成函数
其中 \(a_n\) 是有根有标号树的数量。
为什么方程变成
固定根有 \(m\) 棵孩子子树时,\(T^m\) 会把孩子子树排列起来;但孩子之间没有顺序,需要除以 \(m!\)。所以
现在 \(\Phi(t)=e^t\),于是
注意指数生成函数的系数要乘回 \(n!\),所以
再除以根的 \(n\) 种选择,就得到无根有标号树的数量
这里有一个很重要的区分:
Lagrange 反演本身并不区分普通生成函数和指数生成函数。区别在于你如何建立方程,以及如何把系数还原成计数。
同样,取 \(H(t)=t^k\):
因此,\(k\) 棵有根有标号树组成的有序森林,总共有 \(n\) 个标号顶点,其数量为
这里各棵树的根也属于需要选择的结构,不能直接把它理解成“根已经指定”的森林计数。
5.同一个 \(T=xe^T\),比较普通公式与伴随公式的分工
考虑所有映射
它们当然共有 \(n^n\) 个。现在看看生成函数怎样得到这个结果,以及你的伴随公式为什么刚好有用。
画出有向边 \(v\to f(v)\)。每个连通分量都由以下部分组成:
- 一个有向环;
- 环上每个顶点挂着一棵朝向它的有根树。
允许长度为 \(1\) 的环,即自环。这里挂在环上的有根树仍由
描述。
先数只有一个连通分量的映射。长度为 \(k\) 的环,对指数生成函数贡献 \(T^k/k\):因为 \(k\) 个对象的有向环排列有 \((k-1)!\) 种,除以 \(k!\) 后剩下 \(1/k\)。
因此连通映射的指数生成函数为
这正适合普通的 Lagrange–Bürmann 公式。取
得到
所以连通映射的数量为
例如 \(n=3\) 时是
接下来,任意映射就是若干个连通分量组成的无序集合,所以它的指数生成函数为
此时观察到
因此
这正是伴随公式的分母。 取 \(H(t)=1\),一步得到
乘回 \(n!\),就是 \(n^n\)。
这一组最能体现两种公式的不同:
| 想数什么 | 生成函数 | 更直接的公式 |
|---|---|---|
| 连通映射 | \(-\log(1-T)\) | 普通 Lagrange–Bürmann |
| 所有映射 | \(\displaystyle \frac1{1-T}=\frac1{1-x\Phi'(T)}\) | 伴随公式 |
普通公式也能处理 \(1/(1-T)\),但会产生
计算明显绕一些。伴随公式的优势,是把这个特殊分母直接消掉。
6.专门体会 \(T'\) 公式,以及它和伴随公式的关系
回到有根有序树:
先求
表达式已经含有 \(T'\),直接使用你笔记中的第二个公式,取 \(H(t)=t^k\):
为什么导数会自然出现?
如果
那么
因此 \(T'\) 可以理解成:
选一棵树,再标记它的一个顶点;这个标记顶点不计入 \(x\) 记录的大小。
所以 \(T^kT'\) 表示:依次放置 \(k\) 棵普通树和一棵带标记顶点的树,统计未标记顶点的总数。
例如 \(k=1,n=2\):
两棵树实际共有三个顶点:
- 第一棵有一个顶点,第二棵有两个顶点,第二棵有两种标记方式;
- 第一棵有两个顶点,第二棵有一个顶点,第二棵有一种标记方式。
总共 \(2+1=3\)。
再看伴随公式。由隐式求导,
这说明,普通的 \(T'\) 除了带来特殊分母,还多带了一个 \(\Phi(T)\)。所以:
右边的 \(n+1\) 和 \(n\),就来自这个额外的 \(\Phi(T)\)。
在当前例子中,它们分别是
和
这也提醒你:“标记一个顶点”对应的是 \(xT'\),不能一般性地把伴随公式中的分母直接解释为标记一个顶点。 两者之间还有 \(\Phi(T)\) 这个因子。
关于伴随公式
1.为什么伴随公式会出现这个分母:一条可以不断延长的路径
记
把分母展开:
这说明:如果某种结构由一条路径构成,每一步贡献 \(x\Phi'(T)\),那么它的生成函数就是 \(D(x)\)。
为什么“一步”会贡献 \(\Phi'(T)\)?
假设
普通树结点有 \(j\) 个孩子时,贡献为
现在让其中一个孩子位置用来延续路径:
- 有 \(j\) 种位置可以选;
- 剩下 \(j-1\) 个位置各挂一棵普通树。
于是这一步贡献
所以这个分母与“选择一个孩子方向继续向下,其他方向挂普通树”有直接联系。
路径末端再接上生成函数为 \(H(T)\) 的结构,就得到
伴随公式恰好负责计算:
下面给出几个具体应用。
2.应用一:有左右孩子位置的二叉树,标记一个空位置
考虑这样的二叉树:每个结点有左、右两个孩子位置,每个位置可以为空,也可以放一棵非空树。
令 \(T\) 统计非空树,\(x\) 统计结点数,则
现在要数:
有 \(n\) 个结点,并且标记了一个空孩子位置的二叉树。还允许空树本身,其唯一空位置被标记。
从根走向这个被标记的空位置,会得到一条路径。路径上的每个结点:
- 选择向左还是向右继续:\(2\) 种;
- 另一个孩子位置为空或挂树:贡献 \(1+T\);
- 当前结点贡献 \(x\)。
所以一步贡献
路径可以有任意长度,因此目标生成函数就是
取伴随公式中的 \(H(t)=1\):
这还能用另一种方式核对:
- 有 \(n\) 个结点的这种二叉树有 \(C_n\) 棵;
- 每棵恰有 \(n+1\) 个空孩子位置。
所以总数为
在这个例子里,分母不是题目直接给出的,而是通过“根到被标记空位置的路径”建立出来的。
3.应用二:有根有序树,标记一个可以插入新叶子的位置
这次回到
如果一个结点有 \(d\) 个有序孩子,那么可以插入一个新叶子的位置有 \(d+1\) 个:最前面、相邻孩子之间、最后面。
我们要数:
一棵有根有序树,并标记一个这样的插入位置。
仍然沿着根走向被标记位置。
路径上的一个结点,在通向目标的方向两边,各有一个任意长的孩子序列,所以一步贡献
到达最后的结点时,标记它的某个插入位置。同样,插入位置两边各是一个孩子序列,因此末端贡献
所以目标生成函数为
(注:这里可以和上一点一样认为最后递归到空节点停止,两种方法只在 \(n = 0\) 时有差距。)
对 \(n\ge1\),先把外面的 \(x\) 提出去,再使用伴随公式:
也可以直接核对。一棵有 \(n\) 个结点的树,其所有插入位置总数是
所以答案应当是
与伴随公式一致。
这个例子展示的是:路径末端并不一定贡献 \(1\),它可以贡献一个额外的 \(H(T)\)。
5.应用三:不限制中途高度的格路,反而比树更容易计算
伴随公式还能把树的隐式生成函数,与“不限制中途高度的步行”联系起来。
取
考虑长度为 \(n\) 的步行,每一步可以:
- 高度减 \(1\);
- 高度不变;
- 高度加 \(1\)。
从高度 \(0\) 出发,要求最后回到 \(0\),中途允许到负高度。
用 \(t\) 记录高度变化,一步的生成式是
因此步行数量为
伴随公式告诉我们,它也等于
还可以把隐式的 \(T\) 消掉。由
以及 \(T(0)=0\),得到
于是
所以这些步行的生成函数是
如何展开右式:
可以用广义二项式展开:\[(1-z)^{-1/2} =\sum_{m\ge0}\frac{\binom{2m}{m}}{4^m}z^m. \]代入 \(z=2x+3x^2\),得到
\[\boxed{ \frac1{\sqrt{1-2x-3x^2}} =\sum_{m\ge0}\frac{\binom{2m}{m}}{4^m}(2x+3x^2)^m. } \]不过这里每一项还含有多个不同次数的 \(x\)。如果想得到更方便提取系数的展开,可以先改写根号里的式子:
\[1-2x-3x^2=(1-x)^2-4x^2. \]因此
\[\begin{aligned} \frac1{\sqrt{1-2x-3x^2}} &=\frac1{1-x} \left(1-\frac{4x^2}{(1-x)^2}\right)^{-1/2}\\ &=\frac1{1-x} \sum_{k\ge0}\frac{\binom{2k}{k}}{4^k} \left(\frac{4x^2}{(1-x)^2}\right)^k\\ &=\sum_{k\ge0}\binom{2k}{k}x^{2k}(1-x)^{-2k-1}. \end{aligned} \]再使用
\[[x^r](1-x)^{-s}=\binom{s+r-1}{r}, \]就有
\[\begin{aligned} [x^n]\frac1{\sqrt{1-2x-3x^2}} &=\sum_{k=0}^{\lfloor n/2\rfloor} \binom{2k}{k} [x^{n-2k}](1-x)^{-2k-1}\\ &=\boxed{ \sum_{k=0}^{\lfloor n/2\rfloor} \binom{2k}{k}\binom{n}{2k} }\\ &=\boxed{ \sum_{k=0}^{\lfloor n/2\rfloor} \frac{n!}{k!^2(n-2k)!} }. \end{aligned} \]
例如 \(n=3\):
- 三步全为平步:\(1\) 种;
- 上、下、平各一步:\(3!=6\) 种。
共 \(7\) 种,也就是
更一般地,若
把第 \(j\) 种步长定义为 \(j-1\),权重为 \(w_j\),那么
正好统计长度为 \(n\)、总高度变化为 \(0\) 的加权步行。因此
也可以作为这类步行的生成函数。
???
你觉得这个分母罕见,是因为它往往藏在结构分解或者代数改写里面。目前可以先记住两个识别方向:
- 有一条被选定的路径,每个结点选一个孩子继续,其他孩子挂普通树:尝试写出 \(x\Phi'(T)\)。
- 系数出现 \([t^n]\Phi(t)^n\),例如平衡步行的计数:可以反过来用伴随公式,把整列系数写成生成函数。
前面映射计数中的 \(1/(1-T)\),则是第三种特别简洁的情况:因为 \(\Phi=e^t\) 满足 \(\Phi'=\Phi\),这个分母刚好直接变成 \(1-x\Phi'(T)\)。
总结
实际做题时,可以按以下顺序识别:
- 先找递归核心。 能否把未知生成函数写成 \(T=x\Phi(T)\)?
- 再看目标表达式。 是 \(H(T)\)、\(H(T)T'\),还是带有 \(1-x\Phi'(T)\) 的分母?
- 最后才展开。 反演之后,通常只剩二项式、多项式或指数函数的系数提取。

浙公网安备 33010602011771号