void matrix_to_entity(MATRIX *m) { int depth, cur, maxdepth = MIN(m->cols, m->rows) ; for(depth = 0; depth < maxdepth; depth++) { for (cur = depth+1; cur < maxdepth; cur++) { FRAC *piv = matrix_get_val(m, depth, depth) ; FRAC *tz = matrix_get_val(m, cur, depth) ; FRAC fac ; if(tz->num != 0) { frac_div(&fac, piv, tz) ; frac_negate(&fac, &fac) ; matrix_multiply_row(m, cur, &fac) ; matrix_add_row(m, cur, depth) ; } } } for(depth = maxdepth - 1; depth >= 0; depth--) { for (cur = depth-1; cur >= 0; cur--) { FRAC *piv = matrix_get_val(m, depth, depth) ; FRAC *tz = matrix_get_val(m, cur, depth) ; FRAC fac ; if(tz->num != 0) { frac_div(&fac, piv, tz) ; frac_negate(&fac, &fac) ; matrix_multiply_row(m, cur, &fac) ; matrix_add_row(m, cur, depth) ; } } } for(depth = 0; depth < maxdepth; depth++) { FRAC t, *e = matrix_get_val(m, depth, depth) ; if (e->num != 0) { frac_inverse(&t,e) ; matrix_multiply_row(m, depth, &t) ; } } }
FRACTION frac_subtract(FRACTION lhs, FRACTION rhs) { return frac_add(lhs, frac_negate(rhs)); }