Aztec 钻石图的完美匹配与多米诺洗牌算法
2021/03/15 更新:刚得知 Youtube 上的博主 mathologer 制作了一期非常精彩的节目,介绍 Aztec 钻石图与多米诺洗牌算法,非常值得一看!
2021/01/01 更新:2021 年的第一天,有人在 Shadertoy 上放了一个精彩的动画,演示多米诺洗牌算法的步骤:
Aigner 和 Ziegler 所著的 Proofs from the book (中文译版《数学天书中的证明》) 是一本非常精彩的数学读物,其中包含了 40 余个著名的数学问题和它们的巧妙解答。这些问题并不深奥,但也绝非没有受过严格数学训练的人所能欣赏,其中往往包含了相当的洞察力和聪明才智,读起来让人神清气爽,大叹数学之妙。
然而读完这本书的人恐怕都会有意犹未尽的感觉:这就没啦?我还没看够呢!
有一个问题我想是非常适合放在这本书里的,我也非常期待能在未来的版本中看到它,这就是 Aztec 钻石图的多米诺铺砌的计数问题。这个问题完美符合该书选题的标准:
- 表述初等,不需要太多的背景知识就能能理解。
- 内涵丰富。Aztec 钻石图是当前代数组合学中一个热点问题,它与交错符号矩阵、表示论、概率论、统计力学都有着深刻而奇妙的联系,有许多悬而未决的问题有待解决。
- 有多种令人拍案叫绝的解答,每个解答都不平凡,要么需要深刻的数学知识,要么需要开很大的脑洞。
我来介绍一下这个问题:
依次把
用 1x2 的多米诺骨牌不重叠不遗漏地盖住这些方格,可以得到 Aztec
钻石图的一个多米诺骨牌铺砌。下图显示的是
可以看到图中出现了四种不同颜色的骨牌,为什么这样染色后面会解释。
我们的问题是:
问题:
这里不考虑铺砌的对称性,比如全部用水平的骨牌铺砌和全部用竖直的骨牌铺砌是两种不同的铺砌。
问题: 如何在
第一个问题的答案是
第二个问题的答案叫做多米诺洗牌算法,正是本文要介绍的。
Aztec 钻石图多米诺铺砌的计数问题最早由 Elkies、Kuperberg、Propp 和 Larson 在论文 (Elkies et al. 1991) 中进行了深入的研究,在这篇文章中他们一共给出了 4 种不同的解答。时至今日人们发现的解法已经超过一打,不幸的是没有一种可以算是「简单的」,但其中最精彩的仍然要数 Elkies 等人论文中的第四个解法:洗牌算法。后来 Propp 在另一篇文章 (Propp 2001) 中用图变换的方式重新表述了这个算法,并同时解决了在给定边的权重情况下对铺砌随机取样的问题。本文就来介绍 Propp 的方法。
洗牌算法
理解洗牌算法的第一个关键是理解骨牌的定向。
把
乍看起来,骨牌只有水平或者竖直两种不同的类型,其实不然,骨牌有
N
、S
、W
、E
(北南西东)四种不同的类型,认识到这一点非常重要。下面介绍怎样定义和区分骨牌的类型。
如果棋盘上一个
类似地可以定义白方块为左上角方格为白色的 2x2 正方形区域。
对一张骨牌 N
、S
、W
、E
。如下图所示:
注意到在移动以后,定向为 N/S
的骨牌变成了定向为
S
的骨牌,定向为 S
的骨牌变成了定向为
N
的骨牌,对 E
, W
类型的骨牌亦然。
设
把 N
、S
、W
、E
将其染成了红、黄、绿、蓝四种颜色。我还画出了一个大小为
移走所有坏方块中的骨牌,这一操作叫做「删除 」(deletion)。上图中的铺砌在删除后的结果如下图所示:
将剩下的骨牌按照其定向各自移动一步,这一操作叫做「移动」 (sliding):
可以看到,这些剩下的骨牌分布在更大一些的
的区域内,而且不会出现骨牌重叠的情况。可以证明在移动结束后
中的空白部分可以唯一地表示为若干不相交的黑方块的并,对每个这样的黑方块,任意用一对水平的或者是竖直的骨牌将其填充,就得到了 的一个铺砌。这一操作叫做「生成 」(creation)。上图中的空白区域可以表示为 14 个不相交的黑方块的并,因此一共有 种不同的生成方式,其中一种如下:
于是从
注意: 算法开始时要求
用 GIF 动图演示这个过程:

上图演示的是从 1 阶 Aztec 钻石图的一个随机铺砌出发,反复地执行删除 -> 移动 -> 生成 -> 删除 -> 移动 -> … 的步骤,最终生成 30 阶 Aztec 钻石图的随机铺砌。其中每次生成之后都翻转棋盘的染色。
算法中最难的部分是证明在第二步移动结束后,
这个算法用 Propp 论文中介绍的图变换的角度更容易看清楚。
蜘蛛移动
多米诺铺砌实质上是图的完美匹配:考虑图
现在问题转化为求
设
并定义
如果
能求出权函数来当然是一件好事,因为权函数里面包含了图的非常多的信息,可以帮助我们计算出许多其它感兴趣的量来。比如说指定一条边
看起来求出图的权函数是一个比直接计算其完美匹配的个数更复杂的问题,那为什么我们要舍近求远呢?权函数方法的奥秘在哪里呢?
这就是关键所在:对于一个复杂的图,我们想通过一些「手术」或者「变换」把它变成简单一些的图,比如删去一些顶点和边,或者把其中的一部分用一个新图去替换。这些变换通常会改变图的完美匹配的个数,但是权函数却在变换前后保持某种递推关系从而可以求解出来。这种操作我们其实都见到过,高中物理中电网络的各种等效电路替换(如
Propp 使用的图变换基于下面的蜘蛛引理:
蜘蛛移动. 假设图
这里正方形的四个顶点记作
现在我们保持
证明:对
正好匹配成两对,即它们包含 的两条边; 中有两个匹配在一起,另外两个与外部匹配,即它们包含 的一条边。 互不匹配,即它们不含 的边。
设
若
属于第一类情形,则有两种可能: 或者 。这两种可能对应于 的一个匹配 ,如下图所示: 的两种可能性的权分别是 和 ,和是 ; 的权是 ,变换后的权值是变换前的 。若
属于第二类情形,则不妨设顶点 匹配(另外三种可能的情形是 , , ,分析是类似的),则 可以唯一地对应到 的一个匹配 ,如下图所示: 的权是 , 的权是 ,变换后的权值仍然是变换前的 。若
属于第三类情形,则 可以映射为 中的两个匹配 : 的权是 , 的权分别是 和 ,它们的和是 ,仍然是变换前的 。
于是
下面这个引理在下节会用到,它的证明非常简单,所以我省略它的证明。
顶点收缩. 如果某个顶点只有两个邻居,并且它和这两个邻居之间的边的权值都是 1,则我们可以将这个顶点以及它的两个邻居收缩为一个顶点。这样得到的新图与原图有同样的权函数。如下图所示:
用图变换求解计数问题
我们用蜘蛛移动的技巧来计算
把
我们从
然后我们给
对
由于我们总共对
对
顶点收缩不改变权函数,所以
由初始条件
从图变换的角度看洗牌算法
最后我们从图变换的角度解释为什么洗牌算法是正确的。你会看到,洗牌算法的三个操作步骤恰好对应 蜘蛛移动 中的三种情形。
在下图中,胞腔是深色,匹配的边是红色。三个胞腔 I, II, III 分别对应 蜘蛛移动 的三种情形:I 包含匹配的两条边;II 包含匹配的一条边;III 不含匹配的边。
蜘蛛移动以后的结果如下。注意初始
只有红色边和虚线边属于新图 | 拿走 |
收缩后我们得到了
与原匹配相比,I 中的边「删除」了,II 中的边「移动」到了对面,III 中「生成」了两条新边,正好与洗牌算法一致。同时胞腔的染色发生了翻转,即白方块和黑方块互换了颜色。
结语
Aztec
钻石图背后有许多有趣而深刻的数学,即便是计数这样看似初等的问题也有许多奥妙在里面,比如还有基于
graph condensation 的证明、转化为不相交路径组计数的证明、利用
顺便一提,演示多米诺算法的 GIF 动图是我学习 Python 的第一个正式程序,从开始看语法到写出最初的粗糙版本花了一周左右的时间。