load(sym)$ load("sym/compile")$ load(gcdex)$ rtL:[α,β,γ,δ,ε,λ,ρ]; cL:[1,2,3,4,5,6,7]; eiL:[e1,e2,e3,e4,e5,e6,e7]; zz:[z1,z2,z3,z4,z5,z6,z7]; /* 多項式の最高次数と対称式としての値を返す面白い命令 polynome2ele */ fx:x^5-10*x^3+5*x^2+10*x+1; N:hipow(fx,x); NN:N!; rtL:rest(rtL,N-7); cL:rest(cL,N-7); zz:rest(zz,N-7); /* v[i]の計算の時に必要*/ V(x,y):=sum(x[i]*y[i],i,1,N); prtL:listify( permutations(rtL))$ viL:makelist(v[i],i,1,NN)$ pVrtL:map(lambda([z],V(cL,z)),prtL)$ /* 120このpVrtLのリスト内容を表示するのは無駄なので、確認のため pVrtL[3]がどの様な式になっているかだけ出力してみる。 */ pVrtL[3]; virtL:map( lambda([x,y],x=y),viL,pVrtL)$ virtL[3]; /* 第1ステップ */ fx1:divide(fx,x-α,x); fx2:divide(fx1[1],x-β,x); fx3:divide(fx2[1],x-γ,x); fx4:divide(fx3[1],x-δ,x); fx5:divide(fx4[1],x-ε,x); /*第2ステップ 其の二 終結式を使うのだが eliminateでなくて resultantを使った方が使いやすい */ v0:V(cL,rtL); r1:resultant(v-v0,fx5[2],ε); r2:resultant(r1,fx4[2],δ); r3:resultant(r2,fx3[2],γ); r4:resultant(r3,fx2[2],β); Gv:resultant(r4,fx1[2],α); Gv:factor(Gv); /* Gvは既約多項式でないのでvの最小多項式ではない Gvを因数分解してそのはじめの因子を最小多項式gv[0]とする */ Gpw:hipow(Gv,v)$ if Gpw=NN then gv[0]:Gv else gv[0]:part(Gv,1)$ gv[0]; gx[0]:subst(x,v,gv[0]); /*  第3ステップ   fxをgv[0]が生成する代数体上で因数分解して、fxの根をvの多項式として求める */ fxg0:factor(fx,gv[0]); SoL:solve(fxg0,x); an:[]$ for i:1 thru N do( an:endcons(rhs(SoL[i]),an))$ an; kiL:makelist(k[i],i,1,N); sokiL:map(lambda([y,x],y=x),kiL,an); pkiL:listify(permutations(kiL))$ VpkiL:map(lambda([z],V(cL,z)),pkiL)$ fix:0$ for i:1 thru NN do( vkev:expand(ev(VpkiL[i],sokiL)), if vkev=v then fix:i)$ fix; fixki:map( lambda([x,y],x=y),rtL,pkiL[fix])$ SoL:ev(fixki,sokiL); /* 以上で代数体上で因数分解した5つの多項式と v=α+2β+3γ+4δ+5ε としたときの[α,β,γ,δ,ε]との対応がついた */ VivL:expand(ev(virtL,SoL))$ /*HTML用計算*/ VivL[1]; VivL[2]; VivL[119]; VivL[120]; /*HTML用出力完了*/ /*HTML用計算*/ z:remainder(subst(rhs(VivL[1]),v,gv[0]),gv[0]); z:remainder(subst(rhs(VivL[2]),v,gv[0]),gv[0]); z:remainder(subst(rhs(VivL[119]),v,gv[0]),gv[0]); z:remainder(subst(rhs(VivL[120]),v,gv[0]),gv[0]); /*HTML用出力完了*/ check:[]$ GgrL:[]$ for i:1 thru NN do( z:remainder(subst(rhs(VivL[i]),v,gv[0]),gv[0]), check:endcons(z,check), if z=0 then GgrL:endcons(i,GgrL) )$ check$ GgrL; /*HTML用計算*/ VivL[1]; VivL[34]; VivL[65]; VivL[91]; VivL[97]; VTL:[]$ for i:1 thru 5 do( k:GgrL[i], VTL:endcons(y[i]=v[k],VTL) )$ VTL; pkiL[1]; pkiL[34]; pkiL[65]; pkiL[91]; pkiL[97]; /*HTML用出力完了*/ GL:makelist(pkiL[GgrL[i]],i,1,5); /* 以下は、基礎体から巡回拡大でgx[0]->gx[1]を 計算して、gx[1]=0の解がvの値となる。 そのvの値を、vの多項式として表現された 4根のvにその値を代入して最終的な会を求める計算 第4ステップ  P=5 */ h0:(x-v[1])$ h1:(x-v[34])$ h2:(x-v[65])$ h3:(x-v[91])$ h4:(x-v[97])$ h0:(x-v[1])$ h0:ev(h0,VivL)$ h0:remainder(h0,gv[0],v); h1:(x-v[34])$ h1:ev(h1,VivL)$ h1:remainder(h1,gv[0],v); h2:(x-v[65])$ h2:ev(h2,VivL)$ h2:remainder(h2,gv[0],v); h3:(x-v[91])$ h3:ev(h3,VivL)$ h3:remainder(h3,gv[0],v); h4:(x-v[97])$ h4:ev(h4,VivL)$ h4:remainder(h4,gv[0],v); η[1]:ζ$ η[2]:ζ^2$ η[3]:ζ^3$ η[4]:ζ^4$ Ω:1+η[1]+η[2]+η[3]+η[4]; t0:(1/5)*(h0+h1+h2+h3+h4)$ t1:(1/5)*(h0+h1*η[1]+h2*η[1]^2+h3*η[1]^3+h4*η[1]^4)$ t2:(1/5)*(h0+h1*η[2]+h2*η[2]^2+h3*η[2]^3+h4*η[2]^4)$ t3:(1/5)*(h0+h1*η[3]+h2*η[3]^2+h3*η[3]^3+h4*η[3]^4)$ t4:(1/5)*(h0+h1*η[4]+h2*η[4]^2+h3*η[4]^3+h4*η[4]^4)$ t0:expand(remainder(t0,Ω,ζ)); t1:expand(remainder(t1,Ω,ζ)); t1:ratsimp(t1); t0:expand(t0); T1:expand(t1^5)$ T1:remainder(T1,gv[0],v)$ T1:remainder(T1,Ω,ζ); A[1]:T1$ B[1]:a[1]^5-A[1]; gcA1:gcdex(A[1],Ω,ζ); IA1:gcA1[1]; z:remainder(A[1]*IA1,Ω,ζ); T12:t1^3*t2$ T12:remainder(T12,gv[0],v)$ T12:factor(remainder(T12,Ω,ζ)); T13:t1^2*t3$ T13:remainder(T13,gv[0],v)$ T13:factor(remainder(T13,Ω,ζ)); T14:t1*t4$ T14:remainder(T14,gv[0],v)$ T14:factor(remainder(T14,Ω,ζ)); a2:a[1]^2*T12*IA1$ a2:remainder(a2,Ω)$ a2:factor(a2); a3:a[1]^3*T13*IA1$ a3:remainder(a3,Ω)$ a3:factor(a3); a4:a[1]^4*T14*IA1$ a4:remainder(a4,Ω)$ a4:factor(a4); t1:a[1]$ t2:a2$ t3:a3$ t4:a4$ gx[1]:expand(t0+t1+t2+t3+t4); gx[1]:ratsimp(gx[1]); gv[1]:subst(v,x,gx[1]); W:solve(gx[1],x); rsoL:[]$ for i:1 thru N do( s:rhs(SoL[i]), s:remainder(s,gv[1],v), s:remainder(s,Ω,ζ), s:remainder(s,B[1],a[1]), s:remainder(s,Ω,ζ), /*下の1行はHTMLに記述するためにa[1]の冪で整理したかったので付けたもの*/ s:remainder(s,B[1],a[1]), /* HTML用の記述はこれで終わり */ rsoL:endcons(s,rsoL) )$ rsoL; rζ:allroots(Ω)$ fζ:rhs(rζ[1]); B[1]:subst(fζ,ζ,B[1])$ ra1:allroots(B[1])$ fa1:rhs(ra1[1]); AnsLf:[]$ for i:1 thru 5 do( z:rsoL[i], z:subst(fζ,ζ,z), z:subst(fa1,a[1],z), z:expand(z), AnsLf:endcons(z,AnsLf) )$ AnsLf; allroots(fx);