Magic Hexagonとは何か
いや、これがですね。
Magic Hexagonって、知ってます?
正六角形をハニカム状に並べて、どの列の合計も同じ値になる配置のことなんすよ。
Magic Squareの六角形版、と言えば伝わるかもしれない。
ただし正方形より制約がきつい。
1から19までの整数を使うオーダー3のMagic Hexagonは、解がたった1つしか存在しないことが証明されてるんすよ。
各列の和は38。
これ、回転や鏡像を除くと本当に1通りしかない。
1957年にClifford W. Adamsが発見して、その後Charles Trivialdiが独立に再発見した。
陸がこの話を最初に知ったのは、たぶん20代の頃に読んだ整数論の余談コラムだったと思う。
なぜ「オーダー3だけ」なのか
ここが面白いところで。
オーダー2(7個のセル)では解が存在しない。
オーダー4以上でも存在しないことが証明されてる。
理由は各列の和が整数にならないから。
オーダーnのMagic Hexagonで使う数は1から3n^2-3n+1まで。
全体の和をSとすると、各方向の列数は2n-1本。
Sを2n-1で割った値が各列の和になるわけじゃないですか?
n=3のとき、S=190、列数=5。190/5=38。整数になる。
n=2だと、S=28、列数=3。28/3は割り切れない。
n=4だと、S=703、列数=7。703/7は割り切れない。
あー、なるほど、そういうことか。
条件を満たすのはn=1(自明)とn=3だけなんすよ。
この「構造的に1つしか許されない」という事実が、陸にはたまらなく美しく感じる。
Pythonで全探索してみた
で、証明を読むだけじゃ気が済まないのが陸の悪い癖で。
実際にコードを書いて検証した。
六角形の19セルに1-19を配置して、15本の列すべてが38になるか判定する。
素朴な全探索だと19!(約1.2×10^17)通りで現実的じゃない。
だから枝刈りが命になる。
`python
列ごとに部分和を計算し、38を超えた時点で打ち切る
外周から埋めて、内側を最後に確定させる
`
実装のポイントは3つ。
- セルの配置順を「制約が早く効く順」に並べる
- 1列が確定するたびに和=38をチェック
- 残りの数の最小合計・最大合計で枝を刈る
陸の環境(Ryzen 5、Python 3.12)で約12秒で解が出た。
C言語に書き直したら0.3秒未満。
そして出てくる解は、やっぱり1つだけ。
これがマジですごくて。
19個の数字の並べ方が天文学的にあるのに、条件を満たすのが1通りだけという事実を、自分のコードで確認できた瞬間の感覚は格別なんすよ。
検証で見えた構造の面白さ
探索の過程で気づいたことがある。
解の中心セルは5。
これ、1-19の中央値10じゃないんすよ。
中心を通る3本の列はそれぞれ3セル。
38から5を引いた33を、残り2セルで作る組み合わせが3通り必要。
この制約がかなり強くて、中心に入れる数は限られる。
実際に中心=10で固定して探索すると、解が0になる。
中心=5のときだけ解が存在する。
こういう「なぜこの数なのか」が、回してみて初めて身体感覚として入ってくることの大切さ。
もう1つ。外周の12セルの和は114。
内周の6セルの和は71。
114+71+5=190で全体の和と一致する。
データとして眺めると、環ごとの和にも秩序がある。
手を動かすことでしか得られない確信
数学の定理は証明を読めば「正しい」とわかる。
でも「本当にそうなのか」を自分の手で確かめたとき、理解の質が変わるんすよ。
陸は40年以上コードを書いてきたけど、この感覚の校正は今でも続けてる。
Magic Hexagonは題材として小さいけど、構造の美しさは本物。
19個の数字と38という定数だけで、解の一意性が決まる。
いや、これがですね。
60歳になっても、こういう検証をやってると時間を忘れる。
「わからないこと」に出会う楽しさは歳をとっても色あせない。
むしろ経験があるぶん、枝刈りの勘所がわかって、検証の精度が上がってる気がする。
興味がある人は、まず紙に19マスの六角形を描いて、手で数字を入れてみてほしい。
38の壁の厚さを体感してから、コードを書くと面白さが倍になるんすよ。
→ プロフィール / 他チャネルを見る

コメント