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

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

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

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

乗積表を表示できるようになった

GridViewで乗積表を表示できるようになると使い勝手はかなり向上する.大きなテーブルが広がっているコンソールには見たくない.この際,久留島喜内の道具箱を丸ごとC#にインポートすることも考えてみたが大仕事になってしまうので,やや後退して,とりあえずC#に変換済みのForm2のコードを参考に,現状で乗積表を主画面に表示することにする.べき剰余マトリックスではテーブルをいろいろ加工して表示しているが,いまのところプレーンなテーブルが表示できれば十分だ.

喜内の道具箱の使い方まで忘れてしまった.このツールではマトリックスを2枚開けるようになっている.片方は「べき剰余マトリックス」,もうひとつは「べき乗進数表示マトリックス」と表示されている.おそらくこれは仕掛りになっている「加納の定理」と関係するものだろう.いずれ,ここにももう一度立ち返らなくてはならないが,とりあえずパスして先に進むことにしよう.

MatrixⅠのボタンを押したときの動作が分かればよい.BulldMatrixClickではBuildMatrix→BuildPowerGridが実行される.BuildPowerGridに引数で渡されるのはMatrixクラスのインスタンスでこの中にはいろいろな情報が入っているが,配列そのものはInt64の2次元配列だ.配列の行/列数とグリッドの行/列数は指定できる必要がある.いや,これらは現物の配列を直接参照して取り出すこともできる.配列とマトリックスはつねに同サイズでよい.従って,BuildPowerGrid だけ見ておけば十分だ.⇒一応出るようになった.⇒少し手直しして下図になった.

image

左端の行ヘッダが余分だ.非表示にはなっているのだが,これを消す方法はないものか?⇒できた!デザイナ画面でRowHeadersVisibleをFalseにして消せた.完璧だ.もはや言うことなし.

image

とりあえず,これ以上の機能は必要ない.A5くらいになると描画までにかなりの時間が掛かるが小さい乗積表なら即座に出る.

image

それにしても時間が掛かる!S5の乗積表が描画されるまでに1分近く掛かっている.なんとかならないものか?⇒BindingSourceというのを使うと高速化できるという記事があった.

https://qiita.com/belre/items/4650c68ef932acbc597e

使わないときには2873ms掛かったものが,使うことで9.4msになったと言う!AutoSizeModeもNotSetなどにすべきとある.確かに列幅を固定すると一瞬で描画できる.ただし,列幅を指定する方法が見つからない.以下で設定できた.列ごとに幅を設定する必要がある.

for (j = 0; j < n; j++) matrix.Columns[j].Width = 24;

この環境では精々S5くらいまでしか扱えないが,S5で120だからこれで十分間に合う.乗積表は一応これで完成としておこう.かなり気持ちがいい.もうひとつの改善点として,部分群をダンプして表示したい.つまり,部分群配列をソートしたい.現状,部分群のダンプでは素群と合成群の別も表示されていないが,これらも出してみたい.正規部分群/巡回群の別も出すべきだろう.群クラスにはこれら属性を格納しておく場所がない.群属性という項目を設けてビットを立てることにしよう.

群クラスの変数のうち,べき表は参照されていないので廃止できる.最大部分群も部分群検定の中でしか使用されないから廃止でよい.これは極大部分群検定の結果を反映することを考慮したための措置だが,とりあえず切り離されているので廃止とする.最大極大部分群というのも使われていない.subGN,可換群,部分集合などもローカル化できるような気がするが,保留としておこう.属性には以下が含まれる.

  1. 可換/非可換
  2. 巡回群/非巡回群
  3. 正規部分群
  4. 素群/合成群
  5. 単純群

群.親群は群のコンストラクタで設定するように仕様変更した.親群が判明すれば群の検査の中で正規部分群の判定ができる.

▲正規部分群検定で ◎群Q8は4個の非自明な正規部分群を持っている 位数2X2 位数4X6 のように表示されるが,あまりよくない.正規部分群に限定したカウントを表示した方がよい.⇒どうも怪しくなってきた.Q8の部分群は4個で,#2×1, #4×3と表示されているが,正規部分群検定では8個の正規部分群を持つとされ,#2×2, #4×6のように表示される.⇒正規部分群検定では同一判定をやっていないのではないか?同一群判定は部分群の追加と部分群検定ではやっている.

これはどうも部分群の追加操作に誤りがあるように思われる.正規部分群検定では部分群の追加を実行した後に,正規部分群数を更新し,部分集合やsubGNを書換えているが,この操作は怪しい.極小部分群ではそのようなことはやっていない.極大部分群でもそのようなことはやっていない.部分群検定でもやっていない.明らかにこれはおかしい.これは明日見ることにしよう.来訪者カウントが16万を超えた.何はともあれ,おめでたいのではないか?

image

群の検査に巡回群判定を追加した

かなりいいところまで来ている.ツールとして十分実用になるレベルだ.同型判定に自信が持てるようになってきたので,群の検査を充実させれば次の課題である共役に移れそうなところまで来ているが,素群についてもう少し知りたいので,極大部分群と並立して極小部分群検定というのを導入しておくことにする.極小部分群というのは我々の用語では「素群」を意味するが,ここでは一般的な用語を使っておこう.

また,Console.WriteLine(“\n★極小部分群検定:”+Form1.Group.名称);でハングしている.タイミング的なものが関係しているのだろうか?今度は動いている.

極小部分群分解は一応動くようになった.かなり分かり易い.たとえば,A5は#3×10, #5×6で16この素群を持っているが,同型な部分群を除くと2個しかない.素群数をカウントしていない.⇒対処した.

群の検査で群が巡回群であるか否かを判定する.⇒素数位数の群は巡回群である.「自乗元とならない元が単位元を除き1個しかない群は巡回群である」と言えるかどうか?多分言えそうな気はする※.素数判定ルーチンを久留島喜内から持ってこなくてはならない.喜内では複数の素数判定ルーチンを持っている.IsPrimeはTotientFuncを使っている.FactoringSubでは因数分解を実行している.どちらも高速化するためにかなり技巧的なことをやっている.⇒こちらではそれほど大きな数を扱っていないので,簡単なルーチンで済ませることにしよう.

※位数3のA3は反例である.{e, 1, 2}のとき,1^2=2, 2^2=1で2乗元を持たない元の個数=0だが,この群は素数位数なので巡回群だ.逆にscount=0なら巡回群と言えるだろうか?この項目はちょっと保留ということにしておく.⇒巡回群の定義に従って修正した.

https://qiita.com/asksaito/items/76b71602dd956b79dbf7

S4の部分群分解を実行して部分群検定で停止した. (Count != 部分群数)になっている.Count = 28, 部分群数=29.おかしい.再現しなくなってしまった.⇒いや,再現できる.極小部分群の戻り値を部分群数から素群数に変えたためだ.素群数には単位群が含まれていないためだ.部分群数には単位群が含まれている.

◆DataGridViewに乗積表を出すことにしよう.乗積表が別に出せるようになると,コンソールもすっきりして見易く・使い易くなる.⇒久留島喜内のForm2を丸ごと移せば,ほとんどの機能がそのまま使える可能性があるので,コード変換を試みた.ネット上にも変換ツールは転がっているが,Code Converterというプラグインがあるので,インストールしてみた.かなりのエラーが発生する.コード部のエラーは手直しが効くが,デザイナー部のエラーは修復が難しい.どうせやるのなら,久留島喜内を丸ごとC#に移植した方が分かり易い.

ただし,これはかなりの大仕事になる.前回のELSIEですでにVB→C#変換というのは経験しているが,ELSIEはコンソールアプリなので修復も大した手間が掛からなかったが,道具箱はツールが満載のフォームなので作り直すしかないかもしれない.VBはもうじき廃盤になるという話もあるので,C#に移行しておくというのは正しい選択ではないか?

かなりいろいろなことができるようになった

準同型検定というのは予想より難しい.これは後から考えるとしてまず,同型検定から片付けよう.wikiには「共役部分群は同型であるが、同型な部分群が共役であるとは限らない。」という記述がある.これは同型⊂共役という我々の観察と一致しないのではないか?以下のリンクでは,A5の位数6の部分群は互いに共役だが,異なる3つの同型類に分割されるとしている.

https://www.facebook.com/groups/2354748741306929/posts/6802031046578654/?comment_id=6805344309580661&reply_comment_id=6806265776155181&mibextid=zDhOQc

wikiには「アーベル群は同型な 2 つの異なる部分群をもつかもしれないが、それらは決して共役でない。一方でシロー部分群は互いに共役である」のようにある.可換群はあまり登場しないが,Vは位数4のアーベル群で3つの位数3の部分群を持っている(これらはすべて正規部分群)ので,試してみることにしよう.⇒すべて共役となってしまった.共役と同型は包含関係ではない(交叉する場合はある)とすれば問題は解消するが,いまのところ同型で非共役という事例は見つかっていない.

◆共役関係で台集合を同値類に分割するということをやってみる.

◆群の検査では群の情報をできるだけ表示する.たとえば,群の置換表示,正規部分群,極大部分群など.共役な部分群の表示,親群

▲button5_ClickでConsole.WriteLine(“\n同型判定:{0}”, testname);の中でハングしてしまう.⇒Console.WriteLine(“\n同型判定:”+testname);の形式に書換えたら動作するようになった.

https://mathlandscape.com/normal-subgroup/

n↦gng^−1のような変換を「共役変換」や「相似変換」や「内部自己同型」と言ったりする.正規部分群とは共役変換しても不変な部分群である.つまり,gNg^-1=N.

同型判定は大体動作している.たとえば,S3の正規部分群S3:<3>とA3が同型であることが判定できる.

「置換リストを使わない」というオプションで例外が発生した.対象はA4で部分群検定の初期化→部分集合[0] = new string[] { e };でエラーが起きている.Nが0になっている.A4を使うためには,まず置換群の生成で群が生成されなくてはならないが,その前にS4の置換を生成することが必要だ.どうも置換の生成で失敗しているようだ.置換リストを使わないというオプションでも生成できなくてはならないのだが…

Permutation.Createが動作していない.⇒置換群は通常のやり方で生成し,群同型判定のときだけ「置換リストを使わない」ように切り替えることで一応動作するようになった.しかし,いずれにしても,位数の異なる群の準同型写像は確立されていないので,検定にはなっていない.⇒いや,位数が異なる場合にも対処しているはずだが,台集合が書換えられていないように思われる.⇒いや,すべての置換を試している.一応検定にはなっていると思う.いや,やはりおかしいような気がする.L1とL2の長さが異なるということは写像になっていないのではないか?

長さが同じでもすべての置換を試してみるしかない.長さが異なるときにはさらに膨大な組み合わせが発生する.この検定では位数が同じ場合に限定するしかない.マップは冗長構成になっているので,実長が一致しない場合は棄却するしかないと思う.写像クラスはそのような前提で作られていると思われる.実際,nという値はmap1と2で共有されている.⇒群同型判定は(A.N != B.N)で抜けるようにした(復活).

まだ,おかしなところがある.A3とA4:<b>は同型になるが,L1の長さが6もあるのはなぜか?Aの台集合に{a, b, c, d, e, f}が入っている.かなりおかしい.A3の台集合が間違っている.A3は外部で生成されているだけなので,設定に誤りがあるのではないか?いや,A3は元々位数6の群だから台集合は間違っていない☓.Nがおかしい.置換群の生成でやり損なっているのでは?確かにそのようだ.かなりまずい.どうも,置換の個数と位数を混同している気配がある.A3の置換は置換数3でよいはずだ.S3の置換が6でその半分だから3になるはずなのだが… いや,置換はm=3, n=3だから合っている.間違っているのは台集合だ.

S5の位数と台集合サイズが一致していない.m=120に対し,台集合は121になっている.一つ多過ぎる.⇒修正した.

部分群リストに追加:で位数を表示する ⇒対処した.本ツールでは位数を#xxの形式で表示している.orderと#(No.)は親近性がある.

位数が等しくない場合には準同型検定ができないとすれば,同型検定と結果は同じになる.準同型検定は不要なのではないか?準同型検定ではすべての置換を生成して準同型写像を探している.それが不要になるというのは結構なことだが,果たして同型検定だけで十分なのかどうかまだ見極めが付いていない.同型検定の中では準同型判定を使っているのだが,どのような写像でも同型になるとは限らないと思われるのだが… いましばらく,このままで検定を続けることにする.かなりいろいろなことができるようになってきた.

A5の位数6の部分群をチェックしてみた.どうもこれらは同型であるような感じだ.同型判定では非同型となるが,準同型判定では準同型写像を見つけている.同型であるものを非同型と結論することはできないから,準同型検定を廃止するのではなく,むしろ同型検定に準同型検定を持ち込むしかない.同型検定は簡易検査として論理を残しておいて,非同型となったときだけ準同型検定を実施すればよい.これによって,準同型検定は正式に廃止できるが,まぁ,当面形だけは残しておこう.

同型検定まではこなせるようになった!まだあちこち未整備のところがあるので,きれいにしてから共役に移ることにする.

部分群の登録に関してはほぼ実装完了した

部分群の登録に関してはほぼ実装を完了した.部分群分解は基本的に完全分解(すべての部分群を網羅)であるはずなので,その後に正規部分群検定や極大部分群検定を実施しても登録は増えないはずであるのに,S4の生起部分群で追加が発生している.S4の真部分群は28個でうち7個がリストに追加されている.S4は正規部分群を2つ持っているが,同型なので登録は1個に留まる.いずれもS4-3は位数12の非可換群,S4-7は位数4の可換群,台集合は{a,h,q,x}だ.

いや,おかしい.S4の部分群分解でS4-7とまったく同型というより同一の部分群が生成されている.[28] S4:<h,q> #4〈h,q〉{a,h,q,x} 可換 どうも群の登録処理に抜かりがあるようだ.

S4の部分群分解では正規部分群を合成によって生成しているので,名前はS4:<h,q>のようになっている.S4:<h,q>がリストに登録されていない!なぜだろう? 群S4:<b,g>と群S4:<h,q>は位相同型 位数=4 で落とされている.UpdateStockでは同型判定ではなく,台集合の比較しかやっていないので,完全に一致したものしか弾かれない.S4:<b,g>は:<h,q>と同型ではあるが,正規部分群ではない.つまり,位相同型でもある部分群は正規部分群になり,他は正規でないということが起こり得る.どうもかなり厄介な話になってきた.この意味では動作的には追加する方が正しいようにも思える.台集合検査だけでなく,位相同型検査を実施すれば同型という結論になるはずだが,正規部分群が消えてしまうというのもまずいような気がする.

もうひとつ,群S4:<j>と群S4:<h,q>は同型ではないが共役 A.N=4 B.N=4というのも出ている.<b,g>と<h,q>はどちらも<j>と共役だ.共役とい理由で篩い落としていたら,<b,g>も落とされているところだった.とりあえずここは,現行仕様でよいということにしておこう.さて,懸案の同型判定の実装に移ることにする.

部分群分解はほぼ予定通り動くようになった

正規部分群と極大部分群もリストに登録して検定対象とする改修を行っているところだが,直すところはまだあちこちある.現行の部分群検定は最初に極小部分群を求めてからそれらを合成して部分群を列挙する方式になっているため,再帰的に下降するという場面は存在しないが正規部分群ではそれをやっているため,改造が必要になる.極大部分群検定を再帰的に実行するのはあまり意味がないので,まず,こちらから片付けることにする.⇒一応極大部分群検定は動作しているが,まだ部分群の追加登録はできてないない.

リストに登録された部分群の個数を画面に表示する.

Q8の正規部分群検定で例外が発生する.部分群配列が空になっている.

極大部分群検定では単位群が拾われることがある.たとえば,S2の場合.

部分群の登録の論理はややイレギュラーなところがある.ループ範囲がn-1になっていたため,収納漏れが発生していた.この論理はもう一度点検する必要がある.⇒極大部分群検定の部分群登録は大体動くようになったが,問題がある.①群名の決め方があいまい,②生成元があいまいの2点だ.これについては別途考えることにして先に進もう.一応動いているので,正規部分群の分を整備することにする.

部分群検定を実施後,極大検定を行って追加登録というのはおかしい.すべての部分群は出揃っていたはずなのではないか?A5<3, 13>という部分群だ.⇒群でないものを追加登録している.現行の極大検定では一律の方式で極大部分群を生成しているので,群にならない場合がある.これを登録から弾く必要がある.群の検査の結果で判定する.

群にならないものは破棄するようにしたが,まだ同じ問題がA5<1,12>で起きている.この部分群は位数3の可換群だ.勘違いしている.この部分群は群A5:<1,12> の部分群A5:<1,12>の極大部分群<再構成>だ.つまり,A5の部分群の部分群であり,A5の部分群ではない.しかし,やはり不審は残る.この件は別途点検することにする.

A5の部分群検定のあと,極大検定を実施して置換テキストで例外が発生した.障害は置換テキストで起きている.生成元が入っていないためだ.入口検査で弾くようにした.

群の命名とそれに関わる生成元の特定に付いて考える必要がある.そもそも,群の生成元というのは一意に決定できるものなのだろうか?「一般に群はある自由群の全射準同型像なので必ず表示を持つが、それは一意的ではない」とされる.おそらく,一番確実なのは群をハッセ図で表示することだろう.カノニカルなハッセ図を描くことができれば,群の構図は一意に決定できると言える.

ともかく,正規部分群検定の整備を急ごう.正規部分群については,まだよくわかっていないので,正規部分群をさらに再帰的に分解することは行わず,一段だけのフラットな検定で終わることにする.これまでの論理はどこかに温存しておいた方がよい.

Q8の正規部分群分解で例外が発生する.部分群配列が空.部分群数は4になっている.

部分群検定を実施して,部分群[0]が空.これは入れておいた方が無難ではないか?

検定中はその検定で生成された範囲で同型検査すればよいが,部分群の登録では少なくともその親群の部分群内での同型を検査すべきだろう.しかし,親群の部分群は検定のたびにそのつど作り直しているので,網羅的ではないし,それ以外の部分群リストは持っていない.⇒親群は検定用の部分群配列と最終結果を格納する配列の2つが必要なのではないか?あるいは,登録時に名前のチェックだけでなく位相同型検査まで行えば万全かもしれない…

しかし… 位相同型でも乗積表レベルで一致するとは必ずしも言えない.これもここでは保留事項としておこう.いずれにせよ,少なくとも同じ親の部分群で同一乗積表を保持している場合は完全に同一と見るしかない.⇒少なくとも親が同じで台集合が一致すれば乗積表を見るまでもなく同一と認定できる.そこまではやっておいた方がよい.⇒実装したが,いろいろ問題がある.そもそも設計が悪い.現行では部分群という配列を持っているが,それ以前の成り行きから情報が分散してかなりまとまりの悪いものになっている.部分群名称で登録候補を列挙しているが,これも群番号で管理すべきだった.とりあえず,仮修正として名前から群を引けるようにしてみる.

A5の正規部分群で例外が発生した.”A5:<1>”という部分群が部分群に入っていない.部分群名称配列はサイズ9あるが,部分群数は1しかない.部分群名称を初期化していないのではないだろうか?⇒そのようだ.大体動作するようになった.

一度部分群分解するとその中には正規部分群も極大部分群も含まれるようになった.つまり,完全分解ができている!部分群の名前付け,特に極大部分群の命名の問題はあるが,大体整ったように思われる.

◆部分群リストに追加のところで,部分群の属性(正規,極大など)が表示できるとよい.部分群分解でも内訳として素群と合成群の統計を出したい.あるいは部分群のダンプでもよいが… A5のところで見ると位数5よりも大きい素群は出ていないように思われる.もしかすると,素群は最大でも5ということになる可能性もある.⇒群の検査で置換リストをダンプするか,ないし,置換リストボタンを設ける.

▲部分群登録で現在の選択行が最下行になるという動作はうれしくない.追加登録でソートしているためと思われるが…

一応まぁまぁの動作になってきた.明日は2つの群の同型判定を組み込めるだろう.登録リストでチェックできるようになっているので,実装はそれほど難しくない.

▲S5の群の検査でかなり長いブランクが入るのはなぜか?

画面が混み合ってきたのでタブを導入した

A5の部分群分解で位数6の部分群は10個出てくる.これら10個はすべて共役とみなされているようだが,糸巻きでは同型ではない2つのグループに分かれる.いまのところこの判定が絶対正しいとまでは断定できないが,その可能性は高いと思う.部分群の追加登録で位数まで出せるようになったが,これに付け加えて①置換積表示と②同型な部分群の個数を表示できるようにしたい.

同型な部分群の個数はすでに同型[]という配列に収集している.いや,違う.同型[]という配列はローカル変数だ.しかし,この形式で収集するのが一番早そうなので,親群で統計を取ることにしよう.⇒いや,やはり個別に持つことにしておく.以下のような出力になった.

部分群検定→部分群の登録:追加件数=9
(1) 群A5 の部分群A5:<1> 位数=3 同型=10 (345),
(2) 群A5 の部分群A5:<3> 位数=2 同型=15 (23)(45),
(3) 群A5 の部分群A5:<16> 位数=5 同型=6 (12345),
(4) 群A5 の部分群A5:<1,3> 位数=12 同型=5 (345),(23)(45),
(5) 群A5 の部分群A5:<1,12> 位数=6 同型=4 (345),(12)(45),
(6) 群A5 の部分群A5:<3,8> 位数=4 同型=5 (23)(45),(24)(35),
(7) 群A5 の部分群A5:<3,12> 位数=6 同型=3 (23)(45),(12)(45),
(8) 群A5 の部分群A5:<3,13> 位数=10 同型=6 (23)(45),(12)(34),
(9) 群A5 の部分群A5:<3,40> 位数=6 同型=3 (23)(45),(145),

https://groupprops.subwiki.org/wiki/Subgroup_structure_of_alternating_group:A5

上のURLの記事によると,A5の部分群は,#1=1, #2=15, #3=10, #4=5, #5=6, #6=10, #12=5, 10=6, #60=1となっている.上のダンプと比較すると,位数6以外はすべて一致している.#6の場合,糸巻きでは同型=4+4+3 =10に分裂しているがトータルでは一致する.上記記事では#6の部分群を「twisted S3 in A5」と名付けているのでおそらくS3と同型ないし準同型なのだろう.2つの群の同型検定ができればこの辺りもはっきりすると思われるので,実装を急ぐことにしたい.

部分群を位数でソートしたいのだが,そうするとテーブルと部分群番号の不一致が発生してしまう.⇒ソートした後,番号の振り直しを実施すればよいのではないか?多分それしかないと思う.コンボボックスにチェックを付けることは可能だろうか?それができれば複数選択してそれらの群同型検定を実施できる.CheckedListBoxというのがある.

試しに導入してみた.確かに複数選択は可能になるが,かなり使い勝手が悪い.リストがドロップダウンするのではなく,右端のボタンをコチコチ押さなくてはならない.ツールを広げてやるとスクロールバーが現れてかなり楽に操作できるようになる.選択1と選択2という2つのパーツを出すのよりは気が利いているかもしれない… これを使うことを考えてみよう.⇒グラフと行列,群をすべて一画面で賄うというのは無理なのではないか?せめて,タブで切り分けるくらいのことをしないと扱いきれない.こんな感じになった.

image

項目の選択とチェックは独立の操作だ.複数選択する必要がない処理のときは,青色の選択行を対象項目とすることにする.複数選択が必要な同型判定などではチェックを用いることにすればよい.これならかなり分かり易い動作になる.

◆正規部分群分解や極大部分群分解で生成された部分群も登録の対象とすることにしよう.

追加登録した部分群が操作できない.群の検査などまったく動作しない.Form1.Groupが空になっている.SearchStockに失敗している.ストックに入っている群と名称が合わない.ストックには追加されてはいるのだが… 部分群名称と部分群は構成が同じではない.部分群を名前で検索するしかないのではないか?⇒対処した.きちんと動作している.

▲正規部分群と極大部分群にも追加登録を組み込んだが,その前段階で未処理の部分がある.正規部分群では部分群が生成されていない.正規部分群検定は再帰実行されるようになっているので,その上位関数が必要だ.⇒正規部分群検定はフラットな検定でよいのではないか?