/// <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;
        }