/// <summary>
        /// Compute the squaring matrix for this polynomial ring, using the base field and the reduction polynomial
        /// </summary>
        private void ComputeSquaringMatrix()
        {
            int numColumns = _poly.Degree;

            _sqMatrix = new PolynomialGF2mSmallM[numColumns];
            PolynomialGF2mSmallM[] _sqMatrix2 = new PolynomialGF2mSmallM[numColumns];

            if (ParallelUtils.IsParallel)
            {
                int nct = numColumns >> 1;
                Parallel.For(0, nct, i =>
                {
                    int[] monomCoeffs   = new int[(i << 1) + 1];
                    monomCoeffs[i << 1] = 1;
                    _sqMatrix[i]        = new PolynomialGF2mSmallM(_field, monomCoeffs);
                });

                Parallel.For(nct, numColumns, i =>
                {
                    int[] monomCoeffs             = new int[(i << 1) + 1];
                    monomCoeffs[i << 1]           = 1;
                    PolynomialGF2mSmallM monomial = new PolynomialGF2mSmallM(_field, monomCoeffs);
                    _sqMatrix[i] = monomial.Mod(_poly);
                });
            }
            else
            {
                for (int i = 0; i < numColumns >> 1; i++)
                {
                    int[] monomCoeffs = new int[(i << 1) + 1];
                    monomCoeffs[i << 1] = 1;
                    _sqMatrix[i]        = new PolynomialGF2mSmallM(_field, monomCoeffs);
                }

                for (int i = numColumns >> 1; i < numColumns; i++)
                {
                    int[] monomCoeffs = new int[(i << 1) + 1];
                    monomCoeffs[i << 1] = 1;
                    PolynomialGF2mSmallM monomial = new PolynomialGF2mSmallM(_field, monomCoeffs);
                    _sqMatrix[i] = monomial.Mod(_poly);
                }
            }
        }
        /// <summary>
        /// Compute the squaring matrix for this polynomial ring, using the base field and the reduction polynomial
        /// </summary>
        private void ComputeSquaringMatrix()
        {
            int numColumns = _poly.Degree;
            _sqMatrix = new PolynomialGF2mSmallM[numColumns];
            PolynomialGF2mSmallM[] _sqMatrix2 = new PolynomialGF2mSmallM[numColumns];

            if (ParallelUtils.IsParallel)
            {
                int nct = numColumns >> 1;
                Parallel.For(0, nct, i =>
                {
                    int[] monomCoeffs = new int[(i << 1) + 1];
                    monomCoeffs[i << 1] = 1;
                    _sqMatrix[i] = new PolynomialGF2mSmallM(_field, monomCoeffs);
                });

                Parallel.For(nct, numColumns, i =>
                {
                    int[] monomCoeffs = new int[(i << 1) + 1];
                    monomCoeffs[i << 1] = 1;
                    PolynomialGF2mSmallM monomial = new PolynomialGF2mSmallM(_field, monomCoeffs);
                    _sqMatrix[i] = monomial.Mod(_poly);
                });
            }
            else
            {
                for (int i = 0; i < numColumns >> 1; i++)
                {
                    int[] monomCoeffs = new int[(i << 1) + 1];
                    monomCoeffs[i << 1] = 1;
                    _sqMatrix[i] = new PolynomialGF2mSmallM(_field, monomCoeffs);
                }

                for (int i = numColumns >> 1; i < numColumns; i++)
                {
                    int[] monomCoeffs = new int[(i << 1) + 1];
                    monomCoeffs[i << 1] = 1;
                    PolynomialGF2mSmallM monomial = new PolynomialGF2mSmallM(_field, monomCoeffs);
                    _sqMatrix[i] = monomial.Mod(_poly);
                }
            }
        }