Beispiel #1
0
        public static MultivariatePolynomial GCD(MultivariatePolynomial left, MultivariatePolynomial right)
        {
            MultivariatePolynomial dividend = left.Clone();
            MultivariatePolynomial divisor  = right.Clone();
            MultivariatePolynomial quotient;
            MultivariatePolynomial remainder;
            BigInteger             dividendLeadingCoefficient = 0;
            BigInteger             divisorLeadingCoefficient  = 0;

            bool swap = false;

            do
            {
                swap = false;

                dividendLeadingCoefficient = dividend.Terms.Last().CoEfficient;
                divisorLeadingCoefficient  = divisor.Terms.Last().CoEfficient;

                if (dividend.Degree < divisor.Degree)
                {
                    swap = true;
                }
                else if (dividend.Degree == divisor.Degree && dividendLeadingCoefficient < divisorLeadingCoefficient)
                {
                    swap = true;
                }

                if (swap)
                {
                    MultivariatePolynomial temp = dividend.Clone();
                    dividend = divisor;
                    divisor  = temp.Clone();
                }

                quotient = MultivariatePolynomial.Divide(dividend, divisor);
                dividend = quotient.Clone();
            }while (BigInteger.Abs(dividendLeadingCoefficient) > 0 && BigInteger.Abs(divisorLeadingCoefficient) > 0 && dividend.HasVariables() && divisor.HasVariables());

            if (dividend.HasVariables())
            {
                return(divisor.Clone());
            }
            else
            {
                return(dividend.Clone());
            }
        }