in SimonsAlgorithm/GaussianElimination.cs [26:52]
public static List<BooleanVector> GetKernel(BooleanMatrix matrix, int minimalRank)
{
matrix = new BooleanMatrix(matrix);
var columnPivot = new List<int?>();
var row = 0;
for (var column = 0; column < matrix.Width; column++)
{
var foundPivot = FindPivotAndSwapRows(matrix, row, column);
if (foundPivot)
{
ReduceRows(matrix, row, column);
columnPivot.Add(row);
row++;
}
else
{
columnPivot.Add(null);
}
}
if (row < minimalRank)
throw new InvalidOperationException("Matrix doesn't have sufficient rank");
return FindSolution(matrix, columnPivot, 0).Select(list => new BooleanVector(Enumerable.Reverse(list))).ToList();
}