首发于数学&算法

迷思:寻找母函数运算的组合意义(一)

本文思路极度混乱。


从一个烂大街的例子开始

错位排列(Derangement)

错位排列的指数型母函数 D(z) = \sum_n d_n\frac{z^n}{n!} 可以绕过递推式进行推导,因为我们知道一个排列是错位排列当且仅当其中每个环长都不为 1,即它是由 \sum_{n\ge 2} \frac{(n-1)!z^n}{n!} = \ln \frac1{1-z} - z 这一基本单位组成的,故:

\begin{align} D(z) &= \exp \left( \ln \frac1{1-z} - z \right) \\ &= \frac{\mathrm{e}^{-z}}{1-z} \end{align}\\

这个会帮我们得到一个一阶递推式 d_n = nd_{n-1} + (-1)^n ,这是可以通过将原式变一下得到的:

\begin{align} D(z)&=\frac{\mathrm{e}^{-z}}{1-z}\\ (1-z)D(z)&=\mathrm{e}^{-z}\\ D(z)&=\mathrm{e}^{-z} + zD(z)\\ d_n&=(-1)^n+nd_{n-1} \end{align}\\

那么我们另一个熟悉的二阶递推式 d_n=(n-1)(d_{n-2}+d_{n-1}) 呢?这可以通过对母函数求导得到。

\begin{align} D'(z) &= \left(\frac{\mathrm{e}^{-z}}{1-z}\right)' \\ &= \frac{z\mathrm{e}^{-z}}{(1-z)^2}\\ &=\frac{z}{1-z}D(z)\\ &=z(D(z)+D'(z))\\ d_{n+1}&=n(d_{n-1}+d_n) \end{align}\\


然而众所周知,一种经典的方法也可以推导出如此递推式:


『考虑 k=p_n 一共有 n-1 种选法,如果 p_k=n ,则有剩余部分的长度为 n-2 的排列的 d_{n-2} 种方案构成,否则则在 p_k \neq n 这一约束条件下计数,等同于把 n 撤去后的 d_{n-1} 种方案,故有 d_n = (n-1)(d_{n-2}+d_{n-1})


另举一例。洛谷 P4931 情侣?给我烧了!(加强版)

本题要解决的核心问题:对于所有的 n \le 10^6 ,算出 有多少个大小为 2n 的排列其中每个 1\le k\le n ,都有 |p_k-p_{n+k}|\neq n。我们不妨记 \mathfrak D_n 是该数。那么适合解决该问题的生成函数可以是这种形式: \sum_n a_n\frac{z^n}{n!^2} ,这是因为两个排列如果保持 1\sim n, n+1\sim2n 各自归并的话,则卷积效果是 c_n = \sum_k \binom{n}{k}^2 a_kb_{n-k} (分别由选位置和选编号贡献)

由此我们可以得到全排列的生成函数是

\begin{align} \sum_n (2n)!\frac{z^n}{n!^2} &= \sum_n \binom{2n}{n}z^n \\ &= \sum_n \binom{-\frac12}{n} (-4)^nz^n\\ &= \frac1{\sqrt{1-4z}} \end{align}\\

所有 |p_k-p_{n+k}|=n 条件全都满足的方案数是 n!2^n ,故生成函数是 \sum_n n!2^n \frac{z^n}{n!^2} = \mathrm{e}^{2z}

每个排列都恰由其满足条件的部分和全都不满足条件的部分组成:

\begin{align} \frac1{\sqrt{1-4z}} &= \mathscr D(z) \cdot \mathrm{e}^{2z}\\ \mathscr D(z) &= \frac{\mathrm{e}^{-2z}}{\sqrt{1-4z}} \end{align}\\

不幸的是这个似乎并不能帮我们推出一个一阶递推式子,但是我们尝试求导,倒是依然可行:

\begin{align} \mathscr D'(z) &= \frac{8z\cdot \mathrm e^{-2z}}{(1-4z)^{3/2}}\\ &= \frac{8z}{1-4z} \mathscr D(z)\\ \mathscr D'(z) &= 4z\mathscr D'(z) + 8z\mathscr D(z)\\ \mathfrak D_{n+1} &= 4n(n+1)\mathfrak D_n + 8n^2(n+1)\mathfrak D_{n - 1} \end{align}\\

不过,通过组合意义依然同样又可以给出一种推导方法,与全错排问题有相似之处:


『考虑 p_{2n} 所对应的和它可能矛盾的另一个数 p_k = p_{2n} \pm n ,这个 k 一共有 2n-2 种选择方法,而 p_{k\pm n} 要么对应的数又到了 p_n ,规约成一个 \mathfrak D_{n-2} ,要么剩余的情况可以规约到 \mathfrak D_{n-1} 。』


总结一下以上两个问题的共性?

有些时候,我们求出某个数列的母函数的封闭形式,并不算把这个问题整个解决。尽管从封闭形式已经可以帮助我们 \Theta(n\log n) 求出前 n 项或者以更短的时间求出第 n 项(两个问题从容斥出发,分别也能得到式子 d_n=\sum_{k} \binom n k(-1)^{n-k} k!\mathfrak D_n = \sum_k \binom n k^2 (-2)^{n-k}(n-k)! (2k)! ),但正如我们看到的,它们的递推关系显得更加朴素。并从纯组合的角度和母函数推导的角度,过程中具有一定的共性。

组合角度:『考虑某个xx位置的选择,接着将对应可能产生矛盾的另一个选择拆成两部分,并且其中一个的规约到更小规模问题的方法需要将条件“等效替代”。』

计算角度:『将母函数的解析式求导,发现得到的函数中有一部分等于原函数,将其替换。』


这其实是可以找到内在逻辑联系的。

对于指母函数 \langle a_n \rangle : G(z)=\sum_n a_n\frac{z^n}{n!} 来说,将 G 求导得到的数列是 \begin{align} \langle a_{n+1} \rangle : G'(z) & = \sum_n a_n \frac{nz^{n-1}}{n!}\\ & = \sum_n a_n\frac{z^{n-1}}{(n-1)!} \\ &= \sum_n a_{n+1}\frac{z^n}{n!} \end{align}\\

所以,我们可以认为对于一个组合类 \mathcal A 以及其指母函数 GG' 可以代表的某个组合类 \mathcal A' 为:将 \mathcal A 中每个元素的某个特定位置删去,作为 \mathcal A' 中元素。对于后面立体中的另一个形式的母函数:

\begin{align} \langle a_{n+1}/(n+1) \rangle : G'(z) & = \sum_n a_n \frac{nz^{n-1}}{n!^2}\\ & = \sum_n a_n\frac{z^{n-1}}{(n-1)!^2n} \\ &= \sum_n a_{n+1}/(n+1)\frac{z^n}{n!} \end{align}\\

可以认为是选定了位置,却不能确定编号。

所以一个组合类的指母函数如果满足某个形如 G'(z)=E(z)G(z) 的形式,就可以从它的代数形式反向给我们启发可能有何组合上的结构。

另一个方向上,考虑到这其实就是 \frac{G'}G = (\ln G)' 对于对数我们其实比较熟悉其组合意义了:

G = \exp E = \sum_n \frac{E^n}{n!} ,在指母函数上这其实是说 E 是组成了 G 的“基本单位”。因此逆运算 E = \ln G 就是将 G 的内在结构进行了拆解。

因此,直觉上看,如果这个组合类可以通过这种方式计数,则其基本结构也对应得比较“简单”。

发布于 2019-01-16 13:10