立体魔方陣





まず、初めに断っておかないといけないのは、 私は魔方陣に関しては全くの素人だということです。
当然、ここに書くようなことも古くから知られている事柄のはずですが、
文献にあたっていないので 手頃な文献を知りません。

事の起こりは 今年の春に卒業するO君の卒業発表でした。
O君は 私のゼミの学生ではないのですが、彼の発表が魔方陣に関するもので、
彼が勉強した一様ステップ法という魔方陣の構成方法を紹介する内容でした。

魔方陣とは多くの方がご存じと思いますが、通常 1からn2までの数を
n×nの格子状に並べて、n個の列 及び n個の行の和が等しくなるようにしたものです。
定義によっては 「対角線の和も等しくなるように」とする場合もあるようですが、
ここでは対角線は考えないことにします。

次は 一様ステップ法で構成した魔方陣(n=3)の例です。
ただし、ここでは 1からn2の数ではなくて、 0からn2ー1の数を使っています。
(ちなみに、一様ステップ法では うまくやれば、対角線の和も考慮することも可能です)

図1:一様ステップ法による魔方陣


各行、各列の和が12になっているのが 見て取れるでしょうか。

さて、これはどのようにして作られたのかを説明していきましょう。
まず、次のように 0から8の数字が順に並んでいるところを考えます。


図2:初期配置

左から右へ、下から上へときれいに並んでいます。
もちろん、この状態では魔方陣になっていません。

次に 上の状態から数の並びを「一次変換」するのです。
一次変換が何か、、、を言葉で説明するより見てもらった方が話が早いでしょう。


図3:一次変換

上の画像をみれば 大体理屈は分かってもらえると思うのですが、
図2の初期配置では、00から 01へ移るときは 右に一つずれていました。
図3では 右に1つ移動する変わりに オレンジの矢印で示したベクトルだけ移動しています。
また、図2の初期配置では 上に1つ移動する部分が、
図3では緑色のベクトルだけ移動しています。
右方向をx方向、上方向をy方向として座標を考えれば、

オレンジのベクトル=(2、1)、 緑色のベクトル=(ー2、1)

となります。この2つのベクトルの選び方が重要なのですが、それは後述。

さて、図3では 数字があちこちに散ってしまっていますから
もとの正方形のなかに収まるように戻します。そのとき、白い正方形のなかでの位置を変えずに
戻します。つまり 図でいうと縦の赤いライン上にある数は、戻した先でも 縦の赤いライン上に、
という風に戻します。


すると、図1の魔方陣が得られるのです。


さて、上でベクトルの選び方が大事だと言いましたが、 正確には オレンジのベクトル=(a、b)、 緑色のベクトル=(c、d)としたときに、
ad−bc,a,b,c,dの5つの数字がすべて、nと互いに素(今の場合n=3)
でないとダメです。



なぜ、この方法で 魔方陣が得られるのでしょうか?
それを見るためには 数をすべてn進数(今の場合は3進数)で書くと分かりやすくなります。


図4:初期配置(3進数)

上は初期配置の状態を 3進数で表したものです。
これを下のように 1次変換して、、、


図5:

さらに、元の正方形のなかに収まるように戻すのでしたね。
この戻す作業をするときに、2つ以上の数が同じ位置に来ないようにするためには、
ad−bcがnと互いに素であることが必要なのです。


図6:一様ステップ法による魔方陣(3進数)

さて、列や行に並ぶ数をみてください。
どの列や行を見ても、 10の位、1の位に 0、1、2が1つずつ現れています。
とすれば、列や行の和が等しくなるのもうなずけます。
このように、n進数で表した際、
各行、各列の数の「10の位」、「1の位に」、 0からn−1が1つずつ現れる
ようにするために、a,b,c,dがnと互いに素であることが必要なのです。





ここまでが、O君の発表内容でした。(ただし、説明方法は大幅に変えています。) なかなか面白い内容でした。
そして、発表を聞いてる最中から、これはこのまま3次元に拡張できそうだぞ、
という考えが湧いてきて、ムズムズしていました。理論的な検証への欲求よりも、
うまくいきそうだという直感と それを形にしてみたいという欲求につき動かされて
その夜 povrayで画像を作れるように povファイルを書きました。



基本的にはやっていることは 2次元のときと 何も変わりません。
0からn2ー1までの数字をきれいに並べて、適当な1次変換をしてから、
もとの立方体へ戻すだけです。
ただ、1次変換の選び方が難しい。はじめは よく分かっていなくて、
各面、、というか、正方形状の断面の部分の和が等しいというものになってしまいました。

下の図7では、

一番上の段の和:10+07+22+15+03+18+14+02+26
真ん中の段の和:20+17+05+25+13+01+21+09+06
一番下の段の和:00+24+12+08+23+11+04+19+16

が等しくなっています。同様に手前の面や右の面も同じ和です。
でも、列の和は等しくなっていません。



図7:立体魔方陣?

図7では 1次変換を示すベクトル(x,y,z座標にそった基本ベクトルの移る先)として、

(2、1、1)、(1、1、2)、(1、2、1)

を使っています。
(図で00から24へ進む方向、08へ進む方向、20へ進む方向を それぞれ x軸、y軸、z軸の方向として説明しています)

これだと、たとえば 手前の一番下の部分に00、12、24が並んでいますが、
この3つの数はすべて3で割りきれる(3進数で表すと1の位が全部0)ことになってしまいますので、
すべての列の和が等しくはなりません。
(ややこしくなるので詳しくは述べませんが、これは 上記の3つのベクトルのうちの、
2番目と3番目のベクトルを足すと(2、3、3)となり 3を法とする合同式で考えると(2、0、0)、
つまり、座標軸に沿ったベクトルになってしまったことに起因します)




それに気付いて、改良したものが次の立体魔方陣です。


図8:立体魔方陣(サイズ3)

図8では 1次変換を示すベクトルとして、

(1、0、2)、(0、2、1)、(1、1、0)

を使っています。


原理に気付けば、一般化することは 簡単でした。
次の画像は サイズn=5の立体魔方陣です。


図9:立体魔方陣(サイズ5)



もどる。