多項式体で4次の魔方陣を作る

このページは[url=https://www.geogebra.org/m/ddm5798j]マス旅[/url]の一部です。[br][br]前回はアフィン平面で素数次の魔方陣を作りました。[br][br]今回は次数が素数でない魔方陣、4次の魔方陣を作ってみよう。
1.思い起こし
[b][size=150]<素数次の魔方陣の作り方のまとめ>[/size][/b][br][br]pが素数のときは、体Fpの直積を点にして直線群を作った。[br]そして、傾きmの直線群y-mx=cで1つのラテン方陣ができた。[br]i行j列を[b]c_m(i,j)=j-m i(mod p)[/b]がセルの数値になる。[br][br]直交して、しかも1対角線の和も0からp-1までの和になる2つのラテン方陣があると魔方陣が作れたね。[br]0からp-1までの和は(0+p-1)*p/2=[b]p(p-1)/2[/b][br]平均はp(p-1)/2/p=[b](p-1)/2[/b][br][br]ラテン方陣c_1(i,j)=j-i(mod p)はj=iのセル値が0になるからすべて(p-1)/2を加算して、[br][b]c_A(i,j)=j-i +(p-1)/2(mod p)[br][/b]とする。[br]ラテン方陣c_p-1(i,j)=j-(p-1)i(mod p)=j+i(mod p)はj+i=p-1のセル値がp-1になるからすべて(p-1)/2を減算して、[br][b]c_B(i,j)=j+i -(p-1)/2(mod p)[br][/b]とする。[br][br]この2つの方陣値からi行j列を[br][b]M(i,j)=p*c_A+c_B+1[br][/b]とすれば、完全魔方陣ができる。[br]最小値がp*0+0+1,最大値が[b]p*(p-1)+(p-1)+1=p^2[/b]。[br]たてよこ斜めの和が[br]p*p(p-1)/2+p(p-1)/2+1*p=(p+1)p(p-1)/2+p[br][b]=(p^3+p)/2[br][/b]で一定になる。[br][br][b][size=150]<素数次でない体の作り方の例>[br][/size][/b][br]前回は使わなかったが、[br]素数次でない有限体の作り方を簡単に振り返ろう。[br][br][b]pが素数のとき、q=p^nは素数でないが、体Fqが作れる。[br][/b][br]多項式環Fを作る。x^q-xを素因数分解して、既約多項式fxを見つける。[br]そして、多項式の集合を多項式fxで割った剰余で分類すると、それが剰余類になる。[br]これで[b]体Fp/fFp[/b]ができる。[br][br]たとえば、F4では、x^4-x=x(x^3-1)=x(x-1)(x^2+x+1)から、f=x^2+x+1が既約多項式。[br]2次の多項式環F2をfF2で分類した商体を作ればいいね。[br][b]F4=F2[x]/fF2[x]={[0],[1],[x],[x+1]}[br][/b]の4元になる。
2.4次の魔方陣を作る
[br]F4はF2[x]/fF2[x]={[0],[1],[x],[x+1]}で、F4の直積でアフィン空間を作ろう。[br]ただし、F4とはいっても、もとの多項式環はF2だった。[br]F2なので係数の剰余計算は、mod4 ではなくてmod2になることに注意しよう。[br]たとえば、[br][b]x+x=2x=0x=0[br]x*x=x^2≡x^2+x^2+x+1=x+1(mod x^2+x+1)[br][/b]のように、多項式としては、[b]x^2+x+1を法にして、[br][/b]係数はmod 2にして、演算結果が4元のどれかになることを確認しよう。[br][br]加法表と乗法表を作る。[br][br][b][color=#0000ff]+   0、  1、  x、x+1[br]0   0、  1、  x、x+1[br]1   1、  0、x+1、  x[br]x   x、x+1、  0、  1[br]x+1、x+1、x、  1、  0[br][br]×   0、  1、  x、x+1[br]0   0、  0、  0、  0[br]1   0、  1、  x、x+1[br]x   0、  x、x+1、  1[br]x+1 0、x+1、  1、  x[br][br][/color][/b]ここで、平面の軸としてのx、yとの混同をさけるために、[br]x=a,x+1=b[br]と置き換えましょう。[br]ここからは、[b]多項式の体という意味も捨てます[/b]。[br][br][b][color=#0000ff]F4={0,1,a,b}(mod2)の直積をアフィン平面の4×4=16点とする。[br][br]加法 0 1 a b[br] 0 0 1 a b[br] 1 1 0 b a[br] a a b 0 1[br] b b a 1 0[br][br]乗法 0 1 a b[br] 0 0 0 0 0[br] 1 0 1 a b[br] a 0 a b 1[br] b 0 b 1 a[br][br][/color]a=2,b=3[br][/b]と読み替えて、[br]原点を通るy軸以外の4直線[br][b]L0 0x+y=0 (0,0),(0,1),(0,2),(0,3)[br]L1 1x+y=0 (0,0),(1,1),(2,2),(3,3)[br]L2 2x+y=0 (0,0),(1,2),(2,3),(3,1)[br]L3 3x+y=0 (0,0),(1,3),(2,1),(3,2)[br][/b]これらの切片を0,1,2,3と平行移動した直線群はそれぞれラテン方陣になるはず。[br]L1群は[br][b]1x+y=0 (0,0),(1,1),(2,2),(3,3)[br]1x+y=1 (0,1),(1,0),(2,3),(3,2)[br]1x+y=2 (0,2),(1,3),(2,0),(3,1)[br]1x+y=3 (0,3),(1,2),(2,1),(3,0)[br][/b]L2群は [br][b]2x+y=0 (0,0),(1,2),(2,3),(3,1)[br]2x+y=1 (0,1),(1,3),(2,2),(3,0)[br]2x+y=2 (0,2),(1,0),(2,1),(3,3)[br]2x+y=3 (0,3),(1,1),(2,0),(3,2)[br][/b]L3群は[br][b]3x+y=0 (0,0),(1,3),(2,1),(3,2)[br]3x+y=1 (0,1),(1,2),(2,0),(3,3)[br]3x+y=2 (0,2),(1,1),(2,3),(3,0)[br]3x+y=3 (0,3),(1,0),(2,2),(3,1)[br][/b]各直線は4セルを通り、そのセルに切片値を入れると、[br]L1からのラテン方陣Aは[br][b]0 1 2 3[br]1 0 3 2[br]2 3 0 1[br]3 2 1 0[br][/b]L2からのラテン方陣Bは[br][b][color=#0000ff]0 1 2 3[br]2 3 0 1[br]3 2 1 0[br]1 0 3 2[br][/color][/b]L3からのラテン方陣Cは[br][b][color=#0000ff]0 1 2 3[br]3 2 1 0[br]1 0 3 2[br]2 3 0 1[br][br][/color][/b]方陣は0だけ対角線と3だけの対角線があるので使えないが、[br]方陣B、Cは対角線も他と同じく0,1,2,3がすべてそろう。[br]だから、たとえば、[br]4B+C+1を各成分で実行してみよう。[br][table] [tr][br] [td][b][color=#1e84cc] 1[/color][/b][/td][br] [td][b][color=#1e84cc] 6[/color][/b][/td][br] [td][b][color=#1e84cc]11[/color][/b][/td][br] [td][b][color=#1e84cc]16[/color][/b][/td][br][/tr][br] [tr][br] [td][b][color=#1e84cc]12[/color][/b][/td][br] [td][b][color=#1e84cc]15[/color][/b][/td][br] [td][b][color=#1e84cc] 2[/color][/b][/td][br] [td][b][color=#1e84cc] 5[/color][/b][/td][br][/tr][br] [tr][br] [td][b][color=#1e84cc]14[/color][/b][/td][br] [td][b][color=#1e84cc] 9[/color][/b][/td][br] [td][b][color=#1e84cc] 8[/color][/b][/td][br] [td][b][color=#1e84cc] 3[/color][/b][/td][br][/tr][br] [tr][br] [td][b][color=#1e84cc] 7[/color][/b][/td][br] [td][b][color=#1e84cc] 4[/color][/b][/td][br] [td][b][color=#1e84cc]13[/color][/b][/td][br] [td][b][color=#1e84cc]10[/color][/b][/td][br][/tr][br][/table]これで、[b][color=#0000ff](0+1+2+3)*(4+1)+1*4=34[/color][/b][br]の和一定の魔方陣ができたね。
ラテン方陣A,Bから魔方陣を求める
3.振り返り
[b]<振り返り>[br][/b][br]手作業で演算表を作り、それを目でみて直線群を作り、[br]その点位置を読み取って、切片を行列のセルに入れていくという、[br]なんとも手間のかかる作業でした。[br]試行錯誤はしてませんが、あまりスマートではないですね。[br]最後の4A+B+1にいたっては、暗算大会でした。[br][br]加法 0 1 a b[br]0 0 1 a b[br]1 1 0 b a[br]a a b 0 1[br]b b a 1 0[br]加法 0 1 2 3[br]0 0 1 2 3[br]1 1 0 3 2[br]2 2 3 0 1[br]3 3 3 1 0[br]この加法はXORで実現できます。2進数に直して、[br]ビットが片方だけ立っていると1になるのが排他的ORです。[br]これを⊕マークであらわそう。[br]乗法 0 1 a b[br]0 0 0 0 0[br]1 0 1 a b[br]a 0 a b 1[br]b 0 b 1 a[br]ここで、a=2,b=3におきかえましょう。[br]乗法 0 1 2 3[br]0 0 0 0 0[br]1 0 1 2 3[br]2 0 2 3 1[br]3 0 3 1 2[br]これはガロア体演算(GF4)a^2=b+1[br]この演算を⊗マークで表そう。[br]すると、[br][b]L2はc2(i,j)=(2⊗i)⊕jででき、[br]L3はc3(i,j)=(3⊗i)⊕jでできる。[br][/b]これから、対応する成分の和で4次の魔方陣が作れるはずだね。[br][br][color=#9900ff][b][u][size=150]課題:4次の魔方陣をgeogebraの機能で表示するにはどうしたらいいですか。[br][/size][/u][/b][/color][br]geogebraにはビット演算の⊕はなく、論理値だけしか対応してません。[br]また、ガロア体演算もありません。[br]あきらめて、ラテン方陣A、Bをべた打ちしてMを計算で出すこともできます。[br][br]タイトルは「ラテン方陣A,Bから魔方陣を求める」[br][br]A={{0, 1, 2, 3},{2, 3, 0, 1},{3, 2, 1, 0},{1, 0, 3, 2}}[br]B={{0, 1, 2, 3},{3, 2, 1, 0},{1, 0, 3, 2},{2, 3, 0, 1}}[br]M=Sequence(Sequence(4*A(p,q)+B(p,q)+1, p,1,4),q,1,4)[br]text1="ラテン方陣A"[br]TableText(A(1),A(2),A(3),A(4),"c|_")[br]text2="ラテン方陣B"[br]TableText(B(1),B(2),B(3),B(4),"c|_")[br]text3="4A+B+1=魔方陣M"[br]TableText(M(1),M(2),M(3),M(4),"c|_")[br][br]このまま数式ビューに貼り付けると、")が繰り返して、行列の最後に右かっこが自動でつくバグがありますので、貼り付けるときに、謎に追加される")を削ってから確定してください。[br][br]しかし、これでは、つまらないですね。[br]関数がなければ、演算表を行列で作ってそれを読み取ってみましょう。[br][br][color=#9900ff][u][b][size=150]課題:4次の魔方陣を演算表からgeogebraで実現するにはどうしたらいいですか。[br][/size][/b][/u][/color][br]#演算表を作って、行と列から行列値を読み取ることで実現できそうです。[br]#タイトルは「演算表から魔方陣まで一気に計算する」[br][br][b]ADD = {{0, 1, 2, 3}, {1, 0, 3, 2}, {2, 3, 0, 1}, {3, 2, 1, 0}}[br]MUL = {{0, 0, 0, 0}, {0, 1, 2, 3}, {0, 2, 3, 1}, {0, 3, 1, 2}}[br][/b][br]#しかし、Elementは数値として呼び出したときだけ作動するので[br][b]#Add(x,y)=Element(ADD,x,y)[/b]は作れません。[br][br]#そこで、Elementを使った関数を作るのではなく、Sequenceコマンドの中で使いましょう。[br]#geogebraのマニュアルでは、[b]Element( <行列>, <行>, <列> )[/b]形式で、[br]#行と列の位置を指定して要素を取り出せるとあります。[br][br]#また、[br][b]#Sequenceを入れ子にすると、for文の入れ子と同じ効果[/b]があります。[br]#すると、[br][b]#Sequence(Sequence(Element(ADD,p,q)+1, p, 1, 4), q, 1, 4)[br][/b]#で、[b]ADD+1[/b]の行列ができます。[br][br]#これを[br][b]For_pq[ Element(ADD,p,q)+1 ][br][/b]と略記します。[br][br]#もし、[b]2⊗i[/b]をしたかったら、2は3行目だから、[b]Element(MUL,3,p)[/b]で値を得ます。[br]#さらに、[b](2⊗i)⊕j[/b]をしたかったら、[b]Element(MUL,3,p)[/b]の値から行を読み、[br]#jの分を列にしてADD行列を見ます。[br][br]#ここで、[br][b]#For_pq[ Element(ADD, (Element(MUL, 3, p) ), q) ][br][/b]#にすると、?がでます。[br]#なぜでしょうか。[br][br]#Element(MUL,3,p)の[b]値は0~3ですが、これをADDの行位置に渡してしまうと0行を読もうとする[br][/b]#からです。[br][br]#そこで、[br][b]#For_pq[ Element(ADD, (Element(MUL, 3, p)+1 ), q) ][br][/b]#でAが作れることがわかりますね。[br]#具体的には[br][br][b][color=#0000ff]A = Sequence(Sequence(Element(ADD, (Element(MUL, 3, p) +1 ), q), p, 1, 4), q, 1, 4)[br]B = Sequence(Sequence(Element(ADD, (Element(MUL, 4, p) +1 ), q), p, 1, 4), q, 1, 4)[br]M=Sequence(Sequence(4*A(p,q)+B(p,q)+1, p,1,4),q,1,4)[br]text1="ラテン方陣A"[br]text2="ラテン方陣B"[br]text3="4A+B+1=魔方陣M"[br]TableText(A,"c|_")[br]TableText(B,"c|_")[br]TableText(M,"c|_")[br][br][/color][/b]さっきの比べるとあれっとなります。[br]ちがってみえます。[br]でもよくみると、行列が転置しているだけだと気づきますね。[br]まあ、全部転置すれば、何も問題はないです。[br][br]シーケンスループの外変数がqで内変数がpだから、q行p列という行列を読みかきするんですね。[br]だから、気にいらなければ、[b]#For_pq[ ]の中だけ、pとqを入れ替えればいいですね。[/b]
演算表から魔方陣まで一気に計算する

Informazioni: 多項式体で4次の魔方陣を作る