GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
@ @-------------------------------------------------------------------- @ FILE: all_vor_neighbours.c @-------------------------------------------------------------------- @ @ matrix_TYP *all_voronoi_neighbours(P, G, Ftr, tr_bifo) @ matrix_TYP *P, **Ftr, *tr_bifo; @ bravais_TYP *G; @-------------------------------------------------------------------- @ @ The arguments of 'all_voronoi_neighbours' are: @ P: a G-perfect form @ G: the group for which P is G-perfect @ Ftr: a basis for the integral forms in the formspace of G^{tr} @ trbifo: The matrix of the bilinear form @ F(G)xF(G^{tr})--> R: (A,B)---> trace(AB) @ with respect to the Z-bases given by G->form and Ftr @ Let Fdim be the dimension of the formspace of G and m be the number of @ G-perfect forms that are neighbours of P. @ Then the result of 'all_perfect_neighbours' is a matrix N with m rows @ and Fdim+3 columns. @ For 0 < i< m let R[i] be the form in F(G) represented by the @ first Fdim entries of the i-th row of N, t.m. @ R[i] = N[i][0] * G->form[0] + ..... + N[i][Fdim-1] * G->form[Fdim-1] @ Further let @ p[i] := N[i][Fdim], r[i] := N[i][Fdim+1], c[i] := N[i][Fdim+2] @ Then P[i] := (p[i]*P + r[i]*R[i]) / c[i] @ is a G-perfect form neighboured to P. @-------------------------------------------------------------------- @ @--------------------------------------------------------------------------- @--------------------------------------------------------------------------- @ FILE: calc_voronoi_data.c @--------------------------------------------------------------------------- @--------------------------------------------------------------------------- @ @--------------------------------------------------------------------------- @ void calc_voronoi_basics(V, G, Gtr, prime) @ voronoi_TYP *V; @ bravais_TYP *G, *Gtr; @ int prime; @ @ For using this function V->gram must be a G-perfect form @ The function calculates: @ @ V->SV_no: the number of shortest vectors of V->gram. @ V->min: the minimum of V->gram. @ V->pdet: the determinante of V->gram modulo prime. @ V->prime: = prime. @ V->vert: the coordinates of the voronoi vertices with @ respect to the Z-basis of the space of invariant @ symmetric matrices of G^{tr} given in Gtr->form. @ V->vert_no: the number of voronoi_vertices. @ V->red_inv: the pair-reduced of (V->gram)^{-1} (with kgv = 1). @ V->T: the matrix such that @ T *(V->gram)^{-1} * T^{tr} = V->red_inv @ V->Ti: the inverse matrix of V->T @ V->Gtrred: the bravais_TYP obtained by konjugating Gtr with @ the transposed of V->Ti with the function @ 'konj_bravais' @--------------------------------------------------------------------------- @ @--------------------------------------------------------------------------- @ void calc_voronoi_pol(V, bifo) @ voronoi_TYP *V; @ @ calculates the polyeder_TYP V->pol where the walls of V->pol @ are the walls in 'V->vert' multiplied with the transposed of bifo, @ i.e. V->vert[i] * bifo^{tr} 0 <= i <V->vert_no @ is the input for 'first_polyeder' and 'refine_polyeder' used @ to calculate 'V->pol'. @--------------------------------------------------------------------------- @ @--------------------------------------------------------------------------- @ void calc_voronoi_good_inv(V, Gtr) @ voronoi_TYP *V; @ bravais_TYP *Gtr; @ @ applies 'short_red' and 'mink_red' to V->red_inv to obtain a better @ form. @ V->T, V->Ti and V->Gtrred are changed in the same manner as described @ for 'calc_voronoi_basics' @ @ Furthermore the shortest vectors of the better reduced form are @ calculated up to the norm that equals the maximal diagonal entry @ of V->red_inv. @--------------------------------------------------------------------------- @ @--------------------------------------------------------------------------- @ void calc_voronoi_stab(V, G, Gtr, bifo) @ voronoi_TYP *V; @ bravais_TYP *G, *Gtr; @ matrix_TYP *bifo; @ @ calculates a generating set for @ H = { h\in GL_n(Z) | h^{tr} * V->gram * h = V->gram and @ h G h^{-1} = G } @ @ Furthermore the bravais_TYP* V->linstab is calculated, that @ describes the linear action for H on the space of G-invariant @ symmetric matrices with respect to the Z-basis given in @ G->form (c.f. the function 'nomlin' in directory 'Bravais' @--------------------------------------------------------------------------- @ @--------------------------------------------------------------------------- @ matrix_TYP *calc_voronoi_isometry(V1, V2, G, Gtr, bifo) @ voronoi_TYP *V1, *V2; @ bravais_TYP *G, *Gtr; @ matrix_TYP *bifo; @ @ calculates a matrix X in GL_N(Z) such that @ X * V1->gram * X^{tr} = V2->gram and X * G * X^{-1} = G @--------------------------------------------------------------------------- @ @--------------------------------------------------------------------------- @ void calc_voronoi_dir_reps(V, G, Gtr, bifo) @ voronoi_TYP *V; @ bravais_TYP *G, *Gtr; @ matrix_TYP *bifo; @ @ calculates representatives of the orbits of V->stab on the @ Voronoi-directions given in V->pol->vert. @ The representatives are stored in V->dir_reps in the following way @ V->dir_reps->cols is the number of representatives. @ Each column discribes a representatives @ The integer in the first row describs the number of the representative, @ i.e. V->dir_reps->array.SZ[0][i] = k means that V->pol->vert[k] @ is a representative of the i-th orbit. @ The entry in the second row is the length of the orbit. @ The third row is allocated in 'normalizer', where repesentatives @ V[0],...,V[t] of the G-perfect forms are calculated @ V->dir_reps->array.SZ[2][i] = k means, that V is a neighbour of @ V[k] and the Voronoi-direction from V to V[k] is the one @ given in the first row. @--------------------------------------------------------------------------- @ @--------------------------------------------------------------------------- @ void calc_voronoi_complete(V, G, Gtr, bifo, prime) @ voronoi_TYP *V; @ bravais_TYP *G, *Gtr; @ matrix_TYP *bifo; @ int prime; @ @ applies: @ calc_voronoi_basics(V, G, Gtr, prime); @ calc_voronoi_pol(V, bifo); @ calc_voronoi_good_inv(V, Gtr); @ calc_voronoi_stab(V, G, Gtr, bifo); @ calc_voronoi_dir_reps(V, G, Gtr, bifo); @--------------------------------------------------------------------------- @ @ @--------------------------------------------------------------------- @ FILE: first_perfect.c @--------------------------------------------------------------------- @ @ @ matrix_TYP *first_perfect(A, G, Ftr, trbifo, min) @ matrix_TYP *A, **Ftr, *trbifo; @ bravais_TYP *G; @ int *min; @ @ 'first_perfect' calculates a G-perfect Form. @ The arguments of 'first_perfect' are @ A: a G-invariant, positive definite Form @ G: the group for which a perfect form will be calculated @ Ftr: a Z-basis for the integral forms in the formspace of G^{tr} @ trbifo: The matrix of the bilinear form @ F(G)xF(G^{tr})--> R: (A,B)---> trace(AB) @ with respect to the Z-bases given by G->form and Ftr @ min: The pointer min returns the minimum of the calculated @ perfect form. @--------------------------------------------------------------------- @ @--------------------------------------------------------------------------- @--------------------------------------------------------------------------- @ FILE: init_voronoi.c @--------------------------------------------------------------------------- @--------------------------------------------------------------------------- @ @--------------------------------------------------------------------------- @ voronoi_TYP *init_voronoi() @ @ allocates storage for a pointer to voronoi_TYP and sets all intergers @ and all pointers of it to 0 resp. NULL. @--------------------------------------------------------------------------- @ @--------------------------------------------------------------------------- @ void clear_voronoi(V) @ voronoi_TYP *V; @ @ frees all pointers that are allocated in the the voronoi_TYP *V @ and sets them to NULL @ All integers are set 0. @--------------------------------------------------------------------------- @ @--------------------------------------------------------------------------- @ void put_voronoi(V) @ voronoi_TYP *V; @ @ Prints the informations in V to standard-output with comments @--------------------------------------------------------------------------- @ @--------------------------------------------------------------------------- @--------------------------------------------------------------------------- @ FILE: normalizer.c @--------------------------------------------------------------------------- @--------------------------------------------------------------------------- @ @--------------------------------------------------------------------------- @ voronoi_TYP **normalizer(P, G, Gtr, prime, V_no) @ matrix_TYP *P; @ bravais_TYP *G, *Gtr; @ int prime, *V_no; @ @ The arguments of normalizer are @ P: A G-perfect form (can be calculated with 'first_perfect') @ G: A group given as 'bravais_TYP*' where 'G->form' must contain a @ Z-Basis of the integral G-invariant matrices. @ Gtr: The group G^{tr} given as 'bravais_TYP', also @ with a Z-basis in 'G->form' @ prime: a prime number (used to calculate determinates modulo p @ for a simple criterion of two symmetric matrices been @ not isometric. @ V_no: via this pointer the number of returned 'voronoi_TYP' @ is returned. @ @ 'normalizer' calculates representatives of the G-perfect forms. @ The are returned in a list 'voronoi_TYP**' @ Furthermore generators of the integral normalizer of G are calculated @ and written to G->normal. Their number is G->normal_no. @ @--------------------------------------------------------------------------- @ @--------------------------------------------------------------------------- @--------------------------------------------------------------------------- @ FILE: pair_red_inv.c @--------------------------------------------------------------------------- @--------------------------------------------------------------------------- @ @--------------------------------------------------------------------------- @ matrix_TYP *pair_red_inv(A, T) @ matrix_TYP *A, *T; @ @ calculates a matrices B and T such that T A^{-1} T^{tr} = B @ is pair_reduced. @ B is returned with B->kgv = 1 and the transformation is written to T. @ The function used GNU MP to avoid overflow @--------------------------------------------------------------------------- @ @ ----------------------------------------------------------------------- @ FILE: vor_neighbour.c: @ ----------------------------------------------------------------------- @ @ @ matrix_TYP *voronoi_neighbour(A, X, Amin, lc, rc) @ matrix_TYP *A, *X; @ int Amin, *lc, *rc; @ @ The arguments of 'voronoi_neigbour' are @ A: a positiv definite matrix @ Amin: The Minimum of A, min(A) := min{yAy^{tr} | y in Z^n, y not 0} @ X: a symmetric matrix, which is not positiv semidefinite @ lc, rc: These pointer to an integer return the values of the @ coefficients N = lc * A + rc *X for the result N of the @ function @ @ For A positive definite let M(A) denote the set of all y in Z^n @ with yAy^{tr} = min(A) and @ Z(A, X) the set of all y in M(A) with yXy^{tr} = 0. @ The function voronoi_neigbbour calculates a Matrix N = lc *A + rc * X @ with positive integral coefficients lc and rc such that @ Z(A, X) is a proper subset of M(N). @ In particular min(N) = lc * min(A). @----------------------------------------------------------------------- @ @--------------------------------------------------------------------------- @--------------------------------------------------------------------------- @ FILE: vor_vertices.c @--------------------------------------------------------------------------- @--------------------------------------------------------------------------- @ @--------------------------------------------------------------------------- @ matrix_TYP **voronoi_vertices(form, grp, anz, form_min, SV_no) @ matrix_TYP *form; @ bravais_TYP *grp; @ int *anz, *form_min, *SV_no; @ @ calculates the voronoi_vertices, i.e. the matrices in the space of @ symmetric matrices, that are invariant under the action of G^{tr}, @ where the voronoi vertices are defined by the sum over all g in the @ group 'grp' of @ g x^{tr}x g, @ where x is a shortest vector of 'form'. @ @ The number of these vertices is returned via (int *anz) @ the number of shortest vectors of 'form' via (int *SV_no) and @ the minimum of 'form' via (int *form_min) @--------------------------------------------------------------------------- @