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

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のボタンイベントのハンドラで操作することにした.修正未完了.

部分群分解を整備する

正規部分群分解は一応動作するようになったと見てよいと思う.次は,部分群分解だ.これは素群を含むすべての部分群を列挙する検定である.現行では極小部分群の抽出→極大部分群の抽出→部分群の合成のような手順になっているが,極大部分群の抽出の部分は一時的に止めて動作確認することにする.極小部分群の抽出は「生成元のすべてのべきを含む部分群を生成する方法」で行っている.これはよく言われる「軌道」というものではないだろうか?いや,少しというかかなり違うように思われる.これは後で調べることにする.極小部分群の抽出にはバージョンの分岐はない.使われているのは,部分群検定5~7だけだ.

Q8の部分群分解で停止する.(Count != 部分群数)の不一致が起きている.Count = 4で部分群数は5だ.Count=1で開始しているのに一致しないというのはおかしい.素群数=5,極大部分群数=0でi<5のときだけカウントされている.検定7の冒頭では素群数と部分群数は一致している(=5)この下図には{e}が含まれるものと思われる.部分集合には台集合が5個登録されている.部分集合[0]={e}である.

■群Q8は5個の真部分群を持つ■ 位数2X1 位数4X3と表示されているが,素群は3個しかダンプされていない.どうもi=3でループからブレークしているようだ.いや,ループ回数が 部分群数 – 1となっている.=は入っていないので,これは i < 部分群数でなくてはならないだろう.⇒多分これで解決したはずだ.

■群Q8は5個の真部分群を持つ■ 位数2X1 位数4X3という表示になっているが,真部分群には単位群を含まないことになっているようなので,1つマイナスした数字を出すことにする.

部分群のダンプの意味がよくわからない.

部分群のダンプ:Q8 N=8 素群数=5 部分群数=5 #は部分群の位数
[0] 〈1〉{1} #1
[1] 〈〉{1,-1} #2
[2] 〈〉{1,i,-1,-i} #4
[3] 〈〉{1,j,-1,-j} #4
[4] 〈〉{1,k,-1,-k} #4

〈〉で何を表そうとしているのだろう?意味不明だ.⇒部分群生成元[i]というのを表示している.極大部分群ではこの配列に※を格納している.合併群の場合には2つの部分群の生成元を連結した値が入る.素群では何も入れていない.置換リストを使っている場合には,生成元の置換が入るようになっているが,置換リストを使っていないため空になっている.極小部分群を生成したときのseedを格納するようにした.以下のようになった.これならわかる.

(1) 部分群 [1]⇒〈-1〉{1,-1} は位数2のQ8の素群である
(2) 部分群 [2]⇒〈i〉{1,i,-1,-i} は位数4のQ8の素群である
(3) 部分群 [3]⇒〈j〉{1,j,-1,-j} は位数4のQ8の素群である
(4) 部分群 [4]⇒〈k〉{1,k,-1,-k} は位数4のQ8の素群である

部分群のダンプ:Q8 N=8 素群数=5 部分群数=5 #は部分群の位数
[0] 〈1〉{1} #1
[1] 〈-1〉{1,-1} #2
[2] 〈i〉{1,i,-1,-i} #4
[3] 〈j〉{1,j,-1,-j} #4
[4] 〈k〉{1,k,-1,-k} #

A2, A3, A4, A5, S2, S3, S4, S5まで分解できた.内訳まではわからないが,下記URLにはこれらの部分群の個数のリストがある.

http://iitakashigeru.math-academy.net/seminar07/nakayamaohp.pdf

S5の分解では5分54秒掛かっている.約6分だ.上のサイトではPrologで11.46秒で計算完了している!以前はもう少し速かったような気もするのだが… 2023/10/29には部分群検定で4秒を切ったと書いてある.これは極小部分群の切り出しに限定されたものかもしれないが… 2023/10/25には,部分群検定6で6分23秒とある.それに比較すれば多少は速くなっているのだが… 部分群検定3に戻って確認してみる必要がある.⇒部分群検定3というののは残っていない.これは記事にもあるように現在は「極小部分群の抽出」とリネームされている.つまり,サブルーチンの扱いだ.極小部分群の抽出は現行の検定7でも使っているので,それ以上のことはできない.

部分群のリストをダンプするとき,可換/非可換と正規部分群の別を表示できるようにしたい.群の検査の自己同型検定は正規部分群検定になっていないのだろうか?正規部分群検定の中では,「共役変換検定」を使って正規であるか否かを判定している.共役変換検定という処理は準同型というクラスの関数で,準同型はA,Bという2つの群を抱えている.この中でB群から参照されているのはNだけだ.多分,Aが写像の定義域でBが値域になっているはずだが,値域の台集合は群から直接取っているのだろうか?map.map1がそれに該当するものと思われる.

写像 map = new 写像(G.N, G.台集合, G.台集合);

とあるが,これは

写像 map = new 写像(G.N, 台集合, G.台集合);

の誤りではないだろうか?写像というクラスでは配列を2つ持っているが,長さが同じことを仮定しているのではないだろうか?写像の検査という機能もある.これを見ておこう.写像の検査は準同型クラスのメソッドで群AとBを持ち,map1とmap2という2つの元集合を持っているが,これらのサイズは同一で,群の台集合の部分集合という位置付けと思われる.つまり,基本的にmap1→map2は全単射になっているのではないか?写像の検査で実施しているのは基本的にmap1/map2と群A/Bの台集合の突き合わせ検査である.つまり,記載漏れや重複がないことを確認しているに留まる.

共役変換検定の動作を確認してみよう.A4は位数4の正規部分群を1個持っているが,完全な検査になっているかどうか?Aの元集合としてはAの台集合が使われているので,抜け目はないように思われる.map1とmap2には同じもの(Bの台集合)が入っている.gxg^-1でg∈A,gxg^-1∈Bとなっているので,論理的には問題なさそうだ.ただし,これは写像や準同型などを持ち出さなくても群クラスの中で処理できたのいではないか?⇒書換えてみよう.⇒対処した.問題なさそうだ.

ここで,群の生成時,対称群と交代群では乗積表を使わない方式に統合しておくことにしよう.台集合は別途指定できるので,特に問題ないと思う.現行では「置換リストを使う」方式でS5まで扱えているので,とりあえず限界まで試してみることにする.⇒A3~A5, S2~S5までは実装した.VとQ8は残った.これらは対称群でも交代群でもないので,自動的には生成できない.部分群として取り出すという手段はあるが…

検定7で極大部分群の抽出3を復活させたが,S5でやけに時間が掛かっている.どうも,極大部分群を取ったことで余分なコストが掛かるようになってしまったように思われる.極大部分群検定は部分群検定から切り離しておいた方が無難かもしれない.古い論理の復活ということも考えられるかも知れない.極大部分群検定に入っている「結び目をほどく」がコスト要因になっていると考えられる.というか,S5はこの方法では極大部分群を取り出せなかったのではなかったろうか?なにかやり損なってしまった可能性もある.2023/11/06には「S5では1分以上掛かっている模様」とあるので,これほどには掛かっていなかった.

交代群ではまったく極大部分群を取れない.対称群ではS4までは取れるが,S5では時間が掛かるようになっている.いや,2023/11/06のログでは「S5の極大部分群で2秒」という書き込みもある.この2秒というのは,メモリを確保するまでの時間を除いた実処理時間と思われる.確かに,2秒台で終わっている.それまでの助走に時間を食われている.開発機の実装メモリは16GBだ.これを増設すればもう少し速くなる可能性はあるような気がするが… 機種名はDiginnosだ.⇒16GBというのは現在の標準だ.32GB搭載はハイエンドクラスにしか見られない.

正規部分群検定が動作していない

どうも正規部分群検定は動作していないように思われる.少なくともS5は正規部分群を持っているはずなのだが… 論理をいじっているので,正規部分群検定が止まっているようだ.共役変換検定というのをやって結果が正規のときのみ検定を実行するようになっているが,正規がfalseで固定されている.A4で位数4×3の正規部分群があると出た.これは正しいか?⇒間違っている.A4の位数4の部分群はV={e,(12)(34),(13)(24),(14)(23)})しかない.出力では,{a,d,l,i},{a,i,d,l},{a,l,i,d}の3つとなっているが,これらは位相同型なのではないか?部分群検定にはまだ位相同型検査が入っていないのではないか?

HasSameElementsは部分群検定6, 7 の辺りで導入された模様で,極小部分群の抽出,極大部分群の抽出で定着したものと思われる.この際,追番の付いていない部分群検定は正規部分群検定として系列から切り離した方がよいと思う.一度バックアップを取ってから始めよう.正規部分群検定を再帰実行することに意味があるだろうか?コードは残っているのだが,現状では使われていない.正規部分群の中に正規部分群が入っていることはあるので,意味がないということもないが… ⇒コードだけは残しておいてよいのではないか?いや,現状でもそうなっている.

正規部分群数とダンプの内容が合わない.群Q8は3個の非自明な正規部分群を持っている■というとき,位数2X1 位数4X3と表示される.位数2X1という正規部分群は存在していない.正規部分群抽出の過程で正規でない部分群も生成されている.これを登録して,部分群数をカウントアップしている.正規部分群の取り出しでは正規部分群だけを登録するようにした方がよい.⇒正規部分群だけを登録するようにしてみたが,今度は◎群Q8は4個の非自明な正規部分群を持っている 位数2X1 位数4X3のような表示になった.これは◎群Q8-2という部分群が持っている正規部分群位数2X1がどこかで足しこまれているためと思われる.いや,表示の問題だったようだ.これで正しくなった.

《 正規部分群分解 Q8 》
★★群Q8-1は位数2の正規部分群である★★ {1,-1}
★★群Q8-2は位数4の正規部分群である★★ {1,i,-1,-i}
  ★★群Q8-2-2は位数2の正規部分群である★★ {1,-1}
  ◎群Q8-2は1個の非自明な正規部分群を持っている 位数2X1
★★群Q8-4は位数4の正規部分群である★★ {1,j,-1,-j}
  ★★群Q8-4-2は位数2の正規部分群である★★ {1,-1}
  ◎群Q8-4は1個の非自明な正規部分群を持っている 位数2X1
★★群Q8-6は位数4の正規部分群である★★ {1,k,-1,-k}
  ★★群Q8-6-2は位数2の正規部分群である★★ {1,-1}
  ◎群Q8-6は1個の非自明な正規部分群を持っている 位数2X1
◎群Q8は4個の非自明な正規部分群を持っている 位数2X1 位数4X3

群の検査の中に群が可換であるか否かの判定を入れたい.どうすればよいか?結合法則の検査に組み込めばよいのではないか?⇒実装した.Q8は非可換群だが,A4が非可換になってしまう.これはかなりおかしい.どこかで間違えている可能性がある.いや,間違っていない.A4, S4, A5などはすべて非可換群だ.S3は位数最小の非可換群である.つまり,n≧3のSnはすべて非可換群である.言い換えれば,S2を除くすべての対称群は非可換である.n≠1ならGLn(R)は非可換群である.「可換群の任意の部分群は正規部分群である」また,「指数が最小素因子なら正規部分群である」とも(多分逆は成立しない).

https://www.osaka-kyoiku.ac.jp/~hiraki/L03/Qa.htm

上記リンクには

(1) G が 可換群ならばその任意の部分群は正規部分群である。◯
(2) G が 非可換群ならばその任意の部分群も非可換群である。X

とある.これは本当だろうか?(1)は間違いないとして,(2)を明示しているところは(ここの他には)見当たらない.また,以下もアリアドネの結果と一致しない.

https://www.osaka-kyoiku.ac.jp/~hiraki/L07/D2qs1.htm

(1) 4 次の対称群 S4 には全部で4つの正規部分群が存在する。◯
(2) 5 次の対称群 S5 には全部で5つの正規部分群が存在する。X

S4の正規部分群は:{e}, {e,(12)(34),(13)(24),(14)(23)}, A_4, S_4.これには自明な部分群2が含まれるので,我々の結果と一致している.つまり,「(1) 4 次の対称群 S4 には全部で4つの正規部分群が存在する」は正しい.「S5 の正規部分群は{e}、A4、S5、の3つである」つまり,S5の非自明な正規部分群はA4のみである.従って,『(2) 5 次の対称群 S5 には全部で5つの正規部分群が存在する。』は間違っている.このリンクは問題集になっているので,Yes, Noで答えるようになっているのかもしれないが,回答は公開されていない.