部分群検定で生成された部分群を登録し,リストから選択できるようにするという改修を行っているところだ.すでにある程度まで実装完了しているが,起動時にPermuteで例外が発生する.
現行では「置換リストを使わない」設定になっているが,Form1.Homoがnullのままだ.Homoを設定しているのは2箇所しかない.準同型検定ボタンが押されたときと,群同型判定が実行されたときだ.HomoというのはForm1の静的変数で準同型クラスのインスタンスだ.準同型には群A, Bと写像が入っている.しかし,これは自動的には生成されない.⇒Homoがnullのときにはパスするようにしておこう.
今度は別のエラーが出た.
準同型検定でもエラーになる.
なぜだろう?comboBox3_SelectedIndexChanged イベントが入っている.以下のようなダンプが出ている.
stock=2/9 gname=A3 群A3が選択された
◎A3は位数0の可換群である:{a}
stock=1/7 gname=A4V 写像A4Vが選択された
stock=1/8 gname=A4→V 準同型A4→Vが選択された
画面上には3つのプルダウンリスト(コンボボックス)があるが,最初の「群A3が選択された」が起きる可能性はあるとしても,そのあとの2つが起こる理由が分からない.いや,これはまだForm_1_Load中だ.リスト3では準同型判定を自動的に実行するようになっているためだ.これはとりあえず止めておこう.リスト1の群の検査も止めておく.
▲部分群分解を実行して,「インデックスが配列の境界外です」になった.極小部分群の抽出で起きているようだ.⇒Nが0になっている!Form1.Groupに入っている群の中身がおかしい.群名称はA3になっているが… ストックからリストに登録した時点でN=0になっている.なるほど,理由はわかった.「置換リストを使わない」という設定になっているためだろう.しかし,置換リストを使わなくても生成できるようになっていたはずではなかったろうか?⇒これは後で見ることにして,先に選択リストへの登録をフィックスしてしまおう.
▲極小部分群の抽出で停止した.部分群がnullになっている.⇒部分軍検定で部分群[]を初期化しているが,勘違いして止めていた.
▲群A4の部分群分解で例外が発生した.OutOfMemoryだ.群同型判定で起きているものと思われる.⇒群同型判定を準同型判定に切り替えて動作するようになった.この2者の違いは別途調べることにする.
準同型判定の引数modeは使われていないので廃止した.A4の部分群分解で2件追加登録された.⇒はずだが,リストに現れない.⇒不等号の向きが反対になっていた.動作するようになった.A4-1とA4-3が追加されている.なかなかいい感じだ.
ストック配列に登録していないので,まだ現物にはアクセスできない.ストック配列をリサイズして収容するようにした.⇒動作するようになった.多分これで問題ないと思う.部分群のうち,位相同型のものは省いて,代表的な部分群だけが登録されている.名称が同じ群は登録されない.位相同型でも共役でない場合というのがあり得るので,準同型判定ではなく,共役変換検定を使った方がよいのかもしれないが,当面はこれで運用してみることにする.⇒準同型検定の中で共役変換検定を実行している.(共役でない場合)結果を表示するようにしておいた.
一通り動くようになったが,まだ未整備のところがある模様だ.A3追加なし,A4は追加件数2でA4-1とA4-3が登録されている.ここまではよいのだが,A5で分解された部分群(9件)が開けない.群名称は,A5-1, A5-3, A5-16, 〈(345),(23)(45)〉, 〈(345),(12)(45)〉, 〈(23)(45),(24)(35) 〉, 〈(23)(45),(12)(45)〉, 〈(23)(45),(12)(34)〉, 〈(23)(45),(145)〉だ.A5-◯はA5の直下の素群で〈(345),(23)(45)〉はそれらから合成されたものと思われる.⇒いや,違う.たとえば,(1)[1]⇒〈(345)〉{e,1,2} は位数3のA5の素群であるとある.どういうことだろう?いや,これは分解時のダンプで名前は別に付いているはずだ.
A5の素群は32,全体で58なので合成群は26ということになる.この58には単位群が入っている.真部分群は57だ.この大部分が位相同型として棄却され,追加9件ということになる.A5-xタイプ以外はすべて合成群と言ってよい.つまり,置換の積の形式の群は合成群である.A5-1,A5-3などはA5の元1ないし元3から生成された群と読むことができるが,〈(345),(23)(45)〉などはどう解読すればよいか?特に親群名称が入っていないのはまずい.たとえば,素群の場合,A5-1をA5〈1〉のように表記し,合成群の場合は,A5〈1, 5, 6〉のように表示すれば分かり易いのではないか?しかし,今のネーミングで
群〈(345),(23)(45)〉と群〈(345),(13)(45)〉は位相同型
のように表示されるのも悪くないような気はする.「親群」と「部分群」は持っているが,合成群の「成分群」情報が欠けている.これをどこかに保持できるようにしたい.素群を置換積表示するとしたら,どこから情報を取ればよいのか?部分群のダンプでは置換積表示になっているので,取り出す手段は(置換Pを持っている限り)あるだろう.親群は部分群生成元というのを管理しているので,部分群番号が分かれば取り出すことは可能だ.このためには,部分群番号を抑える必要がある.
生成元が分かれば,それから生成される群を特定できるだろうか?生成元というのは,string だが,生成元からその群を直接特定することはできないのではないか?いや,部分群配列で生成元を保持している群がそれであることは間違いない.元番号=置換番号であることを確認しておこう.元番号ないし置換番号が分かれば,それから置換を割り出すことは容易だ.部分群のダンプは群の位数でソートした方がよい.
ともかく,群名称の命名規則を変えることにしよう.⇒親群名称<a, b>のような表記に変更した.この方がずっと分かり易い.<a>の置換は置換リストを引けば取り出せる.⇒まだ表記がバラけている.
★★ 群A5<16> と 群A5<23> は位相同型
★★ 群〈1,3〉 と 群〈1,27〉 は位相同型
以下の形式に統一した.
★★ 群A5:<1,3>と群A5:<1,27>は位相同型
大分読み易くなった.A5の部分群分解で,「準同型写像ではない」というのが9件発生している.調べておこう.
▲▲ 部分群の登録は準同型写像ではない err=20
これは同型判定は位数が同じ群のみを検査しているので,位数が等しくて同型にならないものという意味になる.どのような場合にそのようなことが起きているのか?
▲▲ 群A5:<1,12>→群A5:<3,12>の部分群の登録は準同型写像ではない
のような表示になったが,置換の内容を見ないとよくわからない.共役変換検定の結果も表示してみたが,「共役ではない」という表示は出てこない.つまり,共役ということになる.どうもちょっと疑問が湧いてきた.⇒群に生成元[]という整数配列を設けることにした.⇒かなり便利だ.準同型でないという表示が出るのはすべて位数6の群だ.位数6の部分群は10個あるが,それらはすべて共役ということになっている.どうもどこか間違えているような気配だ.