国际象棋棋盘的多米诺骨牌密铺

下面的问题与统计物理中的 Dimer 格点模型有关:

问题 1×2 的多米诺骨牌密铺一张 8×8 的国际象棋棋盘,有多少种不同的方法?

下图是其中一种:

答案是 12988816,非常大的一个数字,显然不可能是逐个枚举数出来的。1961 年德国物理学家 Kasteleyn 借助线性代数的工具首先解决了这个问题,本文就来介绍他的方法。

反对称矩阵的 Pfaffian

我们从一个线性代数的结论说起,先来看一个 4 阶反对称矩阵的行列式:

det(0a12a13a14a120a23a24a13a230a34a14a24a340)=(a12a34a13a24+a14a23)2. 你发现了什么?这个反对称矩阵的行列式是一个多项式的平方,而且观察右边每个单项式的下标你发现,它们分别是 {(12),(34)}{(14),(23)}{(13),(24)},恰好跑遍集合 {1,2,3,4} 的所有匹配!

这个结论不是偶然的,实际上对任何 2n 阶反对称矩阵 AA 的行列式都可以表示为一个多项式的平方,这个多项式叫做 Pfaffian 多项式,记作 pf(A)pf(A) 中的单项式与集合 [2n]={1,2,,2n} 的匹配一一对应。

那么奇数阶反对称矩阵呢?它们的行列式都是 0,所以不考虑它们。

我们来给出 pf(A) 的定义:考虑一种把 [2n] 两两配对(从而分成 n 对)的方式: π=(i1,j1)(i2,j2)(in,jn). π 叫做集合 [2n] 的一个匹配,它可以用一个置换来表示,仍然记作 ππ=(12342n12ni1j1i2j2injn). 定义 π 的权为 wt(π)=sgn(π)aπ. 其中 sgn(π) 就是置换 π 的符号,偶置换时为 +1,奇置换时为 1aπ=ai1j1ai2j2ainjn. 于是 wt(π) 是一个次数为 n 的单项式。

但是,wt(π) 的定义是合理无歧义的吗?注意一个匹配 π 可以有多种不同的置换表示:你可以按任意的顺序排列这些 (ik,jk) 对,比如 π=(12342n12ni2j2i3j3i1j1). 或是交换某一对中 ikjk 的位置: π=(122k12k2n12ni1j1jkikinjn). 不难验证,虽然不同的置换表示给出的 sgn(π)aπ 可能不同,但是二者的乘积 wt(π) 总是一样的。比如把某个 (ik,jk) 改写成 (jk,ik),那么 sgn(π)aπ 都同时变号,乘积保持不变。总之 wt(π) 的定义只与匹配 π 有关,并不依赖于具体置换的选择。

定义. M2n[2n] 的所有匹配组成的集合,矩阵 A 的 Pfaffian 多项式 pf(A) 定义为 pf(A)=πM2nwt(π).

现在我们可以叙述本节的主要结论了:

定理 1.1. A2n 阶反对称矩阵,则 detA=[pf(A)]2

证明:根据行列式的定义, detA=σS2nsgn(σ)aσ=σS2nsgn(σ)a1σ(1)a2σ(2).

回忆任何置换 σ 都可以表示为若干不相交的轮换的乘积: σ=(i1i2ik)(j1j2jl).E2n 为轮换长度 k,l, 都是偶数的那些置换组成的集合,我们要证明在上述行列式的求和中,σ 只跑遍 E2n,不属于 E2n 的那些置换整体对行列式的贡献为 0。

分两种情况:

  1. 如果 σ 包含一个不动点:σ(i)=i,则由于 aiσ(i)=0 从而 σ 对行列式的贡献为 0。
  2. 如果 σ 没有不动点,但是包含长度为奇数的轮换,选择其中含有最小元素的那个,设为 C=(i1i2ik),这里 k 为奇数且大于等于 3。定义置换 σ 如下:σ 的其它轮换与 σ 完全相同,只是把 C 整个倒过来变成 (iki2i1)。显然 σ 对应的和项与 σ 抵消,而且如果对 σ 执行此操作又会回到 σ。于是所有没有不动点,而且包含长度是奇数的轮换的置换可以两两配对抵消。

σ=(13)(246)(578)(910) 有 2 个长度为奇数的轮换 (246)(578),最小的元素 2 出现在 (246) 中,所以 σ=(13)(642)(578)(910)

这就证明了在行列式的求和中,σ 只跑遍那些轮换分解长度都是偶数的置换。

于是为了证明 detA=[pf(A)]2,只要证明 πM2nπM2nwt(π)wt(π)=σE2nsgn(σ)aσ.

为此我们来证明存在双射 M2n×M2nE2n:(π,π)σ. 而且这个双射还保持权的相等,即 wt(π)wt(π)=sgn(σ)aσ. 这样就证明了定理。

对任何两个匹配 (π,π)M2n×M2n,我们把它俩画在同一张图上,图的顶点集合就是 [2n],两个顶点 i,j 如果在 π 中配成一对就在它们之间连一条红色边,或者如果 i,jπ 中配成一对就在它们之间连一条蓝色边。这样我们得到的是一个每个顶点恰好有一条红边和一条蓝边的图,即每个顶点度数都是 2 的正则图。这个图一定可以表示为若干条不相交的回路的并 1,在一个回路中,红边和蓝边是交错出现的,因此每个回路的长度都是偶数。

C 是这样的一条回路,i1C 中最小的元素,从 i1 出发,沿着红色的边,即 π 的方向绕 C 一圈: i1πi2πi3ππi1. 这样得到了一个轮换 (i1i2ik)。对每个回路都这样做,我们就得到了一组轮换,与 (π,π) 对应的置换 σ 就定义为所有这些轮换的乘积。由于这些回路互不相交,这些轮换两两交换,所以我们不必关心它们相乘的顺序,任何顺序都给出同样的 σ

逆映射也很显然,对任何 σE2n,在 σ 的每个轮换 C 中,找到最小的 i1C,设 C=(i1i2ik),那么依次规定 i1πi2πi3ππi1. 即可。

下面是将 2n=12σ=(1345710)(2698)(1112) 对应到两个匹配 π,π 的示意图:

最后我们来验证这个对应保持权的相等:设 σ 的轮换分解式为 σ=(i1i2i2k1i2k)(j1j2j2l1j2l). 其中 i1,j1, 是每个轮换中最小的元素。于是 π=(122k12k2k+12k+2i1i2i2k1i2kj1j2). π=(122k12k2k+12k+2i2i3i2ki1j2j3).

容易验证 aπaπ=aσ 以及 π=σπ,从而 定理 1.1 得证。

平面图的 Pfaffian 定向

Pfaffian 多项式的结论启发我们可以用它来计算一个图 G 的所有匹配的个数。

G2n 个顶点。首先给 G 的边任意定向,得到一个简单有向图 G。写出 G 的邻接矩阵 A=(aij)

aij={1ij,1ji,0else.

A 是一个反对称矩阵且

detA=(πM2nwt(π))2=(πM2nsgn(π)ai1j1ai2j2ainjn)2.

这里 π=(i1,j1)(i2,j2)(in,jn) 跑遍集合 [2n] 的所有匹配。由于每个 aij 的取值是 ±1 或者 0,所以 wt(π) 的值也是 ±1 或者 0,并且 wt(π)0 当且仅当对每个 1knikjkG 中是相邻的,即 π 给出 G 的一个匹配。于是 G 的所有匹配与 pf(A) 中的非零项一一对应。不幸的是,这些非零项有 +1 有 -1,把它们直接加起来得到的可不是 G 的所有匹配的个数。但是我们可以这样想: 能否通过适当的定向 G,即适当给 aij 赋以 +1 或者 -1,使得每一个非零的 wt(π) 都同为 +1 或者同为 -1?如果可以,那么|detA| 就是要求的匹配的个数。

回忆在证明 定理 1.1 时,我们有结论 wt(π)wt(π)=sgn(σ)aσ. 要使得所有非零的 wt(π) 都同为 +1 或者同为 -1,只要让每个非零的 sgn(σ)aσ 都等于 1 即可。设 σ 是一个使得 aσ0 的置换且 σ 的轮换分解为 σ=C1Cl,这里每个 Ci 的长度都是偶数,则 sgn(σ)=(1)l,aσ=aC1aCl. 这里规定 Ci=(i1i2ik)aCi=ai1i2aiki1。如果我们能够使得每个 aCi=1,那么就有 sgn(σ)aσ=(1)l(1)l=1.aCi 等于 -1 意味着,当在 G 中沿着回路 i1i2iki1Ci 一圈时,有奇数条边在与 G 的定向一致(由于轮换长度 k 是偶数,这也等价于有奇数条边与 G 的定向相反)。

定义. G 是有限图。如果 G 的一个回路 C 的长度是偶数,且删除 C 后剩下的部分仍然存在匹配,就称 C 是一个好的回路。如果 G 的一个定向 G 使得 G 的所有好的回路都是奇定向的,即沿着回路的任一方向行走都有奇数条边的定向与行走方向一致,就称 G 是一个 Pfaffian 定向。

对一般的图,找到其 Pfaffian 定向是困难的事,但是对平面图却很简单。这就是下面的定理:

定理 2.1 (Kasteleyn). G 是一个简单平面图,则可以给 G 的边适当定向,使得当逆时针沿着 G 的每个面行走时(外部的无穷区域不算),都有奇数条边与行走方向一致,这种定向就是 G 的 Pfaffian 定向。

证明:我们首先说明存在这样的定向,使得 G 的每个面都是奇定向的。对面的个数归纳:f=0,则 G 是一个树,任何定向都是 Pfaffian 定向。设结论对有 f1 个面的简单有向图成立,对有 f>1 个面的图 G,找到一条内部面与外部区域相邻的边 e,删去 e 得到的是一个有 f1 个面的有向图,由归纳假设,可以让每个面都是奇定向,然后把 e 补回去,并适当在 e 的两种可能的定向中选择一个使得最后这个面也是奇定向的即可。

其次我们要说明这样的定向是 Pfaffian 定向,即对 G 中任意好的回路 C,当绕着 C 的内部逆时针行走一圈时,有奇数条边的定向与行走方向一致。

C 长度为 lC 内部有 p 个顶点,q 条边,r 个面,C 上逆时针定向的边的个数为 c,内部的第 i 个面 (1ir) 上逆时针定向的边的个数为 ci

绕着所有面都逆时针走一圈,遇到的与行走方向定向相同的边的个数是 i=1rci=c+q,这是因为 C 内部的 q 条边都被走了两次,一次逆时针,一次顺时针,因此都被计算了一次;而 C 上的边只有逆时针定向的那些边(一共有 c 条)被计算了一次。

由于每个 ci 都是奇数,因此 rc+q (mod 2).

另一方面对 C 包含的区域用 Euler 定理,得到 (p+l)(q+l)+r=1. 从而 pc 奇偶性相反,但是 p 是偶数,这是因为删去 C 以后仍然存在匹配说明 C 的内部和外部各有偶数个顶点,因此 c 是奇数,这就证明了定理。

棋盘的多米诺骨牌密铺的计数

回到文章开始的问题。

设棋盘的大小为 m×nm 是行数。这里 m,n 必须至少有一个是偶数,我们这里假定列数 n 是偶数。

把棋盘的每个方格看作图 G 的顶点,两个方格对应的顶点 u,vG 中相邻当且仅当它们有公共的边,这样就得到一个有 mn 个顶点的平面图。棋盘的多米诺密铺与 G 的完美匹配是一一对应的:密铺中的每个骨牌恰好盖住两个相邻的方格,这两个方格匹配在了一起。

为了求出 G 的完美匹配个数,只要标记出 G 的一个 Pfaffian 定向,写出对应的邻接矩阵,然后求出行列式,再开平方即可。

Pfaffian 定向是很容易找的,如下图所示:

m\times n 网格图的 Pfaffian 定向

下一步是写出这个定向图的邻接矩阵。我们按照从第一行开始,每一行从左到右的顺序给顶点排序。设 Bn=(010101101110)n×n. 则邻接矩阵为 L(m,n)=(BnInInBnInInBnInIn(1)m1Bn)m×m.

我把求邻接矩阵的详细过程放在后面的附录中。下面先来求 L(m,n) 的行列式。

适当给 L(m,n) 的行列变号,可以得到 detL(m,n)=det(BnImInCm). 其中 Cm=(010101101110)m×m. 这个变号步骤并不显然,我们需要选择 L(m,n) 的一些行列变号,使得对角线上的每个 Bn 所在的行列恰好有一次变号,每个 Bn 所在的行列要变号两次,要么不变。具体规则是这样的:由于 Bn 出现在 L(m,n) 对角线上的 2,4,6,, 位置上,我们选择:

  1. 将所有形如 4k+2变号;
  2. 将所有形如 4k变号;
  3. 将所有形如 4k+3行和列同时变号;

这样显然可以把对角线上都变成 Bn。对每个位于次对角线上 (i1,i) 位置的 In

  • 如果 i=4k+2,则 (i1,i)=(4k+1,4k+2),根据 1 它改变了一次符号;
  • 如果 i=4k,则 (i1,i)=(4k1,4k),根据 2, 3 它改变了三次符号;
  • 如果 i=4k+1,则 (i1,i)=(4k,4k+1),根据 2 它改变了一次符号;
  • 如果 i=4k+3,则 (i1,i)=(4k+2,4k+3),根据 1, 3 它改变了三次符号。

总之 In 都会变成 In。类似地所有 In 均保持不变。

剩下的就是线性代数中求特征值的部分,需要一些关于矩阵张量积的知识,这里就不展开写了,大致逻辑是这样的:设 Bn 的特征值为 λ1,,λnCm 的特征值为 μ1,,μm,则 BnImInCmmn 个特征值为 {λiμj,1in,1jm},所以 det(BnImInCm)=i=1nj=1m(λiμj). BnCm 的特征值的计算应该是线性代数课程中行列式部分的常见的习题,我把具体的计算步骤放在附录中,最终结果是 |detL(m,n)|=k=1ml=1n(4cos2kπm+1+4cos2lπn+1)14. 此即为要求的完美匹配的个数。

未尽的讨论

我们已经得到了一个关于 m×n 棋盘的多米诺骨牌密铺的漂亮的表达式,事情可以结束了吗?其实还没有,这个表达式虽然很漂亮,但是我们没法用它来具体计算匹配个数的值(一堆三角函数的乘积怎么算?)。那应该怎么办呢?我把后面的故事留给 (Aigner 2007, sec. 10.1)

附录

求邻接矩阵 L(m,n) 的具体步骤

L(m,n) 简写为 L=L(m,n)。把网格图 G 的顶点标记如下:

(1,1)(1,2)(1,n)(2,1)(2,2)(2,n)(m,1)(m,2)(m,n)

对这些顶点排序,首先是第一行从左到右,然后是第二行从左到右,等等: (1,1)<(1,2)<<(1,n)<(2,1)<<(2,n)<<(m,1)<<(m,n).

Lmn×mn 阶矩阵,它的行和列分别由 (i,j)1im1jn(i,j)1im1jn 标记。L 可以划分成 m×m 个子块,每个子块是 n×n 阶的,其中位于 (i,i) 处的子块对应的矩阵是 (L(i,j)(i,j))1j,jn(i,1),,(i,j),,(i,n)(i,1)(i,j)(i,n)

注意到 (i,j)(i,j) 之间有边相连当且仅当:

  1. i=ij=j±1
  2. i=i±1j=j

这说明 L 在除去对角线以及两侧的次对角线以外的位置都是 0。

在情形 1 中,由于水平的边(红色和绿色)是交替改变方向的,所以 L(i,j)(i,j+1)=(1)i1 for 1im and 1jn1. 这说明 L 对角线上的第 i 个子块是 (1)i1Bn,其中 Bn=(010101101110)n×n.L 形如 (BnBn(1)m1Bn). 在情形 2 中,由于竖直的边(蓝色)是恒定向下的,所以 L(i,j),(i+1,j)=1 for 1im1 and 1jn. 这说明 L 右上方次对角线上的 (i,i+1) 位置的子块都是 In。再结合 L 是反对称的,下方次对角线上都是 In,所以 L 形如 (BnInInBnInInInIn(1)m1Bn).

此即为 G 的邻接矩阵。

BnCm 的特征值

我们以 Cm=(010101101110). 为例来说明怎样求它的特征值,Bn 的求解是类似的。

我们需要求出其特征多项式

fm(λ)=det(λ101λ11λ111λ).

按第一行展开可得递推关系

fm=λfm1fm2,

结合初始条件 f0=1,f1=λ (初始条件可以从 m=2 的情形展开确定) 可得

fm(λ)=1λ24[(λ+λ242)m+1(λλ242)m+1].

由此不难确定 Cmm 个特征值为 2coskπm+1,k=1,,m.

References

Aigner, M. 2007. A Course in Enumeration. Graduate Texts in Mathematics. Springer Berlin Heidelberg.