public void Divide(GaloisPolynomial divider, out GaloisPolynomial quotient, out GaloisPolynomial remainder) { if (!m_Field.Equals(divider.m_Field)) { throw new NFXException(StringConsts.ARGUMENT_ERROR + GetType().Name + ".Div(divider: different field)"); } if (divider.IsPolynomial0) { throw new NFXException(StringConsts.ARGUMENT_ERROR + GetType().Name + ".Div(divider: div zero is undefined)"); } quotient = m_Field.Polynomial0; remainder = this; int dividerLeadingCoefficient = divider.coefficientAt(divider.Degree);//divider.Coefficients.Last(); int inversedDividerLeadingCoefficient = m_Field.Inverse(dividerLeadingCoefficient); while (remainder.Degree >= divider.Degree && !remainder.IsPolynomial0) { int deltaDegree = remainder.Degree - divider.Degree; int scale = m_Field.Multiply(remainder.coefficientAt(remainder.Degree), inversedDividerLeadingCoefficient); GaloisPolynomial term = divider.Multiply(deltaDegree, scale); GaloisPolynomial iterationQuotient = m_Field.GenerateMonomial(deltaDegree, scale); quotient = quotient.Add(iterationQuotient); remainder = remainder.Add(term); } }