微調整
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]]