GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
#include "typedef.h"1#include "matrix.h"2#include "voronoi.h"3#include "ZZ_P.h"45static matrix_TYP *Mod, *Trf;6static rational c;78/*{{{}}} */9/*{{{ lll_init, static */10static void11lll_init (Mat, lll_bnd)12matrix_TYP *Mat;13int lll_bnd;1415{16int **Z, **N;17int i;181920c.z = lll_bnd;21c.n = lll_bnd + 1;2223Trf = mat_red (Mat);24dec_mat (Mat, Trf);2526if (LLLREDUCED)27{28Mod = init_mat (Mat->rows, Mat->rows, "srl");29Z = Mod->array.SZ;30N = Mod->array.N;31for (i = 0; i < Mat->rows; i++)32{33Z[i][i] = 1;34}35}36}37/*}}} */38/*{{{ upd_mod, static */3940static void41upd_mod (Mat, pos)42matrix_TYP *Mat;43int pos;4445{46int **Z, **N, **A;47rational sum, help;48int i, j;4950sum = help = Zero;5152A = Mat->array.SZ;53Z = Mod->array.SZ;54N = Mod->array.N;55if (pos == 1)56Z[0][0] = A[0][0];57for (i = 0; i <= pos; i++)58{59sum.z = 0;60sum.n = 1;61for (j = 0; j < i; j++)62{63help.z = Z[j][j] * Z[pos][j] * Z[i][j];64help.n = N[j][j] * N[pos][j] * N[i][j];65sum.z *= help.n;66help.z *= sum.n;67sum.z += help.z;68sum.n *= help.n;69Normal (&sum);70}71if ((i != pos) && (Z[i][i] != 0))72{73N[pos][i] = sum.n * Z[i][i];74sum.n = sum.n * A[pos][i] - sum.z;75Z[pos][i] = sum.n * N[i][i];76}77else78{79N[pos][i] = sum.n;80sum.n *= A[pos][i];81Z[pos][i] = sum.n - sum.z;82}83Normal2 (&Z[pos][i], &N[pos][i]);84}85}8687/*}}} */88/*{{{ reduce, static */89static boolean90reduce (Mat, k, l)91matrix_TYP *Mat;92int k, l;9394{95rational d;96int **Z, **N, **A, **T, *T_help;97int i;98int f, waste;99100d = Zero;101f = waste = 0;102103Z = Mod->array.SZ;104N = Mod->array.N;105A = Mat->array.SZ;106T = Trf->array.SZ;107d.z = abs (Z[k][l]);108d.n = N[k][l];109if ((d.z * 11) > d.n)110{111f = d.z / d.n;112d.z %= d.n;113if (d.z > (d.n / 2))114f++;115if (f != 0)116{117if (Z[k][l] < 0)118f *= -1;119for (i = 0; i < l; i++)120{121Z[k][i] =122Z[k][i] * N[l][i] - f * N[k][i] * Z[l][i];123N[k][i] *= N[l][i];124Normal2 (&Z[k][i], &N[k][i]);125}126Z[k][i] -= f * N[k][i];127A[k][k] -= (2 * A[k][l] - f * A[l][l]) * f;128for (i = 0; i <= l; i++)129A[k][i] -= f * A[l][i];130for (; i < k; i++)131A[k][i] -= f * A[i][l];132for (i++; i < Mat->rows; i++)133A[i][k] -= f * A[i][l];134for (i = 0; i < Trf->cols; i++)135T[k][i] -= f * T[l][i];136}137if (A[k][k] == 0)138{139kill_row (Mat, k);140kill_col (Mat, k);141T_help = T[k];142/* Mat->cols = --Mat->rows; */143for (i = k; i < Mat->rows; i++)144{145T[i] = T[i + 1];146/* A[i] = A[i+1];147for ( j = k; j <= i; j++)148A[i][j]= A[i][j+1]; A[i][j+1] = 0; */149}150T[i] = T_help;151A = Mat->array.SZ;152return (FALSE);153}154}155return (TRUE);156}157/*}}} */158/*{{{ swap, static */159160static void161swap (Mat, i)162163matrix_TYP *Mat;164165int i;166167{168rational help;169int **Z, **N, **A, **T, *t;170int j;171int k;172173help = Zero;174k = 0;175176A = Mat->array.SZ;177Z = Mod->array.SZ;178N = Mod->array.N;179T = Trf->array.SZ;180t = T[i + 1];181T[i + 1] = T[i];182T[i] = t;183for (j = 0; j < i; j++)184{185k = A[i + 1][j];186A[i + 1][j] = A[i][j];187A[i][j] = k;188k = 0;189Z[i][j] = Z[i + 1][j];190Z[i + 1][j] = 0;191N[i][j] = N[i + 1][j];192N[i + 1][j] = 1;193}194k = A[i][i];195A[i][i] = A[i + 1][i + 1];196A[i + 1][i + 1] = k;197k = 0;198for (j += 2; j < Mat->rows; j++)199{200k = A[j][i + 1];201A[j][i + 1] = A[j][i];202A[j][i] = k;203k = 0;204}205help.z = Z[i + 1][i] * Z[i + 1][i] * Z[i][i] * N[i + 1][i + 1];206help.n = N[i + 1][i] * N[i + 1][i] * N[i][i];207Normal (&help);208N[i][i] = help.n * N[i + 1][i + 1];209Z[i][i] = help.n * Z[i + 1][i + 1] + help.z;210Normal2 (&Z[i][i], &N[i][i]);211}212213/*}}} */214/*{{{ condition, static */215static boolean216condition (i)217int i;218219{220rational help;221int **Z, **N;222boolean cond;223224help = Zero;225Z = Mod->array.SZ;226N = Mod->array.N;227228help.z = Z[i][i - 1] * Z[i][i - 1];229help.n = N[i][i - 1] * N[i][i - 1];230help.z = -help.z * c.n + c.z * help.n;231help.n *= c.n;232help.z *= Z[i - 1][i - 1];233help.n *= N[i - 1][i - 1];234help.n *= Z[i][i];235help.z *= N[i][i];236cond = help.n < help.z;237return (cond);238}239240/*}}} */241/*{{{ lll, exported */242matrix_TYP *243ZZ_lll (Mat, lll_bnd)244matrix_TYP *Mat;245int lll_bnd;246247{248int i = 1, j;249250lll_init (Mat, lll_bnd);251if (LLLREDUCED)252{253if (Mat->cols == 1)254return (Trf);255do256{257upd_mod (Mat, i);258for (j = i - 1; j >= 0; j--)259{260if (!reduce (Mat, i, j))261{262i--;263break;264}265266if ((j == i - 1) && condition (i))267{268swap (Mat, --i);269}270}271i++;272} while (i < Mat->cols);273free_mat (Mod);274for (i = 0; i < Mat->rows; i++)275for (j = i + 1; j < Mat->cols; j++)276Mat->array.SZ[i][j] = Mat->array.SZ[j][i];277}278Check_mat (Trf);279Check_mat (Mat);280return (Trf);281}282/*}}} */283284285