正規部分群分解は一応動作するようになったと見てよいと思う.次は,部分群分解だ.これは素群を含むすべての部分群を列挙する検定である.現行では極小部分群の抽出→極大部分群の抽出→部分群の合成のような手順になっているが,極大部分群の抽出の部分は一時的に止めて動作確認することにする.極小部分群の抽出は「生成元のすべてのべきを含む部分群を生成する方法」で行っている.これはよく言われる「軌道」というものではないだろうか?いや,少しというかかなり違うように思われる.これは後で調べることにする.極小部分群の抽出にはバージョンの分岐はない.使われているのは,部分群検定5~7だけだ.
▲Q8の部分群分解で停止する.(Count != 部分群数)の不一致が起きている.Count = 4で部分群数は5だ.Count=1で開始しているのに一致しないというのはおかしい.素群数=5,極大部分群数=0でi<5のときだけカウントされている.検定7の冒頭では素群数と部分群数は一致している(=5)この下図には{e}が含まれるものと思われる.部分集合には台集合が5個登録されている.部分集合[0]={e}である.
■群Q8は5個の真部分群を持つ■ 位数2X1 位数4X3と表示されているが,素群は3個しかダンプされていない.どうもi=3でループからブレークしているようだ.いや,ループ回数が 部分群数 – 1となっている.=は入っていないので,これは i < 部分群数でなくてはならないだろう.⇒多分これで解決したはずだ.
■群Q8は5個の真部分群を持つ■ 位数2X1 位数4X3という表示になっているが,真部分群には単位群を含まないことになっているようなので,1つマイナスした数字を出すことにする.
部分群のダンプの意味がよくわからない.
部分群のダンプ:Q8 N=8 素群数=5 部分群数=5 #は部分群の位数
[0] 〈1〉{1} #1
[1] 〈〉{1,-1} #2
[2] 〈〉{1,i,-1,-i} #4
[3] 〈〉{1,j,-1,-j} #4
[4] 〈〉{1,k,-1,-k} #4
〈〉で何を表そうとしているのだろう?意味不明だ.⇒部分群生成元[i]というのを表示している.極大部分群ではこの配列に※を格納している.合併群の場合には2つの部分群の生成元を連結した値が入る.素群では何も入れていない.置換リストを使っている場合には,生成元の置換が入るようになっているが,置換リストを使っていないため空になっている.極小部分群を生成したときのseedを格納するようにした.以下のようになった.これならわかる.
(1) 部分群 [1]⇒〈-1〉{1,-1} は位数2のQ8の素群である
(2) 部分群 [2]⇒〈i〉{1,i,-1,-i} は位数4のQ8の素群である
(3) 部分群 [3]⇒〈j〉{1,j,-1,-j} は位数4のQ8の素群である
(4) 部分群 [4]⇒〈k〉{1,k,-1,-k} は位数4のQ8の素群である
部分群のダンプ:Q8 N=8 素群数=5 部分群数=5 #は部分群の位数
[0] 〈1〉{1} #1
[1] 〈-1〉{1,-1} #2
[2] 〈i〉{1,i,-1,-i} #4
[3] 〈j〉{1,j,-1,-j} #4
[4] 〈k〉{1,k,-1,-k} #
A2, A3, A4, A5, S2, S3, S4, S5まで分解できた.内訳まではわからないが,下記URLにはこれらの部分群の個数のリストがある.
http://iitakashigeru.math-academy.net/seminar07/nakayamaohp.pdf
S5の分解では5分54秒掛かっている.約6分だ.上のサイトではPrologで11.46秒で計算完了している!以前はもう少し速かったような気もするのだが… 2023/10/29には部分群検定で4秒を切ったと書いてある.これは極小部分群の切り出しに限定されたものかもしれないが… 2023/10/25には,部分群検定6で6分23秒とある.それに比較すれば多少は速くなっているのだが… 部分群検定3に戻って確認してみる必要がある.⇒部分群検定3というののは残っていない.これは記事にもあるように現在は「極小部分群の抽出」とリネームされている.つまり,サブルーチンの扱いだ.極小部分群の抽出は現行の検定7でも使っているので,それ以上のことはできない.
◆部分群のリストをダンプするとき,可換/非可換と正規部分群の別を表示できるようにしたい.群の検査の自己同型検定は正規部分群検定になっていないのだろうか?正規部分群検定の中では,「共役変換検定」を使って正規であるか否かを判定している.共役変換検定という処理は準同型というクラスの関数で,準同型はA,Bという2つの群を抱えている.この中でB群から参照されているのはNだけだ.多分,Aが写像の定義域でBが値域になっているはずだが,値域の台集合は群から直接取っているのだろうか?map.map1がそれに該当するものと思われる.
写像 map = new 写像(G.N, G.台集合, G.台集合);
とあるが,これは
写像 map = new 写像(G.N, 台集合, G.台集合);
の誤りではないだろうか?写像というクラスでは配列を2つ持っているが,長さが同じことを仮定しているのではないだろうか?写像の検査という機能もある.これを見ておこう.写像の検査は準同型クラスのメソッドで群AとBを持ち,map1とmap2という2つの元集合を持っているが,これらのサイズは同一で,群の台集合の部分集合という位置付けと思われる.つまり,基本的にmap1→map2は全単射になっているのではないか?写像の検査で実施しているのは基本的にmap1/map2と群A/Bの台集合の突き合わせ検査である.つまり,記載漏れや重複がないことを確認しているに留まる.
共役変換検定の動作を確認してみよう.A4は位数4の正規部分群を1個持っているが,完全な検査になっているかどうか?Aの元集合としてはAの台集合が使われているので,抜け目はないように思われる.map1とmap2には同じもの(Bの台集合)が入っている.gxg^-1でg∈A,gxg^-1∈Bとなっているので,論理的には問題なさそうだ.ただし,これは写像や準同型などを持ち出さなくても群クラスの中で処理できたのいではないか?⇒書換えてみよう.⇒対処した.問題なさそうだ.
ここで,群の生成時,対称群と交代群では乗積表を使わない方式に統合しておくことにしよう.台集合は別途指定できるので,特に問題ないと思う.現行では「置換リストを使う」方式でS5まで扱えているので,とりあえず限界まで試してみることにする.⇒A3~A5, S2~S5までは実装した.VとQ8は残った.これらは対称群でも交代群でもないので,自動的には生成できない.部分群として取り出すという手段はあるが…
検定7で極大部分群の抽出3を復活させたが,S5でやけに時間が掛かっている.どうも,極大部分群を取ったことで余分なコストが掛かるようになってしまったように思われる.極大部分群検定は部分群検定から切り離しておいた方が無難かもしれない.古い論理の復活ということも考えられるかも知れない.極大部分群検定に入っている「結び目をほどく」がコスト要因になっていると考えられる.というか,S5はこの方法では極大部分群を取り出せなかったのではなかったろうか?なにかやり損なってしまった可能性もある.2023/11/06には「S5では1分以上掛かっている模様」とあるので,これほどには掛かっていなかった.
交代群ではまったく極大部分群を取れない.対称群ではS4までは取れるが,S5では時間が掛かるようになっている.いや,2023/11/06のログでは「S5の極大部分群で2秒」という書き込みもある.この2秒というのは,メモリを確保するまでの時間を除いた実処理時間と思われる.確かに,2秒台で終わっている.それまでの助走に時間を食われている.開発機の実装メモリは16GBだ.これを増設すればもう少し速くなる可能性はあるような気がするが… 機種名はDiginnosだ.⇒16GBというのは現在の標準だ.32GB搭載はハイエンドクラスにしか見られない.