コード例 #1
0
 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]);
             }
         }
     }
 }