AlVin  1.0
A C++ implementation of the Vinberg's algorithm for Q, Q( sqrt(d) ) and Q( cos(2 pi / 7) )
Using AlVin

Table of Contents

Parameters of AlVin

The parameters of AlVin can be separated in the following types:

We present the parameters separately.

Basic mandatory parameters

Parameters
-qfThe quadratic form
-kThe field of definition
Can have the following values:
  • Q
  • Q[ sqrt d ]
  • RC7 for the field Q[ cos(2*pi/7) ] Remark: One does not have to specify the field if the quadratic form is defined over the rationals.

Basic optional parameters

Parameters
-minvMinimal number of vectors to compute (integer) As long as this number is not reached, AlVin does not test whether the polyhedron has finite volume or not.
-maxvMaximal number of vectors to compute (integer)

Parameters regarding the output (optional)

Parameters
-ipInvariants of the polyhedron
If specified and if the algorithm terminates, the following information will be displayed:
  • Euler characteristic
  • f-vector
  • Number of vertices at infinity
  • Growth series
  • Growth rate and some of its properties (Perron number, Salem number, Pisot number)
-iqfInvariants of the quadratic form
If the field of definition is Q, the complete invariant of the commensurability class of the quadratic form will be displayed.
-oformatThe format of the output
Possible values: latex, mathematica, pari

Testing the non-reflectivity (optional)

Parameters
-nrNon-reflectivity
If specified, AlVin will try to determine whether the quadratic form is non-reflective or not.
More information here: Testing the non-reflectivity
-nrequationsNon-reflectivity (K=Q)
If the quadratic form is defined over Z, create the systems of equations to test the non-reflectivity of the quadratic form.

Examples

First example, over the rationals

To find the fundamental polyhedron associated to the quadratic form <-2,3,1,1,1>, we call AlVin as follows:

./alvin -qf -2,3,1,1,1

and the output is the following:

Quadratic form (4,1): -2, 1, 1, 1, 3
Field of definition: Q
Vectors:
e1 = (0, -1, 1, 0, 0)
e2 = (0, 0, -1, 1, 0)
e3 = (0, 0, 0, -1, 0)
e4 = (0, 0, 0, 0, -1)
e5 = (1, 1, 0, 0, 1)
e6 = (1, 2, 0, 0, 0)
e7 = (1, 1, 1, 1, 0)
e8 = (3, 3, 3, 0, 1)
Algorithm ended
Graph written in the file:
output/4-2,1,1,1,3.coxiter
Computation time: 0.0650726s

If we want the information about the associated polyhedron, we add "-ip" (invariants polyhedron):

./alvin -qf -2,3,1,1,1 -ip

and we get

Quadratic form (4,1): -2, 1, 1, 1, 3
Field of definition: Q
Vectors:
e1 = (0, -1, 1, 0, 0)
e2 = (0, 0, -1, 1, 0)
e3 = (0, 0, 0, -1, 0)
e4 = (0, 0, 0, 0, -1)
e5 = (1, 1, 0, 0, 1)
e6 = (1, 2, 0, 0, 0)
e7 = (1, 1, 1, 1, 0)
e8 = (3, 3, 3, 0, 1)
Algorithm ended
Graph written in the file:
output/4-2,1,1,1,3.coxiter
---------------------------------
Information about the polyhedron:
---------------------------------
Euler characteristic: 5/192
Volume: pi^2 * 5/144
f-vector: (13, 28, 23, 8, 1)
Number of vertices at infinity: 1
Growth series:
f(x) = C(2,2,2,2,3,4,4,6,8)/(1 - 4 * x + 4 * x^2 - 7 * x^3 + 9 * x^4 - 9 * x^5 + 13 * x^6 - 10 * x^7 + 15 * x^8 - 8 * x^9 + 10 * x^10 - 5 * x^11 + 5 * x^12 - 3 * x^13 + x^14 - 2 * x^15)
Growth rate: 3.2137002182040596788604014104377817271
Perron number: yes
Pisot number: no
Salem number: no
Computation time: 0.0689565s

To change the format of the output (e.g. to use it in Mathematica), we add "-oformat mathematica", and we get:

Quadratic form (4,1): -2, 1, 1, 1, 3
Field of definition: Q
F[x_, y_] := Sum[x[[i]]*y[[i]]*qform[[i]], {i, 1, Length[x]}];
S[x_, y_] := F[x, y]/Sqrt[F[x, x]*F[y, y]];
qform := {-(2), 1, 1, 1, 3};
vectors := {{0, -1, 1, 0, 0}};
AppendTo[vectors, {0, 0, -1, 1, 0}]; (* vector 2 *);
AppendTo[vectors, {0, 0, 0, -1, 0}]; (* vector 3 *);
AppendTo[vectors, {0, 0, 0, 0, -1}]; (* vector 4 *);
AppendTo[vectors, {1, 1, 0, 0, 1}]; (* vector 5 *);
AppendTo[vectors, {1, 2, 0, 0, 0}]; (* vector 6 *);
AppendTo[vectors, {1, 1, 1, 1, 0}]; (* vector 7 *);
AppendTo[vectors, {3, 3, 3, 0, 1}]; (* vector 8 *);
grammatrix := Table[S[vectors[[i]], vectors[[j]]], {i, 1, Length[vectors]}, {j, 1, Length[vectors]}];
Algorithm ended
Graph written in the file:
output/4-2,1,1,1,3.coxiter
---------------------------------
Information about the polyhedron:
---------------------------------
Euler characteristic: 5/192
Volume: pi^2 * 5/144
f-vector: (13, 28, 23, 8, 1)
Number of vertices at infinity: 1
Growth series:
Cyclo[s_, x_] := Product[Cyclotomic[s[[i]], x], {i, 1, Length[s]}];
f[x_] := Cyclo[{2,2,2,2,3,4,4,6,8},x]/(1 - 4 * x + 4 * x^2 - 7 * x^3 + 9 * x^4 - 9 * x^5 + 13 * x^6 - 10 * x^7 + 15 * x^8 - 8 * x^9 + 10 * x^10 - 5 * x^11 + 5 * x^12 - 3 * x^13 + x^14 - 2 * x^15);
Growth rate: 3.2137002182040596788604014104377817271
Perron number: yes
Pisot number: no
Salem number: no
Computation time: 0.111749s

Second example, over Q[sqrt 2]

We want to compute the polyhedron associated to the form <-1-sqrt(2),1,1,1,1>, over Q[ sqrt 2 ]. We call AlVin as follows:

./alvin -qf -1-T,1,1,1,1 -k Q[sqrt 2]

and the output is then:

Quadratic form (4,1): -1 - 1 * T(2), 1, 1, 1, 1
Field of definition: Q[ sqrt(2) ]
Vectors:
e1 = (0, -1, 1, 0, 0)
e2 = (0, 0, -1, 1, 0)
e3 = (0, 0, 0, -1, 1)
e4 = (0, 0, 0, 0, -1)
e5 = (1, 1 + 1 * T(2), 0, 0, 0)
e6 = (1 + 1 * T(2), 1 + 1 * T(2), 1 + 1 * T(2), 1 + 1 * T(2), 0)
e7 = (2 + 1 * T(2), 2 + 1 * T(2), 1 + 1 * T(2), 1 + 1 * T(2), 1 + 1 * T(2))
Algorithm ended
Graph written in the file:
output/4-1+T2,1,1,1,1.coxiter
Computation time: 0.06541

Remark:
T correspond to the generator of the ring of integers of Q[ sqrt d ], that is:

Third example, over Q[cos(2*pi/7)]

The designation for this field is RC7 (for maximal Real subfield of the p-th Cyclotomic field with p=7). Each element in the ring of integers of RC7 can be written in the Z-basis {2*cos(2*pi/7),2*cos(4*pi/7),2*cos(6*pi/7)} and will be designated by its 3 components [x,y,z]. For example, to do the computations for the quadratic form <-2*cos(2*pi/7),1,1,1,1>, we do:

./alvin -k rc7 -qf [-1,0,0],1,1,1,1

and the result is

Quadratic form (4,1): [-1,0,0], 1, 1, 1, 1
Field of definition: RC7
Vectors:
e1 = (0, -1, 1, 0, 0)
e2 = (0, 0, -1, 1, 0)
e3 = (0, 0, 0, -1, 1)
e4 = (0, 0, 0, 0, -1)
e5 = (1, [0,0,-1], 0, 0, 0)
e6 = ([-1,-2,-2], [0,-1,-1], [0,-1,-1], [0,-1,-1], 0)
e7 = ([0,-2,-4], [-1,-2,-3], [-1,-2,-3], [0,-1,-2], [0,-1,-2])
e8 = ([-1,-4,-7], [-1,-3,-5], [-1,-3,-5], [-1,-2,-3], [-1,-2,-3])
Algorithm ended
Graph written in the file:
output/4-[1,0,0],1,1,1,1.coxiter
Computation time: 9.06708s

Testing the non-reflectivity

In order to test whether a quadratic form is non-reflective, AlVin does as follows:

  1. It computes a certain (specified my the "-maxv" parameter) number of vectors (corresponding to normal vector of sides of the polyhedron)
  2. It computes isometries of the polyhedron which preserves the quadratic lattice.

The isometries in 2. are found via isomorphism of subgraphs of the Coxeter graph. The possible sizes of these subgraphs have to be specified. If the quadratic form is of signature (n,1), then we usually can take sizes n+1,n+2 and n+3.

For example, to study the quadratic form <-1,1,1,13> we can do:

./alvin -qf -1,1,1,13 -maxv 15 -nr[5,6]

Here, AlVin will compute the first 15 vectors and use subgraphs of 5 and 6 vertices. The output is then the following:

Quadratic form (3,1): -1, 1, 1, 13
Field of definition: Q
Vectors:
e1 = (0, -1, 1, 0)
e2 = (0, 0, -1, 0)
e3 = (0, 0, 0, -1)
e4 = (1, 1, 1, 0)
e5 = (4, 2, 1, 1)
e6 = (13, 13, 0, 1)
e7 = (6, 5, 0, 1)
e8 = (11, 2, 1, 3)
e9 = (18, 1, 0, 5)
e10 = (52, 13, 0, 14)
e11 = (91, 13, 0, 25)
e12 = (34, 25, 8, 6)
e13 = (143, 104, 39, 25)
e14 = (72, 55, 17, 12)
e15 = (312, 234, 78, 53)
The algorithm did not terminate; the polyhedron may be of infinite volume
Checking if the form is non-reflective...
The form is non-reflective
Computation time: 0.277623s

The parameter "-debug" can be used to get more information:

Quadratic form (3,1): -1, 1, 1, 13
Field of definition: Q
Conditions on the coefficients:
x2 <= x1
Possible values for (e,e): 1, 2, 13, 26
Vectors:
e1 = (0, -1, 1, 0)
e2 = (0, 0, -1, 0)
e3 = (0, 0, 0, -1)
e4 = (1, 1, 1, 0)
e5 = (4, 2, 1, 1)
e6 = (13, 13, 0, 1)
e7 = (6, 5, 0, 1)
e8 = (11, 2, 1, 3)
e9 = (18, 1, 0, 5)
e10 = (52, 13, 0, 14)
e11 = (91, 13, 0, 25)
e12 = (34, 25, 8, 6)
e13 = (143, 104, 39, 25)
e14 = (72, 55, 17, 12)
e15 = (312, 234, 78, 53)
The algorithm did not terminate; the polyhedron may be of infinite volume
Checking if the form is non-reflective...
The form is non-reflective
List of used involutions:
e2 <-> e4, e3 <-> e6, e5
e4, e5 <-> e7, e6 <-> e13
Computation time: 0.28202s

Remark:
Since the tests are run in parallel in more than one processor, the involutions used can changeif you run AlVin again.