部分群の属性をテーブルで表示する

台集合の属性リストをマトリックス表示できるようになった.もう少し手を入れるところはあるが,先に部分群表を出すところを片付けてしまおう.部分群表というのは現在部分群のダンプとしているところをマトリックスに整形表示するというものだ.

S4<3,7>を選択してフロック分解で配列の範囲外の例外が発生した.例外はフロック現数のカウントで起きている.フロック部分群検定ではD集合という配列を管理している.対象となる部分群の位数は12でフロック配列はこのサイズで作られているが,元表[9].フロック番号には16という値が入っているため,障害が発生する.

S4<3,7>は部分群検定で生成・登録された部分群だが,元表などを初期化していないのではないだろうか?フロック番号は最初のフロック分解で設定されているはずだが…⇒部分群を新規生成する場合には,元表を渡さないようにした.ただし,これでも不一致は発生する.追加登録で事後にノードを追加しているためだ.部分群の追加というところで元表を再計算することにする.

S4の部分群表を表示した後,台集合出力しようとして置換積に変換で停止した.引数のarrayが空で呼び出されている.元属性表の作成を実行しているところで,置換構成は空ではないため元g.置換を置換積に変換しようとしているのだが…単位元に置換が設定されていないのではないか?⇒かなりよい動きになってきた.

部分群表で同型の部分群の個数を表示するようにしたい.部分群の追加のところでこの値は算出されているので,どこかに保存しておけばよい.また,台集合のリストは{}で囲む必要はない.DataGridViewでは,末尾の一行は行追加のために予約されているようで,カラムを指定してソートしても,最後の行が残ってしまう.テーブルのサイズを1大きくして余分な行を表示するようにしたらまともな動作になった.

群表では番号は1発進になっている.元表でも同様にした方がよいのではないか?ただの表示なので特に問題ないはずだ.もともと元.番号に0が入っているのが問題なのではないか?ただし,単位元はフロック〇と呼んでいるようにすでに番号〇として認識されているかもしれない.単位元の現番号は〇でよいのではないだろうか?冪零などという話も出てくるので… とりあえず,現状のままとしておこう.

元の属性をテーブル(マトリックス)表示

乗積表出力で以下のエラーになった.

image

多分,フォームを閉じてしまったのだと思う.Form3のFormClosingでイベントをキャンセルして,隠蔽するようにした.乗積表出力を再度押せば,元の位置に開かれる.本体画面の上半分にテキストボックス表示して,久留島喜内の道具箱のような作りにしてみた.①群のダンプと②部分群のダンプが表示される.

image

これだけでも十分役に立つと思われるが,これを乗積表のようにマトリックス表示してみたい.多分ずっと見易くなると思われるが,マトリックス表示する最大の利点は列でソートできるという点だ.これができると一つの情報を色々な角度から分析できるのでとても有用だと思う.ただし,元表と部分群表を出すとすれば,乗積表だけ別画面というのもおかしいので,また元に戻すということになるだけでなく,少なくとも3種のテーブルを切り替えて同時に開くことができなくてはならないだろう.そのためにはタブが必要になってくる.一応タブの準備はできた.ともかく台集合を出してみよう.⇒乗積表を主画面に戻した.

image

乗積表を別のウィンドウで開く

乗積表を参照する機会が増えているが,小さいウィンドウ枠の中でスクロールして見るのは煩わしい.逆にコンソール画面には乗積表などの大きいデータを表示しないとすれば,道具箱の枠内に表示するのでもよいような気がする.という趣旨でコンソールをアプリ画面に埋め込むことを試してみたが,うまくゆかなかった.その代わり,乗積表を新しいフォームを開いて外部で見るように仕様変更してみた.乗積表を外に出したのでアプリ画面は手のひらサイズになってしまったが,将来的にはスマホ搭載などということも考えられるので,悪い設計ではないような気もする.コンソールとアプリ画面をドッキングできるようにしておくというのも一つの方法かもしれない.

image

フロック〇という特殊フロックを考える

フロック集合から始めるフロック部分群検定というのを試しているところだがかなりいい線まで来ている.A4では位数4×1を除けばすべての部分群が生成できている.A4<d,i>というのはかなり特殊な部分群で成分はすべてフロック〇から来たものだ.フロック〇だけで群を組むというのは試してもよいような気はする.⇒一発で位数4の極大部分群が生成できた.A5では新たな部分群は生成されなかった.

現時点では■群A5は31個のフロック部分群を持つ■ 位数2X15 位数3X10 位数5X6となっている.■群A5は57個の真部分群を持つ■ 位数2X15 位数3X10 位数4X5 位数5X6 位数6X10 位数10X6 位数12X5 となっているので,位数4X5 位数6X10 位数10X6 位数12X5 は未生成ということになる.31個のフロック部分群というのは,A5の極小部分群検定で素群数31個としているのと一致する.つまり,フロック部分群≡素群と言ってよさそうだ.しかし,この数字はS4では一致しない.群S4は16個の素群を持つ■ 位数2X9 位数3X4 位数4X3となっているが,フロック部分群は13個しか出てこない.■群S4は13個のフロック部分群を持つ■ 位数2X9 位数3X4 つまり,位数4X3がまるきり落ちている.

S4の位数4×3というのはすべてフロック〇の元のみで構成されている.つまり,フロック〇の元をすべて含むのではなく,それらの組み合わせによって部分群となっている.また,それよりも大きくなるとフロック〇とそれ以外という組み合わせが出てくるようになる.これらの組み合わせは「部分群の合成」というところで見るしかないので,ここでは扱わないことにするが,フロック部分群≡素群というところだけは確立しておきたい.ここまで来るとどうしてもフロック〇の詳細化というのを避けることはできないように思われる.

その前に,「べきは同一フロック」という修正を入れてしまおう.x^2=yのとき,xとyを不可分とするという論理だ.S4のフロック分解を実行して例外が発生した.上記の修正に関わるものと思われる.⇒とりあえず,例外をスローして処理を続行する.これはフロック〇の扱いに関係しているので,その部分を手当しないと解決できない.

フロック〇の構成について考える.単位元とつながる元集合をすべてフロック〇にまとめて収容しているが,ここにも構造があり,小さなフロックを構成していると考えられるので,それらが反映できるような構成にする必要がある.つまり,フロック〇の中をさらに小フロックに分割しなくてはならない.現行ではフロックリストというのは同一フロックに属する元のリストであり,それぞれの代表元の位置に置かれて,その元の番号で呼ばれるようになっている.考えられるのは,フロック〇のフロックリストにはそれぞれの代表元が入り,その元はその位置で自分のリストを管理するという方式だが,整理できるだろうか?

まず,一旦フロック〇という構成を忘れて(単位元を無視して),フロックリストを生成し,その中で単位元につながるものだけを拾い出して単位元に繋げればよいのではないだろうか?つまり,通常の操作では単位元フロックというのは無視されていて,何か必要なときだけ参照されるという感じだ.多分これなら混乱なくさばけるのではないかと思う.単位元位置のフロック〇も代表元のリストとして構成できるから,まったく同じデータ構造で間に合うはずだ.ただし,フロックの移動などの操作では同じにはならないが…

べき表はすでに使われなくなっているはずなので,削除しておこう.⇒いや,使われている.元表の作成で参照されている.これは,いまの処理にも関係する.当面温存しておくしかない.一応フロック〇の分離ができた.動作は悪くないような気がする.S4ではこれまで取れなかった#4×3が取れるようになった.S5でもこれまでの41から46に5個増加した.ただし,#4×15の増加とともに,#3×10が全滅という逆転が起きている.S5は66個の素群を持つとされ,特に位数6×10というのがまったく取れていない.⇒フロック検定を書き直さなくてはならない.

フロック検定の冒頭でフロック〇の元をすべて集めた部分群を作っているので,同等操作となるように書換えたが.A4では部分群にならない.位数が16という部分群はS4には存在しない.S4で位数2の部分群9個が6個に減少してしまった.これは,従来論理で単位元とフロック〇の元で作る位数2の部分群というのを代表元の下の元をすべて含むように書換えたためだ.であるとすれば,これらのフロックは間違っているということになるのではないか…

フロック部分群検定を実装する

どうも進捗が思わしくない.どうも極大検定から入ったのが敗因だったようだ.極小検定から入っていれば,もう少し進んでいたはずだ.極小検定には極大検定で出てくるような組み合わせの問題は発生しない.まず,最初に単独のフロックから生成される群を選り分けて見ることにしよう.これをフロック部分群検定と呼ぶことにする.⇒実装した.

これはかなりよい.A4の位数3の部分群を4個すべて切り出してきた.これまでのやり方ではどうしても出てこなかったものだ.フロック類にはまだお宝が秘匿されている.フロック番号0のグループだ.このグループに属する元と単位元から位数2の部分群が生成されるはずだ.A4では7個のフロック部分群が生成された.位数2X3 位数3X4.

A4の部分群検定でエラーが発生した.追加登録で例外が発生している.⇒余計な修正が入っていた.乗積表の生成で配列サイズをケチって現物サイズに収めようとしたためだ.動的に伸長する場合があり,ギリギリサイズでは例外が発生する.

A4の部分群検定で生成される部分群は全部で8個,位数2X3 位数3X4 位数4X1だから,フロック群生成で生成できなかったのは,位数4×1だけということになる.A5の場合,■群A5は57個の真部分群を持つ■ 位数2X15 位数3X10 位数4X5 位数5X6 位数6X10 位数10X6 位数12X5 ということになっている.フロック分解ではこのうちの25個を生成した.■ 位数2X15 位数3X10.これはA5の部分群のうち,位数2と3のものの総数だ.つまり,フロック分解によって任意の群について位数2と3の部分群は完全に生成可能ということだ.

これはおそらくすべての素群を含むと考えてよいのではないだろうか?A4の素群は7個であり,これはフロック分解で生成された部分群の個数に一致する.A5の場合,素群の総数は31でこの中には位数5X6というのが含まれている.これは現在のところまだフロック分解では生成できていない.少なくともフロック分解は現行の極小部分群検定をカバーできるものでなくてはならないだろう.

極小部分群検定にフロックを導入するのは容易だが,もう少しフロック独自のコンテキストで考えてみたい.位数5の部分群には以下がある.

[31] 群A5:<23> 位数5 フロック=1 2^1=2〈23〉 素群 極小 可換 巡回 自己同型 {e,23,54,38,31} [0,23,31,23,31]
[32] 群A5:<18> 位数5 フロック=1 2^1=2〈18〉 素群 極小 可換 巡回 自己同型 {e,18,46,26,56} [0,18,46,18,46]
[33] 群A5:<16> 位数5 フロック=1 2^1=2〈16〉 素群 極小 可換 巡回 自己同型 {e,16,32,48,45} [0,16,32,16,32]
[34] 群A5:<20> 位数5 フロック=1 2^1=2〈20〉 素群 極小 可換 巡回 自己同型 {e,20,42,50,34} [0,20,34,20,34]
[35] 群A5:<21> 位数5 フロック=1 2^1=2〈21〉 素群 極小 可換 巡回 自己同型 {e,21,58,25,44} [0,21,44,21,44]
[36] 群A5:<17> 位数5 フロック=1 2^1=2〈17〉 素群 極小 可換 巡回 自己同型 {e,17,35,36,57} [0,17,35,17,35]

フロックで見ると,単位元を別として,位数2の2つのフロックの対になっている.[23, 31], [18, 46], [16, 32], [20, 34], [21, 44], [17, 35].これらのフロックの元はいずれも長さ5の巡回置換の形になっているが,これらの組み合わせは厳密なマッチングによるものと見られる.どのような仕組みでマッチングしているのか興味あるところだが,ちょっと見では解析できない.

いずれにしてもフロックの対を試してみればこれらを列挙することは可能であり,そのコストはそれほど大きなものではないので,十分許容できるものと思われる.フロック対以上の,たとえば3つ組などでも素群になるのかどうか?という辺りは調べる必要がある.

単独のフロックが群になるときは,そのフロック群を含む部分群は合成群になると考えられるから,素群の成分となるようなフロックはそれ自体では群を構成しないものと考えるべきだろう.このような観点からすると,フロックには①単独で群となるようなフロック,②単独では群とならず,複数のフロックの組み合わせによって初めて群となるもの,の別があると考えられる.これらは素群の成分と考えられるので,フロックを成分としてそれらが素群を構成するまでの組み合わせを試すという手順になるのではないだろうか?

おそらく,素群というのは成分フロックを集めたものになると考えられるので,集合の直和になっているのではないかという気がするのだが… どうだろうか?この点に関しては,極小部分群分解の結果を見てみればわかる.⇒確かにそのようだ.

A4のフロック検定中に群の検査で落ちる.⇒共役変換検定でエラーが起きている.⇒検定中に台集合をいじるというのはやはり差し支えがある.⇒フロック現数のカウント関数の仕様を変更し,引数で台集合(のコピー)を渡すようにした.

A5のフロック検定でフェーズⅡまで進んだ段階で単位元を除いて12個のフロックが残っている.これらを対にすると6個の部分群が生成され,完全に片がつくことになる.⇒完璧だ.S4の場合は2×9, 3×4で13個までしか取り出せていない.極小部分群検定では#4×7のうち,3個は素群であると認定している.S4ではフェーズⅡとⅢでまったく変化がない.以下はS4の位数4の部分群のリストだ.

[14] 群S4:<17> 位数4 フロック=1 2^1=2〈17〉 合成群 極小 可換 巡回 自己同型 {e,17,7,22} [0,17,0,17]
[15] 群S4:<9> 位数4 フロック=1 2^1=2〈9〉 合成群 極小 可換 巡回 自己同型 {e,9,16,18} [0,9,0,9]
[16] 群S4:<10> 位数4 フロック=1 2^1=2〈10〉 合成群 極小 可換 巡回 自己同型 {e,10,23,13} [0,10,0,10]
[17] 群S4:<1,6> 位数4 フロック=1 2^1=2〈1,6〉 合成群 可換 巡回 自己同型 {e,1,6,7} [0,0,0,0]
[18] 群S4:<2,21> 位数4 フロック=1 2^1=2〈2,21〉 合成群 可換 巡回 自己同型 {e,2,21,23} [0,0,0,0]
[19] 群S4:<5,14> 位数4 フロック=1 2^1=2〈5,14〉 合成群 可換 巡回 自己同型 {e,5,14,16} [0,0,0,0]
[20] 群S4:<7,16> 位数4 フロック=1 2^1=2〈7,16〉 合成群 正規部分群 可換 巡回 自己同型 {e,7,16,23} [0,0,0,0]

どうもかなり厄介な話になってきた.すべてフロック0が関係している.逆に言えば,フロック0を取ることができれば解決する.ただし,フロック0は1箇所にまとめて放り込んであるので,このままではかなりコストが掛かってしまう.逆に言えば,フロックゼロの内容をもっと詳細化(階層化)しなくてはならない.これは原理的にはそれほど難しい話ではないので,やるしかないだろう.

フロック検定でストックに追加されないのはなぜか?登録されるためには,部分群名称という配列が用意されていなくてはならない.⇒部分群の登録という処理を実行する必要がある.A4では位数2と3の部分群がそれぞれ登録された.A5では#2, #3, #5×2の計4個が登録された.

A5では位数5の部分群が6個生成されている.これらは[16, 32], [17, 35], [18, 46], [20, 34], [21, 44], [23, 31]という組み合わせになっているが,これらは実際は2つで一つのフロックだったのではないだろうか?つまり,何かまだフロックとなる条件で見つかっていないものがあるのではないか?この2つのフロックはあるノードのべき順路で繋がっている.ただし,巡回路ではなくeに収束するコースだ.[16, 32]の場合,16→ 32→ 45→ 48→ e となる.

この中には2つのべきループ(16, 48), (32, 45)があるため分離しているが,一つのフロック(というより一つの群)となるべきものだろう.これは結局,べき順路は無差別に連結してよいということだろうか?x^2=yを見るのがよいのかもしれない.


フロック類という概念は導入されたものの…

フロック類という概念は導入されたものの,極大部分群検定の進捗は思わしくない.まだフロックグラフというものをうまくハンドリングできていないように思われる.どうすればよいか?フロックリストは群を生成した時点で作られるもので,不変と考えられるから動的な変化はフロック表に反映されなくてはならないだろう.フロック表はループカウントごとに作り直しているのだから,完全なものができなくてはおかしい.つまり,削除されたフロックの分小さくなっていなくてはならない.フロック表はフロック数を基準に生成されているが,これを実態を反映した動的なものに変える必要がある.

フロックという整数配列でフロック番号とインデックスの変換ができるようにした.また,フロック現数というパラメータでカウントを押さえるようにしたので,正確なコントロールができるようになっているものと思われるが,成績は芳しくない.A4では位数4を一つ,A5では全滅している.群A5は57個の真部分群を持つ■ 位数2X15 位数3X10 位数4X5 位数5X6 位数6X10 位数10X6 位数12X5.少なくとも位数12の部分群は取り出せなくてはならない.

A5:<1,3> 位数12という部分群を見ると, [0,5,5, 0,22,22, 0,29,29, 0,15,15]となっているので,{0, 5, 22, 29, 15}という5つのフロックから構成されていることがわかる.{e,5,9, 14,22,49, 55,51,29,  33,24,15}という構成なので,{1,2,3…}などの削除から入れるはずなのだが… フロックが参照する枝数が少ないなどの条件は部分群を構成するための十分な条件になっていない.同等のフロックがいくらでも存在し,それらを区別する理由がない.

結局,総当り検査をするしかなくなってしまう.温存されるべきフロックとこの[5, 15, 22, 29]には何か特異な点はあるだろうか?あるいは,これらの4フロックを結びつける何かの動機はあるだろうか?合計ではなく,最小枝数で見たらどうなるか?⇒どうもうまくゆかない.F16が真っ先にカットされるようだ.何かよほど巧妙なシナリオを考えないとうまくゆかないと思う.そのシナリオを書く素材が見つからない…2つのフロックF1, F2があるとき,F1F2=F3と言えるだろうか?

A4でフロック数=5, A5では23,S5では48になる.S5で48なら大したことはないように思えるが,もし総当りが必要ということになると,A4で2^5=32,A5で2^23=8388608,2^48= 281474976710656ということになり,尋常な話では済まなくなってくる.せめて,最大の部分群だけでも取り出せればよいのだが…

極大部分群検定をフロック類で解く

群の元集合をフロックと呼ぶ類に分割することができる.すでに実装して動いている.ほぼ完璧と言ってよい.あとはこれを極大部分群と極小部分群の検定に組み入れるだけだ.まず,極大部分群検定から始めよう.極大部分群検定では,フロック1個を削除したところから始めて,群になるまで繋がりのある元をフロック単位で削除するという操作になると考えられるが,この場合,乗積表に空いた穴を塞ぐために元対のどちらをカットすべきかという問題は残るような気がする.確かにフロックを一括解除しているので収束は早まるとは思われるが…ともかくフロックをまとめて解除するところまで作ってみよう.

フロックという同値類を導入したにも関わらず,極大部分群分解はクリーク分割問題になるというところは変化していないように思われる.最大のメリットは群グラフが簡約されて小さなものになっている点だけだ.ともかく,フロックを点とするグラフ=フロックグラフを書いてみるしかないのではないか?フロックグラフを描くためにはまず,その隣接行列が必要だ.これをフロック乗積表と呼んでおくことにする,

何かの理由でコンソールが『詰まる』場合があるようだ.画面がフリーズして何も操作できないので,コンソールに文字入力したら突然動き始めた.


群の台集合を『フロック(群れ)』と呼ぶ部分集合の直和に分割することに成功した

クリーク分割問題が解ければ極大部分群検定は解ける.しかし,クリーク分割問題はNP困難であり,NP完全と同等かそれ以上に難しい問題として知られている.しかし,極大部分群検定には一般の場合と比べいくつか有利な点があるので,それらを利用すればより効率的な解を得られる可能性はあると考えられる.解法を定式化してみよう.

  1. 群の乗積表はグラフの隣接行列とみなすことができる.このようなグラフを群グラフと呼んでおこう.群グラフはすべての点が繋がっているので,つねに完全グラフである.一つの乗積表を共有する部分群グラフが完全グラフであれば,そのグラフの頂点は群を構成する.
  2. 単位元はすべての部分グラフに共通し,必ず存在することが予定されているので,グラフから当初から除外して考える.つまり,群グラフは最大でもN-1点グラフである.
  3. 群には溶接された硬結な結節点が2種存在する.一つは逆数関係による固着,もう一つは自乗巡回路である.これらは一つの点を除去するとすべての点を除去するしかなくなるので,1個のブロックを形成している.従って,これらの元を合併して一つの点とみなすことができる.
  4. 今後はブロックを点に簡約したグラフを主に考える.これを簡約群グラフと呼んでおくことにしよう.また,以下ではブロックを簡約した点をフロックと呼ぶことにする.
  5. 簡約群グラフから頂点(強連結成分,flock)を一つ取り除いたグラフ上で最大の完全部分グラフ(クリーク)を見つけることがテーマとなる.
  6. フロックAを取り除くと,他のフロックBに影響する.x∈A, y,z ∈Bでx=yzであれば,xの除去によってy ないしzの除去が発生し,その結果フロックB全体が除去の対象となる.従って,Aを除去することにより,フロックBもドロップする.
  7. この操作をドロップが生じなくなるまで反復して得たグラフは連結した完全部分グラフであり,それらの元集合は1個の極大部分グラフを構成する.
  8. 極大グラフ検定はすべての個別フロックについてこれを反復することで完了する.つまり,フロック個数分の極大部分グラフ(おそらく同型のものを含め)が生成される.
  9. フロックはブロックではあるが,群ではない.最小のフロックサイズは1で,この場合は x^2=x であるか x^2=e のどちらかである.このようなフロックはローンウルフと呼ばれる.
  10. フロックはフロック番号によって管理される.フロック番号は群の生成時に決定され,元表に記入される.フロック番号はフロックの代表元の元番号であり,1以上の飛び番である.
  11. フロック数とフロック代表番号のリストは群で管理する.
  12. フロックは元集合の排他的な直和であり,群の集合配列を使って生成する.
  13. 極小部分群分解では個別ノード単位ではなく,フロック単位で分解を行う.
  14. 極大部分群分解では,フロック単位に元をドロップすることで部分群を構成する.
  15. このアルゴリズムが確立した後は自乗リスト(べき表)は不要になる.また,元の必須という属性も不要になる.
  16. ローンウルフを放置しておくと面倒くさいので,実装では一括して単位元の預かりとすることにした.

これで完璧なアルゴリズムが確立した.現行論理をこのアルゴリズムでカバーするのは難しくない.⇒極大部分群検定に入る前に,まずフロックの概念が正しいことを検証するためのコードを書いておこう.フロック元分割という関数を作って群のコンストラクタから呼び出すようにしてみたところ,驚くべき結果が出た.Q8の場合すべての元が一箇所に集まってしまう.こんなはずではなかったのだが… いや,やっていることが間違っている.最初にやるべきことは元とその逆数を一元化することであり,べきの関係ではない.


極大部分群検定で行き詰まる

元表をダンプできるようになったが,元の構成を再考してみたい.現行では元.置換表示に置換積を格納するようにしているが,むしろ,置換そのもの(全単射)の方がよいと思う.応用が効くし,乗積表から置換を割り出すとすれば置換の形式になると考えられるからだ.メンバー名も置換表示ではなく,置換でよいと思う.置換プリントで置換積に変換することができる.⇒ただし,データ型が違う.stringの配列だ.置換はいくらでも大きく取ることはできるが,現状ではたかだか7程度なので,MAXを押さえておくことにしよう.

暫定的にcMAXPERMARRAY=7としておく.この定数はPermutationクラスで持つことにしよう.しかし,置換を置換積の形式に変換するのは結構厄介な計算になる.現物の置換の他に,恒等置換の文字列並びが必要だ.置換積への変換という関数を作った.⇒もうひとつ手当しておくことがある.元表はソートされることがあるので,個別の元に番号を付与しておく必要がある.さて,もう一度極大部分群に戻ろう.やることはすでにわかっているので,後は実装するだけだ.

A5の部分群検定で(Count != 部分群数)で停止した.これは昨日S5で起きていたのと同じだ.部分群数は58,Countは60になっている.極大部分群数が加算されている.現行では部分群検定に極大部分群検定は含まれていないので外しておこう.⇒解消した.

▲時間の掛かる処理ではカーソルを砂時計にする.

かなりよい動きになってきたが,まだ完全ではない.特にA4,A5に不審がある.A4,A5では位数3×2を検出しているが,A4の部分群には位数2X3 位数3X4 位数4X1がある.A5は正規部分群は持っていないが,57個の真部分群がある.位数2X15 位数3X10 位数4X5 位数5X6 位数6X10 位数10X6 位数12X5だ.A4は位数4の正規部分群を持っている.極大部分群と正規部分群はかなり近いような印象があるが,A4の位数4の正規部分群を検出できていないのは問題だ.

☆「A5の部分群 ハッセ図」でググったら,13番目にテント村(2023/11/13)が出てきた.投稿からまだ一週間しか経っていない!ハッセ図を出したいのだが… ゼルコバの木で表示することは可能だろうか?ゼルコバの木はハッセ図を描くようには作られていないが,ある程度それらしきものは出せるのではないか?ハッセ図を見ながら考えればかなりわかり易くなると思われるのだが… 群(部分群)をノードとし,部分群の包含関係を親子関係と見立てればハッセ図になるような気はする.ただし,そのためにはすべての部分群をキープする必要がある.現行ではそうなっていない.同型な部分群は代表群を一つ残してそれ以外は破棄されている.A4では8個だが,A5では57個もある.

▲現行では群をダンプするとき,元の集合{}の形式で表示しているが,これを元の置換積表示でも表示できるようにする.⇒部分群の登録のところでは生成元を置換積表示している.

ストック部分群と同型で追加されなかったときは,既存ストックの部分群名を表示してほしい.⇒対処した.

ともかく,極大検定でA4の位数4の部分群(=V)が取れない問題を調べなくてはならない.A4={a, b,…, l}のような元を持っている.V={a, d, i, l}なので,落とされているノードは{b, c, e, f, g, h, j, k}の8個だ.手順からゆくと真っ先に落とされるのはbだが,そこから先の動作をトレースしてみよう.

★★★★登録解除:i=1 peel=b count=0 N=12 台集合=12
登録解除 count=1 N=11 x=b
登録解除 count=1 N=10 x=c
■■■■元対解除:i=1 peel=b 元対=(3, 6) →3 d
登録解除 count=1 N=9 x=d
■■■■元対解除:i=1 peel=b 元対=(4, 9) →9 j
登録解除 count=1 N=8 x=j
登録解除 count=1 N=7 x=f
■■■■元対解除:i=1 peel=b 元対=(4, 7) →4 e
登録解除 count=1 N=6 x=e
登録解除 count=1 N=5 x=g
■■■■元対解除:i=1 peel=b 元対=(7, 8) →8 i
登録解除 count=1 N=4 x=i
■■■■元対解除:i=1 peel=b 元対=(7, 11) →11 l
登録解除 count=1 N=3 x=l
■群A4:~b 位数3〈~b〉 素群 極大 可換 巡回 自己同型 {a,h,k}

削除される順序は,{b, c, d☓, j, f, e, g, i, l☓}となっている.最初のつまづきの石はdだ.競合しているのは{g}だ.gを削除するのが正解であるところ,間違ったカードを引いている.dはx^2=dとなるノードがない.つまり,べき表では(0, 0)となっている.gは(1, 4)だ.この点でdが選択されているが,dのべき先は0つまり単位元だ.しかし,単位元の位数が2になっているというのはおかしい.ベキがeとなるとき,つまりx^2=eのときは位数2としているためだ.間違い易いので単位元はループの外で設定することにしよう.単位元の位数は1であるとした.

競合元対:x=3:d #2 (0, 0=a #1) y=6:g #3 (1, 4=e #3)

べき元が0ということは乗積表の対角線上にそのノードが現れないことを意味している.これはその意味では削除し易い条件のようにも思われるのだが,単位元に直結している位置でカットしたら根こそぎ倒されることは間違いない.この意味では最優先されるのは位数ということになる.書き直してみよう.⇒修正して以下の結果になった.

■群A4は3個の極大部分群を持つ■ 位数2X2 位数4X1
■群A5は3個の極大部分群を持つ■ 位数4X1 位数6X1 位数10X1

A4は8個の真部分群,位数2X3 位数3X4 位数4X1なので,まぁまぁというところ.A5は57個の真部分群,位数2X15 位数3X10 位数4X5 位数5X6 位数6X10 位数10X6 位数12X5 なので,まだまだだ.位数12が出てこなくてはならない.

S4~bをダンプしようとして例外が起きた.置換構成が空だ.⇒チェックして空テキストで補充するようにした.

元のオブジェクト化と元表のダンプ

極大部分群検定の書換えを進めているところだが,その前にやや大仕事になってしまうが,元のオブジェクト化というのを片付けておくことにする.現行では元は台集合に格納された名前だけで管理しているが,これを独立のオブジェクトとして管理しようという発想だ.これができるとさまざまな元の属性を一元管理できるようになるのでかなり都合がよい.また,元の位数などの新しい属性の追加も容易にできるようになる.おそらく現在使っている部分集合[,]などは廃止できるようになると思われるが,当面は並立のままとしておこう.置換リストのダンプも元表のダンプに代わるはずだ.

image

▲Q8の極大部分群として位数4の部分群を2個取り出すことに成功したが,「j」を除外した部分群が出てこない.i, k と条件はまったく同じであるはずなのだが… いや,i と k は出ている.おそらく,ブランクセルの解決で同型部分群を引いてしまったのだろう.

どうもなかなかうまくゆかない.ブランクセルの元対を2つに分けてそれぞれで検定するようにしてQ8の場合だけは解けたが,それ以外ではまったく無力だ.再帰的に下降してすべての場合を尽くせばこの方式でも解に到達することは不可能ではないが,コストが掛かり過ぎる.削除対象ノードの逆元を削除するという方法はまだ試していないのでやってみる価値はあると思うが,その前に群のコンストラクタで位数と逆元および自乗元を拾い出しておくことにする.これをやっておくといろいろ便利なことがあると思う.

A5の極大検定を実行して,乗積表[32, 32]が空になっている.⇒群表に穴が空いている.群の再構成でエラー復帰するようにした.

Q8の部分群検定→群の検査で例外が発生した.⇒N=4のところ,元集合は1しかない.⇒部分群検定のように元が逐次追加されるような群ではあらかじめ元集合も大きめに作っておく必要がある.⇒対処した.

▲S5の部分群検定で(Count != 部分群数)で停止した.