//Gaussian elimination public static int Gauss(Matrix A) { if (A == null || A.size[0] == 0) { return(0); } int k = A.size[0], n = A.size[1]; bool flag = true; int rank = 0; for (int i = 0, j = 0; i < k && j < n; ++i, ++j)//c - для инф. окна { if (i == k - 1) { if (A.data[k - 1][j] != 0) { for (int ii = 0; ii < k - 1; ++ii) { if (A.data[ii][j] != 0) { for (int s = 0; s < n; ++s) { A.data[ii][s] = (A.data[ii][s] + A.data[k - 1][s]) & 1; } } } ++rank; break; } else { i--; } } else { if (A.data[i][j] == 0) { flag = false; for (int s = i + 1; s < k; ++s) { if (A.data[s][j] != 0) { flag = true; MatrixFuncs.SwapRows(A, i, s); break; } } } if (flag) { for (int s = 0; s < k; ++s) { if (s != i && A.data[s][j] != 0) { for (int q = 0; q < n; q++) { A.data[s][q] = (A.data[s][q] + A.data[i][q]) & 1; } } } ++rank; } else { i--; flag = true; } } } //избавление от нулевых строк for (int i = rank; i < k; ++i) { A -= rank; } return(rank); }
//Gaussian elimination with information window public static int Gauss_E(Matrix A, out List <int> I, out List <int> J) { I = new List <int>(); J = new List <int>(); if (A == null || A.size[0] == 0) { return(0); } int k = A.size[0], n = A.size[1]; if (k <= n) { bool flag = true; for (int i = 0, c = 0, j = 0; i < k && j < n; ++i, ++c, ++j)//c - для инф. окна { if (i == k - 1) { if (A.data[k - 1][j] != 0) { for (int ii = 0; ii < k - 1; ++ii) { if (A.data[ii][j] != 0) { for (int s = 0; s < n; ++s) { A.data[ii][s] = (A.data[ii][s] + A.data[k - 1][s]) & 1; } } } I.Add(j); ++j; while (j < n) { J.Add(j); ++j; } break; } else { i--; J.Add(j); } } else { if (A.data[i][j] == 0) { flag = false; for (int s = i + 1; s < k; ++s) { if (A.data[s][j] != 0) { flag = true; MatrixFuncs.SwapRows(A, i, s); break; } } } if (flag) { for (int s = 0; s < k; ++s) { if (s != i && A.data[s][j] != 0) { for (int q = 0; q < n; q++) { A.data[s][q] = (A.data[s][q] + A.data[i][q]) & 1; } } } I.Add(j); } else { c--; i--; J.Add(j); flag = true; } } } //избавление от нулевых строк for (int i = I.Count; i < A.size[0]; ++i) { A -= I.Count; } return(I.Count); } return(-1); }