PythonSf と名づけた数学ソフトを開発しています。そこで置換群も実装しています。素人実装であり CGT でのアルゴリズムまでは入れていません。でも膨大なインスタンスを生成しないときは結構実用的に使えます。
一方で下の URL で GAP で求めたとする交換子の集合が群にならない位数 96 の群の例を示しています。
http://math.stackexchange.com/questions/7811/derived-subgroups-and-commutators
(3,8,6)(4,7,5)(9,27,17)(10,28,18)(11,30,22)(12,29,21)(13,26,23)(14,25,24)(15,31,20)(16,32,19),
(1,17,7,23)(2,18,8,24)(3,19,5,21)(4,20,6,22)(9,26,15,32)(10,25,16,31)(11,28,13,30)(12,27,14,29),
(1,9,5,13)(2,10,6,14)(3,11,7,15)(4,12,8,16)(17,25,21,29)(18,26,22,30)(19,27,23,31)(20,28,24,32),
(1,5)(2,6)(3,7)(4,8)(9,13)(10,14)(11,15)(12,16)(17,21)(18,22)(19,23)(20,24)(25,29)(26,30)(27,31)(28,32),
(1,3)(2,4)(5,7)(6,8)(9,11)(10,12)(13,15)(14,16)(17,19)(18,20)(21,23)(22,24)(25,27)(26,28)(29,31)(30,32),
(1,2)(3,4)(5,6)(7,8)(9,10)(11,12)(13,14)(15,16)(17,18)(19,20)(21,22)(23,24)(25,26)(27,28)(29,30)(31,32)
これが本当か、PythonSf の能力テストも兼ねて計算してみました。PythonSf の計算では、この群の位数は 96 よりも ずっと大きくなり、「URL の計算は誤りだと」の結論になりました。
PythonSfの計算と URL にある GAP 計算のどちらが誤っているか、GAP 使いのどなたか確認計算してもらえますでしょうか。
------------ 確認した計算 -----------
PythonSf では、下のような計算をしてみました。(PythonSf を知らなくても、Cy が巡回置換、Sb が置換、kfs が frozeset、mitr(..) が多重イタレータであることと Python を知っていれば下の計算の意味は解ると思います。)
● URL にある巡回置換の周期を求めました。 3,2,2,4,4,2 です。
a:=Cy(3,8,6)Cy(4,7,5)Cy(9,27,17)Cy(10,28,18)Cy(11,30,22)Cy(12,29,21)Cy(13,26,23)Cy(14,25,24)Cy(15,31,20)Cy(16,32,19); [k for k in range(20) if a^k == Sb(range(33))]
===============================
[0, 3, 6, 9, 12, 15, 18]
b:=Cy(1,17)Cy(2,18)Cy(3,19)Cy(4,20)Cy(5,21)Cy(6,22)Cy(7,23)Cy(8,24)Cy(9,25)Cy(10,26)Cy(11,27)Cy(12,28)Cy(13,29)Cy(14,30)Cy(15,31)Cy(16,32); [k for k in range(20) if b^k == Sb(range(33))]
===============================
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
c:=Cy(1,9)Cy(2,10)Cy(3,11)Cy(4,12)Cy(5,13)Cy(6,14)Cy(7,15)Cy(8,16)Cy(17,25)Cy(18,26)Cy(19,27)Cy(20,28)Cy(21,29)Cy(22,30)Cy(23,31)Cy(24,32); [k for k in range(20) if c^k == Sb(range(33))]
===============================
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
d:=Cy(1,5,2,6)Cy(3,8,4,7)Cy(9,13,10,14)Cy(11,16,12,15)Cy(17,21,18,22)Cy(19,24,20,23)Cy(25,29,26,30)Cy(27,32,28,31); [k for k in range(20) if d^k == Sb(range(33))]
===============================
[0, 4, 8, 12, 16]
e:=Cy(1,3,2,4)Cy(5,7,6,8)Cy(9,11,10,12)Cy(13,15,14,16)Cy(17,19,18,20)Cy(21,23,22,24)Cy(25,27,26,28)Cy(29,31,30,32); [k for k in range(20) if e^k == Sb(range(33))]
===============================
[0, 4, 8, 12, 16]
f:=Cy(1,2)Cy(3,4)Cy(5,6)Cy(7,8)Cy(9,10)Cy(11,12)Cy(13,14)Cy(15,16)Cy(17,18)Cy(19,20)Cy(21,22)Cy(23,24)Cy(25,26)Cy(27,28)Cy(29,30)Cy(31,32); [k for k in range(20) if f^k == Sb(range(33))]
===============================
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
● 上での計算で a,b,c,d,e,f 置換インスタンスをファイル変数にもしておいたので、それらを利用して a,b,c,d,e,f の組合せで作られる集合のサイズを計算してみます。
# 3,2,2,4,4,2 の巡回群を一回ずつだけ掛け算してでできる置換インスタンスの集合の濃度は 96 です。
=:a,b,c,d,e,f; len({u v w x y z for u,v,w,x,y,z in mitr([a^0,a,a^2],[b^0,b],[c^0,c],[d^0,d,d^2,d^3],[e^0,e,e^2,e^3],[f^0,f])})
===============================
96
# でも上でできた集合は群演算で閉じていません。交換子の集合を作ってみると、その濃度は 459 になってしまいました。
=:a,b,c,d,e,f; kfsG=kfs({u v w x y z for u,v,w,x,y,z in mitr([a^0,a,a^2],[b^0,b],[c^0,c],[d^0,d,d^2,d^3],[e^0,e,e^2,e^3],[f^0,f])}); kfsC=kfs({x y x^-1 y^-1 for x,y in mitr(kfsG, kfsG)}); len(kfsC)
===============================
459
お礼
muturajcp さん、誤りの指摘 ありがとうございました。また御礼が遅れて申し訳ありませんでした。 おかげで、a,b,c,d,e,f 置換が作る位数 96 の群の交換子の集合が群にならず、それを 群にすると d が新たに含まれることを確認できました。また a,b,c,d,e か形作る、こ の位数 96 の群の構造を調べることもできました。 そのための計算は、以下のワン・ライナーで行えました。ワン・ライナーは、その行だけ で完結しています。何時でも何処でも単独で再実行できるので便利に使えます。。ワ ン・ライナーだといっても GAP より可読性が勝っていると思います。素人実装の群計算 モジュールでも GAP を補完する 働きをさせられると言えそうです。 ● {a,b,c,d,e,f} より生成される群の交換子積の集合は群ではない。交換子積の集合か ら群を生成した段階で d が含まれる。 ○ S96, S96_cmmtr: a,b,c,d,e,f より生成され る位数96 の群、その交換子積の集合を ファイル変数 S96 と S96_cmmtr にします =:a,b,c,d,e,f;S96:=group([a,b,c,d,e,f]); S96_cmmtr:=kfs(x y x^-1 y^-1 for x,y in mitr(S96,S96)) ○ a, d が S96_cmmtr に属しません =:a,b,c,d,e,f,S96,S96_cmmtr; {a,d}.issubset(S96_cmmtr) =============================== False =:a,b,c,d,e,f,S96,S96_cmmtr; {b,c,e,f}.issubset(S96_cmmtr) =============================== True ○ d が S96_cmmtr 交換子積の集合にに属しません =:a,b,c,d,e,f,S96,S96_cmmtr; d in (S96_cmmtr) =============================== False ○ d が S96_cmmtr から生成される群に属します =:a,b,c,d,e,f,S96,S96_cmmtr; d in group(S96_cmmtr) =============================== True ○ S96 の位数は 96 == 2^5 * 3^1 == 32*3 =:a,b,c,d,e,f,S96,S96_cmmtr; ts(); ts.factorint(len(S96)) =============================== {2: 5, 3: 1} ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 何が交換子積の集合が群にならない性質をもたらすのか知りたくて、a,b,c,d,e,f 置換 から生成される群の構造について調べてみました。 ● a,b,c,d,e,f の位数は 3,4,4,2,2,2 であり、S96 は下の様に分解されることが分かりました。 group(S96_cmmtr) ≡ {f^0,f} X| {b,c,e} 商群 || S96==group([a,c]) |> group(S96_cmmtr) == group([b,c]) || S96==group([a,c]) ≡ {a^0,a^1,a^3} X| group(S96_cmmtr) これ位の構造を入れ込んでやらないと「交換子積の集合が群にならないという隙間が得 られない」ということのようです。その隙間を作るためには、最低でも位数 96 が必要な のも納得できる気がします。それだけ群構造では、要素が互いに強固に関連しあってい るのだと思います。 この構造を自由群の関係子で表現できれば良いと思うのですが、私の能力ではできません。 ○ a,b,c,d,e,f の位数は 3,4,4,2,2,2 であることの証明 =:a,b,c,d,e,f; [len(kfs([x^0,x^1,x^2,x^3,x^4])) for x in (a,b,c,d,e,f)] =============================== [3, 4, 4, 2, 2, 2] ○ S96 == group([a,c]) の証明 =:a,b,c,d,e,f,S96,S96_cmmtr; S96 == group([a,c]) =============================== True ○ group(S96_cmmtr) == group([b,c]) の証明 =:a,b,c,d,e,f,S96,S96_cmmtr; group(S96_cmmtr) == group([b,c]) =============================== True ○ group(S96_cmmtr) ≡ {f^0,f} X| {b,c,e} 商群の実験的検証 # group(S96_cmmtr) の交換子積 == {f^0,f} =:a,b,c,d,e,f,S96,S96_cmmtr; S=group(S96_cmmtr); kfs([x y x^-1 y^-1 for x,y in mitr(S,S)]) == {f^0,f} =============================== True # {b,c,e} ⊂ group(S96_cmmtr)/{f^0,f} の証明 =:a,b,c,d,e,f,S96,S96_cmmtr; S=group(S96_cmmtr); {b,c,e}.issubset(S/{f^0,f}) =============================== True # {b,c} だけでは商群を作れないが {b,c,e} で商群の generator になる。 gp(); =:a,b,c,d,e,f,S96,S96_cmmtr; S=group(S96_cmmtr); SN=kfs([f^0,f]);Sd=S/SN; ls=[b,c ]; len(kfs([product(v,Sb(0)) SN for v in mitr(*[ls]*6)])) =============================== 4 gp(); =:a,b,c,d,e,f,S96,S96_cmmtr; S=group(S96_cmmtr); SN=kfs([f^0,f]);Sd=S/SN; ls=[b,c ]; len(kfs([product(v,Sb(0)) SN for v in mitr(*[ls]*7)])) =============================== 4 gp(); =:a,b,c,d,e,f,S96,S96_cmmtr; S=group(S96_cmmtr); SN=kfs([f^0,f]);Sd=S/SN; ls=[b,c,e ]; len(kfs([product(v,Sb(0)) SN for v in mitr(*[ls]*5)])) =============================== 15 gp(); =:a,b,c,d,e,f,S96,S96_cmmtr; S=group(S96_cmmtr); SN=kfs([f^0,f]);Sd=S/SN; ls=[b,c,e ]; len(kfs([product(v,Sb(0)) SN for v in mitr(*[ls]*6)])) =============================== 16 gp(); =:a,b,c,d,e,f,S96,S96_cmmtr; S=group(S96_cmmtr); SN=kfs([f^0,f]);Sd=S/SN; ls=[b,c,e ]; len(kfs([product(v,Sb(0)) SN for v in mitr(*[ls]*7)])) =============================== 16