internal GF256Poly[] Divide(GF256Poly other) { if (!field.Equals(other.field)) { throw new ArgumentException("GF256Polys do not have same GF256 field"); } if (other.IsZero()) { throw new DivideByZeroException("Divide by 0"); } var quotient = field.GetZero(); var remainder = this; var denominatorLeadingTerm = other.GetCoefficient(other.GetDegree()); var inverseDenominatorLeadingTerm = field.Inverse(denominatorLeadingTerm); while (remainder.GetDegree() >= other.GetDegree() && !remainder.IsZero()) { var degreeDifference = remainder.GetDegree() - other.GetDegree(); var scale = field.Multiply(remainder.GetCoefficient(remainder.GetDegree()), inverseDenominatorLeadingTerm); var term = other.MultiplyByMonomial(degreeDifference, scale); var iterationQuotient = field.BuildMonomial(degreeDifference, scale); quotient = quotient.AddOrSubtract(iterationQuotient); remainder = remainder.AddOrSubtract(term); } return(new GF256Poly[] { quotient, remainder }); }