polyRoots function
Implementation
List<Complex> polyRoots(List<double> a) {
final n = a.length - 1;
if (n <= 0) return [];
final roots = List<Complex>.generate(n, (k) {
final angle = 2 * math.pi * (k + 1) / n;
return Complex(math.cos(angle), math.sin(angle));
});
for (int it = 0; it < 200; it++) {
bool ok = true;
for (int i = 0; i < n; i++) {
Complex denom = _cFrom(1.0);
for (int j = 0; j < n; j++) {
if (j != i) denom = denom * (roots[i] - roots[j]);
}
final delta = _polyEvalC(a, roots[i]) / denom;
final newr = roots[i] - delta;
if ((newr - roots[i]).abs() > 1e-10) ok = false;
roots[i] = newr;
}
if (ok) break;
}
return roots;
}