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

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

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 != 部分群数)で停止した.


巡回群が生成できるようになった

巡回群の生成に移ることにしよう.巡回置換の元は(a1, a2, …, am)の形の置換であると考えられる.従って,元の個数はmで置換リストの長さと同じはずだ.事例を見てみよう.⇒上記の定義で問題ないと思う.⇒実装した.一応動いているが,群の検査の表示が少しおかしい.すべて合成群になっている.また,C4は巡回群ではないとされる.群の属性ではデフォルトが合成群になっているので,合成群と出てくるのはとりあえず,やむを得ないかもしれない.巡回群であっても必ずしも素群であるとは限らないはずだ.

C4の群属性がおかしい.非巡回群となっている.⇒ecountがインクリメントされていない!⇒修正した.

巡回群の生成はおおむねうまくいったようだ.少なくとも位数が素数であれば,すべて巡回群であり,かつ素群であるとしてよいのではないか?⇒これで,少なくともC2, C3, C5に関しては「素群」表示が出せるようになった.今のところ,部分群分解をしないと素群であるか否かの判定はできないようになっているが,非自明な部分群を持たないことが判明した時点で属性を「素群」とすべきだろう.ないし,極小部分群検定でそれをやってもよい.

Q8<i>が素群になっているが,分解できる.これはまずい.⇒現行では極小部分群で抽出された部分群はすべて素群であると推量しているが,どうも間違っているようだ.Q8<i>はQ8の部分群ではあるが,極小ではない.これはかなり困ったことだ.追加登録の論理を見直さなくてはならない.⇒いや,論理を見直すのではなく,用語の定義を見直すことにする.素群というのは部分群に対する定義ではなく,群に対する定義であると考える.つまり,分解できない群が素群である.

極小な部分群というのはある群の部分群についての定義であり,「極小な部分群とはあるノードを含みそれ以上ノードを減らすと部分群でなくなるような部分群」とする.同様に,極大な部分群は「あるノードを含まない部分群でそれ以上ノードを追加すると部分群でなくなるような部分群」であるとする.つまり,正規部分群などと同様「部分群としての属性」である.これなら現行論理のままで行ける.ただし,極小と極大という属性を追加しなくてはならない.

正規部分群は共役変換検定というテストで判別できるが,極小・極大はおそらく極小/極大部分群の抽出によってしか検出できないのではないかと思う.これは仕方ないだろう.素群の反対は合成群だが,極小ないし極大と素群は並立するだろうか?素群で極小でないということはあり得ないが,極小で素群でないということはある.また素群で極大ということもあるのではないか?⇒極大部分群検定は極大部分群の抽出に改めた.大分正確になったのではないかと思う.

いよいよ,極大部分群検定だ.

これまで素群と表示していたところを極小部分群に改める必要がある.⇒素群数を極小部分群数に一括変換した.素群数が必要な場合は別途集計する必要がある.

既存の極大部分群検定はリネームして別途立て直す必要がある.多分,極小部分群の抽出の逆操作になると思われる.⇒追加登録は引数で群Gを渡している.登録解除はGの上で操作している.これはまずい.追加登録と登録解除が双対になるように作り変えるべきだ.

極大部分群検定は原理的に破綻している

ボタンの配置を変えたはずなのだが戻ってしまっている.なぜだろう?どこかでバージョンが入れ替わってしまったのだろうか?⇒バックアップにも残っていない.作り直すしかない.

image

この方が使い勝手がよいと思う.部分群分解・正規部分群が並び,極小・極大を並べて群検査と同型判定を右手に配置した.

正規部分群の集計に不審な点がある.見直しが必要だ.Q8は4個の真部分群を持っている.#2×1, #4×3.リストにはこのうち,Q8:<-1>とQ8<i>が登録される.Q8は4個の非自明な正規部分群を持っている.Q8:1,Q8:2, Q8:4, Q8:6.最初のQ8:1は位数2,それ以外は位数4で,これらは部分群分解の結果と一致する.ここで,Q8:1とQ8:2を登録しようとしているが,登録済みであるため新規追加された部分群数=0となっている.これらの動作はおおむね正しい.

従って,問題は◎群Q8は4個の非自明な正規部分群を持っている 位数2X2 位数4X6というところのみと考えられる.これはおそらくsubGNで重複カウントしているためだろう.部分群の追加で一律subGNをカウントアップしているところに正規部分群で再カウントしているためだ.subGNは発生点でカウントアップするようにした方が間違いがないと思われる.⇒対処した.動作しているようだ.

▲極大部分群検定は仕掛りとなっており,まだ仕上がっていない.Q8の極大部分群検定では位数2の巡回群が極大とされているが,それ以外は見落とされている.位数2の部分群が極大というのはそれ自体誤りであるように思われる.A2, A3, A4は極大部分群を持たないとなるが,これもおかしい.A3は巡回群であり,素群であるから極大部分群を持たないというのは誤りではないが… 極大部分群を持たない⇔自明な部分群を持たないでなくてはならない.

▼正規部分群はあるノードを含む部分群として生成されているので,生成元を特定できるはずだ.部分群名称の命名規則を統一した方がよい.しかし,seedが同じでも同一群になるとは限らないのではないか?たとえば,A4では(3)[8]⇒〈d,i〉{a,d,i,l}は位数4のA4の合成群(正規部分群)となっているが,正規部分群検定ではそこまで解析できないのではないか?⇒暫定現状のままとする.

A4の正規部分群のカウントがおかしい.◎群A4は2個の非自明な正規部分群を持っている 位数4X1と表示されているが,正規部分群は1個のはずだ.⇒正規部分群数が初期化されていなかった.

S4で部分群分解のあと,正規部分群で追加が発生している.⇒これは多分そういうルールになっているためと思われる.位数4のS4:7が追加されている.しかし,位数12のS4:3は正規部分群だが追加されていない.S4で位数4の部分群には<j>と<b,g>がある.位数12は<d,h>{a,d,e,h,l,t,x,u,p,q,m,i}だ.S4-3の台集合は{a,d,e,u,p,l,t,m,i,h,q,x}で<d,h>と一致するが,S4-7の台集合{a,h,q,x}は S4:<h,q> #4〈h,q〉{a,h,q,x} とは一致するが,登録された#4の部分群とは一致しない.これはこれでよいとするしかないのではないだろうか?⇒とりあえず,よしとしておこう.

ここまで来ると極大部分群検定の未整備が目立ってくるので,取り掛かることにする.いまのところ極大部分群検定は一部の場合にしか適用できないが,すべての群を対象とするように改修しなくてはならない.それにしてもQ8で位数2の極大部分群というのはかなりおかしいので,まずここを見ておこう.⇒この動作はルールに沿ったものになっている.つまり,べき表でy^2=xとならないxを削除するというルールだ.x=y^2となるのは,1と-1だけなので,この2つだけが残って「極大部分群」を名乗ることになる.つまり,現在の極大部分群検定は原理的に破綻している.というか,仮に適用できたとしても限りなく狭い範囲にしか適用できないように思われる.

確かに,S5やS4などには適用できているのだが… どういう場合に適用できるのかを見極めるのはかなり難しいような気がする.その前に部分群のソートを片付けてしまおう.ソート後は,部分集合,部分群生成元,生成元,可換群は無効になってしまうので,とりあえず null を格納しておく.⇒群の検査の中ですべての属性をチェックするように整備したが,部分群検定では群の検査が呼び出されていない.

Q8の極小部分群検定では<k>は極大部分群と表示されるが,ダンプでは素群となっている.この表示は部分群検定で出している.カウントが間違っている.1を足し込む調整が必要.

A3の極小部分群検定で■群A3はの後が続かない.⇒対処した.

◆ボタンを押して置換リストをダンプするようにしておこう.⇒出せるようになった.下図↓

image

大体使えるようになったのではないかと思う.いよいよ極大部分群を詰めるというところではないだろうか?何かやり残しはあるだろうか?可換群など不要になった変数もあるのではないか?一応バックアップを取ってからにしよう.部分群生成元も廃止してよいのではないか?個別の群に置換表示というパラメータがある.巡回群判定,可換群の検査,自己同定検定,共役変換検定も群の検査一箇所で行えばよい.⇒対処した.もう一つ,巡回群の生成というのがある.これは明日やろう.

★共役で同型でないというサンプルはあるだろうか?