11
大学数学基礎解説
文献あり

ドミノタイリングの数え上げ公式の導出方法【前編~導出~】

892
0

はじめに

 この記事では、m×n の長方形をドミノタイリングする方法が何通りあるかを計算する公式について考察します。

 まず、「ドミノタイリング」について説明します。
 ドミノタイリングというのは、図1 のようにしてドミノ(1×2 の長方形)で領域を埋めつくすことをいいます。

ドミノタイリングの例 ドミノタイリングの例

 この、ドミノタイリングの方法が何通りあるかを考えるわけです。なお、回転したり裏返したりして重なるものについても異なるものとして数えます。

 記事を【前編~導出~】と【後編~証明~】にわけています。

 前編では、公式の導出までを一気に解説します。ただし、一部の説明は省略しています。
 後編では、省略した部分を補足して、なぜこの公式がドミノタイリングの総数となるのかについて掘り下げたいと思います。

 なお、導出方法は参考文献の「線形代数と数え上げ[増補版]」を大いに参考にしていますが、一部に私の独自の改変が加えてあります。致命的なミスはないと信じていますが、問題があれば優しく教えていただければ幸いです。

(R5.10.21 後編を公開しました!)
リンク: Mathlog|ドミノタイリングの数え上げ公式の導出方法【後編~証明~】

(R5.11.4 応用編となる記事を公開しました!)
リンク: Mathlog|任意のポリオミノをドミノで埋め尽くす方法の総数を行列式を使って求める方法(日曜数学会)

観察

 m×n の長方形のドミノタイリングの方法の数を Zm,n とあらわすことにします。

 手始めに、小さいときから考えてみましょう。
 総当たりで調べると Z1,2=1,Z2,2=2,Z2,3=3,Z3,4=11 となります。
 
!FORMULA[6][2058124219][0] Z3,4=11

m,n10 以下の場合の Zm,n の値について表にすると、次のようになります。

mn1234567891010101010101212358132134558930301104101530571415113695281781224563361806150809501183014824018592161134128111836728315291670898179914213133702107810315290129269705317551781341532245148241670891292697129888161084357451031151241905506336081799101084357450144795217611018957118061185921421313353175517103115124114479521761258584046368

 この表を見ているだけでもわかることがいくつかありますので、本題に入る前に、この表を観察してみましょう。

 まず、m,n がともに奇数の場合は 0 になっていますね。
 m,n がともに奇数の場合は、長方形の面積が奇数になるので、ドミノで敷き詰めることが不可能なので 0 というわけですね。

 それから、m,n の片方が 1 の場合は、直線状に並べるしかないので 01 が交互に並んでいます。

 m,n の片方が 2 の場合はどこかでみた数列になっていますね。
 そう、フィボナッチ数列です!
 この記事ではこれ以上説明しませんが、本当にフィボナッチ数列であることを証明することができます。

 m,n がともに 3 以上の場合については、簡単な法則はなさそうに見えます。

 それから、全体の傾向として、(両方が奇数の場合を除いて、)m,n が大きくなるにつれて場合の数が爆発的に大きくなっています。いわゆる「組み合わせ爆発」が起きていますね。

 ちなみに、 m=n=20 の場合、実に

Z20,20=1269984011256235834242602753102293934298576249856

 という数になります!
 読み方は「1 極 2699 載 8401 正 1256 澗 2358 溝 3424 穣 2602 秭 7531 垓 229 京 3934 兆 2985 億 7624 万 9856」です。

 仮に総当たりでこれを数え上げようとするならば、1 秒間に 1 京とおりを調べることができたとしても 4.0×1024 年以上かかります。宇宙の寿命が先に尽きてしまいます。

 これほどの数になると、たとえスーパーコンピュータを使ったとしても、まともに数え上げることはできそうもありません。・・・が、実は一つ一つ調べることなくその総数を計算できる公式があるのです。(だから上記の数がわかるわけですが)

 それでは、その公式をご紹介しましょう。こんな公式です。

m×n の長方形を 1×2 のドミノで埋め尽くす方法が何通りあるかの個数の公式

  Zm,n=j=1m2k=1n2 ( 4cos2πjm+1+4cos2πkn+1 )

 「公式に出てくる記号の意味がわからない!」という方はこちらをご覧ください。

公式に出てくる記号の意味(ここをクリック/タップ)



  というのは掛け算の記号です。の掛け算バージョンですね。


(総積)
 連続する掛け算を略記するための記号。例えば次のように計算する。

  j=13 jj+1=11+122+133+1

 複数重ねるときに () を書かなくてもよい

  j=13(k=14(j+2k))= j=13k=14(j+2k)

    ↑ 左辺と右辺は同じ意味





  というのは天井関数。その数以上の最小の整数を対応させる関数です。


(天井関数)
 床関数と対をなす関数。その数以上の最小の整数を対応させる。

  1.618=2
  
  5=3

 整数に対してはその整数自身を対応させる。

  4=4



 記号の意味を説明したところで、もう一度公式を見てみましょう。

  j=1m2k=1n2 ( 4cos2πjm+1+4cos2πkn+1 )
 
 計算の仕方はわかりますが、それにしても、式の中に cos が出てくるのが不思議だと思いませんか?

 試しに m=3,n=4 で計算してみると

m=3,n=4の場合

   j=132k=142 ( 4cos2πj3+1+4cos2πk4+1 ) = j=12k=12 ( 4cos2πj4+4cos2πk5 ) =( 4cos2π4+4cos2π5 )( 4cos2π4+4cos22π5 )( 4cos22π4+4cos2π5 )( 4cos22π4+4cos22π5 ) =( 4(12)2 +4(1+54)2 ) ( 4(12)2 +4(1+54)2 ) ( 02 +4(1+54)2 ) ( 02 +4(1+54)2 ) =( 2+3+52 ) ( 2+352 )  3+52  352  =11   

 計算途中には無理数も出てきますが、最終的な計算結果は整数になりました。さきほどの表の値と同じ 11 になりましたね!

 また、m,n がともに奇数の場合は、総積の中にゼロとなる項があるのでゼロになることが分かります。  

  j=1m2k=1n2 ( 4cos2πjm+1+4cos2πkn+1 )

m,n がともに奇数で、j=m2,k=n2 のときはカッコ内がゼロになる

Desmos:検算用

公式の導出

 いやあ、それにしても凄い式です。組み合わせ爆発でとんでもないことになる場合の数を一瞬で計算できてしまうのですから。

m×n の長方形を mn2 個のドミノで埋め尽くす方法が何通りあるかの個数の公式(再掲)

  j=1m2k=1n2 ( 4cos2πjm+1+4cos2πkn+1 )

 そんなわけで、まずはこの公式を導出しましょう。途中で気になるところがいろいろ出てくるとは思いますが、まずはスピード重視で計算を進めます。

手順 1 複素数平面上に長方形を配置する

 m×n の長方形を構成する各単位正方形の中心を頂点とするグラフを考えます。頂点を結ぶ辺は、頂点に対応する単位正方形が隣接している場合に引きます。
 
 そして、そのグラフを、複素数平面の格子点に頂点が重なるように配置します。

単位正方形の中心を複素数平面の格子点と重なるように配置 単位正方形の中心を複素数平面の格子点と重なるように配置

 m×n の長方形には mn 個の頂点があります。
 頂点には図のように番号をふります。
 すなわち、左下を V1 として、実軸方向に 1 ずつ番号を増やしていき、虚軸方向には n ずつ番号を増やしていきます。

 下から j 番目、左から k 番目の頂点は Vn(j1)+k というわけです。

 これらの頂点の隣接関係を表にします。

手順 2 行列を作り、行列式を計算する

 頂点が隣接していない場合は 0 を、隣接している場合は次の図のように、隣の頂点との差分を表に書き込んでいきます。

隣の頂点との差分 隣の頂点との差分

 「表の jk 列目の成分は VjVk の位置の差分(ただし隣接していない場合は 0)」として頂点の隣接関係を表にするとこんな感じの表ができます。

 なお、具体的な数字を入れた方が分かりやすいと思いますので、ここからは m=3,n=4 の場合について計算を進めます。

 m=3,n=4 の場合

V1V2V3V4V5V6V7V8V9V10V11V12V10100i0000000V210100i000000V3010100i00000V40010000i0000V5i0000100i000V60i0010100i00V700i0010100i0V8000i0010000iV90000i0000100V1000000i001010V11000000i00101V120000000i0010

 これを 12 次正方行列とみて、行列式を計算します。
 (余談ですが、このような行列を「隣接行列」と呼んだりします。グラフ理論とも関係がありますが、ここでは深入りしません。)
 
 手作業では大変なので、計算サイトなどを利用して行列式を計算すると、121になります。

利用したサイト: Matrix calculator 行列式計算機

|0100i000000010100i000000010100i000000010000i0000i0000100i0000i0010100i0000i0010100i0000i0010000i0000i000010000000i001010000000i001010000000i0010|=121

 行列式の平方根、すなわち 121=11 が、3×4 のドミノタイリングの総数と一致しています。

 これが偶然ではないことを確かめるために、10 以下の m,n について行列式を計算したものを表にしてみました。

mn1234567891010101010101214925641694411156302579213090121016810234090326041412512112969025789616099615040025401448963261997215064090250139948902197509760345666182416116916817896113994894526598499407784127918733921669109276081177504896756897044106099610994077841016710655338090282763560821728981115623409504002521975097627918733921167106553380916870934108185611758310793705025106327288181584008190302504014489606691092760810117583107937050250209656550427272541121101792132604132619972134566618241177504896756892827635608217289106327288181584008120965655042727254112166865709036047973991424

 この表と、冒頭のm,n10 以下の場合のドミノタイリングの総数の表を見比べてみてください。
 ドミノタイリングの総数を Zm,n とし、この表の行列式を det(A) とすると、次の関係が見えてきます。

 Zm,n=|det(A)|

 ドミノタイリングの総数が、行列式の絶対値の平方根と一致しています。
 このことを利用して、公式を導出することができます。

手順 3 行列の固有値と固有ベクトル

 ところで、サイズの大きな行列式の計算を定義通りに計算すると、組み合わせ爆発になってしまい大変です。そこで、簡単に計算できる方法がいろいろ研究されています。今回は、行列の固有値を使って簡単に行列式を計算していきます。

 m×n の長方形に対応する行列は、mnmn 列の行列でした。

 固有値と固有ベクトルの組は mn 組あります。この後の説明をやりやすくするために、添え字を 2 種類にします。

 イメージとしては、グラフの頂点 Vn(j1)+k それぞれに固有値 λj,k と固有ベクトル ϕj,k を対応させたものと考えるとよいでしょう。

 固有ベクトルにはそれぞれ mn 個の成分がありますから、これにも添え字を 2 種類つけて、固有ベクトル ϕj,k の成分を φs,t(j,k) のようにあらわすことにしましょう。ただし、添え字が多すぎると見づらいので、適宜 φs,t のように添え字の一部を省略して書くことにします。

ϕj,k=(φ1,1(j,k)φ1,2(j,k)φm,n1(j,k)φm,n(j,k))

 さて、じつに天下り的ですが、今考えている行列の固有値と固有ベクトルの成分はこんなふうに書くことができます。

固有値
 λj,k=2cosπjm+1+i2cosπkn+1

固有ベクトルの成分
 φs,t(j,k)=itssinπjsm+1sinπktn+1

 これらの固有値・固有ベクトルは、m,n を色々変えて実際に固有値・固有ベクトルを計算してみると、なんとなく法則性があることから推測して見つけることができます。

利用したサイト: Matrix calculator 固有値計算機

 「推測した固有値なんて怪しい」ですって?
 ごもっともです。本当に固有値・固有ベクトルなのか、定義にしたがって検算して確認しておきましょう。
 本当は微分方程式の類似として差分方程式を変数分離法で解くことでも求められるらしいけど私にはわかりませんでした。

固有値と固有ベクトル

 正方行列 A に対して、次の方程式

 Ax=λx

を満たす零ベクトルでないベクトル x とスカラー λ が存在するとき、xA の固有ベクトル、λA の固有値と呼ぶ。

 ではさきほど「固有値」「固有ベクトル」としてあげた式たちが本当に定義を満たしているのか検算して確認してみましょう。
 Aϕj,k に作用させたベクトルを Ψj,k であらわすことにします。つまり (Ψj,k=Aϕj,k)
 Ψ の成分を ψ で、次のようにあらわすことにします。

  Ψ=(ψ1,1ψ1,2ψm,n1ψm,n)

 このとき、ψφ を使って次の式で表すことができます。

 ψs,t=iφs1,tφs,t1+φs,t+1+iφs+1,t ……(☆)

 ただし、φ の添え字が範囲外になるときは 0 として計算します。

 …さらっと書きましたが、ここは結構な驚きポイントだと思いますので、本当にこの関係が成り立つのか、ちょっと確かめてみましょう。

 行列の成分をみると、i,1,1,i が左上から右下へ直線状にならんでいます。

(0100i000000010100i000000010100i000000010000i0000i0000100i0000i0010100i0000i0010100i0000i0010000i0000i000010000000i001010000000i001010000000i0010)

 そのことを利用して、先ほどの式(☆)ができていたわけです。

 ・・・が、よくみると、11 は直線状の並びの一部が途切れています。長方形の端の位置、すなわち t=1 のときには 1 が途切れて、t=n のときは 1 が途切れています。
 そのときでも、先ほどの式(☆)は成立します。

 なぜなら、t=1 のときは

  φs,t1=it+1ssinπjsm+1sinπk(11)n+1=0

 がゼロになり、t=n のときも

  φs,t+1=it+1ssinπjsm+1sinπk(n+1)n+1=0

 がゼロになり、うまいことつじつまが合うのです!

 それでは、
 φs,t(j,k)=itssinπjsm+1sinπktn+1
 を先ほどの式(☆)に代入して計算を進めてみましょう。

 ψs,t=iφs1,tφs,t1+φs,t+1+iφs+1,t=iit(s1)sinπj(s1)m+1sinπktn+1i(t1)ssinπjsm+1sinπk(t1)n+1+i(t+1)ssinπjsm+1sinπk(t+1)n+1+iit(s+1)sinπj(s+1)m+1sinπktn+1=itssinπktn+1(sinπj(s1)m+1+sinπj(s+1)m+1)+iitssinπjsm+1(sinπk(t1)n+1+sinπk(t+1)n+1)=itssinπktn+12sinπjsm+1cosπjm+1+iitssinπjsm+12sinπktn+1cosπkn+1=(2cosπjm+1+i2cosπkn+1)itssinπjsm+1sinπktn+1=λj,kφs,t

ψs,t=λj,kφs,t(j,k)

 ψs,tΨj,k の成分で、φs,t(j,k)ϕj,k の成分なので

Ψj,k=λj,kϕj,k

Ψj,k=Aϕj,k ですから

Aϕj,k=λj,kϕj,k

というわけで、λj,kϕj,k は、確かに固有値と固有ベクトルの定義を満たしています。

手順 4 固有値の積で行列式を計算する

 行列式の値は全ての固有値の積と一致します。

 n 次正方行列 A の行列式は、A の固有値を全て掛けた積に等しい。

   det(A)=λ1λ2λn

    (λjAn 個の固有値)

 この性質を使って行列式を求めましょう。
 m×n のドミノタイリングに対応する mn 次正方行列を Am,n とします。
 先に書いた通り、行列 Am,n に対応する固有値は

  λj,k=2cosπjm+1+i2cosπkn+1   

です。j,k1jm,1kn の範囲を動きますので、固有値は mn 個あります。

求める行列式を det(Am,n) と書きます。

 det(Am,n)=j=1mk=1nλj,k

ということになります。
この式に

 λj,k=2cosπjm+1+i2cosπkn+1

を代入することで次の式が得られます。

 det(Am,n)=j=1mk=1n  (2cosπjm+1+i2cosπkn+1)

 mn 個の固有値を複素数平面に並べると、実軸方向に m 個、虚軸方向に n 個の長方形状に並ぶことが分かります。対称性を利用して式をシンプルにすることを考えます。
 特に、共役複素数の積が実数になることを利用することで実数のみの式にすることができます。

共役複素数の積は実数になる

 (x+iy)(xiy)=x2+y2

 あまり場合分けはしたくないのですが、ここではやむを得ず場合分けをしましょう。
 m,n の偶奇で場合分けして計算していきます。

m が偶数、n も偶数のとき

!FORMULA[178][-1341019318][0] の固有値 A4,4 の固有値

(m:even,n:even)

 det(Am,n)=j=1mk=1n  (2cosπjm+1+i2cosπkn+1)=j=1mk=1n2  (4cos2πjm+1+4cos2πkn+1)=(j=1m2k=1n2  (4cos2πjm+1+4cos2πkn+1))2

m が奇数、n も奇数のとき

(m:odd,n:odd)

!FORMULA[184][-1341943800][0] の固有値 A3,3 の固有値

 j=m+12,k=n+12 のときカッコ内がゼロになるので総積もゼロになります。
 
 det(Am,n)=j=1mk=1n  (2cosπjm+1+i2cosπkn+1)=0

m が奇数、n は偶数のとき

(m:odd,n:even)

!FORMULA[190][-1341942839][0] の固有値 A3,4 の固有値

 det(Am,n)=j=1mk=1n  (2cosπjm+1+i2cosπkn+1)=j=1mk=1n2  (4cos2πjm+1+4cos2πkn+1)=(j=1m12k=1n2  (4cos2πjm+1+4cos2πkn+1))2  ×  j=m+12m+12k=1n2  (4cos2πjm+1+4cos2πkn+1)=1=(j=1m+12k=1n2  (4cos2πjm+1+4cos2πkn+1))2

 3 行目から 4 行目の変形に注目してください。わざわざ 1 になる項をもう一回かけています。なぜこんなことをしているかというと、あとで場合分けのない 1 つの式に統合するときに都合がいいからです。

 また、3 行目で =1 となっている部分。本当に 1 になるのかあやしいと思いませんか?念の為確認しておきましょう。

  j=m+12m+12k=1n2(4cos2πjm+1=0+4cos2πkn+1)=k=1n2(2cosπkn+1)2=k=1n2(exp(iπkn+1)+exp(iπkn+1))2=k=1n2(exp(iπkn+1)(1+exp(2iπkn+1))exp(iπkn+1)(exp(2iπkn+1)+1))=k=1n(exp(2iπkn+1)+1)

この最後の式が 1 になることを示すには次のようにすればよいです。

 xn+11=(x1)(xn+xn1++1)

 xn+11=(x1)k=1n(xexp(2iπkn+1))

を比較して

 k=1n(xexp(2iπkn+1))=xn+xn1++1

 x=1 を代入し、n が偶数であることに注意して計算すると

  k=1n(1exp(2iπkn+1))=11+11±+1=1
  k=1n(exp(2iπkn+1+1))=1

だいぶ脱線しましたが、これでm が奇数、n は偶数のときの計算が完成です。

 det(Am,n)=(j=1m+12k=1n2  (4cos2πjm+1+4cos2πkn+1))2

m が偶数、n は奇数のとき

(m:even,n:odd)

!FORMULA[214][-1341020279][0] の固有値 A4,3 の固有値

場合分けの最後、m が偶数、n が奇数のときも同じように計算を進めましょう。

 det(Am,n)=j=1mk=1n  (2cosπjm+1+i2cosπkn+1)=j=1mk=1n12  (4cos2πjm+1+4cos2πkn+1)  ×j=1mk=n+12n+12  (2cosπjm+1+i2cosπkn+1)=(j=1m2k=1n12  (4cos2πjm+1+4cos2πkn+1))2  ×j=1mk=n+12n+12  (2cosπjm+1+i2cosπkn+1)=(1)m2=(1)m2(j=1m2k=1n+12  (4cos2πjm+1+4cos2πkn+1))2

 3 行目から 4 行目の変形に注目してください。わざわざ 積が 1 になる項を乗じています。なぜこんなことをしているかというと、あとで場合分けのない 1 つの式に統合するときに都合がいいからです。

 また、3 行目で =(1)m2 すなわち ±1 となっている部分。本当に ±1 になるのかあやしいと思いませんか?念の為確認しておきましょう。

m が偶数であることに注意しながら計算を進めます。

 j=1mk=n+12n+12  (2cosπjm+1+i2cosπkn+1=0)=j=1m  2cosπjm+1=j=1m(exp(iπjm+1)+exp(iπjm+1))=j=1mexp(iπjm+1)(exp(2iπjm+1)+1)=exp(iπm(m+1)2m+1)j=1m(exp(2iπjm+1)+1)=(1)m2j=1m(exp(2iπjm+1)+1)=1=(1)m2

手順 5 公式の完成

 場合分けして計算した結果をまとめるとこうなります。

 
 det(Am,n)={(j=1m2k=1n2  (4cos2πjm+1+4cos2πkn+1))2(m:even,n:even)0(m:odd,n:odd)(j=1m+12k=1n2  (4cos2πjm+1+4cos2πkn+1))2(m:odd,n:even)(1)m2(j=1m2k=1n+12  (4cos2πjm+1+4cos2πkn+1))2(m:even,n:odd)

 これらの式は、次のように 1 本の式にまとめることができます。

 det(Am,n)=(1)nm2(j=1m2k=1n2  (4cos2πjm+1+4cos2πkn+1))2

 m×n のドミノタイリングの総数を Zm,n とすると、

 Zm,n=|det(Am,n)|

 でした。代入すると

 Zm,n=(j=1m2k=1n2  (4cos2πjm+1+4cos2πkn+1))2

 平方根を外せば公式の完成です!!

m×n のドミノタイリングの総数

 Zm,n=j=1m2k=1n2  (4cos2πjm+1+4cos2πkn+1)

おわりに

 というわけで、細部は省略しましたが、とにかくも公式が導出できました!
 なお、導出に使った隣接行列の配置は、参考文献をもとに私が考案した配置です。

私の考案した隣接行列の配置。i,1,1,i が直線状にならんでいて固有値・固有ベクトルの検算が容易。

A2,3=(010i001010i001000ii000100i010100i010)

 ・・・とはいえ、本質的には参考文献で使われていた、二部グラフから作られたカステレイン行列と同じものですし、このようなシンプルな配置に誰も気が付かなかったとは考えにくいので、おそらくどこかで既出なのだろうと思います。

 また、導出の途中で証明した

  k=1n(4cos2πk2n+1)=1

の部分については、X(旧Twitter)にて立見鶏 (@StandeeCock)さんに幾何的な別解を教えていただきました。

 幾何的に証明できるとは驚きですね。

(2023.11.4 追記)
 k=1n4cos2(πk2n+1)=1 を証明する超シンプルな方法が発見されましたので、ここに追記しておきます。

  K=k=1n4cos2(πk2n+1)
  L=k=1n4sin2(πk2n+1)

  KL=k=1n4sin2(2πk2n+1)=k=1n4sin2(πk2n+1)=L

  K=1

 それでは、【前編~導出~】の記事はここで終了となります。【後編~証明~】では、ドミノタイリングの総数と行列式の関係がなぜ成り立つのかについて掘り下げたいと思います。
 是非、【後編】の記事もご覧ください!

リンク: Mathlog|ドミノタイリングの数え上げ公式の導出方法【後編~証明~】

 (2023.11.4 追記)
 また、この方法を一般化し、任意のポリオミノをドミノで埋め尽くす方法の総数を求められる行列の構成方法を考案しましたので、こちらの記事もご覧ください!

リンク: Mathlog|任意のポリオミノをドミノで埋め尽くす方法の総数を行列式を使って求める方法(日曜数学会)

参考文献

[1]
髙﨑 金久, 線形代数と数え上げ[増補版], 日本評論社, 2021, 102-139
投稿日:2023101
更新日:2023114
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。
バッチを贈って投稿者を応援しよう

バッチを贈ると投稿者に現金やAmazonのギフトカードが還元されます。

投稿者

apu_yokai
apu_yokai
484
65446

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中
  1. はじめに
  2. 観察
  3. 公式の導出
  4. 手順 $1$ 複素数平面上に長方形を配置する
  5. 手順 $2$ 行列を作り、行列式を計算する
  6. 手順 $3$ 行列の固有値と固有ベクトル
  7. 手順 $4$ 固有値の積で行列式を計算する
  8. $m$ が偶数、$n$ も偶数のとき
  9. $m$ が奇数、$n$ も奇数のとき
  10. $m$ が奇数、$n$ は偶数のとき
  11. $m$ が偶数、$n$ は奇数のとき
  12. 手順 $5$ 公式の完成
  13. おわりに
  14. 参考文献