private static RealPolynomial FromDegree(int degree) { RealPolynomial rp = new RealPolynomial(); rp.cof = new double[degree + 1]; return(rp); }
public void DivMod(RealPolynomial b, out RealPolynomial result, out RealPolynomial mod) { RealPolynomial numerator = Copy(); RealPolynomial denominator = b; result = new RealPolynomial(0.0); // numerator / denominator = result + remainder / denominator int curdeg; double curfac; do { curdeg = numerator.Degree - denominator.Degree; if (curdeg < 0) { break; } curfac = numerator[numerator.Degree] / denominator[denominator.Degree]; numerator -= (denominator.MultPower(curdeg, curfac)); result[curdeg] += curfac; if (numerator.Degree == 0) { break; } } while (numerator.Degree >= denominator.Degree && numerator.Degree >= 0); mod = numerator; }
public RealPolynomial Copy() { RealPolynomial res = FromDegree(Degree); for (int l = 0; l < cof.Length; l++) { res[l] = this[l]; } return(res); }
private RealPolynomial MultPower(int power, double m) { RealPolynomial newpoly = FromDegree(power + Degree + 1); for (int idx = 0; idx < cof.Length; idx++) { newpoly[idx + power] = cof[idx] * m; } newpoly.Clean(); return(newpoly); }
public static RealPolynomial FromRoots(params double[] roots) { if (roots.Length <= 0) { return(new RealPolynomial(0)); } RealPolynomial res = new RealPolynomial(1, -roots[0]); for (int l = 1; l < roots.Length; l++) { res = res * new RealPolynomial(1, -roots[l]); } return(res); }
public SturmSequence(RealPolynomial p) { RealPolynomial f1 = p.Copy(); RealPolynomial f2 = f1.Derivative; RealPolynomial f3; polys.Add(f1); polys.Add(f2); while (f2.Degree > 0) { f3 = -(f1 % f2); polys.Add(f3); f1 = f2; f2 = f3; } }
public static RealPolynomial operator *(RealPolynomial a, RealPolynomial b) { int alen = a.cof.Length; int blen = b.cof.Length; RealPolynomial res = FromDegree(alen + blen - 1); for (int bi = 0; bi < blen; bi++) { for (int ai = 0; ai < alen; ai++) { res[ai + bi] += a.cof[ai] * b.cof[bi]; } } res.Clean(); return(res); }
public RealPolynomial Pow(int power) { if (power < 0) { throw new ArgumentException("RealPolynomial.Pow can only use posetive powers"); } else if (power == 1) { return(new RealPolynomial(1.0)); } RealPolynomial result = Copy(); for (int l = 1; l < power; l++) { result *= this; } return(result); }