GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
#include "typedef.h"1#include "gmp.h"2/* #include "gmp-impl.h"*/3#include "longtools.h"4#include "matrix.h"5/**************************************************************************\6@---------------------------------------------------------------------------7@---------------------------------------------------------------------------8@ FILE: long_mat_inv.c9@---------------------------------------------------------------------------10@---------------------------------------------------------------------------11@12\**************************************************************************/1314/************************************************************************\15@ matrix_TYP *long_mat_inv(A)16@ matrix_TYP *A;17@18@ long_mat_inv(A) calculates the matrix A^{-1} using GNU MP19\************************************************************************/20matrix_TYP *long_mat_inv(A)21matrix_TYP *A;22{23MP_INT ***E, **MA, **MB;24MP_INT Ekgv;25int Ecols;26matrix_TYP *erg;27int i,j;282930if(A->cols != A->rows)31{32printf("error: can't invert non-square matrix\n");33exit(3);34}35MA = matrix_to_MP_mat(A);36if((MB = (MP_INT **) malloc(A->cols *sizeof(MP_INT *))) == NULL)37{38printf("malloc of 'MB' in 'long_mat_inv' failed\n");39exit(2);40}41for(i=0;i<A->cols;i++)42{43if((MB[i] = (MP_INT *) malloc(A->cols *sizeof(MP_INT))) == NULL)44{45printf("malloc of 'MB[%d]' in 'long_mat_inv' failed\n", i);46exit(2);47}48for(j=0;j<A->cols;j++)49mpz_init(&MB[i][j]);50mpz_set_si(&MB[i][i], 1);51}52mpz_init(&Ekgv);53E = MP_solve_mat(MA, A->rows, A->cols, MB, A->cols, &Ecols, &Ekgv);54for(i=0;i<A->cols;i++)55{56for(j=0;j<A->cols;j++)57{ mpz_clear(&MA[i][j]); mpz_clear(&MB[i][j]);}58free(MA[i]);59free(MB[i]);60}61free(MA);62free(MB);6364if(E[1] != NULL)65{66printf("Error: matrix in 'long_mat_inv' is singular\n");67exit(3);68}69if(E[0] == NULL)70{71printf("Error in 'long_mat_inv'\n");72exit(3);73}74erg = MP_mat_to_matrix(E[0], A->cols, A->cols);75if(abs(Ekgv._mp_size) > 1)76{77printf("Error: Integer overflow in 'MP_mat_to_matrix'\n");78exit(3);79}80erg->kgv = mpz_get_si(&Ekgv);81for(i=0;i<A->cols;i++)82{83for(j=0;j<A->cols;j++)84mpz_clear(&E[0][i][j]);85free(E[0][i]);86}87free(E[0]);88free(E);89mpz_clear(&Ekgv);90if(A->kgv != 1)91{92for(i=0;i<A->cols;i++)93for(j=0;j<A->cols;j++)94erg->array.SZ[i][j] *= A->kgv;95}96Check_mat(erg);97return(erg);98}99100101