/// <summary> /// Multiplies this GF2Polynomial with <c>B</c> and returns the result in a new GF2Polynomial. This method does not reduce the result in GF(2^N). /// This method uses classic multiplication (schoolbook). /// </summary> /// /// <param name="B">A GF2Polynomial</param> /// /// <returns>Returns a new GF2Polynomial (<c>this</c> * <c>B</c>)</returns> public GF2Polynomial MultiplyClassic(GF2Polynomial B) { GF2Polynomial result = new GF2Polynomial(Math.Max(_length, B._length) << 1); GF2Polynomial[] m = new GF2Polynomial[32]; int i, j; m[0] = new GF2Polynomial(this); for (i = 1; i <= 31; i++) m[i] = m[i - 1].ShiftLeft(); for (i = 0; i < B._blocks; i++) { for (j = 0; j <= 31; j++) { if ((B._value[i] & _bitMask[j]) != 0) result.XorThisBy(m[j]); } for (j = 0; j <= 31; j++) m[j].ShiftBlocksLeft(); } return result; }