数式処理ソフトによる~ その15 & 新・方程式のガロア群の求め方


これまで、与えられた方程式のガロア群を求めたり、可解な方程式の解をべき根で表すことをテーマにして一連の記事を書いてきた。本記事では、その過程にグレブナー基底を利用する方法とその数学的背景、及びガロア群を求める新しいやり方を解説する。後者は、これまで非常に重かった計算をだいぶ軽減できると期待できる………と元々は思っていたのだが、前記事で「退職後は素人数学者」さんが従来の手法での計算時間の大幅な短縮を実現されていたので、そちらでの意義はあんまりないかもしれない(笑)。

グレブナー基底の概観

グレブナー基底を求めることで何が得られるかを、ここでの私たちの目的に沿った形で言うと「連立方程式を同値変形で解いた解」が得られる。例えば、連立方程式
(1){2x+3y12=0xy1=0
をグレブナー基底を使って解きたいとしよう。Wolfram Alphaを使うなら、
GroebnerBasis[{2*x+3*y-12,x-y-1},{x,y}] と入力する。すると、「結果」には {y-2, x-3} と表示されるだろう。

maxima では、標準ではグレブナー基底が使えるようにはなっていないので、まず拡張機能としてロードする。大抵は wxmaxima を通じて maxima を使っているだろうから、
load("grobner")$
までタイプしたら Enter ではなく Shift キーを押しながら Enter(あるいは、Control キーを押しながら Enter)を入力する。数秒待つとロードが終わってグレブナー基底関連のコマンド・関数が使えるようになる(一度ロードした後は、その maxima を終了するまでは再度ロードする必要はない。一度終了して、再度 maxima を起動したら、ふたたびロードする必要がある)。

そうしたら
poly_reduced_grobner([2*x+3*y-12,x-y-1],[x,y]);
とタイプして Shift+Enter で
[y-2,x-3]
が得られる。

大体見当がついたろうが、結果の {y-2, x-3}[y-2,x-3] が求まったグレブナー基底で、これが上記の連立方程式の解が x=3, y=2 であることを表している。

また、入力に現れた 2*x+3*y-12,x-y-1 は、解きたい連立方程式の左辺である。それらをコンマで区切り、Wolfram Alpha なら {} で、maxima なら [] でくくったものが第1引数になる。第2引数は {x,y}[x,y] になっているが、これらは当面「どの文字を未知数と見るか」の指定だと思っておけばよい。実はこの順番にも意味があるが、それについてはまた後で説明する。

今述べた通り入力は連立方程式から「=0」を除いた残りだったわけだが、結果の {y-2, x-3}[y-2,x-3] には逆に「=0」を追加することで、x=3, y=2 という解が得られるわけだ。

このように、2x+3y12, xy1 のグレブナー基底を求めた結果が y2, x3 になったが、グレブナー基底というものの著しい特徴は、これらに「=0」を補った式が連立方程式としては必ず同値変形になるということである。
(1){y2=0x3=0
今の場合、元の方程式が未知数について 1 次だったので同値性は別に驚くようなことではないが、グレブナー基底のすごい所は次数によらず同値な結果が得られるという点である(具体例はすぐ後で)。

「同値性が確実に保証された式変形」なんて高度な処理が、「任意の」連立方程式に対して可能なはずはない。グレブナー基底で扱える方程式は、未知数について「多項式で」表される形の連立方程式に限られる。

例えば
{x2+y2=22xy=1
を解かせると、Wolfram Alpha なら GroebnerBasis[{x^2+y^2-2,2*x-y-1},{x,y}] と入力した結果
{5 y^2 + 2 y - 7, 2 x - y - 1} となって、maxima なら(入力と出力を並べて書くと)
poly_reduced_grobner([x^2+y^2-2,2*x-y-1],[x,y]);
[-y+2*x-1,5*y^2+2*y-7]
となる。つまり、上の連立方程式を
{5y2+2y7=02xy1=0
に同値変形してくれたわけだ。

ここで、「同値変形」とは言っても結果はあくまで「多項式の形」でしか与えてくれないので、「(x,y)=(1,1) or (x,y)=(15,75)」のような「親切な」結果にまでしてくれるわけではない。結果に現れる y だけの 2 次方程式 5y2+2y7=0 を解いて y=1 or y=75 を導き、2xy1=0 と合わせて x も求めるのは人間が行う(あるいは、グレブナー基底以外の手法にバトンタッチして数式処理ソフトに求めさせる)必要がある。

こういったグレブナー基底を求める機能が、ガロア群を求めたり、可解な方程式をべき根で解いたりする私たちの目的にどのように有効なのか、引き続き見ていこう。グレブナー基底について説明すべきことはまだある(例えば、上で触れた「未知数指定の指定順の意味」など)が、それは以下の説明の中のしかるべき個所で取り上げることにする。

従来の手法をグレブナー基底で

拡大体での商の計算

可解な方程式の解をべき根で表そうとした場合、「退職後は素人数学者」さんの元々のアルゴリズム(私が勝手に「アルゴリズムA」と名付けたもの)では、方程式によっては「べき根の選び方の不定性によって、0 になる可能性もならない可能性もある式」が分母に現れ、これが問題を引き起こしていた。この問題はグレブナー基底を用いると回避できるようになり、jurupapa さんの改訂版のプログラムではオプションで利用できるようになっている。その動作原理を見ていこう。

以前の記事では、r2+3=0, ω2+ω+1=0 をみたす r, ω に対して、12ω+1+r がうまく処理できない、という例を挙げた。これは、グレブナー基底で「分母の有理化」を行うことで解決できる。具体的には
http://maxima.hatenablog.jp/entry/2019/01/21/011356
での ehito さんのコメントの通りだが、使っている文字をこちらに合わせ、数学的背景を交えながら説明する。

やりたいことは、要するに
(2){r2+3=0ω2+ω+1=0(2ω+1+r)x=1
を連立させ、これを r, ω, x を未知数とする連立方程式と見なして解く、ということになる。ここで、グレブナー基底が扱えるのは未知数について「多項式の」形の連立方程式だけだった、という制限を考慮し、第3の式では x=12ω+1+r の分母を払った形にしてある。

一見、第3の式には意味がなさそうにも思える。未知数 x を増やした所で論理構造が変わるわけでなく、登場する文字を意味なく増やして複雑化しただけのようにも見えるからだ。しかし、グレブナー基底を応用する際は、このように「扱いたい値を表すためだけに新しく未知数をおく」ということがしばしば有力な手段になるのだ。これは、以下の話を読み進めれば自然に見てとれるだろう。

さて、(2)をグレブナー基底を用いて同値変形しよう。ωw で代用する。Wolfram Alpha だったら
GroebnerBasis[{r^2+3,w^2+w+1,(2*w+1+r)*x-1}, {x,w,r}] と入力し、(グレブナー基底の拡張機能ロード済みの)maxima だったら
poly_reduced_grobner([r^2+3,w^2+w+1,(2*w+1+r)*x-1], [x,w,r]);
と入力することになる。結果はそれぞれ {r^2 + 3, -r + 2 w + 1, r + 6 x},[r^2+3,2*w-r+1,-6*x-r] となり、次の同値変形が得られた。
(2){r2+3=02ω+1r=0r+6x=0
結果の第3式は x=r6 となることを意味している。さらに第2式も考えに入れれば、べき根の選び方として 2ω+1r=0 が選択されており、このもとで 12ω+1+r=r6 となることが導かれたことになる。要するに、グレブナー基底を用いて「分母の有理化」ができたわけだ。なぜ都合よく「分母の有理化」を行った結果が導けたのかというと、ここが実は「変数指定の指定順」がキーになるポイントなのだが、詳しくは後で説明する。

ここではまず、次のような疑問に先に答えておこう。「元々 12ω+1+r を考えていたときは、分母が 0 になる可能性があったから、正しく処理するなら
(3)12ω+1+r={r6(2ω+1+r0のとき)値を持たない(2ω+1+r=0のとき)
となるという話だったのでは?分母=0 の可能性はどこに行った?その可能性を勝手に無視しているということは、これは正しい同値変形になっていないのでは?」この疑問に対しては、(2)x を含む式を、予め分母を払った形で与えていた点に注意しよう。Wolfram Alpha や maxima は、(2ω+1+r)x=1 を予め与えられた条件として処理を開始するわけだから、この時点で 2ω+1+r0 という条件も暗黙のうちに与えられていたことになる。つまり、数式処理ソフトが何か不正な処理を行ったわけではなく、上の変形は確かに同値変形になっている。

すると次に出てくる疑問はこうだろう。「それは結局人間が入力を数式処理ソフトに与える段階で『分母=0』の可能性を勝手に排除してしまっただけということだが、そんなことをしてはまずいのでは?」そう、一般に「r2+3=0 かつ ω2+ω+1=0 のもとで、12ω+1+r の値を知りたい」という問に対する純粋な答そのものとしては、この結果は不十分で、「フルの結果」(3)に比べて欠落がある。しかし、今考えている「g(x) の逐次因数分解」という文脈では、これは問題にならない。そのことは、12ω+1+r タイプではなく、実際に現れる r(2ω+1)32ω+1+r タイプ、すなわち「00 型不定形」が出現するタイプの方を題材に後の方でまた解説する。

その前に一旦、先ほど述べた「分母の有理化」と「変数の指定順」の関係について説明しておく。グレブナー基底を使うと一般に「分母の有理化」が可能で、それは次のようにすればいい。例えば、12+3 の分母の有理化がしたいとしよう。これは、x2=2, y2=3 をみたす数に対し z=1x+y を簡約化したいということと同じだが、これを連立方程式として捉え、
(4){x22=0y23=0z(x+y)1=0
と表してみる。これをグレブナー基底を使って同値変形するのだが、ここでは変数の指定順が重要だ。指定順を x,y,z にすると
(4){2x+z39z=02y+z311z=0z410z2+1=0
となってうまく行かない(Wolfram Alpha なら GroebnerBasis[{x^2-2,y^2-3,z*(x+y)-1}, {x,y,z}] 、maxima なら poly_reduced_grobner([x^2-2,y^2-3,z*(x+y)-1], [x,y,z]);)ここは指定順を z,x,y の順にするとうまく行って、 (4){x22=0y23=0xy+z=0
となり、第3式が z=yx と変形できることから 12+3=32 の「分母の有理化」ができていることがわかる(Wolfram Alpha な ら GroebnerBasis[{x^2-2,y^2-3,z*(x+y)-1}, {z,x,y}] 、maxima なら poly_reduced_grobner([x^2-2,y^2-3,z*(x+y)-1], [z,x,y]);)。

なぜ「変数の指定順」を変えるとうまく行くかと言うと、実はこの順序は、同値変形を行う上での「変数を消去する優先順位」の指定になっているからだ(※ 本当は、これは多変数多項式の「先頭項」を決めるための「単項式順序」というものを指定しているのだが、グレブナー基底を「連立方程式の同値変形」のツールとしてのみ見ている今の私たちの立場だと、それは結果的に「変数を消去する優先順位」を指定しているのと同じことになる、と理解すればよい)。つまり、最初の「x,y,z」の順序だと、「得られる式ではなるべく x が、続いて y が消去されている形にせよ。z は消去されず多くの式に残ってしまっていてもいい」と要求したことになっている。その結果「x, y を含まず z だけが含まれる式 z410z2+1=0」が結果に含まれた。これだと「zx, y で表す式」は得られない。

一方、ふたつ目の「z,x,y」の順序では「なるべく z を消去することが優先。x, y の消去はその後」という要求になっている。このため、結果の式で x2=2, y2=3z を含まない形でそのまま残り、残る z を含む式は x, y が平気で残る…つまり zx, y で表せる形の式となった。それが、結果として「分母の有理化」を行ったのと同じことになったわけである。

これで、先ほどの(2)をグレブナー基底で処理するときに変数の指定順を「x,ω,r」にした理由がわかったろう。分母を有理化したい x を最優先で消去する指定順にしたため、有理化がうまく行ったのである。

さて、引き続き r(2ω+1)32ω+1+r タイプの商をグレブナー基底で処理する話に移る。今度は、連立方程式は
{r2+3=0ω2+ω+1=0(2ω+1+r)x=r(2ω+1)3
となる。Wolfram Alpha なら GroebnerBasis[{r^2+3,w^2+w+1,(2*w+1+r)*x-(2*r*w+r-3)},{x,w,r}]、maxima なら poly_reduced_grobner([r^2+3,w^2+w+1,(2*w+1+r)*x-(2*r*w+r-3)],[x,w,r]); と入力することになるが、どちらも[r^2+3,w^2+w+1,2*w*x+r*x+x-2*r*w-r+3]
という結果になって様子がおかしい。与えられた式をそのまま返しただけになっている。これは、元々の商 r(2ω+1)32ω+1+r が、「べき根の選び方によっては、00 型不定形になる式」だったためだ。つまり等式 (2ω+1+r)x=r(2ω+1)3 は、x の係数と右辺が同時に 0 になる可能性があり、その場合は x は任意の値でよくなってしまう。このせいで、「多項式の同値変形」の制限のもとでは、「x=」の形の等式を得ることができない。

どうすればいいかは、
http://maxima.hatenablog.jp/entry/2019/01/21/011356
のコメント欄での jurupapa さんと ehito さんのやりとりの中で論じられている。「分母=0」の可能性を除外するため、連立方程式に (2ω+1+r)y=1 を追加してやればいいのだ。
(5){r2+3=0ω2+ω+1=0(2ω+1+r)x=r(2ω+1)3(2ω+1+r)y=1
y はダミーの(新たな)未知数である。Wolfram Alpha なら GroebnerBasis[{r^2+3,w^2+w+1,(2*w+1+r)*x-(2*r*w+r-3),(2*w+1+r)*y-1},{y,x,w,r}]、maxima なら poly_reduced_grobner([r^2+3,w^2+w+1, (2*w+1+r)*x-(2*r*w+r-3), (2*w+1+r)*y-1],[y,x,w,r]); となる。ダミーでしかない y はなるべく登場してこないよう、消去の優先順位を最も高くしてある。結果は
(5){r2+3=02ωr+1=0xr=06y+r=0
となって、期待通りべき根の選び方が 2ωr+1=0 に制限されて x=r という「分母の有理化」が実行された。ダミー未知数 y についても y=r6 という結果が得られている。

ここで、「勝手に 分母0 の条件を追加していいのか?本当に 分母=0 だったらまずいじゃないか?」という疑問について考察しておこう。まず、私たちが解決すべき課題は「べき根の選び方の不定性によって、0 になる可能性も、ならない可能性もある式」が分母にある場合だったことを思い出そう。今の場合、べき根の選び方は自由なのだから、そのような式のうち特定の 1 個だけに限れば、「0 でない」と決めつけても一般性は失われない。それは「色々あるべき根の選び方のうち、適するものを選んだだけ」と考えればいいからだ。上の例の場合、それが「2ωr+1=0」に反映されていて、「べき根の選び方のうち、これをみたすものしか許されない」ということを意味する。つまりこれは、以前の記事 で書いた

体の拡大過程の各ステップごとに、正しい結果を得るためにどんな条件を追加すればいいか

がわかったということで、グレブナー基底を使えばそれが自動的に得られるということだ。

さらに「本当に、べき根の選び方の自由度を調節すれば必ず 分母0 にできるのか?どんな選び方をしても 分母=0 になるような場合があったらどうするんだ?」という点も考えておこう。もしそんなことがあったとすると、(5)に当たる連立方程式が解なしになる。そういう場合、グレブナー基底を求めさせるとどうなるかと言うと、「1」という単独の出力になる。これはつまり同値変形の結果が「1=0」になるということで、元の連立方程式の未知数にどんな値を代入しても決して等式が成立しない、ということだ。このようにして、分母が本当に 0 になってしまうかどうかは、グレブナー基底が「単独の 1」になるかどうかをチェックすることで判定ができる。その場合は利用しようとしていた θi(x) の最高次の係数と思っていたものが実は 0 だった、ということなので、最高次の係数の候補として次に次数の高い項、あるいは別の θj(x) の最高次の係数を試す…ということをしていけばよい。

また、そもそも以前の記事で書いたように、「1 のべき根の添加は、最初に一度だけ行っておくだけで済ます」ようにすれば、最初から「べき根の選び方の不定性によって、0 になる可能性も、ならない可能性もある式」が分母に現れることを避けられる。こちらで問題を回避しておいた方が筋がいいだろう。

g(x) の逐次因数分解

以上の話は、g(x) の因数分解を進める 1 ステップで、V の新しい最小多項式 h(x) を「大量の θi(x) をまず求め、それらを組み合わせて h(x) を作る」のように「手作り」する場合の話だ。しかし、ehito さんが http://maxima.hatenablog.jp/entry/2019/01/21/011356 のコメント欄で

グレブナー基底を用いれば,最小多項式と冪根の定義多項式を同時に求めることもできます

と書かれた通り、実はグレブナー基底を使えば手作りの必要はなく、h(x) まで含めて自動的に求められる。

maxima で書かれたプロトタイプのプログラムは、ehito さんが http://ehito.hatenablog.com/entry/20190123/1548255005 で公開して下さっているが、やはりここでは数学的背景を交えて説明する。ここでは、根を求めたい多項式は f(x)=x4+2x3+3x2+4x+5 で、V=α1α2+2α3+0α4+3α5 となっており、ガロア群はフルの S4V の最小多項式は
g(x)=x24+24x23+336x22+3344x21+25740x20+159984x19+820856x18+3519504x17+12721926x16+39075680x15+104485896x14+257189424x13+603068156x12+1264487184x11+1484791560x103707413456x923515353279x853513746296x77075256024x6+299352120960x5+770653544880x4+869309952000x3+1145273500800x2+1451723788800x+1818528595200
となっている。体の拡大過程の第 1 ステップでは p=2 であり、θ1(x)=h0(x)h1(x)2 の最高次の係数は、g(V)=0 を使って次数下げした後は
1209545976417338944(1802958665V22+39665090630V21+524580202740V20+4938491366600V19+35917920450635V18+210145521609990V17+1006371942278150V16+3977779456166720V15+13035039787796175V14+35490090761328530V13+83355266821597880V12+187374005424681720V11+409423561822850285V10+710497887957908450V9527741385127623570V89890271294167003200V729302186108233608560V632740075840801574400V5+125250591988477051200V4+529066274435720117760V3+459213722346625891200V2118558331806418265600V+511948241523805824000)
となっている(これを一時的に φ(V) とおこう)。ここからは、今までの手順(「手作り」)だと、(φ(V))2g(V)=0 で次数下げすると定数になることを使い、実際にその定数を求めて a=φ(V) をべき根で表すと共に、(φ(V))21θ1(x)g(V)=0 で次数下げしたものも V によらなくなることから実際に V を含まない x の多項式として求め、そこから h0(x) をべき根としての a を係数に含む多項式として求める…という流れだった。

しかし、ehito さんはそんなことをしないで、グレブナー基底を使って
{g(V)=0a=φ(V)
a, V に関する連立方程式として同値変形している。変数の指定順は V, a で、Wolfram Alpha や maxima に対する実際の入力はかなり長くなるのでここには書かないが、こういう結果が得られる。
{5V12+60V11+480V10+2600V9+10110V8+29040V7+57100V6+68520V5+178965V4+552820V3+1981500V2+2878800V+6762000+5V6a+30V5a+120V4a+280V3a+33V2a414Va82a=0a238880000=0
この第 2 式から、a はべき根 38880000=36003 であることがわかる。そして第 1 式から VQ(a) 係数の多項式
h(x)=5x12+60x11+480x10+2600x9+10110x8+29040x7+57100x6+68520x5+178965x4+552820x3+1981500x2+2878800x+6762000+5x6a+30x5a+120x4a+280x3a+33x2a414xa82a
の根であることもわかる。同値変形で得られた以上、これが VQ(a) 上の最小多項式になっているはずだ(※ 注)。これで、必要としていたものはすべて求まってしまった。「手作り」の手順のかなりの分は、グレブナー基底を求めるとその過程で内部的に同等なことが実行されて、自動的に得られるということになる。

※ ただ、ここが本当に「最小多項式」と言えるのかどうか、ちょっと自信はない。単に「同値変形になっている」というだけだと、最小多項式とは言い切れないのではないだろうか?例えば、左辺が「最小多項式の 2 乗」という形で出力されていたとしても、「同値変形」になっていること自体は間違いないわけだが…。【2020,1/5追記】肯定的に解決した。ちょびっとだけ、イデアルとグレブナー基底の知識を使う。まず、Q(a) 上の V の最小多項式は定数倍を除き一意に決まるので、得られた結果の第 1 式 t(V,a)V の多項式として Q(a) 上で異なる既約因子を持つことはありえない。したがって t(V,a) は定数倍を除き h(V,a) のべき乗と一致する。そのべき乗の指数が 1 であることを示す。グレブナー基底は元の多項式と同じイデアルを生成するので、イデアル t(V,a),第 2 式a238880000に当たる式g(V) が含まれる。すなわち多項式の等式として g(V)=A(V,a)t(V,a)+B(V,a)第 2 式 となるような多項式 A, B が存在する。よって、a に実際に第 2 式をみたすべき根を代入すると、g(V)Q(a) 係数の範囲で t(V,a) で割り切れる。したがって、t(V,a)h(V,a)2 乗以上のべきだった場合、既約な g(x)h(x,a)2 回以上割り切れることになって矛盾する。

今のは p=2 のステップの話だったが、p>2 でも同様である。ehito さんの例で、上の話の続きのステップがどうなっているのかを引き続き見てみよう。上で得られた VQ(a) 上の最小多項式 h(x) を、xaQ 係数多項式として g(x,a) とおき直す。次のステップは p=3 であり、1 の原始 3 乗根 ω が顔を出す。新しくおいた hi(x)Q[V,a] 係数の多項式で、それに対して新しい θi(x) が定まる。
θ1(x)=h0(x)+ωh1(x)+ω2h2(x)3
で、これは実際には Q[V,a,ω] 係数の多項式となっている。ω2+ω+1=0g(V,a)=0 を使って ωV の次数下げをした後の θ1(x) の最高次係数が、V, a, ωQ 係数多項式として得られる。それはとてつもなく長いので、ここでは省略するが、改めて φ(V,a,ω) とおこう。当然、(φ(V,a,ω))3g(V,a)=0, a2=38880000, ω2+ω+1=0 を使って次数下げすれば V が消えて aω だけの式になり、b=φ(V,a,ω)3 乗根として求まるはずである(が、その計算はやはり直接はやらない)。よって、ここでグレブナー基底を求めて同値変形する連立方程式は
{g(V,a)=0a238880000=0ω2+ω+1=0b=φ(V,a,ω)
である。変数の優先順位を V,b, a, ω としてこのグレブナー基底を求めれば、b3a, ω で表した式と、a238880000=0, ω2+ω+1=0、それから Q(a,b,ω) 上の V の最小多項式が得られるという寸法(これは数式処理ソフトでも時間がかかる)。

この技法を使った場合でも、方程式によっては θi(x) の最高次係数が「べき根の選び方によって 0 になる可能性も、ならない可能性もある式」になることがある。そういう場合は先ほどと同じくダミーの未知数を加えて「0」の条件を強制する手もあるが、上でも書いた通り、それよりも「1 のべき根の添加は、最初に一度だけ行っておくだけで済ます」ようにして、最初からそういう不定性が出ないやり方でやる方が紛れがなくていいだろう。

解を V で表す式

元の方程式の解 α, β, γVQ 係数多項式として表す式の求め方については、https://ikumi.que.jp/blog/archives/746 でも触れた「代数拡大体上での因数分解」を使う方法がいちばん簡潔で早いだろうが、原理的にはグレブナー基底を使って求めることもできる。http://maxima.hatenablog.jp/entry/2017/10/28/124236 のコメント欄で ehito さんが提示してくださったやり方で、当初は jurupapa さんも使っていた方法だった。この技法が、2年余りを経てやっと私にも理解できるようになったわけだ(笑)。

いつもの例として f(x)=x33x1, V=α+2β+3γ で、Vの最小多項式として g(x)=x39x9 を選んだ場合を考える。ehito さんが提示してくださったのは

poly_reduced_grobner (
 [ v ^ 3 - 9 * v - 9,
 a + 2 * b + 3 * c - v,
 a + b + c,
 a * b + b * c + c * a + 3,
 a * b * c - 1 ],
 [ a, b, c, v ] ) ;

で(α, β, γ をそれぞれ a, b, c で代用している)、これは要するに次の連立方程式を同値変形しようというものだ。
{g(V)=0V=α+2β+3γα+β+γ=0αβ+βγ+γα=3αβγ=1
後ろ3つが元の 3 次方程式の解と係数の関係だから、これで α, β, γf(x)=0 の3解である条件が過不足なく表されている。V=α+2β+3γ だけだと V の最小多項式が g(x)x39x+9 のどちらなのか決まらないため、g(V)=0 の条件も加えることで、α, β, γ, V に対する必要十分条件となっている。そして、グレブナー基底を求める際の変数消去の優先順位が α, β, γ, V と指定されている。つまり V はいくらでも残って構わないから α, β, γ の登場をなるべく少なくせよ、という要求になっており、それに従って同値変形が行われる結果として α, β, γV のみの式で表されるわけだ。実行結果は、maxima だとこうなる。
[v^3-9*v-9,v^2-3*c-6,v^2-3*v-3*a-6,-2*v^2+3*v-3*b+12]
Wolfram Alpha だとこんな入力だ。GroebnerBasis[{v^3-9*v-9,a+2*b+3*c-v,a+b+c,a*b+b*c+c*a+3,a*b*c-1},{a,b,c,v}]
出力はこうである。
{v^3 - 9 v - 9, 3 c - v^2 + 6, 3 b + 2 v^2 - 3 v - 12, 3 a - v^2 + 3 v + 6}
どちらにしろ、いつもの結果
{V39V9=0α=V23V2β=23V2+V+4γ=V232
が得られている。

ただし、ここの計算でグレブナー基底を使うと、次数の高い方程式では処理が相当に重くなる。これは、元々グレブナー基底の計算は、かなり計算量が膨れ上がる性質のものだからだ(そのため、実用的にはこのように数式処理ソフトに任せて計算してもらうべきもので、手計算で実現できるようなものではない)。

ガロア群を求める別法

代数拡大体上での因数分解の確認と、小規模な拡張

早い所「ガロア群を求める別法」の解説に進みたいが、その過程で「代数拡大体上での因数分解」をちょっと拡張した技法に触れざるを得ないので、先にその話を済ませておく。「代数拡大体上での因数分解」の maxima での計算の仕方と、ちょっとした拡張の原理の説明の2点からなる話になる。

maxima での計算

maxima では組み込み関数 factor でその機能が使え、引数を 2 つ与えて factor(p,q); と入力すると「q の根を使って p を既約分解する」ことができる。例えば、
factor(x^2-2*x-1,a^2-2);
と入力すれば
(x-a-1)*(x+a-1)
という結果が得られ、これは「a22=0 をみたす数 a を使って、x22x1(xa1)(x+a1) と既約分解される」ことを表す。なお、Wolfram Alpha だとどう入力すればいいのか(そういう機能が組み込みで用意されているのか)、私にはわからなかった。以下も、実行例は maxima のみを記す。

代数拡大体上での因数分解の拡張

以前
https://ikumi.que.jp/blog/archives/746
で説明したアルゴリズムは、「Q 係数多項式を Q(a) 係数の範囲で既約分解する」ものだったが、実はまったく同じ手順で「Q(a) 係数多項式を Q(a) 係数の範囲で既約分解する」こともできる。その原理を説明しよう。

既約分解したい多項式は重根を持たないとし、それを x, a の 2 変数多項式と見て、p(x,a) とおく(aQ 上代数的なので、pa についても多項式の形としてよい)。aQ 上の最小多項式を q(x) とし、q(x) の実際の根を a1,a2, としよう。c を整数として p(Xca,a)q(a) の間で a に関する終結式を作り、XQ 係数多項式を得る。それが平方因子を持たないように整数 c を選んでおけば、以前の手順とまったく同様に p(Xca,a)X に関する Q(a) 上の既約分解、ひいては p(x,a)x に関する Q(a) 上の既約分解が得られる(以前と違って、pa を陽に含む場合は、しばしば c=0 が適する値になる)。そのようになる原理も以前と同じだ。また、平方因子を持たないように整数 c を選べることは、次のようにして確かめられる: p(x,a1) の根を b11,b12,b13, とする。仮定より、これらはすべて互いに異なる。定数倍を除き
p(x,a1)=(xb11)(xb12)p(Xca1,a1)=(Xca1b11)(Xca1b12)
である。また、p(x,a2) の根を b21,b22,b23, とすれば、これらもすべて互いに異なり、定数倍を除き
p(x,a2)=(xb21)(xb22)p(Xca2,a2)=(Xca2b21)(Xca2b22)
である。(以下同様)

すると、終結式は定数倍を除き
p(Xca1,a1)p(Xca2,a2)=(Xca1b11)(Xca1b12)×(Xca2b21)(Xca2b22)
となるので、X の多項式としての根は
cai+bij(i=1,2,;j=1,2,)
となる。よって、これらが互いにすべて異なる整数 c は必ず存在する。(※ 上では、「p(x,a)x の多項式として a=a1,a2, のどの値に対しても重根を持たない」ということを仮定しているが、「a1,a2, のうち一部の値に対しては重根を持ち、他の値に対しては重根を持たない」ということは起こらない。なぜならば、もし x の多項式として p(x,a1)=(Φ(x,a1))2Ψ(x,a1) と因数分解されていたとすると(ただし、Φ, Ψ2 変数の Q 係数多項式)、a1Q 上で共役な他の値 a2,a3, に対しても同じ形の式 p(x,ai)=(Φ(x,ai))2Ψ(x,ai) の式が成立するので)

maxima の factor コマンドは、この機能をすでに内包済みのようだ。例えば
factor(x^4-2*a^2,a^2-2);
を入力すると、結果は
(x-a)*(x+a)*(x^2+2)
なる。つまり、a2=2 をみたす a によって x42a2Q[a] 上で既約分解すると (xa)(x+a)(x2+2) となる、という結果がちゃんと得られている。

ガロア群を求める別法・具体的手順

「代数拡大体上での因数分解」の技法を知って以来、折に触れて思い返して「f(x) の根 α 1個を添加しただけで最小分解体ができてしまう場合は、他の根がすべて α の有理係数多項式として表せるわけだから、そこからガロア群も求められるな」ということを考えていたのだが、「1個だけでは最小分解体ができない場合も、他の解を1個ずつ順に追加していけばいつかは最小分解体に達するんだから、再帰的処理で原始元が作れてガロア群を求められるんじゃないか?」というアイディアを思いついた。「ひょっとして、ehito さんが以前公開された、私には何が何だかさっぱり理解できなかったガロア群計算ルーチンってこれと近いんじゃないの?」と思いついて、新たな視点でコードを眺め直してみると、まさしくそうであることがわかった。以下では、その後 ehito さんが整備・公開された
http://ehito.hatenablog.com/entry/2019/02/24/150254
http://ehito.hatenablog.com/entry/2019/06/23/150150
も——私に何とか解る所だけ(笑)——参考にし、新しいアルゴリズムを解説してみる。なお、ここまでの記述で解る通り、新規性はなく、やってることは ehito さんの後追いに過ぎない。

元々の(有理数係数の)方程式を f(x)=0 とする。私のこれまでのガロア群を求めるアルゴリズムは、f(x) は重根さえ持たなければ可約であっても動作したが、新しい方法は「代数拡大体上での因数分解」の技法を使う都合上、f(x) は(Q 上)既約である必要があるので、ここからしばらくは f(x) は既約とする。可約だった場合は最後の方で考察しようと思ったが、そこまで書き切れなかったので、次回の記事に回すことにする。

また、ひとまずは使う手法に制限をつけずに、グレブナー基底も要所要所で利用して計算を進める。一通り話が済んだ後で、グレブナー基底を使っていた所を、より初等的な計算で迂回する手順を考察する。

グレブナー基底・あり

まず、f(x) をその根 α を添加した体 Q(α) 上で既約分解する。ここでは、「代数拡大体上での因数分解」を使う。

maxima による実行例を、f(x)=x33x1, f(x)=x32 について示す(αa で代用している)。

(%i1)    factor(x^3-3*x-1,a^3-3*a-1);
(%o1)    (x-a)*(x-a^2+a+2)*(x+a^2-2)
(%i2)    factor(x^3-2,a^3-2);
(%o2)    (x-a)*(x^2+a*x+a^2)

つまりこうなっている。
x33x1=(xα)(xα2+α+2)(x+α22)x32=(xα)(x2+αx+α2)
当然ながら、必ず xα が因子のひとつとなる。このことを考えれば、始めから f(x)xα で割っておき、その商に対して上の拡張「Q(α) 係数の多項式を Q(α) 係数の範囲で既約分解」を実行してもいいだろう。

まず、ひとつめの f(x)=x33x1 のように Q(α)f(x) が完全に因数分解し尽くしてしまう場合を考える。この場合は簡単だ。Q(α)f(x) の最小分解体そのものなので、最小分解体の原始元としては α が選べ、その Q 上の最小多項式は f(x) そのものである。上の例では、f(x)=0 の解は α1=α, α2=α2α2, α3=α2+2 であり、ガロア群の元は
αα1=ααα2=α2α2αα3=α2+2
のそれぞれが Q(α) に誘導する同型写像となる。これらの写像が、解の置換としてどんな置換かはすぐわかる。例えば、αα2 が誘導する同型写像が第3の解 α3 をうつす先はこのように計算できる。
α3=α2+2α22+2=(α2α2)2+2=α4+2α3+3α24α2=α(f(α)=α33α1=0)
つまり、αα2 が誘導する同型写像は、第3の解 α3 を第1の解 α1 にうつす。このようにして、3つの同型写像のいずれに対しても、どの解をどの解にうつすのかはすべて計算できる(と言っても、最初の αα1 は当然恒等写像なので、わざわざ求めるまでもないが)。

続いて、α を添加しただけでは最小分解体ができなかった場合に進もう。上の2つ目の例の f(x)=x32 では、xα 以外の既約因子が因数分解しきれずに x2+αx+α2 という 2 次式になっている。そこで、この 2 次式の根を β として、さらに β も使って既約分解を行う。(なお、この β も当然 f(x) の根のひとつである)
β2+αβ+α2=0(6)x2+αx+α2=(xβ)(x+α+β)
今の場合は、(6)の計算は手計算でも可能で、Q(α,β) では f(x)1 次式に分解しつくした。
x33x1=(xα)(xβ)(x+α+β)
つまり Q(α,β)f(x) の最小分解体である。

したがって、この Q(α,β) を単拡大 Q(u) として実現できる原始元 u が見つかれば、やはり先ほどと同じようにガロア群がわかるはずである。具体的には、α, β の有理係数の具体的な多項式として表せる u をうまく作って、α, βu の有理係数多項式として具体的に表し、さらに uQ 上の最小多項式が求まればいい。

それにはどうすればいいか…は、ガロア理論(体論)の教科書には大体書いてあるだろう。u=α+cβ とおいて、整数 c を適切に選べば、u は望みの原始元となるのだった。例えば c=1 として、u=αβ が適切かどうか調べてみよう。
(7){α32=0β2+αβ+α2=0u=αβ
α, β, u についての連立方程式として見て、グレブナー基底を求めることで同値変形してみる。maxima で
poly_reduced_grobner([a^3-2,b^2+a*b+a^2,u-a+b],[a,b,u]);
の出力は
[-u^4-18*u-36*b,u^6+108,u^4-18*u+36*a]
となった(βb で代用している)ので、
(7){u6+108=036α+u418u=036β+u4+18u=0
となる。するとまず α, βu について解けて
(8){α=u436+u2β=u436u2
だから α,βQ(u) で、よって Q(α,β)=Q(u) である。つまり c=1 は適する整数値である。よって、u=αβ がこれまでの V に相当する量であり、さらに uQ 上の最小多項式が g(x)=x6+108 であることもわかった。

また、(6)によって、f(x)α, β 以外の根 γαβ であるから、(8)を用いて
(9)γ=αβ=u418
もわかった。

ここから、ガロア群を求める考え方は大きく分けて2つある。

  1. u が最小分解体の原始元なのだから、g(x)Q(u) 上で完全に因数分解しつくすはずである。実際、
    factor(x^6+108, u^6+108);
    を実行すれば
    ((x-u)*(x+u)*(12*x-u^4-6*u)*(12*x-u^4+6*u)*(12*x+u^4-6*u)*(12*x+u^4+6*u))/20736
    が得られるので g(x)=(定数)(xu)(x+u)(12xu46u)(12xu4+6u)(12x+u46u)(12x+u4+6u) となっている。すなわち g(x)6 つの根は u1=uu2=uu3=u412+u2u4=u412u2u5=u412+u2u6=u412u2 とわかって、uu1,,u6 のそれぞれにうつす同型写像としてガロア群が得られる。それぞれの写像が解 α, β, γ をどのように入れ替えるかは、(8)(9)から直接計算できる。
  2. 今のやり方は、g(x)(あるいは g(x)xu で割った商)を Q(u) 上の 1 次式の積に分解する際に、いちから「代数拡大体上での既約分解」を使った。しかし、これは g(x) の次数が高くなるとかなり計算が大変になる。もうひとつの考え方は、各解を u で表す式がわかっていることを使うものだ。

    u=αβ の両辺に、ガロア共役変換(ガロア群の同型写像)を順に一通り作用させてみたとすると、左辺には g(x) の根が一通りすべて並ぶ。そして右辺には解 α, β を別の解にうつした値が並ぶ。したがって、g(x) の根の候補は u1=αβ(=u)(10)u2=βγu3=γαu4=αγu5=γβu6=βα のみである(※ 上の u1,,u6 とは添字のつけ方は揃えていない)。これらの右辺に(8), (9)を代入すると u のみの式が作れる。 u1=uu2=u412u2u3=u412u2u4=u412+u2u5=u412+u2u6=u これらを順次 g(x) に代入して、g(u)=0 で次数下げして 0 になるかどうかを調べれば、g(x) の根が u1,,u6 のどれなのかがわかる(u1=u が根なのは当たり前なので、実際には u2 以降だけ調べればよい)。

    例えば g(u2)=g(u412u2)=(u412u2)6+108=0(u6+108=0) なので u2g(x) の根のひとつである。また、(10)から、uu2 にうつすガロア共役変換は α, ββ, γ にうつすことがわかる。他の解 γ がどの解にうつるかは、この場合は消去法ですぐわかるが、一般には他の解は複数あるので一般性のある手順を述べると、そのうつり先は(9)で、uu2=u412u2 に置き換えた結果を g(u)=0 で次数下げし、どの解と等しくなるかを調べることでわかる。このようにして、g(x) の根であるとわかった ui に対し、uui が解の置換としてどのように働くかが決定できる。

    今の場合は g(x)3!=6 次だからガロア群がフルの対称群 S6 であることは予めわかり、(α,β)(β,γ) だろうがどんな置換でもガロア群の元になっていることが保証されているが、一般にはそうではない。だから、u2,,u6 のどれが g(x) の根なのかは、上のような試行錯誤によってしかわからないこともある。

こんな具合にして、「2つ目の解 β まで Q に添加すれば最小分解体が作れる」ような方程式の場合も、ガロア群が解の置換群として求まり、かつ、最小分解体を作る原始元 u ですべての解を Q 係数多項式で表す式と、uQ 上の最小多項式 g(x) を手に入れられる。

一般化に当たって、注意すべきことを3つ述べておく。

  1. u=α+cβ の整数 c の値が適するかどうかは、上のようにグレブナー基底を求めて、α, βu の有理係数多項式で表せるかどうか、つまり求まったグレブナー基底が (有理数)α+(uの有理係数多項式) 及び (有理数)β+(u の有理係数多項式) の形の多項式を含んでいるかどうかでチェックする。ダメだった場合は、c の値を変えてうまく行くまで繰り返す…という試行錯誤を行う。試行錯誤なしに事前に適する c の値を知る方法は、(あるのかもしれないが)私は知らない。
  2. 今の場合、既約分解(6)は手計算で実行できたが、それは x2+αx+α2x2 次式だったおかげだ。このため、その根を β とおくだけで (xβ)(x+α+β) と既約分解ができてしまった。しかし、一般にはこれは x の高次の多項式になりうる。となると、「x2+αx+α2 に当たる高次多項式(あるいはそれを xβ で割った商の高次多項式)を、Q(α,β) 上で既約分解する」ことが必要になる。そのような場合にどうすればいいかを、f(x)=x62 を例にとって説明する。

    まず、f(x) の根 α を使って f(x)Q(α) 上で既約分解するとこうなる。 f(x)=(xα)(x+α)(x2αx+α2)(x2+αx+α2) 1 次式に分解しきれずに残った既約 2 次式の一方(好きな方を選んでよい)x2αx+α2 の根を β とする。 β2αβ+α2=0 Q(α,β) の原始元 u を見つける。maxima で試したところ、u=αβu=α2β ではダメで、u=α+2β なら適した。
    poly_reduced_grobner([a^6-2,b^2-a*b+a^2,u-a-2*b],[a,b,u]);
    の出力が
    [-u^7+1514*u-5040*b,-u^12-572*u^6-470596,-u^7-1006*u+2520*a]
    となったので α=u7+1006u2520β=u7+1514u5040 で、uQ 上の最小多項式は g(x)=x12+572x6+470596 である。先ほどの既約 2 次因子を、Q(u) 係数の多項式として表す。 x2αx+α2=x2u7+1006u2520x+(u7+1006u2520)2x2+αx+α2=x2+u7+1006u2520x+(u7+1006u2520)2 (前者は xβ で割り切れることがわかっているので、その商を使ってもよい)そして、それぞれを Q(u) 係数の範囲で既約分解する。
    factor(x^2-(u^7+1006*u)*x/2520+((u^7+1006*u)/2520)^2,u^12+572*u^6+470596);
    の出力が
    ((1680*x-u^7-166*u)*(5040*x+u^7-1514*u))/8467200
    なので x2αx+α2=(定数)(1680xu7166u)(5040x+u71514u5040(xβ)) であり、
    factor(x^2+(u^7+1006*u)*x/2520+((u^7+1006*u)/2520)^2,u^12+572*u^6+470596);
    の出力が
    ((1680*x+u^7+166*u)*(5040*x-u^7+1514*u))/8467200
    だから x2+αx+α2=(定数)(1680x+u7+166u)(5040xu7+1514u) である。いずれも 1 次式まで因数分解しつくしたので、Q(u)(=Q(α,β))f(x) の最小分解体になっている。f(x) の根は α=u7+1006u2520α=u7+1006u2520β=u7+1514u5040β=u71514u5040u7+166u1680u7+166u1680 だ。後は先ほど述べた2つの方法のどちらかでガロア群(g(x) の根を u で表した式その他)を求めればよい。

  3. ここまで、グレブナー基底を求めて得られた u のみの有理係数多項式をそのまま u の最小多項式としてきたが、実を言うと本当にそう言い切れるかやや微妙な所がある。以前のアルゴリズムで、V のみたす n! 次の整数係数多項式 F(x) は必ずしも既約とは限らず、可約だった場合にはその任意の既約因子を V の最小多項式として選択できた。それと同様に、上の手順で得られた u のみの有理係数多項式も、場合によっては可約になっている…という可能性がない、ということは私には証明できなかった。そこで、グレブナー基底の結果から、u の最小多項式を確実に得る手順も述べておく。

    上の f(x)=x62 の場合を例に取る。αQ 上の最小多項式が 6 次の f(x) だから、[Q(α):Q]=6 である。また、βQ(α) 上の最小多項式が 2 次の x2αx+α2 だから、[Q(α,β):Q(α)]=2 である。したがって、Q(α,β)=Q(u)Q に対する拡大次数は 6×2=12 で、これが uQ 上の最小多項式の次数である。ゆえに、グレブナー基底の同値変形によって u12 次式が得られた時点で、これが最小多項式にもなっていることがわかる。この手順で、もし次数が一致していなければ、グレブナー基底によって得られたものは最小多項式でないので、それを Q 上で既約分解して、その任意の既約因子を最小多項式 g(u) とすればいいだろう。グレブナー基底を求める変形が同値変形であることは保証されているので、どの既約因子でも差し支えないはずだ。

さて、それでは Q(α,β) がまだ f(x) の最小分解体にならない場合に進もう。例として、f(x)=x4+x+1 の場合を考えよう。

f(x) の根 α を用いて f(x)Q(α) 上で既約分解する。maxima の入力と出力を交互に並べると

     f(x) := x^4+x+1;
     f(x):=x^4+x+1
     factor(f(x),f(a));
     (x-a)*(x^3+a*x^2+a^2*x+a^3+1)

(maxima では、f(x) := x^4+x+1 は関数の定義を意味する)だから
f(x)=(xα)(x3+αx2+α2x+α3+1) である。t(x)=x3+αx2+α2x+α3+1 の根を β とおき、xβ で割った商を求めると

     t(x) := x^3+a*x^2+a^2*x+a^3+1;
     t(x):=x^3+a*x^2+a^2*x+a^3+1
     quotient(t(x),x-b,x);
     x^2+(b+a)*x+b^2+a*b+a^2

である(quotient が商を求める関数で、t(x)xb で割った商を、変数 x について求めている)。
f(x)=(xα)(xβ)(x2+(β+α)x+β2+αβ+α2)
さらに、Q(α,β) の原始元 u を求める。u=αβ がうまく行き、

     poly_reduced_grobner([f(a),t(b),u-a+b],[a,b,u]);
    [-735*u^10+4000*u^8-4620*u^6+30213*u^4+194240*u^2- 338522*u-677044*b-368392,-u^12-8*u^8-26*u^6+112*u^4-216*u^2- 229,735*u^10-4000*u^8+4620*u^6-30213*u^4-194240*u^2-338522*u+ 677044*a+368392]

より
α=735u104000u8+4620u630213u4194240u2338522u+368392677044β=735u10+4000u84620u6+30213u4+194240u2338522u368392677044
が得られる。また、[Q(α,β):Q]=4×3=12 なので u12 次式 u128u826u6+112u4216u2229 から最小多項式がわかる: g(x)=x12+8x8+26x6112x4+216x2+229

f(x) の残る既約因子の係数を u で表す。g(u)=0 を使って次数下げする。
x2+(β+α)x+β2+αβ+α2=x2+((735u104000u8+4620u630213u4194240u2+338522u+368392)/677044(735u104000u8+4620u630213u4194240u2338522u+368392)/677044)x+((735u104000u8+4620u630213u4194240u2+338522u+368392)2)/(458388577936)+((735u104000u8+4620u630213u4194240u2338522u+368392)2)/(458388577936)+((735u104000u8+4620u630213u4194240u2338522u+368392)(735u104000u8+4620u630213u4194240u2+338522u+368392))/(458388577936)=(458388577936x2+(995254680u10+5416352000u86255886560u6+40911060744u4+263018053120u2498835186496)x+1620675u2017640000u18+68374200u16244119330u1467453200u12+5448864360u1011487264693u8+45423264960u6+46406167824u4314741627996u2+407137996992)/458388577936=(677044x2+(1470u10+8000u89240u6+60426u4+388480u2736784)x+4200u10+1323u8+26400u6+117516u4457079u2+557568)/677044
これを Q(u) 内で既約分解する。分母の定数 677044 は不要なので、分子のみ見ればよい。

     factor(677044*x^2 + (-1470*u^10+8000*u^8-9240*u^6+60426*u^4+388480*u^2-736784)*x + 4200*u^10+1323*u^8+26400*u^6+117516*u^4-457079*u^2+557568,g(u));
     677044*x^2-1470*u^10*x+8000*u^8*x-9240*u^6*x+60426*u^4*x+388480*u^2*x-736784*x+4200*u^10+1323*u^8+26400*u^6+117516*u^4-457079*u^2+557568

2 次式のままなので、Q(α,β)=Q(u)f(x) の分解体ではない。この 2 次式を tt(x) とおく。

ここでどうするか。残っている tt(x)f(x) の因子なので、その根は元々の方程式の解である。そこで、これまでと同様、その根を γ とおいて、Q(u,γ)=Q(α,β,γ) 内での因数分解を行えばよい。
tt(γ)=677044γ2+(1470u10+8000u89240u6+60426u4+388480u2736784)γ+4200u10+1323u8+26400u6+117516u4457079u2+557568=0
tt(x)2 次式なので、その根 γ を使えば既約分解できることは明らかだが、一般性を考慮してその変形はしないで先に進む。

Q(u,γ)=Q(v) となる v をさがす。v=u+2γ とおくとうまく行った。γc で代用して
poly_reduced_grobner([g(u),tt(c),v-u-2*c],[u,c,v]);
でグレブナー基底を計算させると、かなり長い出力となったので結果は省略するが、v24 次式、uγ をそれぞれ v23 次式で表す式が得られた。[Q(u,γ):Q]=122=24 なので、v24 次式が v の最小多項式である。

これらを使って tt(x)Q(v) 係数の多項式に書き直し、Q(v) 係数の範囲内で既約分解すると、目論見通り 1 次式の積に分解しつくした。よって Q(v)f(x) の最小分解体である。α, βu で表す式は得ていたから、さらに v で表す式も求められる。また、v をその共役にうつす同型写像が、どの解をどの解にうつすかは、v=u+2γ=αβ+2γ であることなどを使って求められる。

こんな具合に、どの段階でも「そこまで拡大した体の Q 上の原始元(α, u, v など)が得られている」ので、「新たに解を添加した拡大体の新たな原始元をその都度作れる」ようになっている。その繰り返しによって、原理的にはどんな高次の方程式でもガロア群が求められる。

グレブナー基底・なし

計算原理がわかった所で、引き続きグレブナー基底を回避する初等的アルゴリズムを考察しよう。上の手順でグレブナー基底を使っているのは、u=α+cβ などの組み合わせで、Q(α,β)=Q(u) をみたす u を見つける所だ。

αQ 上の最小多項式は f(x) である。f(x)Q(α) 係数内で既約分解したときの既約因子に、2 次以上のものが残っているとしよう。一般にはそれは複数ありうるが、そのうちの任意のひとつを選んで固定し、ϕ(x;α) とおく。ϕ(x;α) の根を β とおけば、βQ(α) 上の最小多項式は ϕ(x;α) である。元々 ϕ(x;α)f(x) の因子だったから、ϕ(x;α) の根は「f(x) の根のうち、α 以外のものの全部又は一部」である。再び f(x)=x32 を例にとると、ϕ(x;α)=x2+αx+α2 で、β2+αβ+α2=0 である。

f(x)=x32 の根を α1, α2, α3 とし、ϕ(x;αi)=x2+αix+αi2 の根を βi1, βi2 とする。添字の付け方の一例は
α1=23β11=23ωβ12=23ω2α2=23ωβ21=23β22=23ω2α3=23ω2β31=23β32=23ω
となるが、こうやって具体化しない方が一般化の道筋が見えやすいだろう。α=α1, β=β11 とする。

以下の計算をやりやすくするため、u の定義式で整数 c がかかる相手を β から α に変更して u=cα+β としよう。これでも本質的な違いはない。

αi(i=1,2,3) は互いに異なり、i を固定したとき βij(j=1,2) も異なるため、cαi+βij(i=1,2,3;j=1,2) がすべて異なるような整数 c が存在する。

考えることは次の3つになる。

  1. 上のような整数 c を選べば、u=cα+βQ(α,β)=Q(u) をみたすのはどうしてだったか。
  2. その整数 c はどうやって見つければいいか。
  3. そのときどうやって uQ 上の最小多項式を得ればよいか。
  1. まず β=ucαϕ(β;α)=0 に代入して β を消去すると
    (ucα)2+α(ucα)+α2=0
    となる。よって、ψ(x)=(ucx)2+x(ucx)+x2 とおくと、αf(x)ψ(x) の共通根。しかし、α 以外の共通根はない。なぜならば、f(x) の他の根 α2 に対しては
    ψ(α2)=(ucα2)2+α2(ucα2)+α22=ϕ(ucα2;α2)=(ucα2β21)(ucα2β22)
    である。そうすると u=cα1+β11 だったことと c に対する仮定から ψ(α2)0 と言え、同様に ψ(α3)0 も言える。

    ゆえに、Q 係数の f(x)Q(u) 係数の ψ(x) の間で互除法を実行すれば、唯一の最大公約式 xαQ(u) 係数の多項式として算出され、αQ(u) が言えた。するとさらに β=ucαQ(u) の元である。これで Q(α,β)Q(u) で、一方 u=cα+β より Q(u)Q(α,β) であるから Q(u)=Q(α,β) がなりたつ。

  2. 今度は不定元 U に対し ψ(x,U)=(Ucx)2+x(Ucx)+x2=ϕ(Ucx;x) と定義し直し、f(x) との間で変数 x についての終結式を作る。終結式の性質から、c がどんな整数でもその結果は UQ 係数多項式(r(U) とする)になるが、一方 r(U) は定数倍の違いを除き次のものに等しい。 ψ(α1;U)ψ(α2;U)ψ(α3;U)=ϕ(Ucα1;α1)ϕ(Ucα2;α2)ϕ(Ucα3;α3)=(Ucα1β11)(Ucα1β22)×(Ucα2β21)(Ucα2β22)×(Ucα3β31)(Ucα3β32) したがって、r(U) の根は cαi+βij(i=1,2,3;j=1,2) の全体である。よって、整数 c の値を色々変えて、r(U) が平方因子を持たない(r(U)r(U) が互いに素になる)ような c が見つかるまで試せばよい。
  3. 上のふたつから、適切な c に対しては、終結式として求めた r(U)u=cα+β=cα1+β11 を根に持っている。したがって、uQ 上の最小多項式は r(U) を割り切る。一方、f(x)=x323 次、ϕ(x;α)=x2+αx+α2x について 2 次であることから、次のふたつはいずれも 3×2=6 に等しい。

    • r(U)U についての次数(終結式の作り方より)
    • Q(α,β)Q 上の拡大次数
    後者は Q 上の u の最小多項式の次数でもある(Q(u)=Q(α,β))。よって、r(U) こそがその最小多項式でなければならない。つまり、こうやって求めた終結式こそが、u の最小多項式そのものだったというわけだ。

    ………これ、見直してみると上の方でやってる「Q(a) 係数の多項式を Q(a) 上で既約分解する」で出てきたのとまったく同じ計算してますね。まだ理解が整理できてないですが、おそらく実はもうちょっと深い背景があって、それを理解してると両方とも同じ話としてスッキリ理解できるんでしょうね…。r(U) が最小多項式になり、したがって既約になる、ということは、上の話で、元々 p(x,a)Q(a) で既約だった場合は、r(X) も既約で Q 上で分解はしない、ということですね。

    このようにして、u の最小多項式 r(U) が得られるので、それを使って ψ(x;u)f(x) の間で x の多項式として互除法を実行すれば 1 次式の GCD が得られる(実際の計算過程では、x の多項式としての係数が u の有理式の形になることもあるので、分母が 0 にならないかどうかの確認や、分数形を多項式形に直すために、u の最小多項式が具体的に求まった後でないと計算ができない)。その 1 次式の根として αu の有理係数有理式(したがって、多項式)として求まるから、β=ucαu の有理係数多項式として求まる。

具体的には、次の手順になる。

  1. c の決定
  2. u の最小多項式の算出
  3. α, βu で表す

まず、u=cα+β で、適する整数 c を見つける。試しに c=1 としてみる。ψ(x,U)=(Ux)2+x(Ux)+x2f(x)=x32 の間で、x に関する終結式 r(U) を求める。 r(U)=U6+4U3+4 (これは一目で完全平方式と見抜けるが、常にそうとは限らないので、それに気づかないフリをして)r(U)=6U5+12U2r(U) の間で、U の多項式として GCD を求めると gcd(r(U),r(U))=U3+2 となるので、r(U) は平方因子 U3+2 を持つ。よって c=1 は不適とわかる。

次に c=1 を試す。ψ(x,U)=(U+x)2+x(U+x)+x2f(x)=x32 の間で、x に関する終結式 r(U) を求める。 r(U)=U6+108 r(U)=6U5r(U) の間で GCD を求めると gcd(r(U),r(U))=1 だから r(U) は平方因子を持たない。よって c=1 は適しており、u=α+βQ(α,β) に対する原始元。

したがって、r(U)=U6+108uQ 上の最小多項式(上述の通り、既約かどうか調べなくても、c=1 が適するとわかった時点で、次数のカウントによって r(U) が最小多項式とわかる。つまり自動的に既約になる)。<\p>

そこで、r(u)=u6+108=0 のもとで、ψ(x;u)=(u+x)2+x(u+x)+x2f(x)=x32x の多項式としての GCD を求める。普通に互除法を使うとこうだ。 f(x)÷ψ(x;u) の余り=2u2x+u363ψ(x;u)÷(2u2x+u36) の余り=u6+1084u4 ここで、r(u)=0 より 分母=4u40 が保証され、かつ 分子=u6+108=0 となるので、ここで確かに割り切れている。よって gcd(f(x),ψ(x,u))=2u2x+u36 (※ 実際には、GCD が 1 次式になることが保証されるので、第一の余り算で x1 次式が出た所でそれが GCD であることは確定する(次の余り算で割り切れることが確定する)。なお、一般には随時 r(u)=0 で次数下げして、係数が 0 にならないかどうか確かめる必要がある。例えば、余りが (u6+108)x2+u2x+3 のようになったら、見かけが x2 次式でも実際には 1 次式なので、これこそが GCD、ということになる(さらに互除法を進行させるのは誤り))

この 1 次式の根が α だから α=u362u2 となる。さらに、r(u)=u6+108=0 を使って「分母の有理化」を行うと α=108u+6u4216=u436u2 で、u=α+β から β=u+α=u436+u2

これで、グレブナー基底抜きで必要な情報が一通り揃えられた。

以上のアルゴリズムは、おそらく
http://ehito.hatenablog.com/entry/2019/02/24/150254
で公開されているプログラムとおおよそ同じものだろう。maxima の文法・コマンドを私が詳しく知らないのとプログラムの書き方が(私にとっては)かなり巧妙なのとでちゃんとは理解できていないが、部分的に読み取れる式の作り方や、

有理数体 Q に p の根を1つずつ添加し,その都度,拡大体の Q 上の定義式(絶対定義式)の次数を上げてゆく(代数体上の 2 次以上の既約因子から primitive element を生成する),分解体の定義式の計算としては一般的なものです

といったコメントからおおよそ見当がつく。(そして、

分解体の定義式の計算としては一般的なもの

ということは、要するに考え方としてはこの界隈の人にはよく知られたものであって、それにようやく追いつけた、というだけのことなのだろう。高次対称式の値を基本対称式に帰着して計算する、という以前のアルゴリズムの何と出遅れていたことよ…(笑))

続く

ガロア群の新しい計算法はあと2つ思いついているが、それは次回の記事に回す。この記事を書き始める前は全部いっぺんに書くつもりだったが、思ったより長い記事になってしまって残りを書く気力が今はない(笑)。なお、うち一方は計算効率などまったく考えていない、ほとんど「ネタ」でしかないものなので期待しないように。もう一方も、計算効率として特に優れているわけではないだろう。

また、f(x)Q 上可約だった場合のガロア群の求め方の注意についても次回に回す。


投稿日

カテゴリー:

,

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.