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/**************************************************************************\4@---------------------------------------------------------------------------5@---------------------------------------------------------------------------6@ FILE: MP_pair_red.c7@---------------------------------------------------------------------------8@---------------------------------------------------------------------------9@10\**************************************************************************/11121314static void MP_two_reduce(G, T, i, j, n)15MP_INT **G, **T;16int i, j, n;17{18int k;19MP_INT f, f1, f2;20MP_INT zwei;2122mpz_init(&f);23mpz_init(&f1);24mpz_init(&f2);25mpz_init_set_si(&zwei, 2);26mpz_div(&f1, &G[i][i], &zwei);27if(mpz_cmp_si(&G[i][j], 0) > 0)28{29mpz_add(&f2, &G[i][j], &f1);30}31else32{33mpz_sub(&f2, &G[i][j], &f1);34}35mpz_div(&f, &f2, &G[i][i]);3637for(k=0;k<n;k++)38{39mpz_mul(&f1, &f, &G[i][k]);40mpz_sub(&G[j][k], &G[j][k], &f1);41}42mpz_mul(&f1, &f, &G[j][i]);43mpz_sub(&G[j][j], &G[j][j], &f1);44for(k=0;k<n;k++)45{46if(k != j)47{48mpz_set(&G[k][j], &G[j][k]);49}50}51for(k=0;k<n;k++)52{53mpz_mul(&f1, &f, &T[i][k]);54mpz_sub(&T[j][k], &T[j][k], &f1);55}56mpz_clear(&f);57mpz_clear(&f1);58mpz_clear(&f2);59mpz_clear(&zwei);60}616263/**************************************************************************\64@---------------------------------------------------------------------------65@ void MP_pair_red(G, T, n)66@ MP_INT **G, **T;67@ int n;68@69@ Applies a pair reduction to the positive definite n x n - matrix G70@ and does the row operations simultaneous on T, i.e.71@ G is changed to T * G * T^{tr}72@ T must be initialized before calling the function.73@ It is possible to call the function with T = NULL.74@---------------------------------------------------------------------------75@76\**************************************************************************/77void MP_pair_red(G, T, n)78MP_INT **G, **T;79int n;80{81int i,j,k, p1, p2;82int reduced, red2;83MP_INT merk, s, a, zwei;8485mpz_init(&merk);86mpz_init(&s);87mpz_init(&a);88mpz_init_set_si(&zwei, 2);89reduced = FALSE;90MP_reduction_sort(G,T,n);91while(reduced == FALSE)92{93reduced = TRUE;94for(i=0;i<n;i++)95for(j=0;j<i;j++)96{97red2 = FALSE;98while(red2 == FALSE && (mpz_cmp_si(&G[i][i], 0) != 0 || mpz_cmp_si(&G[j][j], 0) != 0))99{100if(mpz_cmp_si(&G[i][i], 0) > 0 && mpz_cmp(&G[i][i], &G[j][j])<= 0)101{102mpz_mul(&a, &zwei, &G[i][j]);103mpz_abs(&merk, &a);104if(mpz_cmp(&merk, &G[i][i]) > 0)105{106MP_two_reduce(G, T, i, j, n);107reduced = FALSE;108}109else110red2 = TRUE;111}112if(mpz_cmp_si(&G[j][j], 0) > 0 && mpz_cmp(&G[j][j], &G[i][i])<=0)113{114mpz_mul(&a, &zwei, &G[i][j]);115mpz_abs(&merk, &a);116if(mpz_cmp(&merk, &G[j][j]) > 0)117{118MP_two_reduce(G, T, j, i, n);119reduced = FALSE;120}121else122red2 = TRUE;123}124if(mpz_cmp_si(&G[i][i], 0) < 0 || mpz_cmp_si(&G[j][j], 0) < 0)125{126mpz_clear(&merk);127mpz_clear(&s);128mpz_clear(&a);129mpz_clear(&zwei);130return;131}132}133}134MP_reduction_sort(G, T, n);135for(i=0;i<n;i++)136for(j=i+1;j<n;j++)137{138if(mpz_cmp(&G[i][i], &G[j][j])<=0)139{ p1 = i; p2 = j;}140else141{ p1 = j; p2 = i;}142mpz_abs(&merk, &G[p1][p2]);143if(mpz_cmp_si(&merk, 0) != 0)144mpz_div(&s, &G[p1][p2], &merk);145else146mpz_set_si(&s, 0);147mpz_mul(&merk, &merk, &zwei);148if(mpz_cmp(&merk, &G[p1][p1]) == 0)149{150for(k=0; k<n;k++)151{152if(k != p2)153{154mpz_mul(&merk, &s, &G[p1][k]);155mpz_sub(&G[p2][k], &G[p2][k], &merk);156}157mpz_mul(&merk, &s, &T[p1][k]);158mpz_sub(&T[p2][k], &T[p2][k], &merk);159}160for(k=0;k<n;k++)161mpz_set(&G[k][p2], &G[p2][k]);162for(k=0;k<n;k++)163{164if(k != p1 && k != p2)165{166red2 = FALSE;167while(red2 == FALSE && mpz_cmp_si(&G[k][k], 0) > 0 && mpz_cmp_si(&G[p2][p2], 0) > 0)168{169mpz_abs(&a, &G[k][p2]);170mpz_mul(&a, &a, &zwei);171if(mpz_cmp(&a, &G[k][k])>0 || mpz_cmp(&a, &G[p2][p2])>0)172{173if(mpz_cmp(&a, &G[k][k])>0 && mpz_cmp(&G[k][k], &G[p2][p2])<0)174MP_two_reduce(G, T, k, p2, n);175else176MP_two_reduce(G, T, p2, k, n);177reduced = FALSE;178}179else180red2 = TRUE;181}182if(mpz_cmp_si(&G[k][k], 0) < 0 || mpz_cmp_si(&G[p2][p2], 0) < 0)183{184mpz_clear(&merk);185mpz_clear(&s);186mpz_clear(&a);187mpz_clear(&zwei);188return;189}190}191}192}193if(mpz_cmp_si(&G[i][i], 0) < 0 || mpz_cmp_si(&G[j][j], 0) < 0)194{195mpz_clear(&merk);196mpz_clear(&s);197mpz_clear(&a);198mpz_clear(&zwei);199return;200}201}202}203204/* inserted 06/05/97 tilman */205mpz_clear(&s);206mpz_clear(&a);207mpz_clear(&merk);208mpz_clear(&zwei);209210return;211212}213214215