クリーク分割問題が解ければ極大部分群検定は解ける.しかし,クリーク分割問題はNP困難であり,NP完全と同等かそれ以上に難しい問題として知られている.しかし,極大部分群検定には一般の場合と比べいくつか有利な点があるので,それらを利用すればより効率的な解を得られる可能性はあると考えられる.解法を定式化してみよう.
- 群の乗積表はグラフの隣接行列とみなすことができる.このようなグラフを群グラフと呼んでおこう.群グラフはすべての点が繋がっているので,つねに完全グラフである.一つの乗積表を共有する部分群グラフが完全グラフであれば,そのグラフの頂点は群を構成する.
- 単位元はすべての部分グラフに共通し,必ず存在することが予定されているので,グラフから当初から除外して考える.つまり,群グラフは最大でもN-1点グラフである.
- 群には溶接された硬結な結節点が2種存在する.一つは逆数関係による固着,もう一つは自乗巡回路である.これらは一つの点を除去するとすべての点を除去するしかなくなるので,1個のブロックを形成している.従って,これらの元を合併して一つの点とみなすことができる.
- 今後はブロックを点に簡約したグラフを主に考える.これを簡約群グラフと呼んでおくことにしよう.また,以下ではブロックを簡約した点をフロックと呼ぶことにする.
- 簡約群グラフから頂点(強連結成分,flock)を一つ取り除いたグラフ上で最大の完全部分グラフ(クリーク)を見つけることがテーマとなる.
- フロックAを取り除くと,他のフロックBに影響する.x∈A, y,z ∈Bでx=yzであれば,xの除去によってy ないしzの除去が発生し,その結果フロックB全体が除去の対象となる.従って,Aを除去することにより,フロックBもドロップする.
- この操作をドロップが生じなくなるまで反復して得たグラフは連結した完全部分グラフであり,それらの元集合は1個の極大部分グラフを構成する.
- 極大グラフ検定はすべての個別フロックについてこれを反復することで完了する.つまり,フロック個数分の極大部分グラフ(おそらく同型のものを含め)が生成される.
- フロックはブロックではあるが,群ではない.最小のフロックサイズは1で,この場合は x^2=x であるか x^2=e のどちらかである.このようなフロックはローンウルフと呼ばれる.
- フロックはフロック番号によって管理される.フロック番号は群の生成時に決定され,元表に記入される.フロック番号はフロックの代表元の元番号であり,1以上の飛び番である.
- フロック数とフロック代表番号のリストは群で管理する.
- フロックは元集合の排他的な直和であり,群の集合配列を使って生成する.
- 極小部分群分解では個別ノード単位ではなく,フロック単位で分解を行う.
- 極大部分群分解では,フロック単位に元をドロップすることで部分群を構成する.
- このアルゴリズムが確立した後は自乗リスト(べき表)は不要になる.また,元の必須という属性も不要になる.
- ローンウルフを放置しておくと面倒くさいので,実装では一括して単位元の預かりとすることにした.
これで完璧なアルゴリズムが確立した.現行論理をこのアルゴリズムでカバーするのは難しくない.⇒極大部分群検定に入る前に,まずフロックの概念が正しいことを検証するためのコードを書いておこう.フロック元分割という関数を作って群のコンストラクタから呼び出すようにしてみたところ,驚くべき結果が出た.Q8の場合すべての元が一箇所に集まってしまう.こんなはずではなかったのだが… いや,やっていることが間違っている.最初にやるべきことは元とその逆数を一元化することであり,べきの関係ではない.