この記事では、
まず、「ドミノタイリング」について説明します。
ドミノタイリングというのは、図
ドミノタイリングの例
この、ドミノタイリングの方法が何通りあるかを考えるわけです。なお、回転したり裏返したりして重なるものについても異なるものとして数えます。
記事を【前編~導出~】と【後編~証明~】にわけています。
前編では、公式の導出までを一気に解説します。ただし、一部の説明は省略しています。
後編では、省略した部分を補足して、なぜこの公式がドミノタイリングの総数となるのかについて掘り下げたいと思います。
なお、導出方法は参考文献の「線形代数と数え上げ[増補版]」を大いに参考にしていますが、一部に私の独自の改変が加えてあります。致命的なミスはないと信じていますが、問題があれば優しく教えていただければ幸いです。
(R5.10.21 後編を公開しました!)
リンク:
Mathlog|ドミノタイリングの数え上げ公式の導出方法【後編~証明~】
(R5.11.4 応用編となる記事を公開しました!)
リンク:
Mathlog|任意のポリオミノをドミノで埋め尽くす方法の総数を行列式を使って求める方法(日曜数学会)
手始めに、小さいときから考えてみましょう。
総当たりで調べると
この表を見ているだけでもわかることがいくつかありますので、本題に入る前に、この表を観察してみましょう。
まず、
それから、
そう、フィボナッチ数列です!
この記事ではこれ以上説明しませんが、本当にフィボナッチ数列であることを証明することができます。
それから、全体の傾向として、(両方が奇数の場合を除いて、)
ちなみに、
という数になります!
読み方は「1 極 2699 載 8401 正 1256 澗 2358 溝 3424 穣 2602 秭 7531 垓 229 京 3934 兆 2985 億 7624 万 9856」です。
仮に総当たりでこれを数え上げようとするならば、
【参考】組み合わせ爆発を説明している動画: 『フカシギの数え方』 おねえさんといっしょ! みんなで数えてみよう!
これほどの数になると、たとえスーパーコンピュータを使ったとしても、まともに数え上げることはできそうもありません。・・・が、実は一つ一つ調べることなくその総数を計算できる公式があるのです。(だから上記の数がわかるわけですが)
それでは、その公式をご紹介しましょう。こんな公式です。
「公式に出てくる記号の意味がわからない!」という方はこちらをご覧ください。
記号の意味を説明したところで、もう一度公式を見てみましょう。
計算の仕方はわかりますが、それにしても、式の中に
試しに
計算途中には無理数も出てきますが、最終的な計算結果は整数になりました。さきほどの表の値と同じ
また、
いやあ、それにしても凄い式です。組み合わせ爆発でとんでもないことになる場合の数を一瞬で計算できてしまうのですから。
そんなわけで、まずはこの公式を導出しましょう。途中で気になるところがいろいろ出てくるとは思いますが、まずはスピード重視で計算を進めます。
そして、そのグラフを、複素数平面の格子点に頂点が重なるように配置します。
単位正方形の中心を複素数平面の格子点と重なるように配置
頂点には図のように番号をふります。
すなわち、左下を
下から
これらの頂点の隣接関係を表にします。
頂点が隣接していない場合は
隣の頂点との差分
「表の
なお、具体的な数字を入れた方が分かりやすいと思いますので、ここからは
これを
(余談ですが、このような行列を「隣接行列」と呼んだりします。グラフ理論とも関係がありますが、ここでは深入りしません。)
手作業では大変なので、計算サイトなどを利用して行列式を計算すると、
利用したサイト: Matrix calculator 行列式計算機
行列式の平方根、すなわち
これが偶然ではないことを確かめるために、
この表と、冒頭の
ドミノタイリングの総数を
ドミノタイリングの総数が、行列式の絶対値の平方根と一致しています。
このことを利用して、公式を導出することができます。
ところで、サイズの大きな行列式の計算を定義通りに計算すると、組み合わせ爆発になってしまい大変です。そこで、簡単に計算できる方法がいろいろ研究されています。今回は、行列の固有値を使って簡単に行列式を計算していきます。
固有値と固有ベクトルの組は
イメージとしては、グラフの頂点
固有ベクトルにはそれぞれ
さて、じつに天下り的ですが、今考えている行列の固有値と固有ベクトルの成分はこんなふうに書くことができます。
固有値
固有ベクトルの成分
これらの固有値・固有ベクトルは、
利用したサイト: Matrix calculator 固有値計算機
「推測した固有値なんて怪しい」ですって?
ごもっともです。本当に固有値・固有ベクトルなのか、定義にしたがって検算して確認しておきましょう。
本当は微分方程式の類似として差分方程式を変数分離法で解くことでも求められるらしいけど私にはわかりませんでした。
正方行列
を満たす零ベクトルでないベクトル
ではさきほど「固有値」「固有ベクトル」としてあげた式たちが本当に定義を満たしているのか検算して確認してみましょう。
このとき、
ただし、
…さらっと書きましたが、ここは結構な驚きポイントだと思いますので、本当にこの関係が成り立つのか、ちょっと確かめてみましょう。
行列の成分をみると、
そのことを利用して、先ほどの式(☆)ができていたわけです。
・・・が、よくみると、
そのときでも、先ほどの式(☆)は成立します。
なぜなら、
がゼロになり、
がゼロになり、うまいことつじつまが合うのです!
それでは、
を先ほどの式(☆)に代入して計算を進めてみましょう。
というわけで、
行列式の値は全ての固有値の積と一致します。
(
この性質を使って行列式を求めましょう。
先に書いた通り、行列
です。
求める行列式を
ということになります。
この式に
を代入することで次の式が得られます。
特に、共役複素数の積が実数になることを利用することで実数のみの式にすることができます。
共役複素数の積は実数になる
あまり場合分けはしたくないのですが、ここではやむを得ず場合分けをしましょう。
また、
この最後の式が
と
を比較して
だいぶ脱線しましたが、これで
場合分けの最後、
また、
場合分けして計算した結果をまとめるとこうなります。
これらの式は、次のように
でした。代入すると
平方根を外せば公式の完成です!!
というわけで、細部は省略しましたが、とにかくも公式が導出できました!
なお、導出に使った隣接行列の配置は、参考文献をもとに私が考案した配置です。
私の考案した隣接行列の配置。
・・・とはいえ、本質的には参考文献で使われていた、二部グラフから作られたカステレイン行列と同じものですし、このようなシンプルな配置に誰も気が付かなかったとは考えにくいので、おそらくどこかで既出なのだろうと思います。
また、導出の途中で証明した
の部分については、X(旧Twitter)にて立見鶏 (@StandeeCock)さんに幾何的な別解を教えていただきました。
1≦a[i]≦nで
— 立見鶏 (@StandeeCock) September 11, 2023
a[i]が偶数ならa[i+1]=a[i]/2
a[i]が奇数ならa[i+1]={2n+1-a[i]}/2
とするようにして幾つかの輪っかを作る。
n=5なら1-5-3-4-2-1
n=7なら1-7-4-2-1と3-6-3と5
輪っかの逆順で正2n+1角形内の二等辺三角形を順に作り、底辺部分をcosで表し続けていくと循環するはず。
添付図はn=5の場合。
添付図
pic.twitter.com/gypcNwhAE3
幾何的に証明できるとは驚きですね。
(2023.11.4 追記)
それでは、【前編~導出~】の記事はここで終了となります。【後編~証明~】では、ドミノタイリングの総数と行列式の関係がなぜ成り立つのかについて掘り下げたいと思います。
是非、【後編】の記事もご覧ください!
リンク: Mathlog|ドミノタイリングの数え上げ公式の導出方法【後編~証明~】
(2023.11.4 追記)
また、この方法を一般化し、任意のポリオミノをドミノで埋め尽くす方法の総数を求められる行列の構成方法を考案しましたので、こちらの記事もご覧ください!