#include "typedef.h"
#include "gmp.h"
#include "matrix.h"
matrix_TYP *reverse_valuation(MP_INT *val,matrix_TYP *D)
{
int i,
first,
last;
matrix_TYP *erg;
MP_INT tmp,
copy;
mpz_init(&tmp);
mpz_init_set(©,val);
for (first = 0;first<D->cols && D->array.SZ[first][first] == 1;first++);
for (last = 0;last<D->cols && D->array.SZ[last][last] != 0;last++);
erg = init_mat(last-first,1,"");
for (i=first;i<last;i++){
mpz_mod_ui(&tmp,©,(unsigned long) D->array.SZ[i][i]);
erg->array.SZ[i-first][0] = mpz_get_si(&tmp);
mpz_sub_ui(©,©,(unsigned long) erg->array.SZ[i-first][0]);
mpz_div_ui(©,©,(unsigned long) D->array.SZ[i][i]);
}
mpz_clear(&tmp);
mpz_clear(©);
return erg;
}