/* mpf_inverse.c compute matrix inverse AA = A^-1 */ #include #include "gmp.h" void mpf_inverse(int n, int digits, mpf_t A[], mpf_t AA[]) { int *ROW; /* Row interchange indicies */ int *COL; /* Column interchange indicies */ mpf_t *TEMP; int HOLD , I_pivot, J_pivot; /* pivot INDICIES */ mpf_t pivot; /* pivot ELEMENT VALUE */ mpf_t ABS_pivot, T, D, small, zero, one; int i,j,k; mpf_set_default_prec(digits*3.32); /* digits, not bits */ ROW = (int *)calloc(n, sizeof(int)); COL = (int *)calloc(n, sizeof(int)); TEMP = (mpf_t *)malloc(n*sizeof(mpf_t)); mpf_init(pivot); mpf_init(ABS_pivot); mpf_init(T); mpf_init(D); mpf_init(small); mpf_init(zero); mpf_init(one); mpf_set_str(small, "1.0E-550", 10); /* should be function of digits */ mpf_set_si(zero, 0); mpf_set_si(one, 1); /* copy A to working inverse AA */ for(i=0; i0){ I_pivot = i; J_pivot = j; mpf_set(pivot, AA[ROW[i]*n+COL[j]]); mpf_abs(ABS_pivot, pivot); } } } /* gmp_printf("%d,%d ABS_pivot=%Fg \n", I_pivot, J_pivot, ABS_pivot); */ /* check for near singular */ if(mpf_cmp(small, ABS_pivot)>0){ gmp_printf("redundant row (singular) %d \n", ROW[k]); gmp_printf("diagonal=%Fg \n", ABS_pivot); } /* have pivot, interchange ROW and COL pointers */ HOLD = ROW[k]; ROW[k] = ROW[I_pivot]; ROW[I_pivot] = HOLD; HOLD = COL[k]; COL[k] = COL[J_pivot]; COL[J_pivot] = HOLD; /* reduce about pivot */ mpf_div(AA[ROW[k]*n+COL[k]], one, pivot); for (j=0; j