1.分解体の絶対定義多項式
今回のオリジナルプログラム https://github.com/YasuakiHonda/GaloisGroupSolver が行う主な処理は
1.分解体の絶対定義式
2.Galois 群
3.組成列
4.添加する元の定義式
5.分解体の相対定義式
の算出です.種々の方法の比較の意味も含め,私家版を作成しましたので,順次公開させて頂きます.
まず,オリジナルプログラムの1.では,入力の多項式 p の次数 が低い場合を想定して私が気軽に提案した(数値根と 次式の因数分解を用いる)方法を採用して頂いたのですが,これは明らかにハイコストであり,例えば, の処理に数分を要します.他にも,primitive element と p の根との関係の調整はユーザーが行わねばなりません.
これに対し,下記の mp は有理数体 に p の根を1つずつ添加し,その都度,拡大体の 上の定義式(絶対定義式)の次数を上げてゆく(代数体上の 次以上の既約因子から primitive element を生成する),分解体の定義式の計算としては一般的なものです.これによれば,primitive element と p の根との関係(*)は自動的に得られ,また, の場合には,絶対定義式の次数が を超えた段階で,非可解と判定できます.
mp の入力 p は, を変数とする 上の 次以上の monic な既約多項式であり,出力は p の分解体(単純拡大)の primitive element A の 上の最小多項式の変数に 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.