Example #1
0
 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();
 }