polyRoots function

List<Complex> polyRoots(
  1. List<double> a
)

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;
}