private GenericGFPoly buildGenerator(int degree) {
   if (degree >= cachedGenerators.size()) {
     GenericGFPoly lastGenerator = cachedGenerators.get(cachedGenerators.size() - 1);
     for (int d = cachedGenerators.size(); d <= degree; d++) {
       GenericGFPoly nextGenerator =
           lastGenerator.multiply(new GenericGFPoly(field, new int[] {1, field.exp(d - 1)}));
       cachedGenerators.add(nextGenerator);
       lastGenerator = nextGenerator;
     }
   }
   return cachedGenerators.get(degree);
 }
  public void encode(int[] toEncode, int ecBytes) {
    if (ecBytes == 0) {
      throw new IllegalArgumentException("No error correction bytes");
    }
    int dataBytes = toEncode.length - ecBytes;
    if (dataBytes <= 0) {
      throw new IllegalArgumentException("No data bytes provided");
    }

    // MANUELLA: build the message polynomial
    GenericGFPoly generator = buildGenerator(ecBytes);
    int[] infoCoefficients = new int[dataBytes];
    System.arraycopy(toEncode, 0, infoCoefficients, 0, dataBytes);
    // MANUELLA
    System.out.print("          ");
    for (int i = 0; i < infoCoefficients.length; i++) {
      System.out.print("" + infoCoefficients[i] + ",");
    }
    System.out.println();

    GenericGFPoly info = new GenericGFPoly(field, infoCoefficients);
    info = info.multiplyByMonomial(ecBytes, 1);
    // MANUELLA
    System.out.println("          message polynomial: " + info.toString());
    System.out.println("          generator polynomial: " + generator.toString());
    GenericGFPoly remainder = info.divide(generator)[1];
    int[] coefficients = remainder.getCoefficients();
    // MANUELLA
    System.out.print("          ");
    for (int i = 0; i < coefficients.length; i++) {
      System.out.print("" + coefficients[i] + ",");
    }
    System.out.println();

    int numZeroCoefficients = ecBytes - coefficients.length;
    // MANUELLA
    System.out.println("          polynomial: " + remainder.toString());

    for (int i = 0; i < numZeroCoefficients; i++) {
      toEncode[dataBytes + i] = 0;
    }
    System.arraycopy(
        coefficients, 0, toEncode, dataBytes + numZeroCoefficients, coefficients.length);
  }
 public void encode(int[] toEncode, int ecBytes) {
   if (ecBytes == 0) {
     throw new IllegalArgumentException("No error correction bytes");
   }
   int dataBytes = toEncode.length - ecBytes;
   if (dataBytes <= 0) {
     throw new IllegalArgumentException("No data bytes provided");
   }
   GenericGFPoly generator = buildGenerator(ecBytes);
   int[] infoCoefficients = new int[dataBytes];
   System.arraycopy(toEncode, 0, infoCoefficients, 0, dataBytes);
   GenericGFPoly info = new GenericGFPoly(field, infoCoefficients);
   info = info.multiplyByMonomial(ecBytes, 1);
   GenericGFPoly remainder = info.divide(generator)[1];
   int[] coefficients = remainder.getCoefficients();
   int numZeroCoefficients = ecBytes - coefficients.length;
   for (int i = 0; i < numZeroCoefficients; i++) {
     toEncode[dataBytes + i] = 0;
   }
   System.arraycopy(
       coefficients, 0, toEncode, dataBytes + numZeroCoefficients, coefficients.length);
 }