チョコレート
いよいよガロア群に対して、正規部分群を計算し、それを繰り返して組成列を計算します。
その準備として有限群をデータ構造(defstruct)として定義します。
defstruct(FiniteGroup(permutation_rep=false, degree=0,
index_element_set=false, mult_table=false,
inv_table=false, table_size=0));
permutation_repは置換群、degreeは要素の数、index_element_setは置換群の要素を数字(行列の行番号)で表した時の群の要素の集合、mult_tableは乗算表、inv_tableは逆元表、table_sizeは乗算表や逆元表の大きさを表します。
FG:new(FiniteGroup)で一つ群を生成します。
gr_gen_tables(FG,M)は群FGと行列形式の置換群Mを引数にとり、index_element_set, 乗算表、逆元表を初期化します。実装は自明なのでFiniteGroup.macを参照して下さい。
gr_mult(a,b,FG), gr_inv(a,FG)はFGの演算で乗算を計算したり、逆元を求めたり出来ます。実装は自明なのでFiniteGroup.macを参照して下さい。
gr_subnormal_group_max(FG)はFGの正規部分群でもっとも要素数の多いものを一つ求めます。参考文献3の"9. ガロア群の組成列"の最初に記載されている正規部分群を求めるアルゴリズムをそのまま実装しました。
FiniteGroup.macはここからダウンロードできます。
以下は前回の記事の続きのセッションです。PSという大域変数にはGalPolynomialInfoのインスタンスが代入されています。
(%i1) load("FiniteGroup.mac")$
(%i1) FG:new(FiniteGroup)$
(%i2) gr_gen_tables(FG,PS@galois_group)$
PS@galois_groupは前の記事で計算した、例題の多項式のガロア群(行列形式の置換群)です。
(%i3) FG;
$$ \tag{%o3} Group\left \{1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 \right \} $$
gr_mult()で乗算を行うこともできます。
(%i4) gr_mult(2,3,FG);
$$ \tag{%o4} 4 $$
FGの正規部分群でもっとも要素数の大きいものを計算してみましょう。
(%i5) gr_normal_subgroup_max(FG);
$$ \tag{%o5} Group\left \{1 , 4 , 5 , 8 , 9 , 12 , 13 , 16 , 17 , 20 , 21 , 24 \right \} $$
要素数が12の部分群が求まりました。
この関数を繰り返し呼び出して組成列を求める関数を定義します。
(%i6) dispfun(gr_subnormal_series)$
$$ \tag{%t6} \mathrm{gr\underline{\quad}subnormal\underline{\quad}series}\left(\mathrm{FG}\right):=\mathbf{if}\;\mathrm{FG}@\mathrm{degree}=1\;\mathbf{then}\;\left[ \mathrm{FG} \right] \;\mathbf{else}\;\mathrm{cons}\left(\mathrm{FG} , \mathrm{gr\underline{\quad}subnormal\underline{\quad}series}\left(\mathrm{gr\underline{\quad}normal\underline{\quad}subgroup\underline{\quad}max}\left(\mathrm{FG}\right)\right)\right) $$
では実際にFGに適用して、正規部分群の列を計算します。
(%i7) NSGS:gr_subnormal_series(FG);
$$ \tag{%o7} \left[ Group\left \{1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 \right \} , Group\left \{1 , 4 , 5 , 8 , 9 , 12 , 13 , 16 , 17 , 20 , 21 , 24 \right \} , Group\left \{1 , 8 , 17 , 24 \right \} , Group\left \{1 , 8 \right \} , Group\left \{1 \right \} \right] $$
ではこの列の中で隣り合う部分群の要素数の比を計算します。
(%i8) for i:1 thru length(NSGS)-1 do print(NSGS[i]@degree/NSGS[i+1]@degree);
$$\tag{*} \verb|2 |$$
$$\tag{*} \verb|3 |$$
$$\tag{*} \verb|2 |$$
$$\tag{*} \verb|2 | $$
$$ \tag{%o8} \mathbf{done} $$
全て素数になっています。従って群FG, 群PS@galois_group, そして多項式\( x^4+2\,x^3+3\,x^2+4\,x+5 \)は可解であることが分かりました。