GF256Poly addOrSubtract(GF256Poly other){
  if (!field.equals(other.field)) {
    throw new IllegalArgumentException("GF256Polys do not have same GF256 field");
  }
  if (isZero()) {
    return other;
  }
  if (other.isZero()) {
    return this;
  }
  int[] smallerCoefficients=this.coefficients;
  int[] largerCoefficients=other.coefficients;
  if (smallerCoefficients.length > largerCoefficients.length) {
    int[] temp=smallerCoefficients;
    smallerCoefficients=largerCoefficients;
    largerCoefficients=temp;
  }
  int[] sumDiff=new int[largerCoefficients.length];
  int lengthDiff=largerCoefficients.length - smallerCoefficients.length;
  System.arraycopy(largerCoefficients,0,sumDiff,0,lengthDiff);
  for (int i=lengthDiff; i < largerCoefficients.length; i++) {
    sumDiff[i]=GF256.addOrSubtract(smallerCoefficients[i - lengthDiff],largerCoefficients[i]);
  }
  return new GF256Poly(field,sumDiff);
}

GF256Poly addOrSubtract ( GF256Poly other ) { if ( ! field . equals ( other . field ) ) { throw new IllegalArgumentException ( "GF256Polys do not have same GF256 field" ) ; } if ( isZero ( ) ) { return other ; } if ( other . isZero ( ) ) { return this ; } int [ ] smallerCoefficients = this . coefficients ; int [ ] largerCoefficients = other . coefficients ; if ( smallerCoefficients . length > largerCoefficients . length ) { int [ ] temp = smallerCoefficients ; smallerCoefficients = largerCoefficients ; largerCoefficients = temp ; } int [ ] sumDiff = new int [ largerCoefficients . length ] ; int lengthDiff = largerCoefficients . length - smallerCoefficients . length ; System . arraycopy ( largerCoefficients , 0 , sumDiff , 0 , lengthDiff ) ; for ( int i = lengthDiff ; i < largerCoefficients . length ; i ++ ) { sumDiff [ i ] = GF256 . addOrSubtract ( smallerCoefficients [ i - lengthDiff ] , largerCoefficients [ i ] ) ; } return new GF256Poly ( field , sumDiff ) ; }
gf addition or subtraction ( they are identical for a gf ( 2 ^ n )
