divide method

List<UGfPoly> divide(
  1. UGfPoly other
)

Implementation

List<UGfPoly> divide(UGfPoly other) {
  if (other.isZero) throw const UCodeDecodeException("Divide by zero");
  UGfPoly quotient = UGfPoly(field, Int32List.fromList(<int>[0]));
  UGfPoly remainder = this;
  final int denominatorLeadingTerm = other.coefficient(other.degree);
  final int inverseDenominatorLeadingTerm = field.inverse(denominatorLeadingTerm);
  while (remainder.degree >= other.degree && !remainder.isZero) {
    final int degreeDifference = remainder.degree - other.degree;
    final int scale = field.multiply(remainder.coefficient(remainder.degree), inverseDenominatorLeadingTerm);
    final UGfPoly term = other.multiplyByMonomial(degreeDifference, scale);
    quotient = quotient.addOrSubtract(UGfPoly.monomial(field, degreeDifference, scale));
    remainder = remainder.addOrSubtract(term);
  }
  return <UGfPoly>[quotient, remainder];
}