群論入門

〜ルービックキューブを Maple で〜

Maple の group パッケージは、有限群( finite group )を作成し、操作するパッケージです。ルービックキューブを覚えていますでしょうか?ルービックキューブは、1つの操作(回転)により、面が置換される、置換群です。今回は、1つの面に4つのキューブをもつルービックキューブを、group パッケージで定義し、操作してみたいと思います。

また、Maple の geom3d パッケージを使用することで、このようなルービックキューブも、簡単にワークシート上に描けるようになりました。グラフィクスを挿入することにより、理解しやすいワークシートを作成することができます。

>    restart:

>    with(geom3d):
with(plots):
with(group):

Warning, the assigned name polar now has a global binding

Warning, the name changecoords has been redefined

Warning, the name center has been rebound

ルービックキューブを定義

1つの面に4つのキューブをもつルービックキューブを、描きます。

>    cube(c1,point(o1,1/2,1/2,1/2),sqrt(3)/2):
cube(c2,point(o2,-1/2,1/2,1/2),sqrt(3)/2):
cube(c3,point(o3,1/2,-1/2,1/2),sqrt(3)/2):
cube(c4,point(o4,1/2,1/2,-1/2),sqrt(3)/2):
cube(c5,point(o5,1/2,-1/2,-1/2),sqrt(3)/2):
cube(c6,point(o6,-1/2,1/2,-1/2),sqrt(3)/2):
cube(c7,point(o7,-1/2,-1/2,1/2),sqrt(3)/2):
cube(c8,point(o8,-1/2,-1/2,-1/2),sqrt(3)/2):

>    rubik := draw([c1(color=pink),c2(color=yellow),c3(color=green),c4(color=cyan),c5(color=plum),c6(color=wheat),c7(color=white),c8(color=turquoise)]):
display(rubik,labels=[x,y,z],axes=box);

[Maple Plot]

ここで、x, y, z 軸に対する3つの回転を、それぞれ、xp, yp, zp とします。このルービックキューブが、x 軸を中心として回転するとき (xp) の、面の置換の様子を見てみます。

まず、回転 xp により、下の番号 1, 2, 3, 4 の面が置換されます。

>    num1:=textplot3d([[1/2,1.1,1/2,`1`],[1/2,-1/2,1.1,`3`],[1/2,-1.1,-1/2,`4`],[1/2,1/2,-1.1,`2`]],color=black):
display(rubik,num1);

[Maple Plot]

同様に、回転 xp により、下の面 10, 8, 6, 20 も置換されます。

>    num2:=textplot3d([[1/2,1.1,-1/2,`10`],[1/2,1/2,1.1,`20`],[1/2,-1.1,1/2,`6`],[1/2,-1/2,-1.1,`8`]],color=black):
display(rubik,num2);

[Maple Plot]

同様に、回転 xp により、下の面 9, 7, 5, 21 も置換されます。

>    num3:=textplot3d([[1.1,1/2,1/2,`5`],[1.1,1/2,-1/2,`21`],[1.1,-1/2,1/2,`7`],[1.1,-1/2,-1/2,`9`]],color=black):
display(rubik,num3);

[Maple Plot]

以上の3つの置換により、回転 xp の操作を次のように表すことができます。

>    xp := [[1,2,4,3],[10,8,6,20],[9,7,5,21]];

xp := [[1, 2, 4, 3], [10, 8, 6, 20], [9, 7, 5, 21]]

ルービックキューブの各面を以下のように番号付けし、y 軸 z 軸の回転を表します

>    num4:=textplot3d([[-1.1,-1/2,1/2,`12`],[-1/2,1.1,1/2,`11`],[-1/2,-1.1,1/2,`15`],[-1.1,1/2,1/2,`18`],[-1/2,-1/2,1.1,`13`],[-1/2,1/2,1.1,`16`],[-1/2,1/2,-1.1,`19`],[-1.1,1/2,-1/2,`14`],[-1/2,1.1,-1/2,`17`]],color=black):
display(rubik,num1,num2,num3,num4);

[Maple Plot]

>    yp := [[5,6,12,11],[1,7,15,18],[3,13,16,20]];
zp := [[18,19,21,20],[16,14,2,5],[17,10,1,11]];

yp := [[5, 6, 12, 11], [1, 7, 15, 18], [3, 13, 16, 20]]

zp := [[18, 19, 21, 20], [16, 14, 2, 5], [17, 10, 1, 11]]

permgroup コマンドは、Maple に置換群を定義します。3つの回転 xp, yp, zp を使い、ルービックキューブを表す置換群を定義します。

>    prc := permgroup(21, {x=xp, y=yp, z=zp});

prc := permgroup(21,{x = [[1, 2, 4, 3], [10, 8, 6, 20], [9, 7, 5, 21]], y = [[5, 6, 12, 11], [1, 7, 15, 18], [3, 13, 16, 20]], z = [[18, 19, 21, 20], [16, 14, 2, 5], [17, 10, 1, 11]]})
prc := permgroup(21,{x = [[1, 2, 4, 3], [10, 8, 6, 20], [9, 7, 5, 21]], y = [[5, 6, 12, 11], [1, 7, 15, 18], [3, 13, 16, 20]], z = [[18, 19, 21, 20], [16, 14, 2, 5], [17, 10, 1, 11]]})

ルービックキューブを操作

見やすいように、別ウィンドウにルービックキューブを表示しておきます

>    interface(plotdevice=window):
display([rubik,num1,num2,num3,num4],labels=[x,y,z],axes=box);
interface(plotdevice=inline):

ルービックキューブは、何通りの形になるか?

>    grouporder(prc);

3674160

残りのキューブはそのままで。白いキューブだけ (12 と 13 と 15) を入れ替えることはできるでしょうか?

>    groupmember([[12,13,15]],prc);

false

無理です。

それでは、周りのキューブはそのままで、隣り合う2つのキューブ (白 12, 15, 13 と 緑 3, 6, 7) を入れ替えることはできるでしょうか?

>    groupmember([[3,12],[6,15],[7,13]], prc);

true

可能です。

もう1つ、残りのキューブはそのままで、黄色、白、緑の各キューブをそれぞれ回転させることはできるでしょうか?

>    groupmember([[16,11,18],[13,12,15],[7,3,6]],prc);

true

ルービックキューブをアニメーション

最後の例を、アニメーションを使って見てみます。

geom3d パッケージの rotation コマンドは、3次元のオブジェクトを回転します。これを利用し、ルービックキューブが回転する様子をアニメーションすることができます

>    line(x,[t,0,0],t):
line(y,[0,t,0],t):
line(z,[0,0,t],t):

>    for i from 1 to 4 do
rotation(c3,c3,evalf((-Pi/2)/4),y):
rotation(c5,c5,evalf((-Pi/2)/4),y):
rotation(c7,c7,evalf((-Pi/2)/4),y):
rotation(c8,c8,evalf((-Pi/2)/4),y):
p[i]:=draw([c1(color=pink),c2(color=yellow),c3(color=green),c4(color=cyan),c5(color=plum),c6(color=wheat),c7(color=white),c8(color=turquoise)]):
od:

>    for i from 5 to 8 do
rotation(c1,c1,evalf((Pi/2)/4),z):
rotation(c2,c2,evalf((Pi/2)/4),z):
rotation(c3,c3,evalf((Pi/2)/4),z):
rotation(c5,c5,evalf((Pi/2)/4),z):
p[i]:=draw([c1(color=pink),c2(color=yellow),c3(color=green),c4(color=cyan),c5(color=plum),c6(color=wheat),c7(color=white),c8(color=turquoise)]):
od:

>    for i from 9 to 12 do
rotation(c2,c2,evalf((Pi/2)/4),y):
rotation(c3,c3,evalf((Pi/2)/4),y):
rotation(c7,c7,evalf((Pi/2)/4),y):
rotation(c8,c8,evalf((Pi/2)/4),y):
p[i]:=draw([c1(color=pink),c2(color=yellow),c3(color=green),c4(color=cyan),c5(color=plum),c6(color=wheat),c7(color=white),c8(color=turquoise)]):
od:

>    for i from 13 to 16 do
rotation(c1,c1,evalf((Pi/2)/4),z):
rotation(c2,c2,evalf((Pi/2)/4),z):
rotation(c5,c5,evalf((Pi/2)/4),z):
rotation(c7,c7,evalf((Pi/2)/4),z):
p[i]:=draw([c1(color=pink),c2(color=yellow),c3(color=green),c4(color=cyan),c5(color=plum),c6(color=wheat),c7(color=white),c8(color=turquoise)]):
od:

>    for i from 17 to 20 do
rotation(c1,c1,evalf((-Pi/2)/4),y):
rotation(c3,c3,evalf((-Pi/2)/4),y):
rotation(c7,c7,evalf((-Pi/2)/4),y):
rotation(c8,c8,evalf((-Pi/2)/4),y):
p[i]:=draw([c1(color=pink),c2(color=yellow),c3(color=green),c4(color=cyan),c5(color=plum),c6(color=wheat),c7(color=white),c8(color=turquoise)]):
od:

>    for i from 21 to 28 do
rotation(c2,c2,evalf((Pi/2)/4),z):
rotation(c3,c3,evalf((Pi/2)/4),z):
rotation(c5,c5,evalf((Pi/2)/4),z):
rotation(c7,c7,evalf((Pi/2)/4),z):
p[i]:=draw([c1(color=pink),c2(color=yellow),c3(color=green),c4(color=cyan),c5(color=plum),c6(color=wheat),c7(color=white),c8(color=turquoise)]):
od:

>    for i from 29 to 32 do
rotation(c1,c1,evalf((Pi/2)/4),y):
rotation(c2,c2,evalf((Pi/2)/4),y):
rotation(c5,c5,evalf((Pi/2)/4),y):
rotation(c8,c8,evalf((Pi/2)/4),y):
p[i]:=draw([c1(color=pink),c2(color=yellow),c3(color=green),c4(color=cyan),c5(color=plum),c6(color=wheat),c7(color=white),c8(color=turquoise)]):
od:

>    for i from 33 to 40 do
rotation(c1,c1,evalf((Pi/2)/4),z):
rotation(c2,c2,evalf((Pi/2)/4),z):
rotation(c3,c3,evalf((Pi/2)/4),z):
rotation(c7,c7,evalf((Pi/2)/4),z):
p[i]:=draw([c1(color=pink),c2(color=yellow),c3(color=green),c4(color=cyan),c5(color=plum),c6(color=wheat),c7(color=white),c8(color=turquoise)]):
od:

>    display([rubik,seq(p[i],i=1..40)],insequence=true,orientation=[-120,70],scaling=constrained,title=`ルービックキューブのアニメーション`);

[Maple Plot]