public static void smethod_0(IList <double> coefficients, IList <double> roots, double epsilon) { if (roots == null) { throw new ArgumentNullException(nameof(roots)); } if (coefficients.Count < 2) { throw new ArgumentException("Number of coefficients must be 2 or greater."); } if (coefficients[coefficients.Count - 1] == 0.0) { throw new ArgumentException("The highest coefficient is expected to be non-zero."); } if (epsilon == 0.0) { epsilon = -1E-08; } if (coefficients.Count == 2) { roots.Add(-coefficients[0] / coefficients[1]); } else if (coefficients.Count == 3) { MathUtil.GetQuadraticPolynomialRoots(coefficients, roots); } else if (coefficients.Count == 4) { IList <double> cubicPolynomialRoots = MathUtil.GetCubicPolynomialRoots(coefficients); for (int index = 0; index < cubicPolynomialRoots.Count; ++index) { roots.Add(cubicPolynomialRoots[index]); } } else { int num1 = 0; int n = coefficients.Count - 1; double[] numArray1 = new double[coefficients.Count]; for (int index = n; index >= 0; --index) { numArray1[index] = coefficients[n - index]; } double[] numArray2 = new double[coefficients.Count - 1]; while (n > 3) { for (int index = 0; index < n; ++index) { numArray2[index] = numArray1[index] * (double)(n - index); } double num2 = Class64.smethod_3(n, (IList <double>)numArray1); ComplexD complexD1 = ComplexD.Zero; double num3 = numArray1[n] * numArray1[n]; double num4 = num3; ComplexD complexD2 = (ComplexD)numArray1[n - 1]; ComplexD complexD3 = (ComplexD)(numArray1[n - 1] == 0.0 ? 1.0 : -numArray1[n] / numArray1[n - 1]); complexD3 = (ComplexD)((double)System.Math.Sign(complexD3.Real) * num2); ComplexD dz = complexD3; ComplexD complexD4 = Class64.smethod_5(n, (IList <double>)numArray1, complexD3); double num5 = complexD4.GetModulusSquared(); double num6 = 2.5 * num2; double modulus = dz.GetModulus(); double num7 = 4.0 * (double)n * (double)n * num3 * Class64.double_0; bool flag1 = true; int num8; for (num8 = 0; (complexD3.Real + dz.Real != complexD3.Real || complexD3.Imaginary + dz.Imaginary != complexD3.Imaginary) && (num5 > num7 && num8 < 50); ++num8) { ComplexD complexD5 = Class64.smethod_5(n - 1, (IList <double>)numArray2, complexD3); double modulusSquared1 = complexD5.GetModulusSquared(); if (modulusSquared1 == 0.0) { dz = Class64.smethod_4(dz, 5.0); } else { dz = new ComplexD((complexD4.Real * complexD5.Real + complexD4.Imaginary * complexD5.Imaginary) / modulusSquared1, (complexD4.Imaginary * complexD5.Real - complexD4.Real * complexD5.Imaginary) / modulusSquared1); double num9 = (complexD2 - complexD5).GetModulusSquared() / (complexD1 - complexD3).GetModulusSquared(); flag1 = num5 != num4 || num9 * num5 > 0.25 * modulusSquared1 * modulusSquared1; modulus = dz.GetModulus(); if (modulus > num6) { dz = Class64.smethod_4(dz, num6 / modulus); } num6 = modulus * 5.0; } complexD1 = complexD3; double num10 = num5; complexD2 = complexD4; bool flag2 = true; while (flag2) { flag2 = false; complexD3 = complexD1 - dz; complexD4 = Class64.smethod_5(n, (IList <double>)numArray1, complexD3); num4 = num5 = complexD4.GetModulusSquared(); if (flag1) { ComplexD z = complexD3; int num9 = 1; bool flag3 = num5 > num10; for (; num9 <= n; ++num9) { if (flag3) { dz *= 0.5; z = complexD1 - dz; } else { z -= dz; } ComplexD complexD6 = Class64.smethod_5(n, (IList <double>)numArray1, z); double modulusSquared2 = complexD6.GetModulusSquared(); if (modulusSquared2 < num5) { num5 = modulusSquared2; complexD4 = complexD6; complexD3 = z; if (flag3 && num9 == 2) { dz = Class64.smethod_4(dz, 0.5); complexD3 = complexD1 - dz; complexD4 = Class64.smethod_5(n, (IList <double>)numArray1, complexD3); num5 = complexD4.GetModulusSquared(); break; } } else { break; } } } else { num7 = Class64.smethod_6(n, (IList <double>)numArray1, complexD3); } if (modulus < complexD3.GetModulus() * Class64.double_0 && num5 >= num10) { complexD3 = complexD1; dz = Class64.smethod_4(dz, 0.5); if (complexD3 + dz != complexD3) { flag2 = true; } } } } if (num8 >= 50) { --num1; } ComplexD real = (ComplexD)complexD3.Real; if ((complexD4 = Class64.smethod_5(n, (IList <double>)numArray1, real)).GetModulusSquared() <= num5) { roots.Add(complexD3.Real); n = Class64.smethod_7(n, (IList <double>)numArray1, complexD3.Real); } else { n = Class64.smethod_8(n, (IList <double>)numArray1, complexD3); } } if (n == 1) { roots.Add(-numArray1[1] / numArray1[0]); } else if (n == 2) { Class64.smethod_1((IList <double>)numArray1, roots); } else { if (n != 3) { return; } IList <double> doubleList = Class64.smethod_2((IList <double>)numArray1); for (int index = 0; index < doubleList.Count; ++index) { roots.Add(doubleList[index]); } } } }