可解な5次方程式の厳密解を求める
プログラム     with Mathematica 13.3

2025 年3月  by  　(HyperlinkURL["mixedmoss", https://mixedmoss.com])

§0.  Code(初期化セル)

以下のコードを評価してください．なお，コードの評価はすぐ終わりますが，notebook全体の評価には1分程度かかります．

ClearAll["`*"];

galoisBase[f_,selected0_:0]:=Module[{n,rx,allsets,coef,symm,base,contents,sols,oldselected,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10},
n=Exponent[f,x];
allsets=Subsets[Range[-5,5],{n}];
vars=Take[{x1,x2,x3,x4,x5,x6,x7,x8,x9,x10},n];
coef=CoefficientList[f,x]//Reverse//Drop[#,1]&;
symm=Table[SymmetricPolynomial[i,vars],{i,1,n}];
(*[Step1&2]while文の実行*)
sols=Table[1/v,{i,1,n}];rx=V=v;(*whileの初期値*)
selected=If[SameQ[selected0,0],RandomChoice[allsets],selected0];(*whileの初期値*)
While[
!AllTrue[Append[sols,rx],PolynomialQ[#,v]&]||Discriminant[rx,v]==0,(*「R(x)が重解を持つ」∨「rx,solsのうち多項式でないのがある」の間は以下を実行*)
oldselected=selected;
vs=Permutations[vars].selected;
contents=Append[symm+coef*Table[(-1)^(k-1),{k,1,n}],v−vs[[1]]];
rx=GroebnerBasis[contents,Append[vars,v]][[1]];(*原始元vを解に持つ因数分解前の式*)
V=If[IrreduciblePolynomialQ[rx],rx,Last@(List@@Factor[rx])];(*VのGroebner基底*)
sols=Table[base=GroebnerBasis[contents,{vars[[i]],v},Drop[vars,{i}]]//PolynomialMod[Last[#],V]&;(*解のGroebner基底*)
            vars[[i]]/.Solve[base==0,vars[[i]]][[1]]//Collect[#,v]&,{i,1,n}];
selected=RandomChoice[allsets]
];
selected=oldselected;
{V,sols}]

galoisGroup[f_,selected0_:0]:=Module[
{n,m,vsols,vs0,vs1,pos,vset,perm1,permi,irQ},
{V,sols}=galoisBase[f,selected0];
n=Exponent[f,x];
m=Exponent[V,v];
irQ=SameQ[m,Factorial[n]];(*=irreducibleQ*)
(*[Step3]V(x)の解の集合vsを,その第１要素v(=v1)の式で表す．(Subscript[Galois群がS, n])の時はバイパスしています*)
If[!irQ,vsols=v/.NSolve[V==0,v];
vs0=vs/.AssociationThread[vars->sols]//Collect[#,v]&;
vs1=vs0/.{v->vsols[[1]]};
pos=Table[PositionSmallest[Abs[vs1-vsols[[i]]]],{i,1,m}]//Flatten;
vset=vs0[[pos]]];
(*[Step4]Galois群を求める．(Subscript[Galois群がS, n])の時はバイパスしています*)
galoisgroup=If[irQ,Permutations[Range[n]],
   perm1=sols/.{v->vsols[[1]]};
   Table[
    permi=sols/.{v->vsols[[i]]};
    Table[PositionSmallest[Abs[permi-perm1[[k]]]][[1]],{k,1,n}]//Flatten,{i,1,m}]];
MatrixForm[Sort[galoisgroup]]]

$c5=Table[RotateLeft[{1,2,3,4,5},i],{i,0,4}];(*名前の衝突を避けるため，$をつけている*)
$d5=Join[$c5,$c5/.{2->5,5->2,3->4,4->3}]//Sort;
$f20=Join[$d5,$d5/.{2->3,3->5,5->4,4->2}]//Sort;

replace[gline_List,rp_List]:=(gline/.AssociationThread[Range[5]->rp])[[rp]];(*ガロア群の変換*)
realRoot[p_]:=Sign[p]Abs[p]^(1/5);(*実5乗根*)
(*(r1,r2,r3,r4)がある時，(r4,r3,r1,r1),(r3,r1,r4,r2),(r2,r4,r1,r3)がもしあれば消去*)
deleteRedundancy[rsets_]:=
　Nest[RotateLeft@DeleteElements[#,{#[[1]][[{4,3,2,1}]],#[[1]][[{3,1,4,2}]],#[[1]][[{2,4,1,3}]]}]&,rsets,2];

solveQuintic[f_]:=Module[
{coef,delta,g,order,gal,perm,i,r0,r1,r2,r3,r4,$w1,$w2,$$w1,$$w2,$r1,$r2,$r3,$r4,a1,a2,a3,a4,t1,t2,t3,t4,w1,w2,Rset,a2set,a3set,rsets,tset1,tset2,k1,k2,k3,k4,k5,k6,k7,m,j,pos,absTable},
coef=CoefficientList[f,x]//Reverse;
delta=coef[[2]]/coef[[1]]/5;
g=f/.{x->x-delta}//Collect[#,x]&;(*(x^4)の係数を0にする．本来は不要なはずだが 「4次の係数が0でない時」にエラーが出やすい．*)
galoisGroup[g];
order=Length[galoisgroup];
gal=If[MemberQ[{5,10,20},order],Switch[order,5,$c5,10,$d5,20,$f20],
　　　　Print["可解な5次方程式ではありません(It's not a solvable quintic equation)"];Break[]];
perm=Permutations[{1,2,3,4,5}];
i=1; While[Sort[replace[#,perm[[i]]]&/@galoisgroup]!=gal&&i<=120,perm[[i]];i++];
galoisbase={x1,x2,x3,x4,x5}=sols[[perm[[i]]]];
(*part1(前半)[変数の準備](Subscript[Lagrange分解式r, 0])~(Subscript[r, 4]), (Subscript[t, 1]),(Subscript[t, 2]),(Subscript[t, 3]),(Subscript[t, 4]),(Subscript[w, 1]),(Subscript[w, 2])を作る *)
Clear[ζ];
r0=x1+ x2+  x3 + x4 + x5//PolynomialMod[#,V]&;
r1=x1+ζ x2+ ζ^2 x3 +ζ^3 x4 +ζ^4 x5//PolynomialMod[#,{V,Cyclotomic[5,ζ]}]&;
r2=x1+ζ^2 x2+ ζ^4 x3 +ζ x4 +ζ^3 x5//PolynomialMod[#,{V,Cyclotomic[5,ζ]}]&;
r3=x1+ζ^3 x2+ ζ x3 +ζ^4 x4 +ζ^2 x5//PolynomialMod[#,{V,Cyclotomic[5,ζ]}]&;
r4=x1+ζ^4 x2+ ζ^3 x3 +ζ^2 x4 +ζ x5//PolynomialMod[#,{V,Cyclotomic[5,ζ]}]&;
t1=r1^5+r4^5;t2=r2^5+r3^5;t3=r1*r4;t4=r2*r3;
w1=r1 r2^2+r3^2 r4;
w2=r1^2 r3+r2 r4^2;
(*part1(後半)[単純計算] (Subscript[以下のk1～k7は全てF, 20])の固定体に含まれるので,(Subscript[Galois群がC, 5]),(Subscript[D, 5])であっても「単純計算」で値が求まる.*)
k1=t1+t2//PolynomialMod[#,{V,Cyclotomic[5,ζ]}]&;
k2=(t1-t2)^2 //PolynomialMod[#,{V,Cyclotomic[5,ζ]}]&;
k3=(t1-t2)(t3-t4)//PolynomialMod[#,{V,Cyclotomic[5,ζ]}]&;
k4=t3+t4//PolynomialMod[#,{V,Cyclotomic[5,ζ]}]&;
k5=t3*t4//PolynomialMod[#,{V,Cyclotomic[5,ζ]}]&;
k6=w1+w2//PolynomialMod[#,{V,Cyclotomic[5,ζ]}]&;
k7=(w1-w2)^2//PolynomialMod[#,{V,Cyclotomic[5,ζ]}]&;
(*part2[2次拡大(1回目)]k1~k3からt1,t2が,k4,k5からt3,t4の値が求まる．下のtset1には{t1,t2,t3,t4}の解の１つ目の組が，tset2には2つ目の組が入る*)
{tset1,tset2}={$t1,$t2,$t3,$t4}/.Solve[$t1+$t2==k1&&($t1-$t2)^2==k2&&($t1-$t2)($t3-$t4)==k3&&$t3+$t4==k4&&$t3*$t4==k5,{$t1,$t2,$t3,$t4}];
(*part3[2次拡大(2回目)]R1+R4=t1,R1R4=(t3^5),R2+R3=t2,R2R3=(t4^5).2次方程式を解くとR1~R4が求まる*)
Rset={R1,R2,R3,R4}/.Solve[(R1+R4==tset1[[1]]&&R1 R4==tset1[[3]]^5&&R2+R3==tset1[[2]]&&R2 R3==tset1[[4]]^5)
||(R2+R3==tset2[[1]]&&R2 R3==tset2[[3]]^5&&R2+R3==tset2[[2]]&&R2 R3==tset2[[4]]^5),{R1,R2,R3,R4}]//Simplify//deleteRedundancy;
(*part4[5次拡大]R1~R4の5乗根をとりr1~r4が求まる.このうちw1とw2の値を満足させる組を見つける.時間節約のため 有効数字計算を利用*)
{$r1,$r2,$r3,$r4}=If[Element[Rset,Reals],
(*Rsetが実数の時*)
  rsets=realRoot/@Rset;(*これは出力にもなるので，有効数字にしない*)
  absTable=Table[{a1,a2,a3,a4}=rsets[[i]];
  ww1=N[a1 a2^2+a4 a3^2];ww2=N[a1^2 a3+ a2 a4^2];
    Total@Abs@N[{ww1+ww2-k6,(ww1-ww2)^2-k7}],{i,1,Length[rsets]}];
    j=PositionSmallest[absTable]//First;(*|w1+w2-k6|+|(w1-w2)^2-k7|が最小となる位置を求める．なぜか$w1,$w2を使うとエラーとなる*)
  rsets[[j]],
(*Rsetが虚数の時*)
  ζ=Cos[2Pi/5]+I Sin[2Pi/5];(*この様に決めても一般性を失わない*)
  absTable=Table[(*absTableは実数の時と名前は同じだが，実行時は名前がぶつかることはない*)
    a1=Rset[[i,1]]^(1/5)//N;a4=Rset[[i,4]]^(1/5)//N;(*r1は5つの5乗根の内どれをとっても良い.r4とr1は複素共役*)
    a2set=Table[Rset[[i,2]]^(1/5)*ζ^n,{n,0,4}]//N;(*r2は5通りの5乗根を考える必要がある*)
    a3set=Table[Rset[[i,3]]^(1/5)*ζ^(-n),{n,0,4}]//N;(*r2とr3は複素共役*)
    Table[$w1=a1 a2set[[k]]^2+a4 a3set[[k]]^2;$w2=a1^2 a3set[[k]]+a4^2 a2set[[k]];
    Total@Abs@N[{$w1+$w2-k6,($w1-$w2)^2-k7}],{k,1,5}](*|$w1+$w2-k6|+|($w1-$w2)^2-k7|のTable*)
    ,{i,Length[Rset]}];
  pos=FirstPosition[absTable,Min@absTable];(*|$w1+$w2-k6|+|($w1-$w2)^2-k7|が最小となる位置を求める*)
  m=pos//Last;j=pos//First;(*posは {2,4}のように出力される．これは「Rsetの２番目∧a2set[[4]]」を表す*)
  (*pos=PositionSmallest[Flatten[absTable]];m=Mod[pos,5],n=Quotient[pos]でも大丈夫なはずだが分かりにくい*)
  {Rset[[j,1]]^(1/5),Rset[[j,2]]^(1/5)*ζ^(m-1),Rset[[j,3]]^(1/5)*ζ^(-(m-1)),Rset[[j,4]]^(1/5)}//Simplify
  ];(*end of if*)
(*part5[代入] r0~r4の値を代入するとx1~x5が求まる*)
ζ=Cos[2Pi/5]+I Sin[2Pi/5];(*偏角は2π/5に*) 
x1=1/5($r1+$r2+ $r3+ $r4)-delta//Simplify;(*x1~x5の定義を書き直し．また本来は()内にr0を入れれば deltaや平行移動は不要なはず*)
x2=1/5(ζ^4$r1+ζ^3 $r2+ζ ^2 $r3+ζ $r4)-delta//Simplify;
x3=1/5(ζ^3$r1+ζ $r2+ζ^4 $r3+ζ^2$r4)-delta//Simplify;
x4=1/5(ζ^2$r1+ζ^4 $r2+ζ $r3+ζ^3 $r4)-delta//Simplify;
x5=1/5(ζ$r1+ζ^2 $r2+ζ ^3 $r3+ζ^4 $r4)-delta//Simplify;
{x1,x2,x3,x4,x5}]//Quiet

§1. 使用例

私の知る限り，Mathematicaでは 5 次方程式の厳密解を求めるコマンドはありません．(3次,4次は有ります)  多分SageMathでも無いと思います．彼らなら簡単に作れると思いますが「余り意味がない」或いは「需要がない」或いは「実行時間がかかるのでかっこ悪い」或いは「複素数係数でないと意味がない」と思って実装していないのだと思います．確かにそうかも知れませんが，私の様に趣味で遊んでいる人間には，最高に面白い遊び場です．使い方は, 可解かつ既約な有理数係数5次方程式 f を solveQuintic[f]  に代入して評価するだけです．(quintic equationは 5次方程式という意味．可解な方程式は SageMath を使えばすぐ見つかります．(HyperlinkURL["https://mixedmoss.com/mathematica/Galois/solvableEquations.txt", https://mixedmoss.com/mathematica/Galois/solvableEquations.txt]) を参照.)      

 fの解は  x1,x2,x3,x4,x5 に，Galois群は galoisgroup(リスト) に，原始元vの最小多項式はVに，fの解のvによる表現は galoisbase(リスト) に, それぞれ  Global に入っています．また，以下で (Subscript[R, i])=  ((Subscript[r, i])^5)(1≤i≤4)というのは, Lagrange 分解式(Subscript[r, i])の5乗の事です．無視して下さっても構いません．

例1. (x^5)-5x+12

f1=x^5-5x+12;
solveQuintic[f1]//TraditionalForm//Timing

長いです．虚数の累乗はないので (Subscript[R, i]) が実数のケースです．f (x1)=0 を直接確かめる事も出来ますが(FullSimplifyを2回使います)，かなり時間がかかるので近似値を比べてみます．最初が累乗根，次がNSolveで求めた近似解です．

N[{x1,x2,x3,x4,x5}]//Sort
x/.NSolve[f1==0,x]//Sort

一致します．そして実数解は1個です．Galois群を見てみましょう．変数 galoisgroup に入っています．

MatrixForm[Sort[galoisgroup]]
Length[galoisgroup]

位数が10なので Galois群は (Subscript[D, 5])です．生成元vの 最小多項式はVに，fの解をvで表した式は galoisbase に入っています．

V
galoisbase[[1]]//Style[#,Small]&

例2. (x^5)-3

f2=x^5-3;
solveQuintic[f2]//TraditionalForm//Timing

Gal=(Subscript[F, 20])の中では基本中の基本の方程式です．(Subscript[R, i]) が実数のケースです. 近似値を比較します．

N@{x1,x2,x3,x4,x5}//Sort
x/.NSolve[f2==0,x]//Sort

例3. (x^5)-11(x^3)-10(x^2)+11x+10

f3=x^5-11x^3-10x^2+11x+10;
solveQuintic[f3]//TraditionalForm//Timing

Gal=(Subscript[D, 5])(Subscript[かつ虚数の5乗根があるのでR, i])が虚数の場合です.　虚数5乗根を使ってるためか，かなり時間がかかりました．

虚数5乗根の定義は Mathematicaでは「z=r(cosθ+isinθ)(r>0,-π<θ<π)のとき，(z^(1/5))=(z^(1/5))=(r^(1/5))(cos(θ/5)+isin(θ/5))」だと思います．3乗根の例では，

Abs@{(-1-I)^(1/3),((-1-I)^(1/3))}
Arg@{(-1-I)^(1/3),((-1-I)^(1/3))}

となります．次に，近似値を比較します．

N[{x1,x2,x3,x4,x5}]//Sort
x/.NSolve[f3==0,x]//Sort

小さな虚部が邪魔なので消します．

trim[x_]:=If[Abs[Im[N[x]]]<10^(-15),Re[N[x]],N[x]]
(trim/@{x1,x2,x3,x4,x5})//Sort

実数解5個です．一般に (Subscript[R, i])が虚数なら実数解は5個， (Subscript[R, i])が実数なら実数解は1個となります.  念の為，グラフも描いてみると，

Plot[f3,{x,-3,3.6},PlotLegends->f3]

§2．プログラムの解説

2 - 1. プログラムの構造

Galois群が (Subscript[F, 20]), (Subscript[D, 5]), (Subscript[C, 5]) のいずれにも対応するように作りましたが，3種類のプログラムを一緒にしたわけではなく，(Subscript[F, 20]) に対するプログラムが元になっています．下の様な構造になります．

入力(Overscript[→, [コマンド]galoisGroup])Galois群
　　(Overscript[→, [Step0]解の置換])整形されたGalois群
　　(Overscript[→, [Step1]単純計算])(Subscript[F, 20])の固定体に属する変数 (Subscript[k, 1])~(Subscript[k, 7])
　　(Overscript[→, [Step2]2次方程式を解く])(Subscript[D, 5])の固定体に属する変数 (Subscript[t, 1])~(Subscript[t, 4])
　　(Overscript[→, [Step3]2次方程式を解く])(Subscript[C, 5])の固定体に属する変数(Subscript[R, 1])~(Subscript[R, 4])
　　(Overscript[→, [Step4]5乗根を求める])(Subscript[r, 1])~(Subscript[r, 4])
　　(Overscript[→, [Step5]単純代入])(Subscript[x, 1])~(Subscript[x, 5])

2 - 2.簡単な説明

(Subscript[R, 1])= ((Subscript[r, 1])^5),(Subscript[R, 2])= ((Subscript[r, 2])^5),(Subscript[R, 3])= ((Subscript[r, 3])^5),(Subscript[R, 4])= ((Subscript[r, 4])^5) ((Subscript[r, i])はLagrange の分解式) と置いています．また「単純計算」というのは「(Subscript[単純にx, i])=(Subscript[x, i])(v)(vは原始元) を代入し，円分多項式と最小多項式VのMod を考えるだけの計算」の意味です．この計算はMathematicaでは PolynomialMod というコマンドを使い，非常に速く実行できます．

「(Subscript[F, 20]) に対するプログラムが元になっている」 というのは，例えば (Subscript[Galois群がC, 5])の方程式の場合， (Subscript[R, 1])~(Subscript[R, 4])なら「単純計算」で求まります．(Subscript[Galois群がD, 5])の方程式の場合は (Subscript[t, 1])~ (Subscript[t, 4]) なら「単純計算」で求まります．((Subscript[t, 1])~ (Subscript[t, 4]) の定義は 「solveQuintic」の コード part1 を御覧ください. ) そして (Subscript[R, 1])~(Subscript[R, 4])は「(Subscript[t, 1])~ (Subscript[t, 4])の値を使った2次方程式を１回解く」で求まります．一方 Galois群が (Subscript[F, 20])の方程式の場合は，(Subscript[t, 1])~ (Subscript[t, 4])を求めるのにも2次方程式が必要で，(Subscript[R, 1])~(Subscript[R, 4])を求めるのに更にもう一度必要です．しかしMathematicaにとって 「2次方程式を2回解くこと」は朝飯前です．  したがって (Subscript[C, 5])や (Subscript[D, 5]) の場合でも (Subscript[F, 20])の場合と同様に解くほうが，プログラムが一つにまとまって楽です．

しかしその場合でも 「[Step4] (Subscript[R, i])の5乗根 (Subscript[r, i]) を求める」に於いて，

(ア)(Subscript[R, 1])~(Subscript[R, 4]) が実数  　　 (イ)(Subscript[R, 1])と(Subscript[R, 4]),  (Subscript[R, 2])と(Subscript[R, 3]) が複素共役 ((Subscript[r, 1])と(Subscript[r, 4]),  (Subscript[r, 2])と(Subscript[r, 3])が複素共役)

の2つの場合分けが必要になります．そして(ア)の場合は 「(Subscript[r, 1])~(Subscript[r, 4])が全て実数としても一般性を失わない事」(D5_solutions.nb「補足」)， (イ)の場合は「(Subscript[r, 1]) を (Subscript[R, 1])の任意の5乗根にとっても一般性を失わない事」(参考文献 「可解な5次方程式について」) が非常に役立ちました．
   
 さらに Galois群の変換を最初に行っています．(Subscript[仮にGalois群がF, 20])であったとしても，それは同型という意味で，それでは不十分です．(Subscript[F, 20])=<(1,2,3,4,5),(2,3,5,4)> に「完全に」一致させたいわけです．うまいことにGalois群は 解x1,x2,x3,x4,x5の変換によって変えることができ，それを使って (Subscript[F, 20])に完全に一致させることが出来ます． 例えば ((x^5)-3)のGalois群Galを求めてみましょう．コマンド「galoisGroup」 を使います. (毎回評価するたびにGalois群が変わっては困るので，vの係数を指定しています.)

galoisGroup[x^5-3,{1,2,3,4,5}]//Style[#,Small]&

これは (Subscript[F, 20])と同型ですが，完全に一致している訳ではありません．ここで解の置換を行います．例えば2行目[({{1, 3, 2, 5, 4}})]で表される変換 a=(({{1, 2, 3, 4, 5}, {1, 3, 2, 5, 4}}))は ,「 x3→x5,x5→x3」という置換λ によって，次のように変わります．
                               (({{1, 2, 3, 4, 5}, {1, 3, 2, 5, 4}}))(Overscript[→, λ])(({{1, 2, 5, 4, 3}, {1, 5, 2, 3, 4}}))=(({{1, 2, 3, 4, 5}, {1, 5, 4, 3, 2}}))=(((2,3,5,4))^2)

[({{1, 3, 2, 5, 4}})]が (Subscript[F, 20]) の要素[({{1, 5, 4, 3, 2}})]に移りました．この変換は次のコードで実行できます．

replace[gline_List,rp_List]:=(gline/.AssociationThread[Range[5]->rp])[[rp]];

たとえば上の変換はこの様になります．

λ={1,2,5,4,3};　replace[{1,3,2,5,4},λ]

これを使いGalois群が (Subscript[F, 20])と一致するまで ,解を片っ端から置換しています．実は，この例では λでGalを移すと (Subscript[F, 20]) と一致します．

(replace[#,λ]&/@galoisgroup)//Sort
%==$f20

galoisbase にはこの様に置換された解のリストが入っています．（元の解の方は solsです．）

§3．補足

3-1. 使用上の注意

申し訳ないですが，まだまだ完全ではないと恐れています. 予測しないエラーが時々出ます．

原因の一つは「有効数字の取り扱い」です．例えば
list={12.727922061357855`,18.181704379892327`,14.142135623730951`,5.453782318534476`,20.631194122675506`,9.317485623690725`,13.763198241767935`,17.146428199482248`,16.212687984551113`,4.898979485566333`,18.560641761855344`,1.0352761804100834`,16.59162536651413`,3.0042925757513035`,17.626901546924213`,6.313193047939453`,4.418506138124382`,3.863703305156282`,22.045407685048605`,10.731699186063846`,21.010131504638522`,1.4142135623730883`,8.282209443280674`,1.021405182655144`*^-14}
の中から最も0に近いPositionを得るのに PositionSmallest と Position&Min(リストのリストのとき）を使っていますが，まれに「内部精度限界$MaxExtraPrecision = 50.`に達しました」というエラーが出て困ります．

もう１つの問題は「名前の衝突」です．私自身も動作確認時に f20,c5,d5などの変数をうっかり使用してしまい，半日ぐらいハマってしまいました．ご注意下さい．できる限り Module の内部変数に入れてGlobal変数を減らすようにしていますが，入れすぎるとプログラムが読みづらくなるので難しいです．

今回solveQuintic を使って800問以上の5次方程式を解きましたが，全て, 近似値は 「NSolve」 を使って得た結果と一致しました．「ある程度は」信用してくださって良いと思います．(もし「NSolve」と近似が一致しない解が出力された場合は，こちらまでお知らせ頂けると有り難いです．)　また最初に平行移動して 「(x^4)の係数を0」としていますが，数学的にはこれは全く不要です．しかしなぜか「(x^4)の係数が0でない時」にエラーが多かったので，その様にプログラムしました．しかしこれは GaloisGroupProgram.nb を修正する前だったので，今は問題ないかも知れません．実行時間には影響ないので直していません.

3 - 2. 他のコ―ド

このノートブックのコードを評価すると，solveQuintic 以外に  galoisBase,  galoisGroup などのコードも評価されます．これらのコードについては (HyperlinkURL["gettingIntoTheProgram.nb", https://mixedmoss.com/mathematica/Galois/notebook/gettingIntoTheProgram.nb]) をご覧ください.

3 - 3. 数学的な性質

Q係数の既約可解5次方程式について，次の性質が成り立ちます.

[1]「(Subscript[R, 1]),(Subscript[R, 2]),(Subscript[R, 3]),(Subscript[R, 4 ])は全て実数」  または「(Subscript[R, 1])(Subscript[とR, 4]),(Subscript[R, 2])(Subscript[とR, 3])は複素共役 」（証明は D5_solution.nb 「補足」と同様)
[2]  Gal=(Subscript[C, 5])のときはfは実数解を5個持つ.Gal=(Subscript[D, 5])または (Subscript[F, 20])  のときは実数解は1個または5個．即ち，実数解は1個か5個となる． 3個の実数解を持つことはない．（[1]からすぐ言えます)

なお，参考文献[1] によると 「Q係数の既約可解5次方程式  (x^5)+ax+b=0 は実数解をただ一つ持つ」 (定理5.4)が言えます．

具体例や，より詳しい説明については   (HyperlinkURL["https://mixedmoss.com/mathematica/Galois", https://mixedmoss.com/mathematica/Galois/index.shtml]) にお越しください