public Polynomial div(Polynomial poly) {
    if (!poly.isConstantPoly())
      throw new IllegalArgumentException(
          "Can currently only divide by numbers and not polynomials");

    int deg = coeffs.length - 1;
    Number lcoeffs[] = new Number[deg + 1];
    for (int i = 0; i < deg + 1; ++i)
      lcoeffs[i] = ((HasDivI) baseRing).div(coeffs[i], poly.getCoeff(0));

    return valueOf(lcoeffs);
  }
  public Polynomial pow(int exp) {
    if (exp == 0) return valueOf(new Number[] {baseRing.getONE()});
    if (exp == 1) return valueOf(this.getCoeffs());
    if (exp < 0)
      throw new IllegalArgumentException("Tried to raise a Polynomial to a negative power");

    Polynomial res = valueOf(new Number[] {baseRing.getONE()});
    Polynomial currentPower = this;
    int ex = exp;
    while (ex != 0) {
      if ((ex & 1) == 1) res = res.mul(currentPower);
      ex >>= 1;
      if (ex == 0) break;
      currentPower = currentPower.mul(currentPower);
    }
    return res;
  }
 public boolean equalsPoly(Polynomial n) {
   if (this.getDegree() != n.getDegree()) return false;
   for (int i = 0; i <= this.getDegree(); ++i)
     if (!baseRing.equals(this.getCoeff(i), n.getCoeff(i))) return false;
   return true;
 }