これまで、与えられた方程式のガロア群を求めたり、可解な方程式の解をべき根で表すことをテーマにして一連の記事を書いてきた。本記事では、その過程にグレブナー基底を利用する方法とその数学的背景、及びガロア群を求める新しいやり方を解説する。後者は、これまで非常に重かった計算をだいぶ軽減できると期待できる………と元々は思っていたのだが、前記事で「退職後は素人数学者」さんが従来の手法での計算時間の大幅な短縮を実現されていたので、そちらでの意義はあんまりないかもしれない(笑)。
グレブナー基底の概観
グレブナー基底を求めることで何が得られるかを、ここでの私たちの目的に沿った形で言うと「連立方程式を同値変形で解いた解」が得られる。例えば、連立方程式
をグレブナー基底を使って解きたいとしよう。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]
が求まったグレブナー基底で、これが上記の連立方程式の解が
また、入力に現れた 2*x+3*y-12,x-y-1
は、解きたい連立方程式の左辺である。それらをコンマで区切り、Wolfram Alpha なら {}
で、maxima なら []
でくくったものが第1引数になる。第2引数は {x,y}
や [x,y]
になっているが、これらは当面「どの文字を未知数と見るか」の指定だと思っておけばよい。実はこの順番にも意味があるが、それについてはまた後で説明する。
今述べた通り入力は連立方程式から「{y-2, x-3}
や [y-2,x-3]
には逆に「
このように、
今の場合、元の方程式が未知数について
「同値性が確実に保証された式変形」なんて高度な処理が、「任意の」連立方程式に対して可能なはずはない。グレブナー基底で扱える方程式は、未知数について「多項式で」表される形の連立方程式に限られる。
例えば
を解かせると、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]
となる。つまり、上の連立方程式を
に同値変形してくれたわけだ。
ここで、「同値変形」とは言っても結果はあくまで「多項式の形」でしか与えてくれないので、「
こういったグレブナー基底を求める機能が、ガロア群を求めたり、可解な方程式をべき根で解いたりする私たちの目的にどのように有効なのか、引き続き見ていこう。グレブナー基底について説明すべきことはまだある(例えば、上で触れた「未知数指定の指定順の意味」など)が、それは以下の説明の中のしかるべき個所で取り上げることにする。
従来の手法をグレブナー基底で
拡大体での商の計算
可解な方程式の解をべき根で表そうとした場合、「退職後は素人数学者」さんの元々のアルゴリズム(私が勝手に「アルゴリズムA」と名付けたもの)では、方程式によっては「べき根の選び方の不定性によって、
以前の記事では、
http://maxima.hatenablog.jp/entry/2019/01/21/011356
での ehito さんのコメントの通りだが、使っている文字をこちらに合わせ、数学的背景を交えながら説明する。
やりたいことは、要するに
を連立させ、これを
一見、第3の式には意味がなさそうにも思える。未知数
さて、
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]
となり、次の同値変形が得られた。
結果の第3式は
ここではまず、次のような疑問に先に答えておこう。「元々
となるという話だったのでは?
すると次に出てくる疑問はこうだろう。「それは結局人間が入力を数式処理ソフトに与える段階で『
その前に一旦、先ほど述べた「分母の有理化」と「変数の指定順」の関係について説明しておく。グレブナー基底を使うと一般に「分母の有理化」が可能で、それは次のようにすればいい。例えば、
と表してみる。これをグレブナー基底を使って同値変形するのだが、ここでは変数の指定順が重要だ。指定順を
となってうまく行かない(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]);
)ここは指定順を
となり、第3式が 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]);
)。
なぜ「変数の指定順」を変えるとうまく行くかと言うと、実はこの順序は、同値変形を行う上での「変数を消去する優先順位」の指定になっているからだ(※ 本当は、これは多変数多項式の「先頭項」を決めるための「単項式順序」というものを指定しているのだが、グレブナー基底を「連立方程式の同値変形」のツールとしてのみ見ている今の私たちの立場だと、それは結果的に「変数を消去する優先順位」を指定しているのと同じことになる、と理解すればよい)。つまり、最初の「
一方、ふたつ目の「
これで、先ほどの
さて、引き続き
となる。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]
という結果になって様子がおかしい。与えられた式をそのまま返しただけになっている。これは、元々の商
どうすればいいかは、
http://maxima.hatenablog.jp/entry/2019/01/21/011356
のコメント欄での jurupapa さんと ehito さんのやりとりの中で論じられている。「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]);
となる。ダミーでしかない
となって、期待通りべき根の選び方が
ここで、「勝手に
体の拡大過程の各ステップごとに、正しい結果を得るためにどんな条件を追加すればいいか
がわかったということで、グレブナー基底を使えばそれが自動的に得られるということだ。
さらに「本当に、べき根の選び方の自由度を調節すれば必ず
また、そもそも以前の記事で書いたように、「
の逐次因数分解
以上の話は、
グレブナー基底を用いれば,最小多項式と冪根の定義多項式を同時に求めることもできます
と書かれた通り、実はグレブナー基底を使えば手作りの必要はなく、
maxima で書かれたプロトタイプのプログラムは、ehito さんが http://ehito.hatenablog.com/entry/20190123/1548255005 で公開して下さっているが、やはりここでは数学的背景を交えて説明する。ここでは、根を求めたい多項式は
となっている。体の拡大過程の第 1 ステップでは
となっている(これを一時的に
しかし、ehito さんはそんなことをしないで、グレブナー基底を使って
を
この第 2 式から、
の根であることもわかる。同値変形で得られた以上、これが
※ ただ、ここが本当に「最小多項式」と言えるのかどうか、ちょっと自信はない。単に「同値変形になっている」というだけだと、最小多項式とは言い切れないのではないだろうか?例えば、左辺が「最小多項式の
今のは
で、これは実際には
である。変数の優先順位を
この技法を使った場合でも、方程式によっては
解を で表す式
元の方程式の解
いつもの例として
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 ] ) ;
で(
後ろ3つが元の [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}
どちらにしろ、いつもの結果
が得られている。
ただし、ここの計算でグレブナー基底を使うと、次数の高い方程式では処理が相当に重くなる。これは、元々グレブナー基底の計算は、かなり計算量が膨れ上がる性質のものだからだ(そのため、実用的にはこのように数式処理ソフトに任せて計算してもらうべきもので、手計算で実現できるようなものではない)。
ガロア群を求める別法
代数拡大体上での因数分解の確認と、小規模な拡張
早い所「ガロア群を求める別法」の解説に進みたいが、その過程で「代数拡大体上での因数分解」をちょっと拡張した技法に触れざるを得ないので、先にその話を済ませておく。「代数拡大体上での因数分解」の 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)
という結果が得られ、これは「
代数拡大体上での因数分解の拡張
以前
https://ikumi.que.jp/blog/archives/746
で説明したアルゴリズムは、「
既約分解したい多項式は重根を持たないとし、それを
である。また、
である。(以下同様)
すると、終結式は定数倍を除き
となるので、
となる。よって、これらが互いにすべて異なる整数
maxima の factor コマンドは、この機能をすでに内包済みのようだ。例えば
factor(x^4-2*a^2,a^2-2);
を入力すると、結果は
(x-a)*(x+a)*(x^2+2)
なる。つまり、
ガロア群を求める別法・具体的手順
「代数拡大体上での因数分解」の技法を知って以来、折に触れて思い返して「
http://ehito.hatenablog.com/entry/2019/02/24/150254
http://ehito.hatenablog.com/entry/2019/06/23/150150
も——私に何とか解る所だけ(笑)——参考にし、新しいアルゴリズムを解説してみる。なお、ここまでの記述で解る通り、新規性はなく、やってることは ehito さんの後追いに過ぎない。
元々の(有理数係数の)方程式を
また、ひとまずは使う手法に制限をつけずに、グレブナー基底も要所要所で利用して計算を進める。一通り話が済んだ後で、グレブナー基底を使っていた所を、より初等的な計算で迂回する手順を考察する。
グレブナー基底・あり
まず、
maxima による実行例を、
(%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)
つまりこうなっている。
当然ながら、必ず
まず、ひとつめの
のそれぞれが
つまり、
続いて、
今の場合は、
つまり
したがって、この
それにはどうすればいいか…は、ガロア理論(体論)の教科書には大体書いてあるだろう。
を
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]
となった(
となる。するとまず
だから
また、
もわかった。
ここから、ガロア群を求める考え方は大きく分けて2つある。
が最小分解体の原始元なのだから、 も 上で完全に因数分解しつくすはずである。実際、
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
が得られるので となっている。すなわち の つの根は とわかって、 を のそれぞれにうつす同型写像としてガロア群が得られる。それぞれの写像が解 , , をどのように入れ替えるかは、 と から直接計算できる。今のやり方は、
(あるいは を で割った商)を 上の 次式の積に分解する際に、いちから「代数拡大体上での既約分解」を使った。しかし、これは の次数が高くなるとかなり計算が大変になる。もうひとつの考え方は、各解を で表す式がわかっていることを使うものだ。 の両辺に、ガロア共役変換(ガロア群の同型写像)を順に一通り作用させてみたとすると、左辺には の根が一通りすべて並ぶ。そして右辺には解 , を別の解にうつした値が並ぶ。したがって、 の根の候補は のみである(※ 上の とは添字のつけ方は揃えていない)。これらの右辺に , を代入すると のみの式が作れる。 これらを順次 に代入して、 で次数下げして になるかどうかを調べれば、 の根が のどれなのかがわかる( が根なのは当たり前なので、実際には 以降だけ調べればよい)。例えば
なので は の根のひとつである。また、 から、 を にうつすガロア共役変換は , を , にうつすことがわかる。他の解 がどの解にうつるかは、この場合は消去法ですぐわかるが、一般には他の解は複数あるので一般性のある手順を述べると、そのうつり先は で、 を に置き換えた結果を で次数下げし、どの解と等しくなるかを調べることでわかる。このようにして、 の根であるとわかった に対し、 が解の置換としてどのように働くかが決定できる。今の場合は
が 次だからガロア群がフルの対称群 であることは予めわかり、 だろうがどんな置換でもガロア群の元になっていることが保証されているが、一般にはそうではない。だから、 のどれが の根なのかは、上のような試行錯誤によってしかわからないこともある。
こんな具合にして、「2つ目の解
一般化に当たって、注意すべきことを3つ述べておく。
の整数 の値が適するかどうかは、上のようにグレブナー基底を求めて、 , が の有理係数多項式で表せるかどうか、つまり求まったグレブナー基底が 及び の形の多項式を含んでいるかどうかでチェックする。ダメだった場合は、 の値を変えてうまく行くまで繰り返す…という試行錯誤を行う。試行錯誤なしに事前に適する の値を知る方法は、(あるのかもしれないが)私は知らない。今の場合、既約分解
は手計算で実行できたが、それは が の 次式だったおかげだ。このため、その根を とおくだけで と既約分解ができてしまった。しかし、一般にはこれは の高次の多項式になりうる。となると、「 に当たる高次多項式(あるいはそれを で割った商の高次多項式)を、 上で既約分解する」ことが必要になる。そのような場合にどうすればいいかを、 を例にとって説明する。まず、
の根 を使って を 上で既約分解するとこうなる。 次式に分解しきれずに残った既約 次式の一方(好きな方を選んでよい) の根を とする。 の原始元 を見つける。maxima で試したところ、 や ではダメで、 なら適した。
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]
となったので で、 の 上の最小多項式は である。先ほどの既約 次因子を、 係数の多項式として表す。 (前者は で割り切れることがわかっているので、その商を使ってもよい)そして、それぞれを 係数の範囲で既約分解する。
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
なので であり、
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
だから である。いずれも 次式まで因数分解しつくしたので、 が の最小分解体になっている。 の根は だ。後は先ほど述べた2つの方法のどちらかでガロア群( の根を で表した式その他)を求めればよい。ここまで、グレブナー基底を求めて得られた
のみの有理係数多項式をそのまま の最小多項式としてきたが、実を言うと本当にそう言い切れるかやや微妙な所がある。以前のアルゴリズムで、 のみたす 次の整数係数多項式 は必ずしも既約とは限らず、可約だった場合にはその任意の既約因子を の最小多項式として選択できた。それと同様に、上の手順で得られた のみの有理係数多項式も、場合によっては可約になっている…という可能性がない、ということは私には証明できなかった。そこで、グレブナー基底の結果から、 の最小多項式を確実に得る手順も述べておく。上の
の場合を例に取る。 の 上の最小多項式が 次の だから、 である。また、 の 上の最小多項式が 次の だから、 である。したがって、 の に対する拡大次数は で、これが の 上の最小多項式の次数である。ゆえに、グレブナー基底の同値変形によって の 次式が得られた時点で、これが最小多項式にもなっていることがわかる。この手順で、もし次数が一致していなければ、グレブナー基底によって得られたものは最小多項式でないので、それを 上で既約分解して、その任意の既約因子を最小多項式 とすればいいだろう。グレブナー基底を求める変形が同値変形であることは保証されているので、どの既約因子でも差し支えないはずだ。
さて、それでは
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
は関数の定義を意味する)だから
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
が商を求める関数で、
さらに、
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]
より
が得られる。また、
これを
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
ここでどうするか。残っている
poly_reduced_grobner([g(u),tt(c),v-u-2*c],[u,c,v]);
でグレブナー基底を計算させると、かなり長い出力となったので結果は省略するが、
これらを使って
こんな具合に、どの段階でも「そこまで拡大した体の
グレブナー基底・なし
計算原理がわかった所で、引き続きグレブナー基底を回避する初等的アルゴリズムを考察しよう。上の手順でグレブナー基底を使っているのは、
となるが、こうやって具体化しない方が一般化の道筋が見えやすいだろう。
以下の計算をやりやすくするため、
考えることは次の3つになる。
- 上のような整数
を選べば、 が をみたすのはどうしてだったか。 - その整数
はどうやって見つければいいか。 - そのときどうやって
の 上の最小多項式を得ればよいか。
まず
を に代入して を消去すると
となる。よって、 とおくと、 は と の共通根。しかし、 以外の共通根はない。なぜならば、 の他の根 に対しては
である。そうすると だったことと に対する仮定から と言え、同様に も言える。ゆえに、
係数の と 係数の の間で互除法を実行すれば、唯一の最大公約式 が 係数の多項式として算出され、 が言えた。するとさらに も の元である。これで で、一方 より であるから がなりたつ。- 今度は不定元
に対し と定義し直し、 との間で変数 についての終結式を作る。終結式の性質から、 がどんな整数でもその結果は の 係数多項式( とする)になるが、一方 は定数倍の違いを除き次のものに等しい。 したがって、 の根は の全体である。よって、整数 の値を色々変えて、 が平方因子を持たない( と が互いに素になる)ような が見つかるまで試せばよい。 上のふたつから、適切な
に対しては、終結式として求めた が を根に持っている。したがって、 の 上の最小多項式は を割り切る。一方、 は 次、 は について 次であることから、次のふたつはいずれも に等しい。 の についての次数(終結式の作り方より) の 上の拡大次数
上の の最小多項式の次数でもある( )。よって、 こそがその最小多項式でなければならない。つまり、こうやって求めた終結式こそが、 の最小多項式そのものだったというわけだ。………これ、見直してみると上の方でやってる「
係数の多項式を 上で既約分解する」で出てきたのとまったく同じ計算してますね。まだ理解が整理できてないですが、おそらく実はもうちょっと深い背景があって、それを理解してると両方とも同じ話としてスッキリ理解できるんでしょうね…。 が最小多項式になり、したがって既約になる、ということは、上の話で、元々 が で既約だった場合は、 も既約で 上で分解はしない、ということですね。このようにして、
の最小多項式 が得られるので、それを使って と の間で の多項式として互除法を実行すれば 次式の GCD が得られる(実際の計算過程では、 の多項式としての係数が の有理式の形になることもあるので、分母が にならないかどうかの確認や、分数形を多項式形に直すために、 の最小多項式が具体的に求まった後でないと計算ができない)。その 次式の根として が の有理係数有理式(したがって、多項式)として求まるから、 も の有理係数多項式として求まる。
具体的には、次の手順になる。
の決定 の最小多項式の算出 , を で表す
まず、
次に
したがって、
そこで、
この
これで、グレブナー基底抜きで必要な情報が一通り揃えられた。
以上のアルゴリズムは、おそらく
http://ehito.hatenablog.com/entry/2019/02/24/150254
で公開されているプログラムとおおよそ同じものだろう。maxima の文法・コマンドを私が詳しく知らないのとプログラムの書き方が(私にとっては)かなり巧妙なのとでちゃんとは理解できていないが、部分的に読み取れる式の作り方や、
有理数体 Q に p の根を1つずつ添加し,その都度,拡大体の Q 上の定義式(絶対定義式)の次数を上げてゆく(代数体上の 2 次以上の既約因子から primitive element を生成する),分解体の定義式の計算としては一般的なものです
といったコメントからおおよそ見当がつく。(そして、
分解体の定義式の計算としては一般的なもの
ということは、要するに考え方としてはこの界隈の人にはよく知られたものであって、それにようやく追いつけた、というだけのことなのだろう。高次対称式の値を基本対称式に帰着して計算する、という以前のアルゴリズムの何と出遅れていたことよ…(笑))
続く
ガロア群の新しい計算法はあと2つ思いついているが、それは次回の記事に回す。この記事を書き始める前は全部いっぺんに書くつもりだったが、思ったより長い記事になってしまって残りを書く気力が今はない(笑)。なお、うち一方は計算効率などまったく考えていない、ほとんど「ネタ」でしかないものなので期待しないように。もう一方も、計算効率として特に優れているわけではないだろう。
また、
コメントを残す