多項式のガロア群を、多項式を解くことなく求めたい、ということに端を発して、最終的には、次数には関係なく可解な多項式を解くプログラムを完成するところまで、辿り着くことができました(実際には5次方程式までしか解けていませんが)。
このプログラムもリリースしますので、参考にしていただければと思います。いくつか使用上の注意を述べます。
- テスト環境はsbcl上のMaximaです。正確には以下がテスト環境となります。
SBCL 1.2.11 (64bit版), Maxima 5.42.1, Mac OS X 10.14.1, iMac (late 2013, 8GBメモリ搭載, SSD+HDDによるFusion Drive)
最新版maxima-clisp-sbcl-5.42.1-win64.exeでインストールしたMaxima 5.42.1, sbcl, Windows 10 home, Fujitsu LIFEBOOK AH54/H, intel core i5 - Maximaの起動オプション指定は以下の通りです。これにより48GBの仮想メモリがmaximaプロセスに割り当てられます。
maxima -X "--dynamic-space-size 49152" - 今回作成したプログラムで5次多項式の根を冪根で解こうとすると、上記環境ではメモリが4GB以上必要になることがあります。そのため32bit版のLisp実装ではすぐにメモリが枯渇してしまいます。64bit版および48GB程度の仮想メモリの割り当てはそのような場合でも計算を継続するための対応です。
- SolveSolvable2.macの中で、SolveSolvable(p), pはxを変数とするモニック多項式、というAPIを定義しています。使い方は、
(%i2) load("SolveSolvable2.mac")$
(%i3) SolveSolvable(x^3-3*x-1)$
のようにします。(%i2)で他の.macファイルや必要なライブラリも読み込まれます。 - 4次以下の多項式であればほぼこの関数で解けるのですが、それ以上の次数の多項式を試す場合には、どうしてもトライ&エラーで色々と試したくなると思います。そのためにSSquintic.macというファイルを同梱しました。こちらを使えば、ガロア群の計算、組成列の計算、体の拡大と群の縮小の計算、解を冪根で求めること、検算をステップバイステップで行うことができます。
- 時間がかかる計算、メモリの大量消費の起きる計算は、Gal.macというファイルで定義しているgal_sol_V()という関数で起こります。この関数は多項式の根を原始元Vで表す式を作ります。5次方程式を解くと、この過程で項数が1000を超える対称多項式を基本対称多項式で表す計算が生じ、メモリの大量消費、および時間の消費が起こります。簡単な5次多項式でもこの計算で20GB程度、2時間程度の時間がかかります。私のiMacでは実際に仮想記憶に食い込むため、Fusion Driveによる高速化がなければもっと時間がかかるでしょう。
- 上記時間のかかる計算をしているとちゃんとやっているのか、不安になります。progress_flag:true;としておくとこの時間のかかる計算で進捗表示が行われます。またMac OS XのアクティビティモニタやLinuxのtopコマンドでモニタリングした方が良いです。
- まだ残っている課題として、\(x^3-2, x^5-3, x^5-4\)などの計算は途中でエラーが発生します。複数段の冪根による拡大体での割り算の計算で、これらの例では途中でゼロ割が発生するため、エラーにしています。コーディング上のバグではなく、数学上の検討が必要な感じです。
- (追記)Windows 10のwxMaximaでは以下の手順で動作確認しました。
下記のダウンロードファイルを適当な場所に保存し、展開する。
wxMaximaを起動する。
ファイルメニューから「バッチファイル...」という項目を選び、展開したフォルダの中にあるSolveSolvable2.macを指定する。
このファイルの中身がMaximaで実行されて、必要な関数が定義される。
SolveSolvable(x^3-3*x-1)$
などを試してみる。