Ejemplo n.º 1
0
        AlgebraicLongDivision(RealPolynomial dividend, RealPolynomial divisor)
        {
            if (dividend.Degree < divisor.Degree)
            {
                throw new ArgumentException("dividendCoef degree is smaller than divisorCoef");
            }
            AllRealDivisionResult r = new AllRealDivisionResult();

            var quotient  = new double [dividend.Degree - divisor.Degree + 1];
            var divRemain = new double[dividend.Degree + 1];

            for (int i = 0; i < divRemain.Length; ++i)
            {
                divRemain[i] = dividend.C(i);
            }
            for (int i = 0; i < quotient.Length; ++i)
            {
                double q = divRemain[dividend.Degree - i]
                           / divisor.C(divisor.Degree);
                quotient[quotient.Length - 1 - i] = q;
                for (int j = 0; j <= divisor.Degree; ++j)
                {
                    divRemain[dividend.Degree - i - j] -=
                        q * divisor.C(divisor.Degree - j);
                }
            }

            r.quotient  = new RealPolynomial(quotient);
            r.remainder = new RealRationalPolynomial(
                new RealPolynomial(divRemain).RemoveLeadingZeros(),
                divisor.RemoveLeadingZeros());
            return(r);
        }