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_solve_mat.c9@---------------------------------------------------------------------------10@---------------------------------------------------------------------------11@12\**************************************************************************/1314/************************************************************************\15@-------------------------------------------------------------------------16@ matrix_TYP **long_solve_mat(A, B)17@ matrix_TYP *A, *B;18@19@ long_solve_mat(A,B) calculates Matrix X[0] with AX[0] = B, and20@ a matrix X[1] with MX[1] = 0, such that21@ the cols of X[1] are a Z-basis of the solution space.22@-------------------------------------------------------------------------23\************************************************************************/24matrix_TYP **long_solve_mat(A, B)25matrix_TYP *A, *B;26{27MP_INT ***E, **MA, **MB;28MP_INT Ekgv;29int Ecols, i,j;30matrix_TYP **erg;31matrix_TYP *et;32int Bcols;3334extern MP_INT **matrix_to_MP_mat();35extern MP_INT ***MP_solve_mat();36extern matrix_TYP *MP_mat_to_matrix();3738MA = matrix_to_MP_mat(A);39if(B != NULL)40{41MB = matrix_to_MP_mat(B);42Bcols = B->cols;43}44else45{46MB = NULL; Bcols = 0;47}48mpz_init(&Ekgv);49E = MP_solve_mat(MA, A->rows, A->cols, MB, Bcols, &Ecols, &Ekgv);50for(i=0;i<A->rows;i++)51{52for(j=0;j<A->cols;j++)53mpz_clear(&MA[i][j]);54free(MA[i]);55}56free(MA);57if(B != NULL)58{59/* changed tilman on 21/2/97 from:60for(i=0;i<A->rows;i++)61to: */62for(i=0;i<B->rows;i++)63{64for(j=0;j<Bcols;j++)65mpz_clear(&MB[i][j]);66free(MB[i]);67}68free(MB);69}707172if((erg = (matrix_TYP **)malloc(2 *sizeof(matrix_TYP **))) == NULL)73{74printf("malloc of 'erg' in 'long_solve_mat' failed\n");75exit(2);76}77if(E[0] != NULL)78{79erg[0] = MP_mat_to_matrix(E[0], A->cols, Bcols);80erg[0]->flags.Integral = FALSE;81if(abs(Ekgv._mp_size) > 1)82{83printf("Error: Integer overflow in 'MP_mat_to_matrix'\n");84exit(3);85}86erg[0]->kgv = mpz_get_si(&Ekgv);87if(A->kgv != 1)88{89for(i=0;i<A->cols;i++)90for(j=0;j<B->cols;j++)91erg[0]->array.SZ[i][j] *= A->kgv;92}93if(B->kgv != 1)94erg[0]->kgv *= B->kgv;95Check_mat(erg[0]);96for(i=0;i<A->cols;i++)97{98for(j=0;j<B->cols;j++)99mpz_clear(&E[0][i][j]);100free(E[0][i]);101}102free(E[0]);103}104else105erg[0] = NULL;106if(E[1] != NULL)107{108et = MP_mat_to_matrix(E[1], Ecols, A->cols);109for(i=0;i<Ecols;i++)110{111for(j=0;j<A->cols;j++)112mpz_clear(&E[1][i][j]);113free(E[1][i]);114}115free(E[1]);116erg[1] = tr_pose(et);117free_mat(et);118}119else120erg[1] = NULL;121free(E);122mpz_clear(&Ekgv);123return(erg);124}125126127