/// @param r double /// @return DhbFunctionEvaluation.PolynomialFunction public PolynomialFunction[] DivideWithRemainder(PolynomialFunction p) { PolynomialFunction[] answer = new PolynomialFunction[2]; int m = this.Degree; int n = p.Degree; if (m < n) { answer[0] = new PolynomialFunction(new double[] { 0 }); answer[1] = p; return(answer); } double[] quotient = new double[m - n + 1]; double[] coef = new double[m + 1]; for (int k = 0; k <= m; k++) { coef[k] = _coefficients[k]; } double norm = 1 / p[n]; for (int k = m - n; k >= 0; k--) { quotient[k] = coef[n + k] * norm; for (int j = n + k - 1; j >= k; j--) { coef[j] -= quotient[k] * p[j - k]; } } double[] remainder = new double[n]; for (int k = 0; k < n; k++) { remainder[k] = coef[k]; } answer[0] = new PolynomialFunction(quotient); answer[1] = new PolynomialFunction(remainder); return(answer); }
/// @param desiredPrecision double /// @return double[] public double[] Roots(double desiredPrecision) { PolynomialFunction dp = this.Derivative(); double start = 0; Random random = new Random(); while (Math.Abs(dp.Value(start)) < desiredPrecision) { start = random.NextDouble(); } PolynomialFunction p = this; NewtonZeroFinder rootFinder = new NewtonZeroFinder(this, dp, start); rootFinder.DesiredPrecision = desiredPrecision; List <double> rootCollection = new List <double>(Degree); while (true) { rootFinder.Evaluate(); if (!rootFinder.HasConverged) { break; } double r = rootFinder.Result; rootCollection.Add(r); p = p.Deflate(r); if (p.Degree == 0) { break; } rootFinder.Function = p; try { rootFinder.Derivative = p.Derivative(); } catch (ArgumentException) { }; } return(rootCollection.ToArray()); }