我正在看的是 JohnBaez 和 Greg Egan的博客。John Baez是一位在科普方面非常高产的数学家,写过不计其数的科普文章。读他的文章非常让人享受:他很喜欢从直观的例子入手,一步步启发读者,展开到更高级的数学。尤其是他行文的风格,字里行间都洋溢着他对所讨论的数学对象的喜爱。GregEgan是澳大利亚的一位非常高产的科幻小说作家,有不少作品已经被国内引入。他的小说属于硬科幻风格,而且是非常硬的那种。他的博客文章同样精彩!不过与 John Baez 不同的是,Greg Egan的文章不太会去兼顾不同水平的读者,对我来说,要看懂他在说什么经常不是一件容易的事情。
John Baez 博客上有一个系列 Rollingcircles and balls 讨论了圆的外摆线和焦散,Greg Egan 也有一篇 文章更深入的讨论了曲线的焦散。这个话题非常有意思,我也一时手痒写了代码实验了一番并记录在此。
有个有趣的物理现象,当光线照在咖啡杯的内壁上时,光线反射以后会形成一个亮斑,术语叫做焦散(caustic)。
形成焦散的原因是,光线在杯子内壁反射以后,光子的分布是不均匀的,某些区域经过的光子特别密集,所以亮度就更高。
焦散是一条曲线,它和所有的反射光线相切,即它是所有反射光线的包络(envelope)。焦散的具体形状和杯子的形状、光源的位置都有关。假设杯子是圆形的,则当光源是一个点光源且恰好位于杯子边缘上某一点时,得到的焦散叫做心脏线(cardioid)。当光源位于无穷远时(可以视作平行光源),得到的焦散是 肾形线(nephroid)。一般情况下焦散的形状介于心脏线和肾形线之间。
更有意思的是,如果杯子的外形是心脏线,而且光源正好位于心脏线的尖点时,得到的焦散正好是肾形线。我写了一个POV-Ray脚本,模拟了这一现象:
圆形杯子给出心脏线 | 心脏线杯子给出肾形线 |
值得注意的是,心脏线和肾形线都是所谓的 外摆线,只是两圆的半径之比不同:
心脏线 | 肾形线 |
所以我们很容易作出如下的猜想:如果在肾形线的内部或者尖点放一个光源,是不是又会得到下一个外摆线?然而根据Greg Egan 在他博客中的实验,这个应该是不成立的。
理论上这个 POV-Ray 脚本可以渲染任意的参数曲线反射的效果,但是 POV-Ray渲染 parametric surface + radiosity非常慢,所以如果你想试一试的话,最好还是用 POV-Ray 原生的 CSG来构造镜面曲线。
这一节我们来介绍怎样计算一般的参数曲线 \(\mathbf{c}(t)=(x(t),y(t))\)的焦散曲线。
设点光源的位置是 \((a,b)\),则在曲线上的一点 \((x,y)\) 处,入射光线的方向是 \[\mathbf{l}=(x-a,y-b).\] 不需要把 \(\mathbf{l}\)单位化,因为我们列方程的时候只需要光线的方向,并不在乎长度。
同样是在 \((x,y)\)处,曲线的法向量是 \[\mathbf{n}=\frac{(-y',x')}{\sqrt{(x')^2+(y')^2}}=\frac{(-y',x')}{|\mathbf{r}'|}.\] 这里我们用 \(x',y'\) 表示 \(x,y\) 关于 \(t\) 的导数。
于是 \((x,y)\) 处的反射光线的方向\(\mathbf{r}\) 由如下反射公式给出:\[\mathbf{r}= \mathbf{l}- 2(\mathbf{l}\cdot\mathbf{n})\mathbf{n}.\] 设 \((X,Y)\) 是反射光线上的任一点,由于 \((x,y)\) 是反射光线的起点,所以 \((X-x,Y-y)\) 与 \(\mathbf{r}\) 平行。记 \(\mathbf{r}=(r_x,r_y)\),则 \((X-x,Y-y)\) 与 \((-r_y, r_x)\) 垂直,即 \[(X-x, Y-y)\cdot(-r_y, r_x)=0.\] 记 \[F(X,Y,t)=(X-x, Y-y)\cdot(-r_y, r_x),\]则我们得到了反射光线 \((X(t), Y(t))\)满足的曲线族方程 \(F(X,Y,t)=0\)。于是焦散曲线可以通过联立方程组\[\begin{align*}F(X,Y,t)=0,\\\frac{\partialF}{\partial t}F(X,Y,t)=0.\end{align*}\] 也就是 \[\begin{align*}(X-x, Y-y)\cdot(-r_y,r_x)&=0,\\-(x',y')\cdot(-r_y, r_x) +(X-x,Y-y)\cdot(-r_y', r_x') &=0.\end{align*}\]然后解出 \(X,Y\) 得到。
如果你还记得 2x2矩阵的逆公式的话,这个方程组其实可以目视写出解来。我们把它写成
\[\begin{pmatrix}-r_y & r_x\\-r_y'&r_x'\end{pmatrix}\cdot\begin{pmatrix}X-x\\Y-y\end{pmatrix}=\begin{pmatrix}0\\r_xy'-r_yx'\end{pmatrix}.\] 于是 \[\begin{align*}\begin{pmatrix}X-x\\Y-y\end{pmatrix}&=\begin{pmatrix}-r_y& r_x\\ -r_y'&r_x'\end{pmatrix}^{-1}\begin{pmatrix}0\\r_xy'- r_yx'\end{pmatrix}\\&=\frac{1}{r_xr_y'-r_yr_x'}\begin{pmatrix}r_x' &-r_x\\ r_y'&-r_y\end{pmatrix}\begin{pmatrix}0\\r_xy'-r_yx'\end{pmatrix}\\&=\frac{r_xy'-r_yx'}{r_yr_x'-r_xr_y'}\begin{pmatrix}r_x\\r_y\end{pmatrix}.\end{align*}\] 即 \[\begin{pmatrix}X\\Y\end{pmatrix}=\begin{pmatrix}x\\y\end{pmatrix} +\frac{r_xy'-r_yx'}{r_yr_x'-r_xr_y'}\begin{pmatrix}r_x\\r_y\end{pmatrix}.\]
按照上面的理论,我写了一个小脚本,用 sympy
(version=1.12) 来计算圆的焦散线。其中圆的中心在原点,半径为 1,光源在\((1,0)\) 处。
1 |
|
sympy
给出的结果是:
1 |
|
这正是喜闻乐见的心脏线的参数表示: \[\left\{\begin{align*}x(t)&=\frac{\cos(2t) +2\cos(t)}{3},\\ y(t)&=\frac{\sin(2t) +2\sin(t)}{3}.\end{align*}\right.\]
使用这个参数表示,我们继续计算当光源放在心脏线的尖点,即 \(t=\pi\) 对应的点 \((-\frac{1}{3},0)\) 时得到的焦散:
1 |
|
sympy
很快算出了正确的结果:
1 |
|
不难验证
\[\begin{align*}\frac{\sin(t)\sin(2t) +\cos(t)}{3}&=\frac{3\cos(t) - \cos(3t)}{6},\\ \frac{-\sin(t)\cos(2t)+ \sin(t)}{3}&=\frac{3\sin(t) -\sin(3t)}{6}.\end{align*}\]
这正是 维基百科在肾形线的参数方程中取 \(a=1/6\)的表示。
把上面的曲线画出来是这样的:
很多时候曲线的方程是通过隐函数 \(P(x,y)=0\) 的形式给出的,其中 \(P(x,y)\) 是关于两个变元 \(x,y\)的多项式。这样的曲线叫做平面代数曲线。这时求解焦散要用到 Gröbner基的工具。
让我们回到参数方程的情形,我们已经看到,这时焦散 \((X,Y)\) 有显示解
\[\begin{pmatrix}X\\Y\end{pmatrix}=\begin{pmatrix}x\\y\end{pmatrix} +\frac{r_xy'-r_yx'}{r_yr_x'-r_xr_y'}\begin{pmatrix}r_x\\r_y\end{pmatrix}.\]
其中 \(x,y,r_x,r_y\) 都是关于 \(t\)的函数,它们的导数也是可计算的,所以可以算出 \((X,Y)\) 来。
但是在隐函数的情形,我们没有 \(x,y\)的某种关于 \(t\)的表达式。不过没关系,我们先假设有这样的参数表达式,看看能得到什么结论。设\(x=x(t),y=y(t)\) 是某个参变元 \(t\) 的函数,在 \(P(x,y)=0\) 两边对 \(t\) 求导可得 \[\frac{\partial P}{\partial t}=\frac{\partialP}{\partial x}x'(t) + \frac{\partial P}{\partialy}y'(t)=0.\] 记 \(k=-\frac{\partialP}{\partial x}/\frac{\partial P}{\partial y}\),则 \(y'(t)=kx'(t)\)。
对反射光线 \(\mathbf{r}\) 的两个分量\(r_x,r_y\) 也分别使用链式求导,我们有\[\begin{align*}\frac{\partial r_x}{\partialt}&=\frac{\partial r_x}{\partial x}x'(t) + \frac{\partialr_x}{\partial y}y'(t),\\\frac{\partial r_y}{\partial t}&=\frac{\partial r_y}{\partialx}x'(t) + \frac{\partial r_y}{\partialy}y'(t).\end{align*}\] 于是我们发现比值 \[\begin{align*}\frac{r_xy'-r_yx'}{r_yr_x'-r_xr_y'}&=\frac{r_xk-r_y}{r_y(\frac{\partialr_x}{\partial x}+\frac{\partial r_x}{\partial y}k)-r_x(\frac{\partialr_y}{\partial x} + \frac{\partial r_y}{\partial y}k)}\\&=-\frac{r_x\frac{\partial P}{\partial x}+r_y\frac{\partialP}{\partial y}}{r_y(\frac{\partial r_x}{\partial x}\frac{\partialP}{\partial y}-\frac{\partial r_x}{\partial y}\frac{\partial P}{\partialx})-r_x(\frac{\partial r_y}{\partial x}\frac{\partial P}{\partial y} -\frac{\partial r_y}{\partial y}\frac{\partial P}{\partialx})}.\end{align*}\] 变成了一个不需要显式用到 \(t\) 的量,即变量 \(t\) “消掉”了。代入上面焦散的表达式中,我们得到 \[\begin{pmatrix}X\\Y\end{pmatrix}=\begin{pmatrix}x\\y\end{pmatrix}-\frac{r_x\frac{\partialP}{\partial x}+r_y\frac{\partial P}{\partial y}}{r_y(\frac{\partialr_x}{\partial x}\frac{\partial P}{\partial y}-\frac{\partialr_x}{\partial y}\frac{\partial P}{\partial x})-r_x(\frac{\partialr_y}{\partial x}\frac{\partial P}{\partial y} - \frac{\partialr_y}{\partial y}\frac{\partial P}{\partial x})}\begin{pmatrix}r_x\\r_y\end{pmatrix}.\] 这个式子还可以再简化一点:注意到曲线在 \((x,y)\) 处的法向量由 \(\mathbf{n}=\frac{\nabla P}{|\nabla P|}\)给出,其中 \(\nabla P=(\frac{\partialP}{\partial x},\frac{\partial P}{\partial y})\)。于是由 \[\mathbf{r}= \mathbf{l}- 2(\mathbf{l}\cdot\mathbf{n})\mathbf{n}\] 可得 \[\mathbf{r}\cdot \nabla P=-\mathbf{l}\cdot \nablaP.\] 从而 \[\begin{pmatrix}X\\Y\end{pmatrix}=\begin{pmatrix}x\\y\end{pmatrix}+\frac{\mathbf{l}\cdot\nablaP}{r_y(\frac{\partial r_x}{\partial x}\frac{\partial P}{\partialy}-\frac{\partial r_x}{\partial y}\frac{\partial P}{\partialx})-r_x(\frac{\partial r_y}{\partial x}\frac{\partial P}{\partial y} -\frac{\partial r_y}{\partial y}\frac{\partial P}{\partialx})}\begin{pmatrix}r_x\\ r_y\end{pmatrix}.\]
这是四个变量 \(x,y,X,Y\)满足的两个方程,形如 \(F(X,x,y)=0\) 和\(G(Y,x,y)=0\)。记住我们还有已知的方程\(P(x,y)=0\)。为了从这三个方程中消掉\(x,y\),得到一个仅包含 \((X,Y)\) 的表达式,我们可以尝试用 Gröbnerbasis 方法。Gröbner 基方法会把多项式方程组 \[F=G=P=0\] 转化为一组等价的新方程组 \[g_1=g_2=\cdots=g_m=0.\]即它们有完全相同的解集。
\(\{g_1,\ldots,g_m\}\) 是 \(F,G,P\) 在 4 个变元的多项式环 \(\mathbb{R}[x,y,X,Y]\) 中生成的理想 \(I=\langle F,G,P\rangle\)的一组生成元,\(\{g_1,\ldots,g_m\}\)叫做 \(I\) 的约化的 Gröbner基。在字典序 \(x\succ y\succ X\succ Y\)下,约化的 Gröbner 基会有一个好的属性,即从 \(g_1\) 变化到 \(g_m\) 时,多项式中的变元会按照从 \(x\to y\to X\to Y\)的先后顺序被消除掉。注意这是个不太严格的说法,我们并不是总能消掉顺序靠前的变元,但是如果消除发生的话,它就会按照这个顺序来。这样我们就可以执行类似高斯消元法中的“回代”操作。从而新的方程组求解会比原方程组更加简单。
我们来用 sympy
实验一下:
1 |
|
sympy
给出的结果的最后一项是
\[27 X^{4} y^{2} + 54 X^{2} Y^{2} y^{2} -18 X^{2} y^{2} - 8 X y^{2} + 27 Y^{4} y^{2} - 18 Y^{2} y^{2} -y^{2}.\]
\(x\) 被消掉了!原方程组 \(F=G=P\)的解必然是上面这个方程的解的子集。观察它的每一项都带有一个 \(y^2\),这显然不是我们要的解。把 \(y^2\) 去掉,剩下的因子
\[27X^{4}+54X^{2}Y^{2}-18X^{2} -8X +27Y^{4}-18Y^{2}-1=0.\]
就是心脏线的隐函数表示。不信?在 Desmos里面画出来看看!
这篇文章主要覆盖了 Greg Egan博文的前半部分,他的后半部分内容我觉得有点放飞自我,也没怎么仔细看。
虽然我们用 sympy
的实验很成功,但注意并不是所有情况下都能得到焦散曲线(比如光源位于抛物线的焦点时,反射光线都是平行的),而且对复杂的曲线sympy
算起来非常慢。
我研究生的时候上过计算机代数的课程,当时用的教学软件是 Maple。Maple编程是很不方便的,所以我其实没有多少计算机代数的编程经验。我之前一直觉得sympy
运行又慢,输出的表达式也不够简化,所以不太愿意用它。这次实验有点刷新我对sympy
的认知。我还记得当时课程要求每人提交一份读书报告,我写的是 Ideals,Varieties, and Algorithms 的笔记,但毕业多年以来这还是我第一次用到Gröbner 基!
我写这篇文章的时候正好临近情人节,所以我在想有没有什么曲线的焦散能给出爱心曲线:
于是我找到了 这篇文章。不过看起来里面给出的结论计算量很大,很难用在爱心线上(也许是我错了)。
另一个发散思考的角度是,如果这个咖啡杯是放在 Poincaré双曲圆盘里面,它的焦散是怎么样的。这个时候光走的是双曲空间中的测地线(与单位圆正交的圆弧),所以看起来有点难办。但是如果我们先从Beltrami-Klein模型入手(测地线是直线),就会发现一切和我们上面的分析是一样的。所以Poincaré 圆盘里的真实焦散和我们上面计算的焦散只差一个从 Beltrami-Klein模型到 Poincaré 模型的变换。
]]>这个动画的名字叫做 Möbius transformation revealed,想法源自 DouglasN. Arnold 和 Jonathan Rogness 于 2007 年发布的 同名视频。这是一个很有名的视频,它表达的核心思想是,扩充复平面\(\overline{\mathbb{C}}\) 上的 Möbius变换可以由球在三维空间中的刚体运动给出:
整个过程如下图所示:
\[\underbrace{\overline{\mathbb{C}}\xrightarrow{\text{inversestereographic projection}}S\text{\scriptsize(admissible)}\xrightarrow{\text{rigid motion}}T(S)\text{\scriptsize(admissible)} \xrightarrow{\text{stereographicprojection}}\overline{\mathbb{C}}}_{\text{Möbiustransformation}}.\]
球极投影使用的北极点始终是球面的最高点。
详细的解释可以见原视频的解释 文章。但是从直观上理解也不难:
\(S\) 在 \(xy\) 平面内的平移给出的是 \(\overline{\mathbb{C}}\) 上的平移。
\(S\) 在 \(z\) 方向上的平移给出的是 \(\overline{\mathbb{C}}\) 上的缩放。
保持 \(S\)的北极点不动的旋转给出的是 \(\overline{\mathbb{C}}\) 上的旋转。
绕 \(x\) 轴旋转 180 度给出的是\(\overline{\mathbb{C}}\) 上的逆变换\(z\to 1/z\)。
以上几种运动方式的复合可以给出可容许球的任何刚体运动,而任何 Möbius变换都是平移、缩放、旋转、逆变换的复合,所以 Möbius变换确实与可容许球体的刚体运动是对应的。
反过来对给定的 Möbius 变换 \(M\)和容许的球 \(S\),当 \(S\) 的初始位置确定以后,给出 \(M\) 的刚体运动 \(T\) 也是唯一确定的。证明见 这个论文。
]]>这两种方法分别对应在 \(M\)作用下保持不变的两个圆族。
本文的插图使用 matplotlib绘制,代码在 Github上。
记号约定:
- \(\mathbb{H}\) 为二维 Poincaré双曲圆盘。
- \(M\) 为一个 Möbius 变换。
- \(S^1\) 为单位圆周 \(|z|=1\)。
在复分析课程中,我们学过 \(\mathbb{H}\) 的保持定向的等距同构是 Möbius群的一个子群,其元素具有如下的表示形式: \[M(z) = \mathrm{e}^{i\theta}\frac{z -a}{1-\overline{a}z},\quad \theta\in\mathbb{R},\, |a|<1.\] 可见\(M\) 的迹 \(\mathrm{tr}(M)=\mathrm{e}^{i\theta}+1\)总是满足 \(0\leq|\mathrm{tr}(M)|\leq2\),所以 \(M\) 不可能是斜航型的 (loxodromic),从而\(\mathbb{H}\)的保持等向的等距只能是椭圆、抛物、双曲三种。
这一点也可以从圆族上看出来:\(\mathbb{H}\) 的任何等距变换必然保持 \(S^1\)不变,但斜航型的变换没有不变圆,所以不可能是 \(\mathbb{H}\) 上的等距变换。
下面分别介绍这三种情形。
椭圆型变换共轭于复平面上的旋转 \(z\to\mathrm{e}^{i\theta}z\),它们总是有两个不动点。如果\(M\) 是 \(\mathbb{H}\) 上的椭圆型等距,则其两个不动点\(p_1,\,p_2\)必然一个在单位圆内,一个在单位圆外,且它们关于单位圆互为反演点。设 \(p_1\) 位于单位圆内,则 \(M\) 在 \(\mathbb{H}\) 上的作用是一个绕着 \(p_1\) 的旋转:
图中画出了两族圆:
双曲空间中的圆也是欧式空间中的圆,但是它们的圆心未必重合。一个 \(\mathbb{H}\)中的圆越靠近边界,它的双曲度量下的圆心也会被“吸引”到靠近边界的位置。
抛物型变换共轭于复平面上的平移 \(z\toz+1\),它们总是只有一个不动点。如果 \(M\) 是 \(\mathbb{H}\)上的抛物型等距,则其唯一的不动点 \(p\)必然位于单位圆周 \(S^1\) 上,\(M\) 在 \(\mathbb{H}\)上的作用是一个双曲空间中的平移:
图中也画出了两族圆:
双曲型变换共轭于复平面上的缩放 \(z\tocz,\,c\in\mathbb{R}^+\),它们总是有两个不动点。如果 \(M\) 是 \(\mathbb{H}\) 上的双曲型等距,则其两个不动点\(p_1,p_2\) 必然都位于单位圆周 \(S^1\) 上。\(M\) 在 \(\mathbb{H}\)上的作用以其中一个为源点,另一个为汇点:
图中的两族圆中,
在上面的三张图中,彩色的圆对应的是 \(\mathbb{H}\) 中的点在 \(M\)作用下的轨迹,它们都是测地线。我似乎有意冷落了虚线的圆族,把它们画的很不起眼。其实通过它们的反演变换也可以给出\(M\) 的构造:
椭圆型 | 抛物型 | 双曲型 |
放到上半空间模型中,这些就都不难理解了:
]]>注:为什么两个圆的反演变换的复合是一个 Möbius变换?对一个圆 \(C\),你可以用一个Möbius 变换 \(T\) 将 \(C\) 变为实直线 \(\mathbb{R}^1\),关于 \(\mathbb{R}^1\) 的反演就是复共轭 \(\mathrm{conj}(z)=\overline{z}\),所以关于\(C\) 的反演为 \(S=T^{-1}\cdot\mathrm{conj}\cdot T\),从而\(S\) 形如 \[S(z) = \frac{a\overline{z} +b}{c\overline{z}+d},\quada,b,c,d\in\mathbb{C},\,z\in\mathbb{C}_{\infty}.\]里面包含了复共轭,所以 \(S\) 不是一个Möbius 变换,但两个反演变换的复合就是 Möbius 变换。
这个作品的大致原理是:
YouTube 上有个博主手把手地展示了怎样从头 DIY 一个这样的模型:视频地址。我表示这顿操作虽然看着不算难,但对我这种懒人来说还是有点过于折腾了。
不过没关系,咱可以编程实现呀。我写了一个 shadertoy 演示:
这个动画支持除了 snub 和 antiprism之外各种类型的均匀凸多面体及其对偶。下面的动画演示的是菱形十二面体 (rhombicdodecahedron),它有个独特之处是自身在镜子反射下成的像可以密铺整个空间(space filling)。
石榴籽的形状就近似于菱形十二面体,这使得它们可以紧紧的挨在一起构成密铺的结构:
这种可以密铺整个空间的多面体非常少,正方体当然是其中之一,但是其它的正多面体(正四面体、正八面体、正十二面体、正二十面体) 都不行。
值得注意的是,身处多面体内部和外部的观察者,看到的景象可能是不同的。
例如上面的菱形十二面体从内部看起来,有些胞腔从中间被劈开了:
甚至即便只从外部观察,从不同类型的镜面看到的景象也是不同的。例如截顶的正方体,从八边形的镜面看进去,内部是密铺了整个空间的:
但是如果从三角形的面往里看,会发现镜子中的四面体由近到远方向是交错改变的:
请你思考一下,这些背后的原因是什么?
]]>一个人和他的狗在公园里绕着一棵树散步,人和狗各自走的路径都是闭曲线,即经过一段时间后都会回到起点。如果人把狗绳抓的紧一些,使得整个过程中狗无法接触到树,则结束后人和狗绕着树走的圈数是一样的,这就是下面这个动画演示的:(树的位置是原点,用一个表盘标记)
对应的数学结论是:两条闭曲线 \(\gamma_1,\gamma_2\) 如果都不经过原点,且\(\gamma_1\)可以在不碰触到原点的前提下通过连续的形变变为 \(\gamma_2\)(同伦),则 \(\gamma_1,\gamma_2\)关于原点的环绕数相等。
注意这个结论只要求 \(\gamma_1,\gamma_2:\,[0,1]\to\mathbb{R}^2\)是两条连续曲线,并不涉及解析性。因为环绕数和同伦的概念都只要求连续性。
当 \(\gamma_1=f(S^1),\gamma_2=g(S^1)\)分别是单位圆 \(S^1:\{z\in\mathbb{C}:|z|=1\}\)在两个解析函数 \(f,g\) 下的像时,幅角原理告诉我们 \(\gamma_1,\gamma_2\)关于原点的环绕数分别等于 \(f,g\) 在\(S^1\) 内部的零点个数。进一步 Rouché定理 告诉我们,如果对任何 \(z\inS^1\) 都有 \(|f(z)|>|f(z)-g(z)|\) 成立,即可保证\(\gamma_1,\gamma_2\)关于原点有相同的环绕数,从而 \(f,g\) 在\(S^1\)内部的零点个数也是相同的。Rouché 定理的条件其实就是,假设人的位置是\(f(z)\),狗的位置是 \(g(z)\),绳子 \(l(z)=f(z)-g(z)\) 的长度 \(|l(z)|\) 始终小于人到原点的距离 \(|f(z)|\),就可以保证狗始终够不到原点。
动画中左下角的圆周是 \(S^1\),动画右边红、绿两条路径分别是 \(f(S^1)\) 和 \(g(S^1)\)。这里的 \(f\) 我取的形如 \[f(z)=\frac{z-a}{1-\overline{a}z}\frac{z-b}{1-\overline{b}z}\frac{z-c}{1-\overline{c}z}(z-2-2i),\quad |a|,|b|,|c|<1.\] \(f(z)\) 在 \(S^1\) 的内部有 3 个根(我用红点标出来了),在 \(S^1\) 上不为0,在 \(S^1\)外部有一个根(图中没有画)。\(f(z)\)的前三个因子构成一个 Blaschke 乘积,它把 \(S^1\) 的内部仍然映射为内部,把 \(S^1\) 仍然映射为 \(S^1\),于是对任何 \(z\in S^1\) 有 \[|f(z)| = |z - 2 - 2i| \geq 2\sqrt{2} - 1,\quadz\in S^1.\] 所以只要绳子 \(l(z)\) 满足 \(|l(S^1)| < 2\sqrt{2}-1\),则狗走的路径\(g(S^1)=f(S^1)+l(S^1)\)就不可能接触到原点。我这里取了 \(l(z) =cz\),其中 \(c\) 是一个小于\(2\sqrt{2}-1\) 的正实数。
Needham 的书中还介绍了曲线 \(\gamma\) 的环绕数在 \(\mathbb{C}\setminus\gamma\)的每个连通分支上都是常数。对不在 \(\gamma\) 上的一点 \(z\),我们可以稍稍移动 \(z\) 到另一个点 \(z'\),只要保持 \(z'\) 仍然位于 \(z\) 所在的连通分支内,则 \(\gamma\) 关于 \(z\) 和 \(z'\)有相同的环绕数。利用这个事实并结合幅角原理不难得出下面的结论:
推论:设 \(\gamma\)是一条简单闭曲线,内部围的区域为 \(\Omega\),\(f(z)\) 是一个非常数的解析函数,\(f\) 在包含 \(\gamma\)的某个区域内解析。假设有两棵树分别位于 \(w_0,\,w_1\) 两点,且人行走的路线 \(f(\gamma)\) 到 \(w_0\) 的距离始终大于两棵树之间的距离:即\(|f(z)-w_0| > |w_0-w_1|\) 对 \(z\in\gamma\) 恒成立,则 \(f(\gamma)\) 关于 \(w_0,w_1\) 的环绕数相等,从而 \(w_0,w_1\) 在 \(\gamma\) 内部的原像个数相同: \[\sharp\{z\in \Omega: f(z)=w_0\} = \sharp\{z\in\Omega: f(z)=w_1\}.\]
这是因为根据条件,从 \(w_0\)沿着线段 \([w_0,w_1]\) 移动到 \(w_1\) 的过程中始终不会碰触到曲线 \(f(\gamma)\),所以 \(w_0,w_1\) 必然位于同一连通分支内。
利用此推论我们不难得出复分析中的 开映射定理:
定理:如果 \(U\subseteq\mathbb{C}\) 是开集,\(f:U\to\mathbb{C}\) 是非常数的解析函数,则\(f(U)\) 也是开集。
我把这个证明留给你(欢迎在评论区写出你的答案)。
]]>这本书启发所作:
这个动画看起来似乎一目了然:我们有一个圆 \(C\),一个椭圆 \(E\),还有一个三角形 \(\Delta\)。\(\Delta\) 内接于圆 \(C\) 同时外切于椭圆 \(E\)。椭圆和三角形同时都在变动,但它们始终保持内切的关系。
但我打包票保证你绝难猜到它说的是什么事情。
下面是动画的制作过程:
动画中我取了 \(a\) 为原点,\(b\in(0,1)\)为实数。采用这两个特殊点的原因是,一般情形下用 Mathematica求解得到的三次方程 \(B(z)=\lambda\)的表达式实在是太太太让人头大了。😁
正如开头书名所提示的,这个故事同时与 Poncelet 定理和 Blaschke乘积有关。
假设有两个椭圆 \(E_1,\,E_2\),\(E_2\) 位于 \(E_1\) 的内部。在 \(E_1\) 上选定一点 \(A_1\),从 \(A_1\) 出发作 \(E_2\) 的切线与 \(E_1\) 交于 \(A_2\),然后从 \(A_2\) 出发引另一条关于 \(E_2\) 的切线交 \(E_1\) 于 \(A_3\),...,如此一直进行下去。则有两种可能:
下面的动画显示了 \(N=3\)的情形,并且外面的椭圆 \(E_1\) 是个圆1:
Poncelet 定理说的是,如果情形 1 对 \(E_1\) 上的某个点 \(A_1\) 成立,则它对 \(E_1\)上所有点都成立,并且所有得到的多边形都是 \(N\) 边形。同样地如果情形 2对某个点成立,则对椭圆上所有点 \(A_1\),序列 \(\{A_n\}_{n=1}^\infty\)也都互不相同,并且在边界 \(E_1\)上是稠密的。
可以料见,“作 \(N\)次切线后回到起点”这种好事不是那么容易发生的。\(E_1,E_2\) 必须满足一些条件才行。对一般的\(N\) 这个条件可以用 Jacobi椭圆函数来描述,有点高深。不过在 \(N=3\) 且 \(E_1\)为单位圆时,这个条件是非常简单的:这当且仅当椭圆 \(E_2\) 形如 \[|z-a| + |z-b|=|1-\overline{a}b|,\quad|a|<1,\,|b|<1.\] 不仅如此,从单位圆上任意一点 \(A\) 出发,按照上述方法连续作 \(E_2\)的切线,得到的闭合三角形的另外两个顶点是方程 \(B(z)=B(A)\) 的另外两个根。
这个故事还与矩阵的 numeric range(数值域) 有关,我不想假装成我很懂的样子,所以就不再叨叨了。
]]>这个动画的含义如下:
在复平面上三角形 \(\Delta ABC\)的三个顶点处各自放置一个单位正电荷,则平面上电场强度为 0的点有两个(这两个点可能重合),它们位于 \(\Delta ABC\) 的内部,并且是三次复多项式\(P(z) = (z-A)(z-B)(z-C)\) 的导数 \(P'(z)\) 的零点。
不仅如此,这两个零点还是一个内切于 \(\Delta ABC\)的椭圆的两个焦点,此椭圆是所有内切于 \(\DeltaABC\) 的椭圆中面积最大者,并且其与 \(\Delta ABC\)的三边的切点均为各边中点。这个椭圆叫做 Steiner内切椭圆。
这个动画是受几天前 Albert Chern 的 一篇推文启发所作,John Baez 也写了一篇关于这个话题的 文章。我是由此才了解到Marden 定理还有如此有趣的物理学解释,的确大开眼界!
在平面上不全共线的 \(n\) 个点 \(a_1,\ldots,a_n\)处放置若干单位正电荷,这规定了一个平面上的电势函数 \(V(z)\) (标量) 和一个电场 \(\mathbf{E}(z)\)(二维向量场)。电学知识告诉我们,在忽略物理常数意义下有 \[V(z)=\sum_{i=1}^n\ln|z-a_i|=\ln\prod_{i=1}^n|z-a_i|=\ln|P(z)|.\] 其中\(P(z)=(z-a_1)(z-a_2)\cdots(z-a_n)\)是以 \(a_1,\ldots,a_n\)为根的多项式。
此外 \(\mathbf{E}(z) = -\nablaV(z)\) 为电势的梯度向量取负。
问题:怎样确定平面上场强为 0 的点呢?
场强为 0的点也叫做平衡点、鞍点,因为在这一点处的电荷不受电场的库仑力。
答案有点出人意料:平衡点必然是 \(P'(z)\) 的零点,而且这些点都属于 \(a_1,\ldots,a_n\) 的凸包!
注意 \(V(z)\) 是 \(\ln P(z) = \ln |P(z)| + i\arg{P(z)}\)的实部,由 Cauchy-Riemann 方程不难看出使得亚纯函数实部梯度为 0的点一定是其导数的零点,即满足 \(\nablaV=0\) 的点都是 \((\lnP(z))'=P'(z)/P(z)\) 的零点,所以平衡点都是 \(P'(z)\) 的零点。平衡点属于 \(\{a_1,\ldots,a_n\}\) 的凸包是根据 Gauss-Lucas定理,任何复多项式 \(f\)的导数的零点都属于 \(f\)的零点构成的凸包!
John Baez 的文章中利用凸集分离定理给出了 Gauss-Lucas定理的一个简洁证明。
需要注意的是,反过来 \(P'(z)\)的零点未必都是电场的平衡点,当 \(P(z)\)有重根时,重根也是 \(P'(z)\)的零点,但不是 \(P'(z)/P(z)\)的零点,所以不是平衡点。
此外平衡点是鞍点 (saddle point) 是由于 \(V(z)\)的调和性质,其不存在局部的极大极小值,所以使得 \(\nabla V=0\) 的点都是鞍点。
特别地在三个点电荷 \(A,B,C\)的情形,场强为 0 的点必然位于 \(\DeltaABC\) 的内部,且是多项式 \(P(z) =(z-A)(z-B)(z-C)\) 的导数 \(P'(z)\)的零点。那关于这两个点的具体位置我们可以说什么吗?这就是优美的 Marden定理,要表述这个定理,我们需要先介绍 Steiner 内切椭圆的概念:
Steiner inellipse:在所有内切于 \(\Delta ABC\)的椭圆中,存在唯一的一个面积最大者,叫做 Steiner inellipse,此椭圆与\(\Delta ABC\)三边的切点为各边的中点。
Marden 定理断言 \(P'(z)\)的两个根正是 Steiner 内切椭圆的两个焦点:
Marden 定理:复多项式 \(P(z)=(z-A)(z-B)(z-C)\) 的导数 \(P'(z)\) 的两个零点正是 \(\Delta ABC\) 的 Steiner inellipse的两个焦点。
Steiner inellipse 和 Marden定理的证明并不复杂,美国数学月刊上出现过两篇介绍其证明的文章,都非常值得一读:
其中第一篇文章采用了复数和仿射变换的途径,第二篇使用了椭圆的光学性质。
]]>你能看出这个动画的奥妙之处在哪里吗?
直观上看,这个动画由一些错落有致,但又无缝拼接在一起的房间(立方体)组成,每个房间的外面绘制了一些“窗户”,窗户的开闭、朝向是变化的。但是仔细一看,诶,好像一些房间的窗口的朝向是“矛盾”的哎?这种整体布局和谐但是局部细节与真实世界矛盾的艺术风格由Escher(1898-1972) 所创立,所以这个作品也可以叫做 Escher 风格的不可能密铺。
这个动画里面使用的几何元素只有菱形,这些菱形分为两种:胖菱形和瘦菱形。在代码中我是对每一个像素,首先确定其所属的菱形,然后计算它到各个装饰元素(菱形边界、窗户、窗台) 的 signed distance field 函数 \(d\),根据 \(d\)的值来混合颜色,特别还根据菱形的类型和方向加上了阴影的效果,使得整个画面看起来有立体感。
计算菱形位置的算法非常奇妙,它来自 de Bruijn 1981年的发现,是构造准晶的网格法 1(multigrid);添加窗户的点缀是受 Greg Egan 的 Javascript 动画启发。我很久之前就知道 de Bruijn 的方法,但是看到 Greg Egan的动画以后还是萌发了在 shader 里面做出一个更漂亮的 3D效果来的想法。这个念头憋了好久,终于前几天利用晚上业余时间动手折腾了一番,捣鼓出了上面的效果。当然只是一个伪3D 的效果。我的动画与 Greg Egan 不同的地方在于,Greg Egan 的 Javascript动画可以直接计算出菱形的坐标然后绘制,思路比较直接;但是在 shader里面则需要把这个过程逆过来,需要对每一个像素,通过搜索确定它所在的菱形,所以实现起来要麻烦一些。此外Greg Egan是精心选择了每一个窗户的开口方向,使得所有的房间的窗户看起来都是矛盾的;我这里为了简单起见只随机设置了开口的方向,所以只有部分房间的窗户是矛盾的。
代码中窗户的绘制方法参考了 Greg Egan 的代码和注释,特别致谢。
]]>问题:在 \(n\timesn\) 的正方形网格图 \(G_n\)的所有生成树中等概率地随机任选一个,记这个随机生成树为 \(T\),\(T\)叫做 \(G_n\) 的一个均匀生成树。对 \(G_n\) 中任一顶点 \(v\),\(v\)是 \(T\) 的叶节点的概率是多少?
这个问题可以换一种更通俗的描述:
等价问题:对一个完全随机的 \(n\times n\)的完美迷宫,它包含的“死角”的比例是多少?
为什么这两个问题是一回事?
一个迷宫称作是完美的,如果迷宫中的任何两个房间之间都有且仅有唯一的道路相连,这正是生成树的等价描述!迷宫中的一个房间称作是“死角”,当且仅当它只有一条道路与其它房间相通,没有其它出路,这正是叶节点的等价描述!
下图显示了三个不同的均匀生成树,它们分别来自大小为 \(80\times 80\),\(120\times120\) 和 \(200\times200\)的三个网格图,这三个生成树的叶节点(用蓝色标出)占全体顶点的比例分别为\(1884/6400=0.294375\),\(4234/14400\approx0.294028\),\(11776/40000=0.2944\)。咦?看起来好像是在围着一个固定的值波动喔?
80x80, 0.294375 | 120x120, 0.294028 | 200x200, 0.2944 |
---|---|---|
本文的主题就是证明对 \(G_n\)的一个均匀生成树 \(T\),\(T\) 包含的叶节点的比例随着 \(n\) 趋于无穷收敛到常数 \(8(\pi-2)/\pi^3\approx 0.2945449\) (想不到\(\pi\)会出现在这里吧?)。可见上面三个模拟的数值与真实的极限值已经非常接近。
实际上对于度数是 \(2,3,4\)的顶点,它们的比例也随着 \(n\to\infty\)趋于固定的值,详细结果见下表:
度数 | 极限概率 | 近似值 |
---|---|---|
1:死角 | \[\dfrac{8}{\pi^2}\left(1-\dfrac{2}{\pi}\right)\] | 0.294 |
2:拐角 + 直路 | \[\dfrac{4}{\pi}\left(2-\dfrac{9}{\pi}+\dfrac{12}{\pi^2}\right)\] | 0.447 |
3:岔路 | \[2\left(1-\dfrac{2}{\pi}\right)\left(1-\dfrac{6}{\pi}+\dfrac{12}{\pi^2}\right)\] | 0.222 |
4:十字路口 | \[\left(\dfrac{4}{\pi}-1\right)\left(1-\dfrac{2}{\pi}\right)^2\] | 0.036 |
所以在一个随机的完美迷宫中,最多的其实是“拐角” 和“直路”(45%),其次是“死角” (30%),再次是“丁字岔路”(22%),而“十字路口”是非常少的(3.6%)。进一步也不难算出拐角和直路的极限概率分别为 \((32-20\pi+4\pi^2)/\pi^3\approx 0.279\) 和\((16-16\pi+4\pi^2)/\pi^3\approx0.168\)。
这些概率是怎样计算出来的呢?它和我们这个系列的主题二维随机游动又有何关系呢?这里面的故事相当精彩。粗略地说,上面这些关于随机生成树的概率量,都可以翻译为图上随机游动的概率量,把整个图看做一个电网络,它们又可以翻译为这个电网络的物理量,而这些物理量是可以用各种方法(主要是线性代数)来算的。上面提到的这些概率值都可以从一个矩阵出发通过求其主子式得到(或者稍微加点变化),这个矩阵叫做转移电流矩阵(transfer current matrix),其定义为:对给定的图 \(G\),将 \(G\) 看作一个电网络,每条边的电阻都是单位1。在其中一条边 \(e\)的两端加上电极,使得流入整个网络的电流总量为 1 个单位,记此时流过边\(e'\) 的电流总量为 \(Y(e,e')\),则矩阵 \(Y=Y(e,e')_{e,e'\in E}\) 叫做网络\(G\) 的转移电流矩阵。
对 \(G\) 的任何 \(k\) 条边 \(e_1,\ldots,e_k\),定义 \(k\times k\) 矩阵 \(Y^{(k)}\) 为 \(Y^{(k)}(i,j)=Y(e_i,e_j)\),则我们有如下结论(转移电流矩阵定理):设 \(T\)是一个随机生成树,则边 \(e_1,\ldots,e_k\) 都属于 \(T\) 的概率 \[\mathbb{P}(e_1,\ldots,e_k \in T)=\detY^{(k)}.\] 举个例子,\(\mathbb{Z}^2\) 中与原点 \((0, 0)\) 相邻的四条边为 \(e_1=(1,0)\),\(e_2=(0, 1)\),\(e_3=(-1,0)\),\(e_4=(0,-1)\),我们后面会计算出这四条边对应的转移电流矩阵为
\[Y^{(4)}=\begin{pmatrix}\frac{1}{2} & \frac{1}{2}-\frac{1}{\pi} &\frac{2}{\pi}-\frac{1}{2} & \frac{1}{2}-\frac{1}{\pi}\\\frac{1}{2}-\frac{1}{\pi} & \frac{1}{2} &\frac{1}{2}-\frac{1}{\pi} & \frac{2}{\pi}-\frac{1}{2}\\\frac{2}{\pi}-\frac{1}{2} & \frac{1}{2}-\frac{1}{\pi} &\frac{1}{2} & \frac{1}{2}-\frac{1}{\pi}\\\frac{1}{2}-\frac{1}{\pi} & \frac{2}{\pi}-\frac{1}{2} &\frac{1}{2}-\frac{1}{\pi} & \frac{1}{2}\end{pmatrix}.\]
于是原点的度数等于 4 的概率是 \[\mathbb{P}(e_1,e_2,e_3,e_4\in\mathbb{T})=\detY^{(4)}=\left(\frac{4}{\pi}-1\right)\left(1-\frac{2}{\pi}\right)^2\approx0.0361.\] 这正是上面列出的十字路口的概率!
如果是计算概率 \(\mathbb{P}(e_1,e_2,e_3\notin T, e_4\in T)\)呢?方法如下,把要排除掉的 \(e_1,e_2,e_3\) 对应的 \(Y^{(4)}\)的前三行全部取负值,并且给前三个对角元加上 1,保持第 4 行不变,得到
\[Y^{(4)}_{\overline{123}4}=\begin{pmatrix}\frac{1}{2} & \frac{1}{\pi}-\frac{1}{2} &-\frac{2}{\pi}+\frac{1}{2} & \frac{1}{\pi}-\frac{1}{2}\\\frac{1}{\pi}-\frac{1}{2} & \frac{1}{2} &\frac{1}{\pi}-\frac{1}{2} & -\frac{2}{\pi}+\frac{1}{2}\\-\frac{2}{\pi}+\frac{1}{2} & \frac{1}{\pi}-\frac{1}{2} &\frac{1}{2} & \frac{1}{\pi}-\frac{1}{2}\\\frac{1}{2}-\frac{1}{\pi} & \frac{2}{\pi}-\frac{1}{2} &\frac{1}{2}-\frac{1}{\pi} & \frac{1}{2}\end{pmatrix}.\]
则 \[\mathbb{P}(e_1,e_2,e_3\notin T,e_4\in T)=\detY^{(4)}_{\overline{123}4}=\frac{2}{\pi^2}-\frac{4}{\pi^3}.\]于是原点是叶节点的概率是 \(4\times\detY^{(4)}_{\overline{123}4}\approx0.2945\),这正是之前看到的死角的比例。
所以解决问题的关键就是求解 \(\mathbb{Z}^2\)上的转移电流矩阵,本文接下来就来介绍具体的理论。这个故事并无特别的难点,但确实比较长。我主要参考了Lyons 等人关于图随机游动的专著 1,Stanley的代数组合学教材 2 以及网上一些公开的讲义。
一个网络 \(\mathcal{N}=(G,c)\) 由一个有限图 \(G=(V,E)\)和一个权值函数 \(c:E\to\mathbb{R}_{\geq0}\) 组成。这里 \(G\) 是连通的无向图,其每条边 \(e\in E\) 有一个权值 \(c(e)\in[0, +\infty)\),叫做 \(e\) 的电导,其倒数 \(r(e)=1/c(e)\) 叫做 \(e\) 的电阻。
设 \(x,\,y\in V\) 是两个顶点,我们用\(x\sim y\) 表示 \(x,y\)是相邻的。由于本文主要考察边上的流函数,而流函数是有方向的,所以我们约定边集\(E\) 同时包含有序对 \((x,y)\) 和 \((y,x)\),即一条边作为有序对在 \(E\) 中出现两次。当 \(e=(x,y)\) 时,我们记 \(-e=(y,x)\) 为 \(e\) 的反向边。并用记号\(E_{1/2}\) 表示对每个 \(e\),在 \(e\) 和 \(-e\) 中任选一个组成的集合。\(E_{1/2}\) 的一个选取方式对应 \(E\)的一个定向,不过我们一般不必明确写出这个选取方式。此外当 \(e=(x,y)\) 时,我们称 \(e^-=x\) 为 \(e\) 的尾部,\(e^+=y\) 为 \(e\)的头部。为了记住这一点,你可以把 \(e\) 想象成一个从 \(x\) 到 \(y\) 的箭头:\(x\xrightarrow{e}y\)。注意在反向边 \(-e\) 中 \(x\) 变为头部,\(y\) 变为尾部。
对每个 \(e\in E\),当 \(e=(x,y)\) 时我们也记 \(c(x,y)=c(e)\)。我们要求电导函数\(c(x,y)\) 关于 \(x,y\) 是对称的:\(c(x,y)=c(y,x)\)。所以当写 \(c(e)\) 的时候我们不用关心 \(e\) 的定向。对每个顶点 \(x\in V\),记 \(c(x)=\sum_{y\sim x}c(x,y)\)。
所有 \(V\) 上的实值函数 \(f:V\to\mathbb{R}\) 构成一个内积空间 \(\ell^2(V)\): \[(f,\, g)_V = \sum_{x\inV}c(x)f(x)g(x).\]
所有 \(E\)上的反对称实值函数 \(\theta:E\to\mathbb{R}\) 也构成一个内积空间 \(\ell^2_{-}(E)\): \[(\theta,\,\theta')_E = \frac{1}{2}\sum_{e\inE}r(e)\theta(e)\theta'(e)=\sum_{e\inE_{1/2}}r(e)\theta(e)\theta'(e).\] 这里反对称的意思是对任何\(e=\{x,y\}\) 有 \(\theta(x,y)=-\theta(y,x)\)。注意上式右边的求和与边的定向是无关的,如果换成\(-e\) 的话乘积 \(\theta(e)\theta'(e)\)还是不变的,即内积的定义与 \(E_{1/2}\)的选取方式无关。
以上定义基本上与 Lyons等人的书保持一致,但是接下来的叙述会有比较大的差别。
定义 1.1:
定义梯度算子 \(\nabla:\ell^2(V)\to\ell^{2}_{-}(E)\) 为 \[(\nabla f)(x,y) = c(x,y)\big[f(x)-f(y)\big]=c(e)\big[f(e^-)-f(e^+)\big].\] 如果把 \(f\)理解为每个顶点处的电压的话,梯度算子给出的是电压之差除以电阻值,即经过边\(e\) 的有向电流。
定义散度算子 \(\mathrm{div}:\ell^{2}_{-}(E)\to\ell^2(V)\)为 \[(\mathrm{div}\,\theta)(x) =\frac{1}{c(x)}\sum_{y\sim x}\theta(x,y)=\frac{1}{c(x)}\sum_{e^-=x}\theta(e).\]上式右边可能有的求和项大于 0,有的小于 0。如果把 \(\theta\)理解为每条边上的有向电流的话,散度算子给出的是每个顶点处的净流出量。
定义拉普拉斯算子 \(\Delta:\ell^2(V)\to\ell^{2}(V)\) 为 \[(\Delta f)(x) = (\mathrm{div}\,\nabla f)(x) = f(x)-\sum_{y\simx}\frac{c(x,y)}{c(x)}f(y).\] 如果 \((\Delta f)(x)=0\) 对\(x\in V\) 成立,我们就称 \(f\) 在 \(x\) 处是调和的。
定理 1.1:梯度算子和散度算子是一对共轭算子:对任何\(f\in\ell^2(V)\) 和 \(\theta\in\ell_{-}^2(E)\) 有 \[(f,\,\mathrm{div}\,\theta)_V = (\nablaf,\,\theta)_E.\]
证明:上式对 \(f\)是线性的,所以我们只要对形如 \(\mathbb{1}_{\{x \}},x\in V\) 的元素验证即可。这时左边是 \(c(x)\cdot(\mathrm{div}\,\theta)(x)\),右边是\(\sum_{y\simx}\theta(x,y)\),二者当然相等。\(\blacksquare\)
定义 1.2:我们称映射 \(\mathrm{div}\) 的核 \(\mathrm{Ker\,div}\) 为环空间 (cyclespace),记作 \(\lozenge\)。称映射 \(\nabla\) 的像 \(\mathrm{Im}\nabla\) 为星空间 (starspace),记作 \(\bigstar\)。环空间和星空间都是 \(\ell_{-}^2(E)\) 的子空间。
定理 1.2:\(\ell_{-}^2(E)\)是环空间和星空间的正交直和:\(\ell_{-}^2(E)=\lozenge\oplus\bigstar\)。
证明:由于 \(\{\mathbb{1}_{\{ x \}},x\in V\}\) 构成\(\ell^2(V)\) 的一组基,所以它们在\(\nabla\) 下的像构成 \(\bigstar\) 的一组基。从定理 1.1的证明中我们已经看到对任何 \(\theta\in\ell^2_{-}(E)\) 有 \[(\nabla \mathbb{1}_{\{ x\}},\,\theta)_E=c(x)(\mathrm{div}\,\theta)(x).\] 于是 \(\theta\) 与任何 \(\nabla \mathbb{1}_{\{ x \}}\) 正交当且仅当\((\mathrm{div}\,\theta)(x)=0\) 对任何\(x\in V\) 成立,即当且仅当 \(\theta\in\lozenge\),从而 \(\lozenge\) 和 \(\bigstar\) 互为正交补空间,证毕。
我们来解释一下为什么这两个子空间叫做“环空间”和“星空间”。
首先是环空间。对任一 \(e\in E\),记\[\chi^e=\mathbb{1}_{\{ e \}} -\mathbb{1}_{\{ -e \}}\in\ell^2_{-}(E)\] 为边 \(e\) 的示性函数,即 \(\chi^e\) 在 \(e\) 和 \(-e\) 上取值分别为 \(\pm1\),在其它边上都是 0。
显然 \(\chi^{e}=-\chi^{-e}\)。
设 \(e_1=(v_1,v_2),e_2=(v_2,v_3),\ldots,e_k=(v_k,v_1)\) 首尾相接构成一条回路 \(C\),即 \[v_1\xrightarrow{\quad e_1\quad}v_2\xrightarrow{\quad e_2 \quad}\cdots\xrightarrow{\quad e_{k-1}\quad}v_k\xrightarrow{\quad e_k \quad}v_1.\]
定义 \(C\) 对应的环函数 \(f^C = \sum_{i=1}^k\chi^{e_i}\),则从 \(v_1\) 出发绕 \(C\) 一圈一路上经过的所有边 \(f\) 的值都是 \(+1\) (沿着反方向绕都是 \(-1\)),于是 \(f^C\) 在 \(C\) 包含的每个顶点上 1 进 1 出,在 \(C\) 之外的顶点上 0 进 0 出,从而 \(f^C\in\lozenge\)。反之,我们断言 \(\lozenge\) 可以由所有的环函数 \(f^C\) 张成,这就是为什么 \(\lozenge\) 叫做环空间。
设 \(\theta\in\lozenge\),定义 \(\theta\) 的支集为 \[\mathrm{supp}(\theta)=\{e\inE\mid\theta(e)\ne0\}.\] 如果 \(\mathrm{supp}(\theta)\)非空,则它必然包含一个回路,否则 \(\mathrm{supp}(\theta)\)构成的子图中必然有一个叶顶点 (度数恰好为 1),从而这一点处的散度不可能为0,矛盾!于是 \(\mathrm{supp}(\theta)\)包含一个回路 \(C\),我们可以选择合适的常数 \(\alpha\) 使得 \(\widetilde{\theta}=\theta-\alpha f^C\)在某个 \(e\in C\) 上为 0,则 \(\widetilde{\theta}\) 的支集严格小于 \(\theta\)。对 \(\widetilde{\theta}\)重复此操作一直下去必然可以在有限次后将支集变为空集,这就证明了 \(\theta\) 可以表示为形如 \(f^C\) 的线性组合。
星空间也有一个类似的形象描述。对每个顶点 \(x\),我们也有一个 \(\ell^2_{-}(E)\) 上的函数与之对应:\(\sum_{e^-=x}c(e)\chi^e\)。这个函数很直观,它的支集是从\(x\) 出发伸出去的星状结构。
对任何 \(\theta\in\ell^2_{-}(E)\),我们有 \[(\mathrm{div}\,\theta)(x)=\sum_{e^-=x}\theta(e)=\sum_{e^-=x}\left(c(e)\chi^e,\theta\right)_E=\left(\sum_{e^-=x}c(e)\chi^e,\theta\right)_E.\]由于 \(\theta\in\lozenge\) 当且仅当\((\mathrm{div}\,\theta)(x)=0\) 对所有\(\in V\) 成立,也就是 \(\theta\) 与所有 \(\sum_{e^-=x}c(e)\chi^e\)正交,所以我们证明了 \(\left\{\sum_{e^-=x}c(e)\chi^e\mid x\inV\right\}\) 可以生成 \(\bigstar\)。
这一节一下出现了好几个算子,以及环空间和星空间的概念,对初次接触的人来说有点名词爆炸,所以这里补充一段阅读材料:
我们在高中物理所学的基尔霍夫定律(电流、电压)是基尔霍夫于 1845年发表的,那时他只有 21 岁。两年后的 1847年基尔霍夫发表了另一篇文章,系统阐述了怎样用求解线性方程组的方法计算电路中的电流。第二篇文章很有意思,基尔霍夫证明了在一个有\(v\) 个中间节点和 \(e\)条边的电路中,我们可以对每个中间节点列出一个方程(流入=流出),这样得到的\(v\)个方程是线性相关的,但是删掉任何一个方程以后剩下的 \(v-1\)个方程都是线性无关的;此外我们还可以对每个“基本回路”列出一个方程(电压绕回路一圈改变为0),得到 \(\mu\) 个线性方程,其中\(\mu\)是电路包含的“基本回路”的个数。这 \(\mu\) 个方程和前面 \(v-1\)个方程合起来仍然是线性无关的,于是我们就有了 \(\mu+v-1\)个独立的方程,这些方程就足以解出所有边上的电流!
什么是基本回路?直观上理解很容易:下图标注了 \(\alpha,\beta,\gamma\)三个基本回路,它们不能拆解为更小回路的组合:
基本回路的准确定义是,取 \(G\)的一个生成树 \(T\),则对任何 \(e\in G\backslash T\),将 \(e\) 加入 \(T\) 以后都会形成某个回路 \(\chi^e\),\(\chi^e\) 就是一个基本回路。
总结一下:
1, 2 合起来正好可以解出全部 \(e\)条边上的电流!
仍然设 \(\mathcal{N}=(G,c)\)是一个网络,\(Z\) 是 \(V\) 的一个子集,\(a\notin Z\) 是一个顶点。
定义 2.1:我们称 \(\theta\in\ell_{-}^2(E)\) 是一个从 \(a\) 到 \(Z\) 的流,如果以下两个条件成立:
- \((\mathrm{div}\,\theta)(a)\geq0\)。
- 对任何 \(x\notin \{a\}\cup Z\) 有\((\mathrm{div}\,\theta)(x)=0\)。
\(a\) 叫做 \(\theta\) 的源点,\(Z\) 叫做 \(\theta\) 的汇点。
定义流 \(\theta\) 的强度为从源点\(a\) 流入网络的量: \[\mathrm{strength}(\theta)=\sum_{x\sim a}\theta(a,x).\] 我们也把 \(\mathrm{strength}(\theta)\) 记作 \(\|\theta\|\),如果有 \(\|\theta\|=1\) 成立,就称 \(\theta\)是一个单位流。
此外定义 \(\theta\) 的能量为 \[\mathcal{E}(\theta)=(\theta,\,\theta)_E.\]
此定义自动蕴含了 \(\sum_{z\inZ}(\mathrm{div}\,\theta)(z)=-(\mathrm{div}\,\theta)(a)\leq0\):考虑\(V\) 上的常函数 \(1\),则 \(\nabla1=0\),于是 \[0=(\nabla1,\,\theta)_E=(1,\,\mathrm{div}\,\theta)_V=(\mathrm{div}\,\theta)(a)+\sum_{z\inZ}(\mathrm{div}\,\theta)(z).\] 即对整个网络来说,从 \(a\) 流出的量等于流入 \(Z\) 的量,中间没有任何“淤积”。
定义 2.2:设 \(\theta\) 是一个从 \(a\) 到 \(Z\) 的流,如果还有 \(\theta=\nabla g\in\bigstar\) 成立,就称\(\theta\)是一个电流,\(g\) 叫做\(\theta\) 的电势。
我们总结一下流和电流的特点:
- 你可以把 \(a\)理解为电源正极,\(Z\)理解为网络接地的部分。
- 流函数要求对任何 \(x\notin \{a\}\cupZ\) 有 \((\mathrm{div}\,\theta)(x)=0\)等价于物理中的基尔霍夫电流定律:任何中间节点的流量守恒。
- 电流函数要求 \(\theta=\nablag\in\bigstar\) 等价于物理中的欧姆定律,即电流 \(\theta\) 等于电势差除以电阻 \(r(e)\)。
在本文中,我们最关心的电流函数是将一条边 \(e=\{x,y\}\) 的端点 \(x\) 通入单位电流,另一端点 \(y\) 接地时网络中对应的电流函数,此函数记作\(i^e\)。对任一边 \(e'\),\(i^e(e')\) 就是此时流过 \(e'\) 的电流量。
推论 2.1:\(\chi^e\) 在 \(\bigstar\) 上的正交投影即为 \(i^e\)。
证明:显然 \(\chi^e\) 是从 \(x\) 到 \(y\) 的单位流,且在任何 \(z\notin e\) 处散度为 0。\(\chi^e\) 在 \(\bigstar\) 的投影是通过减去一个 \(\mathrm{div}\) 处处为 0的流得到的,这不改变任何顶点处的散度值,所以投影分量仍然是从 \(x\) 到 \(y\) 的单位流且在任何 \(z\notin e\) 处散度为 0。又由于投影分量属于\(\bigstar\)所以还满足欧姆定律,从而必然是电流 \(i^e\)。\(\blacksquare\)
推论 2.2:设 \(e,\,e'\) 是两条边,则 \[i^e(e')=c(e')(i^e,i^{e'})_E.\]
证明:记 \(P_\bigstar\) 为从 \(\ell^2_{-}(E)\) 到 \(\bigstar\) 的投影算子,则 \(P_\bigstar\) 是自共轭算子以及 \(P_\bigstar^2=P_\bigstar\),从而 \[(i^e,i^{e'})_E=(P_\bigstar\chi^e,P_\bigstar\chi^{e'})_E=(P_\bigstar\chi^e,\chi^{e'})_E=(i^e,\chi^{e'})_E=r(e')i^e(e').\]即得结论。\(\blacksquare\)
定义 2.3:记 \(Y(e,e')=i^e(e')\),则矩阵 \(\big(Y(e,e')\big)_{e,e'\in E}\)叫做转移电流矩阵。\(Y(e,e')\)满足互反律 \[Y(e,e')r(e')=Y(e',e)r(e)=(i^e,i^{e'})_E.\]
推论 2.4:设 \(x,\,y\) 是两个顶点,在所有从 \(x\) 到 \(y\)的单位流中,电流的能量最小。并且电流的能量等于 \(x,\,y\) 之间的等效电阻。
证明:设 \(f,g\)是任何这样的两个单位流,则 \(f-g\)处处净流量为 0,即 \(f-g\in\lozenge\),从而 \(P_\bigstar f = P_\bigstar g = i\),所以电流\(i\) 是唯一确定的。注意到 \((i, f-i)_E=0\),所以 \[\mathcal{E}(f)=(f,\,f)_{E} = (i,i)_{E} +(f-i,f-i)_{E}\geq (i,i)_{E}=\mathcal{E}(i).\]于是我们证明了电流能量的最小性。为了证明它等于 \(x,\, y\) 之间的等效电阻,可以利用 \[(i,i)_E = (i, \chi^e)_E = r(x,y)i(x,y)\chi^e(x,y)= r(x,y)i(x,y)= U(x)-U(y).\] 其中 \(U(x)-U(y)\) 是 \(x,\,y\) 之间的电势差,而流入网络的总电流是1,所以这个电势差等于网络的等效电阻。
由此结论可以进一步得出 Rayleigh单调原理:如果把一个网络的电阻调低的话,则原来的单位电流会变成一个能量更小的单位流,而此单位流的能量又大于等于新网络对应的单位电流的能量,所以新网络的等效电阻相比之前是下降的。
在这一节中,我们会给出电势、电流对应的概率解释。假设 \(a\) 是一个顶点,\(Z\) 是一个顶点集合且 \(a\notin Z\)。
我们考虑从一点 \(x\)出发,转移概率为 \(P(x,y)=c(x,y)/c(x)\)的随机游动 \(\{X_t,t\geq0\}\),其中\(X_0=x\)。这个随机游动是可逆的 Markov链,以 \(\{c(x),x\in V\}\)为平稳测度:\(c(x)P(x,y)=c(y)P(y,x)\)。
我们同时考虑在 \(a\)点接上电源正极,并将 \(Z\)接地,则电流从 \(a\) 流入并从\(Z\)流出。我们将建立随机游动和这一电网络之间的联系。
电压有一个很简单的解释,它是直线上随机游动中赌徒获胜/破产概率的类比。
考虑从 \(x\) 出发的随机游动,设\(\tau_a\) 是这一随机游动首次到达 \(a\) 点的时间 (类比赌徒获胜),\(\tau_Z\) 是这一随机游动首次到达集合 \(Z\) 的时间 (类比赌徒输光),并考虑概率\[h(x) =\mathbb{P}_x(\tau_a<\tau_Z).\] 其中我们规定 \(h(a)=1, h(Z)=0\),则 \(h(x)\) 在任何 \(x\notin \{a\}\cup Z\)上是调和的: \[h(x) =\sum_{y\sim x}P(x, y)h(y).\] 此即为全概率公式,下一步到某个 \(y\sim x\) 的概率是 \(P(x,y)\),从 \(y\) 继续出发获胜的概率是 \(h(y)\),求和即可。
现在假设 \(a\) 点加上的电压大小是1,则其电势 \(v(a)=1\),由于 \(Z\) 接地所以 \(v(Z)=0\)。我们断言电势函数 \(v(x)\) 在任何一点 \(x\notin\{a\}\cup Z\) 处也是调和的: \[v(x) = \sum_{y\sim x}P(x, y)v(y).\]这是因为设 \(v\) 对应的电流是 \(i\),则
\[\begin{align*}v(x) - \sum_{y\sim x}P(x, y)v(y)&=\sum_{y\sim x}P(x, y)(v(x)-v(y))\\&=\sum_{y\sim x}\frac{c(x,y)}{c(x)}i(x,y)r(x,y)\\&=\frac{1}{c(x)}\sum_{y\sim x}i(x,y)\\&=0.\end{align*}\]
其中最后一个等号是根据基尔霍夫定律对任何中间节点 \(x\) 有 \((\mathrm{div}\,i)(x)=0\)。
现在获胜概率 \(\mathbb{P}_x(\tau_a<\tau_Z)\) 和电势函数\(v(x)\) 在 \(\{a\}\cup Z\) 上有相同的边界条件,在 \((\{a\}\cup Z)^c\)上都是调和的,则它俩必然是同一个函数!(提示:考虑两个函数之差并利用有限图上的调和函数必然在边界上取得最大最小值)于是我们得到
电压的概率解释:在 \(a\) 加上单位 1 的电压,将 \(Z\) 接地,则任一顶点 \(x\) 处的电势等于从 \(x\) 出发的随机游动在到达 \(Z\) 之前先到达 \(a\) 的概率:\(v(x)=\mathbb{P}_x(\tau_a<\tau_Z)\)。
如果 \(a\)处不是单位电压的话,则结论中的 \(v(x)\)应替换为 \(v(x)/v(a)\)。
在这一节中,我们将使用 Green函数给出电流的概率解释,以及电压的第二种解释。
Green函数是图上拉普拉斯算子的“基本解”,用它可以表示出一般的带边界条件的调和函数。
记 \(\mathbb{P}(a\to Z)=\mathbb{P}_a(\tau_Z< \tau_a^+)\) 为从 \(a\)出发的随机游动在返回 \(a\) 之前先到达\(Z\) 的概率。此概率称作从 \(a\) 到 \(Z\) 的逃逸概率。
仍然在 \(a\) 处加上电压,\(Z\) 接地,考虑此网络的电势 \(v\) 和电流 \(i\)。
引理 3.1: \[\frac{v(a)}{\| i\|} =\frac{1}{c(a)\mathbb{P}(a\to Z)}.\]
注意 \(v(a)/\|i\|\)正是网络的等效电阻。
证明:
\[\begin{align*}\mathbb{P}(a\to Z) &= \sum_{x\sim a}P(a, x)\mathbb{P}_x(\tau_Z <\tau_a)\\&=\sum_{x\sima}\frac{c(a,x)}{c(a)}\left(1-\frac{v(x)}{v(a)}\right)\\&=\sum_{x\sim a}\frac{c(a,x)}{c(a)}\frac{v(a)-v(x)}{v(a)}\\&=\sum_{x\sim a}\frac{i(a,x)}{c(a)v(a)}\\&=\frac{\|i\|}{c(a)v(a)}.\end{align*}\]
\(\blacksquare\)
对任何边 \(x\sim y\),定义随机变量\(N_{x\to y}^Z\) 为从 \(a\) 出发的随机游动在访问 \(Z\) 之前从 \(x\) 走到 \(y\) 的次数,则我们有如下定理:
定理 3.1:设电流是单位电流:\(\|i\|=1\),此时的电势函数为 \(v\),则
- \(v(x) = \mathcal{G}_Z(a, x)/c(x)\)。
- \(i(x,y)=\mathbb{E}_a\left[N_{x\to y}^Z -N_{y\to x}^Z\right]\)。
其中 \(\mathcal{G}_Z(a, x)\)是随机游动的 Green 函数,其定义为从 \(a\) 出发的随机游动在到达 \(Z\) 之前访问 \(x\) 的期望次数: \[\mathcal{G}_Z(a, x) = \sum_{0\leqk<\tau_Z}\mathbb{1}_{\{X_k=x\}}.\]
证明:
首先边界条件给出了 \(\mathcal{G}_Z(a,Z)=0\)。此外 \(\mathcal{G}_Z(a,a)\) 是一个每次试验成功概率为 \(\mathbb{P}(a\to Z)\)的几何分布的随机变量的期望,故 \[\mathcal{G}_Z(a, a)=\frac{1}{\mathbb{P}(a\toZ)},\] 再由上面的引理,有 \[\frac{\mathcal{G}_Z(a,a)}{c(a)}=\frac{1}{c(a)\mathbb{P}(a\to Z)}=v(a).\] 所以 \(\mathcal{G}_Z(a, x)/c(x)\)在边界上与电势函数是一致的,只要再证明在任意中间节点 \(x\) 的调和性质。注意随机游动必然是从与\(x\) 相邻的顶点走过去访问 \(x\),所以 \[\frac{\mathcal{G}_Z(a,x)}{c(x)}=\frac{1}{c(x)}\sum_{y\sim x}\mathbb{E}_a[N_{y\tox}^Z].\] 另一方面
\[\begin{align*}\mathbb{E}_a[N_{y\to x}^Z]&=\mathbb{E}_a\left[\sum_{0\leq t<\tau_Z}\mathbb{1}_{\{ X_t=y,X_{t+1}=x\}}\right]\\&=\sum_{0\leq t<\tau_Z}\mathbb{P}\left[X_t=y,X_{t+1}=x\right]\\&=\sum_{0\leq t<\tau_Z}\mathbb{P}(X_t=y)P(y,x)\\&=P(y,x)\mathbb{E}_a\left[\sum_{0\leq t<\tau_Z}\mathbb{1}_{\{ X_t=y\}}\right]\\&=P(y,x)\mathcal{G}_Z(a,y).\end{align*}\label{eq:cross}\]
所以代入求和后有
\[\frac{1}{c(x)}\sum_{y\sim x}\mathbb{E}_a[N_{y\tox}^Z]=\frac{1}{c(x)}\sum_{y\sim x}P(y,x)\mathcal{G}_Z(a,y)=\sum_{y\simx}P(x,y)\frac{\mathcal{G}_Z(a,y)}{c(y)}.\]
其中我们使用了 Markov 链的可逆性:\(c(x)P(x,y)=c(y)P(y,x)\)。这就证明了 \(\mathcal{G}_Z(a, x)/c(x)\)在中间节点的调和性,从而它就是电势函数,这证明了 1。
直接验证即可: \[\begin{align*}\mathbb{E}_a\left[N_{x\to y}^Z -N_{y\tox}^Z\right]&=P(x,y)\mathcal{G}_Z(a,x)-P(y,x)\mathcal{G}_Z(a,y)\\&=P(x,y)c(x)v(x)-P(y,x)c(y)v(y)\\&=c(x,y)(v(x)-v(y))\\&=i(x,y).\end{align*}\]
\(\blacksquare\)
这一节的目的是介绍怎样将一条给定边 \(e\) 属于一个随机生成树 \(T\) 的概率 \(\mathbb{P}(e\in T)\)表示为随机游动中的概率。这里的关键是 Wilson算法,它通过擦圈的随机游动按照一定的权重分布在全体生成树中随机地取样,这里一个生成树\(T\) 的权重 \(w(T)=\prod_{e\in T}c(e)\),任一生成树 \(T_0\) 被选中的概率为 \(w(T_0)/\sum_{T}w(T)\)。
在下文中“随机生成树”一词均指服从上述权重分布的随机生成树。
Wilson 算法的步骤如下:
下面这个动画演示了 Wilson算法的过程,你可以随时单击画布来重启动画。
Wilson 算法正确性的证明比较繁琐,这里不再赘述,你可以参考我 之前的一篇文章。初次遇到这个算法的话可以先跳过证明,只记住结论。这个算法的重点就是初始时的根节点是可以任意选取的,每次进行擦圈的随机游动时选择的出发顶点也可以是任意的,这都不影响得到的生成树\(T\) 的分布。
定理 4.1:设 \(\mathcal{N}=(G,c)\) 是一个网络,给定边\(e=(x,y)\in E\),在 \(x\) 处加上电源并将 \(y\) 接地,使得流入网络的电流是单位流 \(i^e\)。则对 \(G\) 的随机生成树 \(T\),\(e\)属于 \(T\) 的概率即为此时 \(e\) 中的电流量 \(i^e(e)\),它也等于从 \(x\) 出发的随机游动首次访问 \(y\) 是从边 \(e\) 走过去的这一事件的概率: \[\mathbb{P}(e \in T) = i^e(e) =\mathbb{P}_x\left[\text{the first visit to $y$ is across$(x,y)$}\right].\]
一个非常出人意料的结论,它把生成树、随机游动和电网络统一在一起。
证明:在 Wilson 算法中将初始根节点选为 \(y\),并将第一次出发作擦圈随机游动的顶点选为\(x\),则此随机游动首次到达 \(y\) 有两种可能:
于是我们证明了 \(e\in T\) 当且仅当从\(x\) 出发的随机游动首次到达 \(y\) 是从边 \(e\) 走过去的。
另一方面在 定理 3.1 中取 \(Z=\{y\}\) 有
\[i^e(x,y)=\mathbb{E}_x\left[N^{\{y\}}_{x\to y} - N^{\{y\}}_{y\tox}\right].\]
注意到从 \(x\)出发的随机游动不可能在到达 \(y\) 之前从\(y\) 走到 \(x\),所以 \(N^{\{y\}}_{y\to x}=0\)。同时它在到达 \(y\) 之前从 \(x\) 走到 \(y\) 的次数只能是 0 或者 1,所以 \(N^{\{y\}}_{x\to y}\in\{0,1\}\),从而 \[\mathbb{E}_xN^{\{y\}}_{x\toy}=\mathbb{P}_x(N^{\{y\}}_{x\to y}=1)=\mathbb{P}_x\left[\text{the firstvisit to $y$ is across $(x,y)$}\right].\] 这就完成了证明。
设 \(\mathcal{N}=(G,c)\)是一个网络,\(F\subset E\) 是边的子集且\(F\) 不含回路(不考虑边的方向),\(G\) 关于 \(F\) 的图收缩是一个图变换:如果 \(G\) 中的两个顶点可以被 \(F\)中的路径连接,则它们在新图中坍缩为同一个顶点;并且 \(F\) 中的每条边 \(f\) 的两个端点变成新顶点的一条自边(loop)。这样得到的新图记作 \(G/F\)。注意当一条边 \(e\notin F\) 如果和 \(F\) 中的边构成回路的话,它在 \(G/F\) 中也会变成自边。
在上图中,虽然 \(e_1,e_2\) 不属于\(F\),但是由于它们的两端可以被 \(F\) 中的路径连接,所以在收缩后 \(e_1,e_2\)也都变成了自边。我们保留这些自边,于是在收缩变换下 \(G\) 的边集 \(E\) 与 \(G/F\) 的边集 \(\widehat{E}\) 一一对应。
严格的说图的收缩是 \(G\) 的一个分割(partition):在 \(G\) 的顶点集 \(V\) 上定义等价关系 \(\cong\) 为:\(x\cong y\) 当且仅当 \(x\) 与 \(y\) 可以被 \(F\) 中的路径连接,则 \(G/F\) 的顶点是 \(V/\cong\) 下的等价类,\(G\) 中的边 \(e=(x,y)\) 在 \(G/F\) 中的边变为 \(e=([x],[y])\),其中 \([x]\) 是 \(x\) 所在的等价类。
我们想知道图 \(G\) 中的电流函数\(i^e\) 和图 \(G/F\) 中的电流函数 \(\widehat{i^e}\) 之间的关系。这里需要假定\(e\) 在 \(G/F\) 中没有变成一条自边。收缩 \(F\) 以后 \(i^e\) 仍然是 \(G/F\) 中从 \(e\)的一端到另一端的单位流,但一般不再是电流。根据 推论2.4,\(\widehat{i^e}\) 应该是 \(i^e\) 在 \(G/F\) 的星空间 \(\widehat{\bigstar}\)上的投影分量,所以我们需要找出这个投影映射。
下面的论证读起来会有点让人恼火,但它的直观含义并不难理解:\(i^e\) 不是 \(G/F\) 中的电流的原因是,\(i^e\) 可能在某些 \(F\) 中的边上的值不是 0,而这些边在 \(G/F\) 中变成了自边,自边的电流应该是0。所以为了从 \(i^e\) 得到 \(\widehat{i^e}\),我们可以在某些 \(F\)中的边两端加上电压,使得它们产生的电流可以和 \(i^e\) 在 \(F\) 上的电流抵消,这样处理后的 \(i^e\) 转到 \(G/F\) 中就是我们想要的电流了。即我们给\(i^e\) 减去 \(Z=\text{span}\{i^f,f\in F\}\)中的一个电流,这相当于取 \(i^e\) 在\(Z\) 的正交补 \(Z^\bot\) 上的投影分量。由于 \(F\) 中的边在 \(G/F\) 中变成了自边,所以每个 \(i^f\)都是从单个顶点流入流出,不会影响任何顶点处的守恒性。
我们下面就来论证上面这个直观分析是正确的。论证细节比较琐碎,如果理解了想法的话跳过去也不影响阅读。
记 \(\chi^F=\{\chi^f,f\inF\}\),\(Z=\mathrm{span}\{i^f,f\inF\}=P_\bigstar\chi^F\),则 \(Z\subset\bigstar\)。我们来证明对 \(G/F\) 的环空间 \(\widehat{\lozenge}\) 有 \[\widehat{\lozenge} = \lozenge + \chi^F.\]首先若 \(C\) 是 \(G\) 中的环: \[v_1\xrightarrow{e_1}v_2\xrightarrow{e_2}\cdots\xrightarrow{e_{k-1}}v_k\xrightarrow{e_k}v_1.\]
那自然有
\[[v_1]\xrightarrow{e_1}[v_2]\xrightarrow{e_2}\cdots\xrightarrow{e_{k-1}}[v_k]\xrightarrow{e_k}[v_1].\]
从而 \(C\) 也是 \(G/F\) 中的环,其对应的 \(f^C\in\widehat{\lozenge}\)。此外 \(F\) 中的边在 \(G/F\) 变成自边,所以 \(\chi^F\) 也属于 \(\widehat{\lozenge}\)。即 \(\widehat{\lozenge} \supseteq \lozenge +\chi^F\)。
反之对 \(G/F\) 中的一个环 \(C_{G/F}\),我们显然可以通过适当插入 \(F\) 中的边来得到 \(G\) 中的一个环 \(C\) (把每个等价类顶点展开为由 \(F\) 中的边组成的路径即可),对应的 \(f^C\) 是 \(f^{C_{G/F}}\) 加上一些 \(\chi^f\) 的和,所以 \(\widehat{\lozenge} \subseteq \lozenge +\chi^F\),从而反向的包含关系也成立,二者确实相等。
现在我们有 \[\ell^2_{-}(E) =\bigstar\oplus\lozenge=\widehat{\bigstar}\oplus\widehat{\lozenge}.\]以及 \(\widehat{\lozenge}\supseteq\lozenge\),从而\(\widehat{\bigstar}\subseteq\bigstar\)。所以我们进一步有\[\widehat{\lozenge}=(\bigstar\cap\widehat{\lozenge})\oplus\lozenge.\]
上式右边显然是个直和,且包含在左边中。为了看出左边也包含在右边中,设\(x\in\widehat{\lozenge}=y+z\),其中\(y\in\bigstar,z\in\lozenge\),显然\(y=x-z\in\bigstar\cap\widehat{\lozenge}\)。
从而 \[\ell^2_{-}(E)=\widehat{\bigstar}\oplus\widehat{\lozenge}=\widehat{\bigstar}\oplus(\bigstar\cap\widehat{\lozenge})\oplus\lozenge.\]我们来证明中间的 \(\bigstar\cap\widehat{\lozenge}\) 等于 \(Z=P_\bigstar\chi^F\)。为此只要注意到 \[\bigstar\cap\widehat{\lozenge} =P_{\bigstar}\widehat{\lozenge}=P_{\bigstar}\lozenge +P_{\bigstar}\chi^F=Z.\] 于是 \[\ell^2_{-}(E) =\widehat{\bigstar}\oplusZ\oplus\lozenge.\] 所以对 \(G\)的一条边 \(e\),如果它在 \(G/F\) 中没有变成一条自边的话,则电流 \(i^e\) 和 \(\widehat{i^e}\) 的关系为 \[\widehat{i^e}=P_{\widehat{\bigstar}}(\chi^e)=P_{Z}^\botP_{\bigstar}\chi^F=P_{Z}^\bot i^e.\]
至此我们就验证了之前的直观想法。
接下来是一个引理:
引理 5.1:当 \(F\)不含回路时,\(G\) 的所有包含 \(F\) 的生成树 \(\{T_G, F\subset T_G\}\) 与 \(G/F\) 的所有生成树 \(\{T_{G/F}\}\) 一一对应,且 \[w(T_G)=\prod_{f\in F}c(f)\cdotw(T_{G/F}).\] 于是对任何 \(e\inE\) 有 \[\mathbb{P}(e\in T_G \,\big|\, F\subset T_G) = \mathbb{P}(e\in T_{G/F})=\widehat{i^e}(e).\]其中 \(\widehat{i^e}\) 是 \(G/F\) 上的单位流 \(\chi^e\) 对应的电流函数。
证明:首先不难验证对 \(G\)的任何边集 \(C\),\(C\cup F\) 包含回路当且仅当 \(C\) 在 \(G/F\) 中包含回路。这是因为如果 \(C\cup F\)包含回路的话,那么对回路的顶点取等价类以后自然得到了一个 \(G/F\) 中的回路。反之如果 \(C\) 在 \(G/F\) 中包含回路的话,那么适当插入 \(F\) 中的边以后就可以得到 \(G\) 的回路,即 \(C\cup F\) 是包含回路的。
于是我们得到 \(T_{G/F}\) 是 \(G/F\) 的生成树当且仅当 \(T_G = T_{G/F}\cup F\) 是 \(G\) 的生成树。
由于 \(\{T_G,F\subset T_G\}\)上的分布是条件分布 \(\mathbb{P}(\cdot\,\big|\,F\subset T_G)\),所以当 \(T_G\leftrightarrow T_{G/F}\) 时有 \(\mathbb{P}(e\in T_G \,\big| \, F\subset T_G) =\mathbb{P}(e\in T_{G/F})\)。结合 定理4.1,引理的成立就是显然的事情了。\(\blacksquare\)
于是结合 推论 2.2 我们有如下定理:
定理 5.1:设 \(F\subsetE\) 不含回路,\(e\notin F\) 且与\(F\) 中的边不构成回路,\(T_G\) 是 \(G\) 的随机生成树,则 \(G/F\) 中的单位电流 \(\widehat{i^e}\) 是 \(G\) 中单位电流 \(i^e\) 在子空间 \(Z^\bot\) 上的正交投影: \(\widehat{i^e}=P_{Z}^\bot i^e\)。于是 \[\mathbb{P}(e\in T_G \,\big| \, F\subset T_G) =\widehat{i^e}(e)=c(e)(\widehat{i^e},\widehat{i^e})_{\widehat{E}}=c(e)\big\|P_Z^\boti^e\big\|^2.\] 其中 \(Z\) 是由\(\{i^f,f\in F\}\) 张成的子空间,\(P_Z^\bot\) 是到 \(Z^\bot\) 的正交投影。
定理 6.1 [转移电流定理]:设 \(\{e_1,\ldots,e_k\}\) 一组边的集合,\(T\) 是一个随机生成树,\(Y\) 是 如前定义的转移电流矩阵,定义 \(k\times k\) 矩阵 \(Y^{(k)}(i,j)=Y(e_i,e_j)\),则 \[\mathbb{P}(e_1,\ldots,e_k\in T) = \detY^{(k)}.\]
推论:考虑其中 \(r\) 条边 \(\{e_1,\ldots,e_r\}\) 不属于 \(T\),另外 \(k-r\) 条边 \(\{e_{r+1},\ldots,e_k\}\) 属于 \(T\) 的概率 \(\mathbb{P}(e_1,\ldots,e_r\notin T,e_{r+1},\ldots,e_k\in T)\),令 \(M^{(r)}\) 是对 \(Y^{(k)}\) 的前 \(r\) 行取反,给前 \(r\) 个对角元加上 1,并保持后 \(k-r\) 行不变得到的矩阵:
\[M^{(r)}(i, j) =\begin{cases}\delta_{ij} -Y^{(k)}(i, j), & i\leq r\\Y^{(k)}(i,j), & r+1\leq i\leqk.\end{cases}\]
则 \[\mathbb{P}(e_1,\ldots,e_r\notin T,e_{r+1},\ldots,e_k\in T)=\det M^{(r)}.\]
我们首先说明怎样用转移电流定理得出推论的结论。对排除的边的个数 \(r\) 归纳,\(r=0\)的情形就是转移电流定理。设推论对任何小于 \(r\) 的情形成立,对 \(r\) 的情形,考虑矩阵
\[P(i, j) = \begin{cases} \delta_{ij} - Y^{(k)}(i,j), & i < r \\ \delta_{ij}, & i = r \\ Y^{(k)}(i,j), & r+1\leq i\leq k. \end{cases}\]
则 \(M^{(r)},M^{(r-1)},P\) 在所有\(i\ne r\) 的行都相等,但是 \(M^{(r)}\) 和 \(M^{(r-1)}\) 的第 \(r\) 行之和等于 \(P\) 第 \(r\) 行,于是根据行列式的多重线性性质,\[\det M^{(r)}+\det M^{(r-1)}=\detP.\] 将 \(\det P\) 按照 \(P\) 的第 \(r\) 行展开并对 \(\{e_1,\ldots,e_{r-1},e_{r+1},\ldots,e_k\}\)利用归纳假设,得到
\[\det P=\mathbb{P}(e_1,\ldots,e_{r-1}\notin T, e_{r+1},\ldots,e_k\in T).\]
又对 \(\{e_1,\ldots,e_{r-1},e_r,\ldots,e_k\}\)利用归纳假设得到
\[\det M^{(r-1)} = \mathbb{P}(e_1,\ldots,e_{r-1}\notin T,e_{r},\ldots,e_k\in T)\]
相减即得结论。
回到转移电流定理的证明。分两种情形:
如果 \(\{e_1,\ldots,e_k\}\)中包含某个回路 \(C\)的话,我们可以适当重排它们并选取 \(a_i\in\{+1,-1,0\}\) 使得 \(\sum_{i=1}^ka_i\chi^{e_i}=f_C\in\lozenge\),这里对不属于 \(C\) 的 \(e_i\) 取 \(a_i=0\),对属于 \(C\) 的 \(e_i\) 通过选择 \(a_i=\pm1\)使得它们的方向为依次首尾相接。根据基尔霍夫电压定律,对任何电流 \(i^{e_m}\,(1\leq m\leqk)\),其绕回路一圈电势的改变为 0,所以 \[ 0 =\sum*{i=1}^kr(e_i)i^{e_m}(a_ie_i)=\sum*{i=1}^ka*ir(e_i)i^{e_m}(e_i)=\sum*{i=1}^ka_ir(e_i)Y^{(k)}(e_m,e_i).\]所以 \(Y^{(k)}\) 的列是线性相关的,从而\(\mathbb{P}(e_1,\ldots,e_k\in T)=\detY^{(k)}=0\),结论成立。
如果 \(\{e_1,\ldots,e_k\}\)中不包含回路的话,对边的个数 \(k\)归纳,定理 4.1 已经给出了 \(k=1\) 的情形,所以可以假设 \(k>1\) 且结论对所有小于 \(k\) 的情形成立。我们注意到 \(Y^{(k)}\) “差不多”是一个 Gram 矩阵 (见 之前的推论): \[Y^{(k)}(i,j)=Y(e_i,e_j)=c(e_j)(i^{e_i},i^{e_j})_E.\]即 \(Y^{(k)}\) 不过是对每个 \(j\),在 Gram 矩阵 \(I^{(k)}=\big((i^{e_i},i^{e_j})\big)_{1\leq i,j\leqk}\) 的第 \(j\) 列上乘以 \(c(e_j)\) 得到的,所以 \[\det Y^{(k)} = \left(\prod_{i=1}^k c(e_i)\right)\det I^{(k)}.\] 回忆内积空间中 Gram矩阵的行列式的几何意义是其张成的平行多面体的体积的平方,它等于 \(\{i^{e_1},\ldots,i^{e_{k-1}}\}\) 张成的底面\(Z\) 面积平方乘以 \(i^{e_k}\) 到这个底面距离的平方: \[\det I^{(k)} = \big\|P_Z^\bot i^{e_k}\big\|^2\det I^{(k-1)}.\] 其中 \(Z=\mathrm{span}\{i^{e_1},\ldots,i^{e_{k-1}}\}\),\(P_Z^\bot\) 是到 \(Z\) 的正交补空间 \(Z^\bot\) 的投影算子。把 \(\prod_{i=1}^kc(e_i)\) 乘回去就得到 \[\det Y^{(k)} = c(e_k) \big\|P_Z^\bot i^{e_k}\big\|^2 \det Y^{(k-1)}.\] 另一方面根据条件概率公式有 \[\mathbb{P}(e_1,\ldots,e_k\in T)=\mathbb{P}(e_k\in T\,\big|\, e_1,\ldots,e_{k-1}\in T)\cdot\mathbb{P}(e_1,\ldots,e_{k-1}\in T).\] 而根据 定理 5.1 的结论 \[\mathbb{P}(e_k\in T\,\big|\, e_1,\ldots,e_{k-1}\in T) = c(e_k)\big\|P_Z^\bot i^{e_k}\big\|^2,\] 从而 \(\det Y^{(k)}\) 和\(\mathbb{P}(e_1,\ldots,e_k\in T)\)有相同的初始条件和递推关系,从而它们相等,转移电流定理得证。
如本文开头所述,解决 \(\mathbb{Z}^2\)中顶点在随机迷宫中度数分布的问题归结为求解 \(\mathbb{Z}^2\)上的转移电流矩阵,即令所有边的电导值均为 1,在一条边 \(e=(x,y)\) 两端通入单位电流时,流过另一条边\(e'\)的电流流量,这等价于求解对应的电势函数 \(v\),也等价于求解 \(\mathbb{Z}^2\) 上拉普拉斯算子的解
\[(\Delta v)(x) = \mathbb{1}_{\{ x=e^- \}} - \mathbb{1}_{\{ x=e^+ \}}.\]
这一步可以通过 Fourier 分析的方法来做,比如 Lyons等人的教材就是采用的这种方法。但是假定你看过本系列的 第一篇文章的话,我们可以省很多事情,直接用二维随机游动的势核函数 \(a(x)\) 来构造电势函数 \(v\)。注意到 \(a(x)\)在除去原点之外的任何点是调和的,并且在原点处的值为 0。记
\[g(u) = \frac{a(u-y)-a(u-x)}{4}.\]
则 \(g\) 在除去 \(x,y\) 外任何点处是调和的,从而 \(i=\nabla g\) 满足欧姆定律、在除 \(x,y\) 之外满足基尔霍夫定律,且 \(g(x)=a(x-y)/4 = -g(y)\)。又
\[\begin{align*}\|i\| &= \sum_{z\sim x}i(x, z)=\sum_{z\sim x}[g(x)-g(z)]\\&=a(x-y)-\sum_{z\sim x}\frac{a(z-y)-a(z-x)}{4}\\&=\left(a(x-y)-\sum_{z\sim x}\frac{a(z-y)}{4}\right) +\sum_{z\in\{\pm(1,0),\pm(0,1)\}}\frac{a(z)}{4}\\&=1.\end{align*}\]
其中最后一个等号是因为势核在除去原点之外是调和的,且在原点的四个邻居处值为1。
于是 \(v(u)=g(u)-g(y)\) 即为当 \(x\) 通入单位电流,\(y\) 接地时 \(\mathbb{Z}^2\)上的电势函数,从而其在任何一边 \(e'=(z,w)\) 上的电流为
\[i(z,w) = g(z) - g(w)=\frac{1}{4}\big[a(z-y)-a(z-x)-a(w-y)+a(w-x)\big].\]
当 \(e=(x,y)\) 和 \(e'=(z,w)\)都取自原点相邻的四条边时,根据下图中的势核值代入上式即得本文开头的转移电流矩阵。
举个例子验证一下:取 \(e_1=(0,0)\to(1,0)\),\(e_2=(0,0)\to(0,1)\),则 \(x=z=(0,0)\),\(y=(1,0)\),\(w=(0,1)\),于是 \[i^{e_1}(e_2)=\frac{a(-1,0)-a(0,0)-a(-1,1)+a(0,1)}{4}=\frac{1}{2}-\frac{1}{\pi}.\] Bingo!
更新:由于使用 POV-Ray渲染三维双曲蜂巢非常的慢,所以我放弃了这种途径,并将代码从 Github主分支中移除。你可以在 旧存档中找到本文使用的代码。关于怎样渲染双曲蜂巢读者可以参考 另一个项目。
本文介绍我刚刚完成的一个 Python程序。虽然是刚刚完成,但是它占去了我这半年来大部分的业余时间,也算是一个艰苦攻关,呕心沥血之作。主要是它涉及的理论比较复杂,要用到Coxeter 群的一些深刻的性质,即所谓的 automaticproperty。这半年里面不少时间是花在学习 Casselman 和 Brink & Howlett等人的文章上面,这才弄懂了其中的数学原理(见参考文献)。
虽然完成这个程序很有成就感,但是我无意强调这个程序的任何优越性:它采用的Coxeter群的计算方法并不先进,难入行家的法眼。而且它的代码比较丑,大概率除了我,别人也很难用起来。
这个程序的目的是使用群论的方式来绘制二维和三维的各种 均匀密铺。所谓均匀密铺,你可以理解为用一些正多边形的瓷砖密铺整个空间,使得瓷砖的顶点在对称群作用下是传递的(构成单一轨道)。
我先展示一些这个程序的例子,然后介绍它的实现原理。
以下图片均由此程序绘制:
Euclidean 密铺 omnitruncated (4, 2, 4):
二维 Poincaré 圆盘上的正双曲密铺 (2, 3, 13),绘制了 3447个顶点,6971 条边,3549 个多边形:
二维上半平面模型中的双曲密铺 omnitruncated (4, 3, 3):
三维 Poincaré 单位球中的正双曲密铺 (3, 5, 3):
三维 Poincaré 单位球中的正双曲密铺 (5, 3, 5):
三维 Poincaré 单位球中的正双曲密铺 (5, 3, 4):
三维 Poincaré 单位球中的正双曲密铺 (4, 3, 5):
以上四个密铺是三维双曲空间中仅有的正且每个胞腔为紧集的双曲密铺。如果去掉每个胞腔为紧集的限制的话,但是要求每个胞腔的体积有限的话,则还有10 个正双曲密铺,如下图的 (6, 3, 3):
你可以看到每个胞腔都有一个理想顶点,它位于空间的无穷远处(即单位球面上)。这种密铺叫做仿紧的(paracompact),因为每个胞腔的体积仍然是有限的。如果再去掉每个胞腔的体积有限的条件的话,得到的密铺叫做非紧的,非紧的密铺有无限多个。
如果去掉正密铺这个限制,只考虑均匀密铺的话,那例子就非常多了。比如我们可以从正密铺出发通过截断操作得到许多均匀密铺,如rectified (3, 5, 3) 和 rectified (5, 3, 4):
二维的球面密铺 omnitruncated (5, 2, 3):
最后是一个 shader 程序,来自 Matt Zucker 的 shadertoy 项目:
绘制均匀密铺的理论基础是所谓的 Wythoff构造法,也叫万花筒方法。即在空间中摆放若干反射平面(镜子),然后从一个初始点出发,关于这些镜子反复作反射变换,得到所有的虚像,就得到了密铺的全部顶点。
下面的视频演示了 Wythoff 构造法的效果:在二维的 Poincaré双曲圆盘中,房间四周的墙壁都是镜子,房间中的场景在镜子中反复成像,得到了无数个虚像房间,它们填满了整个双曲空间。但实际上这个场景里面只有观察者所在的房间是真实的,其它房间都是它在镜子中的虚像。
在编程实现 Wythoff 构造法时有两种不同的方案:
逆像素方法。这种方法是对图像中的每个像素,计算它在空间中的对应点\(p\),然后将 \(p\)反复作镜面反射,直到其落入基本区域为止,得到一个点 \(q\)。即我们找到 \(p\) 在房间中的原像 \(q\)。然后根据 \(q\) 在基本区域中的位置给 \(p\)对应的像素上色。这种方法可以对所有像素并行计算,特别是和 shader编程结合起来可以生成非常惊艳的效果。这里举两个 shadertoy 上的例子:
逆像素方法只关心像素的颜色,完全不关心它的坐标是什么。它输出的是光栅图,无法输出矢量图形。而且如果你想导出数据用在建模软件中的话也不太方便。
坐标方法。这种方法就是从给定初始点 \(v_0\)出发,计算它的所有虚像(限定顶点数目的阈值),以及边和面的连接关系,然后逐个进行绘制。这种方法可以获取顶点具体的坐标信息,并输出为矢量图形和模型文件,比较适合用在学术论文中。但是它无法并行,而且对双曲密铺这种指数增长的结构计算效率是很慢的。
我的这个程序采用的是坐标方法。它首先在密铺的对称群中进行符号计算,得出每个顶点在最短字典序下对应的单词表示。(一个单词就是一个元素都是整数的tuple
),以及边和面的连接关系(也是元素都是整数的tuple
),然后将每个顶点对应的单词作用在初始顶点上得到该顶点的浮点坐标。换句话说,在计算每个顶点的最终坐标之前,它已经提前计算好了有多少个顶点,每个顶点是由初始顶点经过哪些反射得到的,哪些顶点构成边,哪些顶点构成面,哪些顶点构成胞腔,等等。这些计算仅涉及整数运算,完全避免了浮点数精度损失的问题。
听起来很神奇?下面我用一个例子来演示具体的步骤。
Omnitruncated (7, 2, 3) 密铺对应的 Coxeter-Dynkin 图如下:
这是一个二维的双曲密铺,其对称群是由 Coxeter 矩阵
\[M=\begin{pmatrix} 1 & 7 & 2 \\ 7&1 &3\\ 2 & 3 &1\end{pmatrix}\]
给出的 Coxeter 群
\[W=\langle s_0,s_1, s_2\ |\s_0^2=s_1^2=s_2^2=(s_0s_1)^7=(s_1s_2)^3=(s_0s_2)^2=1\rangle.\]
初始顶点不包含于任何镜面上,所以其稳定化子群只包含单位元 1,从而根据轨道—稳定化子定理\(W\)的每一个元素都对应密铺中的一个顶点。
\(W\) 中每个元素 \(w\) 都可以表示为生成元 \(s_0,s_1,s_2\)的乘积,我们称任何这样的表示方式为 \(w\) 的一个单词表示。如果 \(w=s_{i_1}s_{i_2}\cdots s_{i_k}\)是一个单词表示,且 \(w\) 不存在长度小于\(k\) 的表示,我们就称 \(s_{i_1}s_{i_2}\cdots s_{i_k}\) 是 \(w\) 的一个既约表示,并称\(l(w)=k\) 是 \(w\) 的长度。
\(w\)的既约表示一般不是唯一的,比如从 \(W\)的生成关系中可以看出 \(s_0s_2=s_2s_0\),\(s_1s_2s_1=s_2s_1s_2\) 等等。但是\(w\)的所有既约表示的长度必然都是一样的,所以 \(l(w)\) 的定义合理。
我们可以给 \(w\)的所有既约表示排序,并选择最小的那个来作为 \(w\)的规范表示。这个排序的依据叫做最短字典序(shortlexorder)。最短字典序顾名思义,就是字典在排列单词时采用的次序。
首先规定生成元 \(s_0,s_1,s_2\)之间的字母顺序关系为 \(s_0<s_1<s_2\),然后将这个顺序扩展到任何两个既约表示\(w_1\) 和 \(w_2\) 上去:
最短字典序:设 \(w_1=s_{i_1}s_{i_2}\cdots s_{i_n}\) 和 \(w_2=s_{j_1}s_{j_2}\cdots s_{j_m}\)是两个不同的既约表示,\(w_1,w_2\)可以是不同的群元素。它们二者在最短字典序中的关系由如下方式确定:
- 先比较长度,长度不同的话,长度小的为较小者,即若 \(n<m\) 则 \(w_1<w_2\),反之若 \(n>m\) 则 \(w_1>w_2\)。
- 若长度相等则按字母顺序从左到右逐项比较,设 \(k\) 使得对任何 \(l<k\) 有 \(s_{i_l}=s_{j_l}\) 但 \(s_{i_k}\ne s_{j_k}\),则规定 \(w_1,w_2\) 之间的大小关系与 \(s_{i_k},s_{j_k}\) 之间的大小关系相同。
于是任何 \(w\in W\)在最短字典序下都有唯一的规范表示。
定义 \(\mathcal{SL}(W)\) 为 \(W\)中所有元素的规范表示组成的集合,下面列出了 \(\mathcal{SL}(W)\) 中所有长度不超过 5的元素,一共有 37 个:(从小到大按行排列)
\[\begin{array}{lllll}e&s_{0}&s_{1}&s_{2}&s_{0}s_{1}\\s_{0}s_{2}&s_{1}s_{0}&s_{1}s_{2}&s_{2}s_{1}&s_{0}s_{1}s_{0}\\s_{0}s_{1}s_{2}&s_{0}s_{2}s_{1}&s_{1}s_{0}s_{1}&s_{1}s_{0}s_{2}&s_{1}s_{2}s_{1}\\s_{2}s_{1}s_{0}&s_{0}s_{1}s_{0}s_{1}&s_{0}s_{1}s_{0}s_{2}&s_{0}s_{1}s_{2}s_{1}&s_{0}s_{2}s_{1}s_{0}\\s_{1}s_{0}s_{1}s_{0}&s_{1}s_{0}s_{1}s_{2}&s_{1}s_{0}s_{2}s_{1}&s_{1}s_{2}s_{1}s_{0}&s_{2}s_{1}s_{0}s_{1}\\s_{0}s_{1}s_{0}s_{1}s_{0}&s_{0}s_{1}s_{0}s_{1}s_{2}&s_{0}s_{1}s_{0}s_{2}s_{1}&s_{0}s_{1}s_{2}s_{1}s_{0}&s_{0}s_{2}s_{1}s_{0}s_{1}\\s_{1}s_{0}s_{1}s_{0}s_{1}&s_{1}s_{0}s_{1}s_{0}s_{2}&s_{1}s_{0}s_{1}s_{2}s_{1}&s_{1}s_{0}s_{2}s_{1}s_{0}&s_{1}s_{2}s_{1}s_{0}s_{1}\\s_{2}s_{1}s_{0}s_{1}s_{0}&s_{2}s_{1}s_{0}s_{1}s_{2}&\end{array}\]
理论上由 \(s_0,s_1,s_2\)组成的所有可能的长度不超过 5 的单词总共有 \(\sum_{i=0}^5 3^i=364\)个,上表告诉我们实际上它们只包含了 \(W\) 中 37个不同的元素,即将它们作用在密铺中的初始顶点上只会得到 37 个顶点,其余364 - 37 = 327 个都是重复的。进一步计算可得长度不超过 6 的单词有 1093个而实际上只包含了 53 个不同的元素。所以如果我们能够快速地生成 \(\mathcal{SL}(W)\)中的元素而不是去遍历所有可能单词的话,就可以大大提高计算效率。
那么怎么计算 \(\mathcal{SL}(W)\)中的元素呢?这就引出了一个关于 Coxeter 群的重要结论:
定理 [Brigitte Brink & Robert B. Howlett,1993]:若 \(W\) 是有限生成Coxeter 群,则 \(\mathcal{SL}(W)\)是一个 正则语言。
正则语言这个术语来自计算机科学,关于正则语言的一个基本事实是,一个有限字符集上的正则语言总是可以被一个确定的有限状态自动机(definite finite automaton)识别,这样的有限状态机不是唯一的,但是在等价意义下(对状态重新标号)总是存在一个状态数目最少的。下图显示的是识别(7, 2, 3) 这个群的 \(\mathcal{SL}(W)\)的最小状态机:
可以看到在上图中一共有 19 个节点(即状态),每个状态都有一个编号,这个编号并没有实际意义,可以不用理会,实际上给状态重新编号不影响有限状态机识别的语言。真正有意义的是顶点之间的关系以及边的编号。圈红的节点0 是初始状态。
图中的每条有向边规定了状态之间的转移规则,边的标号 \(i\) 代表生成元 \(s_i\)。从初始状态出发,每次沿着一条有向边移动到下一个状态,经过的路径给出了一个由\(s_0,s_1,s_2\)组成的单词,所有的路径给出的单词组成的集合就是这个有限状态机识别的语言,即\(\mathcal{SL}(W)\)。
举个例子:
以此类推,我们可以很容易用宽度优先搜索来不重复不遗漏地遍历任意长度范围内的群元素。特别地如果你按图索骥地验证一下的话可以发现所有长度不超过5 的路径一共有 37 条,它们正对应前面列出的 \(\mathcal{SL}(W)\) 中长度不超过 5 的 37个单词。
无限 Coxeter 群的有限状态机必然含有回路,而有限 Coxeter群的有限状态机则必然是一个以初始状态为根节点的有向树。例如下图显示的是置换群\(S_4\) 对应的有限状态机:
用宽度优先搜索可以得出其包含 24 条不同的路径,它们对应 \(S_4\) 的 24 个元素的最短字典序表示:
\[\begin{array}{llll}e&s_{0}&s_{1}&s_{2}\\s_{0}s_{1}&s_{0}s_{2}&s_{1}s_{0}&s_{1}s_{2}\\s_{2}s_{1}&s_{0}s_{1}s_{0}&s_{0}s_{1}s_{2}&s_{0}s_{2}s_{1}\\s_{1}s_{0}s_{2}&s_{1}s_{2}s_{1}&s_{2}s_{1}s_{0}&s_{0}s_{1}s_{0}s_{2}\\s_{0}s_{1}s_{2}s_{1}&s_{0}s_{2}s_{1}s_{0}&s_{1}s_{0}s_{2}s_{1}&s_{1}s_{2}s_{1}s_{0}\\s_{0}s_{1}s_{0}s_{2}s_{1}&s_{0}s_{1}s_{2}s_{1}s_{0}&s_{1}s_{0}s_{2}s_{1}s_{0}&s_{0}s_{1}s_{0}s_{2}s_{1}s_{0}\end{array}\]
既然通过 \(\mathcal{SL}(W)\)来生成群元素如此方便,那问题来了:
问题 1:怎样计算 \(\mathcal{SL}(W)\) 对应的有限状态机?
此问题技术太过复杂,完整介绍全部内容的话本文难以承受,我在后面的附录中作了一些简单的解释。
有了每个群元素的唯一的规范表示,我们就可以很容易地计算密铺中每个顶点的坐标了:
设 \(w=s_{i_0}s_{i_1}\cdotss_{i_n}\),初始顶点为 \(v_0\),则 \(w\) 在 \(v_0\) 上的作用为 \[w\cdot v_0 = s_{i_0}(s_{i_1}(\cdotss_{i_n}(v_0))).\]即从右到左依次计算每个生成元作用的结果。当然由于 \(W\)是无限群,我们只能计算那些长度不超过一定范围的群元素对应的顶点。假设我们已经有了前面这37 个顶点,它们存储在一个列表 \(L\)里。为了绘制密铺中的边,我们还需要计算 \(L\)中哪些顶点是相邻的,这个怎么解决呢?
首先我们需要计算一个 \(L\)中元素之间的乘法表 \(T\),\(T\)的作用是帮助我们查找任何一个单词,其规范表示在 \(L\) 中的下标 (不在 \(L\) 中的话则返回 None
)。\(T\) 是一个大小为 \(|L|\times 3\) 的二维数组,其第 \(i\) 行对应 \(L\) 中的第 \(i\) 个群元素 \(w_i\),第 \(j\) 列对应群的生成元 \(s_j\),\(T[i][j]\) 的值等于 \(s_jw_i\) 这个元素的规范表示在 \(L\) 中的下标。如果这个元素不在 \(L\) 中则以 None
代替。
在我们的例子中 \(T\) 的值如下,\(L\) 中的元素放在了第二列:
V | word | \(s_0\) | \(s_1\) | \(s_2\) |
---|---|---|---|---|
0 | \(e\) | 1 | 2 | 3 |
1 | \(s_{0}\) | 0 | 6 | 5 |
2 | \(s_{1}\) | 4 | 0 | 8 |
3 | \(s_{2}\) | 5 | 7 | 0 |
4 | \(s_{0}s_{1}\) | 2 | 12 | 11 |
5 | \(s_{0}s_{2}\) | 3 | 13 | 1 |
6 | \(s_{1}s_{0}\) | 9 | 1 | 15 |
7 | \(s_{1}s_{2}\) | 10 | 3 | 14 |
8 | \(s_{2}s_{1}\) | 11 | 14 | 2 |
9 | \(s_{0}s_{1}s_{0}\) | 6 | 20 | 19 |
10 | \(s_{0}s_{1}s_{2}\) | 7 | 21 | 18 |
11 | \(s_{0}s_{2}s_{1}\) | 8 | 22 | 4 |
12 | \(s_{1}s_{0}s_{1}\) | 16 | 4 | 24 |
13 | \(s_{1}s_{0}s_{2}\) | 17 | 5 | 23 |
14 | \(s_{1}s_{2}s_{1}\) | 18 | 8 | 7 |
15 | \(s_{2}s_{1}s_{0}\) | 19 | 23 | 6 |
16 | \(s_{0}s_{1}s_{0}s_{1}\) | 12 | 30 | 29 |
17 | \(s_{0}s_{1}s_{0}s_{2}\) | 13 | 31 | 28 |
18 | \(s_{0}s_{1}s_{2}s_{1}\) | 14 | 32 | 10 |
19 | \(s_{0}s_{2}s_{1}s_{0}\) | 15 | 33 | 9 |
20 | \(s_{1}s_{0}s_{1}s_{0}\) | 25 | 9 | 35 |
21 | \(s_{1}s_{0}s_{1}s_{2}\) | 26 | 10 | 36 |
22 | \(s_{1}s_{0}s_{2}s_{1}\) | 27 | 11 | 34 |
23 | \(s_{1}s_{2}s_{1}s_{0}\) | 28 | 15 | 13 |
24 | \(s_{2}s_{1}s_{0}s_{1}\) | 29 | 34 | 12 |
25 | \(s_{0}s_{1}s_{0}s_{1}s_{0}\) | 20 | None | None |
26 | \(s_{0}s_{1}s_{0}s_{1}s_{2}\) | 21 | None | None |
27 | \(s_{0}s_{1}s_{0}s_{2}s_{1}\) | 22 | None | None |
28 | \(s_{0}s_{1}s_{2}s_{1}s_{0}\) | 23 | None | 17 |
29 | \(s_{0}s_{2}s_{1}s_{0}s_{1}\) | 24 | None | 16 |
30 | \(s_{1}s_{0}s_{1}s_{0}s_{1}\) | None | 16 | None |
31 | \(s_{1}s_{0}s_{1}s_{0}s_{2}\) | None | 17 | None |
32 | \(s_{1}s_{0}s_{1}s_{2}s_{1}\) | None | 18 | None |
33 | \(s_{1}s_{0}s_{2}s_{1}s_{0}\) | None | 19 | None |
34 | \(s_{1}s_{2}s_{1}s_{0}s_{1}\) | None | 24 | 22 |
35 | \(s_{2}s_{1}s_{0}s_{1}s_{0}\) | None | None | 20 |
36 | \(s_{2}s_{1}s_{0}s_{1}s_{2}\) | None | None | 21 |
于是对任意的单词 \(w=s_{i_0}s_{i_1}\cdotss_{i_n}\),我们可以从 \(T\) 的第0 行出发,先找到 \(s_{i_n}\) 在 \(L\) 中对应的元素,假设是第 \(k\) 个,那么就跳到第 \(k\) 行,由 \(s_{i_{n-1}}\) 对应的列找到 \(s_{i_{n-1}}s_{i_n}\) 在 \(L\) 中对应的元素,再顺藤摸瓜找到 \(s_{i_{n-2}}s_{i_{n-1}}s_{i_n}\) 在 \(L\) 中对应的元素,...,如此下去即可确定\(w\) 在 \(L\) 中对应的元素 (或者None
)。
有了表 \(T\)的帮助,我们可以来计算边的信息了。这里一条边 \(e\) 用一对整数 \(e=(i,j)\) 来表示,\(i,j\) 分别是 \(e\) 的两个端点在 \(L\) 中的下标。
假设初始顶点 \(v_0\) 关于第 \(i\) 面镜子反射后得到的虚像是 \(v_1=s_i(v_0)\),则 \(e=(v_0,v_1)\) 构成一条类型为 \(i\) 的边。在我们这个情形下,边 \(e\) 的稳定化子群是标准椭圆子群 \(W_I=\langles_i\rangle\)。根据轨道—稳定化子定理,密铺中所有类型为 \(i\) 的边可以通过将商群 \(W/W_I\) 的每个元素作用在 \(e\) 上得到。显然 \(e\) 的两个端点对应的规范表示分别是单位元 1和 \(s_i\)。对任一 \(w\in W\),我们首先计算 \(w\) 关于 \(W_I\) 的陪集代表元 \(w_I\),\(w_I\cdote\) 的两个端点对应的单词分别是 \(w_I\) 和 \(w_Is_i\),然后按照上面的步骤找到它俩在\(L\)中对应的元素下标,这就得到了边对应的下标表示。当然如果出现了None
说明这条边连接了不在 \(L\) 中的顶点,需要丢掉。
\(L\) 中 37 个顶点构成的边如下:
图中标号 0 的顶点是初始顶点,其对应的单词是单位元1。边中白色的线条个数表示这条边的类型,
从这个图里可以看出很多有用的信息,非常有助于理解 Coxeter群的最短字典序表示与密铺顶点的对应关系:
计算面的步骤也是完全类似的,初始顶点关于 \(i, j\)两面镜子的反射的复合是一个旋转,这个旋转连续作用 \(m\) 次可以生成一个正多边形的面,其中 \(m\) 是 Coxeter 矩阵中的 \((i,j)\)分量。这个多边形的稳定化子群是标准椭圆子群 \(W_I=\langle i,j\rangle\),我们仍然可以得出每个顶点对应的一个单词表示,用 \(W/W_I\) 里的代表元作用在上面,然后去 \(L\) 里面查找对应的下标。
最终得到的图像如下图,计算了 30517 个顶点,42057 条边,11541个多边形:
在上面的过程中,我们其实还用到了一个重要的计算:
问题 2:给定任一单词 \(w\),怎样计算 \(w\) 的规范表示?怎样计算 \(w\) 关于某个标准椭圆子群 \(W_I\) 的陪集代表元?
同样我把解释放在附录里面。
整个代码主要包含如下的功能:
Coxeter 群的计算。这部分由 coxeter
模块中的CoxeterGroup
类实现。Coxeter群的计算又包含如下几个部分:
密铺的绘制。主要是在 tiling.py
文件中实现。它包含如下步骤:
其中绘制 \(\mathcal{SL}(W)\)的有限状态机需要使用 pygraphviz 模块,这个模块依赖于graphviz 软件和libgraphviz-dev
。
将有限状态机最小化我参考的是 Gries的文章。Gries 的文章写的很棒,但是我认为他并没有把存储 \((B,a)\) 对的列表性质讲清楚。
双曲情形的绘图我用的是一个叫 hyperbolic的三方库。我对这个库其实不太满意,然而我一时也没有精力分出来再写一个,所以暂且先凑合着。这个库最大的好处是,它可以绘制具有常双曲宽度的边,即所谓的hypercycle。
计算极小根的算法是这个代码中最大的性能陷阱。其中在判断一个极小根\(\gamma\) 经过一个单反射 \(s_\alpha\)以后是不是仍然是极小根时,采用的方法是判断 \(s_\gamma\) 和 \(s_\alpha\) 是不是生成一个有限群,即判断\(s_\gamma s_\alpha\) 在单根 \(\Delta\)下对应的矩阵是不是经过某次幂以后成为单位矩阵。这里面矩阵的元素都是分圆域里的代数整数,形如\(p(\xi)\),其中 \(p(x)\) 是一个不可约整系数多项式,\(\xi\) 是本原 \(m\) 次单位根,其中 \(m\) 是 Coxeter矩阵中所有元素的最大公倍数乘以 2。\(\xi\) 可以用分圆多项式 \(\Phi_m(x)\) 来描述。于是矩阵的计算被归结为\(\mathbb{Z}[x]/(\Phi_m(x))\)中的多项式运算。这个计算量非常依赖于 \(m\) 的值:例如对 (19, 20, 21)这样的三角群,\(\Phi_m(x)\)的表达式非常复杂,计算速度就很慢了。这一点与逆像素反射方法是不同的,逆像素反射法的计算量几乎不随群的变化而变化。
一种更合理的实现方法见 这里。
在这里我简单回答前面正文中埋下的 问题 1 和 问题 2。这部分内容需要你了解 Coxeter群的几何实现、Tits 锥、根系等预备知识,这部分内容可以参考 Humphreys的教材。
仍然以 (7, 2, 3) 这个群为例子,先看下图:
这个图和上图一样,只不过多了 12 个标记出的镜面,这 12个镜面有特殊的含义:它们是群 \(W\)的根系中的 12 个极小根。
你可以把 \(W\)的根系理解为图中所有的圆弧,每个圆弧都是一个反射镜面,这些镜面都是 \(\Delta ABC\) 三条边所在的初始镜面 \(AB,AC,BC\) 在群 \(W\)作用下的结果。每个镜面有正反两面,其中基本区域 \(\Delta ABC\)所在的那一面是镜子的正面,另一面是背面。镜子正面的法向量给出一个正根,背面对应的法向量是将该正根取负(负根)。
我们总是用一个镜子的正法向量(正根)来指代这面镜子。
从直观上说,极小根 \(\gamma\)是那些满足如下条件的镜面:假设一个人站在 \(\Delta ABC\) 的内部往外看,则不存在任何镜面\(\beta\ne\gamma\) 完全挡在 \(\gamma\) 前面,使得这个人看不到 \(\gamma\)的任何一点。这个话反过来说就是,如果这个人要从 \(\Delta ABC\) 的内部出发,走到 \(\gamma\)的背面去,无论他怎么走都必须先跨过另一个镜子 \(\beta\ne \gamma\),那么 \(\gamma\)就不是极小根。
单根必然都是极小根,因为它们是基本区域的边界,不可能还有镜子挡在它们和基本区域之间。
关于极小根的一个重要事实是,任何有限生成 Coxeter群的极小根的个数都是有限的。这个结论在 Brink 和 Howlett的证明中起到最关键的作用。
极小根的反射表 reftable
定义如下:它是一个二维数组,其第\(i\) 行对应第 \(i\) 个极小根 \(\alpha_i\),其第 \(j\) 列对应第 \(j\) 个生成元 \(s_j\),其 \((i,j)\) 位置填入的是 \(\beta=s_j(\alpha_i)\) 的结果:
-1
。None
。(7, 2, 3) 群的极小根反射表如下:
root | \(s_0\) | \(s_1\) | \(s_2\) |
---|---|---|---|
0 | -1 | 3 | 0 |
1 | 4 | -1 | 5 |
2 | 2 | 5 | -1 |
3 | 6 | 0 | 7 |
4 | 1 | 8 | 9 |
5 | 9 | 2 | 1 |
6 | 3 | 10 | 11 |
7 | 11 | 7 | 3 |
8 | 10 | 4 | None |
9 | 5 | None | 4 |
10 | 8 | 6 | None |
11 | 7 | None | 6 |
设 \(W\) 的所有极小根之集为 \(\Sigma\),\(\mathcal{SL}(W)\) 的有限状态机 \(\mathcal{A}\) 由如下规则给出:
\(\mathcal{A}\) 的状态是 \(\Sigma\) 的子集,其中初始状态为空集 \(\emptyset\)。
从一个状态 \(S\)转移到另一个状态 \(S'\)的规则为:
\[S\xrightarrow{\ s_i\ } \{s_i\} \cup(s_i(S)\cup\{ s_i(\alpha_j),j<i\})\cap\Sigma.\]
我们可以用宽度优先搜索找到所有的状态以及它们之间的转移关系,然后用 Hopcroft算法 将得到的有限状态机最小化。
下图显示的是 (7, 2, 3) 这个群的状态机 \(\mathcal{A}\),每个状态的标号反映了它是\(\Sigma\) 的哪个子集,例如9 : {1, 2, 3, 5}
表示这个状态的编号是 9,它是由第 1, 2, 3,5 个极小根构成的集合。
计算两个群元素乘法的规范表示的算法来自Casselman。这个讲解起来可就太费功夫了,我可能未来需要专门再开一篇文章介绍。其代码如下,其中s
是一个生成元,word
是一个逆最短字典序下的单词(逆最短字典序就是把最短字典序中的单词反过来),函数返回的也是对应结果在逆最短字典序下的规范形式:
1 |
|
由此函数不难计算任何两个单词相乘的逆最短字典序下的规范形式,倒过来自然也就解决了最短字典序下的乘法问题。
这里先在逆字典序下计算然后再倒过来获得字典序是为了和 Casselman的文章中的论述保持一致。
计算一个规范表示的单词 word
关于某个标准椭圆子群的陪集是最简单的:设 \(W_T\) 是一个标准椭圆子群,其生成元是 \(W\) 的生成元 \(S\) 的一个子集 \(T\),则计算 word
关于 \(W_T\) 的左陪集代表元的伪代码如下:
1 |
|
其中 \(l(\cdot)\) 是 Coxeter群上的长度函数。这个算法会把 word
分解为形如 \(x^T\cdot w_T\) 的形式,其中 \(w_T\in W_T\),且对任何 \(t\in T\) 有 \(l(x^Tt)>l(x^T)\)。最终得到的陪集代表元\(x^T\) 是规范表示。
对有限 Coxeter 群,其所有正根都是极小根;对仿射 Coxeter群,其根系由一些平行的镜面族构成,每族镜面中的反射镜面互相平行。每个族中存在一对极小根,它们把基本区域\(\Delta ABC\)夹在中间并完全挡住本族中外面的镜面,所以只有它俩才是极小根。下图显示的是(6, 2, 3) 密铺 (对称群为仿射 \(\widetilde{G}_2\)) 的 12 个极小根:
关于 Coxeter 群中的计算,我主要参考的是 Casselman 的三篇文章:
Automata toperform basic calculations in Coxeter groups, by BillCasselman.
Computation inCoxeter groups I. Multiplication, by Bill Casselman.
Computationin Coxeter groups II. Constructing minimal roots, by BillCasselman.
关于 Coxeter 群的自动性质,可以参考 Brink & Howlett 的论文:
关于 Coxeter 群的基础知识,毫无疑问应该参考 Humphreys 的经典教材
]]>问题:假设平面上有一个正方形的房间,房间的四面墙壁都是光滑的反射镜子,即子弹在碰到墙壁时会按照入射角等于出射角的规律一直反射下去。房间中有一位政要和一个刺客。能否在房间中放置若干名(数目有限)保镖,使得这些保镖可以封死刺客的所有射击角度,从而保护政要不被子弹击中?
政要和刺客的位置是固定的,但可能是房间中任何两点。
据 考据,这个问题曾经在1989 年列宁格勒的数学竞赛中出现过。不久前通过 PBS 和 math3ma的博客的科普,这个问题又被更多人所了解。如果你还没有看过这个视频和博客的话,我强烈建议你先去观看它们,然后再阅读本文。因为她们讲的真的非常棒,而且是真正面向一般大众的科普!
Greg Egan 进一步讨论了当房间是正三角形和正六边形的情况。他给出的答案是正确的,但是我感觉他对正六边形情形的解释有点让人难懂(GregEgan 的一贯风格)。
本文是对 math3ma 和 Greg Egan博客文章的补充。也就是说,我这里不会再给出正方形情形的解答,math3ma的博客文章已经解释的很好了。但是如果你看完 Greg Egan的文章以后对正三角形和正六边形的情形还有疑问,这篇文章也许可以帮助你。
本文的代码在 Github上。这个项目包含了一个交互式的脚本,你可以在窗口中点击并拖拽鼠标来查看刺客射击的轨迹以及保镖的位置:
正方形 | 正三角形 | 正六边形 |
在照镜子的时候,你和自己在镜子中的像的左右是相反的。即镜面反射会改变“手性”。所以任何人不可能经过平移和旋转之后与自己在镜子中的像重合。
然而不管是旋转还是平移,它们都可以分解成两个反射变换的复合:
所以偶数次反射等同于若干次旋转和平移,手性不变;奇数次反射等同于若干次旋转和平移后再附加一次反射,手性相反。
观察上面盗梦空间的剧照,小李子位于两个平行的镜子中间,他有无穷多个虚像。这些像是交错出现的:正对着他的像是经过奇数次反射得到的,这些像和他的手性是相反的,它们构成集合\(L_1\);背对着他的像是经过偶数次反射得到的(小李子本人看作\(0\)次反射的像),这些像和他是可以经过平移以后重合的,它们构成集合 \(L_2\)。假设两个镜子的距离为 \(d\),则同一 \(L_i\) 中的像以 \(2d\) 为间隔均匀分布在一条直线上。
如果我们想在两个镜子中间放置若干保镖,挡住摄像师从任何角度拍摄到小李子的话,则恰好需要4名保镖。他们需要分别挡住小李子本人、小李子在两个镜子中的一次虚像,以及某个二次虚像。
为什么是 4 呢?假设一个保镖 \(G\)挡住了小李子的某个虚像 \(A\inL_i\),\(i\) 可以是 1 或者2。\(G\)的所有虚像也由两个格点组成,每个格点也都是间隔 \(2d\)均匀排列的。根据三角形的相似原理,\(G\)的偶数次反射构成的格点在 \(L_i\)上的投影间距是 \(4d\),这些偶数次虚像能挡住 \(L_i\) 中一半的格点。另一方面 \(G\)的奇数次反射构成的格点一般来说是无用的(除非狗仔和明星恰好位于某些特殊位置)。所以一个保镖只能挡住1/4 比例的小李子的虚像。
理解正多边形房间情形的第一个关键,是要知道刺客的任何射击轨迹都可以展开为平面上的一条射线。刺客可以击中目标当且仅当这条射线经过目标的某个虚像。这个操作叫做展开(unfolding)。
反之,我们可以用所谓的折叠 (folding)操作将从刺客发出的任何射线折叠回房间变成一条射击轨迹。
当房间是正方形时,目标的所有虚像由 4 个不同的二维格点组成:
对于刺客来说,只要朝着任何一个虚像开枪他就能击中目标。因为他和任何虚像之间的连线都可以通过折叠操作变成一条子弹的反射路径:
在 math3ma 的博客中已经证明了封锁一个二维格点需要 4名保镖,所以一共需要 4x4=16 名保镖。
当房间是正三角形时,目标的所有虚像由 6 个不同的二维格点组成:
狗仔队与任何虚像之间的连线都对应一条反射路径:
同样地,封锁每个二维格点需要 4 个保镖,所以总共需要 4x6 = 24名保镖。
房间是正六边形是一个非常容易产生迷惑的情形。注意到将一个房间绕着一个顶点反射三次回到自身,房间被翻转了,而且标记被移动到了相邻的三角形中:
即(镜面反射生成的)对称群可以在保持房间本身不变的同时将房间内的点移动到房间中其它的位置。这就导致房间中的一点在其它房间中可以有6个不同的虚像。这取决于射线的方向,沿着不同的射线看过去,可以看到不同的虚像:
用群论的语言解释,就是存在多个不同的群元素 \(w\) 可以将房间 \(H\) 映射为另一个房间 \(H'\):\(wH=H'\)。每一条从 \(H\) 到 \(H'\) 的射线都给出一个这样的 \(w\)。不同的 \(w\) 可能会导致 \(H'\) 中 6 个虚像的排列发生变化。
正六边形有这个不同,是因为正六边形并不是对称群作用下的“基本区域”,相反它包含基本区域(正三角形)的6个拷贝。注意到正六边形的镜面集合和正三角形的情形是一样的,都由三组夹角为120 度的、间隔为 1的平行线组成。所以它们给出的对称群是一样的。但是每个正六边形的内部会被三个镜面“穿过”,切成6 个小三角形。所以正六边形的情形基本区域还是正三角形。于是房间中每个点\(p\) 在平面上的像仍然由 6个不同的二维格点构成 1:
在上图中,相同颜色的三角形构成一个格点。图中标号的含义是:如果一个正三角形被映射到了另一个具有同样颜色的正三角形,那么它们的标号必然一致。
所以一般情形下目标的虚像仍然由 6 个二维格点组成。封锁每个格点需要 4名保镖,所以我们仍然需要 4x6=24 名保镖,是这样吗?请看下图:
我选择了明星的 6个虚像格点中的一个,用黄色的点标记;刺客与每个虚像连线的中点有一个保镖的虚像,这个虚像来自房间中某个真实的保镖(用青色的点标记)。把射线折叠回房间我们可以得到真实保镖的位置。然而即便对同一个保镖,随着他的虚像变化,这个位置也可能不同,有6 种可能,所以封锁这个格点需要 4x6=24 个保镖,封锁全部 6 个格点需要24x6=144 个保镖!
为什么保镖的数目增加了 6 倍?这是因为每一个保镖虚像可能来自房间中 6个位置中的任何一个。即如果我们固定一个保镖 \(G\) 并考虑所有和他平移等价的虚像集合 \(X\),从刺客到某个 \(x\in X\) 的一条射线对应一个群元素 \(w_x\in\widetilde{A}_2\),\(w_x\) 将 \(x\) 映射回真实的房间。当 \(x\) 变化时,最终的位置 \(w_x\cdot x\) 有 6种不同的可能。所以保镖的数目要增加 6 倍。
在前面正三角形等情形中,所有 \(w_x\cdotx\) 对应的是真实房间中同一个位置。
利用仿射 Weyl 群的知识,我们可以给出答案背后更准确的解释。
正三角形、正方形、正六边形房间的共同之处,是房间的所有虚像可以密铺整个平面。关于房间墙壁的镜面反射生成的群是一个仿射Weyl 群 \(W\):
这两种情形下仿射 Weyl 群可以表示为一个有限二面体群 \(D_n\) 和一个格点群 \(L\) 的半直积:
在正方形的情形,\(\widetilde{A}_1\times\widetilde{A}_1\congD_2\rtimes\mathbb{Z}^2\)。\(D_2\) 是两个夹角为 90 度的镜面生成的 4阶二面体群,也叫做 Klein 群。假设房间是单位正方形,则格点群 \(L=\mathbb{Z}^2\)对应所有房间的顶点,它们到所有镜子的距离都是整数。
在正三角形和正六边形的情形,\(\widetilde{A}_2\cong D_3\rtimesL(\Phi^\vee)\)。\(D_3\)是正三角的对称群,格点群 \(L(\Phi^\vee)\) 是一个记号 (corootlattice),表示所有正三角形的顶点。假设所有平行线间距是 1的话,这些点到所有镜面的距离都是整数。
假设真实房间的对称中心位于原点。任何虚像房间可以按照如下方式得到:首先将有限Weyl群作用在真实房间上,把房间原地反射或者旋转一下,然后用格点中的元素平移过去。由于\(D_2\) 和 \(D_3\) 分别是 4 阶 和 6阶群,所以虚像可以分成 4 个或者 6 个格点。
在正四边形或者正三角形的情形,所有房间与 \(W\)的群元素是一一对应的。但是在正六边形的情形,群元素和房间是 6 对 1的关系:任何 \(D_3\)中的元素作用在真实房间上都保持真实房间不变(非恒等元会变动房间中的点)。然后有一个唯一的平移将它们的中心重合。刺客与保镖虚像之间的连线给出的群元素\(w\) 在分解为 \(D_3\) 和 \(L\) 中元素的乘积时,任何 \(D_3\) 中的元素都会出现,所以保镖有 6个可能的真实位置。
]]>The English version of this doc is here.
本文介绍我写的一个高颜值的、脱离了低级趣味的小程序:用 Python 和POV-Ray 绘制各种三维多面体和四维多胞体,代码在 Github上。
以下是用这个程序渲染的一些例子,其中不同颜色的顶点/边/面表示它们在对称群的作用下位于不同的轨道中,具体解释见后。
所有的 Platonic 多面体,Archimedean 多面体,比如 snubdodecahedron:
所有的 Kepler-Poinsot 多面体,比如 great icosahedron:
所有的四维均匀多胞体 (除去一个特例 The grandantiprism),比如我的 Github 头像 (runcinated 120-cell):
截断的四维正方体 truncated tesseract:
4d cube:
也可以是非凸的,比如星状正多胞体中的 grand stellated120-cell:
甚至是 5 维欧氏空间中的均匀多胞体,如 5-cube:
等等等等,可玩的效果是非常非常多的。
以上这些都是在 Python中做好计算以后,将多胞体的顶点、边、面的数据导出到 POV-Ray中渲染得到的。你完全可以通过自己改写代码中的 POV-Ray的部分来渲染得出不同的效果,当然前提是需要掌握 POV-Ray的场景描述语言,不过这属于另一段故事,就不在本文的讨论范围内了。
下面介绍程序背后的数学原理。
这些图都是三维或者四维欧氏空间中凸/非凸的均匀多胞体(polytope),三维的情形更常用的称呼是多面体。这里有几个关键词需要注意:凸/非凸、均匀。
凸比较好理解,就是指多胞体上任意两点间的连线仍然属于此多胞体,否则就是非凸。上面的例子中Platonic 多面体、Archimedean 多面体、Catalan多面体一律都是凸的,Kepler-Poinsot 多面体、星状正多胞体都是非凸的。
均匀这个词就不太好理解了。简单说就是:多胞体的所有顶点都一样,且每个面都是正多边形,每个胞腔都是三维的均匀多面体(这是个递归的定义)。
要准确解释什么叫所有顶点都一样,就要用到群论的语言:一个多胞体 \(P\) 的对称群 \(G\)是欧氏空间中一组正交变换构成的有限群,\(G\) 作用在 \(P\) 上保持 \(P\) 不变。所有顶点都一样的严格说法是 \(G\) 传递地作用在 \(P\) 的顶点集上,即对 \(P\) 的任何两个顶点 \(u,v\),都存在 \(g\in G\),\(g\) 把顶点 \(u\) 映射为顶点 \(v\)。
这些多胞体看起来样子大不相同,但它们都可以用同一种方法计算出来,叫做Wythoff构造法,也称万花筒构造法。这个构造法的原理跟我们小时候玩的万花筒的原理是一样的:在空间中放置若干过原点的反射平面(镜子),镜面之间的夹角是精心设计好的,都形如 \(\pi-\pi/p\),其中 \(p\) 为有理数。在空间中选定一个初始顶点\(v_0\),将 \(v_0\)关于这些镜子反复作反射变换,得到的全部镜像就是多胞体的顶点。如果 \(v_0\) 关于第 \(i\) 面镜子反射后得到的镜像是 \(v_1\),则 \((v_0,v_1)\) 构成一条类型为 \(i\)的边,我们把它以及在对称群作用下同轨道的所有边都染成 \(i\) 号色。如果 \(v_0\) 先关于镜面 \(i\) 作反射,再关于镜面 \(j\)作反射,则由于两个反射变换的复合是一个旋转变换,\(v_0\)实际上是绕着某个面的中心和原点的连线作了一次旋转,旋转的角度为 \(2\pi/m\) (假设镜面 \(i\) 和镜面 \(j\) 的法向量夹角是 \(\pi-\pi/m\)),重复此旋转 \(m\) 次即可得到多胞体的一个类型为 \((i,j)\)的面,我们把它在对称群作用下同轨道的所有面都染成同一颜色。
这里的关键问题有两个:
第一个问题的答案叫做 Coxeter-Dynkin图,Coxeter-Dynkin图是一个带标记信息的无向图,它编码了多胞体的全部信息,即只要知道了多胞体对应的Coxeter-Dynkin 图,就可以求出该多胞体的所有数据(仅缩放大小和在空间中的摆放位置除外)。每个均匀多胞体都有一个Coxeter-Dynkin 图与之对应,但是不同的 Coxeter-Dynkin图可能描述的是相同的多胞体。
比如正方体的 Coxeter-Dynkin 图为:
我们来解释这个图的含义:
在一个 Coxeter-Dynkin图中,每个顶点代表一面镜子,在上图中有三个顶点,所以有三面镜子。将这三面镜子从左到右依次记作\(m_0, m_1,m_2\),顶点之间的边记录了镜子间的夹角:
此外用圈出的镜面来标记初始顶点的位置,一个镜面被圈出当且仅当初始顶点不在这个镜面上。
从而在正方形的情形 \(\langlem_0,m_1\rangle=\pi-\pi/4\),\(\langlem_1,m_2\rangle=\pi-\pi/3\),\(\langlem_0,m_2\rangle=\pi/2\)。初始顶点落在 \(m_1\) 和 \(m_2\) 上但是不属于 \(m_0\)。
于是这三面镜子可以这样摆放:
要选择一个落在 \(m_1\) 和 \(m_2\) 上但是不落在 \(m_0\) 上的初始点 \(v_0\),我们可以让 \(v_0\) 到平面 \(m_1\) 和 \(m_2\) 的距离为 0,到平面 \(m_0\) 的距离为 1,即
\[\langle v_0, n_0\rangle=1,\quad \langlev_0, n_1\rangle=0,\quad\langle v_0, n_2\rangle=0.\]
求解这个线性方程组即可。
我们前面提到过,要使得初始顶点的所有镜像恰好构成一个均匀多胞体,镜子之间的夹角必须精心设置,这实际上只有有限种可能。换句话说只有有限几种Coxeter-Dynkin 图可以给出 3D/4D 的均匀多胞体。在 维基百科上完整的列出了每种均匀多胞体对应的 Coxeter-Dynkin图,这里就不再专门列举了,但是特别指出两点:
第二个问题的答案叫做 Todd-Coxeter算法,展开讲的话比较复杂,我们单列一节专门谈谈。
怎样求出初始顶点在所有镜子中的镜像?有个简单的办法:只要反复地将初始顶点关于每个镜面作反射,算出得到的镜像点的坐标,并与之前得到的点的坐标相比较(浮点数比较需要在一定的误差范围内考虑),直到不再有新的镜像点出现为止,不就得到全部顶点集吗?这个方法确实可行,但是既笨又丑陋:它完全没有用到多胞体具有对称性这一事实!
这个程序采用的是基于符号计算的途径,这个方法可以精准地得出所有顶点/边/面的信息,代价就是涉及的数学略复杂,需要读者学过抽象代数中群论的知识。我们先回忆一下群在集合上的作用的轨道—稳定化子定理:
轨道—稳定化子定理:设群 \(G\) 传递地作用在集合 \(S\) 上,\(x\inS\),\(x\) 的稳定化子群是 \(H\)。则集合 \(S\) 与 \(G/H\) 中的右陪集之间有一一对应:\(Hg\to x\cdot g\)。
注意:和一般的约定不同,这里群在集合上的作用为作用在右边,主要是为了编程方便,实际上左边右边都一样。
这个定理告诉我们,如果群 \(G\)传递地作用在一个集合 \(S\) 上,而且对\(S\) 中某个元素 \(x\) 我们知道了它的稳定化子群 \(H\),则只要对 \(G/H\) 的每个陪集代表元 \(g\),将 \(g\) 作用在 \(x\) 上就可以得到整个 \(S\)。
于是给定一个均匀多胞体 \(P\),要求出其全部顶点集合,我们只要:
我们仍然以正方体为例来讲解:回忆正方体的 Coxeter-Dynkin 图为
仍然记三个镜面为 \(m_0,m_1,m_2\),其法向量分别为 \(n_0,n_1,n_2\),设 \(\rho_0,\rho_1,\rho_2\)分别是关于它们的反射变换,\(\rho_i\)对应的矩阵为 \(M_i=I-2n_in_i^T\)(见 Householder变换)。
正方体的对称群 \(G\) 由 \(\rho_0,\rho_1,\rho_2\)这三个基本反射生成,其表现为: \[G =\langle\rho_0,\rho_1,\rho_2\ |\\rho_0^2=\rho_1^2=\rho_2^2=(\rho_0\rho_1)^4=(\rho_1\rho_2)^3=(\rho_0\rho_2)^2=1\rangle.\]这是因为反射的平方总是恒等变换,所以 \(\rho_i^2=1\)。\(\rho_0,\rho_1\) 是两个夹角为 \(3\pi/4\) 的反射,所以 \(\rho_0\rho_1\) 是一个角度为 \(3\pi/2\) 的旋转,旋转轴为 \(m_0\) 和 \(m_1\) 的交线,从而 \((\rho_0\rho_1)^4=1\)。\(\rho_1\rho_2,\rho_0\rho_2\)的情形是类似的。1
利用 Todd-Coxeter 算法 (后面有解释) 不难求出这个群包含 48个元素,罗列如下: \[\begin{array}{lll}e&\rho_{0}&\rho_{0}\rho_{1}\\\rho_{0}\rho_{1}\rho_{0}&\rho_{0}\rho_{1}\rho_{0}\rho_{1}&\rho_{1}\rho_{0}\rho_{1}\\\rho_{1}\rho_{0}&\rho_{1}&\rho_{0}\rho_{2}\\\rho_{2}&\rho_{1}\rho_{2}&\rho_{1}\rho_{2}\rho_{1}\\\rho_{2}\rho_{1}&\rho_{0}\rho_{1}\rho_{2}&\rho_{0}\rho_{1}\rho_{2}\rho_{1}\\\rho_{0}\rho_{2}\rho_{1}&\rho_{0}\rho_{1}\rho_{0}\rho_{2}&\rho_{0}\rho_{1}\rho_{0}\rho_{1}\rho_{2}\\\rho_{0}\rho_{1}\rho_{0}\rho_{1}\rho_{2}\rho_{1}&\rho_{0}\rho_{1}\rho_{0}\rho_{2}\rho_{1}&\rho_{1}\rho_{0}\rho_{1}\rho_{2}\\\rho_{1}\rho_{0}\rho_{2}&\rho_{1}\rho_{0}\rho_{2}\rho_{1}&\rho_{1}\rho_{0}\rho_{1}\rho_{2}\rho_{1}\\\rho_{2}\rho_{1}\rho_{0}&\rho_{2}\rho_{1}\rho_{0}\rho_{1}&\rho_{0}\rho_{2}\rho_{1}\rho_{0}\rho_{1}\\\rho_{0}\rho_{2}\rho_{1}\rho_{0}&\rho_{1}\rho_{0}\rho_{2}\rho_{1}\rho_{0}&\rho_{1}\rho_{0}\rho_{2}\rho_{1}\rho_{0}\rho_{1}\\\rho_{1}\rho_{2}\rho_{1}\rho_{0}\rho_{1}&\rho_{1}\rho_{2}\rho_{1}\rho_{0}&\rho_{0}\rho_{1}\rho_{0}\rho_{2}\rho_{1}\rho_{0}\\\rho_{0}\rho_{1}\rho_{0}\rho_{2}\rho_{1}\rho_{0}\rho_{1}&\rho_{0}\rho_{1}\rho_{2}\rho_{1}\rho_{0}\rho_{1}&\rho_{0}\rho_{1}\rho_{2}\rho_{1}\rho_{0}\\\rho_{1}\rho_{0}\rho_{1}\rho_{2}\rho_{1}\rho_{0}&\rho_{1}\rho_{0}\rho_{1}\rho_{2}\rho_{1}\rho_{0}\rho_{1}&\rho_{0}\rho_{1}\rho_{0}\rho_{1}\rho_{2}\rho_{1}\rho_{0}\rho_{1}\\\rho_{0}\rho_{1}\rho_{0}\rho_{1}\rho_{2}\rho_{1}\rho_{0}&\rho_{2}\rho_{1}\rho_{0}\rho_{1}\rho_{2}&\rho_{1}\rho_{2}\rho_{1}\rho_{0}\rho_{1}\rho_{2}\\\rho_{0}\rho_{2}\rho_{1}\rho_{0}\rho_{1}\rho_{2}&\rho_{0}\rho_{1}\rho_{2}\rho_{1}\rho_{0}\rho_{1}\rho_{2}&\rho_{1}\rho_{0}\rho_{2}\rho_{1}\rho_{0}\rho_{1}\rho_{2}\\\rho_{1}\rho_{0}\rho_{1}\rho_{2}\rho_{1}\rho_{0}\rho_{1}\rho_{2}&\rho_{0}\rho_{1}\rho_{0}\rho_{2}\rho_{1}\rho_{0}\rho_{1}\rho_{2}&\rho_{0}\rho_{1}\rho_{0}\rho_{1}\rho_{2}\rho_{1}\rho_{0}\rho_{1}\rho_{2}\end{array}\] 由于在正方形的 Coxeter-Dynkin 图中只有镜面 \(m_0\) 是被圈出的,即初始顶点 \(v_0\) 落在 \(m_1\) 和 \(m_2\) 上,但不属于 \(m_0\),所以反射 \(\rho_1,\rho_2\) 保持 \(v_0\) 不动,\(\rho_0\) 将 \(v_0\) 映射为其关于 \(m_0\) 的镜像,所以 \(v_0\) 的稳定化子群是 2\[H=\langle \rho_1, \rho_2\ |\\rho_1^2=\rho_2^2=(\rho_1\rho_2)^3=e\rangle\] 显然 \(H\) 就是二面体群 \(D_3\),所以 \(|H|=6\),从而 \(|G/H|=8\)。利用 Todd-Coxeter算法可得其一组右陪集代表元为 \[\begin{array}{llll}e&\rho_{0}&\rho_{0}\rho_{1}&\rho_{0}\rho_{1}\rho_{0}\\\rho_{0}\rho_{1}\rho_{2}&\rho_{0}\rho_{1}\rho_{0}\rho_{2}&\rho_{0}\rho_{1}\rho_{0}\rho_{2}\rho_{1}&\rho_{0}\rho_{1}\rho_{0}\rho_{2}\rho_{1}\rho_{0}\end{array}\] 将它们作用在 \(v_0\)上即可得到正方体的 8 个顶点。例如 \(\rho_0\rho_1\) 作用在 \(v_0\) 上为 \[v_0(\rho_0\rho_1)=(v_0\rho_0)\rho_1=(v_0M_0)\rho_1=v_0M_0M_1.\]其中 \(v_0\) 写成行向量的形式,每个\(M_i\) 是对称矩阵。
计算边、面、胞腔的原理是类似的,但考虑的细节要多一些,比如我们想求出所有关于第\(i(i=0,1,2)\) 个镜面 \(m_i\) 反射生成的类型为 \(i\) 的边,可以这样做:
求面的情形复杂一些,基本原理是这样的:
总之关键的步骤都是给定群 \(G\)和某个子群 \(H\),求 \(G/H\) 的一组陪集代表元。
这里用到的算法叫做 Todd-Coxeter算法。
Todd-Coxeter算法在许多抽象代数或者群论的教材都有,用到的数学知识并不复杂。但完整描述并证明一份程序实现的细节还是很费功夫的,恐怕要好几页纸才能说清楚。限于篇幅,我这里仅用正方体的情形为例说明算法的步骤,具体的证明和更多的细节读者请参考
Handbook of Computational Group Theory, Holt, D., Eick, B., O'Brien,E.
中的 coset enumeration 一章。我个人认为这是讲解 Todd-Coxeter算法最棒的文献。
Todd-Coxeter 算法非常类似玩数独游戏,这里要填的表是一个变化的二维数组\(T\),\(T\) 的行 \(i\) 代表第 \(i\) 个右陪集,\(T\) 的列 \(j\) 代表第 \(j\) 个生成元 \(\rho_j\),\(T[i][j]\) 的值等于 \(\rho_j\) 右乘以第 \(i\)个陪集后得到的陪集。初始时,我们知道肯定有一个陪集,就是 \(H\)自身,还有没有其它的陪集我们不清楚。算法的主要流程就是根据 \(G\) 的生成关系和 \(H\)的生成字这些信息来发现新的陪集并填入表中,直到无法找到新的陪集为止。最终得到的\(T\) 实际上是 \(G/H\) 的 schreier 图的邻接矩阵,它记录了\(G/H\) 中的陪集之间的乘法关系,由\(T\) 出发我们很容易求出这些陪集的 word表示。
例子:设 \(G\)是正方体的对称群,其表现为 \[\begin{align*}G = \langle\rho_0,\rho_1,\rho_2\ |\\rho_0^2&=\rho_1^2=\rho_2^2=(\rho_0\rho_1)^4=(\rho_1\rho_2)^3\\&=(\rho_0\rho_2)^2=1\rangle.\end{align*}\] 子群 \(H=\langle \rho_1, \rho_2\rangle\)是初始顶点的稳定化子群,求 \(G/H\)的一组右陪集代表元。
我们先罗列一下这个数独游戏已知的关系:
已知关系:
- 对 \(H\) 的任何生成字 \(w\) 有 \(H\cdotw=H\),即 \(H\rho_1=H\rho_2=H\)。注意此关系仅要求对\(H\) 成立。
- 对任何陪集 \(K\) 和 \(G\) 的任何生成关系 \(r\) 有 \(K\cdotr=K\),即 \(K\rho_i^2=K,i=0,1,2\) 以及 \(K(\rho_0\rho_1)^4=K(\rho_1\rho_2)^3=K(\rho_0\rho_2)^2=K\)。注意此关系要求对所有陪集成立。
这些关系可以存储在两个列表里面,每个关系用一个数组表示。
第一个列表存储的是 \(H\)的生成字,即
\(H\)的生成字列表:
- (1,)
- (2,)
第二个列表存储的是 \(G\)的生成关系,即
\(G\)的生成关系列表:
- (0, 0)
- (1, 1)
- (2, 2)
- (0, 1, 0, 1, 0, 1, 0, 1)
- (1, 2, 1, 2, 1, 2)
- (0, 2, 0, 2)
其中每条关系前面的数字是我们加上的编号以便于称呼。
注:在非 Coxeter 群的情形还要把每个生成元的逆也作为生成元加入,其在\(T\) 中也占据一列,所以实际上 \(T\) 的列的个数要 \(\times2\)。但是在 Coxeter群的情形每个生成元是 2阶的,其逆元素等于自身,所以不需要额外考虑逆元素。
初始时刻表格 \(T\) 是这样的:
\(\rho_0\) | \(\rho_1\) | \(\rho_2\) | |
---|---|---|---|
\(H_0\) | \(\phantom{}\) | \(\phantom{}\) | \(\phantom{}\) |
其中 \(H_0\) 代表 \(H\) 对应的陪集。程序首先验证 \(H_0\) 所在的行满足第一个关系列表 (\(H\)的生成字列表,随后此列表可以被丢弃),然后依次从上到下扫描 \(T\) 的每一行,假设当前扫描的是第 \(i\) 行,对应的陪集为 \(H_i\),程序验证确保对第二个列表 (\(G\) 的生成关系列表) 中的每条关系 \(w\),\(H_i\) 满足 \(H_iw=H_i\),这个过程中可能发现新的陪集,也可能发现已有的某些陪集是重复的,也有可能需要强行定义新的陪集来使得这个验证能够完成。
我们来开始扫描 \(H_0\)所在的行:首先检查第一个列表中的关系,这个列表仅在扫描 \(H_0\)时使用一次,扫描完就可以丢弃。
(1). 对第 0 条关系 \(H_0\rho_1=H_0\),即 \(T[0][1]=0\)。对第 1 条关系 \(H_0\rho_2=H_0\),即 \(T[0][2]=0\),这时 \(T\) 变成了
\(\rho_0\) | \(\rho_1\) | \(\rho_2\) | |
---|---|---|---|
\(H_0\) | \(\phantom{}\) | 0 | 0 |
第一个列表扫描完毕,接下来扫描第二个列表。
(2). 对第 2 条关系 \(H_0\rho_0^2=H_0\),由于 \(H_0\rho_0\) 还不知道,我们将其定义为新陪集\(H_1\) 并将 1 填入 \(T[0][0]\) 位置,此外还要为 \(H_1\) 开辟新的一行:
\(\rho_0\) | \(\rho_1\) | \(\rho_2\) | |
---|---|---|---|
\(H_0\) | 1 | 0 | 0 |
\(H_1\) | 0 | \(\phantom{}\) | \(\phantom{}\) |
注意每次定义新陪集时,比如将 \(H_i\rho_j\) 定义为 \(H_k\),我们同时自动得到了 \(H_k\rho_j=H_i\rho_j^2=H_i\),因此每次填表时我们都填写一对数字而不是一个,这样可以保证表格\(T\) 的 "对称性"。
(3). 第 3 条和第 4 条关系已经满足,继续。
(4). 第 5 条关系,\(H_0\rho_0\rho_1\rho_0\rho_1\rho_0\rho_1\rho_0\rho_1=H_0\),我们已经知道\(H_0\rho_0=H_1\) 但是 \(H_1\rho_1\) 还不知道,将其定义为 \(H_2\),于是 \(T\) 中又添两项,并开辟新的一行给 \(H_2\):
\(\phantom{}\) | \(\rho_0\) | \(\rho_1\) | \(\rho_2\) |
---|---|---|---|
\(H_0\) | 1 | 0 | 0 |
\(H_1\) | 0 | 2 | \(\phantom{}\) |
\(H_2\) | \(\phantom{}\) | 1 | \(\phantom{}\) |
但是 \(H_2\rho_0\)还是不知道,所以继续定义 \(H_2\rho_0=H_3\),于是 \(T\) 变成
\(\rho_0\) | \(\rho_1\) | \(\rho_2\) | |
---|---|---|---|
\(H_0\) | 1 | 0 | 0 |
\(H_1\) | 0 | 2 | \(\phantom{}\) |
\(H_2\) | 3 | 1 | \(\phantom{}\) |
\(H_3\) | 2 | \(\phantom{}\) | \(\phantom{}\) |
但是 \(H_3\rho_1\)还是不知道,你可能会想把它继续定义为新的陪集 \(H_4\),然后继续扫描。这样做不是不可以,但是每次都定义新陪集会生成大量重复的陪集,导致\(T\)增长的非常快,对更复杂的群非常耗费计算资源。我们采用更聪明的办法:倒着扫描整个关系,即从右到左扫描\(H_0\rho_0\rho_1\rho_0\rho_1\rho_0\rho_1\rho_0\rho_1=H_0\)这条关系。记住我们现在已经正向 (从左到右) 扫描到了下面的位置: \[(H_0\rho_0\rho_1\rho_0=H_3)\rho_1\rho_0\rho_1\rho_0\rho_1=H_0.\]反向扫描的话很容易看出 \(H_0\rho_1\rho_0\rho_1\rho_0=H_3\),即 \[(H_0\rho_0\rho_1\rho_0=H_3)\rho_1=H_0\rho_1\rho_0\rho_1\rho_0=H_3.\] 从而 \(H_3\rho_1=H_3\)。这样通过反向扫描我们就推断出了\(H_3\rho_1\)的值,避免了定义冗余的陪集。按照 Holt 书中的说法这叫做一个deduction。这时 \(T\) 为
\(\rho_0\) | \(\rho_1\) | \(\rho_2\) | |
---|---|---|---|
\(H_0\) | 1 | 0 | 0 |
\(H_1\) | 0 | 2 | \(\phantom{}\) |
\(H_2\) | 3 | 1 | \(\phantom{}\) |
\(H_3\) | 2 | 3 | \(\phantom{}\) |
在实际的程序实现中,我们总是从关系的两头同时开始扫描,直到它们相遇为止。
(5). 关系 6 已经满足,继续。
(6). 对关系 7 \(H_0\rho_0\rho_2\rho_0\rho_2=H_0\),从两头扫描我们得到\[(H_0\rho_0=H_1)\rho_2=H_0\rho_2\rho_0=H_1,\]即 \(H_1\rho_2=H_1\),我们又得到了一个deduction,从而 \(T\) 变成
\(\rho_0\) | \(\rho_1\) | \(\rho_2\) | |
---|---|---|---|
\(H_0\) | 1 | 0 | 0 |
\(H_1\) | 0 | 2 | 1 |
\(H_2\) | 3 | 1 | \(\phantom{}\) |
\(H_3\) | 2 | 3 | \(\phantom{}\) |
至此对 \(H_0\)的扫描全部完成,我们转入扫描 \(H_1\)所在的行。
注意:从现在起至程序结束,我们不再使用第一个列表。
下面开始扫描 \(H_1\) 所在的行。
(1). 经检查关系 2, 3, 4, 5 已经满足,继续。
(2). 对关系 6 有 \(H_1\rho_1\rho_2\rho_1\rho_2\rho_1\rho_2=H_1\),其中\(H_1\rho_1=H_2\) 已知但 \(H_2\rho_2\) 未知。反向的扫描也会卡在这里:\[(H_1\rho_1=H_2)\rho_2\rho_1=H_1\rho_2\rho_1\rho_2=H_2\rho_2.\]所以我们定义新陪集 \(H_2\rho_2=H_4\),于是 \(H_4\rho_1=H_4\),从而此时 \(T\) 为
\(\rho_0\) | \(\rho_1\) | \(\rho_2\) | |
---|---|---|---|
\(H_0\) | 1 | 0 | 0 |
\(H_1\) | 0 | 2 | 1 |
\(H_2\) | 3 | 1 | 4 |
\(H_3\) | 2 | 3 | \(\phantom{}\) |
\(H_4\) | \(\phantom{}\) | 4 | 2 |
(3). 关系 7 已经满足,从而 \(H_1\)检查完毕,接下来开始扫描 \(H_2\)的行。
下面开始扫描 \(H_2\) 的行。
(1). 经检查关系 2, 3, 4, 5, 6 都已经满足,继续。
(2). 对关系 7 有 \(H_2\rho_0\rho_2\rho_0\rho_2=H_2\),两边同时扫描的结果为:\[(H_2\rho_0=H_3)\rho_2\rho_0=H_2\rho_2=H_4.\]即 \(H_3\rho_2\rho_0=H_4\),但是继续正向扫描\(H_3\rho_2\) 不知道,继续反向扫描\(H_4\rho_0\) 不知道。定义新陪集 \(H_3\rho_2=H_5\),于是 \(H_5\rho_0=H_4\),我们又可以填入两对 4个数字,此时 \(T\) 为:
\(\rho_0\) | \(\rho_1\) | \(\rho_2\) | |
---|---|---|---|
\(H_0\) | 1 | 0 | 0 |
\(H_1\) | 0 | 2 | 1 |
\(H_2\) | 3 | 1 | 4 |
\(H_3\) | 2 | 3 | 5 |
\(H_4\) | 5 | 4 | 2 |
\(H_5\) | 4 | \(\phantom{}\) | 3 |
\(H_2\) 扫描完毕,下面扫描 \(H_3\) 的行。
我把 \(H_3, H_4, H_5\)的扫描过程留给你作为练习,\(H_3\)扫描结束后你得到的 \(T\)应该如下图:
\(\rho_0\) | \(\rho_1\) | \(\rho_2\) | |
---|---|---|---|
\(H_0\) | 1 | 0 | 0 |
\(H_1\) | 0 | 2 | 1 |
\(H_2\) | 3 | 1 | 4 |
\(H_3\) | 2 | 3 | 5 |
\(H_4\) | 5 | 4 | 2 |
\(H_5\) | 4 | 6 | 3 |
\(H_6\) | \(\phantom{}\) | 5 | 6 |
\(H_4\) 扫描结束后你得到的 \(T\) 应该如下图:
\(\rho_0\) | \(\rho_1\) | \(\rho_2\) | |
---|---|---|---|
\(H_0\) | 1 | 0 | 0 |
\(H_1\) | 0 | 2 | 1 |
\(H_2\) | 3 | 1 | 4 |
\(H_3\) | 2 | 3 | 5 |
\(H_4\) | 5 | 4 | 2 |
\(H_5\) | 4 | 6 | 3 |
\(H_6\) | 7 | 5 | 6 |
\(H_7\) | 6 | 7 | \(\phantom{}\) |
\(H_5\) 的扫描给不出新的信息。
扫描 \(H_6\) 时,关系 2, 3, 4, 5, 6都已经满足,由关系 7 \(H_6\rho_0\rho_2\rho_0\rho_2=H_6\) 可得deduction \(H_7\rho_2=H_7\),于是 \(T\) 可以补全为
\(\rho_0\) | \(\rho_1\) | \(\rho_2\) | |
---|---|---|---|
\(H_0\) | 1 | 0 | 0 |
\(H_1\) | 0 | 2 | 1 |
\(H_2\) | 3 | 1 | 4 |
\(H_3\) | 2 | 3 | 5 |
\(H_4\) | 5 | 4 | 2 |
\(H_5\) | 4 | 6 | 3 |
\(H_6\) | 7 | 5 | 6 |
\(H_7\) | 6 | 7 | 7 |
扫描 \(H_7\)发现所有关系都已经满足。
至此 \(T\)的空白位置都已经填满,没有新的陪集可以发现,数独游戏结束,这时得到的\(T\) 就是 \(G/H\) 的最终乘法表。
由此利用宽度优先搜索不难得出陪集间的关系为: \[\begin{array}{l}H_0 = H_0\cdot e,\\H_1=H_0\cdot\rho_0,\\H_2=H_1\rho_1=H_0\cdot\rho_0\rho_1,\\H_3=H_2\cdot\rho_0=H_0\cdot\rho_0\rho_1\rho_0,\\H_4=H_2\cdot\rho_2=H_0\cdot\rho_0\rho_1\rho_2,\\H_5=H_3\cdot\rho_2=H_0\cdot \rho_0\rho_1\rho_0\rho_2,\\H_6=H_5\cdot\rho_1=H_0\cdot \rho_0\rho_1\rho_0\rho_2\rho_1,\\H_7=H_6\cdot\rho_0=H_0\cdot\rho_0\rho_1\rho_0\rho_2\rho_1\rho_0.\end{array}\]
从而其一组陪集代表元可以选为 \[\begin{array}{llll}e&\rho_{0}&\rho_{0}\rho_{1}&\rho_{0}\rho_{1}\rho_{0}\\\rho_{0}\rho_{1}\rho_{2}&\rho_{0}\rho_{1}\rho_{0}\rho_{2}&\rho_{0}\rho_{1}\rho_{0}\rho_{2}\rho_{1}&\rho_{0}\rho_{1}\rho_{0}\rho_{2}\rho_{1}\rho_{0}\end{array}\]
这正是我们前面看到过的。
注意:这个例子看似有点长,但还是一个比较简单的例子,其中并没有出现已知陪集重复的情形(Holt的书中称之为coincidence)。这种情形的处理麻烦一些,因为一旦出现重复的陪集,就有可能顺藤摸瓜找到更多重复的陪集。这时就要立刻暂停扫描,流程跳转到处理coincidence:开辟一个栈来存放已知的coincidence,每次弹出一对,将它们合并,然后把新发现的 coincidence压入栈中。
星状多胞体也可以使用 Wythoff构造法来生成,但是直接套用上面的方法一般是行不通的,我们需要在生成元中加入额外的生成关系。
这里以 Greatdodecahedron 为例来说明:其 Coxeter-Dynkin 图为
于是三面镜子的法向量夹角分别为 \(\pi-2\pi/5, \pi/2,\pi-\pi/5\)。如果我们仍然沿用以前的分析,会得出其对称群的表现为\[\begin{align*}K = \langle\tau_0,\tau_1,\tau_2 \|\ &\tau_0^2=\tau_1^2=\tau_2^2=(\tau_0\tau_1)^5=(\tau_1\tau_2)^5=\\&(\tau_0\tau_2)^2=1\rangle.\end{align*}\]
这是一个无限群,而且顶点的稳定化子的商群也是无限的,所以还想按以前的方法计算就行不通了。
实际上我们只要在生成关系中再加上一条 \((\tau_0\tau_1\tau_2\tau_1)^3=1\)即可,即对称群的表现为
\[\begin{align*}K = \langle\tau_0,\tau_1,\tau_2 \|\ &\tau_0^2=\tau_1^2=\tau_2^2=(\tau_0\tau_1)^5=(\tau_1\tau_2)^5=\\&(\tau_0\tau_2)^2=(\tau_0\tau_1\tau_2\tau_1)^3=1\rangle.\end{align*}\]
注意到我使用了字母 \(\tau\)来表示反射,\(K\) 表示 Greatdodecahedron的对称群,这个记号选择是有意的。这是怎么回事呢?先看视频:
由视频可见,Great dodecahedron 与正二十面体 (icosahedron)共用相同的顶点,并且看起来 Great dodecahedron 可以通过在 icosahedron表面挖一些三角形的洞得到。这个结论也可以推广:一般地如果星状多面体的洞是一个有\(h\)条边的多边形,则对应的额外生成关系就是 \((\tau_0\tau_1\tau_2\tau_1)^h=1\)。
在上图中,\(\Delta ABC\)是正二十面体的基本区域,三个内角分别是 \(\angle CAB=\pi/5\),\(\angle CBA=\pi/2\),\(\angle ACB=\pi/3\),\(\rho_0,\rho_1,\rho_2\) 分别是关于弧 \(BC, AC, AB\)的反射。正二十面体的对称群的表现为 \[G =\langle\rho_0,\rho_1,\rho_2\ |\\rho_0^2=\rho_1^2=\rho_2^2=(\rho_0\rho_1)^3=(\rho_1\rho_2)^5=(\rho_0\rho_2)^2=1\rangle.\]
Great dodecahedron 可以这样得到:沿着正二十面体的边从顶点 \(Q\) 走到 \(A\),右手边的面是三角形 \(\Delta OAQ\),接下来的第一条边应该是 \(AO\),我们跳过这条边,选择第二条边 \(AK\),到达 \(K\) 后继续选择右手边的第二条边,这样绕着\(O\) 一圈下来共经过 5条边,它们正好围成 Great dodecahedron的一个面。对正二十面体的其它边也如此操作会得到 Great dodecahedron其它的面。
像这样对一个多面体,保持它的顶点和边的集合不变,但是每次选择右手边的第\(k\)个边走下去绕一圈获得一个面,这样构造新多面体的方法叫做 Facetting手术。在我们这个项目中 \(k\)总是等于 2。
我们来导出正二十面体的对称群 \(G\)和 Great dodecahedron 的对称群 \(K\)之间的关系。
来看三角形 \(\DeltaOAB\),它的三个内角分别是 \(\angleOAB=2\pi/5\),\(\angleOBA=\pi/2\),\(\angleAOB=\pi/5\),它包含三个与 \(\DeltaABC\) 全等的三角形,关于其三条边 \(OA,OB,AB\) 的反射分别是 \(\tau_1=\rho_1\rho_2\rho_1,\tau_0=\rho_0,\tau_2=\rho_2\)5。
Facetting 操作 \(\varphi_k\)用群的语言来描述就是(记住 \(k=2\))\[G=\langle\rho_0,\rho_1,\rho_2\rangle\xrightarrow{\ \varphi_k\}\langle\rho_0,\rho_1(\rho_2\rho_1)^{k-1},\rho_2\rangle=\langle\tau_0,\tau_1,\tau_2\rangle=K.\]一般来说 \(K\) 是 \(G\) 的子群,但在这里 \(G\) 和 \(K\) 就是同一个群。我们不解释为什么 \(G=K\),我们这里承认这一点,然后借助这个事实来说明\(K\) 就是 Great dodecahedron的对称群。
首先 \(\langle \tau_1,\tau_2\rangle=\langle\rho_1,\rho_2\rangle\) 是顶点 \(A\) 的稳定化子群,所以 Great dodecahedron和正二十面体的顶点集是一样的。但 \(\tau_1\tau_2\) 是一个角度为 144度的旋转,这一点和 \(\rho_1\rho_2\)是一个 72 度的旋转不同,所以 Great dodecahedron 的 vertex configure是一个五角星,而不像正二十面体那样是一个五边形。
其次 \(\langle\tau_0,\tau_2\rangle=\langle\rho_0,\rho_2\rangle\)为边 \(AQ\) 的稳定化子群,所以 Greatdodecahedron 的边集和正二十面体也是一样的。
它俩的区别在于边组成面的方式不一样。\(\langle\tau_0,\tau_1\rangle\) 是 Greatdodecahedron 面的稳定化子群,注意到 \(\tau_1\) 是关于 \(AO\) 的反射,它会把 \(AQ\) 映射为 \(AK\),这正对应选择第 \(k\) 条边的操作。\(\tau_0\tau_1\) 是一个绕着顶点 \(O\) 的角度为 \(2\pi/5\) 的旋转,所以 \(AQ\) 在子群 \(\langle \tau_0,\tau_1\rangle\) 作用下会绕\(O\) 转一圈,正对应 Facetting操作得到的一个面。
我们来找出 \(\tau_0,\tau_1,\tau_2\)之间隐藏的一条生成关系:
注意到 \(\tau_1\tau_2\tau_1=\tau_1\rho_2\tau_1\)是关于 \(AP\) 的反射,它和 \(\tau_0=\rho_0\) 的复合是绕着 \(P\) 点角度为 \(2\pi/3\) 的旋转,所以 \((\tau_0\tau_1\tau_2\tau_1)^3=1\)。加入这个额外的生成关系得到的就是\(K\) 的正确的表现: \[\begin{align*}K = \langle\tau_0,\tau_1,\tau_2 \|\ &\tau_0^2=\tau_1^2=\tau_2^2=(\tau_0\tau_1)^5=(\tau_1\tau_2)^5=\\&(\tau_0\tau_2)^2=(\tau_0\tau_1\tau_2\tau_1)^3=1\rangle.\end{align*}\]
所以我们就可以对 \(K\)照搬之前的绘制步骤了。
这个额外的生成关系其实也有背后的解释:对 Faceting手术得到的新多面体再进行一次 Faceting 手术是可以回到原来的多面体的。对great dodecahedron每次沿着它的边,选择当前离开的边的右手第二个边走下去,即从 \(Q\) 走到 \(A\) 时,不是选择 \(AK\) 继续走下去,而是选择 \(AO\),这样走下去又会得到正二十面体的三角形的面,这对应的就是额外的生成关系中的指数3。
这一点从群上也可以得到验证。
\[K=\langle\tau_0,\tau_1,\tau_2\rangle\xrightarrow{\ \varphi_2\}\langle\tau_0,\tau_1\tau_2\tau_1,\tau_2\rangle=\langle\rho_0,\rho_2\rho_1\rho_2,\rho_2\rangle=G.\]
关于 Faceting 手术可以在 McMullen 和 Schulte 所著的 Abstract RegularPolytopes 一书中找到。
如果你理解了上面的内容,snub 多面体的情形也是不难理解的。我以 snubcube 来说明:
Snub cube 和 cube 的区别在于它的对称群只包含旋转,我们已经看到 cube的对称群 \(G\) 的表现为 \[G = \langle\rho_0,\rho_1,\rho_2\ |\\rho_0^2=\rho_1^2=\rho_2^2=(\rho_0\rho_1)^4=(\rho_1\rho_2)^3=(\rho_0\rho_2)^2=1\rangle.\]它有 48 个元素,其中 24 个是旋转。这些旋转可以由 \(r_0=\rho_0\rho_1,r_1=\rho_1\rho_2,r_2=\rho_0\rho_2\) 生成 (由于 \(r_0r_1=r_2\) 因此实际上可以由 \(r_0\) 和 \(r_1\) 生成)。这 24 个旋转就构成了 Snubcube 的对称群 \(\widetilde{G}\)。
不难写出 \(\widetilde{G}\) 的表现为\[\widetilde{G}=\langle r_0,r_1\ |\r_0^4=r_1^3=(r_0r_1)^2=1\rangle.\]
利用 Todd-Coxeter 算法不难求出这个群的所有 24 个元素:
\[\begin{array}{lll}e&r_{0}&r_{0}r_{0}\\r_{0}r_{0}r_{0}&r_{1}&r_{1}r_{1}\\r_{0}r_{1}&r_{0}r_{1}r_{1}&r_{0}r_{0}r_{1}\\r_{0}r_{0}r_{1}r_{1}&r_{0}r_{0}r_{0}r_{1}&r_{1}r_{0}\\r_{1}r_{0}r_{0}&r_{1}r_{0}r_{0}r_{0}&r_{1}r_{1}r_{0}\\r_{1}r_{1}r_{0}r_{0}&r_{0}r_{1}r_{1}r_{0}&r_{0}r_{1}r_{1}r_{0}r_{0}\\r_{0}r_{0}r_{1}r_{1}r_{0}&r_{1}r_{0}r_{0}r_{1}&r_{1}r_{0}r_{0}r_{1}r_{1}\\r_{1}r_{0}r_{0}r_{0}r_{1}&r_{1}r_{1}r_{0}r_{0}r_{1}&r_{0}r_{1}r_{1}r_{0}r_{0}r_{1}\end{array}\]
注意在 snub 的情形初始顶点 \(v_0\)总不属于任何镜面,所以其稳定化子群只有单位元 1,即每个 \(g\in\widetilde{G}\) 把 \(v_0\) 变换为不同的顶点。将它们作用在初始点\(v_0\) 上即得 snub cube的所有顶点。
我们现在利用轨道—稳定化子的理论来求 snub cube 的边。snub cube的边也是分类型的,每个 \(r_i(i=0,1,2)\)作用在 \(v_0\) 上可得一个类型为 \(i\) 的边 \(e_i=(v_0, v_0\cdot r_i)\) 6,我们来定出 \(e_i\) 的稳定化子群 \(H\):
首先注意到任何 \(g\in G\) 如果保持\(e_i\)不变,则只有两种可能,要么它保持 \(e_i\) 上每个点不变,要么它将 \(e_i\) 关于其中点进行翻转。这一点对 \(g\in\widetilde{G}\) 自然也成立。所以若\(g\in\widetilde{G}\) 保持 \(e_i\) 不变,则要么 \(v_0g = v_0, v_0r_i=v_0r_ig\),要么 \(v_0g = v_0r_i,v_0r_ig=v_0\)。前一种情形说明\(g\) 属于 \(v_0\)的稳定化子群从而只能是单位元;后一种情形说明 \(r_ig\) 和 \(r_ig^{-1}\) 都属于 \(v_0\) 的稳定化子群从而 \(r_ig=r_ig^{-1}=1\),即 \(g=r_i\) 且 \(r_i^2=1\)。总之我们证明了只有在 \(r_i^2=1\) 时 \(e_i\)才有非平凡的稳定化子群,这时稳定化子群是二阶循环群 \(\langle r_i\rangle\)。
于是 snub cube 的类型为 \(r_0\) 和\(r_1\) 的边的个数都是 24/1=24个;类型为 \(r_2\) 的边的个数为 24/2=12个,从而 snub cube 总共有 24+24+12=60 条边。
snub cube 的面可以这样求:由于 \(r_0^4=1\) 所以 \(r_0\) 可以生成一个正四边形的面,类似地由于\(r_1^3=1\) 所以 \(r_1\) 可以生成一个正三角形的面,而由于\(r_2^2=1\) 所以 \(r_2\)生成的面是退化的。这种由单个旋转生成的面的稳定化子群是很好求的:若 \(g\) 保持 \(r_i\) 生成的面不变,则其必然把某个形如\(v_0r_i^k\) 的顶点变换为 \(v_0\),即 \(g=r_i^{-k}\) 是 \(r_i\) 的某次幂,反之易见 \(r_i\)的任何幂都保持此面不变,所以其稳定化子群即为循环群 \(\langle r_i\rangle\)。
于是 \(r_0\) 生成的面的个数为24/4=6,\(r_1\) 生成的面的个数为24/3=8,\(r_2\)生成的面都退化因而个数是 0,总计 14 个面。
小心!我们还漏掉了一种三角面,它源自 \(r_0r_1=r_2\) 这个关系。考虑 \(\{v_0, v_0r_1, v_0r_2\}\)这三个顶点,这三个顶点中 \((v_0,v_0r_1)\) 构成一条类型为 \(r_1\) 的边, \((v_0,v_0r_2)\) 构成一条类型为 \(r_2\) 的边,而 \(r_0r_1=r_2\) 这个关系告诉我们 \[(v_0, v_0r_0)\xrightarrow{\ r_1\ }(v_0r_1,v_0r_0r_1) = (v_0r_1, v_0r_2).\] 即 \((v_0r_1, v_0r_2)\) 是一条类型为 \(r_0\) 的边,它是由将 \(r_1\) 作用在类型为 \(r_0\) 的初始边 \((v_0, v_0r_0)\) 上得到的,于是 \(\{v_0, v_0r_1, v_0r_2\}\)构成一个三角形的三个顶点,其三条边在对称群作用下属于不同的轨道,所以这个三角形的稳定化子必然保持每条边不变,从而只能是恒等元,从而这样的面有24/1=24 个。
于是 snub cube 一共有 14+24=38 个不同的面。
这里介绍的方法也适用于其它的 snub 多面体以及 snub 24-cell。
项目中还实现了一个draw_on_coxeter_plane(*args, **kwargs)
方法,用于绘制将多面体的顶点投影到其 Coxeter平面上后得到的图案,例如下图显示的是将 600-cell 的 120 个顶点投影到其Coxeter 平面上的结果:
你可以和 wikipedia上的效果 比较一下。
对简单的群,Todd-Coxeter 算法完全可以用手算快速得出结果。我非常推荐Borcherds 的视频,他的演示非常精彩:
仿照 Borcherds 的方法,前面正方形的例子可以很快写出来:
我来解释一下步骤:我们将画出一个有限图,图的每个顶点代表 \(H=\langle s_0,s_1\rangle\)的一个陪集,每个顶点有三条不同颜色的边,表示此陪集在生成元 \(s_i\) 作用下的结果。
1
开启/关闭 Möbius 变换。2
开启/关闭椭圆旋转。3
开启/关闭双曲缩放。4
开启/关闭展示 Riemann 球面。这几个按键可以组合出许多不同的效果来!
本文的想法源自 Roice Nelson 的 shadertoy项目,我觉得他的创意很棒,就是效果有点糙,于是 动手改进了一番。不懂的人看这个动画可能只是觉得好玩,其实它背后的数学并不简单。
这篇文章将用动画的形式从三个角度演示 Möbius变换,这三个角度是密切相关的:
本文只做演示,并不介绍详细的数学证明。读者可以参考下面的资料:
- 维基百科页面.
- Visual complex analysis, Tristan Needham.
- Indra'spearls, chapter 3.
- An introduction to complex function theory. Bruce P. Palka.Undergraduate texts in mathematics. chapter IX, section 2.
本文的动画应该可以帮助你更好地理解这些资料中的内容。
设 \(z_1,z_2\)是复平面上的两点,我们考虑两个不同的圆族 \(\mathcal{C}_1\) 和 \(\mathcal{C}_2\):
则圆族 \(\mathcal{C}_1\) 中的任何圆\(C_1\) 与 \(\mathcal{C}_2\) 中的任何圆 \(C_2\) 正交(交点处的切线互相垂直)。
我们将考察当 \(z_1,z_2\) 是一个Möbius 变换 \(M\) 的两个不动点时 \(M\) 作用在 \(\mathcal{C}_1\) 和 \(\mathcal{C}_2\) 上的效果。
一个 Möbius 变换 \(M\)是一个分式线性变换,它将扩充复平面 \(\hat{\mathbb{C}}\) 一对一地映射为自身:\[M(z) = \frac{az+b}{cz+d},\quada,b,c,d\in\mathbb{C},ad-bc\ne0, z\in \hat{\mathbb{C}}.\] 所有的Möbius 变换构成一个群 \({\rmPSL}_2(\mathbb{C})\)。
我们称两个 Möbius 变换 \(M_1,M_2\)是共轭的,当且仅当存在 \(g\in{\rmPSL}_2(\mathbb{C})\) 使得 \[M_1=gM_2g^{-1}.\]
可以证明在共轭的意义下,任何非恒等元的 Möbius变换都属于下面四种类型之一:
我们把形如 \(z\to z+a\) 和 \(z\to\lambda z\)的变换称作特殊位置的变换,前者是抛物型的,以无穷远点为唯一不动点,后者包含了所有非抛物型的变换,它的两个不动点是原点和无穷远点。这时的Möbius变换具有简单的表现形式,其在两个圆族上的作用也很容易分析,所以在研究每种类型的变换时,我们都先考虑这种简单的形式,然后再推广到一般的情形。
我们先考察最简单的抛物型变换 \(z\toz+1\)。
这时唯一的不动点是无穷远点,圆族 \(\mathcal{C}_1\) 由所有和 \(x\) 轴平行的直线组成,圆族 \(\mathcal{C}_2\) 由所有和 \(y\) 轴平行的直线组成,圆族 \(\mathcal{C}_1\) 和 \(\mathcal{C}_2\) 是正交的,\(M\) 保持 \(\mathcal{C}_1\) 中的每条直线不变,把 \(\mathcal{C}_2\)中的每条直线变成同族中的另一条直线:
所有点都向着不动点(无穷远点)的方向“前进”。
对一般的抛物型变换 \(M\) 且 \(M\) 的唯一不动点 \(z_0\) 有限的情形,结论仍然类似:圆族 \(\mathcal{C}_1\) 中的圆都在 \(z_0\) 处相切且共用同一条切线 \(\ell_1\),圆族 \(\mathcal{C}_2\) 也都在 \(z_0\) 处相切且共用同一条切线 \(\ell_2\),\(\ell_1\) 和 \(\ell_2\) 互相垂直:
由动画可见左右两侧的圆在旋转,但是圆本身保持不变,它们是圆族 \(\mathcal{C}_1\);上下两侧的圆在“扩散”,它们是圆族\(\mathcal{C}_2\)。所有点都向着不动点\(z_0\)的位置前进。事实上可以证明对任何 \(z\in\mathbb{C}\) 都有 \(\lim\limits_{n\to\infty}M^n(z)=z_0\),即任何点在\(M\) 反复作用下的轨迹都朝着 \(z_0\) 的位置移动。
在 Indra'spearls 一书中,把 \(\mathcal{C}_1\)和 \(\mathcal{C_2}\)形象地比喻为两组“扇贝壳”:
我们先考察最简单的椭圆型变换 \(z\toe^{i\theta}z\)。
这时两个不动点是原点和无穷远点。圆族 \(\mathcal{C}_1\)由所有过原点的直线组成,\(\mathcal{C}_2\)由所有以原点为中心的同心圆组成。\(M\)是个旋转,所以会把 \(\mathcal{C}_1\)中的直线变成同族的另一条直线,同时保持 \(\mathcal{C}_2\) 中的每个圆不变:
对一般的椭圆变换 \(M\) 且 \(M\) 的两个不动点 \(z_1\) 和 \(z_2\) 都有限的情形,结论同样成立,\(M\) 保持 \(\mathcal{C}_2\) 中的每个圆不变,把 \(\mathcal{C}_1\)中的每个圆变为同族中的另一个圆:
与椭圆变换 \(z\to e^{i\theta}z\)的情形类似,\(z\to\lambda z\)也以原点和无穷远点为不动点,但是圆族 \(\mathcal{C}_1\) 和 \(\mathcal{C}_2\) 的运动方式发生了互换:这次\(\mathcal{C}_1\)中的每条直线在放缩下保持不变,\(\mathcal{C}_2\)中的每个圆在放缩下变成同族的另一个圆:
对两个不动点 \(z_1\) 和 \(z_2\) 都有限的双曲变换,结论仍然成立,圆族\(\mathcal{C}_1\)中的每个圆保持不变,\(\mathcal{C}_2\)中的每个圆被变成同族的另一个:
这时在 \(M\) 的作用下 \(z_1\) 和 \(z_2\)一个是“源点”,另一个是“汇点”,轨迹从源点源源不竭地发出,汇聚到汇点中。
仍然先看 \(z\to cz\) 的情形。
这时不动点是原点和无穷远点,显然 \(M\) 把圆族 \(\mathcal{C}_1\)中的每个圆变为同族中的另一个圆,同样地也把圆族 \(\mathcal{C}_2\)中的每个圆变为同族中的另一个圆,从而斜航型的变换没有不变圆:
这时点 \(z\) 在 \(M\)的反复作用下的轨迹是一条形如“旋臂”的曲线,方程为 \(\gamma(t)=c^tz\),这是一条对数螺线(spiral),其与 \(\mathcal{C}_1\) 和\(\mathcal{C}_2\) 的夹角都是常数。
这个结论对一般的斜航型变换也成立:
由于斜航型变换包含双曲变换作为组成成分,因此看起来它也有一个源点和一个汇点。这时任意点\(z\) 在 \(M\) 的反复作用下的轨迹是一条双螺线 (doublespiral),其与 \(\mathcal{C}_1\) 和\(\mathcal{C}_2\) 的夹角仍然都是常数(Möbius 变换是保角的)。
判断 Möbius 变换 \(M\)具体属于哪一类可以根据其迹的平方 \(\mu=(a+d)^2\) 来判断(当然,需要把 \(M\) 归一化使得 \(ad-bc=1\)):
斜航这个词听起来好像和船的航行有关,怎么就用来给 Möbius变换分类了呢?这里面肯定有故事,值得扒一扒。
斜航线 (loxodrome)指的是地球上的一条航行路径,其在每个点处的切线与过该点的经线的夹角为定值。比如说,如果船始终朝着东北方向30 度行驶,走过的轨迹就是一条斜航线。Loxodrome 最初是一个希腊词,loxos的意思是 oblique,即倾斜的,dromos 意为bearing,方位的意思,后来拉丁化以后成为现在的样子。葡萄牙数学家 PedroNunes (1492-1577)第一个认识到斜航线并非两点之间最短路径,而且它无限接近但永不可能到达极点。
在大航海的时代,没有卫星导航,只能靠罗盘或者星座来标识船的航向,而星座的方法在遇到恶劣天气的时候又不能使用,只有罗盘是最可靠的方法。理论上地球表面两点之间的最短路径是过球心的大圆,但罗盘只能定出经线的方向(原理是地球的磁极和南北极近似重合),这二者的夹角不是固定的,要保持沿着大圆的弧走就必须不停调整船的航向,但现实中的船不可能一直有人守在船舵处调整方向,一般是事先定好航向以后接下来的若干天都沿着这个方向走,所以在一定路程内船实际上走的是斜航线。
荷兰地图学家墨卡托 (Mercator) 据此于 1569年提出了墨卡托地图,将地球投影至墨卡托地图是一个保角变换,即曲线的夹角保持不变。所以要从地球上的\(A\) 点航向到 \(B\) 点,只要找到它们在墨卡托地图上的对应点\(A',B'\),算出地图上的直线\(A'B'\) 与经线的夹角 \(\theta\),则航行时只要让罗盘与经线一直保持角度为\(\theta\) 就可以从 \(A\) 航行到 \(B\)了。这个路径虽不是最短,但是好在不容易迷失航向。
那这和 Möbius 变换有什么关系呢?
由于 Möbius 变换都是扩充复平面 \(\hat{\mathbb{C}}\) 到 \(\hat{\mathbb{C}}\) 的自同构,而 \(\hat{\mathbb{C}}\) 在球极投影下等同于Riemann 球面 \(S^2\),所以 Möbius变换也都是 Riemann 球面的自同构。我们来看看 Möbius 变换作用在 Riemann球面上是什么样子的。
这是一个作用在 Riemann 球上的斜航型变换:
我来解释一下这个动画的含义:从动画可见 Riemann球面上有一对源点和汇点,这对源点和汇点可以理解为球面的“北极”和“南极”,它们在球极投影下对应于\(M\)在扩充复平面上的两个不动点。当这两个不动点分别是原点和无穷远时,这两个极点就是通常意义下的北极和南极。这时球面上的“经线”是所有过两个极点的大圆,在球极投影下它们对应于同时过两个不动点的圆族\(\mathcal{C}_1\);球面上的纬线是所有与经线正交的圆,在球极投影下它们对应于反演圆族\(\mathcal{C}_2\),球面上每个点的轨迹是对数螺线轨迹在逆球极投影下在球面上的对应曲线,这条曲线与经线纬线的夹角都是常数(因为球极投影是保角的),从而是一条斜航线!
练习:解释下面这个动画的含义:
提示:这个动画有两种解释,它既可以看作是一个抛物型变换在 Riemann球面上作用的效果,也可以看作是一个上半双曲空间中的 horosphere在抛物型变换下作用的效果。horosphere 是指上半双曲空间中与无穷远平面\(z=0\)相切的球,其半径为无穷大。Möbius变换在上半双曲空间上的作用见下一节。
上半双曲空间 \(\mathbb{H}_3\)的定义为 \[\mathbb{H}_3 =\{(x,y,t)\in\mathbb{R}^3\ |\ t>0\}.\]这个空间中的度量是双曲度量:
\[\mathrm{d}s=\frac{(\mathrm{d}x)^2+(\mathrm{d}y)^2+(\mathrm{d}t)^2}{t}.\]
注意 \(xy\) 平面,即复平面不属于\(\mathbb{H}_3\),它是 \(\mathbb{H}_3\) 的无穷远边界,\(\mathbb{H}_3\) 中任何一点到 \(xy\) 平面的距离是无穷大。
一个复分析教材中不太常讲到的事实是:任何 Möbius变换都可以唯一地扩展为 \(\mathbb{H}_3\)的一个等距变换 \(\overline{M}\),此即所谓的Poincaré Extension。这个扩展用四元数来描述的话很简单:设 \[M: z\to\frac{az+b}{cz+d},\quad ad-bc=1.\]是任一 Möbius 变换。注意我们这里要求 \(ad-bc\) 的值是1,其实任何非零实数都可以。这是可以做到的,因为给 Möbius 变换中的 \(a,b,c,d\)同时乘以一个非零复数并不改变这个变换,所以同时乘以 \(1/\sqrt{ad-bc}\) 就可以使得 \(ad-bc=1\)。
对 \(p=(x,y,t)\in\mathbb{H}^3\),令\(q=x+yi+tj\) 为与 \(p\) 对应的四元数,定义 \[\overline{M}(p) = \frac{aq+b}{cq+d}.\]这里的运算都是在四元数体中进行。则 \(\overline{M}(p)\) 是 \(\mathbb{H}_3\) 到自身的等距,并且它限制在\(xy\) 平面上与 \(M\) 的作用一致。
关于 Poincaré Extension 读者可以参考
Beardon, Alan F. The Geometry of Discrete Groups.
一书的 3.3 和 4.1 小节。
我们还能像上面那样用动画演示 Möbius 变换 \(\overline{M}\) 在 \(\mathbb{H}_3\)上的作用吗?可以!比如下图是一个形如 \(z\tocz\) 的斜航型变换扩展到 \(\mathbb{H}_3\)后作用在一个圆柱体上的效果:
你可能要问了:这明明是个圆锥体,你怎么说它是圆柱体呢?是不是笔误了啊?
其实是因为我们现在是在双曲空间里看待它,在双曲度量下,锥面上所有点到\(t\)轴的距离都是一样的,实际上如果设锥的顶角为 \(2\alpha\),则锥面上任何一点到 \(t\) 轴的双曲距离 \(d\) 满足(见 Beardon 的书 7.9.1 小节)\[\sinh d\cdot \cot\alpha = 1.\] 即\(d\) 是定值。所以虽然在欧式空间 \(\mathbb{R}^3\) 中看它是一个锥体,但是在\(\mathbb{H}_3\) 中它其实是圆柱体。
你可以看到这时 \(\overline{M}\)有两个不动点,都位于无穷远处,这样的点叫做“理想点”。两个不动点之间的连线构成圆柱的轴。两个不动点一个是源点,一个是汇点,空间中的点在变换的作用下“远离”源点,“趋向”汇点。
对于一般的斜航型变换 \(M\),且其两个不动点都是扩充复平面上的有限点时,\(M\) 在 \(\mathbb{H}_3\) 上的扩展 \(\overline{M}\) 仍然保持一个 \(\mathbb{H}_3\) 中的圆柱体不变:
这个曲面在欧式空间中叫做 Dupincyclide,它的两个端点恰好是 \(M\)的两个不动点。但在双曲空间中它其实是一个圆柱体,由于其两端落在无穷远平面上,因此也是无限长的。圆柱体的轴是连接两个端点的测地线。如果\(M\) 是椭圆型的话,那么 \(\overline{M}\) 将该圆柱绕着轴旋转:
我以 Dupin cyclide 的动画为例子来说明动画的绘制过程。
一个非抛物型的变换 \(M\)总是可以表示为 \(M = gM_\lambdag^{-1}\) 的形式,其中 \(M_\lambda=z\to\lambda z\)。我这里的 \(g\) 取的是 \[g^{-1}(z)=\frac{z-1}{z+1}.\]注意我这里写的是 \(g^{-1}\),原因是我们不需要 \(g\) 的显示表达式,相反我们只需要 \(g^{-1}\)。
不难验证 \(g^{-1}(1)=0\) 和 \(g^{-1}(-1)=\infty\),从而 \(g(0)=1\) 和 \(g(\infty)=-1\),即 \(g\) 将 \(M_\lambda\) 的不动点 \(\{0,\infty\}\) 分别映射为 \(M\) 的不动点 \(\{1,-1\}\)。\(g\) 同时将 \(M_\lambda\) 对应的圆族 \(\{\mathcal{C}_i,i=1,2\}\) 映射为 \(M\) 的圆族 \(\{g(\mathcal{C}_i),i=1,2\}\)。
\(g\) 当然也可以扩展为 \(\mathbb{H}_3\) 的等距,我们把扩展以后的\(g\) 仍然记作 \(g\)。
由 \(M = gM_\lambda g^{-1}\) 可得\[Mg(\mathcal{C}_i) = gM_\lambda(\mathcal{C}_i),\quad i=1,2.\] 左边的 \(Mg(\mathcal{C}_i)\) 是我们真正想绘制的\(M\) 在其自己的圆族 \(g(\mathcal{C}_i)\)上的作用,这等价于绘制右边的 \(gM_\lambda(\mathcal{C})_i\)。\(M_\lambda(\mathcal{C}_i)\)很好画,就是把一些同心圆和过原点的直线旋转或者放缩一下;但是它前面加了一个畸变\(g\)。为此我们只要用 \(g^{-1}\)作用在当前场景的物体上,把它们“去畸变”即可。所以在动画中,我其实根本没有计算Dupin cyclide 的任何显示或者隐式的曲面方程,而是直接用 \(g^{-1}\) 作用在场景上。由于 \(g^{-1}\) 是 \(\mathbb{H}_3\) 上的等距,它一定会把连接\(\{\pm1\}\) 的测地线映射为连接 \(\{0,\infty\}\)的测地线,即锥面。换言之,判断场景中的一个点 \(p\) 是不是落在 Dupin cyclide 上,只要判断\(g^{-1}(p)\)是不是落在锥面上。这就好办了。
抛物的情形更简单一些,可以用 \(g(z)=1/z\)把位于无穷远的不动点变到原点。
动画使用的是 GLSL 语言和 raymarching 的技术。我在 Roice的代码基础上作了许多优化,但肯定还可以更精炼。限于我写 shader的能力不足,做出更美轮美奂的效果就不指望了 ...
严格讲,这些动画其实还是尝试在欧式空间中去观察双曲空间中的对象,因为raymarching技术假定的是光走直线,但在双曲空间中光一般不走直线,所以我们这里看到的效果与真实的生活在双曲空间中的“外星人”所看到的还是有差别的。
]]>这个程序可以用来制作各种各样的算法动画,包含但不限于:
Wilson 均匀生成树算法:
Prim 算法:
Kruskal 算法:
Langton 蚂蚁:
Hilbert 曲线:
Conway 的生命游戏 (gosper glider gun):
以上这些动画有一个共同特点:它们都位于二维的网格图上,这也是这个程序的一个限制。
这个程序有如下特点:
所有代码全部由纯 Python写成,没有用到任何第三方库或者外部软件,也不包含任何 draw
,fill
之类的函数调用,仅使用了内置的 struct
,random
模块和一些内置函数。后来的版本中为了显示进度条引入了tqdm
;为了把整个动画嵌入一张背景图片引入了pillow
,这些都属于特效,本质不需要。
实现了一个小型但高效的 GIF编码器,通过直接将动画过程编码为字节流,可以在数秒之内生成高度优化的动态图。比如前面那张Langton ant 的动图,它包含 2300 帧,但是大小只有158KB,而且只需要一秒多一点就可以生成。这是这个程序最让人意外的一点:Python生成图像的慢是出了名的,它居然能在几秒内生成一张包含几千帧的 GIF动图?这是个大新闻啊!
严格遵循 GIF89a 协议,生成的图片在 chrome, firefox, IE 和 Eog中都可以正常显示。
程序运行的相当快,生成一副 600x400 像素,演示 Wilson算法的动图只要数秒,得到的文件包含 1000~3000 帧,但大小不超过 1M左右。没想到吧?😲
这个程序是怎么来的呢?许多年前我在网上闲逛的时候,偶然发现了 d3.js 作者的网站(原链接已重定向,作者现在已经创业搞observablehq去了),当时我对上面展示的各种丰富炫酷的动态效果惊羡不已,尤其是其中对Wilson算法的演示,让我对此算法有了更直观和深入的理解。我立刻萌发了用Python 制作一个 GIF版的动画演示的想法,但是思考了许久也不知道从何入手。这里困难的地方在于Wilson算法是一个随机算法,其运行时间是不确定的,一个动画里面可能包含数千帧,如果采用把每一帧保存为图像再合并到一起的话,最终得到的文件会非常庞大,而且这种纯暴力的做法逼格不高,我实在不屑于采用。限于能力不足,这个想法只好被暂时压在心底,但是一直念念不忘。过了几年后,在一个偶然的机会我接触到了GIF图像的编码协议,豁然开朗:为什么不直接把动画过程编码为字节流呢?通过精确定位每一帧的位置,控制LZW压缩过程的编码长度,文件过大的问题是可以解决的!前后捣鼓了半个月,反复研究协议细节,debug了无数次后,这才作出了上面的效果。后来慢慢又加上了其它迷宫算法和元胞自动机的演示。
关键的地方有这么几个:
由于 GIF图像的每一帧占据的是整个图像窗口的一个矩形子区域,在一个包含很多帧的动图中,相邻的两帧之间的变动可能很小,没有必要每次都将整个图像全部编码。我们只需要记录帧和帧之间的变化情况,得出每一帧所占的矩形子区域,每次编码时只针对这个子区域编码即可,这样就大大减小了生成的文件体积。
采用变长的 LZW 压缩算法。GIF89a协议允许每个打包的数据块指明其所使用的最小码字的长度,如果你事先知道这一帧图像用到的颜色数目,比如4 种颜色,那么 2 个比特就足以表示这 4 种颜色,从而最小编码长度可以设置为2。这样根据具体情况采用不同的编码长度能有效减少文件体积。
因为要频繁的进行字节流的操作,所以每次将编码后的数据先写入一个BytesIO
对象中,放在内存里,最后一次性输出到硬盘。
代码的组织结构是简单的三层论:顶层是抽象的 Maze
类,其本质就是一个 2D网格图,用来跑各种图算法,它不关心动图的任何细节。底层是GIFSurface
类,负责维护 GIF图片的全局信息,比如图片宽高,循环次数,背景颜色,全局调色板等。中间层是Animation
类,用来控制帧的信息,在算法运行过程中它按照一定的频率将Maze
染色并编码写入 GIFSurface
。
目前程序的核心代码加起来大约在 1000行左右,但是如果牺牲一些可读性和功能的话,是可以压缩到 500行以内的。我曾经把这个项目投稿到 Github 上的 500lines上,可惜未能入选。但是我始终觉得它的优雅、奇妙并不逊色于那些大神们的作品。
]]>问题:有哪些 \(\mathbb{Z}[x]\) 中的多项式,它们在有理数域\(\mathbb{Q}\)上是不可约的,而对任意素数 \(p\),模\(p\) 以后在 \(\mathbb{Z}_p[x]\) 上都是可约的?
当时我给了回答,后来账号注销了,答案也一并删除了。现在把我的原答案贴在这里:
我所知道的有两大类多项式:
第一类是所有的 Swinnerdon-Dyer 多项式,它们形如 \[f(x)=\prod(x\pm\sqrt{p_1}\pm\sqrt{p_2}\cdots\pm\sqrt{p_n}),\]其中 \(p_1,\ldots,p_n\)是互不相同的素数,乘积跑遍所有 \(2^n\)种不同的组合。这种多项式都是不可约的整系数多项式,但是模任何素数 \(p\)以后都分解为一次或者二次因式的乘积。
第二类来自分圆多项式,分圆多项式 \(\Phi_n(x)\) 是本原 \(n\) 次单位根在 \(\mathbb{Q}\) 上的极小多项式,其次数为 \(\phi(n)\),这里 \(\phi(\cdot)\) 是 Euler totient函数。绝大多数分圆多项式模任何素数 \(p\) 都是可约的!实际上我们有如下结论:
定理:分圆多项式 \(\Phi_n(x)\) 模任何素数 \(p\) 都可约当且仅当 \(n\ne1,2,p,2p^k\),其中 \(p\) 是奇素数,\(k\) 是正整数。
你可以看到知乎那个问题下的回答中举的例子都是最简单的 Swinnerdon-Dyer多项式或者分圆多项式的例子。
我知道这个结论还是研究生时上夏壁灿老师的符号计算课程,讲到分解整系数多项式的Zassenhaus算法,这两类多项式被用来分析算法的最差复杂度。我还在校园书摊上淘到了一本破损的ModernComputer Algebra,在 15.3 节 "Frobenius' and Chebotarev's densitytheorems" 中有介绍。
这两类多项式属于比较容易分析的,还有别的例子吗?也是有的,这篇文章给出了更多不那么显然的构造。
]]>问题:假设某醉汉以太阳系的中心为原点出发,在一个固定的平面内,以恒为1米的步长作随机行走。每次醉汉等概率地在东、南、西、北四个方向中任选一个,然后向此方向移动1 米的距离。如果某个时刻醉汉回到了原点,或者离开了太阳系则过程结束。
现在有 A, B 两个旁观者打赌哪一种情形先发生,A 认为醉汉会先回到原点,B认为醉汉会先离开太阳系。请问 A 和 B 获胜的概率分别是多少?
作为参考,太阳系半径约为 45亿千米,看作一个中心在原点的圆形区域。
题目其实是在说,醉汉的行为是 \(\mathbb{Z}^2\) 上的简单随机游动,而我们熟知\(\mathbb{Z}^d\) 上的随机游动在 \(d=1,2\) 时是常返的,所以醉汉以概率 1会走遍平面上的所有角落,即 A, B 这场赌局是以概率 1可以分出胜负的。从直观上,\(A\)的获胜概率应该更大,因为醉汉回到原点显然是个更容易发生的事件:醉汉的路径可能是选择一个方向一步迈出去再一步迈回来,或者干脆绕一个圈子,而走出太阳系那么远的距离则困难得多。事实也是如此,实际上A, B 获胜概率的“分水岭”大约在 \(R\approx4.2\) 米处 1,随着逃逸半径 \(R\) 的增大,A获胜的概率也随之增大,常返性保证了当 \(R\to+\infty\) 时 A 获胜的概率趋于1。这里有趣的地方在于,A 的获胜概率随逃逸半径 \(R\)的增加而增长的速度相当缓慢,其近似值约为 \[1-\left(\frac{2}{\pi}\ln R +1.0293737\right)^{-1},\] 所以当 \(R\) 取为太阳系半径时,B 的获胜概率大约为1/20,这不是个可以忽略的值。甚至当 \(R\) 扩大为银河系的半径(5 万光年) 时,B仍然有大约 1/30 的概率获胜!是不是很反直觉呢?
本文下面就来介绍怎样得出上面获胜概率的渐进公式。这里的讲述主要参考了Spitzer 的教材 2,好处是比较简单易懂,缺点是没有给出势核误差项的渐进估计。使用局部中心极限定理的话可以给出势核误差项的渐进估计3,但是我想本文还是克制一点,尽量保持在初等的范围内比较好。
我们把问题分解为以下步骤来解决:
我们把醉汉在 \(n\) 时刻的位置 \(S_n\) 记作 \[S_n=X_1+\cdots+X_n.\] 其中 \(X_i\)表示单步移动的随机向量,它们独立且与随机向量 \(X\) 同分布: \[\mathbb{P}(X=e_1)=\mathbb{P}(X=e_2)=\mathbb{P}(X=-e_1)=\mathbb{P}(X=-e_2)=\frac{1}{4}.\]这里 \(e_1=(1, 0), e_2=(0, 1)\)为平面上的正交单位向量。 记 \(\phi(\theta)=\mathop{\mathrm{\mathbb{E}}}{\mathrm{e}^{i\theta\cdotX}}\) 为 \(X\) 的特征函数,其中\(\theta=(\theta_1,\theta_2)\),则\[\phi(\theta)=\frac{1}{4}\sum_{x\in\{\pm e_1,\pme_2\}}\mathrm{e}^{i(\theta_1x_1+\theta_2x_2)}=\frac{1}{2}(\cos\theta_1 +\cos\theta_2).\] 于是 \(S_n\) 的特征函数为\(\phi^n(\theta)\)。
用特征函数我们可以非常方便地表示 \(n\) 步以后醉汉位于任意 \(y\in\mathbb{Z}^2\) 的概率 \(\mathbb{P}(S_n=y)\): \[\begin{equation}\mathbb{P}(S_n=y) =\frac{1}{(2\pi)^2}\int_{\mathbb{T}}\mathrm{e}^{-i\theta\cdoty}\phi^n(\theta)\,\mathrm{d}\theta.\label{eq:sn}\tag{1}\end{equation}\] 其中 \(\mathbb{T}=[-\pi,\pi]\times[-\pi,\pi]\)。这是因为根据特征函数定义有 \[\phi^n(\theta)=\mathop{\mathrm{\mathbb{E}}}{\mathrm{e}^{i\theta\cdotS_n}}=\sum_{x\in\mathbb{Z}^2}\mathbb{P}(S_n=x)\mathrm{e}^{i\theta\cdotx}.\] 两边同时乘以 \(\mathrm{e}^{-i\theta\cdot y}\) 并在 \(\mathbb{T}\) 上积分即得 \[\begin{align*}\frac{1}{(2\pi)^2}\int_{\mathbb{T}}\mathrm{e}^{-i\theta\cdoty}\phi^n(\theta)\,\mathrm{d}\theta&=\frac{1}{(2\pi)^2}\int_{\mathbb{T}}\sum_{x\in\mathbb{Z}^2}\mathbb{P}(S_n=x)\mathrm{e}^{i\theta\cdot(x-y)}\,\mathrm{d}\theta\\&=\sum_{x\in\mathbb{Z}^2}\mathbb{P}(S_n=x)\frac{1}{(2\pi)^2}\int_{\mathbb{T}}\mathrm{e}^{i\theta\cdot(x-y)}\,\mathrm{d}\theta\\&=\sum_{x\in\mathbb{Z}^2}\mathbb{P}(S_n=x)\cdot\delta_{x,y}\\&=\mathbb{P}(S_n=y).\end{align*}\] 这里我们利用了级数 \(\sum_{x\in\mathbb{Z}^2}\mathbb{P}(S_n=x)\mathrm{e}^{i\theta\cdot(x-y)}\)绝对收敛(从而可以交换求和顺序),以及对 \(z\in\mathbb{Z}^2\) 的积分 \[\frac{1}{(2\pi)^2}\int_{\mathbb{T}}\mathrm{e}^{i\theta\cdotz}\,\mathrm{d}\theta\] 在 \(z=(0, 0)\) 处为1,在其它位置均为 0 的简单事实。
上面的讨论对任意维数都适用,\(\mathbb{Z}^d\) 上的简单随机游动其特征函数为\(\frac{1}{2}\sum_{i=1}^d\cos\theta_i\),关于\(\mathbb{P}(S_n=y)\)的类似表达式仍然成立。
势核可以看作是 Green 函数在二维情形的替代物:在 \(d\geq3\) 时,\(\mathbb{Z}^d\) 上的简单随机游动的 Green函数 \(G(x,y)\) 定义为从 \(x\) 出发的随机游动访问 \(y\) 的期望次数: \[G(x, y) =\mathbb{E}_x\left(\sum_{k=1}^\infty\mathbb{1}_{\{S_k=y\}}\right)=\sum_{k=1}^\infty\mathbb{P}_x(S_k=y).\] 由于二维随机游动是常返的,上面的级数在\(d=2\) 时发散,所以上述 Green函数的定义失效,但是我们还是想定义一个类似 Green函数的调和函数,结果发现 Green函数的差对应的级数是收敛的,这就引出了下面势核的定义。
记 \(\mathbb{P}_n(x, y)\) 为从 \(x\) 出发的简单随机游动经过 \(n\) 步以后到达 \(y\)的概率。显然此概率满足如下两条性质:
定义二维随机游动的势核 (potential kernel) 为 \[a(x)=\sum_{k=0}^\infty\left[\mathbb{P}_k(0,0)-\mathbb{P}_k(x, 0)\right].\] 即 \(a(x)\) 是极限 \[a(x)=\lim_{n\to\infty}\sum_{k=0}^n\left[\mathbb{P}_k(0, 0) -\mathbb{P}_k(x, 0)\right]=\lim_{n\to\infty}a_n(x).\] 由定义可见 \(a(0)=0\)。我们还得说明这个级数对任何 \(x\in\mathbb{Z}^2\) 确实是收敛的。为此注意到\[\mathbb{P}_k(0,0)=\frac{1}{(2\pi)^2}\int_{\mathbb{T}}\phi^k(\theta)\,\mathrm{d}\theta.\] 以及根据 \((\ref{eq:sn})\)\[\mathbb{P}_k(x, 0)=\mathbb{P}_k(0,-x)=\frac{1}{(2\pi)^2}\int_{\mathbb{T}}\mathrm{e}^{i\theta\cdotx}\phi^k(\theta)\,\mathrm{d}\theta.\] 于是 \[a_n(x)=\frac{1}{(2\pi)^2}\int_{\mathbb{T}}\frac{1-\mathrm{e}^{i\theta\cdotx}}{1-\phi(\theta)}(1-\phi^{n+1}(\theta))\,\mathrm{d}\theta.\label{eq:an}\tag{2}\] 由于 \(|1-\phi^{n+1}(\theta)|\leq2\) 对任何 \(n\geq0\) 和 \(\theta\in\mathbb{T}\)成立,所以如果我们能证明 \(\dfrac{1-\mathrm{e}^{i\theta\cdotx}}{1-\phi(\theta)}\) 在 \(\mathbb{T}\) 上可积,并且 \(\phi^{n+1}(\theta)\to0,\mathrm{a.e.}\)的话,就可以使用控制收敛定理对 \((\ref{eq:an})\) 两边取极限,即得 \[a(x)=\lim_{n\to\infty}a_n(x) =\frac{1}{(2\pi)^2}\int_{\mathbb{T}}\frac{1-\mathrm{e}^{i\theta\cdotx}}{1-\phi(\theta)}\,\mathrm{d}\theta <\infty.\] 由于 \(\phi(\theta)=\frac{1}{2}(\cos\theta_1+\cos\theta_2)\)只在 \(\mathbb{T}\) 上有限个点处满足\(|\phi(\theta)|=1\),其余均为 \(|\phi(\theta)|<1\),所以 \(\phi^n(\theta)\to0\) 在 \(\mathbb{T}\) 上几乎处处成立。
为了证明 \(\dfrac{1-\mathrm{e}^{i\theta\cdotx}}{1-\phi(\theta)}\) 在 \(\mathbb{T}\) 上可积,我们注意到不等式 \(|1-\mathrm{e}^{i\theta\cdot x}|\leq|x||\theta|\) 总是成立的,并且存在正数 \(\lambda>0\) 使得 \[1-\phi(\theta)=1-\frac{1}{2}(\cos\theta_1+\cos\theta_2)\geq\lambda(\theta_1^2+\theta_2^2)=\lambda|\theta|^2\] 对任何 \(\theta\in\mathbb{T}\) 成立 (函数 \((1-\cos t)/t^2\) 在 \([-\pi, \pi]\) 上具有正的最小值 \(c\),取 \(\lambda=c/2\) 即可),所以 \[\frac{1-\mathrm{e}^{i\theta\cdotx}}{1-\phi(\theta)}\leq\frac{|x|}{\lambda|\theta|}.\] 而 \(1/|\theta|\)在二维的情形是 \(\mathbb{T}\) 上Lebesgue 可积的:将积分区域 \(\mathbb{T}=[-\pi,\pi]\times[-\pi,\pi]\)放大为圆形区域 \(|\theta|\leq\sqrt{2}\pi\),并用极坐标换元\(\theta\to(r,\alpha)\) 得到 \[\int_T\frac{1}{|\theta|}\,\mathrm{d}\theta \leq\int_{|\theta|\leq\sqrt{2}\pi}\frac{1}{|\theta|}\,\mathrm{d}\theta=\int_0^{2\pi}\,\mathrm{d}\alpha \int_0^{\sqrt{2}\pi}\frac{1}{r}\cdot r\,\mathrm{d}r =2\sqrt{2}\pi^2<\infty.\]
所以 \(\dfrac{1-\mathrm{e}^{i\theta\cdotx}}{1-\phi(\theta)}\) 是 Lebesgue 可积的,这就证明了 \(a(x)\) 对任何 \(x\in\mathbb{Z}^2\) 都有定义。
定理 1:势核 \(a(x)=\sum\limits_{k=0}^\infty\left[\mathbb{P}_k(0,0)-\mathbb{P}_k(x, 0)\right]\) 几乎处处有限且等于 \[a(x)=\frac{1}{(2\pi)^2}\int_{\mathbb{T}}\frac{1-\mathrm{e}^{i\theta\cdotx}}{1-\phi(\theta)}\,\mathrm{d}\theta.\]
我们接下来证明势核 \(a(x)\)在除去原点之外都是调和的: \[a(x)=\frac{1}{4}\sum_{y\sim x}a(y),\quad \forallx\in\mathbb{Z}^2\setminus\{0\}.\] 为此记 \(N_x^n\) 为从 \(x\) 出发的随机游动在前 \(n\) 步到访原点的次数,即 \(N_x^{n}=\sum\limits_{k=0}^n\mathbb{1}_{\{S_k=0\}}\),则\[a(x)=\lim_{n\to\infty}(\mathop{\mathrm{\mathbb{E}}}{N_0^n}-\mathop{\mathrm{\mathbb{E}}}{N_x^n}).\] 对任何从 \(x\in\mathbb{Z}^2\setminus\{0\}\)出发的随机游动,使用单步转移概率,我们有 \[N_x^n=\frac{1}{4}\sum_{y\simx}N_y^{n-1}.\] 此外 \[\mathop{\mathrm{\mathbb{E}}}{N_0^n}=\mathop{\mathrm{\mathbb{E}}}{N_0^{n-1}}+\mathop{\mathrm{\mathbb{E}}}{\mathbb{1}_{\{S_n=0\}}}=\mathop{\mathrm{\mathbb{E}}}{N_0^{n-1}}+\mathbb{P}_0(S_n=0),\]所以当 \(x\ne0\) 时, \[\begin{align*}\mathop{\mathrm{\mathbb{E}}}{N_0^n}-\mathop{\mathrm{\mathbb{E}}}{N_x^n}&=\mathbb{P}_0(S_n=0)+\mathop{\mathrm{\mathbb{E}}}{N_0^{n-1}}-\frac{1}{4}\sum_{y\simx}\mathop{\mathrm{\mathbb{E}}}{N_y^{n-1}}\\&=\mathbb{P}_0(S_n=0)+\frac{1}{4}\sum_{y\simx}[\mathop{\mathrm{\mathbb{E}}}{N_0^{n-1}}-\mathop{\mathrm{\mathbb{E}}}{N_y^{n-1}}].\end{align*}\] 两边令 \(n\to\infty\) 并注意\(\mathbb{P}_0(S_n=0)\to 0\) 即得 \[a(x)=0+\frac{1}{4}\sum_{y\sim x}a(y)=\frac{1}{4}\sum_{y\sim x}a(y).\] 即 \(a(x)\) 在任何 \(x\ne 0\) 处是调和的。
由定义我们已经知道 \(a(0)=0\),其实稍微花点力气也不难得出 \(a(\pm e_i)=1\) 来:根据对称性 \(a(x)\) 在原点的四个邻居 \(\{\pm e_1,\pm e_2\}\)处的值应该相等,这次我们对 \(\mathop{\mathrm{\mathbb{E}}}{N_0^n}\)进行分解并注意初始时刻 \(S_0=0\)也算一次,所以有 \[\mathop{\mathrm{\mathbb{E}}}{N_0^n} = 1 + \frac{1}{4}\sum_{y\sim0}\mathop{\mathrm{\mathbb{E}}}{N_y^{n-1}} = 1 +\mathop{\mathrm{\mathbb{E}}}{N_{e_1}^{n-1}}.\] 把 \(\mathop{\mathrm{\mathbb{E}}}{N_{e_1}^n}\)拆成 \(\mathop{\mathrm{\mathbb{E}}}{N_{e_1}^{n-1}}+\mathbb{P}_{e_1}(S_n=0)\),得到\[\mathop{\mathrm{\mathbb{E}}}{N_0^n}-\mathop{\mathrm{\mathbb{E}}}{N_{e_1}^n}=1-\mathbb{P}_{e_1}(S_n=0).\]两边令 \(n\to\infty\) 即得 \(a(e_1)=1\)。
采用下一节的方法,我们可以通过计算积分得出 \(a(e_1+e_2)=\frac{4}{\pi}\),\(a(2e_1)=4-\frac{8}{\pi}\),等等,其示意图如下:
我们关心的是势核 \(a(x)\) 当 \(|x|\to\infty\)时的渐进大小,为此我们有如下定理:
定理 2: \[\lim_{|x|\to\infty} a(x) - \frac{2}{\pi}\ln |x| =\frac{2}{\pi}\gamma+\frac{\ln 8}{\pi}\approx 1.0293737.\] 其中\(\gamma\approx 0.5772156649\) 是 Euler常数。
当你看到这个定理的时候,是不是感觉已经快要接近证明文章开头的结论了呢?那可太抱歉了,真正麻烦的地方才刚开始。这个定理的证明非常棘手,我们需要首先论证\(a(x)\) 的渐进行为只与 \(x\) 的长度有关,与 \(x\) 方向无关,然后用一个特殊的方向 \(x=(n, n)\) 代入 \(a(x)\) 的表达式计算积分值。
证明: 我们先来论证 \(a(x)\) 的渐进行为不依赖于 \(x\) 的方向。我们的思路是取一个函数 \(g(\theta)\),使得积分 \[\begin{equation}0 <\frac{1}{(2\pi)^2}\int_{\mathbb{T}}\left[\frac{1}{1-\phi(\theta)}-\frac{1}{g(\theta)}\right]\,\mathrm{d}\theta=c< \infty,\label{eq:decompose}\end{equation}\] 然后把 \(a(x)\) 的积分表示\[a(x)=\frac{1}{(2\pi)^2}\int_{\mathbb{T}}\frac{1-\mathrm{e}^{i\theta\cdotx}}{1-\phi(\theta)}\,\mathrm{d}\theta\] 拆成两项的和: \[a(x)=\underbrace{\frac{1}{(2\pi)^2}\int_{\mathbb{T}}\frac{1-\mathrm{e}^{i\theta\cdotx}}{g(\theta)}\,\mathrm{d}\theta}_{I(x)}+\underbrace{\frac{1}{(2\pi)^2}\int_{\mathbb{T}}(1-\mathrm{e}^{i\theta\cdotx})\left[\frac{1}{1-\phi(\theta)}-\frac{1}{g(\theta)}\right]\,\mathrm{d}\theta}_{J(x)}.\] 根据 Riemann-Lebesgue引理,\(\lim\limits_{|x|\to\infty}J(x)=c\),即\(J(x)\) 与 \(x\) 的方向是无关的。
\(g(\theta)\) 可以取为 \(|\theta|^2/4\),我们来验证这一点: \[\frac{1}{1-\phi(\theta)}-\frac{1}{g(\theta)}=\frac{1}{1-\phi(\theta)}-\frac{4}{|\theta|^2} =\underbrace{\frac{4|\theta|^2}{1-\phi(\theta)}}_{\chi(\theta)}\cdot\underbrace{\frac{1}{|\theta|^4}\left[\phi(\theta)-1+\frac{|\theta|^2}{4}\right]}_{\psi(\theta)}.\] 我们要证明乘积 \(\chi(\theta)\psi(\theta)\) 在 \(\mathbb{T}\)上可积。注意到我们之前已经证明了存在 \(\lambda>0\) 使得在 \(\mathbb{T}\) 上有 \(1-\phi(\theta)\geq\lambda|\theta|^2\),所以 \(\chi(\theta)\leq 4/\lambda\) 在 \(\mathbb{T}\) 上是有界的,只要再证明 \(\psi(\theta)\) 在 \(\mathbb{T}\) 上可积即可。而 \[\begin{equation}\phi(\theta)-1+\frac{|\theta|^2}{4}=\mathop{\mathrm{\mathbb{E}}}{\left[\mathrm{e}^{i\theta\cdotX} - 1 - i\theta\cdot X - \frac{1}{2}(i\theta\cdot X)^2\right]}.\end{equation}\] 这里我们利用了 \(\mathbb{T}\)是关于原点对称的区域,以及 \(X^2\equiv(1,1)\),所以 \[\begin{align*}\mathop{\mathrm{\mathbb{E}}}{(\theta\cdotX)}&=\mathop{\mathrm{\mathbb{E}}}{(x_1\theta_1 + x_2\theta)}=0,\\\mathop{\mathrm{\mathbb{E}}}{(\theta\cdotX)^2}&=\mathop{\mathrm{\mathbb{E}}}{(x_1\theta_1+x_2\theta_2)^2}=\mathop{\mathrm{\mathbb{E}}}{(\theta_1^2+\theta_2^2)}=\mathop{\mathrm{\mathbb{E}}}{|\theta|^2}.\end{align*}\] 由于对任何实数 \(z\) 都有不等式 4\[\left|\mathrm{e}^{iz} - 1 - iz -\frac{(iz)^2}{2}\right|\leq\frac{|z|^3}{6},\] 所以 \[\phi(\theta)-1+\frac{|\theta|^2}{4}\leq\frac{1}{6}\mathop{\mathrm{\mathbb{E}}}{|\theta\cdotX|^3}\leq\frac{1}{6}\mathop{\mathrm{\mathbb{E}}}{|\theta|^3|X|^3}=\frac{|\theta|^3}{6}\mathop{\mathrm{\mathbb{E}}}{|X|^3},\] 从而 \[\psi(\theta)=|\theta|^{-4}\left[\phi(\theta)-1+\frac{|\theta|^2}{4}\right]\leq|\theta|^{-4}\cdot\frac{|\theta|^3}{6}\mathop{\mathrm{\mathbb{E}}}{|X|^3}=\frac{M}{|\theta|}.\] 这里 \(0<M=\frac{\mathop{\mathrm{\mathbb{E}}}{|X|^3}}{6} <\infty\)是正数。而前面已经看到 \(1/|\theta|\)在 \(\mathbb{T}\) 上是可积的,所以\(\psi(\theta)\) 也是可积的,这就说明了\(\lim\limits_{|x|\to\infty}J(x)=c\)确实成立。
我们还需要说明 \(I(x)\) 的极限也是与\(x\) 的方向无关的。把 \(I(x)\) 分解成两部分: \[I(x)=\frac{1}{(2\pi)^2}\int_{\mathbb{T}}\frac{1-\mathrm{e}^{i\theta\cdotx}}{|\theta|^2/4}\,\mathrm{d}\theta =\frac{1}{\pi^2}\int_{\mathbb{T}}\frac{1-\cos(\theta\cdotx)}{|\theta|^2}\,\mathrm{d}\theta=I_1+I_2.\] 其中 \(I_1\) 为在圆形区域\(|\theta|\leq\pi\) 上的积分,\(I_2\) 为在剩下的 \(\{\theta\in\mathbb{T},\,|\theta|>\pi\}\) 区域上的积分。
\(I_2\)是比较好处理的,这是因为在其区域上 \(1/|\theta|^2\) 可积,所以根据Riemann-Lebesgue 引理, \[\lim_{|x|\to\infty}\frac{1}{\pi^2}\int_{\theta\in\mathbb{T},\,|\theta|>\pi}\frac{1-\cos(\theta\cdotx)}{|\theta|^2}\,\mathrm{d}\theta=\frac{1}{\pi^2}\int_{\theta\in\mathbb{T},\,|\theta|>\pi}\frac{1}{|\theta|^2}\,\mathrm{d}\theta< \infty.\] 所以 \(I_2(x)\)有一个不依赖于 \(x\) 方向的极限值。
而 \(I_1(x)\) 从表达式明显可见它是与\(x\) 方向无关的: \[I_1(x)=\frac{1}{\pi^2}\int_{|\theta|\leq\pi}\frac{1-\cos(\theta\cdotx)}{|\theta|^2}\,\mathrm{d}\theta.\] 事实上用一个旋转矩阵 \(A\)乘以 \(x\) 等同于对 \(\theta\) 作变元代换 \(\theta'=A^{-1}\theta\),由于 \(A\) 是正交矩阵所以 \(|\theta'|=|\theta|\) 并且变换的Jacobian 值是 +1,所以积分不变。
至此我们把 \(a(x)\) 的积分表示为了\(I_1+I_2+J\) 的形式,并且论证了 \(x\to\infty\) 时后两者的值有限,所以 \(a(x)\) 的渐进主项藏在 \(I_1(x)\) 当中。
由于 \(I_1(x)\) 的值与 \(x\) 方向无关,我们可以取 \(x\) 为实轴正方向 \((|x|, 0)\) 来计算积分的值。作极坐标代换\(\theta=(r,\alpha)\) 得 \[\begin{align*}I_1(x)&=\frac{1}{\pi^2}\int_{|\theta|\leq\pi}\frac{1-\cos(\theta\cdotx)}{|\theta|^2}\,\mathrm{d}\theta\\&=\frac{1}{\pi^2}\int_0^{2\pi}\mathrm{d}\alpha\int_0^\pi\frac{1-\cos(|x|r\cos\alpha)}{r}\,\mathrm{d}r\\&=\frac{4}{\pi^2}\int_0^{\frac{\pi}{2}}\mathrm{d}\alpha\int_0^{\pi}\frac{1-\cos(|x|r\sin\alpha)}{r}\,\mathrm{d}r\\&=\frac{4}{\pi^2}\int_0^{\frac{\pi}{2}}\mathrm{d}\alpha\int_0^{\pi|x|\sin\alpha}\frac{1-\cos u}{u}\,\mathrm{d}u.\end{align*}\] 其中内层的积分可以改写为 \[\left(\int_0^1 \frac{1-\cos u}{u}\,\mathrm{d}u-\int_1^\infty\frac{\cosu}{u}\,\mathrm{d}u\right)+\int_1^{\pi|x|\sin\alpha}\frac{1}{u}\,\mathrm{d}u+\int_{\pi|x|\sin\alpha}^\infty\frac{\cos u}{u}\,\mathrm{d}u.\] 注意第一个求和项 \[\int_0^1 \frac{1-\cos u}{u}\,\mathrm{d}u-\int_1^\infty\frac{\cosu}{u}\,\mathrm{d}u=\gamma\] 是 Euler 常数 (Euler常数的另一种等价表示形式),它给出的外层积分值是 \(\frac{2}{\pi}\gamma\);第二个求和项等于\[\ln\pi + \ln |x| + \ln\sin\alpha,\]它给出的外层积分值是 \[\frac{2}{\pi}\left(\ln\pi + \ln |x|-\ln 2\right).\] 第三个求和项满足 5 \[\lim_{|x|\to\infty}\int_0^{\frac{\pi}{2}}\mathrm{d}\alpha\int_{\pi|x|\sin\alpha}^\infty\frac{\cos u}{u}\,\mathrm{d}u=0.\] 所以 \[\lim_{|x|\to\infty}I_1(x)=\frac{2}{\pi}\ln|x|+\frac{2}{\pi}(\gamma+\ln\pi-\ln2).\] 这就证明了 \(a(x)\)在渐进意义下确实等于 \(\dfrac{2}{\pi}\ln|x|\) 加上一个常数。
为了计算这个常数的值,我们选择对角线方向 \(x=(n,n)\) 代入 \(a(x)\) 的表达式中: \[a(n,n)=\frac{1}{(2\pi)^2}\int_{\mathbb{T}}\frac{1-\cosn(\theta_1+\theta_2)}{1-\frac{1}{2}(\cos\theta_1+\cos\theta_2)}\,\mathrm{d}\theta=\frac{1}{(2\pi)^2}\int_{\mathbb{T}}\frac{1-\cosn(\theta_1+\theta_2)}{1-\cos\frac{\theta_1+\theta_2}{2}\cos\frac{\theta_1-\theta_2}{2}}\,\mathrm{d}\theta.\] 作变元代换 \(u=\frac{\theta_1+\theta_2}{2},v=\frac{\theta_1-\theta_2}{2}\),此变换的Jacobian 为 \(1/2\),于是 \[a(n,n)=\frac{2}{(2\pi)^2}\int_{|u|+|v|\leq\pi}\frac{1-\cos(2nu)}{1-\cosu\cos v}\,\mathrm{d}u\mathrm{d}v.\] 此积分的区域是 \(\mathbb{T}\)中满足 \(|u|+|v|\leq \pi\)的部分,它等于整个 \(\mathbb{T}\)上积分的一半,如图所示:
所以 \[a(n,n)=\frac{1}{4\pi^2}\int_{-\pi}^\pi\mathrm{d}u\int_{-\pi}^\pi\frac{1-\cos(2nu)}{1-\cosu\cos v}\,\mathrm{d}v.\] 我们用留数来计算上面的积分。设 \(k=\cos u\),
\[\begin{aligned}\int_{-\pi}^{\pi}\frac{1}{1-k\cosv}\,\mathrm{d}v&=\oint_{|z|=1}\frac{1}{1-\frac{k}{2}\left(z+\frac{1}{z}\right)} \frac{\mathrm{d} z}{iz}\quad(z=e^{iv})\\ &=\oint_{|z|=1} \frac{2i}{kz^2-2z+k}\mathrm{d}z\\ &=\oint_{|z|=1} \frac{2i}{k(z-z_1)(z-z_2)}\mathrm{d}z\quad\left(z_{1,2}=\frac{1\pm\sqrt{1-k^2}}{k}\right)\\&=\frac{2 i}{k}2\pii\;\mathrm{Res}_{z=z_2}\left(\frac{1}{(z-z_1)(z-z_2)}\right)\\&=-\frac{4\pi}{k}\frac{1}{z_2-z_1}\\&=\frac{2\pi}{\sqrt{1-k^2}}. \end{aligned}\]
外层同样使用围道积分,
\[\begin{aligned}&\frac{1}{4\pi^2}\int_{-\pi}^{\pi}(1-\cos(2nu))\int_{-\pi}^{\pi}\frac{1}{1-\cosu\cos v}\,\mathrm{d}u\,\mathrm{d}v\\&=\frac{1}{2\pi}\int_{-\pi}^{\pi}\frac{1-\cos(2nu)}{|\sin\left(u\right)|}\,\mathrm{d}u\\&=\frac{1}{\pi}\mathrm{Re}\int_{0}^{\pi}\frac{1-e^{2inu}}{\sinu}\,\mathrm{d}u\quad(z=e^{iu})\\&=\frac{1}{\pi}\mathrm{Re}\int_{C}\frac{1-z^{2n}}{\frac{1}{2i}\left(z-z^{-1}\right)}\,\frac{\mathrm{d} z}{i z}\quad\text{(形变半圆路径} C \text{为直线)}\\&=\frac{2}{\pi}\mathrm{Re}\int_{1}^{-1}\frac{1-z^{2n}}{z^2-1}\,\mathrm{d} z\\ &=\frac{2}{\pi}\int_{-1}^1\sum_{k=0}^{n-1}x^{2k}\,\mathrm{d}x\\ &=\frac{4}{\pi}\sum_{k=1}^{n}\frac{1}{2k-1}.\end{aligned}\] 从而 \[\begin{align*}&\lim_{n\to\infty}\left[a(n,n)-\frac{2}{\pi}\ln\sqrt{2}n\right]=\lim_{n\to\infty}\left[\frac{4}{\pi}\sum_{k=1}^n\frac{1}{2k-1}-\frac{2}{\pi}\ln\sqrt{2}n\right]\\&=\lim_{n\to\infty}\left[\frac{4}{\pi}\sum_{k=1}^{2n}\frac{1}{k}-\frac{4}{\pi}\ln2n\right]+\lim_{n\to\infty}\left[\frac{2}{\pi}\sum_{k=1}^{n}\frac{1}{k}-\frac{2}{\pi}\lnn\right]+\frac{\ln8}{\pi}\\&=\frac{4}{\pi}\gamma-\frac{2}{\pi}\gamma+\frac{\ln 8}{\pi}\\&=\frac{2}{\pi}\gamma+\frac{\ln 8}{\pi}\\&\approx 1.0293737056545709.\end{align*}\] 定理得证。
上面这些讨论基本上是对 Spitzer著作中内容的重新表述,利用局部中心极限定理可以证明极限的误差项大约是\(O(|x|^{-2})\) 量级的,即
定理 3:\[a(x) =\frac{2}{\pi}\ln|x| + \frac{2\gamma+\ln8}{\pi} +O(|x|^{-2}).\]
证明见 Lawler 书的 4.4 节。下文要用到这个渐进估计的一个推论:
推论:对任何 \(x\in\mathbb{Z}^2\setminus\{0\}\) 和单位向量\(|e|=1\) 有 \[a(x + e) - a(x) = O(|x|^{-1}).\]特别地存在常数 \(M>0\) 使得 \(|a(x+e)-a(x)|\leq M\) 对任何 \(x\) 恒成立。
证明:
\[\begin{align*}a(x+e)-a(x)&=\frac{1}{\pi}\ln\frac{\langlex+e, x+e\rangle}{|x|^2}+O(|x|^{-2})\\&=\frac{1}{\pi}\ln\left(1+\frac{2\langlex,e\rangle+1}{|x|^2}\right)+O(|x|^{-2})\\&\leq\frac{1}{\pi}\ln\left(1+\frac{2}{|x|}+\frac{1}{|x|^2}\right)+O(|x|^{-2})\\&=O(|x|^{-1}).\end{align*}\]
到目前为止我们已经完成了所有的准备工作,只要再用一点点离散鞅的知识(可料停时定理) 就可以得出 A, B获胜概率的渐进表达式。虽然剩下的部分已经没有什么难点,但这个时候要更加耐心点。
先做一些记号的约定。
为了能够使用可料停时定理,我们首先需要说明 \(\{a(S_{n\wedge\tau})\}\) 是一个鞅,且停时\(\tau\) 满足可料停时定理的条件。由于\(a(x)\) 在任何 \(x\ne 0\) 处调和,所以 \(\{a(S_{n\wedge\tau})\}\)是一个鞅是没有问题的。
注意到 \(\{S_{n\wedge\tau}\}\)是一个限制在 \(B(r)\)内的随机游动,它访问其中任何一点的期望步数都是有限的,所以 \(\mathop{\mathrm{\mathbb{E}}}{\tau}<\infty\)。其次根据上一节的推论,\(|a(x+e)-a(x)|\) 是一致有界的,所以停时\(\tau\) 满足 可料停时定理的条件,从而
\[\begin{align*}a(x)&=a(S_0)=\mathbb{E}_x\,a(S_{\tau})\\&=p\cdot\mathbb{E}_x\,\left[a(S_{\tau_{\partial B(r)}})\mid\tau_{\partialB(r)}<\tau_{0}\right]+(1-p)\cdot\mathbb{E}_x\,\left[a(S_{\tau_{0}})\mid\tau_{0}<\tau_{\partialB(r)}\right].\end{align*}\]
其中 \(p=\mathbb{P}(\tau_{\partialB(r)}<\tau_{0})\) 正是随机游动在回到原点之前逃出区域 \(B(r)\) 的概率。但是又注意到 \(a(S_{\tau_{0}})=a(0)=0\),所以上面式子中第二项恒为0,即 \[p=\frac{a(x)}{\mathbb{E}_x\left[a(S_{\tau_{\partialB(r)}})\mid\tau_{\partial B(r)}<\tau_{0}\right]}.\]
记上面的分母为 \(g=\mathbb{E}_x\left[a(S_{\tau_{\partialB(r)}})|\tau_{\partial B(r)}<\tau_{0}\right]\),则 \(g\) 是势核 \(a(\cdot)\) 在圆周 \(\partial B(r)\)上关于一个条件概率测度的积分,而我们已经看到势核 \(a(y)\) 是近似球对称的,它只依赖于 \(|y|\)。当随机游动刚好走到 \(\partial B(r)\) 时,其位置 \(y\) 未必正好落在圆周上,但是满足 \(r-1< |y|\leqr\)。我们滥用一点记号,对任意的实数 \(r>0\),记 \[a(r) = \frac{2}{\pi}\ln r +\frac{2\gamma+\ln8}{\pi},\] 则根据上一节推论同样的道理,当 \(r-1<|y|\leq r\) 时有 \[|a(y) - a(r)| = O(1/r).\] 所以 \(g\) 作为 \(a(\cdot)\) 在 \(\partial B(r)\) 附近的一些 \(y\) 在一个条件概率下的加权组合,其值等于\[\frac{2}{\pi}\ln r +\frac{2\gamma+\ln8}{\pi} + O(r^{-1}).\]
至此我们就证明了如下结论:
定理 4: 设 \(x\inB(r)\) 且 \(x\ne 0\),考虑从\(x\) 出发的简单随机游动,则 \[\mathbb{P}_x(\tau_{\partial B(r)} < \tau_0) =\frac{a(x)}{\dfrac{2}{\pi}\ln r + \dfrac{2\gamma+\ln8}{\pi} +O(r^{-1})}.\]
本文开头的赌局的答案就蕴含在这个定理的结论中:由于从原点出发的随机游动第一步必然走到某个邻居\(x\in\{\pm e_1,\pm e_2\}\)上,所以从原点出发的随机游动能够逃逸到 \(B(r)\) 之外的概率是 \[\frac{1}{4}\sum_{x\in\{\pm e_1,\pme_2\}}\mathbb{P}_x(\tau_{\partialB(r)}<\tau_{0})=\frac{1}{4}\sum_{x\in\{\pm e_1,\pme_2\}}\frac{a(x)}{\dfrac{2}{\pi}\ln r +\dfrac{2\gamma+\ln8}{\pi}+O(r^{-1})}.\] 而 \(a(x)\) 在这四个点上的值都是1,所以这个概率值等于 \[\dfrac{1}{\dfrac{2}{\pi}\ln r +\dfrac{2\gamma+\ln8}{\pi} + O(r^{-1})}\approx\left(\dfrac{2}{\pi}\ln r +1.0293737\right)^{-1},\quad r\to\infty,\] 这也正是我们之前介绍的B 的获胜概率!
我们需要根据第一步将概率进行分解是因为 \(a(x)\) 在 \(x\ne0\) 时才是调和的,从而 \(a(S_{n\wedge\tau})\) 是鞅。
洋洋洒洒一大篇,总算回答了开头提出的一个小问题。你可能要问了:这只是二维的情形呀,如果是三维太阳系中的随机游动,A和 B 获胜的概率又该怎么算?这种情形方法其实是类似的,需要估计势核 Green函数的阶,然后仿照定理 4 进行估计。可以证明在维数 \(d>2\) 时,\(G(x)=G(0,x)\) 的大小近似为 \[G(x)=\frac{\gamma_d}{|x|^{d-2}} + O(|x|^{-d}).\] 其中 \(\gamma_d\) 是一个只与\(d\) 相关的常数。详情可见 Lawler 的书4.3 节。
本文选择 \(d=2\)情形讨论是因为它更有趣,而且这里的结论在后面的文章中会用到。下篇文章见!
]]>本文使用的采样和绘图代码在 Github上。
我们考虑一个看起来很初等的问题:
问题 1:下图是一个边长分别为 \(a,b,c\) 的平行六边形,其中 \(a,b,c\) 都是正整数,内角均为 120 度:
请问:用边长为 1 的菱形密铺它,有多少种不同的方法?
比如下图就是一种密铺的示例:
图中三种不同摆放角度的菱形被染成了不同的颜色。
这个问题的答案很不容易猜到,叫做 Macmahon 公式:
Macmahon 公式:记 \(H(a,b,c)\)为所求的六边形的不同菱形密铺的个数,则 \[H(a,b,c)=\prod_{i=1}^a\prod_{j=1}^b\prod_{k=1}^c\frac{i+j+k-1}{i+j+k-2}.\]
关于 Macmahon 公式的更多故事可以参见我的 另一篇文章,这里不再多介绍。值得注意的是,\(H(a,b,c)\) 的值是指数级增长的,比如对 \(a=b=c=10\) 这种比较小的情形 \(H(a,b,c)\approx9.265\times10^{33}\),已经是一个天文数字了。
真正的问题来了:
问题 2:怎样在所有 \(H(a,b,c)\)种不同的密铺中完全随机地任选一种?(即按照均匀分布采样)
由于 \(H(a,b,c)\)太太太大了,我们不可能先把所有密铺都列出来然后再挑选,所以得设计一个聪明点的方法,这就是Coupling from the path (CFTP) 算法要做的。
假设给定一个有限遍历的 Markov 链 \(M\),其状态空间为 \(S\),平稳分布为 \(\pi\),我们希望以分布 \(\pi\) 从 \(S\) 中随机地取样,即对任何 \(s\in S\),取样抽到 \(s\) 的概率为 \(\pi(s)\)。通常的方法是任选一个初始状态\(s_0\) 然后从 \(s_0\) 出发跑这个 Markov链。可以证明只要运行的时间 \(n\)足够大,则其 \(n\) 时刻的状态 \(s_n\) 服从的分布就可以任意逼近平稳分布:\[|\mathbb{P}(s_n=s) - \pi(s)| <\epsilon,\quad\forall s\in S,\ \forall\epsilon>0.\]这个方法非常简单易行,但是它有两个缺陷:首先它只是一个近似算法,不管\(n\) 取得多么大,返回的 \(s_n\) 的分布只是近似而非严格等于平稳分布\(\pi\);其次为了获得足够的精度采样所需的时间\(n\) (叫做 mixingtime)也不总是那么容易估计的。那么有没有什么办法可以获得精确地服从分布\(\pi\) 的采样呢?
Propp 和 Wilson 提出了如下的想法:既然从初始状态出发向未来 (\(+\infty\) 方向) 跑 Markov链只能无限接近平稳分布,我们何不从无穷远的过去 (\(-\infty\) 方向) 向现在 (时刻 0)跑呢?可以想象当这个链经过了无穷次迭代后,其 0 时刻的状态 \(s_0\) 服从的分布就是平稳分布 \(\pi\)。当然我们没法做到真的从无穷远的过去出发,只可能是选择一个足够大的\(n\) 然后从时刻 \(-n\) 时刻出发向时刻 0跑,但是这样的话就和从 0 时刻向时刻 \(n\) 跑没有什么区别了。Propp 和 Wilson的观察的关键之处在于,只跑一个链是不行的,我们需要从每个 \(s\in S\) 出发,同时跑 \(M\) 的 \(|S|\) 个不同的版本,并且需要它们在时刻 0处耦合在一起 (coupled together),即相遇到了相同的状态。这时输出的状态\(s_0\) 就恰好服从分布 \(\pi\)。如果没有相遇呢?那就从某个更久远的位置开始再来一遍,直到耦合出现为止,这就是coupling from the past 的由来。
其实我上面的描述仍然遗漏了 CFTP 的一些关键细节。为了准确的描述CFTP,我们首先引入 Markov 链的随机映射表示 (random mappingrepresentation)。
随机映射表示能够让我们用计算机程序来模拟 Markov链,它是一个由随机数流驱动的更新函数 \(f:S\times [0, 1]\to S\)。\(f\)本身是确定的,对任何状态 \(s\in S\) 和\(u\in [0,1]\),\(s'=f(s,u)\) 给出 Markov链更新后的状态。特别地当 \(u\)来自某个服从 \([0, 1]\)上的均匀分布的随机变量 \(U\) 时,\(\mathbb{P}(f(s,U)=s')=P_{s,s'}\)。任何有限 Markov链都存在随机映射表示,而且这个表示不是唯一的。最简单的构造方式是用一个阶梯函数:\[f(s_i, u) =\begin{cases}\begin{array}{ll}s_1, &\text{for } u\in[0,P_{i,1}),\\s_2, &\text{for } u\in[P_{i,1}, P_{i,1}+P_{i,2}),\\\vdots&\vdots\\s_j, &\text{for } u\in\left[\sum_{k=1}^{j-1}P_{i,k},\sum_{k=1}^jP_{i,k}\right),\\\vdots &\vdots\\s_n, &\text{for }u\in\left[\sum_{k=1}^{n-1}P_{i,k},1\right].\end{array}\end{cases}\]
假设有一个随机数发生器可以产生独立且服从 \([0,1]\) 上均匀分布的随机变量序列 \(U_0,U_{-1},U_{-2},\ldots\),则我们可以由此来驱动Markov 链 \(M\)从过去的某个时刻向现在运行: \[s_{-n}\xrightarrow{f(s_{-n+1},\,U_{-n+1})}s_{-n+1}\xrightarrow{f(s_{-n+2},\,U_{-n+2})}\cdots\xrightarrow{f(s_0,\,U_0)}s_0.\]
现在我们可以来表述 coupling from the past 算法了。
设 \(M\) 是一个有限遍历的 Markov链,状态空间为 \(S\),\(f: S\times [0, 1]\to S\)是其随机映射表示。\(U_0,U_{-1},\ldots\)是一列随机数,它们分别来自一列独立且服从 \([0,1]\) 上均匀分布的随机变量。记 \((N_1,N_2,\ldots)=(1,2,4,8,\ldots)\),\(-N_{m}\) 将作为我们第 \(m\) 次重启的出发时间。
Coupling from the past 算法:
- 令 \(m=1\)。
- 对每个 \(s\in S\),以 \(s\) 为初始状态,以 \(-N_m\) 为初始时刻向时刻 0 的方向运行 Markov链 \(M\),所有 \(|S|\) 个链使用的随机数流是一样的,都是\((U_{-N_m+1},\ldots,U_{-1},U_0)\)。
- 如果步骤 2 中的 \(|S|\) 个链在时刻0 给出的状态相同,记此状态为 \(s^\ast\),则输出 \(s^\ast\) 并退出程序。否则将 \(m\) 的值加 1 并重复步骤 2。
下图显示了算法的每个重启时刻,相同颜色的随机数是在同一批中生成的。
断言:如果上述步骤以概率 1在有限时间内结束,则其返回值 \(s^\ast\)服从平稳分布 \(\pi\): \[\mathbb{P}(s^\ast = s) = \pi(s),\quad \foralls\in S.\]
注意这里的两个细节:
证明:任取 \(s_i\inS\),只要证明对任何 \(\epsilon>0\) 都有 \[|\mathbb{P}(s^\ast=s_i) -\pi(s_i)|<\epsilon.\] 设 \(\Omega=\{(U_{-1},U_{-2},\ldots)\mid U_i \text{\i.i.d on\ } [0,1]\}\) 是所有随机数流组成的样本空间,\[A = \{ \text{the algorithm terminates in finitetime}\}.\] 即 \(A\)为那些可以使得算法在有限时间内结束的序列组成的集合,则 \(\mathbb{P}(A)=1\)。
又记 \[A_i = \{ \text{the algorithm doesnot need to try starting times earlier than} -N_i\}.\] 即 \(A_i\) 为事件“算法从 \(-N_i\) 或者更早的时间出发可以结束”。
显然我们有 \(A_i\uparrow A\),\(\mathbb{P}(A_i)\uparrow\mathbb{P}(A)=1\)。因此对充分大的\(K\) 有 \(\mathbb{P}(A_K) \geq1-\epsilon\)。取定这样的 \(K\),则在事件 \(A_K\) 上,所有的链在时刻 0 耦合到相同的状态\(s^\ast\)。
除了以上 \(|S|\)条链之外,我们再额外跑一条单独的链 \(Y\),这条链的初始状态选自平稳分布 \(\pi\),也从时刻 \(-N_K\) 出发,也使用相同的随机数 \((U_{-N_K+1},\ldots,U_0)\) 运行至时刻0,并设这个链在时刻 0 的状态为 \(Y_0\),则 \(Y_0\) 服从平稳分布。
在事件 \(A_K\)上,不管这条单独的链初始状态是什么,由于它使用了同样的随机数序列,所以它最后一定会和其余\(|S|\) 条链一起耦合,所以 \[\mathbb{P}(s^\ast=Y_0) \geq \mathbb{P}(A_K)\geq 1- \epsilon.\] 从而对任何 \(s_i\inS\), \[\begin{align*}\mathbb{P}(s^\ast =s_i)-\pi(s_i)&= \mathbb{P}(s^\ast = s_i)-\mathbb{P}(Y_0 =s_i)\\&\leq\mathbb{P}(s^\ast=s_i, Y_0\ne s_i)\\&\leq\mathbb{P}(Y_0\nes^\ast)\\&\leq\epsilon.\end{align*}\] 类似地 \[\begin{align*}\pi(s_i)-\mathbb{P}(s^\ast =s_i)&=\mathbb{P}(Y_0 = s_i)-\mathbb{P}(s^\ast =s_i)\\&\leq\mathbb{P}(Y_0=s_i, s^\ast\ne s_i)\\&\leq\mathbb{P}(Y_0\nes^\ast)\\&\leq\epsilon.\end{align*}\] 从而 \[|\mathbb{P}(s^\ast = s_i)-\pi(s_i)| \leq\epsilon.\] 令 \(K\to\infty\),则 \(\epsilon\downarrow0\)。注意到从过去出发耦合的性质是,对任何样本点\(\omega\in A_K\),如果 \(\omega\) 给出的所有链的耦合状态是 \(s^\ast=s_i\),则从更久远的时刻出发,\(\omega\) 给出的耦合状态仍然是 \(s_i\),即 \(\omega\) 输出的采样结果 \(s^\ast\) 是不会随着 \(K\) 增大而改变的,所以由 \(\epsilon\) 的任意性即得 \(s^\ast\) 服从平稳分布。
CFTP算法的证明看似不难,但其实微妙之处不少,值得细细品味。最主要的地方有三个:
问题 1:为什么说更新函数 \(f\) 的选择不能是任意的?
问题 2:既然 "coupling from the past" 可以,那"coupling to the future" 可不可以?从时刻 0 开始从每个 \(s\in S\) 出发跑 \(|S|\) 个不同的链,直到它们在未来某个时刻\(n\)耦合为止,然后输出第一次耦合时的状态不行吗?
问题 3:每次重启步骤 2时需要复用之前的随机数,这一点在证明中哪里用到了?使用一列新的随机数为什么不可以?
我们用几个例子来说明这三个问题。
考虑含有两个状态 \(S=\{s_1, s_2\}\)的 Markov 链,其转移矩阵为 \(P=\begin{bmatrix}0.5 & 0.5\\0.5 &0.5\end{bmatrix}\),更新函数为 \[f(s_1, u) =\begin{cases}\begin{array}{ll}s_1& \text{for } u \in [0, 0.5)\\s_2 & \text{for } u \in [0.5,1]\end{array}\end{cases}\] 和 \[f(s_2,u) =\begin{cases}\begin{array}{ll}s_2 & \text{for } u \in [0,0.5)\\s_1 & \text{for } u \in [0.5,1]\end{array}\end{cases}\] 于是若从 \(s_1,s_2\)分别出发跑两个不同的链,但是每次使用相同的随机数,则它们要么保持不动,要么交换状态,永不耦合。
向未来耦合的方法是不行的:
Coupling into the future: 从时刻 0 出发同时跑 \(|S|\) 个不同的链,其中链 \(i\) 的初始状态是 \(s_i\)。当所有链首次耦合到同一状态 \(s^\ast\) 时,终止算法并输出 \(s^\ast\) 作为采样状态。
如果把上面 CFTP 的证明照抄在这里的话,会导致如下的问题:设 \(\tau\) 是所有 \(|S|\) 条链首次耦合的时间,\(Y\) 是额外的从时刻 0出发的、初始分布是平稳分布的链,并且使用相同的随机数流,则对任何时刻\(n\ge0\),\(Y_n\)都服从平稳分布。但是当把下标换成随机时间 \(\tau\) 时,\(Y_\tau\)未必仍然服从平稳分布,所以之前的证明不再可用。
我们用一个反例来说明:仍然考虑两个状态 \(S=\{s_1, s_2\}\) 的 Markov 链,其转移矩阵为\(P=\begin{bmatrix}0.5 & 0.5\\1 &0\end{bmatrix}\),即从 \(s_1\)出发的话以 0.5 的概率待在原地,以 0.5 的概率跳到 \(s_2\),从 \(s_2\) 出发的话则总是跳到 \(s_1\)。
这个链的平稳分布为 \(\pi=(\frac{2}{3},\frac{1}{3})\)。现在假设从\(s_1,s_2\) 分别出发,从时刻 0 开始向\(+\infty\) 方向跑两个不同的链,\(\tau\) 是它们首次耦合的时间,则 \(\tau-1\) 时刻它俩必然一个位于 \(s_1\),一个位于 \(s_2\)。但是位于 \(s_2\) 的状态只能转移到 \(s_1\),所以 \(\tau\) 时刻的输出永远是 \(s_1\),从而得到的采样 \(Y_\tau\) 不满足平稳分布。
在 CFTP 的证明中,由于我们总是在固定的时间 0 观察所有链是否耦合,所以\(Y_0\) 是服从平稳分布的。
思考一下,在算法的证明当中,如果在每次迭代中都使用全新的随机数序列的话,那么事件\(A\) 的定义会变成什么?难道是 \(\Omega\)的某个有限子集,使得其包含一个可以耦合的序列?Hmm,这就不太对劲了。直观上看,在第\(m\)次迭代时,由于生成的序列是全新的,有可能它实际上对很小的 \(i\),从 \(-N_i\)出发就可以耦合,这会导致算法过度采样那些很快就可以耦合的短链,从而使得最终的分布不服从平稳分布。
我们仍然用论证 coupling to the future 失败中使用的 Markov链作为例子来说明。我们指定其更新函数 \(f\)为随机映射表示一节中给出的阶梯函数形式。假设算法每次都使用一列新的随机数,其最终输出为\(s^\ast\)。定义随机变量 \(\tau\) 为正整数 \(m\) 使得算法中使用的最早的出发时间为 \(-N_m\),则 \[\begin{align*}\mathbb{P}(s^\ast=s_1)&=\sum_{m=1}^\infty\mathbb{P}(s^\ast=s_1,\tau=m)\\&\geq\mathbb{P}(s^\ast=s_1,\tau=1)+\mathbb{P}(s^\ast=s_1,\tau=2)\\&=\mathbb{P}(\tau=1)\mathbb{P}(s^\ast=s_1|\tau=1)+\mathbb{P}(\tau=2)\mathbb{P}(s^\ast=s_1|\tau=2)\end{align*}\]注意事件 \(\{\tau=1\}\)包含两种不同的演化路径: \[\begin{align*}(1)\quad & s_1\to s_1,\quads_2\to s_1.\\(2)\quad & s_1\to s_2,\quad s_2\to s_1.\end{align*}\]其中只有前者能成功耦合,所以 \(\mathbb{P}(\tau=1)=\frac{1}{2}\),这时输出的状态只能是\(s_1\),所以\(\mathbb{P}(s^\ast=s_1|\tau=1)=1\)。
可以看到这个长度是 1 的短链的耦合只发生在状态 \(s_1\) 上,它非常偏爱 \(s_1\)。
事件 \(\{\tau=2\}\)包含四种不同的演化路径: \[\begin{align*}(1)\quad & s_1\to s_1\tos_1,\quad s_2\to s_1 \to s_1.\\(2)\quad & s_1\to s_2\to s_1,\quad s_2\to s_1 \to s_1.\\(3)\quad & s_1\to s_1\to s_2,\quad s_2\to s_1 \to s_2.\\(4)\quad & s_1\to s_2\to s_1,\quad s_2\to s_1 \tos_2.\end{align*}\]注意以下两种演化路径是非法的,因为每个时刻两个链使用的随机数一样,不可能在某个时刻同时出现一个链\(s_1\to s_2\),另一个 \(s_1\to s_1\) 的情况: \[\begin{array}{ll}(*)\quad & s_1\to s_1\to s_2,\quad &s_2\to s_1 \to s_1.\\(**)\quad & s_1\to s_1\to s_1,\quad &s_2\to s_1 \to s_2.\\\end{array}\]
在我们现在这个错误的版本中,由于使用了全新的随机数流,四种路径都是合法的。这四个路径中前三种都成功耦合,两个耦合于\(s_1\) 一个耦合于 \(s_2\),所以 \(\mathbb{P}(s^\ast=s_1|\tau=2)=\frac{2}{3}\)。
注意到其中第二条路径 \[(2)\quad s_1\tos_2\to s_1,\quad s_2\to s_1 \to s_1.\] 从时刻 \(-1\) 出发就可以耦合,它不应该属于事件 \(\{\tau=2\}\)。每次使用全新的随机数流会导致偏爱\(s_1\) 的短链被过度采样。
我们来具体验证一下: \[\mathbb{P}(\tau=2)=\mathbb{P}(\tau\ne1)\cdot\mathbb{P}(\tau=2\\text{时耦合})=\frac{1}{2}\cdot\frac{3}{4}=\frac{3}{8}.\]
所以 \[\begin{align*}\mathbb{P}(s^\ast=s_1)&\geq\mathbb{P}(\tau=1)\mathbb{P}(s^\ast=s_1|\tau=1)+\mathbb{P}(\tau=2)\mathbb{P}(s^\ast=s_1|\tau=2)\\&=\frac{1}{2}\cdot1+ \frac{3}{8}\cdot\frac{2}{3}\\&=\frac{3}{4}>\pi(s_1).\end{align*}\]
确实如我们的预言,\(s_1\)被过度采样了。
在 CFTP 算法中,我们需要同时跑 \(|S|\) 个不同的链并要求它们在时刻 0处耦合,可以想象当 \(|S|\)很大时所耗的时间和计算量都很不划算。但是如果 \(S\) 是一个偏序集 \((S, \preceq)\),有最大最小元 \(s_\max, s_\min\),并且更新函数 \(f\) 与偏序 \(\preceq\) 相容,即对任何 \(s,s'\in S\),\(u\in[0,1]\), \[s\preceq s' \Rightarrow f(s, u) \preceqf(s', u),\] 则我们每次只要对 \(s_\max, s_\min\)这两个状态跑两个不同的链即可,当它俩耦合时,所有其它的链也会被“挤压”到相同的状态。这就是前面六边形的菱形密铺取样所采取的方法。
我们首先在所有菱形密铺组成的集合 \(S\) 上定义一个偏序 \(\preceq\),这个偏序的定义颇有技巧性,它需要将任一密铺对应到一个不相交的格点路径组,如下图所示:
图中一共出现了 \(c+2\)条不相交的路径,其中最上方和最下方两条路径对任何密铺都是固定的(它俩是用来约束中间的 \(c\)条路径,让它们在翻转的过程不要越界),中间的 \(c\)条路径,每条路径的起点和终点也是固定的,它们从菱形最左边的边的每个单位线段中点出发,每一步分别向右上或者右下走一步,经过\(a+b\)步后到达最右边的边的对应位置。
上图中从菱形的最左边到最右边共有 \(a+b+1\)条竖直的网格线,每一步向右上或者右下走一步会向右移动到下一个网格线,所以总共需要\(a + b\)次到达最右边。不同的路径互不相交,所以它们的终点必须互不相同,因此这些终点必然分别依次是菱形最右边的单位线段的中点。
不难说明所有的菱形密铺和所有不相交路径组之间的一一对应关系:当密铺给定时,从左边每个起点出发开始,根据当前菱形的倾斜方向依次描出路径即可;反之当路径组给定时,可以沿着每条路径铺砖,这样确定所有的“斜”菱形的位置,余下的空白位置只有唯一的方式可以被水平的菱形填充。
我们在所有不相交的路径组之间定义一个偏序:两个路径组 \(\mathcal{P}\preceq\mathcal{P}'\)当且仅当对任何 \(1\leq i\leqc+2\),\(\mathcal{P}\) 中的第\(i\) 条路径 \(p_i\) 整体地位于 \(\mathcal{P}'\) 中第 \(i\) 条路径 \(p_i'\)的下方。在这个偏序下的最大元就是所有路径尽可能地“向上拱”:
而最小元则是所有路径尽可能地“向下走”:
有了偏序,我们还要定义一个与之相容的更新函数 \(f\)。\(f\)的定义是这样的:对一个不相交路径组 \(\mathcal{P}\),我们每次在 \(\mathcal{P}\) 的中间 \(c\) 条路径中,在路径内部 (两头端点除外)任选一个顶点 \(v\):
菱形密铺在三维空间中看起来像是“堆箱子”,这个翻转路径的操作就相当于从中添加/移除一个箱子,并且必须保证这个箱子有三个面可见:
我们来验证 \(f\)是和路径组之间的偏序 \(\preceq\)相容的:设 \(\mathcal{P}\preceq\mathcal{P}'\)是两个不相交路径组,对给定的随机操作 \(u\),\(f(\mathcal{P}, u)\) 和 \(f(\mathcal{P}', u)\) 就是对 \(\mathcal{P}\) 和 \(\mathcal{P}'\) 的同一个位置 \((k, j)\)(即第 \(k\) 条路径中的第 \(j\) 个顶点)同时尝试进行一个 \(\vee\to\wedge\) 或者 \(\wedge\to\vee\) 的操作。不妨假设这个操作是\(\vee\to\wedge\),则有四种可能的结果:\(\mathcal{P}\) 和 \(\mathcal{P}'\)都操作成功,都保持不变或者一个操作成功另一个保持不变。不难验证这四种情况下都有\(f(\mathcal{P},u)\preceq f(\mathcal{P}',u)\)。
由于每个不相交的路径组都可以通过适当操作变为最大元或者最小元,所以这个链是个互通的Markov 链。并且由于 \(\mathcal{P}\)以至少 1/2 的概率在 \(f\)下保持不变,这个链还是非周期的,因此是一个遍历的 Markov链,所以有唯一的平稳分布。但是不难看到这个链还是对称的,所以这个唯一的平稳分布是均匀分布。即从最大元和最小元出发跑CFTP,最终得到的样本服从全体菱形密铺上的均匀分布。
Monotone CFTP 也可以应用在其它许多密铺问题的均匀采样中,例如下图是在\(20\times 20\)的矩形区域的所有多米诺骨牌密铺中均匀采样,同样可以把密铺一一对应到不相交的路径组:
你可能经常听到这样一句话:“做数学要大胆假设,小心求证”。我们今天要介绍的故事主角平面分拆中的Andrews猜想就完美地符合这一点。两个看似风马牛不相及的计数对象,因为有着相同的计数序列,冥冥中被联系在了一起,启发三位数学家Mill, Robins 和 Rumsey解决了一个困难的组合学猜想。整个过程并无高深的内容,但是其中的“信仰一跃”和“灵魂一猜”构成了故事的高潮,而那些繁琐的计算过程不过是小心求证的注脚而已。
本文来自我几年前读 David Bressoud 的
Proofs and Confirmations: The Story of the Alternating Sign MatrixConjecture
一书时的读书笔记,但是叙述与 Bressoud 的书不同:Bressoud 是把 DPP 的Andrews 猜想和 CSPP 的 Macdonald 猜想统一用 \(q-\)超几何级数一起解决的,因此理论较为复杂。由于 Macdonald猜想的证明似乎无法避免使用超几何级数的理论,而本人水平不足,没有看懂这一部分,所以这里只介绍DPP 的 Andrews 猜想,并仅使用初等的 \(q-\)二项式定理作为工具,所以计算步骤会显得有些繁琐。
问题:一个严格错位平面分拆 (strictshifted plane partition) 是一个二维的正整数数组 \(\pi\),其形状如下: \[\begin{matrix}a_{11}&a_{12}&\cdots&\cdots&\cdots&a_{1,\lambda_1}\\ &a_{22}&\cdots&\cdots&\cdots&a_{2,\lambda_2+1}\\ &&\ddots&\cdots&\cdots&\cdots\\ &&&a_{mm}&\cdots&a_{m,\lambda_m+m-1}\end{matrix}\] 其中 \(\pi\)满足如下限制条件:
此外如果 \(\pi\)满足任何一行的长度严格小于该行第一个元素,并且大于等于下一行的第一个元素,即\[a_{11}>\lambda_1\geq a_{22}>\lambda_2\geq\cdots\geqa_{mm}>\lambda_m,\] 就称 \(\pi\)是一个递降平面分拆 (descending planepartition,本文以下简称为 DPP)。显然 DPP 是严格错位平面分拆的子集。
OK,我知道在一个定义里面一下子塞进去这么多定语会让人很晕,所以下面是一张插图:任何类型的平面分拆从“空间鸟瞰图”的角度去看都是在房间中按照一定的规则“堆方块”。例如DPP 分拆 \[\pi\ =\ \begin{matrix}7&7&6&6&3&1\\&6&5&4&2\\&&3&3\\&&&2\end{matrix}\] 对应的鸟瞰图如下图所示:
你可以看到数组的每一行与方块的每一层一一对应。由于 \(\pi\)是严格错位平面分拆,所以每一层相对于下面一层在两个方向上分别缩进一个单位以后仍然可以被下面一层托住,从而不会出现“悬空”的方块。
我们记 \(|\pi|=\sum_{i,j}a_{ij}\) 为\(\pi\) 的所有元素之和。
设 \(\mathrm{dpp}(n)\)为所有数字均不超过 \(n\) 的 DPP组成的集合,这样的 DPP 最多有 \(n-1\)行,每一行长度最多是 \(n-1\),每个元素不大于 \(n\),所以必然能装进一个大小为 \(n\times n\times n\) 的空间(当然不可能填满)。我们的目标是求出生成函数 \[\sum_{\pi\in {\rm dpp}(n)} q^{|\pi|}.\]
例子:\(\mathrm{dpp}(3)\) 总共包含 7 种不同的分拆(空分拆也算一种): \[\mathrm{dpp}(3)=\big\{ \begin{array}{ccccccc} \emptyset, &\begin{matrix}3&3\\&2\end{matrix}, &2, &\begin{matrix}3&3\end{matrix}, &3, &\begin{matrix}3&2\end{matrix}, &\begin{matrix}3&1\end{matrix} \end{array} \big\}.\] 所以其 \(q-\) 计数为 \[\sum_{\pi\in {\rm dpp}(3)} q^{|\pi|}=1+q^2+q^3+q^4+q^5+q^6+q^8.\]
GeorgeAndrews 发现,这个生成函数可以表示为一个 \(q-\) 行列式: \[\sum_{\pi\in {\rm dpp}(n)} q^{|\pi|}=\det\left( \delta_{ij}+q^{i+1} \binom{i+j}{j-1}_q \right)_{1\leq i,j\leq n-1}.\] Andrews 会求 DPP 的计数序列,即令 \(q=1\) 的情形,但是不会算这个 \(q-\) 行列式,事实上这个问题最难的地方就在求\(q-\) 行列式这一步上!不过 Andrews猜出了这个行列式的表达式:
Andrews 猜想: \[\det\left( \delta_{ij}+q^{i+1} \binom{i+j}{j-1}_q \right)_{1\leq i,j\leq n-1}=\prod_{1\leq i,j\leq n}\frac{1-q^{n+i+j-1}}{1-q^{2i+j-1}}.\]
这个猜想最终在 80 年代由 Mills, Robbins, Rumsey 三人解决 1,整个证明过程可谓一波三折,既需要缜密细心的推理,也不乏大胆的猜测,本文接下来就来介绍他们的证明。
了解 DPP背后的故事对理解证明是很有帮助的。对第一次接触递降平面分拆这个名词的读者来说,可能会纳闷:“数学家们为什么要考虑这种看起来很初等的计数问题呢?它似乎不像代数几何、数论中的问题那么有分量,而且还有一些不明所以的限制条件”。这是一种错觉,平面分拆简单的外表背后有许多深刻而有趣的理论。DPP最初是上世纪 70 年代 Andrews 在研究另一类平面分拆循环对称平面分拆 (简称CSPP) 时得到的副产品,我们之前提到 Andrews 会算 DPP 计数序列在 \(q=1\) 的情形,也猜出了 \(q-\)计数的正确答案,但是没有给出证明,不过那时 DPP作为众多平面分拆猜想之一并不显得特别重要。
差不多在与 Andrews 研究 DPP 同样的时期,数学家 Mills, Robbins, Rumsey三人正在为 交错符号矩阵(Alternating Sign Matrix,以下简称 ASM) 猜想而苦苦挣扎,他们考虑的\(n\)阶的交错符号矩阵是指满足如下条件的 \(n\timesn\) 矩阵:
例子:3 阶的交错符合矩阵共有 7 个,其中 6个是置换矩阵,只有一个含有 -1: \[\begin{align*}&\mathrm{ASM}(3)=\Bigg\{ \begin{pmatrix}1&0&0\\0&1&0\\0&0&1\end{pmatrix}, \begin{pmatrix}0&0&1\\0&1&0\\1&0&0\end{pmatrix}, \begin{pmatrix}1&0&0\\0&0&1\\0&1&0\end{pmatrix},\\ &\begin{pmatrix}0&0&1\\1&0&0\\0&1&0\end{pmatrix}, \begin{pmatrix}0&1&0\\1&0&0\\0&0&1\end{pmatrix}, \begin{pmatrix}0&1&0\\0&0&1\\1&0&0\end{pmatrix}, \begin{pmatrix}0&1&0\\1&-1&1\\0&1&0\end{pmatrix} \Bigg\}.\end{align*}\]
Mills 等人通过直观的杨辉三角法猜出了 \({\rmASM}(n)\) 的计数序列,但是对怎样证明它毫无头绪,于是他们求助于MIT 的组合学大师 Stanley,Stanley 告诉他们自己也不会做,但是 Mills等人给出的 ASM 的计数序列看起来与 Andrews 得到的 DPP的计数序列是相同的: \[|\mathrm{dpp}(n)|=|\mathrm{ASM}(n)|=\prod_{j=0}^{n-1}\frac{(3j+1)!}{(n+j+1)!}=1,2,7,42,429,\ldots\] 于是 Mills 等人很自然地转而研究 DPP,希望从中找到解决 ASM猜想的办法。有趣的是他们没能解决 ASM 猜想 (1995/96 年由 Zeilberger 和Kuperberg 分别解决),倒是解决了 DPP 的 Andrews 猜想以及 CSPP 的Macdonald 猜想,这不能不说是“失之东隅,收之桑榆”。
Mills 等人的证明受到了 DPP 与 ASM貌似有相同的计数序列这个事情的启发。在一个 \(n\) 阶 ASM 中,第一行必然有且只有一个 +1(否则有 -1 的话这个 -1 所在的列不可能满足 +1 和 -1 交替出现且列和为+1),这个 +1 所处的位置是一个重要的参数,根据这个 +1 所在的列 \(k\) 可以把 \(\mathrm{ASM}(n)\) 分成 \(n\) 个子集 \(\{A_{n,k},k=1,\ldots,n\}\),Mills等人猜测 \(A_{n,k}\)的大小为 \[\left|A_{n,k}\right|= \begin{pmatrix}n+k-2\\k-1\end{pmatrix} \frac{(2n-k-1)!}{(n-k)!} \prod_{j=0}^{n-2}\frac{(3j+1)!}{(n+j)!}.\] 既然 \({\rm dpp}(n)\) 和\({\rm ASM}(n)\)看起来是一样大小的,那是不是意味着它也应该有一个参数,将\({\rm dpp}(n)\) 对应地分为 \(n\) 个不同的子集呢?
很自然地,Mills 等人猜测在一个 \(\pi\in\mathrm{dpp}(n)\) 中数字 \(n\)出现的次数就是对应的参数,而且他们猜测恰好含有 \(k-1(1\leq k\leq n)\) 个 \(n\) 的 DPP 的个数等于 \(|A_{n,k}|\),这个猜测在他们的证明中起着关键的作用。注意在一个\(\pi\in\mathrm{dpp}(n)\) 中 \(n\) 出现的次数至多是 \(n-1\),否则由于这些 \(n\) 必然都在第一行,不满足 DPP的行首严格大于该行长度的限制。
证明的第一步是把计数问题转化为行列式的求值,为此我们需要一些关于Gauss 二项式系数的结论。
本文需要的预备知识大致分为三点:
其中 Gessel-Viennot引理由于详细叙述起来比较占篇幅,这里就省略了,读者可以参考 Aigner所著《Proofs from The Book》一书 2 的 "Lattice paths anddeterminants" 一节。
Gauss 二项式系数的定义为 \[\binom{n}{k}_q=\frac{(1-q^n)(1-q^{n-1})\cdots(1-q^{n-k+1})}{(1-q^k)(1-q^{k-1})\cdots(1-q)}.\] 其中约定 \(\binom{n}{0}_q=1\)以及 \(k<0\) 时 \(\binom{n}{k}_q=0\)。
关于 Gauss 二项式系数的两个基本结论是:
定理 1: \[\prod_{k=0}^{n-1}(1+xq^k)=\sum_{k=0}^nq^{\binom{k}{2}}\binom{n}{k}_qx^k.\]
定理 2: \[\prod_{k=0}^{n}\frac{1}{1-xq^k}=\sum_{k=0}^\infty\binom{n+k}{k}_qx^k.\]
Gauss 二项式系数有不少等价的描述方式,我们这里要用到的是它等于 Gauss路径的 \(q-\) 计数。
考虑格点图 \(\mathbb{Z}^2\),并设\(A=(0, m)\),\(B=(n,0)\)。一条从 \(A\) 到 \(B\) 的 Gauss 路径 \(P\) 是一个从 \(A\)出发,每一步向右或者向下一个单位距离,经过 \(m+n\) 步后到达 \(B\) 的格点路径,如下图所示:
熟知这样的 Gauss 路径一共有 \(\binom{m+n}{n}\) 条,它们组成的集合记作\(\mathcal{G}(m,n)\)。
我们规定路径 \(P\) 的权重为 \(q^{|P|}\),其中 \(|P|\) 等于 \(P\)与坐标轴所围成的区域中包含的方格的个数,上图中用圆圈标出了这些方格,一共有21 个,所以其权重为 \(q^{21}\)。
关于 Gauss 路径的一个基本结论是,所有 \(\mathcal{G}(m,n)\) 中路径的权重之和等于Gauss 二项式系数 \(\binom{m+n}{n}_q\):\[\sum_{P\in\mathcal{G}(m,n)}q^{|P|} = \binom{m+n}{n}_q.\]
设 \(\pi\in\mathrm{dpp}(n)\)的行首从下到上分别为 \(2\leqa_1 <\cdots < a_m\leq n\),注意 \(a_1\) 是必须大于 1的,因为每一行的第一个元素必须大于该行的长度。我们的策略是先固定行首\(\{a_1,\ldots,a_m\}\),求出行首恰好为集合\(\{a_1,\ldots,a_m\}\) 的那些 DPP的生成函数,然后再对 \(\{a_1,\ldots,a_m\}\) 的所有可能求和。
注意我们这里对 \(a_1,\ldots,a_m\)的标记顺序与前面 DPP 定义中的行的顺序是反着来的,\(a_1\) 是第 \(m\) 行的行首,\(a_2\) 是第 \(m-1\) 行的行首,以此类推,\(a_m\)是第一行的行首。这样做看起来有些奇怪,其实是为了后面记号方便,下面很快就会看到原因。
既然这些行首 \(\{a_1,\ldots,a_m\}\)已经固定,我们就可以把这 \(\sum_{i=1}^ma_i\) 个箱子移走 (后面补上 \(q^{\sum_{i=1}^ma_i}\)的因子即可)。由于递降平面分拆中每一行的行首严格大于该行的长度,所以删去\(a_i\)以后其所在行剩下的部分是一个长度 \(\leqa_i-2\),最大元素 \(\leq a_i\)的序列,这样的序列与从 \((0, a_i)\)出发,每一步向右或者向下,到达 \((a_i-2,0)\) 的 Gauss 路径 \(P_i\in\mathcal{G}(a_i,a_i-2)\)一一对应,所有 \(P_i\)构成一个不相交的格点路径组 \(\mathcal{P}=\{P_1,\ldots,P_m\}\),其起点集合为\(\{A_i=(0, a_i)\}\),终点集合为 \(\{B_j=(a_j-2,0)\}\),如下面的动画所示:
将这些路径投影到地面上就得到如下的示意图:
我们费点笔墨解释下为什么这些路径之间是没有交点的。
注意 \(P_i\) 在 \(x\) 轴上的终点是 \((a_i-2,0)\),而它上方的路径 \(P_{i+1}\) 必然经过 \(x\) 轴上的 \((\lambda_{i-1}-1,0)\) 这个点(我们对路径的标号和原本 \(\pi\)的行号是反着来的,下标越大对应的行越往上),要使得 \(P_i,P_{i+1}\) 不相交就必须有 \(\lambda_{i-1} - 1 > a_i - 2\),即 \(\lambda_{i-1}\geq a_i\),这就是为什么在 DPP的定义中要求每一行的长度大于等于下一行的行首元素。
那为什么 \(P_i,P_{i+1}\) 也不会在\(x\)轴上方相交呢?这是因为假设它们有交点 \(v\),设 \(v\) 的 \(y\) 坐标为 \(h\),则 \(P_i\) 在到达 \(v\) 之前的最后一条水平边的高度 \(h'\geq h\),\(P_{i+1}\) 在从 \(v\) 继续出发接下来的第一条水平边的高度\(h''\leq h\),从而 \(h'\geq h''\),这与 \(\pi\) 的列是严格递降的矛盾。
反之给定这样的一个不相交路径组 \(\mathcal{P}\),我们也可以还原出对应的 DPP来,于是根据 Gessel-Viennot 引理,以 \(\{a_1,\ldots,a_m\}\) 为行首的 DPP 的个数为\[\det\left(\binom{a_i+a_j-2}{a_j-2}\right)_{1\leq i,j\leq m}.\] 其中矩阵的 \((i,j)\)位置的元素为从 \(A_i=(0,a_i)\) 到 \(B_j=(a_j-2,0)\) 的 Gauss路径的个数,这当然是 \(\binom{a_i+a_j-2}{a_j-2}\)。
对所有的 \(2\leq a_1 <\cdots <a_m\leq n\) 求和即为 \({\rmdpp}(n)\) 的个数: \[|{\rm dpp}(n)|=\sum_{2\leq a_1<\cdots< a_m\leqn}\det\left(\binom{a_i+a_j-2}{a_j-2}\right)_{1\leq i,j\leq m}.\] 为了把这个表达式化简,我们用 \(a_i-1\) 代替每个 \(a_i\),于是 \[|{\rm dpp}(n)|=\sum_{1\leq a_1<\cdots< a_m\leqn-1}\det\left(\binom{a_i+a_j}{a_j-1}\right).\] 现在我们只需要一个线性代数的引理:
引理 1:设 \(A\)是一个 \(r\times r\) 矩阵,则 \(\det(I_r+A)\) 等于对 \(A\) 的所有主子式求和,即 \[\det(I_r+A)=\sum_{1\leq a_1<\cdots< a_m\leqr}\det A[a_1a_2\cdots a_m].\] 其中 \(A[a_1a_2\cdots a_m]\)是下标 \(\{a_1,\ldots,a_m\}\) 决定的\(A\) 的 \(m\) 阶子矩阵。
由此我们得到 \[|{\rmdpp}(n)|=\det\left(\delta_{ij}+\binom{i+j}{j-1}\right)_{1\leq i,j\leqn-1}.\] 至此我们就得到了 \(q=1\) 时\({\rm dpp}(n)\)的计数序列的行列式形式。
求 \(q-\)计数的行列式表达式的话需要多做一点微小的工作:由于 Gauss 路径 \(P_i\) 的权重等于 \(q^{|P_i|}\),其中 \(|P_i|\)是位于它下方的方格的总数,这个数目正是在递减平面分拆中,在移走行首 \(a_i\) 后,第 \(i\)层中剩下的方块个数。我们需要说明所有路径权重的乘积在 Gessel-Viennot引理中交换路径的操作后仍然保持不变,否则无法直接使用 G-V 引理。(Bressoud的书插图 3.4 给出了针对通常平面分拆的一个反例)
注意到一个长度为 \(l\) 的 Gauss路径可以用一个长度为 \(l\) 的 0-1 序列\(\sigma\) 来表示,0表示垂直向下的一步,1 表示水平向右的一步,路径下方所含的方格个数与序列\(\sigma\) 的“逆序数” \(\mathrm{inv}(\sigma)\) 相同,这里 \[\mathrm{inv}(\sigma) = \#\{(i,j)\, |\, i < j, 1=\sigma(i)>\sigma(j)=0\}.\] 这个方格个数与逆序对的对应很容易从下图看出来:
上图中 \(\sigma=1110011000\)。
设 \(P\) 和 \(Q\) 是两个 Gauss 路径,其对应的 0,1序列分别为 \(\sigma_1\) 和 \(\sigma_2\),\(P\) 和 \(Q\) 有一个公共的交点 \(v\)。交换 \(P\) 和 \(Q\) 在 \(v\) 之后的部分得到的路径记作 \(P'\) 和 \(Q'\),对应的 0,1 序列分别为 \(\sigma_1'\) 和 \(\sigma_2'\),则不难验证有 \[\begin{align*}|P'|+|Q'|-|P|-|Q|&=\mathrm{inv}(\sigma_1')+\mathrm{inv}(\sigma_2')-\mathrm{inv}(\sigma_1)-\mathrm{inv}(\sigma_2)\\&=(p_0-q_0)(p_1-q_1).\end{align*}\] 这里 \(p_0,q_0\) 分别表示\(P,Q\) 在交点 \(v\) 之后的部分所含的 0的个数,\(p_1,q_1\) 分别表示 \(P,Q\) 在交点 \(v\) 之前的部分所含的 1的个数。
在 DPP 的情形,由于每条路径的出发点都在 \(y\) 轴上,终点都在 \(x\) 轴上,因此 \(P,Q\) 在到达它们的交点处 (如果有的话)各自横向移动的步数相同,从交点到终点各自纵向移动的步数也相同,所以 \(p_0=q_0\),\(p_1=q_1\),从而 \(|P'|+|Q'|=|P|+|Q|\),因此路径权重的乘积\(q^{|P|}\cdot q^{|Q|}=q^{|P'|}\cdotq^{|Q'|}\) 保持不变,从而 Gessel-Viennot 引理仍然可用。
现在顶点集合 \(\{A_i=(0,a_i)\}\),\(\{B_j=(a_j-2,0)\}\),而从 \(A_i\) 到 \(B_j\) 的 Gauss 路径的 \(q-\) 计数为 \(\binom{a_i+a_j-2}{a_j-2}_q\),于是行首分别为\(\{a_1,\ldots,a_m\}\) 的 DPP 的 \(q-\) 计数为 \[q^{\sum_{i=1}^ma_i}\cdot\det\left(\binom{a_i+a_j-2}{a_j-2}_q\right)_{1\leq i,j\leq m}=\det\left(q^{a_i}\binom{a_i+a_j-2}{a_j-2}_q\right)_{1\leq i,j\leq m}.\] 通过用 \(a_i-1\) 代替 \(a_i\) 并使用前面的 引理1,我们得到
定理 3:\({\rmdpp}(n)\) 的 \(q-\) 计数为 \[\det\left(\delta_{ij}+q^{i+1}\binom{i+j}{j-1}_q\right)_{1\leq i,j\leqn-1}.\]
现在剩下的任务就是求这个行列式的值了,而这才是整个故事中最困难的部分,到目前为止我们的路才走了一小半呢。
在上一节中我们已经把 \({\rmdpp}(n)\) 的 \(q-\)计数归结为计算行列式 \(\det(I_{n-1}+H_{n-1})\),其中 \[H_{n-1}=\left(q^{i+1}\binom{i+j}{j-1}_q\right)_{1\leqi,j\leq n-1}.\] 这里你需要小心 \({\rmdpp}(n)\) 对应的是一个 \(n-1\)阶矩阵,这在记号上确实会带来一些困扰。
Mills 等人认为,在一个 \(\pi\in{\rmdpp}(n)\) 中,\(n\)出现的次数是一个重要的参数,根据 \(n\)出现的次数 \(k\) 可以把 \({\rm dpp}(n)\) 分成 \(n\) 个子集 \(\{S_k,k=0,\ldots,n-1\}\),解决问题的关键在于分别求出每个\(S_k\) 的 \(q-\)计数对应的行列式表示,并找到这些行列式满足的递推关系。
定理 4: \(S_k\) 的\(q-\) 计数为 \(\det H_{k,n-1}\),其中 \(H_{k,n-1}\) 在 \(k=0\) 时是把 \(I_{n-1}+H_{n-1}\) 的最后一行用 \((0,\ldots,0,1)\) 替换得到的矩阵,而在 \(k>0\) 时则是把 \(I_{n-1}+H_{n-1}\) 的最后一行用向量 \[q^{kn}\left(\binom{n+0-k}{1-k}_q,\binom{n+1-k}{2-k}_q,\cdots,\binom{n+n-2-k}{n-1-k}_q\right)\] 替换得到的矩阵。
和之前一样,我们规定当 \(m<0\)时有 \(\binom{a}{m}_q=0\)。
证明:\(k=0\)的情形其实就是 \({\rm dpp}(n-1)\) 的\(q-\) 计数,它等于 \(I_{n-2}+H_{n-2}\),正好是 \(I_{n-1}+H_{n-1}\) 的左上角 \(n-2\)阶子矩阵,所以这个情形很简单,下面考虑 \(k>0\) 的情形。
我们还是先从下到上固定每一行的行首 \(\{a_1,\ldots,a_m\}\),求出行首固定时的生成函数,再对所有可能的行首相加。
办法和以前一样:现在除了行首 \(\{a_1,\ldots,a_m\}\)是已知的,我们知道第一行还有 \(k-1\) 个\(n\)出现,并且它们的位置必然是紧跟在行首的 \(n\) 后面。我们把这些已知的 \(\sum_{i=1}^{m-1}a_i+kn\)个箱子移走,将剩下的部分对应到一个不相交的路径组,用 Gessel-Viennot引理得出其生成函数,最后再补上因子 \(q^{\sum_{i=1}^{m-1}a_i+kn}\) 即可。
这个到路径组的对应方法和以前类似,只不过我们截掉 \(\pi\)的第一行路径中已知的部分,以之前的插图为例子并取 \(n=7\):
这里 \(\pi\) 的第一行必然首先从\((0,n)\) 出发,向右走 \(k-1\) 步到达 \((k-1,n)\),然后向下走到 \((k-1,n-1)\)。我们把这部分截去,只保留剩下的部分,这相当于把起点\(A_m=(0, n)\) 换成了 \((k-1,n-1)\),其余的起点和终点保持不变,则新顶点集\(\{A_i\}\) 和 \(\{B_j\}\) 之间的不相交的路径组的 \(q-\) 计数为 (注意由于终点都在 \(x\) 轴上因此 Gesssel-Viennot引理仍可用,important!) \(\detX\),其中 \[x_{ij}=\left\{\begin{align*}&\binom{a_i+a_j-2}{a_j-2}_q, \quad & i < m\\&\binom{n+a_j-k-2}{a_j-k-1}_q, \quad & i=m\end{align*}\right.\] 把因子 \(q^{\sum_{i=1}^{m-1}a_i+kn}\) 补回去,其中\(q^{a_i}\) 补在第 \(i\) 行上,\(kn\) 补在第 \(m\) 行,我们就得到行首为 \(\{a_1,\ldots,a_m\}\) 且恰好含有 \(k\) 个 \(n\) 的 DPP 的 \(q-\) 计数为 \(\det Y\),其中 \[y_{ij}=\left\{\begin{align*}&q^{a_i}\binom{a_i+a_j-2}{a_j-2}_q, \quad & i<m\\&q^{kn}\binom{n+a_j-k-2}{a_j-k-1}_q, \quad & i=m.\end{align*}\right.\] 对每个 \(1\leq i\leq m\) 用\(a_i-1\) 代替 \(a_i\) 得到 \(Y\) 为 \[y_{ij}=\left\{\begin{align*} &q^{a_i+1}\binom{a_i+a_j}{a_j-1}_q, \quad & i < m\\ &q^{kn}\binom{a_m+a_j-k}{a_j-k}_q, \quad & i=m\end{align*}\right.\] 这时 \(1\leq a_1<\cdots<a_{m-1}< a_m=n-1\),从而 \(Y\) 的左上角 \(m-1\) 阶矩阵来自 \(H_{n-1}\) 的左上角 \(n-2\) 阶子矩阵的主子式,\(Y\)的最后一行和最后一列分别来自固定的向量,因此要说明对所有 \(\det Y\) 求和等于 \(\detH_{k,n-1}\),我们只需要一个与之前稍有不同的线性代数结论:
引理 2:设 \(A\)是一个 \(n-1\) 阶方阵,\(D_{n-1}\) 是前 \(n-2\) 个对角元为 1,其余元素均为 0 的 \(n\) 阶对角矩阵,则 \[\det(D_{n-1}+A)=\sum_{1\leq a_1<\cdots< a_{m-1}\leq n-2}\detA[a_1\cdots a_{m-1}|n-1],\] 这里求和项跑遍由下标 \(\{a_1,\ldots,a_{m-1},n-1\}\) 决定的 \(A\) 的 \(m\) 阶主子式。
这就完成了定理的证明。
记 \(h_n=\det(I_n+H_n)\) 为 \({\rm dpp}(n+1)\) 的 \(q-\) 计数,\(h_{kn}=\det H_{kn}\) 是其中 \(n+1\) 恰好出现 \(k(0\leq k\leq n)\) 次的 \(q-\) 计数,则 \(\sum_{k=0}^n h_{kn}=h_n\)。特别地 \(h_{0n}\) 是 \(n+1\) 出现 0 次的 \(q-\) 计数,因而等于 \({\rm dpp}(n)\) 的 \(q-\) 计数,即 \(h_{0n}=h_{n-1}\)。总之我们有一个三角形的二维数组,其每一行的和等于下一行的首元素。
\({\rmdpp}(n+1)\) | \(h_n\) | \(h_{0n}\) | \(h_{1n}\) | \(h_{2n}\) |
---|---|---|---|---|
\(n=0\) | \(h_0\) | \(1\) | \(\phantom{}\) | \(\phantom{}\) |
\(n=1\) | \(h_1\) | \(1\) | \(q^2\) | \(\phantom{}\) |
\(n=2\) | \(h_2\) | \(1+q^2\) | \(q^3+q^4+q^5\) | \(q^6+q^8\) |
注意 \(H_{kn}\),\(h_{kn}\) 这些记号来自 \(n\) 阶矩阵,但它们对应的都是 \({\rm dpp}(n+1)\) 中的分拆。
由于 \(I_n+H_n\) 和所有的 \(\{H_{kn},k=0,\ldots,n\}\) 的前 \(n-1\)行都相同,仅最后一行不同,所以它们最后一行有共同的代数余子式,设列向量\(C=(c_1,\ldots,c_n)^{T}\)为它们最后一行元素对应的代数余子式,\(R_k\) 是 \(H_{kn}\) 的最后一行,则 \(R_k\cdot C=\det H_{kn}=h_{kn}\)。于是设\(R\) 是由 \(R_1,\ldots,R_n\) 为行向量排成的 \(n\times n\) 矩阵 (不含 \(k=0\)),则 \[RC = \begin{pmatrix}h_{1n}\\h_{2n}\\\vdots\\h_{nn}\end{pmatrix}.\] 注意到 \(R\)是一个对角线上都是 1 的上三角矩阵 (在 定理 4 中对 \(n+1\) 的情形依次令 \(k=1,\ldots,n\)),所以 \(R\) 是可逆的,从而 \[C = R^{-1}\begin{pmatrix}h_{1n}\\h_{2n}\\\vdots\\h_{nn}\end{pmatrix}.\] 另一方面对矩阵 \(H_{0n}\),其最后一行 \(R_0\) 满足 \(R_0\cdot C=\detH_{0n}=h_{0n}\),而其它的任何行与 \(C\) 的内积是 0,所以 \[H_{0n}C=\begin{pmatrix}0\\0\\\vdots\\h_{0n}\end{pmatrix}=h_{0n}\begin{pmatrix}0\\0\\\vdots\\1\end{pmatrix}.\] 于是 \[RH_{0n}R^{-1}\begin{pmatrix}h_{1n}\\h_{2n}\\\vdots\\h_{nn}\end{pmatrix}=RH_{0n}C=h_{0n}R\begin{pmatrix}0\\0\\\vdots\\1\end{pmatrix}.\] 记 \(A_n=RH_{0n}R^{-1}\),\[V_n=R\begin{pmatrix}0\\0\\\vdots\\1\end{pmatrix},\] 则我们有 \[\begin{equation}A_n\begin{pmatrix}h_{1n}\\h_{2n}\\\vdots\\h_{nn}\end{pmatrix}=h_{0n}V_n.\end{equation}\label{eq:recurrent}\tag{1}\]
到目前为止这些都是寻常的线性代数操作,并无出彩之处。\(A_n\) 和 \(V_n\)都是可以计算出来的(你从右边目录栏里面可以看到这一点),而 \(\{h_{kn}\}\) 是我们要求的。Mills等人的想法是:上式中给出的递推关系,加上我们已知的初始条件 \(h_1=1+q^2\),是否能够唯一确定序列 \(\{h_{kn}\}\)?答案是肯定的:
引理 3:如果序列 \(\{b_{kn},n\geq1,0\leq k\leq n\}\) 满足
- 初始条件 \(b_1=h_1\)。
- 每一行的和等于下一行的首元素,即对任何 \(n\geq1\) 有 \(\sum_{k=0}^nb_{kn}=b_n=b_{0,n+1}\)成立。
- 设 \(A_n,V_n\) 如前,且 \[A_n\begin{pmatrix}b_{1n}\\b_{2n}\\\vdots\\b_{nn}\end{pmatrix}=b_{0n}V_n.\]
则对任何 \(k,n\) 都有 \(b_{kn}=h_{kn}\) 成立。
证明:对 \(n\)归纳,\(b_1=h_1\) 是已知的,设 \(b_i=h_i\) 对所有 \(i<n\) 成立,则 \(b_{0n}=h_{0n}\),于是 \((b_{1n},\ldots,b_{nn})^T\) 和 \((h_{1n},\ldots,h_{nn})^T\) 都是线性方程组\(A_nX=h_{0n}V_n\)的解,由于 \(A_n\) 是可逆矩阵,此方程组有唯一解,从而\(b_{kn}=h_{kn}\) 对任何 \(k,n\) 成立。
所以如果我们能构造出一个满足 引理 3中三个条件的序列来,那么它必然就是我们要求的 \(\{h_{kn}\}\)。怎么构造好呢?我们观察 \((\ref{eq:recurrent})\): \[\begin{equation}A_n\begin{pmatrix}h_{1n}\\h_{2n}\\\vdots\\h_{nn}\end{pmatrix}=h_{0n}V_n.\end{equation}\] 看起来 \(h_{0n}\)孤零零地放在右边,这不美观啊?可不可以把它和 \(h_{1n},\ldots,h_{nn}\) 放在一起呢?这就是Mills 等人接下来的精彩操作了:记 \[K_n=\begin{pmatrix}\ast&\ast\\V_n&I_n-A_n\end{pmatrix}.\] 注意 \(K_n\) 是一个 \(n+1\) 阶的矩阵,\(\ast\) 位置是 \(K_n\) 的第一行,暂时不确定是什么,但是不管\(\ast\) 是什么,\(K_n\) 都满足 \[K_n\begin{pmatrix}h_{0n}\\h_{1n}\\\vdots\\h_{nn}\end{pmatrix}= \begin{pmatrix}\ast\\h_{1n}\\\vdots\\h_{nn}\end{pmatrix}.\]上面右边向量的第一个分量不知道,但是它应该是什么是显而易见的,肯定是\(h_{0n}\) 啊!这不就是一个特征值是 1的特征向量嘛?所以我们下面的任务肯定是构造合适的 \(K_n\),使得 \[K_n\begin{pmatrix}h_{0n}\\h_{1n}\\\vdots\\h_{nn}\end{pmatrix}= \begin{pmatrix}h_{0n}\\h_{1n}\\\vdots\\h_{nn}\end{pmatrix}.\] 成立啊!
所以如果我们能在 \(K_n\) 中适当填入\(\ast\) 位置的元素,并找到 \(K_n\) 的任何一个特征值是 1的特征向量 \(v_n=(v_{0n},\ldots,v_{nn})^T\),则 \[\begin{pmatrix}v_{0n}\\v_{1n}\\\vdots\\v_{nn}\end{pmatrix}=K_n\begin{pmatrix}v_{0n}\\v_{1n}\\\vdots\\v_{nn}\end{pmatrix}=\begin{pmatrix}v_{0n}\\v_{0n}V_n+(I_n-A_n)\begin{pmatrix}v_{1n}\\\vdots\\v_{nn}\end{pmatrix}\end{pmatrix}.\] 即 \[A_n\begin{pmatrix}v_{1n}\\\vdots\\v_{nn}\end{pmatrix}=v_{0n}V_n.\] 则 \(\{v_{kn}\}\) 与 \(\{h_{kn}\}\)满足同样的递推关系,仅初始条件不同。根据 引理3,它们只会相差一个倍数。
假设我们已经得到了 \(\{v_{kn}\}\),那么 \(\{h_{kn}\}\) 可以通过如下方式得到:
记 \(b_{01}=1,b_{11}=q^2\),以及\(b_1=b_{01}+b_{11}=1+q^2\)。即我们令\(\{b_{kn}\}\) 与 \(\{h_{kn}\}\) 在 \(n=1\) 时有同样的初始条件。
假设对所有 \(i<n\) 我们已经得到了\(\{b_{ki}\mid 0\leq k\leq i\}\),从而\(b_i=\sum_{k=0}^ib_{ki}\)也是知道的。对 \(n\) 的情形,我们对\(\{v_{kn}\}\) 整体进行一个放缩,使得\(v_{0n}\) 变成 \(b_{n-1}=b_{0n}\),则其它的 \(v_{kn}\) 必然变成了 \(b_{kn}\)。即令 \(b_{kn}=\dfrac{b_{n-1}}{v_{0n}}v_{kn}\)。不难验证\(\{b_{kn}\}\) 满足 引理 3 的条件,从而必然等于 \(\{h_{kn}\}\),这样就得到了 DPP 的 \(q-\) 计数。
Mills 等人算出了 \(I_n-A_n\) 和\(V_n\): \[\begin{align*}I_n-A_n&=\left((-1)^{j}q^{(i-j)(n+1)+ij}q^{\binom{j+1}{2}}\binom{2n-i}{n-i-j}_q\right)_{1\leqi,j\leq n},\\V_n&=\left(q^{k(n+1)}\binom{2n-k}{n-k}_q\right)^T_{1\leq k\leq n}.\end{align*}\] 如果要把 \(I_n-A_n\) 填入\(K_n\) 的右下角 \(n\times n\) 的位置,那么 \(K_n\) 的其它位置应该是什么呢?注意到如果在\(I_n-A_n\) 的表达式中令下标 \(j=0\),则得到的列向量正是 \(V_n\),那 \(K_n\) 是什么已经呼之欲出了:它应该是把\(I_n-A_n\) 中的 \(i,j\) 下标各自扩展到 0 后得到的 \(n+1\) 阶方阵,即 \[K_n=\left((-1)^{j}q^{(i-j)(n+1)+ij}q^{\binom{j+1}{2}}\binom{2n-i}{n-i-j}_q\right)_{0\leqi,j\leq n}.\] 于是 \(V_n\) 正好位于 \(K_n\) 的左下方,\(I_n-A_n\) 正好位于 \(K_n\) 的右下方。
这一步即为 Mills 等人的“信仰一跃”。
然而看到 \(K_n\)的表达式还是不免让人倒吸一口凉气,这么复杂的矩阵,Mills等人是怎么猜出它的特征值是 1 的特征向量来的呢?
我们之前说过,Mills 等人研究 DPP 的目的是为了解决 ASM的计数。他们正确的猜出了 \({\rmASM}(n)\) 中第一行的 1 恰好出现在第 \(1\leq k\leq n\) 列的 ASM 个数为 \[|A_{n,k}|=\binom{n+k-2}{k-1}\frac{(2n-k-1)!}{(n-k)!}\prod_{j=0}^{n-2}\frac{(3j+1)!}{(n+j)!}.\] 而且他们直觉认为这就是 \({\rmdpp}(n)\) 中恰好含有 \(k-1\) 个\(n\) 的 DPP 的个数,即 \(h_{k-1,n-1}\),所以他们猜测特征向量 \(v_n\) 的第 \(k\) 个分量 \(v_{kn}\) 应该形如 \[q^{\text{some power}}\times\binom{n+k}{k}_q\binom{2n-k}{n-k}_q.\] 经过试验以后他们发现取 \[v_{kn}=q^{k(n+1)}\binom{n+k}{k}_q\binom{2n-k}{n-k}_q\] 即可。这一步即为 Mills 等人的“灵魂一猜”。
经过计算可以得到 \[v_{0n}=\binom{2n}{n}_q,\quad\sum_{k=0}^nv_{kn}=\binom{3n+1}{n}_q.\] 所以如前所述记 \(b_{kn}=b_{n-1}\dfrac{v_{0n}}{v_{kn}}\),则\[b_n=\sum_{k=0}^nb_{kn}=b_{n-1}\frac{\sum_{k=0}^nv_{kn}}{v_{0n}}=b_{n-1}\frac{\binom{3n+1}{n}_q}{\binom{2n}{n}_q}.\] 此即为序列 \(\{b_n\}\)满足的递推关系。再结合 \[b_1=h_1=1+q^2=\frac{1-q^4}{1-q^2}=\frac{\binom{3+1}{1}_q}{\binom{2}{1}_q},\] 我们就算出了 \({\rmdpp}(n+1)\) 的 \(q-\) 计数为\[h_n=b_n=\prod_{k=1}^n\frac{\binom{3k+1}{k}_q}{\binom{2k}{k}_q}=\prod_{1\leqi\leq j\leq n+1}\frac{1-q^{n+i+j}}{1-q^{2i+j-1}}.\]
注:我们来验证一下连乘积 \(\prod\limits_{k=1}^n\dfrac{\binom{3k+1}{k}_q}{\binom{2k}{k}_q}\)确实等于 Andrews 猜想中给出的表达式 \[\prod\limits_{1\leq i\leq j\leqn+1}\frac{1-q^{n+i+j}}{1-q^{2i+j-1}}.\]过程并不复杂,只是一些下标的变换而已。记 \[\prod_{1\leq i\leq j\leq n+1}\frac{1-q^{n+i+j}}{1-q^{2i+j-1}} =\frac{x_{n+1}}{y_{n+1}},\] 则 \(y_{n+1}=y_n\prod\limits_{i=1}^{n+1}(1-q^{2i+n})\),分离分子中\(j=n+1\) 的部分有 \[\begin{align*}x_{n+1}&=\prod_{i=1}^n\prod_{j=i}^n(1-q^{n+i+j})\cdot\prod_{i=1}^{n+1}(1-q^{2n+i+1})\\&=\prod_{i=1}^{n-1}\prod_{j=i}^n(1-q^{n+i+j})\cdot\prod_{i=1}^{n+1}(1-q^{2n+i+1})\cdot (1-q^{3n})\\&=\prod_{i=2}^n\prod_{j=i-1}^n(1-q^{n+i+j-1})\cdot\prod_{i=1}^{n+1}(1-q^{2n+i+1})\cdot (1-q^{3n})\\&=\prod_{i=2}^n\prod_{j=i}^n(1-q^{n+i+j-1})\cdot\prod_{i=1}^{n+1}(1-q^{2n+i+1})\prod_{i=2}^n(1-q^{n+2i-2})\cdot(1-q^{3n})\\&=\prod_{i=2}^n\prod_{j=i}^n(1-q^{n+i+j-1})\cdot\prod_{i=1}^{n+1}(1-q^{2n+i+1})\prod_{i=1}^{n}(1-q^{n+2i})\\&=x_n\cdot\prod_{i=1}^{n+1}(1-q^{2n+i+1})\prod_{i=1}^{n}(1-q^{n+2i})/\prod_{j=1}^n(1-q^{n+j}).\end{align*}\] 所以 \[\frac{x_{n+1}}{y_{n+1}}=\frac{x_n}{y_n}\cdot\frac{\prod_{i=1}^{n+1}(1-q^{2n+i+1})\prod_{i=1}^{n}(1-q^{n+2i})}{\prod_{j=1}^n(1-q^{n+j})\prod_{i=1}^{n+1}(1-q^{2i+n})}=\frac{\binom{3n+1}{n}_q}{\binom{2n}{n}_q}.\]
下面进入“小心求证”的部分,这里主要的工具是前面的 Gauss 二项式 定理 1 和 定理2。我们要计算 \(I_n-A_n=I_n-RH_{0n}R^{-1}\),为此需要先计算\(R^{-1}\)。
从 定理 4 可知 \[R=\left(q^{i(n+1)}\binom{n+j-i}{j-i}_q\right)_{1\leq i,j\leq n}.\] 利用 \(\prod_{k=0}^n(1-xq^k)\cdot\prod_{k=0}^n\dfrac{1}{(1-xq^k)}=1\)得到 \[\left(\sum_{k=0}^{n+1}(-1)^kq^{\binom{k}{2}}\binom{n+1}{k}_qx^k\right)\left(\sum_{l=0}^\infty\binom{n+l}{l}_qx^l\right)=1.\] 对 \(1\leq i,j\leqn\),比较两边 \(x^{j-i}\)项的系数,右边显然是 \(\delta_{ij}\),左边取第一个因子的 \(x^{k-i}\) 项系数,取第二个因子的 \(x^{j-k}\) 项系数并对 \(k\) 求和,有 \[\sum_{i\leq k\leq j}(-1)^{k-i}q^{\binom{k-i}{2}}\binom{n+1}{k-i}_q\binom{n+j-k}{j-k}_q =\delta_{ij}.\] 采用之前 \(\binom{a}{-m}_q=0\)的约定的话,上式可以写成 \[\sum_{1\leq k\leq n}(-1)^{k-i}q^{\binom{k-i}{2}}\binom{n+1}{k-i}_q\binom{n+j-k}{j-k}_q=\delta_{ij}.\] 这说明 \(\left((-1)^{j-i}q^{\binom{j-i}{2}}\binom{n+1}{j-i}_q\right)_{1\leqi,j\leq n}\) 和 \(\left(\binom{n+j-i}{j-i}_q\right)_{1\leq i,j\leqn}\) 互为逆矩阵。而后者与 \(R\)的第 \(i\) 行相差 \(q^{i(n+1)}\) 的因子,所以给前者的第 \(j\) 列补上 \(q^{-j(n+1)}\) 的因子便可得到 \[R^{-1}=\left((-1)^{j-i}q^{\binom{j-i}{2}}q^{-j(n+1)}\binom{n+1}{j-i}_q\right)_{1\leqi,j\leq n}.\]
记 \(H_n^\ast\) 是与 \(H_n\) 的前 \(n-1\) 行全相同,但是最后一行全是 0的矩阵,则 \(H_{0n}=I_n+H_n^\ast\),于是 \(RH_{0n}R^{-1}=I_n+RH_n^\astR^{-1}\),所以只要计算 \(RH_n^\astR^{-1}\) 即可。
首先由于 \(H_n^\ast\) 的最后一行是0,所以 \(H_n^\ast R^{-1}\)的最后一行也是 0,其它行的 \((i,j)\)分量为当 \(i<n\) 时为 \[\sum_{k=1}^n(H_n^*)_{ik}(R^{-1})_{kj}=q^{i+1-j(n+1)}\sum_{k=1}^n(-1)^{j-k}q^{\binom{j-k}{2}}\binom{i+k}{k-1}_q\binom{n+1}{j-k}_q.\] 用 Gauss 二项式定理展开 \[\prod_{l=0}^n(1-xq^l)\cdot\prod_{l=0}^{i+1}\frac{1}{1-xq^l}=\prod_{l=i+2}^n(1-xq^l)\]左边第一个因子的 \(x^{j-k}\) 项系数为\((-1)^{j-k}q^{\binom{j-k}{2}}\binom{n+1}{j-k}_q\),第二个因子中\(x^{k-1}\) 项系数为 \(\binom{i+k}{k-1}_q\),相乘并对 \(k\) 求和后是右边 \(x^{j-1}\) 项系数,利用代换 \(z=xq^{i+2}\) 不难得出此系数为 \[(-1)^{j-1}q^{(i+2)(j-1)}q^{\binom{j-1}{2}}\binom{n-i-1}{j-1}_q.\] 于是 \[\begin{align*}\sum_{k=1}^n(H_n^*)_{ik}(R^{-1})_{kj}&=q^{i+1-j(n+1)}q^{(i+2)(j-1)}(-1)^{j-1}q^{\binom{j-1}{2}}\binom{n-i-1}{j-1}_q\\&=q^{ij-jn}(-1)^{j-1}q^{\binom{j}{2}}\binom{n-i-1}{j-1}_q.\end{align*}\] 即 \[H_n^*R^{-1}=\left( q^{ij-jn}(-1)^{j-1}q^{\binom{j}{2}}\binom{n-i-1}{j-1}_q \right)_{1\leq i,j\leq n}.\] 如果约定 \(\binom{-a}{m}_q=0\) 的话我们可以把 \(H_n^*R^{-1}\) 最后一行都是 0也统一到上面的表达式中。
继续 \[\sum_{k=1}^n(R)_{ik}(H_n^*R^{-1})_{kj}=\sum_{k=1}^nq^{i(n+1)}\binom{n+k-i}{k-i}_qq^{kj-jn}(-1)^{j-1}q^{\binom{j}{2}}\binom{n-k-1}{j-1}_q.\]把右边与 \(k\)无关的项提出来,得到其等于 \[(-1)^{j-1}q^{(i-j)(n+1)+ij}q^{\binom{j+1}{2}}\sum_{k=1}^nq^{(k-i)j}\binom{n+k-i}{k-i}_q\binom{n-k-1}{j-1}_q.\] 把 \(\binom{n-k-1}{j-1}_q\)改写为 \(\binom{j-1+(n-k-j)}{n-k-j}_q\),可以将其进一步化为\[(-1)^{j-1}q^{(i-j)(n+1)+ij}q^{\binom{j+1}{2}}\sum_{k=1}^n q^{(k-i)j}\binom{n+k-i}{k-i}_q\binom{j-1+(n-k-j)}{n-k-j}_q.\] 注意 \(\binom{j-1+(n-k-j)}{n-k-j}_q\) 是 \(\prod\limits_{l=0}^{j-1}\frac{1}{1-xq^l}\)中 \(x^{n-k-j}\) 项的系数,\(q^{(k-i)j}\binom{n+k-i}{k-i}_q\) 是 \(\prod\limits_{l=j}^{n+j}\frac{1}{1-xq^l}\)中 \(x^{k-i}\) 项的系数,二者相乘并对\(k\) 求和得到的是 \(\prod\limits_{l=0}^{n+j}\frac{1}{1-xq^l}\)中 \(x^{n-i-j}\) 项的系数,即 \(\binom{2n-i}{n-i-j}_q\),于是 \[RH_n^*R^{-1}=\left( (-1)^{j-1}q^{(i-j)(n+1)+ij}q^{\binom{j+1}{2}}\binom{2n-i}{n-i-j}_q \right)_{1\leq i,j\leq n}.\] 从而 \[I_n-A_n=-RH_n^*R^{-1}=\left( (-1)^{j}q^{(i-j)(n+1)+ij}q^{\binom{j+1}{2}}\binom{2n-i}{n-i-j}_q \right)_{1\leq i,j\leq n}.\]
列向量 \(V_n\) 比较好求,它就是\(R\) 的最后一列,也就是分别取出 \(H_{1n},\ldots,H_{nn}\)最右下角元素后排成的列向量,即 \[V_n=\left(q^{k(n+1)}\binom{2n-k}{n-k}_q\right)^T_{1\leq k\leq n}.\]
我们来验证 \(\left(q^{k(n+1)}\binom{n+k}{k}_q\binom{2n-k}{n-k}_q\right)_{0\leqk\leq n}\) 是 \(K_n\)的特征向量。 \[\sum_{k=0}^n(K_n)_{ik}v_{kn}=\sum_{k=0}^n(-1)^{k}q^{i(n+1)+ik}q^{\binom{k+1}{2}}\binom{2n-i}{n-i-k}_q\binom{n+k}{k}_q\binom{2n-k}{n-k}_q.\] 利用 Gauss 二项式的定义不难验证 \[\binom{2n-i}{n-i-k}_q\binom{n+k}{k}_q=\binom{2n-i}{n-i}_q\binom{n-i}{k}_q.\] 所以 \[\sum_{k=0}^n(K_n)_{ik}v_{kn}=q^{i(n+1)}\binom{2n-i}{n-i}_q\sum_{k=0}^n(-1)^{k}q^{ik}q^{\binom{k+1}{2}}\binom{n-i}{k}_q\binom{2n-k}{n-k}_q.\] 所以要证明 \(\sum_{k=0}^n(K_n)_{ik}v_{kn}=v_{in}\),只要再证明\[\sum_{k=0}^n(-1)^{k}q^{ik}q^{\binom{k+1}{2}}\binom{n-i}{k}_q\binom{2n-k}{n-k}_q=\binom{n+i}{i}_q.\] 实际上右边是 \(\prod\limits_{l=0}^i\dfrac{1}{1-xq^l}\) 中\(x^n\) 项的系数,而 \[\prod\limits_{l=0}^i\dfrac{1}{1-xq^l} =\left(\prod\limits_{l=i+1}^n(1-xq^l)\right) \left(\prod\limits_{l=0}^n\dfrac{1}{1-xq^l}\right).\] 取第一个因子的 \(x^k\)项系数,第二个因子的 \(x^{n-k}\)项系数相乘并对 \(k\)求和即为所求等式。
最后我们来验证 \[\sum\limits_{k=0}^nv_{kn}=\sum\limits_{k=0}^nq^{k(n+1)}\binom{n+k}{k}_q\binom{2n-k}{n-k}_q=\binom{3n+1}{n}_q.\] 只要比较 \[\left(\prod_{l=0}^n\frac{1}{1-xq^l}\right)\left(\prod_{l=n+1}^{2n+1}\frac{1}{1-xq^l}\right)=\left(\prod_{l=0}^{2n+1}\frac{1}{1-xq^l}\right)\] 两边 \(x^n\)项的系数,取左边第一个因子的 \(x^k\)项系数,第二个因子的 \(x^{n-k}\)系数并对 \(k\) 求和即得。
]]>但是 Humphreys 也解释了 BGG 证明的优点,比如 Proposition 24.2中证明一般 Verma 模具有有限合成列几乎无法避免使用 Harish-Chandra定理。
令 \(\mathfrak{g}\)表示一个有限维复半单李代数,\(U(\mathfrak{g})\) 是 \(\mathfrak{g}\) 的泛包络代数,\(\mathfrak{h}\) 是 \(\mathfrak{g}\) 的 Cartan 子代数。\(\Delta\) 是一组单根系,\(\Phi\) 是根系,则 \(\Phi=\Phi^+\cup\Phi^-\)是正根和负根的并。
\(\mathfrak{g}\) 有根空间分解 \[\mathfrak{g}=\bigoplus_{\alpha\in\Phi^+}(\mathfrak{g}_\alpha\oplus\mathfrak{g}_{-\alpha})\oplus\mathfrak{h}.\]其中每个根空间 \(\mathfrak{g}_\alpha,\mathfrak{g}_{-\alpha}\)都是一维的且 \([\mathfrak{g}_{\alpha},\mathfrak{g}_{-\alpha}]\subset\mathfrak{h}\)。当 \(\alpha+\beta\ne0\) 时 \([\mathfrak{g}_{\alpha},\mathfrak{g}_{\beta}]=0\)。
Killing 型 \(\kappa(x,y)\) 限制在\(\mathfrak{h}\)上是非退化的,于是我们可以把 \(\mathfrak{h}\) 和它的对偶空间 \(\mathfrak{h}^\ast\) 等同起来:对任何 \(\lambda\in\mathfrak{h}^\ast\),都存在 \(t_\lambda\in\mathfrak{h}\) 使得对任何 \(h\in\mathfrak{h}\) 有 \(\lambda(h) = \kappa(t_\lambda, h)\)。
我们可以把 Killing 型迁移到 \(\mathfrak{h}^\ast\) 上,定义 \(\mathfrak{h}^\ast\) 上的对称双线性型 \((\cdot,\cdot)\) 为 \[(\lambda,\mu) = \kappa(t_\lambda,t_\mu),\quad\lambda,\,\mu\in\mathfrak{h}^\ast.\]
将 \(\mathfrak{h}^\ast\) 看作实数域\(\mathbb{R}\) 上的向量空间,记作 \(\mathfrak{h}^\ast_{\mathbb{R}}\),则 \((\cdot,\cdot)\) 成为 \(\mathfrak{h}^\ast_{\mathbb{R}}\) 上的一个Euclidean 内积。
Humphreys proposition 8.3:设 \(\alpha\in\Phi^+\) 是正根,\(e_\alpha\in\mathfrak{g}_\alpha\),\(f_\alpha\in\mathfrak{g}_{-\alpha}\),则:
- \([e_\alpha,f_\alpha] = \kappa(e_\alpha,f_\alpha)t_\alpha\)。其中 \(t_\alpha\in\mathfrak{h}\) 是与 \(\alpha\) 等同的元素。
- 特别若 \(e_\alpha,f_\alpha\) 满足\(\kappa(e_\alpha,f_\alpha)=\frac{2}{\kappa(t_\alpha,t_\alpha)}\),则\([e_\alpha,f_\alpha]=\frac{2t_\alpha}{\kappa(t_\alpha,t_\alpha)}=h_\alpha\)。\(h_\alpha\) 叫做 \(\alpha\) 的余根(coroot)。
- 三元组 \(\{e_\alpha,f_\alpha,h_\alpha\}\) 生成一个 \(\mathfrak{sl}_2(\mathbb{C})\) 子代数。
在初学的时候我经常分不清 \(t_\alpha\) 和 \(h_\alpha\),每次看到它俩都要想一会儿它们的含义。其实它俩是用在不同的场景中:
\(t_\alpha\)的使用场景是,当线性泛函 \(\alpha\in\mathfrak{h}^\ast\) 作用在 \(h\in\mathfrak{h}\) 上时,我们可以把 \(\alpha(h)\) 等价地写成 \((t_\alpha, h)\)。
\(h_\alpha\)的使用场景是,在计算关于 \(\alpha\)的反射 \[s_\alpha(\lambda) = \lambda -2\frac{(\lambda,\alpha)}{(\alpha,\alpha)}\alpha\]时,我们可以把它简写为 \[s_\alpha(\lambda) =\lambda - (\lambda,\alpha^\vee)\alpha.\] 其中 \(\alpha^\vee=\frac{2}{(\alpha,\alpha)}\) 是\(\alpha\)的余根。不过等等!我们刚才不是把 \(h_\alpha\) 定义为 \(\alpha\) 的余根了吗?
这是因为 \[2\frac{(\lambda,\alpha)}{(\alpha,\alpha)}=2\frac{\kappa(t_\lambda,t_\alpha)}{\kappa(t_\alpha,t_\alpha)}=\kappa(t_\lambda,h_\alpha)=\lambda(h_\alpha).\] 即 \((\lambda,\alpha^\vee)=\lambda(h_\alpha)\)。所以虽然\(h_\alpha\) 和 \(\alpha^\vee\) 一个在 \(\mathfrak{h}\) 中,一个在 \(\mathfrak{h}^\ast\) 中,但它俩在 Killing型的对应下是同一个元素。
每个单根 \(\alpha\) 给出一个 \(\mathfrak{h}^\ast\) 上的线性变换 \(s_\alpha(\beta) = \beta -\beta(\alpha^\vee)\alpha\),\(s_\alpha\) 是一个单反射,所有单反射 \(\{s_\alpha,\alpha\in\Delta\}\) 生成的群\(W\) 叫做 Weyl群。
设 \[\rho=\frac{1}{2}\sum\limits_{\alpha\in\Phi_+}\alpha\]是所有正根之和的一半,则对任何单反射 \(s_\alpha\) 有 \[\rho-(\rho,\alpha^\vee)\alpha=s_\alpha(\rho)=\rho-\alpha.\]其中第一个等号来自反射的定义,第二个等号是因为 \(s_\alpha\) 置换除 \(\alpha\) 之外的所有正根,并把 \(\alpha\) 映射为 \(-\alpha\)。所以对任何 \(\alpha\in\Delta\) 有 \((\rho,\alpha^\vee)=1\)。
设 \(\lambda\in\mathfrak{h}^\ast\),如果对任何\(\alpha\in\Phi^+\) 有 \(\lambda(\alpha^\vee)\in\mathbb{Z}\),我们就称\(\lambda\)是一个整权。对整权 \(\lambda\),如果总是有 \(\lambda(\alpha^\vee)\geq0\),就称 \(\lambda\)是一个支配整权。进一步如果总是有 \(\lambda(\alpha^\vee)>0\),就称 \(\lambda\)是强支配整权。
记 \(P\) 为所有整权组成的格点,\(P^+\) 为所有支配整权组成的集合。
\(\mathfrak{h}^\ast\) 上的偏序 \(\preceq\) 定义如下: \[\mu\preceq\lambda\Leftrightarrow\lambda-\mu=\sum_{\alpha\in\Phi^+}k_\alpha\alpha,\quadk_\alpha\in\mathbb{Z}_{\geq0}.\] 我们知道 \(\mathfrak{h}^\ast_{\mathbb{R}}\) 在内积\((\cdot,\cdot)\) 下成为一个 Euclidean空间。记 \[\mathcal{D}=\{x\in\mathfrak{h}_{\mathbb{R}}^\ast\mid (x, \alpha^\vee)\geq0\text{ forall }\alpha\in\Phi^+\}.\] \(\mathcal{D}\) 叫做基本胞腔(fundamental chamber)。基本胞腔的含义是,对任何 \(x\in\mathfrak{h}_{\mathbb{R}}^\ast\),\(x\) 在 Weyl 群作用下的轨道 \(\{wx\mid w\in W\}\) 与 \(\mathcal{D}\) 有唯一的交点。
如果 \(\lambda\) 是一个支配整权,则\(\lambda\in\mathcal{D}\)。这时对任何\(w\in W\) 有 \(w\lambda\preceq\lambda\),等号成立当且仅当\(w=1\)。
定义 1:设 \(V\)是一个 \(\mathfrak{g}-\) 模,我们称\(V\) 是一个权模 (weight module),如果\(V\) 可以分解为关于 \(\mathfrak{h}\) 的权空间的直和: \[V = \bigoplus_{\lambda\in\mathfrak{b}^\ast}V_\lambda.\] 并且每个权空间的维数 \(\dim V_\lambda<\infty\)。
我们把权空间 \(V_\lambda\)中的向量叫做权向量。
关于权模有这么几个常识是时时都要用到的:
这几点的证明都不难,这里只解释第三点。
命题 1:如果 \(N\subsetV\) 是一个子模,则 \(N\)也是权模,并且有分解 \[N =\bigoplus_{\lambda\in\mathfrak{b}^\ast} (N\cap V_\lambda).\]
证明:设 \(x\inN\),则 \(x\) 可以写成 \[x=v_1 + v_2 + \cdots + v_k,\quad v_i\inV_{\lambda_i}.\] 我们要证明的是必然有每个 \(v_i\in N\)。若不然,设 \(x\) 是使得 \(k\) 最小的反例,则必有 \(k>1\),否则 \(v_1=x\in N\) 自动成立了。
注意到我们可以取 \(h\in\mathfrak{h}\) 使得对任何 \(1\leq i\ne j\leq k\) 都有 \(\lambda_i(h)\ne\lambda_j(h)\)成立,这是因为方程 \(\lambda_i=\lambda_j\) 给出的是 \(\mathfrak{h}\)中的一个超平面,而有限多个这样的超平面的并不可能等于 \(\mathfrak{h}\),故这样的 \(h\) 存在。然后注意到 \[y=hx-\lambda_1(h)x=\sum_{i=2}^k(\lambda_i(h)-\lambda_1(h))v_i\]是 \(N\) 中一个长度小于 \(x\) 的元素,且每个 \(v_i\,(i\geq2)\) 的系数均不为0,因此它们都属于 \(N\),从而 \(v_1\) 也属于 \(N\),命题得证。\(\blacksquare\)
更进一步,设 \(V\xrightarrow{\varphi}V/N\)是自然同态,不难验证每个 \(\varphi(V_\lambda)\) 都是 \(V/N\) 中权为 \(\lambda\) 的权空间,且显然 \(V/N\) 可以由所有的 \(\varphi(V_\lambda)\) 张成,所以商模 \(V/N =\bigoplus\limits_{\lambda\in\mathfrak{h}^\ast}\varphi(V_\lambda)\)也是权模。
在后面的讨论中,我们经常会遇到 \(N\)是某个 \(v\in V_\lambda\)生成的循环模的情形,这时使用维数公式有 \[\dimV_\lambda = \dim N\cap V_\lambda + \dim\varphi(V_\lambda).\] 所以\(\varphi(V_\lambda)\) 的维数严格小于\(V_\lambda\)。
最高权循环模是权模,而且是可以由一个最高权向量生成的循环模。它包含了所有的有限维不可约模。
定义 2:设 \(V\)是一个 \(\mathfrak{g}-\) 模,\(v\in V\) 是一个权为 \(\lambda\in\mathfrak{h}^\ast\)的权向量,如果 \(v\) 满足对任何 \(x\in\mathfrak{n}^+\) 有 \(xv=0\) 成立(这等价于对所有 \(e_\alpha\in\mathfrak{g}_\alpha\,(\alpha\in\Phi^+)\)有 \(e_\alpha v=0\)),就称循环模 \(U(\mathfrak{g})v\)为最高权循环模,\(v\)叫做 \(U(\mathfrak{g})v\)的最高权向量。
我们来分析 \(U(\mathfrak{g})v\)的结构。
根据 Poincaré–Birkhoff–Witt 定理,\(U(\mathfrak{g})\cong U(\mathfrak{n}^-)\otimesU(\mathfrak{h})\otimes U(\mathfrak{n}^+)\),所以 \[U(\mathfrak{g})v=U(\mathfrak{n}^-)U(\mathfrak{h})U(\mathfrak{n}^+)v.\] 但是任何\(x\in U(\mathfrak{n}^+)\) 作用在 \(v\) 上要么“杀死” \(v\),即 \(xv=0\);要么把 \(v\) 变成 \(v\) 的倍数,所以 \(U(\mathfrak{n}^+)v=\mathbb{C}v\)。而显然\(U(\mathfrak{h})v=\mathbb{C}v\),所以\[U(\mathfrak{g})v=U(\mathfrak{n}^-)v.\]
\(\{f_{\alpha},\alpha\in\Phi^+\}\)构成 \(\mathfrak{n}^-\) 的一组基,其中\(f_{\alpha}\in\mathfrak{g}_{-\alpha}\),于是\(U(\mathfrak{n}^-)\) 的一组 PBW 基形如\(\{\prod_{\alpha\in\Phi^+}f_{\alpha}^{k_\alpha},k_\alpha\in\mathbb{Z}_{\geq0}\}\)。所以\[U(\mathfrak{g})v = {\rmspan}\,\left\{\left(\prod_{\alpha\in\Phi^+}f_{\alpha}^{k_\alpha}\right)\,v,\ k_\alpha\in\mathbb{Z}_{\geq0}\right\}.\] \(f_{\alpha}\) 将权子空间 \(V_\mu\) 映射到 \(V_{\mu-\alpha}\),所以 \[\left(\prod_{\alpha\in\Phi^+}f_{\alpha}^{k_\alpha}\right)\, v \in V_\mu,\quad \mu=\lambda -\sum_{\alpha\in\Phi^+}k_\alpha\alpha.\]
容易看到 \(V_\mu\)的维数是有限的,这是因为 \((\prod_{\alpha\in\Phi^+}f_{\alpha}^{k_\alpha})\, v\in V_\mu\) 当且仅当 \(\{k_\alpha\}\) 满足 \(\lambda-\sum_{\alpha\in\Phi^+}k_\alpha\alpha=\mu\),这样的非负整数序列\(\{k_\alpha\}\) 只有有限多个,所以\(\dim V_\mu\)不会超过这样的序列的个数。特别地 \(\mu=\lambda\) 当且仅当所有的 \(k_\alpha\) 都是 0,因此 \(\dim V_\lambda=1\),即 \(V_\lambda\) 是 \(v\) 生成的一维子空间。
设 \(\lambda\in\mathfrak{h}^\ast\),有趣的是,在所有以\(\lambda\)为最高权的最高权循环模中,既有一个最小的,也有一个最大的:
这个最小的模(记作 \(L_\lambda\))是一个不可约模,它是所有最高权循环模的商模(所有最高权模之子)。在同构的意义下,这个不可约模是唯一的。
最大的模 (记作 \(M_\lambda\))自然可以称为“所有最高权模之母”:其它所有最高权模都是它的商模。\(M_\lambda\) 就是我们后面要介绍的 Verma模,它在同构的意义下也是唯一的。
不可约模 \(L_\lambda\)的唯一性比较好证明,这是因为在一个最高权循环模 \(V=U(\mathfrak{g})v\)中,任何真子模都不可能含有最高权向量 \(v\),由于不同权的权向量的线性无关性,真子模的和也组合不出\(v\)来,因此所有真子模的和仍然是真子模,这是一个唯一的极大真子模,所以 \(V\) 有唯一的不可约商模 \(L_\lambda\)。我们还需要说明对两个不同的以\(\lambda\) 为最高权的循环模 \(V_1,V_2\) 有 \(L_{\lambda}^1\congL_{\lambda}^2\)。为此可以构造直和 \(W=V_1\oplus V_2\),\(W\) 也是一个以 \(\lambda\) 为最高权的循环模,其最高权向量为\((v_1,v_2)\),且 \(V_1,V_2\)作为直和分量都是它的商模,所以我们有如下同态: \[\begin{align*}W &\xrightarrow{\pi_1} V_1\xrightarrow{\pi} L_{\lambda}^1,\\W &\xrightarrow{\pi_2} V_2\xrightarrow{\pi} L_{\lambda}^2.\end{align*}\] 其中 \(\pi_i\) 是\(W\) 到 \(V_i\) 的投影,\(\pi\) 是对极大真子模取商模。
现在 \(L_\lambda^1,L_{\lambda}^2\)都是 \(W\) 的不可约同态像,而 \(W\)作为最高权循环模有唯一的不可约商模,所以 \(L_\lambda^1\cong L_{\lambda}^2\)。
另一种更直接的证明 \(L_\lambda\)唯一性的方式是使用 Verma 模 (它们都是 Verma 的唯一不可约商模!),关于Verma 模我们放在下一节单独介绍。
定义 3:设 \(\lambda\in\mathfrak{h}^\ast\),我们称一个最高权循环模\(M_\lambda\) 为 Verma模,如果任何最高权为 \(\lambda\)的循环模都是它的商模。
我个人比较喜欢这个定义,第一它点明了 Verma的本质是它的泛性质,第二它只有一句话。
不过从这个定义看不出来 Verma是否存在,存在的话又是否唯一,下面来处理这两个问题。
首先我们的定义蕴含了 Verma 模的唯一性。设 \(M_\lambda,N_\lambda\) 是任何两个最高权为\(\lambda\) 的 Verma模,则它们互为彼此的商模。不妨设 \(M_\lambda /W\cong N_\lambda\),这里 \(W\)是 \(M_\lambda\) 的子模,于是对任何权\(\mu\),\[\dim [M_\lambda]_\mu \geq\dim [N_\lambda]_\mu.\]然而 \(N_\lambda\) 也是 \(M_\lambda\)的商模,所以反向不等式也成立,从而上式其实是个等式,因此 \(M_\lambda\) 和 \(N_\lambda\) 是同构的。
存在性的证明看似稍微麻烦一点点,但其实也是数学里面的惯用招数:注意我们对Verma 模是通过其泛性质来定义的,而在数学中要在一类对象 \(\mathcal{X}\)中构造具有给定泛性质的特殊成员时,我们总是从一个最一般的对象 \(A\in\mathcal{X}\) 出发,然后在 \(A\)中对泛性质所规定的约束条件取商,注意既不能多一分(超出泛性质规定的约束),也不能少一分(少于泛性质规定的约束),这样得到的对象就满足所需的泛性质。
在这里 \(\mathcal{X}\) 由所有的\(U(\mathfrak{g})-\)循环模构成,这其中最一般的自然是 \(U(\mathfrak{g})\)作为自身的左正则模,它可以由单位元 \(1\) 生成,其它任何循环模都是它的商模。
要把左正则 \(U(\mathfrak{g})-\)模变成一个具有泛性质的最高权循环模,我们看看必须添加哪些必要的约束条件。由于我们要把单位元1 变成最高权向量,“最高”要求对任何 \(\alpha\in\Phi^+\) 和 \(e_\alpha\in\mathfrak{g}_\alpha\) 有 \(e_\alpha\cdot1=0\),即 \(e_\alpha=0\)。“权向量”要求对任何 \(h\in\mathfrak{h}\) 有 \(h\cdot1 =\lambda(h)\cdot1\)。这些就够了!所以我们取 \(I\) 是由所有 \(\{e_\alpha,\alpha\in\Phi^+\}\) 和 \(\{h-\lambda(h)1,h\in\mathfrak{h}\}\)生成的左理想,则 \(U(\mathfrak{g})/I\)就是所要构造的 Verma 模。
注意 \(U(\mathfrak{g})/I\) 作为左\(U(\mathfrak{g})-\) 模自然也是左 \(U(\mathfrak{n}^-)-\) 模,这个模同构于 \(U(\mathfrak{n}^-)\)的左正则表示,同构映射由 \[U(\mathfrak{n}^-)\to U(\mathfrak{g})/I:\quad 1\to1+I\] 给出,这是很容易用 PBW 定理验证的。记 \(v=1\),则所有的 \(\{(\prod_{\alpha\in\Phi^+}f_{\alpha}^{k_\alpha})\,v\}\) 均非零且线性无关。换句话说,Verma 模是使得 \(U(\mathfrak{n}^-)\)的作用“最自由”的最高权循环模。
Verma 模也可以通过诱导表示来构造,这里不再赘述。
Casimir 算子并不是 \(\mathfrak{g}\)中的元素,它其实是泛包络代数 \(U(\mathfrak{g})\) 中的元素,而且属于 \(U(\mathfrak{g})\) 的中心,它与 \(\mathfrak{g}\) 的任何表示可交换,从而Casimir 元素的特征子空间分解给出表示的分解。
任取 \(\mathfrak{g}\) 的一组基 \(\{x_i\}\),设它们在 Killing 型下的对偶基为\(\{y_i\}\),即 \(\kappa(x_i,y_j)=\delta_{ij}\)。
定义 4:Casimir 算子定义为 \(\Omega = \sum_{i=1}^n x_iy_i\),其中 \(n=\dim\mathfrak{g}\)。
不难证明 Carimir 算子的定义与基 \(\{x_i\}\)的选择无关。但是为了计算方便,我们会选取 \(\mathfrak{g}\)的一组特殊的基如下:对每个正根 \(\alpha\),取 \(e_\alpha\in\mathfrak{g}_\alpha,f_\alpha\in\mathfrak{g}_{-\alpha}\)使得 \(\kappa(e_\alpha,f_\alpha)=1\),则 \([e_\alpha,f_\alpha]=t_\alpha\),这里 \(t_\alpha\) 是在 Killing 型下与 \(\alpha\) 对等的元素。设单根系 \(\Delta=\{\alpha_1,\ldots,\alpha_n\}\),则\(t_{\alpha_1},\ldots,t_{\alpha_n}\)构成 \(\mathfrak{h}\) 的一组基,取\(t_{\alpha_1}^\ast,\ldots,t_{\alpha_n}^\ast\in\mathfrak{h}\)使得 \(\kappa(t_{\alpha_i},t_{\alpha_j}^\ast)=\delta_{ij}\)。
现在我们有了 \(\mathfrak{g}\)的一组基 \(\{e_\alpha\},\{f_\alpha\},\{t_{\alpha_i}\}\),它们在 Killing 型下的对偶基为 \(\{f_\alpha\}\), \(\{e_\alpha\}\), \(\{t_{\alpha_i}^\ast\}\),把它们两两配对相乘然后相加,得到的就是Casimir 算子: \[\Omega=\sum_{\alpha\in\Phi_+}(f_\alphae_\alpha+e_\alphaf_\alpha)+\sum_{i=1}^nt_{\alpha_i}t_{\alpha_i}^\ast.\] 进一步利用\(e_\alpha f_\alpha=t_\alpha+f_\alphae_\alpha\),我们可以把 \(\Omega\) 写成 \[\Omega=2\sum_{\alpha\in\Phi_+}f_\alphae_\alpha+\sum_{\alpha\in\Phi_+}t_\alpha+\sum_{i=1}^nt_{\alpha_i}t_{\alpha_i}^\ast.\]
设 \(\lambda\in\mathfrak{h}^\ast\),\(V\) 是任一最高权为 \(\lambda\) 的循环模,最高权向量为 \(v\),由于 Casimir 元素与 \(\mathfrak{g}\) 交换,所以 \(\Omega\cdot v\) 仍然是一个权为 \(\lambda\) 的权向量,从而是 \(v\) 的一个倍数,即 \[\Omega\cdot v_\lambda=c_\lambdav_\lambda.\] 我们来计算这个 \(c_\lambda\)。
利用 \(e_\alpha\cdot v_\lambda=0\)以及 \(\lambda(t_\alpha)=(\lambda,\alpha)\) 可得\[\begin{align}c_\lambda &=\sum_{\alpha\in\Phi_+}(\alpha,\lambda)+\sum_{i=1}^n\lambda(t_{\alpha_i})\lambda(t_{\alpha_i}^\ast)\\&=\sum_{\alpha\in\Phi_+}(\alpha,\lambda)+\sum_{i=1}^n(\lambda,\alpha_i)(\lambda,\alpha_{i}^\ast)\\&= 2(\lambda,\rho)+(\lambda,\lambda)\\&= |\lambda+\rho|^2-|\rho|^2.\end{align}\]
其中倒数第二个等号是利用了一个简单的线性代数结论:
引理 1:设 \(\{x_i\}\) 是内积空间 \((\cdot)\) 的一组基,\(\{y_j\}\) 是 \(\{x_i\}\) 在这个内积下的对偶基,则对任何向量 \(x\) 有\[(x,x)=\sum_{i=1}^n(x,x_i)(x,y_i).\]
这个计算对任何最高权循环模都适用,这样我们就得到一个重要的结论:
推论:Casimir 算子作用在最高权为 \(\lambda\) 的循环模上是一个数乘 \(|\lambda+\rho|^2-|\rho|^2\)。
这一小节我们来证明 Verma 具有有限长度的合成列,从而同时是 Artinian 和Noetherian的。于是任何最高权循环模都有有限的合成列。不过我们最好把分析扩展到更广泛的一类模上,即由Bernstein, Gelfand 和 Gelfand 三人引入的范畴 \(\mathcal{O}\):
定义 5:我们称一个 \(\mathfrak{g}-\) 模 \(V\) 属于范畴 \(\mathcal{O}\),如果它是一个权模,并且存在有限多个权\(\{\lambda_1,\ldots,\lambda_n\}\) 使得\(V_\mu\ne0\) 当且仅当对某个 \(\lambda_i\) 有 \(\mu\preceq\lambda_i\)。
显然范畴 \(\mathcal{O}\)包含了所有的最高权模,并且若 \(\mathfrak{g}\) 属于范畴 \(\mathcal{O}\),则 \(\mathfrak{g}\) 的任何子模和商模也都属于范畴\(\mathcal{O}\)。范畴 \(\mathcal{O}\)对有限直和运算也是封闭的。
定义 6:设 \(\mathfrak{g}-\) 模 \(V\) 属于范畴 \(\mathcal{O}\),\(v\in V\) 是一个非零向量。如果存在 \(V\) 的子模 \(U\) 使得 \(v\) 是商模 \(V/U\) 中的最高权向量,我们就称 \(v\) 是一个本原向量。如果\(V_\mu\) 包含一个本原向量,我们也称\(\mu\)是一个本原权。
引理 2:设 \(\mathfrak{g}-\) 模 \(V\) 属于范畴 \(\mathcal{O}\),则 \(V\) 可以由本原向量生成。
证明:设 \(U\) 是 \(V\) 中所有本原向量生成的 \(\mathfrak{g}-\) 子模,我们断言 \(U=V\)。若不然,考虑商模 \(V/U\),它在范畴 \(\mathcal{O}\) 中,所以存在权向量 \(u\) 使得 \(u\) 对应的权是偏序 \(\preceq\) 下的极大元。但是 \(u\) 在 \(V\) 中的原像必然是个本原向量,从而 \(u=0\),矛盾。\(\blacksquare\)
命题 2:设 \(\mathfrak{g}-\) 模 \(V\) 属于范畴 \(\mathcal{O}\),且 \(V\) 只有有限多个本原权,则 \(V\) 的合成列长度有限,即存在 \(V\) 的子模序列 \[(0)\subset V_1\subset\cdots\subsetV_k=V.\] 使得每个合成因子 \(V_i/V_{i-1}\) 都是不可约最高权模。
证明:由于 \(V\)只有有限多个本原权,且权子空间的维数有限,所以 \(V\) 只有有限多个线性无关的本原向量。我们对\(V\) 包含的线性无关的本原向量的个数\(n\) 归纳:
基础情形是 \(n=1\),这时 \(V\)本身必然是一个最高权循环模,而且一定是不可约的(否则它的真子模里面必然有本原向量),结论自动成立。
\(n>1\) 时,任取一个本原权 \(\mu\) 使得 \(\mu\) 是偏序 \(\preceq\) 下的极大元,并取本原向量 \(v\in V_\mu\)。显然 \(W=U(\mathfrak{g})v\)是一个最高权循环模,从而它有一个极大真子模 \(W_1\),\(W/W_1\cong L_\mu\) 是不可约模。
显然 \(V/W\) 和 \(W_1\) 包含的线性无关的本原向量个数都小于\(n\) (因为 \(v\) 不在它俩里面),从而由归纳假设 \(V/W\) 和 \(W_1\)都有有限长度的合成列,由于我们有子模序列 \[(0)\subset W_1\subset W\subset V.\] 把\(W_1\) 和 \(V/W\) 的合成列塞到上面的式子中就得到了\(V\) 的合成列。\(\blacksquare\)
推论:设 \(\lambda\in\mathfrak{h}^\ast_{\mathbb{R}}\),即\(\lambda\) 是单根的实线性组合,则Verma 模 \(M_\lambda\)有有限长度的合成列。
证明:只要说明 \(M_\lambda\)只包含有限多个线性无关的本原向量即可。由于任何权为 \(\mu\) 的本原向量 \(u\) 都生成一个最高权循环模 \(V_\mu\),而 Casimir 算子在 \(V_\mu\) 上的作用是数乘 \(|\mu+\rho|^2-|\rho|^2\),这个值必须与Casimir 算子在 \(M_\lambda\) 上的数乘\(|\lambda+\rho|^2-|\rho|^2\)相等,所以 \(\mu\) 必须满足 \(\mu\preceq\lambda\) 且 \(|\mu+\rho|^2=|\lambda+\rho|^2\)。这样的\(\mu\) 构成的集合 \[S^\lambda = \{\mu\mid \mu\preceq\lambda,\,|\mu+\rho|^2=|\lambda+\rho|^2\}\] 是一个有限集,而权空间 \(V_\mu\)的维数又是有限的,于是线性无关的本原向量的个数也是有限的。\(\blacksquare\)
这个推论对所有 \(\lambda\in\mathfrak{h}^\ast\)都是对的,但是一般情形的证明要更加复杂。上面的证明利用了 \((\cdot,\cdot)\) 在 \(\mathfrak{h}^\ast_{\mathbb{R}}\)上是正定的,这保证了 \(S^\lambda\)是紧集。
设 \(V=\oplus_{\lambda\in\mathfrak{h}^\ast}V_\lambda\)是权模,定义形式幂级数 \[\mathop{\mathrm{ch}}{V} = \sum_{\lambda}(\dimV_\lambda)\, e^\lambda.\] \(\mathop{\mathrm{ch}}{V}\)是一个形式幂级数,叫做 \(V\)的特征。\(e^\lambda\)是一个形式指数,满足运算 \(e^\lambda\cdote^\mu=e^{\lambda+\mu}\),其在 Weyl 权 \(W\) 下的作用规定为 \(w\cdot e^\lambda=e^{w(\lambda)}\)。
特征通常是一个无穷项的线性组合,是一个形式级数,不存在收敛到某个值的说法。但在\(V\) 是有限维表示时,\(\mathop{\mathrm{ch}}{V}\) 其实是一个Laurent 多项式,我们来解释下为什么:
取 \(\omega_1,\ldots,\omega_n\inP^+\) 为一组基本整权,即 \(P\)的一组整基。定义变元 \(x_i=e^{\omega_i}\),则对 \(V\) 的任何权空间 \(V_\lambda\),由于有限维表示的权都是整权,故\(\lambda\) 可以表示为 \(\omega_1,\ldots,\omega_n\) 的整系数线性组合\[\lambda=a_1\omega_1+\cdots+a_n\omega_n,\quada_i\in\mathbb{Z}.\] 则 \[\mathop{\mathrm{ch}}{V} = \sum_{\lambda}(\dimV_\lambda)\, x_1^{a_1}\cdotsx_n^{a_n}\in\mathbb{Z}[x_1^{\pm1},\ldots,x_n^{\pm1}]\]是一个关于变元 \(x_1,\ldots,x_n\)的有理多项式。实际上它关于 \(W\)还是对称的。
我们来计算 Verma 模的特征。考虑如下的乘积: \[e^{\lambda}\cdot\prod_{\alpha\in\Phi^+}(1+e^{-\alpha}+e^{-2\alpha}+\cdots).\]这个乘积展开的时候,是在每个正根 \(\alpha\) 的括号中分别取形如 \(e^{-k_\alpha\alpha}\,(k_\alpha\in\mathbb{Z}_{\geq0})\) 的一项,全部乘起来再和\(e^{\lambda}\) 一起相乘得到形如 \(e^{\mu}=e^{\lambda-\sum_{\alpha\in\Phi^+}k_\alpha\alpha}\)的项,然后将这些乘积相加。\(e^{\mu}\)前面的系数正是使得 \(\mu=\lambda-\sum_{\alpha\in\Phi^+}k_\alpha\alpha\)成立的整数序列 \(\{k_\alpha\}\)的个数,即 Verma 模 \(M_\lambda\)中权为 \(\mu\)的权子空间的维数,所以上面的乘积就是 \(M_\lambda\) 的特征,即 \[\mathop{\mathrm{ch}}{M_\lambda} = e^\lambda\prod_{\alpha\in\Phi_+}(1+e^{-\alpha}+e^{-2\alpha}+\cdots).\]这个式子可以进一步简化为 \[\mathop{\mathrm{ch}}{M_\lambda} = e^\lambda\prod_{\alpha\in\Phi_+}(1-e^{-\alpha})^{-1}.\] 记 \[q=e^\rho\prod_{\alpha\in\Phi_+}(1-e^{-\alpha}),\]\(q\) 叫做 Weyl 分母。它可以消掉 Verma特征中关于 \(\prod_{\alpha\in\Phi^+}\)的连乘,即 \[q\cdot\mathop{\mathrm{ch}}{M_\lambda}=e^{\lambda+\rho}.\] 在后面我们要用到 \(q\) 的如下性质:
命题 3:\(q\)是“交错的”,即对任何 \(w\in W\) 有\[w\cdot q = (-1)^{l(w)}q.\]
证明:只要对单反射 \(s_\alpha\)验证有 \(s_\alpha\cdot q=-q\)即可。我们有 \[s_\alpha\cdotq=e^{s_\alpha(\rho)}\prod_{\gamma\in\Phi_+}(1-e^{-s_\alpha(\gamma)})=e^{s_\alpha(\rho)}(1-e^{-s_\alpha(\alpha)})\prod_{\gamma\in\Phi_+,\,\gamma\ne\alpha}(1-e^{-s_\alpha(\gamma)}).\]由于 \(s_\alpha(\rho)=\rho-\alpha\)以及 \(s(\alpha)=-\alpha\),所以前两个因子的乘积等于\(-e^{\rho}(1-e^{-\alpha})\)。又由于\(s_\alpha\) 置换 \(\Phi^+\setminus\{\alpha\}\),所以第三个因子等于\(\prod\limits_{\gamma\in\Phi_+,\,\gamma\ne\alpha}(1-e^{-\gamma})\)。合起来就是\[s_\alpha\cdotq=-e^{\rho}(1-e^{-\alpha})\prod_{\gamma\in\Phi_+,\,\gamma\ne\alpha}(1-e^{-\gamma})=-q.\]
一种很方便的约定是规定 Weyl 群 \(W\)在 \(\mathfrak{h}^\ast\) 上的“点”作用\(\bullet\) 为 \[w\bullet \lambda = w(\lambda+\rho) -\rho.\] 这个作用和通常 \(W\) 在\(\mathfrak{h}^\ast\)上的线性作用相比不过是把原点变换到了 \(-\rho\),即它是以 \(-\rho\)为中心进行变换。所以它不是线性的,即不再有 \(w\bullet(\lambda+\mu)=w\bullet\lambda+w\bullet\mu\)成立。但它仍然是个群作用,即对 \(w_1,w_2\inW\) 有 \(w_1\bullet(w_2\bullet\lambda)=(w_1w_2)\bullet\lambda\)。
记 \(W\bullet\lambda = \{w\bullet\lambda,w\in W\}\),则我们有如下结论:
命题 4:若 \(\lambda\inP^+\) 是支配整权,则集合 \(W\bullet\lambda\) 中的元素互不相同。
证明:只要证明若 \(w\bullet\lambda =1\bullet\lambda\) 则 \(w=1\)即可。由 \(w\bullet\lambda =1\bullet\lambda\) 可得 \(w(\lambda+\rho)=\lambda+\rho\)。由于 \(\lambda\) 是支配整权,所以 \(\lambda+\rho\)是强支配整权,它严格位于基本胞腔 \(\mathcal{D}\) 的内部。\(W\) 中仅有唯一的元素 1 可以将 \(\lambda+\rho\) 映射到 \(\mathcal{D}\) 中,所以 \(w=1\)。
在本节中,约定 \(\lambda\in P^+\)总是支配整权。这时不可约模 \(L_\lambda\) 是有限维的,Weyl 特征公式给出了\(\mathop{\mathrm{ch}}{L_\lambda}\)的具体形式。
记 \(S^\lambda\) 为有限集 \[S^\lambda =\{\mu\mid\mu\preceq\lambda,\,|\mu+\rho|^2=|\lambda+\rho|^2\}.\]
根据我们之前的结论,Verma \(M_\lambda\)有有限的合成列,且合成列中每个不可约因子 \(L_\mu\) 满足 \(\mu\in S^\lambda\)。进一步,对 \(\mu\in S^\lambda\),注意到 \(S^\mu\) 是 \(S^\lambda\) 的子集,所以 Verma 模 \(M_\mu\) 的所有不可约因子 \(L_\nu\) 满足 \(\nu\in S^\mu\subset S^\lambda\)。
对 \(\mu,\nu\in S^\lambda\),我们用\(a(\mu,\nu)\) 表示不可约模 \(L_\nu\) 在 Verma 模 \(M_\mu\) 的合成列因子中出现的次数。则 \(a(\mu,\nu)\) 是非负整数,满足 \(a(\mu,\mu)=1\),以及 \(\nu\not\preceq\mu\) 则 \(a(\mu,\nu)=0\)。
于是对每个 \(\mu\inS^\lambda\),Verma 模 \(M_\mu\)可以分解为 \[\mathop{\mathrm{ch}}{M_\mu}=\sum_{\nu\inS^\mu}a(\mu,\nu)\mathop{\mathrm{ch}}{L_\nu}.\]
设 \(S^\lambda=\{\mu_1,\ldots,\mu_l\}\),我们将这些\(\{\mathop{\mathrm{ch}}{M_{\mu_i}},\mathop{\mathrm{ch}}{L_{\mu_i}}\}\)按照降序排列,使得若 \(\mu_i\prec\mu_j\) 则 \(i > j\)(这时必有 \(\mu_1=\lambda\)),则它们之间的矩阵是一个对角线上都是1 的上三角矩阵: \[\begin{pmatrix}\mathop{\mathrm{ch}}{M_\lambda}\\\mathop{\mathrm{ch}}{M_{\mu_2}}\\\vdots\\\mathop{\mathrm{ch}}{M_{\mu_l}}\end{pmatrix} =\begin{pmatrix}1 & \cdots & \cdots & \ast\\ & 1 & \cdots & \ast\\ & & \ddots &\vdots\\ & & & 1\end{pmatrix}\begin{pmatrix}\mathop{\mathrm{ch}}{L_{\lambda}}\\\mathop{\mathrm{ch}}{L_{\mu_2}}\\\vdots\\\mathop{\mathrm{ch}}{L_{\mu_l}}\end{pmatrix}\] 这个矩阵可逆,且逆矩阵也是对角元是 1的上三角矩阵,所以可以反解出 \[\mathop{\mathrm{ch}}{L_\lambda} = \sum_{\mu\inS^\lambda}b(\lambda,\mu)\mathop{\mathrm{ch}}{M_\mu}.\label{eq:q1}\tag{1}\]其中 \(b(\lambda,\lambda)=1\),以及对任何 \(\mu\not\preceq\lambda\) 有 \(b(\lambda,\mu)=0\)。
记 \(b_\mu=b(\lambda,\mu)\),我们下面来解出系数\(b_\mu\)。
将 \(q\) 乘在 \((\ref{eq:q1})\) 两边得到 \[q\cdot\mathop{\mathrm{ch}}{L_\lambda} =\sum_{\mu\in S^\lambda} b_\mu e^{\mu+\rho}\label{eq:q2}\tag{2}.\]我们有如下引理:
引理 3:集合 \(\{\mu\inS^\lambda\mid b_\mu\ne0\}\) 和集合 \(W\bullet\lambda\) 一一对应,并且若 \(\mu=w\bullet\lambda\) 则 \(b_\mu=(-1)^{l(w)}\)。
我们把这个引理的证明先放一放,继续用它得出重要的 Weyl 公式。
由 引理 3 我们可以把 \((\ref{eq:q2})\) 改写成 \[q\cdot\mathop{\mathrm{ch}}{L_\lambda}=\sum_{w\inW}(-1)^{l(w)}e^{w\bullet\lambda+\rho}=\sum_{w\inW}(-1)^{l(w)}e^{w(\lambda+\rho)}.\] 即 \[q\cdot\mathop{\mathrm{ch}}{L_\lambda}=\sum_{w\inW}(-1)^{l(w)}e^{w(\lambda+\rho)}.\label{eq:q3}\tag{3}\]
特别令 \(\lambda=0\)为一维平凡表示,则 \(\mathop{\mathrm{ch}}{L_\lambda}=e^{0}=1\),于是我们有
Weyl 分母公式: \[q=\sum_{w\inW}(-1)^{l(w)}e^{w(\rho)}.\]
再把 Weyl 分母公式代入 \((\ref{eq:q3})\),我们得到
Weyl 特征公式: \[\mathop{\mathrm{ch}}{L_\lambda} =\frac{\sum_{w\in W}(-1)^{l(w)}e^{w(\lambda+\rho)}}{\sum_{w\inW}(-1)^{l(w)}e^{w(\rho)}}.\]
回到 引理 3 的证明。
我们先证明当 \(\mu=w\bullet\lambda\)时有 \(b_\mu=(-1)^{l(w)}\) 成立。
将 \(w\in W\) 作用在 \((\ref{eq:q2})\) 两边,并注意 \(\mathop{\mathrm{ch}}{L_\lambda}\) 是 \(W-\) 不变的以及 命题 3的结论 \(w\cdot q=(-1)^{l(w)}q\),得到\[q\cdot\mathop{\mathrm{ch}}{L_\lambda}=\sum_{\mu\inS^\lambda}(-1)^{l(w)}b_\mu e^{w(\mu+\rho)}.\label{eq:q4}\tag{4}\]将 \((\ref{eq:q4})\) 中的求和符号换成\(\nu\),并比较 \((\ref{eq:q2})\) 和 \((\ref{eq:q4})\),我们有 \[\sum_{\mu\in S^\lambda} b_\mue^{\mu+\rho}=\sum_{\nu\in S^\lambda}(-1)^{l(w)}b_\nue^{w(\nu+\rho)}.\label{eq:q5}\tag{5}\]
设 \(\mu\) 使得 \(b_\mu\ne0\)。比较 \((\ref{eq:q5})\) 两边 \(e^{\mu+\rho}\) 项的系数,我们得到若 \(\mu+\rho=w(\nu+\rho)\),即如果 \(\mu=w\bullet\nu\),则 \[b_\mu =(-1)^{l(w)}b_\nu.\label{eq:q6}\tag{6}\] 特别地由于 \(b_\lambda=1\),所以如果 \(\mu=w\bullet\lambda\) 则 \[b_\mu=(-1)^{l(w)}.\label{eq:q7}\tag{7}\]
再证明 \(\{\mu\in S^\lambda\midb_\mu\ne0\}\) 和 \(W\bullet\lambda\) 是一一对应的。
在前面的 命题 4 中我们已经看到 \(\{w\bullet\lambda\mid w\in W\}\)是互不相同的。设 \(\mu=w\bullet\lambda\),我们来说明 \(\mu\in S^\lambda\)。这比较简单,因为 \(\lambda+\rho\) 是强支配整权,对所有 \(w\) 都有 \(w(\lambda+\rho)\preceq \lambda+\rho\),从而\(\mu=w\bullet\lambda\preceq\lambda\)。另一方面\(w\) 保持内积 \((\cdot,\cdot)\),所以 \[|\lambda+\rho| =|w(\lambda+\rho)|=|\mu+\rho|.\] 从而 \(\mu\in S^\lambda\)。此外 \((\ref{eq:q7})\) 告诉我们这时 \(b_\mu=(-1)^{l(w)}\ne0\),所以我们证明了\(W\bullet\lambda\) 可以嵌入到 \(\{\mu\in S^\lambda\mid b_\mu\ne0\}\)中。
再证明反向的包含关系。即如果 \(\mu\inS^\lambda\) 且 \(b_\mu\ne0\),则\(\mu\in W\bullet\lambda\)。我们知道Weyl 群传递地作用在所有的胞腔 (chambers) 上,因此总可以选取 \(w\in W\) 使得 \(w(\mu+\rho)\) 落在基本胞腔 \(\mathcal{D}\) 内,即 \(w(\mu+\rho)\) 是一个支配整权。
设 \(\nu=w\bullet\mu=w(\mu+\rho)-\rho\),我们来证明\(\nu=\lambda\),从而 \(\mu=w^{-1}\bullet\lambda\inW\bullet\lambda\)。
由于 \(\nu=w\bullet\mu\) 和 \(b_\mu\ne0\),根据 \((\ref{eq:q6})\),\(b_\nu\) 也不等于 0。这说明 \(\nu\preceq\lambda\)。所以可以设 \[\lambda-\nu=\gamma=\sum_{\alpha\in\Phi^+}k_\alpha\alpha\]为正根的非负整系数线性组合。则 \[0=|\lambda+\rho|^2-|\nu+\rho|^2=(\lambda+\rho,\gamma)+(\nu+\rho,\gamma).\]由于 \(\lambda+\rho\)是强支配整权,\(\nu+\rho=w(\mu+\rho)\)是支配整权,\(\gamma\)是正根的非负整系数线性组合,所以上面的和等于 0 只能在 \(\gamma=0\) 时才能发生,即 \(\nu=\lambda\)。
至此 引理 3 得证,从而 Weyl特征公式得证。
本节以 \(\mathfrak{sl}_n(\mathbb{C})\)为例来给出它的有限维不可约表示的特征,即著名的 Schur 多项式。
以下是 \(\mathfrak{sl}_n(\mathbb{C})\)的一些基本信息:
Cartan 子代数为 \[\mathfrak{h}=\left\{\begin{pmatrix}a_1&&&\\&a_2&&\\&&\ddots&\\&&&a_n\end{pmatrix}\in\mathrm{Mat}_n(\mathbb{C})\,|\,a_1+a_2+\cdots+a_n=0\right\}.\] 其对偶空间为 \(\mathfrak{h}^\ast=\mathbb{C}\{L_1,\ldots,L_n\}/(L_1+\cdots+L_n)\),其中线性泛函\[L_i\left(\begin{pmatrix}a_1&&&\\&a_2&&\\&&\ddots&\\&&&a_n\end{pmatrix}\right)= a_i.\]
设 \(E_{ij}\) 为 \((i,j)\) 位置的分量是 1,其它位置均为 0的矩阵,则 Cartan 子代数的一组基为 \(\{H_i =E_{ii} - E_{i+1,i+1}, 1\leq i\leq n-1\}\)。
记 \(H_{ij} = E_{ii}-E_{jj}\),则对任何 \(i<j\),\(\{E_{ij},E_{ji},H_{ij}\}\) 构成一个 \(\mathfrak{sl}_2(\mathbb{C})\)三元组。
一组单根为 \(\Delta=\{L_i-L_{i+1},1\leqi\leq n-1\}\),对应的全体正根为 \(\Phi^+=\{L_i-L_j,i<j\}\)。
Weyl 群为 \(n\) 阶置换群 \(S_n\)。\(W\) 在 \(\mathfrak{h}^\ast\) 上的作用如下:对任何\(\sum a_iL_i\),\(\sigma\in S_n\) 将 \((L_1,\ldots,L_n)\) 置换为 \((L_{\sigma(1)},\ldots,L_{\sigma(n)})\)。
Killing 型限制在 \(\mathfrak{h}\) 上为 \(\kappa(A,B)=2n\mathop{\mathrm{tr}}{AB}=2n\sum_{i=1}^na_ib_i\)。
正根 \(\alpha=L_i-L_j\) 在 \(\mathfrak{h}\) 中对等的元素为 \(t_\alpha=\frac{1}{2n}H_{ij}\),对应的余根为\(h_\alpha=H_{ij}\)。
所有正根之和的一半 \(\rho=\frac{1}{2}((n-1)L_1+(n-3)L_2+\cdots+(1-n)L_{n})\)。由于 \(L_1+\cdots+L_n=0\) 我们可以给 \(\rho\) 加上 \(\frac{n-1}{2}(L_1+\cdots+L_n)\) 从而取\(\rho=(n-1)L_1+(n-2)L_2+\cdots+L_{n-1}+0L_n\)。
一组基本整权为 \(\{\omega_i=L_1+\cdots+L_i,1\leq i\leqn-1\}\)。
\(\lambda\in P^+\)是支配整权当且仅当 \(\lambda\)是基本整权的非负整系数线性组合,即 \[\lambda=\suma_i\omega_i=(a_1+\cdots+a_{n-1})L_1+(a_2+\cdots+a_{n-1})L_2+\cdots+a_{n-1}L_{n-1}.\] 设 \(\lambda_i=a_1+\cdots+a_i\) 并规定 \(\lambda_n=0\),则 \(\lambda_i\in\mathbb{Z}_{\geq0}\) 且 \(\lambda_1\geq\cdots\geq\lambda_{n-1}\geq\lambda_n=0\)。
记 \(x_i=e^{L_i}\),则 \(e^{\lambda}= x_1^{\lambda_1}x_2^{\lambda_2}\cdotsx_n^{\lambda_n}\),\(e^{\rho}=x_1^{n-1}x_2^{n-2}\cdots x_{n-1}x_n^0\),且对任何 \(\sigma\in S_n\) 有 \(e^{\sigma(\lambda)}=e^{\sum\lambda_iL_{\sigma(i)}}=x_{\sigma(1)}^{\lambda_1}x_{\sigma(2)}^{\lambda_2}\cdotsx_{\sigma(n)}^{\lambda_n}\)。
于是根据 Weyl 特征公式有
\[\mathop{\mathrm{ch}}{V_\lambda}=\frac{\sum_{\sigma\inS_n}\mathop{\mathrm{sgn}}{\sigma}x_{\sigma(1)}^{\lambda_1+n-1}x_{\sigma(2)}^{\lambda_2+n-2}\cdotsx_{\sigma(n)}^{\lambda_n}}{\sum_{\sigma\inS_n}\mathop{\mathrm{sgn}}{\sigma}x_{\sigma(1)}^{n-1}x_{\sigma(2)}^{n-2}\cdotsx_{\sigma(n)}^{0}}=\frac{\det(x_j^{\lambda_i+n-i})}{\det(x_j^{n-i})}.\]\(\mathop{\mathrm{ch}}{V_\lambda}\)是一个整系数对称多项式 \(s_\lambda(x_1,\ldots,x_n)\),叫做 Schur多项式。
Wilson 均匀生成树算法是一个很有意思的算法,我最初接触它是在念 RusselLyons 等人的 Probabilityon trees and networks 一书时,在网上查阅资料发现了 这个动画。当时就大叹奇妙,一顿看起来没头没脑的操作怎么就得出了一个迷宫呢?而且这个迷宫还服从所有迷宫(准确的说是所有完美迷宫) 上的均匀分布!
Wilson本人给出的证明相当有技巧性,而且有一些晦涩的部分,我是花了很久才真正理解,回过头来看其实也不复杂,但是把细节说清楚需要花一番功夫。本文就来介绍这个证明。
考虑这样的问题:给定一个有限无向的连通图,怎样在它的所有生成树中等概率地任选一种?我们熟悉的Prim 算法、Kruskal算法得到的都不是完全随机的生成树,目前已知最快的算法是 Wilson算法,它借助于擦圈的随机游动来实现。
Wilson 算法:设 \(G\) 是一个有限的、简单的、连通图。
- 任取一个顶点 \(r\),维护一个树\(T\),初始时 \(T=\{r\}\)。
- 任取一个不属于 \(T\) 的顶点 \(v\),从 \(v\)出发作图上的随机游动,一边走一边随时擦掉路径中出现的圈 (此为 looperased random walk),即每当走到一个以前访问过的顶点 \(x\),则两次访问 \(x\) 之间的路径都被擦掉,直到与 \(T\) 相遇为止,这样得到一条从 \(v\) 到 \(T\) 的不含圈的路径 \(p\),把 \(p\) 加入到 \(T\) 中,\(T=T\cupp\)。
- 重复此步骤直到 \(T\) 包含 \(G\) 的所有顶点,这时得到的 \(T\) 是一个服从均匀分布的生成树。
注意连通性保证了算法会以概率 1 结束。
Wilson算法的描述很简单,但是单从描述上完全看不出算法的正确性来。注意其中有两个任意:
在进入正式的证明前我先简要说说大致的思路。
设 \(\mathcal{T}\) 是 \(G\)的所有生成树组成的集合。我们构造一个概率空间 \((\Omega,\mathbb{P})\),\((\Omega,\mathbb{P})\)的具体描述我们先按下不表。我们将寻找一个从 \(\Omega\) 到 \(\mathcal{T}\) 的映射 \(\phi\),\(\phi\) 满足如下条件:
(1). \(\phi\) 对几乎处处的 \(\omega\in\Omega\) 有定义(不是所有的随机游动都能得到一个生成树,但这种例外发生的概率是 0)。
(2). \(\phi\) 必须是满射。
(3). 对任何 \(T\in\mathcal{T}\),其在 \(\Omega\) 中的原像 \(\phi^{-1}(T)\) 的测度是一个与 \(T\) 无关的常数。
一旦找到这样的概率空间 \(\Omega\)和映射 \(\phi\),则对任何 \(\omega\in\Omega\),\(\phi(\omega)\) 以概率 1是一个生成树,且其服从均匀分布。
这个映射 \(\phi\)就是擦圈的随机游动。证明中最有技巧性的部分就在于说明,虽然在擦圈的随机游动中每次选择的顶点有任意性,但是\(\phi\) 是一个确定的映射。
证明:
对每个 \(v\ner\),定义一个栈结构 \(S_v=\{S_{v,1},S_{v,2},\ldots\}\),这里栈的长度为无穷,每个\(S_{v,i}\) 都是随机变量,来自对 \(v\) 的邻居的均匀采样,所有的栈元素 \(\{S_{v,i}\}\) 都是独立的。顶点 \(r\) 的栈是一个空栈:\(S_r=\emptyset\)。我们要构造的概率空间 \(\Omega\) 就是这些栈 \(\{S_v\}\)所有可能的状态组成的集合,这是一个无穷离散的概率空间,其上的测度 \(\mathbb{P}\) 为乘积测度。
此外我们规定每个栈的第 \(i\) 个元素\(S_{v,i}\) 的颜色是 \(i\)。
在任何时刻,这些栈 \(\{S_v,v\ner\}\) 的栈顶元素都定义了一个有向图 \(G_S\),\(G_S\) 叫做栈顶图:\(G_S\) 的顶点集就是 \(G\) 的顶点集 \(V\),\(G_S\) 中从 \(v\) 连一条指向 \(u\) 的有向边当且仅当 \(u\) 是 \(S_v\) 的栈顶元素。每个 \(v\ne r\) 的出度都恰好是 1,顶点 \(r\) 的出度是 0,于是若 \(G_S\) 不含回路的话它就是一个以 \(r\) 为根的生成树。
下面我们来玩一个“回路弹出” (cycle popping)的游戏。这个游戏有点类似俄罗斯方块,目的是消除栈顶图中的所有回路:给定栈的一个状态\(\omega\in\Omega\),设 \(G_S\) 是 \(\omega\) 的栈顶图,若 \(G_S\)不含回路的话则它已经是一个生成树,游戏结束;否则设 \(C\) 是 \(G_S\)中的一个回路,我们可以将其“弹出”:对回路中的每个顶点 \(v\in C\),弹出 \(S_v\) 的栈顶元素,于是若 \(S_v\) 的栈顶元素为 \(S_{v,i}\),则弹出 \(S_{v,i}\) 以后栈顶元素变为 \(S_{v,i+1}\)。这样得到一个更新后的 \(G_S\)。玩家可以每次任选 \(G_S\)中的一个回路并将其弹出,如果经过有限多次弹出操作后使得 \(G_S\)中不含任何回路,则玩家获胜,这时得到的 \(G_S\) 是一个生成树。
你可以每次无脑选一个回路将其弹出,也可以将 \(G_S\)的所有回路在某种顺序下排好,每次弹出最小的那个,这都是不同的游戏策略。Wilson算法使用的是“跟着导航走”的策略:每次从一个不属于 \(T\)的顶点出发,跟着栈顶图的路牌指示走,每当走出一个回路,就把这个回路弹掉。撞到\(T\)的话,那就说明当前路径上的顶点不会属于任何回路(因为栈顶图的每个顶点出度至多是1),它们都是“安全”的。把当前路径加入 \(T\),再从任意一个不属于 \(T\) 的顶点出发重复这个过程。
Wilson 的策略可行吗?它能保证以概率 1得到一个生成树吗?会不会在某次循环时一直在擦圈,永远撞不到 \(T\)?答案是不会。由于 \(G\)有限且连通,其上的简单随机游动是正常返的,每次循环时,随机游动以概率 1在有限时间内撞到 \(T\),所以算法确实以概率 1在有限时间内结束。
映射 \(\phi\) 定义如下:对任何\(\omega\in\Omega\),若 \(\omega\) 的栈顶图 \(G_S\) 不含任何回路(即已经是一个生成树,这里应理解为无向树),则令 \(\phi(\omega)=G_S\)。否则用擦圈的随机游动对其进行回路弹出操作,若经过有限次操作后得到的\(G_S\) 不含任何回路,就令 \(\phi(\omega)=G_S\),否则 \(\phi(\omega)\) 无定义。
这里有一个重要的问题:\(\phi\)的定义是合理无歧义的吗?注意 Wilson算法允许每次从任意一个不属于 \(T\)的顶点出发作擦圈的随机游动,不同的选择会不会导致不同的 \(G_S\)?下面就来解决这个疑问。
我们假设有若干玩家分别玩这个游戏,每个人采取的游戏策略是不同的。我们想知道,对给定的初始栈状态\(\omega\in\Omega\),这些玩家都能获胜吗?他们最终得到的栈顶图\(G_S\) (也就是最终的生成树)一样吗?需要的操作次数相同吗?
答案是:不管这些玩家采取怎样的策略,只有两种可能的结果出现:
所有人都不能获胜。
所有人都能获胜,而且每个人使用的操作次数也相同,最终得到的栈顶图\(G_S\)也相同。不仅如此,每个人弹出的回路组成的集合 \(\{C_1,\ldots,C_n\}\)也都是相同的。注意这里的回路 \(C_i\)是带有颜色标记的,两个回路相同不仅要求对应顶点相同,也要求对应顶点的颜色相同。仅仅他们弹出这些\(C_i\) 的顺序可能不同。
这个现象可以很容易用所谓的“钻石引理” (diamond lemma)来解释。我在这里不打算展开介绍钻石引理,你可以参考 这篇文章,里面包含了钻石引理的几个有趣的应用。
我们只要证明如下的结论即可:
引理:对任一栈状态 \(\omega\in\Omega\),若玩家 \(A\) 可以经过 \(n\) 次操作后获胜,其弹出的回路依次为 \(C_1,\ldots,C_n\),则不论玩家 \(B\) 的策略如何,其必然也经过 \(n\) 次操作后获胜,其弹出的回路集合 \(\{D_1,\ldots,D_n\}\) 与 \(\{C_1,\ldots,C_n\}\) 是相同的,即适当重排\(\{D_1,\ldots,D_n\}\) 后有 \(D_i=C_i\)。这里回路的相等要求对应的顶点和颜色均相同。
引理的证明:对玩家 \(A\) 的操作次数\(n\) 归纳。\(n=0\) 时结论显然成立(双方均无任何操作),下面设 \(n\geq1\)且结论对所有小于 \(n\) 的情形成立。
设 \(B\) 第一次弹出的回路是 \(D_1\),如果 \(C_1=D_1\) 则这一步操作后 \(A,B\) 到达了相同的状态,而 \(A\) 可以继续经过 \(n-1\) 次操作后获胜,于是根据归纳假设 \(B\) 也一定经过 \(n-1\) 次操作获胜且后续操作 \(\{D_2,\ldots,D_n\}=\{C_2,\ldots,C_n\}\)。
如果 \(C_1\ne D_1\),我们断言 \(C_1\) 和 \(D_1\) 没有公共的顶点。否则若 \(v\in C_1\cap D_1\),由于第一次操作时 \(C_1,D_1\) 属于同一个栈顶图中,以及 \(v\) 的出度是 1,所以 \(v\) 在 \(G_S\) 中的后继 \(v_1\) 也同时属于 \(C_1\) 和 \(D_1\),进而 \(v_1\) 的后继 \(v_2\) 也是如此,这样一直下去回到 \(v\) 就会有 \(C_1=D_1\),矛盾。
既然 \(C_1\) 和 \(D_1\) 没有相同顶点,那说明不论先弹 \(C_1\) 后弹\(D_1\),或是先弹 \(D_1\) 后弹 \(C_1\),得到的栈顶图是一样的。
接下来的论述是钻石引理的典型操作:我们引入两个新玩家 \(A'\) 和 \(B'\),\(A'\) 的前两步操作是先弹出 \(C_1\) 后弹出 \(D_1\),\(B'\) 的前两步操作是先弹出 \(D_1\) 后弹出 \(C_1\)。\(A\) 和 \(A'\) 第一步操作相同,因此由归纳假设\(A'\) 必然继续经过 \(n-2\) 步后获胜;\(A'\) 和 \(B'\) 前两步操作后到达相同的状态,而\(A'\) 可以在 \(n-2\) 步后获胜,所以由归纳假设 \(B'\) 必然在 \(n-2\) 步后获胜。最后由于第一步操作后 \(B'\) 和 \(B\) 到达相同的状态,而 \(B'\) 可以在 \(n-1\) 步后获胜,所以 \(B\) 也必然在 \(n\) 步后获胜。至于 \(A,B,A',B'\)弹出的回路相同也是显然的。
至此我们就说明了 \(\phi\)的定义是合理的,它是一个确定的映射。
对没有接触过菱形引理的读者,我这个论述比 Wilson的原证明的论述要繁琐,但是从钻石引理的角度更本质地揭示了为什么游戏的结果不依赖于具体的策略。
设 \(T\)是任一生成树,我们来说明 \(\phi^{-1}(T)\) 的测度是不依赖于 \(T\) 的常数。
设 \(\mathcal{C}=\{C_1,\ldots,C_n\}\)是一组染色的回路,如果依次弹出 \(C_1,\ldots,C_n\)以后可以得到一个生成树,我们就称 \(\mathcal{C}\)是一组成功的回路。给定一组成功的回路 \(\mathcal{C}\) 和任一生成树 \(T\),我们来计算弹出的回路集合恰好是 \(\mathcal{C}\) 并且最终得到的生成树恰好是\(T\) 的概率。注意 \(\mathcal{C}\) 和 \(T\)的顶点必然无缝隙地填满栈 \(\{S_v\}\) 的上面的部分,所以这个概率就是\(\mathcal C\) 和 \(T\) 中的边各自指向正确位置的概率: \[\mathbb{P}(\mathcal{C},T)=\prod_{e\in\mathcal{C}\cup T} p_e=\Phi(T)\cdot\Phi(\mathcal{C}).\] 这里 \(\Phi(\bullet)\) 返回集合 \(\bullet\) 中所有边的概率的乘积。
设 \(\mathcal{C}_T\) 是所有可能得到\(T\) 的那些 \(\mathcal{C}\) 组成的集合,在上式两边对\(\mathcal{C}_T\) 求和,则 \[\mathbb{P}(T)=\left(\sum_{\mathcal{C}\in\mathcal{C}_T}\Phi(\mathcalC)\right)\cdot\Phi(T).\] 但是注意 \(\mathcal{C}_T\) 是一个与 \(T\) 无关的集合,这是因为在给定 \(\mathcal{C}\) 后,任何生成树 \(T\) 都有可能出现 (解释见后面),因此 \[\mathbb{P}(T) ={\rm const}\cdot \Phi(T).\]而 \(\Phi(T) = \prod\limits_{v\ner}(1/d_v)\) 是一个与 \(T\)无关的量,从而 \(\mathbb{P}(T)\)是常数,这就证明了 \(\phi\) 满足条件(3)。
解释下为什么给定 \(\mathcal{C}\)以后任何 \(T\)都可能出现,打个比方,想象一个向弹夹里面压子弹的过程:把树 \(T\) 放在栈顶,然后依次用 \(C_n,\ldots,C_1\) 将 \(T\) 往下压,得到一个栈的状态 \(\{S_v\}\),对这个状态执行回路弹出,显然依次弹出的就是\(C_1,\ldots,C_n\),最终得到的树是\(T\)。这顺便也说明了 \(\phi\) 是满射的,即 \(\phi\) 满足条件 (2)。
至此我们证明了擦圈的随机游动给出的映射 \(\phi:\Omega\to\mathcal{T}\)满足前面的三个条件,这就证明了 Wilson 算法的正确性。