微調整

http://ehito.hatenablog.com/entry/2019/02/24/234939 の実行例の timer_info() を見ると

[[total,0.001663981382026495*sec,5586,9.295*sec,0],
        [mp,0.214*sec,15,3.21*sec,0],
        [nGG,0.1895333333333333*sec,15,2.843*sec,0],
        [RR6,0.167*sec,15,2.505*sec,0],
        [rrem,0.002457142857142857*sec,210,0.516*sec,0],
        [mul,2.216494845360825e-5*sec,3880,0.08600000000000001*sec,0],
        [inv,6.136900078678206e-5*sec,1271,0.078*sec,0],
        [CC,8.378378378378379e-4*sec,37,0.031*sec,0],
        [mnsg,4.054054054054054e-4*sec,37,0.015*sec,0],
        [isG,2.162162162162163e-4*sec,37,0.008*sec,0],
        [factor2list,5.405405405405407e-5*sec,37,0.002*sec,0],
        [cs,6.666666666666667e-5*sec,15,0.001*sec,0]]

のように nGG が重く,その原因は例によって bfloat であろう,という訳で,書き換えてみました.

nGG(DA):=block([i],
er:sort(map(lambda([s],abs(s[1]-s[2])),listify(map(listify,powerset(setify(map('rhs,allroots(p))),2)))))[1]/10,
nRS:allroots(%i*DA),
GG2:nRAS:expand(map(lambda([s],subst(s,RA)),nRS)),
i:0,for s in nRAS[1] do (
i:i+1,map(lambda([t],j:1,while(j>0) do if not(integerp(t[j])) and abs(t[j]-s)<er then (t[j]:i,j:0) else j:j+1,t),GG2)),
RS:rat(map(lambda([s],KK.s),fullmapl(lambda([s],RA[s]),map(lambda([s],firstn(s,length(KK))),GG2)))),
GGRS:map("[",GG2,RS),
GG2)$

(なお,こうした root separation の評価は計算機代数の古典的なテーマのひとつで,例えば https://core.ac.uk/download/pdf/82808521.pdf

結果は,...

[[total,0.001227491531467285*sec,5609,6.885*sec,0],
         [mp,0.2095333333333333*sec,15,3.143*sec,0],
         [RR6,0.1656*sec,15,2.484*sec,0],
         [nGG,0.03653333333333333*sec,15,0.548*sec,0],
         [rrem,0.002447619047619048*sec,210,0.514*sec,0],
         [inv,7.002360346184106e-5*sec,1271,0.089*sec,0],
         [mul,1.314432989690722e-5*sec,3880,0.051*sec,0],
         [CC,8.378378378378379e-4*sec,37,0.031*sec,0],
         [mnsg,4.054054054054054e-4*sec,37,0.015*sec,0],
         [isG,2.432432432432433e-4*sec,37,0.009000000000000001*sec,0],
         [factor2list,2.702702702702703e-5*sec,37,0.001*sec,0]]