public static SolveResult Gaussian(SolveRequest solvereq) { GuassianSolveResult result = new GuassianSolveResult(solvereq.B, solvereq.L); for (int i = 0; i < Math.Min(solvereq.B, solvereq.L); i++) { if (solvereq.Coefficients[i][i] == 0) { for (int j = i + 1; j < solvereq.B; j++) { if (solvereq.Coefficients[j][i] == 1) { BinaryVector tmp = solvereq.Coefficients[j]; solvereq.Coefficients[j] = solvereq.Coefficients[i]; solvereq.Coefficients[i] = tmp; break; } } } if (solvereq.Coefficients[i][i] == 1) { for (int j = 0; j < solvereq.B; j++) { if (j != i) { if (solvereq.Coefficients[j][i] == 1) { BinaryVector.FastAdd(solvereq.Coefficients[j], solvereq.Coefficients[i]); } } } } else { solvereq.Coefficients[i][i] = 1;//<-this may or may not work BinaryVector col = new BinaryVector(solvereq.B); for (int j = 0; j < solvereq.B; j++) { col[j] = solvereq.Coefficients[j][i]; } result.reducedMatrix.Add(col); } } result.End(); return(result); }
private void incrementBit(int idx) { if (idx == freeMult.Length) { done = true; return; } if (freeMult[idx] == 1) { freeMult[idx] = 0; incrementBit(idx + 1); } else { freeMult[idx] = 1; } if (freeMult[idx] == 1) { BinaryVector.FastAdd(currSolution, reducedMatrix[idx]); } }