解析组合 (1) --- 第一原理
"If you can specify it, you can analyze it"
--- "the lasting legacy of Philippe Flajolet"
之前我们关注的多是 specify 的部分 (symbolic method), 现在让我们来看看 analyze 的部分吧.
所以在本系列中, 我们假设读者完全有能力补齐所有 specify 侧的推导 (也即从组合问题得到生成函数), 不过如果没推出来也但听无妨.
免责声明: 本文的内容基于 Philippe Flajolet 和 Robert Sedgewick 的著作 解析组合 (Analytic combinatorics). 但我个人觉得一部分内容的编排风格读起来比较奇怪, 所以我还是按照自己的理解进行讲述, 这也使得这个系列烂尾的可能性更大.
对于给定的数列 \(a_n\), 我们关心的一个重要问题就是确立 \(a_n\) 的主项, 一般来说是一个比较简洁的表达式 \(f(n)\) 使得 \(a_n \sim f(n)\).
考虑幂级数 \(A(x) = \sum_{n=0}^\infty a_n x^n\), 这在一个区间上收敛, 具体来说, 我们会发现这个幂级数的收敛半径可以在一定程度上刻画序列的增长. 考虑
我们知道这个极限 \(1/R\) 等价于如下说法:
- 对任何 \(0 < r < 1/R\), 有无限多项 \(n\) 满足 \(|a_n| > r^n\).
- 对任何 \(r > 1/R\), 只有有限项 \(n\) 使得 \(|a_n| > r^n\).
这直接引出如下推论:
- 对任意 \(|x| < R\), 和式 \(\sum_{n=0}^\infty a_n x^n\) 绝对收敛.
- 对任意 \(|x| > R\), 和式 \(a_n x^n\) 发散, 因此求和还是发散.
此时, 我们说序列具有 指数阶 \(K^n\) (exponential order \(K^n\)), 写作
但是, 如何知道数列的指数阶呢? 我们首先从复分析中汲取基本的力量.
接下来, 我们称一个 \(\mathbb C\) 上的连通开集为 区域 (region), 常用符号 \(\Omega\). 对于一个复值函数 \(f\colon \Omega \to \mathbb C\), 如果它处处可微, 即任意 \(z\in \Omega\) 有 \(f'(z)\) 满足在 \(z\) 附近有 \(f(w) = f(z) + f'(z)(w-z) + o(w-z)\), 我们称这个函数是全纯 (holomorphic) 的. 之所以要专门起个名字, 是因为可微条件在 \(\mathbb C\) 有比 \(\mathbb R\) 上好得多的性质:
Cauchy 积分定理 对于 \(\Omega\) 上的全纯函数 \(f\), 令 \(\gamma\) 是一个简单闭合曲线 (我们姑且理解成分段可微函数 \(\gamma\colon [0, 1]\to \Omega\) 满足 \(\gamma(0)=\gamma(1)\), 其他位置没有交点), 如果 \(\gamma\) 的内部都在 \(\Omega\) 内, 那么有
\[\int_\gamma f(z) dz := \int_0^1 f(\gamma(t))\gamma'(t)dt = 0. \]
我们这里略去证明, 但证明一个稍弱的版本是容易的: 如果沿着实部和虚部得到的导数皆连续, 则可以通过 Green 公式得到这一结果.
进一步地, 我们有
Cauchy 积分公式 在之前条件的基础上, 对于 \(\gamma\) 围成的内部区域一点 \(a\), 如果 \(\gamma\) 是 "逆时针" 的, 我们有
\[f(a) = \frac 1{2\pi i}\int_\gamma \frac{f(z)}{z-a} dz, \]
我们大概勾勒证明: 从 \(\gamma\) 某处引出一条道, 在点 \(a\) 绕一个顺时针的, 半径为 \(\epsilon\) 的圈, 再回到原来的位置, 称这条回路为 \(\gamma_\epsilon\), 这条曲线的内部就将 \(a\) 排除在外, Cauchy 积分定理告诉我们它的积分为 \(0\), 因此有
取 \(\epsilon \to 0\), 我们有此结果.
更进一步地, 我们可以知道全纯函数都是解析的:
如果点 \(a\) 为圆心, 半径为 \(R\) 的闭圆盘在 \(\Omega\) 中, 那么我们有收敛半径至少为 \(R\) 的展开式
\[f(z) = \sum_{n=0}^\infty f_n (z-a)^n, \]其中系数可以通过半径为 \(R\) 的逆时针圆周 \(C\) 计算出
\[f_n = \frac 1{2\pi i} \int_C \frac{f(z)}{(z-a)^{n+1}}dz. \]
证明: 其实只需要考虑
将 \(1/(z-w)\) 展开为
注意此时绝对收敛, 我们可以交换顺序得到
注意, 这其实给出了一个比 "收敛半径至少是 \(R\)" 更强的控制, 而是得到了 \(|f_n| \leq \sup_{|z-a|=R} |f|/R^n\), 也称为 Cauchy 不等式. \(\Box\)
我们需要的最后一个结果是, 全纯函数只要知道了一个稠密集上的信息就足够唯一确定.
如果 \(z_0\in \Omega\) 且有一列点 \(a_n \to z_0\) 满足 \(f(a_n)=0\), 那么 \(f(z)\) 恒为 \(0\).
证明: 设 \(W\) 是满足这样的点构成的点集. 在 \(f(z)\) 附近应该有幂级数展开 \(\sum a_n(z-z_0)^n\), 如果有某一项 \(a_n\neq 0\), 那么 \(f(z) = (a_n+O(z-z_0))(z-z_0)^n\), 这与 \(f(a_n)=0\) 且 \(a_n\to z\) 矛盾. 因此 \(z_0\) 的一个邻域上应该均为 \(0\), \(W\) 是个开集. 显然 \(W\) 闭包上的点也在 \(W\) 中, 所以 \(W\) 在 \(\Omega\) 上即闭又开, 要么是整个 \(\Omega\), 要么是空的. \(\Box\)
由此, 我们才可以确立解析延拓的概念: 如果 \(\Omega\) 上的全纯函数 \(f\) 可以延拓到一个更大的区域 \(\Omega'\) 上, 那么这种延拓方式是唯一的.
于是, 在复平面上, 我们终于能够反方向刻画收敛半径了:
对于收敛半径为 \(R\) 的序列给出的幂级数 \(f(z) = \sum f_n z^n\), 一定在一个模长为 \(R\) 的点的邻域上无法延拓.
证明: 反设每个 \(|z|=R\) 上都有一个开圆盘 \(U_z\) 使得 \(f\) 能延拓在 \(\Omega \cup U_z\) 上, 那么首先这些延拓是无矛盾的: 如果 \(U_z \cap U_{z'}\) 非空, 我们知道交集也是连通的, 且包含某个 \(|w| = R\), 因为它们在 \(U_w\cap U_z\cap U_{z'}\) 上一致, 所以在 \(U_z\cap U_{z'}\) 上一致.
由此, 我们的延拓覆盖了整个半径为 \(R\) 的圆周, 因此在一个更大的半径 \(\rho\) 上有定义, 这给出了 \(f_n\) 的一个更小的指数阶, 矛盾. \(\Box\)
在解析组合这本书中, 称边界上不能延拓的点为 奇点 (singularity).
回顾刚刚的结果, 我们有了所谓的 "第一原理":
系数渐进的第一原理: 函数奇点的位置确定了系数的指数阶.
更确切地说, 由于我们研究的序列常常都是非负的, 此时我们有更精细的结果.
Pringsheim 定理. 如果 \(f(z)\) 的系数皆非负, 且收敛半径为 \(R\), 那么 \(z=R\) 处必为奇点.
证明: 假设可以在一个半径为 \(r\) 的开圆盘上延拓, 不妨设 \(r\leq R\), 我们, 考虑在 \(z_0=R-r/4\) 处展开, 有
由于它被 \(R\) 处半径为 \(r\) 的圆盘包含, 所以这个级数的收敛半径至少是 \(3r/4\), 我们带入 \(z_0 + r/2\), 由于求和全都是正的, 我们可以交换求和次序, 得到它等于
说明有一个更大的收敛半径, 矛盾. \(\Box\)
对于系数非负的情况, 我们也有一个很简单的方法得到一个比 Cauchy 不等式更简单的上界, 即
这被称为 鞍点界 (saddle point bound).
你有可能看不起它, 但是这个粗暴的放缩在很多地方已经相当有用了, 比如 Chernoff bound 本质上也是这个不等式.
例子
阶乘
考虑 \(e^z\) 是 \(1/n!\) 的生成函数, 它在整个 \(\mathbb C\) 上都有定义, 我们称这种为 整 (entire) 函数, 因此它的增长是比任何 \(\epsilon^n\) 都缓慢的, 利用鞍点界, 带入 \(x=n\), 我们有
也即 \(n! \geq (n/e)^n\).
我们知道, 阶乘有 Stirling 逼近
所以这个不等式已经控制得相当接近了.
分拆数
我们知道, 分拆数有生成函数
容易发现它在单位圆盘内部收敛, 所以分拆数的增长速度比任何 \((1+\epsilon)^n\) 都慢.
通过一定的计算, 可以发现
取 \(x = 1-\pi /\sqrt{6n}\), 我们利用鞍点界,
由于 \(f(x) - n\log x \sim \pi \sqrt{\frac {2n} 3}\), 我们有
事实上这里给出的常数已经是正确的了, 精确结果是