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 "longtools.h"3#include "matrix.h"4#include "tools.h"56/**************************************************************************\7@---------------------------------------------------------------------------8@---------------------------------------------------------------------------9@ FILE: pair_red_inv.c10@---------------------------------------------------------------------------11@---------------------------------------------------------------------------12@13\**************************************************************************/141516/**************************************************************************\17@---------------------------------------------------------------------------18@ matrix_TYP *pair_red_inv(A, T)19@ matrix_TYP *A, *T;20@21@ calculates a matrices B and T such that T A^{-1} T^{tr} = B22@ is pair_reduced.23@ B is returned with B->kgv = 1 and the transformation is written to T.24@ The function used GNU MP to avoid overflow25@---------------------------------------------------------------------------26@27\**************************************************************************/28matrix_TYP *pair_red_inv(A, T)29matrix_TYP *A, *T;30{31MP_INT ***E, **MA, **MB, **Trf;32MP_INT Ekgv;33int Ecols;34matrix_TYP *erg;35int i,j;363738if(A->cols != A->rows)39{40printf("error: can't invert non-square matrix\n");41exit(3);42}43MA = matrix_to_MP_mat(A);44if((MB = (MP_INT **) malloc(A->cols *sizeof(MP_INT *))) == NULL)45{46printf("malloc of 'MB' in 'pair_red_inv' failed\n");47exit(2);48}49for(i=0;i<A->cols;i++)50{51if((MB[i] = (MP_INT *) malloc(A->cols *sizeof(MP_INT))) == NULL)52{53printf("malloc of 'MB[%d]' in 'long_mat_inv' failed\n", i);54exit(2);55}56for(j=0;j<A->cols;j++)57mpz_init(&MB[i][j]);58mpz_set_si(&MB[i][i], 1);59}60mpz_init(&Ekgv);61E = MP_solve_mat(MA, A->rows, A->cols, MB, A->cols, &Ecols, &Ekgv);62for(i=0;i<A->cols;i++)63{64for(j=0;j<A->cols;j++)65{ mpz_clear(&MA[i][j]); mpz_clear(&MB[i][j]);}66free(MA[i]);67free(MB[i]);68}69free(MA);70free(MB);7172if(E[1] != NULL)73{74printf("Error: matrix in 'long_mat_inv' is singular\n");75exit(3);76}77if(E[0] == NULL)78{79printf("Error in 'long_mat_inv'\n");80exit(3);81}82if( (Trf = (MP_INT **)malloc(A->cols *sizeof(MP_INT *))) == NULL)83{84printf("malloc of 'Trf' in 'pair_red_inv' failed\n");85exit(2);86}87for(i=0;i<A->cols;i++)88{89if( (Trf[i] = (MP_INT *)malloc(A->cols *sizeof(MP_INT))) == NULL)90{91printf("malloc of 'Trf[%d]' in 'pair_red_inv' failed\n", i);92exit(2);93}94for(j=0;j<A->cols;j++)95mpz_init(&Trf[i][j]);96mpz_set_si(&Trf[i][i], 1);97}98MP_pair_red(E[0], Trf, A->cols);99erg = MP_mat_to_matrix(E[0], A->cols, A->cols);100write_MP_mat_to_matrix(T, Trf);101for(i=0;i<A->cols;i++)102{103for(j=0;j<A->cols;j++)104{105mpz_clear(&E[0][i][j]);106mpz_clear(&Trf[i][j]);107}108free(E[0][i]);109free(Trf[i]);110}111free(E[0]);112free(E);113free(Trf);114mpz_clear(&Ekgv);115Check_mat(erg);116return(erg);117}118119120