/// <summary> /// Factorizes polynomial to its linear factors. /// </summary> /// <returns></returns> public FactorizedPolynomial Factorize() { // this is to be returned FactorizedPolynomial p = new FactorizedPolynomial(); // cannot factorize polynomial of degree 0 or 1 if (this.Degree <= 1) { p.Factor = new Polynomial[] { this }; p.Power = new int[] { 1 }; return(p); } double[] roots = Roots(this); Polynomial[] factor = new Polynomial[roots.Length]; int[] power = new int[roots.Length]; power[0] = 1; factor[0] = new Polynomial(new double[] { -Coefficients[Degree] * (double)roots[0], Coefficients[Degree] }); for (int i = 1; i < roots.Length; i++) { power[i] = 1; factor[i] = new Polynomial(new double[] { -(double)roots[i], 1 }); } p.Factor = factor; p.Power = power; return(p); }
/// <summary> /// Evaluates factorized polynomial p at point x. /// </summary> /// <param name="p"></param> /// <returns></returns> public static double Evaluate(FactorizedPolynomial p, double x) { double z = 1; for (int i = 0; i < p.Factor.Length; i++) { z *= Math.Pow(p.Factor[i].Evaluate(x), p.Power[i]); } return(z); }
/// <summary> /// Evaluates factorized polynomial p at point x. /// </summary> /// <param name="p"></param> /// <returns></returns> public static Complex Evaluate(FactorizedPolynomial p, Complex x) { Complex z = Complex.One; for (int i = 0; i < p.Factor.Length; i++) { z *= Complex.Pow(p.Factor[i].Evaluate(x), p.Power[i]); } return(z); }
/// <summary> /// Expands factorized polynomial p_1(x)^(k_1)*...*p_r(x)^(k_r) to its normal form a_0 + a_1 x + ... + a_n x^n. /// </summary> /// <param name="p"></param> /// <returns></returns> public static Polynomial Expand(FactorizedPolynomial p) { Polynomial q = new Polynomial(1); for (int i = 0; i < p.Factor.Length; i++) { for (int j = 0; j < p.Power[i]; j++) { q *= p.Factor[i]; } q.Clean(); } return(q); }
/// <summary> /// Expands factorized polynomial p_1(x)^(k_1)*...*p_r(x)^(k_r) to its normal form a_0 + a_1 x + ... + a_n x^n. /// </summary> /// <param name="p"></param> /// <returns></returns> public static Polynomial Expand(FactorizedPolynomial p) { Polynomial q = new Polynomial(new Complex[] { Complex.One }); for (int i = 0; i < p.Factor.Length; i++) { for (int j = 0; j < p.Power[i]; j++) { q *= p.Factor[i]; } q.Clean(); } // clean... for (int k = 0; k <= q.Degree; k++) { q.Coefficients[k].Re = Math.Round(q.Coefficients[k].Re, 12); q.Coefficients[k].Im = Math.Round(q.Coefficients[k].Im, 12); } return(q); }
/// <summary> /// Factorizes polynomial to its linear factors. /// </summary> /// <returns></returns> public FactorizedPolynomial Factorize() { // this is to be returned FactorizedPolynomial p = new FactorizedPolynomial(); // cannot factorize polynomial of degree 0 or 1 if (this.Degree <= 1) { p.Factor = new Polynomial[] { this }; p.Power = new int[] { 1 }; return p; } Complex[] roots = Roots(this); //ArrayList rootlist = new ArrayList(); //foreach (Complex z in roots) rootlist.Add(z); //roots = null; // don't need you anymore //rootlist.Sort(); //// number of different roots //int num = 1; // ... at least one //// ...or more? //for (int i = 1; i < rootlist.Count; i++) // if (rootlist[i] != rootlist[i - 1]) num++; Polynomial[] factor = new Polynomial[roots.Length]; int[] power = new int[roots.Length]; //factor[0] = new Polynomial( new Complex[]{ -(Complex)rootlist[0] * Coefficients[Degree], // Coefficients[Degree] } ); //power[0] = 1; //num = 1; //len = 0; //for (int i = 1; i < rootlist.Count; i++) //{ // len++; // if (rootlist[i] != rootlist[i - 1]) // { // factor[num] = new Polynomial(new Complex[] { -(Complex)rootlist[i], Complex.One }); // power[num] = len; // num++; // len = 0; // } //} power[0] = 1; factor[0] = new Polynomial(new Complex[] { -Coefficients[Degree] * (Complex)roots[0], Coefficients[Degree] }); for (int i = 1; i < roots.Length; i++) { power[i] = 1; factor[i] = new Polynomial(new Complex[] { -(Complex)roots[i], Complex.One }); } p.Factor = factor; p.Power = power; return p; }
/// <summary> /// Factorizes polynomial to its linear factors. /// </summary> /// <returns></returns> public FactorizedPolynomial Factorize() { // this is to be returned FactorizedPolynomial p = new FactorizedPolynomial(); // cannot factorize polynomial of degree 0 or 1 if (this.Degree <= 1) { p.Factor = new Polynomial[] { this }; p.Power = new int[] { 1 }; return(p); } Complex[] roots = Roots(this); //ArrayList rootlist = new ArrayList(); //foreach (Complex z in roots) rootlist.Add(z); //roots = null; // don't need you anymore //rootlist.Sort(); //// number of different roots //int num = 1; // ... at least one //// ...or more? //for (int i = 1; i < rootlist.Count; i++) // if (rootlist[i] != rootlist[i - 1]) num++; Polynomial[] factor = new Polynomial[roots.Length]; int[] power = new int[roots.Length]; //factor[0] = new Polynomial( new Complex[]{ -(Complex)rootlist[0] * Coefficients[Degree], // Coefficients[Degree] } ); //power[0] = 1; //num = 1; //len = 0; //for (int i = 1; i < rootlist.Count; i++) //{ // len++; // if (rootlist[i] != rootlist[i - 1]) // { // factor[num] = new Polynomial(new Complex[] { -(Complex)rootlist[i], Complex.One }); // power[num] = len; // num++; // len = 0; // } //} power[0] = 1; factor[0] = new Polynomial(new Complex[] { -Coefficients[Degree] * (Complex)roots[0], Coefficients[Degree] }); for (int i = 1; i < roots.Length; i++) { power[i] = 1; factor[i] = new Polynomial(new Complex[] { -(Complex)roots[i], Complex.One }); } p.Factor = factor; p.Power = power; return(p); }
/// <summary> /// Expands factorized polynomial p_1(x)^(k_1)*...*p_r(x)^(k_r) to its normal form a_0 + a_1 x + ... + a_n x^n. /// </summary> /// <param name="p"></param> /// <returns></returns> public static Polynomial Expand(FactorizedPolynomial p) { Polynomial q = new Polynomial(new Complex[] { Complex.One }); for (int i = 0; i < p.Factor.Length; i++) { for (int j = 0; j < p.Power[i]; j++) q *= p.Factor[i]; q.Clean(); } // clean... for (int k = 0; k <= q.Degree; k++) { q.Coefficients[k].Re = Math.Round(q.Coefficients[k].Re, 12); q.Coefficients[k].Im = Math.Round(q.Coefficients[k].Im, 12); } return q; }
/// <summary> /// Evaluates factorized polynomial p at point x. /// </summary> /// <param name="p"></param> /// <returns></returns> public static Complex Evaluate(FactorizedPolynomial p, Complex x) { Complex z = Complex.One; for (int i = 0; i < p.Factor.Length; i++) { z *= Complex.Pow(p.Factor[i].Evaluate(x), p.Power[i]); } return z; }
/// <summary> /// Factorizes polynomial to its linear factors. /// </summary> /// <returns></returns> public FactorizedPolynomial Factorize() { // this is to be returned FactorizedPolynomial p = new FactorizedPolynomial(); // cannot factorize polynomial of degree 0 or 1 if (this.Degree <= 1) { p.Factor = new Polynomial[] { this }; p.Power = new int[] { 1 }; return p; } double[] roots = Roots(this); Polynomial[] factor = new Polynomial[roots.Length]; int[] power = new int[roots.Length]; power[0] = 1; factor[0] = new Polynomial(new double[] { -Coefficients[Degree] * (double)roots[0], Coefficients[Degree] }); for (int i = 1; i < roots.Length; i++) { power[i] = 1; factor[i] = new Polynomial(new double[] { -(double)roots[i], 1 }); } p.Factor = factor; p.Power = power; return p; }
/// <summary> /// Expands factorized polynomial p_1(x)^(k_1)*...*p_r(x)^(k_r) to its normal form a_0 + a_1 x + ... + a_n x^n. /// </summary> /// <param name="p"></param> /// <returns></returns> public static Polynomial Expand(FactorizedPolynomial p) { Polynomial q = new Polynomial(1); for (int i = 0; i < p.Factor.Length; i++) { for (int j = 0; j < p.Power[i]; j++) q *= p.Factor[i]; q.Clean(); } return q; }
/// <summary> /// Evaluates factorized polynomial p at point x. /// </summary> /// <param name="p"></param> /// <returns></returns> public static double Evaluate(FactorizedPolynomial p, double x) { double z = 1; for (int i = 0; i < p.Factor.Length; i++) { z *= Math.Pow(p.Factor[i].Evaluate(x), p.Power[i]); } return z; }