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

巡回群の生成に移ることにしよう.巡回置換の元は(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に失敗している.ストックに入っている群と名称が合わない.ストックには追加されてはいるのだが… 部分群名称と部分群は構成が同じではない.部分群を名前で検索するしかないのではないか?⇒対処した.きちんと動作している.

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

部分群を登録しリストから選択する

部分群検定で生成された部分群を登録し,リストから選択できるようにするという改修を行っているところだ.すでにある程度まで実装完了しているが,起動時にPermuteで例外が発生する.

image

現行では「置換リストを使わない」設定になっているが,Form1.Homoがnullのままだ.Homoを設定しているのは2箇所しかない.準同型検定ボタンが押されたときと,群同型判定が実行されたときだ.HomoというのはForm1の静的変数で準同型クラスのインスタンスだ.準同型には群A, Bと写像が入っている.しかし,これは自動的には生成されない.⇒Homoがnullのときにはパスするようにしておこう.

今度は別のエラーが出た.

image

準同型検定でもエラーになる.

image

なぜだろう?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が追加されている.なかなかいい感じだ.

image

ストック配列に登録していないので,まだ現物にはアクセスできない.ストック配列をリサイズして収容するようにした.⇒動作するようになった.多分これで問題ないと思う.部分群のうち,位相同型のものは省いて,代表的な部分群だけが登録されている.名称が同じ群は登録されない.位相同型でも共役でない場合というのがあり得るので,準同型判定ではなく,共役変換検定を使った方がよいのかもしれないが,当面はこれで運用してみることにする.⇒準同型検定の中で共役変換検定を実行している.(共役でない場合)結果を表示するようにしておいた.

一通り動くようになったが,まだ未整備のところがある模様だ.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個あるが,それらはすべて共役ということになっている.どうもどこか間違えているような気配だ.


部分群検定をフィックスする

CSに移ってから「準同型検定」というクラスが追加されている.いくつかのpublic変数とサブルーチンが入っているだけだが,準同型検定をクラス名として使うというのは適切でないし,準同型という既存クラスがあるのだから,廃止してもよいと思う.namespaceに関数を置くことはできないので,とりあえずForm1に移してみよう.

▲A4→Vの準同型検定で例外が発生した.メモリ不足が起きている.準同型判定では起きない.全単射の生成でメモリを使っている.「置換リストを使う」をオフにすれば回避できるのだが… 

どうも既存の準同型判定はかなりチョンボな感じがする.A→Bのとき,少なくともAのmapは全単射でなくてはならないのではないか?つまり,|M1|=|M2|でなくてはならないと思う.とりあえず,準同型検定は保留ということで進むことにしよう.まぁ,ともかく,ELSIEを組み込もうとしていたのには,この辺りの不徹底を解決をしたいという意図があったはずだ.部分群検定などで新たに生成された群を登録して検定対象に加えられるようにしてみよう.部分群検定という名前は使われていないので,検定7を「部分群検定」として確定することにしよう.

部分群検定は正規部分群などのオプションを持たないので引数から外すことにする.極大部分群検定も外してしまおう.⇒A4は位数4の正規部分群を持っているはずだが,出てこない.ミスがあった.G2をG1としていた.⇒コンボボックスへの登録ができない.部分群検定の末尾で実行しようとしたのだが,CS0120エラーが起きてしまう.最終的にForm1のボタンイベントのハンドラで操作することにした.修正未完了.