4.添加する元の定義式,および,5.分解体の相対定義式(解説)

現在のオリジナルプログラムでは,すべての Lagrange Resolvent の冪乗,開冪,和を取って,表題の2つを算出しています.

一方,http://ehito.hatenablog.com/entry/20190123/1548255005 で提案した方法は,分解体の(基礎体 K 上の)定義式 P,新たに添加する冪根 ai の(K に分解体の primitive element A を添加した体 K(A) 上の)定義式 Q,そして,既に添加された元の定義式に対する Groebner 基底から,分解体の(拡大体 K(ai) 上の)定義式 R,冪根 ai の(K 上の)定義式 S を同時に得るもの(数学としては,P,Q を最初の2式,R,Sを終端の2式とする代数体上の互除法により,P=Q=0 ⇔ R=S=0 を保ちつつ,primitive element についての次数を下げる(特に S は 0 次)ことに当たります)ですが,maxima の Groebner 基底ルーチンによる実装 RR5 では

(%i2) for i:1 thru 15 do RR5(cs(nGG(mp(PL[i]))))$
PROU_5 is a member. 
PROU_5 is a member. 
PROU_3 is a member. 
PROU_3 is a member. 
Evaluation took 298.6010 seconds (299.8230 elapsed) using 29739.980 MB.

となり,Groebner 基底の計算に Risa/Asir の関数を用いる RR5a では

(%i3) for i:1 thru 15 do RR5a(cs(nGG(mp(PL[i]))))$
PROU_5 is a member. 
PROU_5 is a member. 
PROU_3 is a member. 
PROU_3 is a member. 
Evaluation took 7.3480 seconds (10.5720 elapsed) using 3442.276 MB.

となりました. ただ,今回のお話は maxima プロパーを旨とするもの(?)だと思いますので,前回掲載した RR6 での Groebner 基底の利用は無理のない(と思われる)範囲に留めています.

全体の処理の流れは,オリジナルプログラムと同様に,すべての Lagrange Resolvent の和として,5.を得るものですが,各 Resolvent LR[j] (j=1,...,pp) (pp は拡大次数)に冪根 ai を適当な回数(コードでは pp-1 回)乗じて,冪根の変数の冪乗 a[i]^(j-1) と基礎体上の多項式 ai^(pp-j)*LR[j] との積の形に整理しています.これは https://ikumi.que.jp/blog/wp-content/uploads/2018/09/galois-solution.pdf の 12.(4),https://ikumi.que.jp/blog/archives/717 の【2019, 1/21 追記】で間接,直接に指摘されているもので,コード内の

F:sum(a[i]^(j-1)*ai^(pp-j)*LR[j],j,1,pp)

が相対定義式の 0 でない定数倍 ai^(pp-1)*sum(LR[j],j,1,pp) となる訳ですが,この F の係数を冪根 ai の変数 a[i]と既に添加されているの元の変数で表すと,主係数に変数が残るので,有理化,つまり,代数体での逆元の計算が必要となり,Groebner 基底の出座に至ります(笑).例えば

(%i4) poly_reduced_grobner ([(a^2+b)*x^2+x+1,a^3+a+1,b^2+a*b+a^2],[x,b,a]);
Evaluation took 0.0020 seconds (0.0020 elapsed) using 159.969 KB.
(%o4) [a^3+a+1,b^2+a*b+a^2,(-x^2)+b*x-a^2*x+a*x+b-a^2+a]

といった感じです.

これに先立つもう1つのポイントが ai の検出です.ai は 0 でない Resolvent の主係数であり,いわゆる代数体での 0 判定が必要となり,その際,定義式の既約性が重要(「代入した値が0⇔定義式による整除」が成立)で,例えば,a^2-2 が定める Q(a) に,その上で既約ではない b^2-2 の根 b を添加するといった暴挙に出ると,a+b=0 か否かの判定が出来ません.実際,1の原始 pp 乗根 w[i] の(Q上の)定義式 Dw は,素数 pp が 2 以外ならば高次なので,基礎体上で既約でない可能性があり,因数分解が必要となり,自然なのは逐次拡大体としての各中間体上の分解ですが,処理時間を比較した結果,RR6 では分解体 Q(A) 上の分解 factor(Dw,DA) を利用しています.具体的には,低次の因数に分解されるならば,pp が素数であることから,それらの次数は全て等しく,1次ならば,w[i] は直接 A で表示し,次数が 2 以上ならば,0 でない ai の検出までは Q(A) 係数のまま用い(コード内の /* w[i] with A */ からの部分),ai^pp の簡約からは,分解体の(基礎体上の)定義式と既に添加された元の定義式により基礎体係数に直した形を用いています(コード内の /* w[i] with a[1],w[1],...,a[i-1],w[i-1] */ からの部分).参考として,2次式に分解される例を記しておきます.

(%i6) [p,Dw,DA];
Evaluation took 0.0000 seconds (0.0000 elapsed) using 0 bytes.
(%o6) [x^5-5*x^3+5*x+5,w3^4+w3^3+w3^2+w3+1,
        A^20-50*A^18+1025*A^16-11250*A^14+72500*A^12-268125*A^10+456875*A^8
            +137500*A^6-1578125*A^4+1640625*A^2+1378125]
(%i7) Dwf:factor2list(factor(Dw,DA))[1];
Evaluation took 0.5380 seconds (0.5410 elapsed) using 91.638 MB.
(%o7) 240295101375*w3^2-54652*A^18*w3+2992335*A^16*w3-67936350*A^14*w3
                        +830924250*A^12*w3-5985718405*A^10*w3
                        +25902278250*A^8*w3-65067996000*A^6*w3
                        +83309465625*A^4*w3-24030550000*A^2*w3-202585732125*w3
                        +240295101375
(%i8) Dwf:poly_normalize(rrem(Dwf,[[(5*a2)/2-(A*(25*a1-75))/2+(A^3*(5*a1-25))/2+A^5,A],[a2^2-462*a1+1050,a2],[a1^2-5,a1]]),[w[3]]);
Evaluation took 0.0050 seconds (0.0050 elapsed) using 862.938 KB.
(%o8) w3^2-((a1-1)*w3)/2+1

他にも,RR シリーズでは
・remainder と algebraic モード との使い分け(後者の方が高速だが,tellrat は monic しか受け付けず,その為の変数変換はやや大掛かりになるので)
・元の変数に atom を使用(これも後者の方が高速なので)
・poly_reduced_grobner ではなく poly_grobner を利用(余分な式が含まれるが,やはり後者の方が高速なので)
といった工夫を施しています.