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