闲话
我怎么感觉我读了这个论文,还不知道 kernel method 是啥啊。
没人总结这个,可能未来要读一些新东西。
推歌:时间的彼端 by 暗猫の祝福 et al.
1. 第一次出现
在 H. Prodinger 看来,kernel method 发源于 Knuth 的书《计算机程序设计艺术・卷1:基础算法》的习题 2.2.1.-4。之后,该方法在论文 Generating functions for generating trees 中被总结。在此,我们首先重现 Knuth 最初的习题,来引入 kernel method。
模型是这样的:在直角坐标系上,从原点出发,每次可以从 (n,m) 走到 (n+1,m±1),但不能越过 x 轴,即从 (n,0) 只能走到 (n+1,1)。这也叫 Dyck 路。我们的目的是计数从原点出发、到达 (n,m) 的路径。
我们接下来的重点就是 Knuth 所使用的推导方法。不妨建立生成函数 fm(z),其中 [zn]fm(z) 是我们的目标。那么立得如下的递归关系:
fm(z)=zfm−1(z)+zfm+1(z),m≥1fm(z)=1+zf1(z)
随后引入 F(z,x)=∑m≥0fm(z)xm,那么据递推,写出
F(z,x)=zxF(z,x)+zx[F(z,x)−f0(z)−xf1(z)]+f0(z)
化简得到(f0(z)=F(z,0))
F(z,x)=zxF(z,x)−zx[F(z,x)−F(z0)]+1
据此 F(z,x)=zF(z,0)−xzx2−x+z。我们不能朴素地带入 x=0 来解出 F(z,0),因为这只会得到恒等式。但分解分母为 z(x−r1(z))(x−r2(z)),其中
r1,2(z)=1∓√1−4z22z
注意到 x,z→0 时 x−r1(z)∼x−z,故 F(z,x) 的因式 (x−r1(z))−1 在 (0,0) 的邻域内没有幂级数展开式,但 F(z,x) 必然有,故这个“劣”的因式实际上必然不存在,即 x−r1(z) 也是分子的因式。那么将分子视作 f(x),则自然有 f(r1(z))=0,从而得到 zF(z,0)−r1(z)=0,因此约掉共同的 x−r1(z) 得到
F(z,x)=−1z(x−r2(z))=21−2xz+√1−4z2
那么显然地,走到 (2n,0) 的方案数,或 Catalan 数,即
[z2n]F(z,0)=1n+1(2nn)
相似地,到达 (n,m)(显然应有 n≡m(mod2))的方案数为
[xmzn]F(z,x)=[zn+1](2z1+√1−4z2)m+1=m+1n+1[zn−m](1+z2)n+1=m+1n+1(n+1n−m2)
2. Knödel 游走
Knödel 构造了一个简单的装箱问题,其形式可以转化为特殊图上的随机游走。有大小为 1 的箱子,以及随机到来的大小为 kd,k=1,…,d−1 的物品,以及一个在线的、目的是尽可能装满更多箱子的策略。这个问题可以用“状态”来描述,每个状态都编码了某个特定时刻中部分装满的箱子。我们在下面处理了 d=3,4 的情况。更大的 d 会导出十分复杂的情况,我们不处理。
在最简单的版本里,箱子的大小为 1,物品的大小为 13 或 23,两种物品随机到来。有一个人想要在线地装满尽可能多的箱子,这样本质上会剩下一系列装了 23 的箱子,我们会将其减少或增加到 1。这个模型可以自然地被抽象为在一个特殊的无穷图上、从状态 0(下层最左侧的节点)开始的随机游走(又名 Knödel 游走,以纪念其创造者)。上述特殊图是

在这个情况中,会有一个特殊的状态 β(上层的唯一节点),表示一个装了 13 的箱子。
我们的目的是找到一个二元生成函数,其系数编码了在图上游走的步数与随机游走最终到达的状态。从这里,可以得到每个状态未利用的空间:状态 0 为 0,状态 β(一个装了 1/3 的箱子)为 2/3,状态 k(k 个装了 2/3 的箱子)为 k/3。
令 fa(z) 为生成函数,其中 [zn]fa(z) 计数了所有走了 n 步、终止于状态 a(a∈N 或 a=β)的游走路径。图上的边表示了所有可能的转移,走一步在生成函数上表示为乘 z,立得
fk(z)=zfk−1(z)+zfk+1(z),k≥2f1(z)=zf0(z)+zfβ(z)+zf2(z)f0(z)=1+zf1(z)+zfβ(z)fβ(z)=zf0(z)
引入二元生成函数 F(z,x)=∑m≥0fm(z)xm,那么使用 1. 中的 r1,2(z) 的定义有
F(z,x)=zxF(z,x)+zx[F(z,x)−f0(z)]+1+(1+x)zfβ(z)=zxF(z,x)+zx[F(z,x)−F(z,0)]+1+(1+x)z2F(z,0)=z(1−x(1+x)z)F(z,0)−xzx2−x+z=z(1−x(1+x)z)F(z,0)−xz(x−r1(z))(x−r2(z))
同上作代换 x=r1(z) 得到 z(1−r1(z)(1+r1(z))z)F(z,0)−r1(z)=0,故 f0(z)=F(z,0)=r1(z)z(1+z)(1−r1(z)),fβ(z)=zf0(z),进一步有
F(z,x)=r1(z)(1+xzr1(z))z(1+z)(1−r1(z))(1−xr1(z))
从这个式子中得到 ∀k≥1,fk(z)=rk+11(z)z(1−r1(z))。作为检验,化简 fβ(z)+∑m≥0fi(z) 得到 (1−2z)−1,这与其组合意义相符。
要对 m≥1 的情况计算 [znxm]F(z,x),使用另类拉格朗日反演,得到
[zn]rm+11(z)z(1−r1(z))=[zn+1]zm+11−z(1−z2)(1+z2)n=[zn−m](1+z)(1+z2)n=(n⌊n−m2⌋)
由于 (1+z2)n 只有偶数处有值,最后一步讨论了 n−m,n−m−1 的奇偶性。此外,我们也可以对任意的 n,m 计算 F 的系数,繁而不难,从略。
下一个模型包含大小为 1 的箱子,以及随机到来的大小为 14,12,34 的物品。这一次我们能得到两个状态组成的无穷序列,分别表示 i 个装了 34 的箱子,以及 i 个装了 34 的箱子加上一个装了 12 的箱子。相关的图如下:

考虑生成函数:fk(z) 计数了 k 个装了 34 的箱子的状态,gk(z) 计数了 k 个装了 34 的箱子、一个装了 12 的箱子的状态,h(z) 计数了一个装了 14 的箱子的状态。据图立得
f0(z)=1+zf1(z)+zg0(z)+zh(z),g0(z)=zf0(z)+zg1(z)+zh(z),f1(z)=zf0(z)+zf2(z)+zg0(z)+zg1(z)+zh(z),fi(z)=zfi−1(z)+zfi+1(z)+zgi(z),i≥2,gi(z)=zgi−1(z)+zgi+1(z)+zfi(z),i≥1,h(z)=zf0(z)
令 F(z,x)=∑k≥0fk(z)xk,G(z,x)=∑k≥0gk(z)xk,有
F(z,x)=1+zxF(z,x)+zx[F(z,x)−f0(z)]+zG(z,x)+zxg0(z)+z(1+x)h(z)G(z,x)=zF(z,x)+zxG(z,x)+zx[G(z,x)−g0(z)]+zh(z)
生成函数的形式可能可以直接写出。注意到上面两个式子中 F,G 的系数是对应的,那么这里设 A(z,x)=F(z,x)+G(z,x),B(z,x)=F(z,x)−G(z,x),据上得到
A(z,x)=x−z[f0(z)+g0(z)]+zx2g0(z)+z2x(2+x)f0(z)(1−z)x−zx2−zB(z,x)=x−z[f0(z)+g0(z)]+zx2g0(z)+z2x2f0(z)(1+z)x−zx2−z
令 r1,2(z)=1−z∓√1−2z−3z22z 为 (1−z)x−zx2−z=0 的二解,显然 −r1,2(−z) 为 (1+z)x−zx2−z=0 的二解。又,x−r1(z) 和 x+r1(−z) 均需要从分母中约去。分别带入 x=r1(z),x=−r1(−z),我们有
r1(z)−z[f0(z)+g0(z)]+zr21(z)g0(z)+z2r1(z)(2+r1(z))f0(z)=0−r1(−z)−z[f0(z)+g0(z)]+zr21(−z)g0(z)+z2r21(−z)f0(z)=0
解得
f0(z)=r1(z)−r1(−z)+r21(z)r1(−z)+r1(z)r21(−z)z(2−2zr1(z)−(1+z)r21(z)+(1−z)r21(−z)−2zr1(z)r21(−z))g0(z)=r1(z)+r1(−z)−2zr1(z)r1(−z)−zr21(z)r1(−z)−zr1(z)r21(−z)z(2−2zr1(z)−(1+z)r21(z)+(1−z)r21(−z)−2zr1(z)r21(−z))
进一步原则上可以解得 F(z,x),G(z,x) 的表达式,但其实在过于繁琐,不再列出。我们可以用这结果做些事情,例如计算接收 n 件物品后平均浪费的空间。答案的生成函数即
∑k≥0k4fk(z)+∑k≥0(k4+12)gk(z)+34h(z)=14[∂∂x(F(z,x)+G(z,x))]∣∣∣x=1+G(z,1)2+34
符号计算可以生成与其等价的表达式。尽管并不好看,但我们还是可以得到在其主导奇点(dominant singularity)z=13 周围的展开:
√312(1−3z)−3/2+(√324+18)(1−3z)−1+⋯
从中我们可以用生成函数的奇点分析得到平均浪费的空间
Wn=16√3nπ+3+√324+O(n−1/2)
如有需要也可以展开更多项。(在 z=−13 处也有一个奇点,但其只会贡献阶 n−1/2 的项)
3. 卫生纸问题
一个 Knuth 引入的流行主题。考虑两卷卫生纸,分别有 m,n 张,以及随机的使用者们。每个使用者有 p 的概率在更大的卷里撕下一张使用,有 q=1−p 的概率使用更小的卷。我们关注的是当小卷卫生纸用完时,大卷卫生纸还剩下的(平均)张数。令 m 是大卷卫生纸的张数,n 是小卷的。那么令 Mm,n 为期望剩下的张数,递归如下:
Mm,0=mMm,m=Mm,m−1,m≥1Mm,n=pMm−1,n+qMm,n−1,m>n>0
上面的二维状态转移都有一个性质:我们可以将各个状态分割成不同的层,转移是在层间进行的,我们可以对层建立生成函数。在这里,我们可以斜着分层,这启发我们首先定义
f0(z)=∑m≥0Mm,mzm,f1(z)=∑m≥1Mm,m−1zm
显然 f0=f1。进一步的,定义
F(z,x)=∑m≥n≥0Mm,nzmxm−n
那么
F(z,x)=∑m>n>0Mm,nzmxm−n+∑m≥0Mm,0zmxm+∑m≥0Mm,mzm=∑m>n>0[pMm−1,n+qMm,n−1]zmxm−n+zx(1−zx)2+f0(z)=pzx[F(z,x)−∑m≥0Mm,0zmxm]+qx[F(z,x)−xf1(z)−f0(z)]+zx(1−zx)2+f0(z)=(pzx+qx)F(z,x)+zx(1−pzx)(1−zx)2+(1−q−qx)f0(z)
自然得到
F(z,x)=(q−px)f0(z)−zx2(1−pzx)(1−zx)2pzx2−x+q
同样地,令分母为 pz(x−r1(z))(x−r2(z)),其中
r1,2(z)=1∓√1−4pqz2pz
那么同样地,x−r1(z) 必为分子的因式,得到
(q−pr1(z))f0(z)−zr21(z)(1−pzr1(z))(1−zr1(z))2=0
解得
f0(z)=z(q−C(pqz))q(1−z)2,where C(z)=1−√1−4z2
注意 r1(z)=C(pqz)/pz,1/r2(z)=C(pqz)/q。这个例子的渐进分析没看懂,不看了。
?. 总结
虽然原文还有一半,以及五个例子,但我想就此打住,因为上面的例子已经很好地描述了这个方法。
对二元生成函数的处理大致是这样的:通过组合结构推导出一个分式结构,其中分母完全已知,且分子中包含目前无法求得的部分;将分母因式分解,逐个检查因式;由于所求得的函数在 (0,0) 周围可以展开为幂级数,这个点不能是奇点,若分母的一个因式在 (0,0) 处收敛到 0,则其也应当是分子的因式,从而解出分子中无法求得的部分。
好像有点感性,但原论文也没有讲分析相关的原因,或者推广。原论文里所有的例子都是分母关于 x 的度小于等于 2 的情况,那么直接求根公式套上去解决。至于更复杂的情况……留待后续的博客说吧。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2023-02-02 闲话 23.2.2