Fraction solve() { Fraction zero = Fraction(0); while (true) { // pivot column int c=-1; Fraction best_col = zero; for (int i=0;i<m;i++) { if (t[n][i].compareTo(best_col)>0) { c=i; best_col = t[n][i]; } } if (c==-1) break; // pivot row int r=-1; Fraction best_ratio = Fraction(-1); for (int i=0;i<n;i++) { if (t[i][c].compareTo(zero)==0) continue; Fraction ratio = t[i][m].div(t[i][c]); if (ratio.compareTo(zero)<0) continue; if (ratio.compareTo(zero)==0 && t[i][c].compareTo(zero)<0) continue; if (best_ratio.compareTo(zero)<0 || ratio.compareTo(best_ratio)<0) { r=i; best_ratio=ratio; } } Fraction pivot = t[r][c]; Fraction inv_pivot = pivot.inv(); Fraction neg_inv_pivot = inv_pivot.neg(); // update pivot t[r][c] = inv_pivot; // update row for (int j=0;j<=m;j++) if (j!=c) { t[r][j] = t[r][j].mul(inv_pivot); } // list of other rows and columns to update nr=0; nc=0; for (int i=0;i<=n;i++) if (i!=r) { if (t[i][c].compareTo(zero)!=0) rows[nr++]=i; } for (int j=0;j<=m;j++) if (j!=c) { if (t[r][j].compareTo(zero)!=0) cols[nc++]=j; } // update other for (int i=0;i<nr;i++) { int y=rows[i]; for (int j=0;j<nc;j++) { int x=cols[j]; t[y][x] = t[y][x].sub(t[r][x].mul(t[y][c])); } } // update column for (int i=0;i<=n;i++) if (i!=r) { t[i][c] = t[i][c].mul(neg_inv_pivot); } // update labels int tmp = labelC[c]; labelC[c] = labelR[r]; labelR[r] = tmp; } return t[n][m].neg(); }