public GaloisPolynomial Multiply(GaloisPolynomial factorPolynomial) { if (!m_Field.Equals(factorPolynomial.m_Field)) { throw new NFXException(StringConsts.ARGUMENT_ERROR + GetType().Name + ".Mult(factor: different field)"); } if (IsPolynomial0 || factorPolynomial.IsPolynomial0) { return(m_Field.Polynomial0); } int[] multiplicand = m_Coefficients; int[] factor = factorPolynomial.m_Coefficients; int[] product = new int[m_Coefficients.Length + factorPolynomial.m_Coefficients.Length - 1]; for (int i = 0; i < multiplicand.Length; i++) { int multiplicandCoefficient = multiplicand[i]; for (int j = 0; j < factor.Length; j++) { product[i + j] = GaloisField.Add(product[i + j], m_Field.Multiply(multiplicandCoefficient, factor[j])); } } return(new GaloisPolynomial(m_Field, product)); }
public GaloisPolynomial Add(GaloisPolynomial summand) { if (!m_Field.Equals(summand.m_Field)) { throw new NFXException(StringConsts.ARGUMENT_ERROR + GetType().Name + ".Add(summand: different field)"); } if (IsPolynomial0) { return(summand); } if (summand.IsPolynomial0) { return(this); } int[] shorterPolynomialCoefficients; int[] longerPolynomialCoefficients; if (m_Coefficients.Length < summand.m_Coefficients.Length) { shorterPolynomialCoefficients = m_Coefficients; longerPolynomialCoefficients = summand.m_Coefficients; } else { shorterPolynomialCoefficients = summand.m_Coefficients; longerPolynomialCoefficients = m_Coefficients; } int[] resultCoefficients = new int[longerPolynomialCoefficients.Length]; int deltaLength = (int)(longerPolynomialCoefficients.Length - shorterPolynomialCoefficients.Length); for (int i = 0; i < longerPolynomialCoefficients.Length; i++) { if (i < deltaLength) { resultCoefficients[i] = longerPolynomialCoefficients[i]; } else { resultCoefficients[i] = GaloisField.Add(longerPolynomialCoefficients[i], shorterPolynomialCoefficients[i - deltaLength]); } } return(new GaloisPolynomial(m_Field, resultCoefficients)); }