1.分解体の絶対定義多項式

今回のオリジナルプログラム https://github.com/YasuakiHonda/GaloisGroupSolver が行う主な処理は
1.分解体の絶対定義式
2.Galois 群
3.組成列
4.添加する元の定義式
5.分解体の相対定義式
の算出です.種々の方法の比較の意味も含め,私家版を作成しましたので,順次公開させて頂きます.

まず,オリジナルプログラムの1.では,入力の多項式 p の次数 n が低い場合を想定して私が気軽に提案した(数値根と n! 次式の因数分解を用いる)方法を採用して頂いたのですが,これは明らかにハイコストであり,例えば,x^5-2 の処理に数分を要します.他にも,primitive element と p の根との関係の調整はユーザーが行わねばなりません.

これに対し,下記の mp は有理数\mathbb{Q} に p の根を1つずつ添加し,その都度,拡大体の \mathbb{Q} 上の定義式(絶対定義式)の次数を上げてゆく(代数体上の 2 次以上の既約因子から primitive element を生成する),分解体の定義式の計算としては一般的なものです.これによれば,primitive element と p の根との関係(*)は自動的に得られ,また,n=5 の場合には,絶対定義式の次数が 20 を超えた段階で,非可解と判定できます.

mp の入力 p は,x を変数とする \mathbb{Z} 上の 2 次以上の monic な既約多項式であり,出力は p の分解体(単純拡大)の primitive element A の \mathbb{Z} 上の最小多項式の変数に A を代入した形の式 DA です.また,内部では,p の全ての根を A で表した式のリスト RA,および,(*)つまり,A=KK.makelist(RA[i],i,1,length(KK)) を満たすリスト KK も生成し,これらはすべてグローバルに定義されているので,随時参照できます.

mp(p):=block([],DEG:hipow(p,x),
[Dx,DA]:divide(p,x-A,x),t:2,K:1,KK:[1],F:[x-A],F2:[],
for i:0 unless K=0 do (
Dx:num(factor(Dx,DA)), printn("001"),
/*Dx:num(algfac(Dx,DA)), printn("001"),*/
F3:[],if op(Dx)="*" then (map(lambda([s],if hipow(rat(s),x)=1 then push(s,F2) else push(s,F3)),args(Dx)),Dx:apply("*",F3),if length(F2)+length(F)=DEG then (DX:subst(A=X,DA),return(DA))), 
[Dx,DB]:divide(Dx,x-B,x),push(x-B,F),
t:t+1,for j:0 while hipow(rat(gcd(f:resultant(DA,DBX:subst(B=(X-A)/(K:(-1)^t*floor(t/2)),DB),A),diff(f,X),X)),X)>0 do t:t+1, printn("002"),
push(K,KK), /*print(f),*/
DX:factor(content(f,X)[2]), printx(DX), printn("003"),
DX:if op(num(DX))="*" then args(DX)[1] else DX,
if DEG=5 and hipow(DX,X)>20 then
 (DA:0,print(concat(string(p)," is not solvable.")),return()),
printx(DX),
tellrat(DX),algebraic:on,gcd:subres,
AX:gcd(DBX,DA,A),  printn("004"),
ABX:solve([AX,A+K*B-X],[A,B]),
[Dx,F,F2]:rat(subst(ABX,[Dx,F,F2])),
algebraic:off,untellrat(X),
[DA,Dx,F,F2]:subst(X=A,[DX,Dx,F,F2]),
printn(i),printx([DA,Dx,F,F2]),
if hipow(rat(Dx),x)<=1 then K:0
),
RA:sublist(flatten([F,Dx,F2]),lambda([s],not(numberp(s)))),
RA:map(lambda([s],rhs(solve(s,x)[1])),RA),
DX:subst(A=X,DA),
return(DA)
)$

PL:[x^2-2,x^3-3*x-1,x^4-2,x^4+x^2-1,x^4-2*x^3+2*x^2+2,x^4+2*x^3+3*x^2+4*x+5,x^4+x+1,x^5-2,x^5-5*x+12,x^5+20*x+32,x^5+11*x+44,x^5+x^4-4*x^3-3*x^2+3*x+1,x^5+100*x^2+1000,x^6+x^3+1,x^6-2,x^5+10*x^3-10*x+4,x^5+20*x+16]$

/* verbose mode on, off */
pon():=(printn(s):=print(s),printx(s):=print(s))$
poff():=(printn(s):=0,printx(s):=0)$

上記を例えば,mp.mac として保存し,load("mp.mac")$ とした後,for i:1 thru 15 do print([p:PL[i],mp(p)])$ と入力すれば,次のように出力されます.

[x^2-2,A^2-8] 
[x^3-3*x-1,A^3-3*A-1] 
[x^4-2,A^8+28*A^4+2500] 
[x^4+x^2-1,A^8+10*A^6+47*A^4+110*A^2+841] 
[x^4-2*x^3+2*x^2+2,A^12+4*A^10+24*A^8+48*A^6-560*A^4+3136] 
[x^4+2*x^3+3*x^2+4*x+5,
 A^24+24*A^23+336*A^22+3344*A^21+25740*A^20+159984*A^19+820856*A^18
     +3519504*A^17+12721926*A^16+39075680*A^15+104485896*A^14+257189424*A^13
     +603068156*A^12+1264487184*A^11+1484791560*A^10-3707413456*A^9
     -23515353279*A^8-53513746296*A^7-7075256024*A^6+299352120960*A^5
     +770653544880*A^4+869309952000*A^3+1145273500800*A^2+1451723788800*A
     +1818528595200]
  
[x^4+x+1,
 A^24-80*A^20+340*A^18+7520*A^16+23120*A^14-973378*A^12-462400*A^10
     +50899280*A^8+74190340*A^6+67773664*A^4+2114616240*A^2+266962921]
  
[x^5-2,A^20+2500*A^10+50000] 
[x^5-5*x+12,A^10-10*A^8-75*A^6+1500*A^4-5500*A^2+16000] 
[x^5+20*x+32,A^10-20*A^8+100*A^6+2000*A^4-32000*A^2+128000] 
[x^5+11*x+44,A^10-22*A^8+77*A^6+4356*A^4-53724*A^2+189728] 
[x^5+x^4-4*x^3-3*x^2+3*x+1,A^5+A^4-4*A^3-3*A^2+3*A+1] 
[x^5+100*x^2+1000,
 A^20+250000*A^14+20000000*A^12+625000000*A^10-5300000000*A^8+700000000000*A^6
     +18750000000000*A^4-598000000000000*A^2+4205000000000000]
  
[x^6+x^3+1,A^6+A^3+1] 
[x^6-2,A^12-1012*A^6+19307236] 
Evaluation took 3.3130 seconds (3.3360 elapsed) using 1579.350 MB.

非可解な例を for i:16 thru 17 do print([p:PL[i],mp(p)])$ と入力すると...

x^5+10*x^3-10*x+4 is not solvable. 
[x^5+10*x^3-10*x+4,0] 
x^5+20*x+16 is not solvable. 
[x^5+20*x+16,0] 
Evaluation took 5.8240 seconds (5.8760 elapsed) using 3379.830 MB.

maxima の組み込み関数 splitfield との比較.

(%i3) for i:1 thru 15 do splitfield(PL[i],x)$
Evaluation took 9.5910 seconds (9.6560 elapsed) using 3121.559 MB.
(%i4) for i:1 thru 15 do (mp(PL[i]),RA)$
Evaluation took 3.2100 seconds (3.2320 elapsed) using 1579.139 MB.