重根に対する数値解の誤差

先の出力の dist は,同じ値に対すると見做した数値解間の複素平面上での距離ですが,単根の場合の誤差 10^{-30} に対して,例えば,下の部分では 10^{-11} まで膨らんでいます.

1 multi-roots: 
 (-6.2414826969557199979633340867b-13*%i)-6.38943104254668599248510111018b-1 
 (-6.95918202422128079528203919324b-12*%i)-6.38943104241533885902022292701b-1 
 [x^4+a*x^2+b*x+c,
  x^4-2.44948974278317809819728407471b0*x^2
     -2.08677944009771642211264733221b0*x-5.0b-1] 
dist: 1.45826385597869537841530414623b-11 
2 multi-roots: 
 (-6.95918202422128079528203919324b-12*%i)-6.38943104241533885902022292701b-1 
 7.58333029391685279498189770221b-12*%i-6.38943104242614942415515511763b-1 
 [x^4+a*x^2+b*x+c,
  x^4-2.44948974278317809819728407471b0*x^2
     -2.08677944009771642211264733221b0*x-5.0b-1] 
dist: 1.4582638571553690760678343437b-11 

これは,一般に n 重根に対する数値解の誤差は,単根に対する数値解の誤差の 1/n 程度となる性質によるもので,上の場合は,3 重根なので 30 の 1/3 程度となっている訳です.

この例の出所をもう少し詳しく述べると,上記は,下位の lifting で projection factor から得た

 c = root(2*c+1, 1), b = root(4096*c^3+27*b^4, 1), a = root(8*a*c-9*b^2-2*a^3, 1)

の数値解を x^4+a*x^2+b*x+c = 0 に代入した

 x^4-2.44948974278317809819728407471b0*x^2-2.08677944009771642211264733221b0*x-5.0b-1 = 0 

を解いたもので,厳密解

 c = - 1/2 = - 0.5,
 b = - (4*2^(1/4))/(3^(3/4)) = 2.08677944009771642211264733221...,
 a = - 6^(1/2) = 2.449489742783178098197284074705...

に対して,数値解は

 c = - 5.0b-1, b = - 2.08677944009771642211264733221b0, a = - 2.44948974278317809819728407471b0

なので,c,b,a までの精度は保たれており,最後の

 x^4+a*x^2+b*x+c = (x-3^(3/4)/2^(1/4))*(x+1/6^(1/4))^3 = 0

の 3 重根

 -1/6^(1/4) = - 0.6389431042462724758553493051605564336...

に対してのみ,対応する数値解が

 (-6.2414826969557199979633340867b-13*%i)-6.38943104254668599248510111018b-1, 
 (-6.95918202422128079528203919324b-12*%i)-6.38943104241533885902022292701b-1,
 7.58333029391685279498189770221b-12*%i-6.38943104242614942415515511763b-1

のようにばらけますが,相加平均をとると

 (-3.21582999003662290927010077574b-32*%i)-6.38943104246272475855349305161b-1

となり,この実部として,30 桁精度のサンプルが得られます.