Beispiel #1
0
        private static RealPolynomial FromDegree(int degree)
        {
            RealPolynomial rp = new RealPolynomial();

            rp.cof = new double[degree + 1];
            return(rp);
        }
Beispiel #2
0
        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;
        }
Beispiel #3
0
        public RealPolynomial Copy()
        {
            RealPolynomial res = FromDegree(Degree);

            for (int l = 0; l < cof.Length; l++)
            {
                res[l] = this[l];
            }
            return(res);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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;
            }
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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);
        }