Exemplo n.º 1
0
        public static MatrixGField CreateParityOnlyMatrix(GFTable gfTable, int dataBlocksCount, int parityBlockCount)
        {
            int totalBlocks = dataBlocksCount + parityBlockCount;

            if (totalBlocks > 256)
            {
                throw new InvalidOperationException("A total of more then 256 blocks is not supported");
            }

            var parityMatrixArray = new GField[parityBlockCount, dataBlocksCount];



            var baseList = BaseGFCalculator.CalculateBase(gfTable).ToList();

            //Copy parity part of the matrix
            for (uint row = 0; row < parityBlockCount; row++)
            {
                for (int column = 0; column < parityMatrixArray.GetLength(1); column++)
                {
                    var val = baseList[column].Pow(row + 1);
                    parityMatrixArray[row, column] = val;
                }
            }


            return(new MatrixGField(parityMatrixArray));
        }
Exemplo n.º 2
0
        public static MatrixGField CreateParityMatrix2(GFTable gfTable, int dataBlocksCount, int parityBlockCount)
        {
            int totalBlocks = dataBlocksCount + parityBlockCount;

            if (totalBlocks > 256)
            {
                throw new InvalidOperationException("A total of more then 256 blocks is not supported");
            }

            var parityMatrixArray = new GField[totalBlocks, dataBlocksCount];



            var baseList = BaseGFCalculator.CalculateBase(gfTable).ToList();
            var res      = string.Join(",", baseList);

            //Copy parity part of the matrix
            for (int row = 0; row < totalBlocks; row++)
            {
                for (uint column = 0; column < parityMatrixArray.GetLength(1); column++)
                {
                    var val = baseList[row].Pow(column + 1);
                    //var val = gfTable.CreateField(gfTable.Pow(2, gfTable.Mul(row, column)));
                    //var val = baseList[row].Pow(gfTable.Mul(row, (uint)column));
                    parityMatrixArray[row, column] = val;
                }
            }

            var transposedVanDerMondeMatrix = new MatrixGField(parityMatrixArray);

            var dataMatrix         = transposedVanDerMondeMatrix.Submatrix(0, dataBlocksCount - 1, 0, dataBlocksCount - 1);
            var invertedDataMatrix = dataMatrix.InverseRuben();

            var finalMatrix = transposedVanDerMondeMatrix * invertedDataMatrix;

            return(finalMatrix);
        }