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 });
}