アフィン平面で完全魔方陣を作ろう
このページはマス旅の一部です。
これまで、変換をアフィンに広げるため、射影幾何の道具である同次座標をつかってきた。
射影幾何そのものは、それはそれで面白い世界だけれど、
その手前のアフィン幾何も面白い。
今回はアフィン平面で魔の方陣(magic square)、「魔方陣」作成をやってみよう。
試行錯誤でやると恐ろしく大変で、魔物と戦うような世界だけれど、
規則性や構造を見つければ、スマートに解決できるはずだね。
1.ウォーミングアップ
必要な材料の確認をしよう。
<有限体Fp>
整数を素数3で割った余りで分類するとZ3=Z/3Z、3で割った余りによる剰余類ができた。
これは、加法で結合法則が成り立ち、単位元が0で、逆元が1+2≡0(mod3)から、1つに決まる可換加群だった。
そして、乗法も結合法則が成り立ち、乗法についても単位元が1で、逆元が2×2≡1(mod3),1×1≡1(mod3)から1つに決まり、分配法則が成り立つので、{0,1,2}の3要素は体をなす。
これがF3だったね。
pを素数とすると、pが以外でもFpは体になる。Fpは小さいけれど、有能なおもちゃだ。
<アフィン平面>
Fが体ならA=F×Fを体F上のアフィン平面という。Aの要素(x,y)を点とする。
Aの部分で、係数a,b,cが体Fの要素で、ax+by+c=0となる点集合を直線とする。
体F2={0,1}の直積集合Aはアフィン平面で、点は(0,0),(0,1),(1,0),(1,1)の4点だけ。
直線の傾き(a,b)ペアは01,10,11の3種類あり、定数cはそのつど0,1の2通りずつある。
だから、直線は全部で3×2=6本だけ。
体F3={0,1,2}の直積集合Bはアフィン平面になる。点は3^2=9点だけ。
直線の傾き(a,b)ペアは01,10,11,21の4種類あり、定数cはそのつど0,1,2の3通りずつある。直線は全部で4×3=12本だけ。
一般化しよう。体Fpの直積集合Fp^2はアフィン平面になり、点はp^2個あり、
直線はp(p+1)本ある。原点(0,0)を通る直線はp+1本あり、それぞれに平行な直線はp本引けるから。
<qが素数のべき体Fq>
pが素数のとき、q=p^nは素数でないが、体Fqが作れる。
多項式環Fを作る。x^q-xを素因数分解して、既約多項式fxを見つける。
そして、多項式の集合を多項式fxで割った剰余で分類すると、それが剰余類になる。
これで体F/fFができる。
たとえば、q=4ならば、fx=x^2+x+1だから、
剰余類は{[0],[1],[x],[x+1]}の4元になる。
また、q=8ならば、fx=x^3+x+1として、
剰余類は{[0],[1],[x],[x+1],[x^2],[x^2+1],[x^2+x],[x^2+x+1]}
剰余類がきまれば、その加算表、乗算表を作ることで、アフィン平面のデータとして
使うことができる。pが3でも同様にできる。
q=9ならば、fx=x^2+1として、
{[0], [1], [2], [x], [x + 1], [x + 2], [2x], [2x + 1], [2x + 2]}
<ラテン方陣からオイラー方陣へ>
n次の正方形でn個の整数がたてに見ても、よこに見ても1回ずつ重複なく現れる配列をラテン方陣という。同じ次数のラテン方陣AとBを組にしてn次の正方形に並べるとき、
どの組も異なるときに、AとBは直交するとき、できた正方形をオイラー方陣という。
また、n次の正方形に異なる整数を入れて、たてに見ても、よこに見ても和が一定となるものを魔方陣という。
通常は、さらに2つの対角線の和もたてよこの和と同じという条件をつける。
さらに、1枚コピーして並べてできる、すべての対角線の和についても同じになるという条件をつけた特別魔方陣もある。
2.ラテン方陣から攻略する
<作れることを理解する>
3次のラテン方陣はアフィン平面F3^2の3×3=9個の点3点を通る3×4=12本の直線の分類だけで、
自動的に作れます。
どういうことでしょうか。
原点を通る線は4本で、ax+by+c=0の直線でc=0として、
傾き(a,b)=(0,1),(1,0),(1,1),(2,1)の4タイプある。2≡-1(mod3)に注意して、
0x+1y=y=0の3点(0,0),(1,0),(2,0)を通る直線l_1(x軸)
1x+0y=x=0の3点(0,0),(0,1),(0,2)を通る直線l_2(y軸)
x+y=0の3点(0,0),(1,2),(2.1)を通る直線l_3
-x+y=0の3点(0,0),(1,1),(2,2)を通る直線l_4
たとえば、l_3に平行な直線はc=0,1,2として、
{(0,0),(1,2),(2,1)},{(0,1),(1,0),(2,2)},{(0,2),(1,1),(2,0)}
これらはx軸にもy軸にも平行ではないから、x座標が変わればy座標も変わる。
しかも、傾きが同じで切片だけ異なるので、3点はすべて重複しない。
ということは、たとえばx行目のy列目として、cの値を正方形に入れると、
ラテン方陣Aができあがることがわかるね。
同様にして、
l_4についてもc=0,1,2として平行移動すると、
{(0,0),(1,1),(2,2)},{(0,1),(1,2),(2,0)},{(0,2),(1,0),(2,1)}の(x,y)をx行y列としてcの値を入れると
ラテン方陣Bができあがる。
「表を作る手間」はかかるけれども、
F3から3次のラテン方陣が3+1-2=2つできる。
F4から4次のラテン方陣が4+1-2=3つできる。
F5から5次のラテン方陣が5+1-2=4つできるでしょう。
<効率的な作り方>
さっきは先に直線群の点リストを作ることがラテン方陣作りにつながることがわかったね。
次数が素数の場合は剰余類だから、剰余計算が使える。
これに着目して、初めからカンタンにラテン方陣を作ることを考えてみよう。
さっきは、(a,b)のペアで傾きを考えました。
y軸以外の傾きは、2次では(0,1),(1,1)の2種、
y軸以外の傾きは、3次では(0,1),(1,1),(2,1)の3種、
b=1でaが0,1,..と変わるだけだね。
そうです。
b=1に固定すれば、ax+by+c=0の代わりに、
a=-m, cの符号を逆にして、
y=mx+cと書くことにしよう。
q次の体Fqの直積からできるアフィン平面の
直線の傾きはm=0,1,...q-1のq通りということです。
c=0のときは、方陣の(x,y)にはy-mx=0(mod q)の解が入るから、点(x,y)に0とかく。
c=1のときは、方陣の(x,y)にはy-mx=1(mod q)の解が入るから、点(x,y)に1とかく。
…。
言い換えると、y-mx(mod q)の値を求めてそれをcとすればよいわけです。
傾きmの直線の(x,y)の値をc_m(x,y)とかけば、
cm(x,y)=y-mx(mod q)の値(0,1,...,q-1)
を流し込めばよいのですね。
簡単だ。
傾きm1で作った方陣Aと傾きm2で作った方陣Bの同じ座標(x,y)での値cm1(x,y)とcm2(x,y)は、
異なる傾きの2直線の交点だから、Fqで唯一に決まるね。
別の組み合わせで同じ交点に来ることはないので、方陣AとBは直交するね。
ということで、点(x,y)における
傾きm1の方陣Aの値cm1=y-m1 x(mod q)の値と
傾きm2の方陣Bの値cm2=y-m2 x(mod q)の値を
ならべて入れると、
点(x,y)におけるオイラー方陣のタプルができあがるとういことだね。
すばらしい。
アフィン平面の威力だね。
でも、ちょっと注意しておきたいことが1つある。
平面は原点を基準にx座標は左から右に増え、y座標は下から上に増える。
ところが、行列はi行j列を数えるとき、行番号は上から下に増え、列番号は左から右に増える。
だから、最終的は行列イメージのために、x,yをi,jに置き換えておく。
c_m(i,j)=j-m i(mod q)
がi行j列の要素になる。
たとえば、F5から直交するラテン方陣は5+1-2=4つできるけれど、
適当な2つを選んで組にしてならべるだけで、オイラー方陣が機械的に製造できるはずだね。
<確認しよう>
課題:geogebraのMod関数を利用して、3次のラテン方陣を2つ作ってみよう。
geogebraではMod関数は数値か多項式の剰余としてしか使えない。
だから、Mod(y-mx,3)などを先に作るとエラーが起きます。
関数を先に作って、それに値を入れるのではなく、値を先に作りましょう。
タイトルは「3次のラテン方陣をアフィン平面で作る」
F={0,1,2}
#m=1
#3行3列で3で割る前の行列を作る。
A0=zip(zip(j-i,i,F),j,F)
#行列の要素A0(p,q)は数値だから、3で割った剰余が出せます。
それをシーケンスにして行列に戻しましょう。
A=Sequence(Sequence(Mod(A0(p,q),3),p,1,3),q,1,3)
#A0(p,q)はElement(A0,p,q)とかくとエラーが起きにくくなるそうです。
#m=2
B0=zip(zip(j-2 i,i,F),j,F)
B=Sequence(Sequence(Mod(B0(p,q),3),p,1,3),q,1,3)
l1=Element(A,1)
l2=Element(A,2)
l3=Element(A,3)
l4=Element(B,1)
l5=Element(B,2)
l6=Element(B,3)
text1="c(i,j)=mod(j-i,3)のラテン方陣"
TableText(l1,l2,l3,"c|_")
text2="c(i,j)=mod(j-2i,3)のラテン方陣"
TableText(l4,l5,l6,"c|_")
3次のラテン方陣をアフィン平面で作る
3.ふつうの魔方陣を作ろう。
<3次の魔方陣を作る>
0+1+2=3なので、3次のラテン方陣のたて、よこの和は3です。
さっき作った2つのラテン方陣は対角線に0が並んだり2が並んでいました。
c(i,j)=mod(j-i,3)の方陣Aは対角線が0,0,0になっていて和が0になります。
対角線の和を3に、つまり、1,1,1にしたい。
そのために、すべての要素に1をたし、c_A(i,j)=mod(j-i+1,3)に直します。
そうすると、0→1, 1→2、2→0となりますが、ラテン方陣のままです。
これで、たて、よこ、ななめどれでも和が3になりました。これを方陣AAとします。
c(i,j)=mod(j-2i,3)の方陣Bは対角線が2,2,2になっていて和が6になります。
対角線の和を3に、つまり、1,1,1にしたい。
そのために、すべての要素から1をひき、c_B(i,j)=mod(j-2i-1,3)に直します。
そうすると、0→2,2→1,1→0となりますが、ラテン方陣のままです。
これで、たて、よこ、ななめどれでも和が3になりました。これを方陣BBとします。
最後にi行j列jをc_A(i,j)*3+c_B(i,j)にした行列を作ろう。
i行目を固定して、j列を0,1,2と動かすと、(0+1+2)*3+(0+1+2)=3*3+3=12になる。
j行目を固定して、i 列を0,1,2と動かすと、(0+1+2)*3+(0+1+2)=3*3+3=12になる。
斜めの3セルは片方は1で固定で、他方は0,1,2と動くので、3*(1+1+1)+(0+1+2)=12か
3*(0+1+2)+(1+1+1)=12となり、どちらにしても12になる。
このようにして、M(i,j)=c_A(i,j)*3+c_B(i,j)を成分にするとふつうの魔方陣ができることがわかるね。
そうはいっても、M(i,j)の最小は0*3+0=0、最大は2*3+2=8と0から8の数がマスに入ることになる。
本当に普通の魔方陣にするためには、どのセルも+1が必要だね。
最終形は
M(i,j)=c_A(i,j)*3+c_B(i,j)+1
と決定。これで1から3^2=9までの整数が入った完全魔方陣ができるでしょう。
<5次の魔方陣を作る>
では、規則性がわかったところで、5次の魔方陣と作ろう。
傾きmの値によってできる平行直線群(ラテン方陣)をLmとしよう。
5次のラテン方陣は5+1-2=4個ある。
セルの平均値は(0+1+2+3+4)/5=10/5=2
0+1+2+3+4=2*5=10(これでバラバラでも平均でも5つの合計を10にできる)
L1:c(i,j)=mod(j-i, 5) i=jの対角成分はすべて0だから、平均2に持ち上げたい。
LA: C_A(i,j)=mod(j-i+2,5)のラテン方陣Aを用意する。
L4:c(i,j)=mod(j-4 i, 5) = mod(j+i, 5) i+j=4の対角成分はすべて4だから、平均2に押し下げたい。
LB:C_B(i,j)=mod(j+i-2,5)のラテン方陣Bを用意する。
M(i,j)= C_A(i,j)*5+C_B(i,j)+1とすると、1から5^2=25までの整数が入った魔方陣ができるでしょう。
たて、よこ、ななめ、どの和も5*10+10+1*5=65になるね。
課題:geogebraで5次の魔方陣を数式で作ろう。
F={0,1,2,3,4}
A0=zip(zip(j-i+2,i,F),j,F)
A=Sequence(Sequence(Mod(A0(p,q),5),p,1,5),q,1,5)
B0=zip(zip(j+i-2,i,F),j,F)
B=Sequence(Sequence(Mod(B0(p,q),5),p,1,5),q,1,5)
M=Sequence(Sequence(5*A(p,q)+B(p,q), p,1,5),q,1,5)
l1=Element(M,1)
l2=Element(M,2)
l3=Element(M,3)
l4=Element(M,4)
l5=Element(M,5)
text1="5次の魔方陣"
TableText(l1,l2,l3,l4,l5,"c|_")
何の試行錯誤もなく5次の完全魔方陣が完全に作れるなんて、
アフィン平面は素晴らしすぎます。