internal GF256Poly multiply(GF256Poly other) { if (!field.Equals(other.field)) { throw new System.ArgumentException("GF256Polys do not have same GF256 field"); } if (Zero || other.Zero) { return(field.Zero); } int[] aCoefficients = this.coefficients; int aLength = aCoefficients.Length; int[] bCoefficients = other.coefficients; int bLength = bCoefficients.Length; int[] product = new int[aLength + bLength - 1]; for (int i = 0; i < aLength; i++) { int aCoeff = aCoefficients[i]; for (int j = 0; j < bLength; j++) { product[i + j] = GF256.addOrSubtract(product[i + j], field.multiply(aCoeff, bCoefficients[j])); } } return(new GF256Poly(field, product)); }
/// <returns> evaluation of this polynomial at a given point /// </returns> internal int evaluateAt(int a) { if (a == 0) { // Just return the x^0 coefficient return(getCoefficient(0)); } int size = coefficients.Length; if (a == 1) { // Just the sum of the coefficients int result = 0; for (int i = 0; i < size; i++) { result = GF256.addOrSubtract(result, coefficients[i]); } return(result); } int result2 = coefficients[0]; for (int i = 1; i < size; i++) { result2 = GF256.addOrSubtract(field.multiply(a, result2), coefficients[i]); } return(result2); }
internal GF256Poly addOrSubtract(GF256Poly other) { if (!field.Equals(other.field)) { throw new System.ArgumentException("GF256Polys do not have same GF256 field"); } if (Zero) { return(other); } if (other.Zero) { 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; // Copy high-order terms only found in higher-degree polynomial's coefficients Array.Copy(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)); }