public virtual double?[] getRoots(RealPolynomialFunction1D function)
        {
            ArgChecker.notNull(function, "function");
            double[] coeffs = function.Coefficients;
            int      l      = coeffs.Length - 1;

//JAVA TO C# CONVERTER NOTE: The following call to the 'RectangularArrays' helper class reproduces the rectangular array initialization that is automatic in Java:
//ORIGINAL LINE: double[][] hessianDeref = new double[l][l];
            double[][] hessianDeref = RectangularArrays.ReturnRectangularDoubleArray(l, l);
            for (int i = 0; i < l; i++)
            {
                hessianDeref[0][i] = -coeffs[l - i - 1] / coeffs[l];
                for (int j = 1; j < l; j++)
                {
                    hessianDeref[j][i] = 0;
                    if (i != l - 1)
                    {
                        hessianDeref[i + 1][i] = 1;
                    }
                }
            }
            RealMatrix hessian = new Array2DRowRealMatrix(hessianDeref);

            double[]  d      = (new EigenDecomposition(hessian)).RealEigenvalues;
            double?[] result = new double?[d.Length];
            for (int i = 0; i < d.Length; i++)
            {
                result[i] = d[i];
            }
            return(result);
        }
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test public void test()
        public virtual void test()
        {
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final double[] r = new double[] {-RANDOM.nextDouble(), -RANDOM.nextDouble(), RANDOM.nextDouble(), RANDOM.nextDouble() };
            double[] r = new double[] { -RANDOM.NextDouble(), -RANDOM.NextDouble(), RANDOM.NextDouble(), RANDOM.NextDouble() };
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final double a0 = r[0] * r[1] * r[2] * r[3];
            double a0 = r[0] * r[1] * r[2] * r[3];
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final double a1 = r[0] * r[1] * r[2] + r[0] * r[1] * r[3] + r[0] * r[2] * r[3] + r[1] * r[2] * r[3];
            double a1 = r[0] * r[1] * r[2] + r[0] * r[1] * r[3] + r[0] * r[2] * r[3] + r[1] * r[2] * r[3];
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final double a2 = r[0] * r[1] + r[0] * r[2] + r[0] * r[3] + r[1] * r[2] + r[1] * r[3] + r[2] * r[3];
            double a2 = r[0] * r[1] + r[0] * r[2] + r[0] * r[3] + r[1] * r[2] + r[1] * r[3] + r[2] * r[3];
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final double a3 = r[0] + r[1] + r[2] + r[3];
            double       a3 = r[0] + r[1] + r[2] + r[3];
            const double a4 = 1;
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final com.opengamma.strata.math.impl.function.RealPolynomialFunction1D f = new com.opengamma.strata.math.impl.function.RealPolynomialFunction1D(new double[] {a0, a1, a2, a3, a4 });
            RealPolynomialFunction1D f = new RealPolynomialFunction1D(new double[] { a0, a1, a2, a3, a4 });

//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final System.Nullable<double>[] roots = FINDER.getRoots(f);
            double?[] roots = FINDER.getRoots(f);
            Arrays.sort(roots);
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final double[] expected = new double[r.length];
            double[] expected = new double[r.Length];
            for (int i = 0; i < r.Length; i++)
            {
                expected[i] = -r[i];
            }
            Arrays.sort(expected);
            for (int i = 0; i < roots.Length; i++)
            {
                assertEquals(roots[i], expected[i], 1e-12);
            }
        }