Example #1
0
        public static IPolynomial Divide(IPolynomial left, IPolynomial right, out IPolynomial remainder)
        {
            if (left == null)
            {
                throw new ArgumentNullException(nameof(left));
            }
            if (right == null)
            {
                throw new ArgumentNullException(nameof(right));
            }
            if (right.Degree > left.Degree || right.CompareTo(left) == 1)
            {
                remainder = Polynomial.Zero; return(left);
            }

            int        rightDegree       = right.Degree;
            int        quotientDegree    = (left.Degree - rightDegree) + 1;
            BigInteger leadingCoefficent = new BigInteger(right[rightDegree].ToByteArray());

            Polynomial rem      = (Polynomial)left.Clone();
            Polynomial quotient = (Polynomial)Polynomial.Zero;

            // The leading coefficient is the only number we ever divide by
            // (so if right is monic, polynomial division does not involve division at all!)
            for (int i = quotientDegree - 1; i >= 0; i--)
            {
                quotient[i]          = BigInteger.Divide(rem[rightDegree + i], leadingCoefficent);
                rem[rightDegree + i] = BigInteger.Zero;

                for (int j = rightDegree + i - 1; j >= i; j--)
                {
                    rem[j] = BigInteger.Subtract(rem[j], BigInteger.Multiply(quotient[i], right[j - i]));
                }
            }

            // Remove zeros
            rem.RemoveZeros();
            quotient.RemoveZeros();

            remainder = rem;
            return(quotient);
        }