\(\newcommand{\zettaiti}[1]{\lvert #1 \rvert} \newcommand{\field}[1]{\mathbb{#1}} \newcommand{\Q}{\field{Q}} \newcommand{\rnsg}{\vartriangleright} \DeclareMathOperator{\Gal}{Gal}\)
可解な方程式で、\(V\) の最小多項式 \(g(x)\) をガロア群の組成列にしたがって因数分解を進めて行く過程で、「退職後は素人数学者」さんの原アルゴリズムにほぼ沿った形で(グレブナー基底に頼らず)「\(\text{分母}=0\)」の問題に煩わされずに計算する方法があることがわかりました。「ガロア群が可解であるとき、方程式はべき根で解ける」の証明を思い返していて気づきました。以下解説します(以下常体)。
プロセス1 \(1\) のべき根の添加は最初に \(1\) 回だけで済ます
以前、私が記事に書いた「\(g(x)\) の因数分解を段階的に進めて行く手順」 では、各段階での素数 \(p = \zettaiti{G/H}\) ごとに、\(1\) の原始 \(p\) 乗根 \(\zeta_{p}\) を体に添加していく、という流れを想定していた。「退職後は素人数学者」さんや jurupapa さんのプログラムもその流れに沿っており、体の拡大時にその都度 \(1\) の原始 \(p\) 乗根の \(\Q\) 上の最小多項式
\[ x^{p-1}+x^{p-2} + \dots + x+1 \]
を「拡大体を定義する多項式の鎖 \(C\)」に追加していた。
しかし実は、\(1\) のべき根の添加は最初に \(1\) 回だけ行えば十分であり、その都度添加する必要はない。「ガロア群が可解であるとき、方程式はべき根で解ける」の証明を思い返してみよう。そこでは、ガロア群の位数(要素数)を \(N = \zettaiti{\Gal(\Q(V)/\Q)}\) とするとき、最初に \(1\) の原始 \(N\) 乗根 \(Z = \zeta_{N}\) を添加しており、これによって途中に現れるすべての素数 \(p\) に対して、「すでに \(1\) の原始 \(p\) 乗根 \(\zeta_{p}\) は添加済み」という状況を作っている。
例えば、\(N=6\) の場合、途中に現れる素数は \(p=2,3\) だが、\(1\) の原始 \(6\) 乗根 \(Z=\zeta_{6}\) があれば、\(Z\) のべき乗で \(1\) の原始 \(2\) 乗根、\(3\) 乗根が得られる。
\begin{align*} \zeta_{2} &= Z^{3} \quad (=-1) \\ \zeta_{3} &= Z^{2} \end{align*}
つまり、\(\zeta_{2}\) も \(\zeta_{3}\) もすでに元々の体に入っている。
今の例なら、鎖 \(C\) には最初に \(Z=\zeta_{6}\) の最小多項式 \(x^{2}-x+1\) を入れておけば、途中の計算で必要になる \(\zeta_{p}\) としては \(Z^{3}\) や \(Z^{2}\) を採用するだけでよく、\(\zeta_{p}\) のみたす多項式を新たに \(C\) に追加する必要はない。
\(N\) が素数でない時には、\(\zeta_{N}\) の \(\Q\) 上の最小多項式は \(x^{N-1} + \dots + x + 1\) ではなく第 \(N\) 円分多項式 \(\Phi_{N}(x)\) になるが、これは数式処理ソフトなら組み込み関数で求められるようになっていることも多いだろうし、組み込み関数がなくても手作りすることは難しくない。よく知られている、メビウス関数 \(\mu(n)\) を使った
\[ \Phi_{N}(x) = \prod_{d | N} (x^{d}-1)^{\mu(N/d)} \]
を使ってもいいし、(メビウス関数の計算には「引数の素因数分解」というそれなりにコストのかかる計算が必要なことを考えると)ehito さんが提示されている計算法(\(x^{N}-1\) を、\(N\) のすべての真約数 \(s\) に対して \(x^{s}-1\) で割って既約分数式になるまで約分し、結果の分子のみ取り出す)でもよいだろう。
なお、実際にはガロア群の位数(要素数)\(N = \zettaiti{\Gal(\Q(V)/\Q)} = \deg g(x)\) そのものを使う必要はない。\(N=18=2\cdot3^{2}\) のように、素因数分解に同じ素数が重複して現れる場合、途中の \(\zeta_{p}\) すべてを調達するには \(\zeta_{N} = \zeta_{18}\) までは必要なくて、重複を除いた積 \(2\cdot 3=6\) に基づく \(\zeta_{6}\) だけで十分だ。さらに、\(p=2\) に対しては \(\zeta_{p}=\zeta_{2}=-1\) は \(\Q\) に元々入っており、わざわざ \(Z\) のべき乗で作る必要はない。
したがって、実際には \(N\) の代わりに「\(N\) の異なる奇素因数の積」を \(N’\) として、最初に \(1\) の原始 \(N’\) 乗根 \(Z=\zeta_{N’}\) を添加する(\(\Q\) 上の最小多項式 \(\Phi_{N’}(x)\) を鎖 \(C\) に入れる)…というやり方でも構わない。この場合、途中で現れる \(p\) に対しては、
\[ \zeta_{p}=
\begin{cases}
-1 & (\text{\(p=2\) のとき}) \\
Z^{N’/p} & (\text{それ以外のとき})
\end{cases}\]
によって \(\zeta_{p}\) が調達できる(特に、\(N\) が \(2\) のベキである時は \(N’=1\) で、最初に \(\Phi_{N’}(x)=x-1\) を \(C\) に入れる必要すらない)。
プロセス2 ガロア群の再計算
さて、当然ながら、プロセス1でやったことだけではまだ元々の目的だった計算の正常化はできない。引き続き考察を進める。
ここで問題としている「\(\text{分母}=0\)」の問題がなぜ発生するかを復習すると、以前 jurupapa さんが指摘された通り
\(\zeta_{p}\) を添加しても実際には体が拡大しない場合に、\(\zeta_{p}\) とそれ以前に添加した要素の間に代数的な関係があり、\(\zeta_{p}\) の定義多項式になるはずだった \(x^{p-1} + \dots + x + 1\) がその体で可約になる
というのがその原因だった。これは、プロセス1でやったことだけでは解消できない。そのような「代数的な関係」が、今度は途中で添加しようとするべき根 \(r\) との間に発生するわけだから、\(r\) の定義多項式になるはずだった \(x^{p}-A\) が可約になってしまう。
これは要するに、最初に \(\Q\) に \(Z\)(\(\zeta_{N}\) や \(\zeta_{N’}\))を添加したときの拡大 \(\Q(Z)\) が、元々の最小分解体 \(\Q(V)\) の非自明な(=非有理数の)要素を含んでいる、ということだ。これは、\(\Q(Z)\) が \(\Q(V)\) 中での「正味の」拡大を生じている、ということを意味する。
\[ \Q(Z) \cap \Q(V) \supsetneq \Q \]
こういう時に何が起きるかは、以前見た。ベースとなる体が \(K=\Q\) から \(K’=\Q(Z)\) に拡大された結果、最小分解体が \(L = K(V)\) から \(L’=K'(V)\) に代わり、ガロア群の構造が縮小しているのである。
\[ \Gal(L’/K’) \text{ は } \Gal(L/K) \text{ の真部分群と同型} \]
具体的には、「\(K’\) の、\(L\) 中での正味の拡大」\(K’ \cap L = \Q(Z) \cap \Q(V)\) を \(M\) とおくと
\[ \Gal(L’/K’) \cong \Gal(L/M) \subsetneq \Gal(L/K) \]
である。
そろそろ核心に入ってきた。この新しいガロア群は、解の置換群としては元のガロア群の真部分群である。可解群の部分群はやはり可換群なので、新しいガロア群も可解群である。
と、いうことは。
この新しいガロア群を具体的な解の置換群として得られれば、その組成列に従って元の方程式がべき根で解ける、ということだ!
それにはどうすればいいか?すでに、\(K’\) 上の \(L’\) の原始元 \(V\) は手元にあるのだから、\(V\) の \(K’\) 上の最小多項式が求まればいい。つまり、やるべきことを順に挙げるとこうなる。
- \(g(x)\) が求まったら、(\(G\) やその組成列を求める前に)プロセス1にあるように \(N \; (=\deg g(x))\) または \(N’\) に基づいて \(Z\) を定める(\(Z\) の \(\Q\) 上の最小多項式を決定する)。
- \(g(x)\) を \(K’=\Q(Z)\) の上で既約分解する。これには、「代数拡大体上での既約分解」を使えばいい。
- 得られた既約因子のうち、任意の 1 つを選ぶ。これを、\(K’\) 上の \(V\) の最小多項式 \(g'(x)\) として一般性を失わない(ここでは \(g’\) は導関数ではなく、単に「亜種」を表すだけの記法)。
- \(n!\) 通りの \(V_{k}\) のうち、\(g'(x)\) の根になっているものを選抜する。つまり、「\(V_{k}\) を \(V\) で表した式」を \(g'(x)\) に代入し、\(g'(V)=0\) を利用して次数下げを行い、\(0\) になった \(V_{k}\) が \(g'(x)\) の根。こうやって選抜された \(V_{k}\) に対応する置換の全体 \(G’\) が、新しいガロア群 \(\Gal(L’/K’)\)(の置換群表現)。
- \(G’\) の組成列を求めて、\(G’\) が可解群かどうかを判定する。
元のガロア群(の置換群表現)\(G\) や、その組成列は求める必要がない。
\(G’\) が \(G\) の部分群であることから \(\zettaiti{G’}\) は \(\zettaiti{G}\) の約数で、特に \(\zettaiti{G’}\) の素因数はすべて \(\zettaiti{G}\) の素因数になっている。よって \(Z\) のべき乗(あるいは \(-1\))によって、\(\zettaiti{G’}\) の任意の素因数 \(p\) に対する \(\zeta_{p}\) が作れる(\(Z\) を新たに取り直す必要はなく、先ほどの \(Z\) をそのまま使えばよい。すでに \(g'(x)\) の係数は \(Z\) を含んでいるので、新しく \(Z\) を取り直してしまうと前の \(Z\) が表せなくなるおそれがあるため、それはやってはならない)。
よって、\(G’\) が可解群だったら、プロセス1で述べたように、\(\Q(Z)\) からスタートしてべき根の添加で \(g'(x)\) を因数分解していくことができる (\(\zeta_{p}\) の添加は不要)。特に、この過程では「\(\text{分母}=0\)」の問題が発生する心配はない。なぜならば: この場合、各ステップで必要な \(1\) のべき根がすべて予め体に含まれているので、添加すべき \(p\) 乗根 \(r\) のみたす多項式 \(x^{p}-A\) が各ステップごとに既約(その時点での体で)であることが保証される。これにより、\(r^{p}=A\) による次数下げで「\(0\) であるものは明示的に \(0\) になり、見かけ上 \(0\) でないものは真の値も \(0\) でないことが確定する」ようになるからだ。
この手順でも、\(\theta_{1}(x), \dots, \theta_{p-1}(x)\) の中に明示的に \(0\) であるものが発生する可能性は排除できない(恐らく)が、その場合は今度こそ「その3」で書いた手順で回避できる。
これまでのプログラムだと、最終的な解がべき根 \(r_{1}, r_{2}, \dots\) と \(1\) のべき根 \(Z_{1}, Z_{2}, \dots\) で表されていた所が、新しい手順に従えばべき根 \(r’_{1}, r’_{2}, \dots\) と \(Z\) 単独で表される、という結果になる。
コメントを残す