# Enumeration of isometries

One of the main features of this project is the enumeration of even lattices with isometry of finite order with at most two prime divisors. This is the content of [BH23] which has been implemented. We guide the user here to the global aspects of the available theory, and we refer to the paper [BH23] for further reference.

Roughly speaking, for a prime number $p$, a $p$-admissible triple $(A, B, C)$ is a triple of integer lattices such that, in some cases, $C$ can be obtained as a primitive extension $A \oplus B \to C$ where one can glue along $p$-elementary subgroups of the respective discriminant groups of $A$ and $B$. Note that not all admissible triples satisfy this extension property.

For instance, if $f$ is an isometry of an integer lattice $C$ of prime order $p$, then for $A := \ker \Phi_1(f)$ and $B := \ker \Phi_p(f)$, one has that $(A, B, C)$ is $p$-admissible (see Lemma 4.15. in [BH23]).

We say that a triple $(G_A, G_B, G_C)$ of genus symbols for integer lattices is $p$-admissible if there are some lattices $A \in G_A$, $B \in G_B$ and $C \in G_C$ such that $(A, B, C)$ is $p$-admissible.

We use Definition 4.13. and Algorithm 1 of [BH23] to implement the necessary tools for working with admissible triples. Most of the computations consists of local genus symbol manipulations and combinatorics. The code also relies on enumeration of integer genera with given signatures, determinant and bounded scale valuations for the Jordan components at all the relevant primes (see integer_genera).

admissible_triplesMethod
admissible_triples(C::ZZGenus, p::Integer; pA::Int = -1,
nA::Int = -1,
pB::Int = -1,
nB::Int = -1,
b::Int = 0)
-> Vector{Tuple{ZZGenus, ZZGenus}}

Given a $\mathbb Z$-genus $C$ and a prime number $p$, return all tuples of $\mathbb Z$-genera $(A, B)$ such that $(A, B, C)$ is $p$-admissible and $B$ is of rank divisible by $p-1$.

One can choose the positive signatures for the genera $A$ and $B$ in output respectively by setting pA and pB to the desired values. Similarly with the negative signatures nA and nB. The function returns an error if the choice of these values is inconsistent.

If b is set to 0, we allow in output the trivial pair, i.e. when $B$ is the genus of rank 0 lattices. Otherwise, if b is set to 1, the trivial pair is discarded.

Examples

julia> L = root_lattice(:A,5);

julia> g = genus(L)
Genus symbol for integer lattices
Signatures: (5, 0, 0)
Local symbols:
Local genus symbol at 2: 1^-4 2^1_7
Local genus symbol at 3: 1^-4 3^1

2-element Vector{Tuple{ZZGenus, ZZGenus}}:
(Genus symbol: II_(5, 0) 2^-1_3 3^1, Genus symbol: II_(0, 0))
(Genus symbol: II_(1, 0) 2^1_7 3^1 5^1, Genus symbol: II_(4, 0) 5^1)

8-element Vector{Tuple{ZZGenus, ZZGenus}}:
(Genus symbol: II_(5, 0) 2^-1_3 3^1, Genus symbol: II_(0, 0))
(Genus symbol: II_(4, 0) 2^2_6 3^1, Genus symbol: II_(1, 0) 2^1_1)
(Genus symbol: II_(3, 0) 2^-3_1 3^1, Genus symbol: II_(2, 0) 2^2_2)
(Genus symbol: II_(3, 0) 2^3_3, Genus symbol: II_(2, 0) 2^-2 3^1)
(Genus symbol: II_(2, 0) 2^-2 3^1, Genus symbol: II_(3, 0) 2^3_3)
(Genus symbol: II_(2, 0) 2^2_2, Genus symbol: II_(3, 0) 2^-3_1 3^1)
(Genus symbol: II_(1, 0) 2^1_1, Genus symbol: II_(4, 0) 2^2_6 3^1)
(Genus symbol: II_(0, 0), Genus symbol: II_(5, 0) 2^-1_3 3^1)
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
is_admissible_tripleMethod
is_admissible_triple(A::ZZGenus, B::ZZGenus, C::ZZGenus, p::Integer) -> Bool

Given a triple of $\mathbb Z$-genera $(A, B, C)$ and a prime number $p$, such that the rank of $B$ is divisible by $p-1$, return whether $(A, B, C)$ is $p$-admissible.

Examples

A standard example is the following: let $(L, f)$ be a lattice with isometry of prime order $p$, let $F:= L^f$ and $C:= L_f$ be respectively the invariant and coinvariant sublattices of $(L, f)$. Then, the triple of genera $(g(F), g(C), g(L))$ is $p$-admissible.

julia> L = root_lattice(:A,5);

julia> f = matrix(QQ, 5, 5, [1  1  1  1  1;
0 -1 -1 -1 -1;
0  1  0  0  0;
0  0  1  0  0;
0  0  0  1  0]);

julia> Lf = integer_lattice_with_isometry(L, f);

julia> F = invariant_lattice(Lf);

julia> C = coinvariant_lattice(Lf);

true
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

Note that admissible triples are mainly used for enumerating lattices with isometry of a given order and in a given genus.

## Enumeration functions

We give an overview of the functions implemented for the enumeration of the isometries of integral integer lattices. For more details such as the proof of the algorithms and the theory behind them, we refer to the reference paper [BH23].

### The hermitian case

For an irreducible reciprocal polynomial $\chi$ and a genus symbol $G$ of integral integer lattices, if the equation order $\mathbb{Z}[\chi]$ is maximal, one can compute representatives of isomorphism classes of lattices with isometry $(L, f)$ such that $L\in G$ and $\chi(f) = 0$.

representatives_of_hermitian_typeMethod
representatives_of_hermitian_type(G::ZZGenus, chi::Union{ZZPolyRingElem, QQPolyRingElem}; first::Bool=false)
representatives_of_hermitian_type(L::ZZLat, chi::Union{ZZPolyRingElem, QQPolyRingElem}; first::Bool=false)
-> Vector{ZZLatWithIsom}

Given a non-empty genus of integer lattices $G$ and a polynomial $chi$ irreducible over $\mathbb Q$, such that the equation order of the associated number field is maximal, return a list of representatives of isomorphism classes of pairs $(M, g)$ consiting of a lattice $M$ in $G$ and $g \in O(M)$ is an isometry of minimal polynomial $chi$.

One can also provide a representative $L$ of $G$ instead.

If first is set to true, only return the first representative computed.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

In the case of finite order isometries, when $\chi$ is cyclotomic, one can use as a shortcut the following function instead:

representatives_of_hermitian_typeMethod
representatives_of_hermitian_type(G::ZZGenus, m::Int; first::Bool=false)
representatives_of_hermitian_type(L::ZZLat, m::Int; first::Bool=false)
-> Vector{ZZLatWithIsom}

Given a non-empty genus of integer lattices $G$, return a list of representatives of isomorphism classes of pairs $(M, g)$ consisting of a lattice $M$ in $G$ and $g \in O(M)$ is an isometry of minimal polynomial $\Phi_m(X)$, the $m-$th cyclotomic polynomial.

If $m = 1,2$, this goes back to enumerate $G$ as a genus of integer lattices.

One can also provide a representative $L$ of $G$ instead.

If first is set to true, only return the first representative computed.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

### Orders with two prime divisors

As we will see later, the algorithms from [BH23] are specialized on the requirement for the input and regular users might not be able to choose between the functions available. We therefore provide a general function which allows one to enumerate lattices with isometry of a given order and in a given genus. The only requirements are to provide a genus symbol, or a lattice from this genus, and the order wanted (as long as the number of distinct prime divisors is at most 2).

enumerate_classes_of_lattices_with_isometryMethod
enumerate_classes_of_lattices_with_isometry(L::ZZLat, order::IntegerUnion)
-> Vector{ZZLatWithIsom}
enumerate_classes_of_lattices_with_isometry(G::ZZGenus, order::IntegerUnion)
-> Vector{ZZLocalGenus}

Given an even integer lattice $L$, return representatives of isomorphism classes of lattice with isometry $(M ,g)$ where $M$ is in the genus of $L$, and $g$ has order order. Alternatively, one can input a given genus symbol $G$ for even integer lattices as an input - the function first computes a representative of $G$.

Note that currently we support only orders which admit at most 2 prime divisors.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
enumerate_prime_power_isometriesMethod
enumerate_prime_power_isometries(L::ZZLat, q::IntegerUnion, vq::IntegerUnion) -> Vector{ZZLatWithIsom}
enumerate_prime_power_isometries(G::ZZGenus, q::IntegerUnion, vq::IntegerUnion) -> Vector{ZZLatWithIsom}

Given a genus $G$ of even integer lattices, or a representative $L$ of $G$, return representatives of isomorphism classes of lattices with isometry $(M, g)$ where $M$ is a lattice in $G$ and $g$ has order $q^vq$.

$q$ must be a prime number and $vq$ must be a positive integer.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

As a remark: if $n = p^dq^e$ is the chosen order, with $p < q$ prime numbers, the previous function computes first iteratively representatives for all classes with isometry in the given genus of order $q^e$. Then, the function increases iteratively the order up to $p^dq^e$.

### Underlying machinery

Here is a list of the algorithmic machinery provided by [BH23] used previously to enumerate lattices with isometry. The following correspond respectively to Algorithms 3, 4, 5, 6 and 7 of the aforementioned paper:

representatives_of_hermitian_typeMethod
representatives_of_hermitian_type(Lf::ZZLatWithIsom, m::Int = 1)
-> Vector{ZZLatWithIsom}

Given a lattice with isometry $(L, f)$ of finite hermitian type (i.e. the minimal polynomial of $f$ is irreducible cyclotomic) and a positive integer $m$, return a set of representatives of isomorphism classes of lattices with isometry $(M, g)$ of finite hermitian type such that the type of $(M, g^m)$ is equal to the type of $(L, f)$.

Note that in this case, the isometries $g$'s are of order $nm$.

Examples

julia> L = root_lattice(:A,2);

julia> Lf = integer_lattice_with_isometry(L);

julia> reps = representatives_of_hermitian_type(Lf, 6)
1-element Vector{ZZLatWithIsom}:
Integer lattice with isometry of finite order 6

julia> is_of_hermitian_type(reps[1])
true
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
splitting_of_hermitian_prime_powerMethod
splitting_of_hermitian_prime_power(Lf::ZZLatWithIsom, p::Int) -> Vector{ZZLatWithIsom}

Given an even lattice with isometry $(L, f)$ of hermitian type with $f$ of order $q^e$ for some prime number $q$, and given another prime number $p \neq q$, return a set of representatives of the isomorphism classes of lattices with isometry $(M, g)$ such that the type of $(M, g^p)$ is equal to the type of $(L, f)$.

Note that $e$ can be 0.

Examples

julia> L = root_lattice(:A,2);

julia> f = matrix(QQ, 2, 2, [0 1; -1 -1]);

julia> Lf = integer_lattice_with_isometry(L, f);

julia> is_of_hermitian_type(Lf)
true

julia> reps = splitting_of_hermitian_prime_power(Lf, 2)
2-element Vector{ZZLatWithIsom}:
Integer lattice with isometry of finite order 6
Integer lattice with isometry of finite order 3

julia> all(is_of_hermitian_type, reps)
true

julia> is_of_same_type(Lf, reps[1]^2)
true

julia> is_of_same_type(Lf, reps[2]^2)
true
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
splitting_of_prime_powerMethod
splitting_of_prime_power(Lf::ZZLatWithIsom, p::Int, b::Int = 0)
-> Vector{ZZLatWithIsom}

Given an even lattice with isometry $(L, f)$ with $f$ of order $q^e$ for some prime number $q$, a prime number $p \neq q$ and an integer $b = 0, 1$, return a set of representatives of the isomorphism classes of lattices with isometry $(M, g)$ such that the type of $(M, g^p)$ is equal to the type of $(L, f)$.

If b == 1, return only the lattices with isometry $(M, g)$ where $g$ has order $pq^e$.

Note that $e$ can be 0.

Examples

julia> L = root_lattice(:A,2);

julia> Lf = integer_lattice_with_isometry(L);

julia> splitting_of_prime_power(Lf, 2)
4-element Vector{ZZLatWithIsom}:
Integer lattice with isometry of finite order 2
Integer lattice with isometry of finite order 2
Integer lattice with isometry of finite order 2
Integer lattice with isometry of finite order 1

julia> splitting_of_prime_power(Lf, 3, 1)
1-element Vector{ZZLatWithIsom}:
Integer lattice with isometry of finite order 3
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
splitting_of_pure_mixed_prime_powerMethod
splitting_of_pure_mixed_prime_power(Lf::ZZLatWithIsom, p::Int)
-> Vector{ZZLatWithIsom}

Given an even lattice with isometry $(L, f)$ and a prime number $p$, such that $\prod_{i=0}^e\Phi_{p^dq^i}(f)$ is trivial for some $d > 0$ and $e \geq 0$, return a set of representatives of the isomorphism classes of lattices with isometry $(M, g)$ such that the type of $(M, g^p)$ is equal to the type of $(L, f)$.

Note that $e$ can be 0, while $d$ has to be positive.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
splitting_of_mixed_prime_powerMethod
splitting_of_mixed_prime_power(Lf::ZZLatWithIsom, p::Int, b::Int = 1)
-> Vector{ZZLatWithIsom}

Given an even lattice with isometry $(L, f)$ and a prime number $p$ such that $f$ has order $p^dq^e$ for some prime number $q \neq p$, return a set of representatives of the isomorphism classes of lattices with isometry $(M, g)$ such that the type of $(M, g^p)$ is equal to the type of $(L, f)$.

If b == 1, return only the lattices with isometry $(M, g)$ where $g$ has order $p^{d+1}q^e$.

Note that $d$ and $e$ can be both 0.

Examples

julia> L = root_lattice(:E,7);

julia> f = matrix(QQ, 7, 7, [ 1  1  2  1  0  0  1;
-1 -2 -3 -2 -1 -1 -1;
0  1  2  1  1  1  1;
0  0 -1 -1 -1 -1 -1;
1  1  2  2  2  1  1;
0  0 -1 -1 -1  0  0;
0  0  0  1  0  0  0]);

julia> Lf = integer_lattice_with_isometry(L, f)
Integer lattice of rank 7 and degree 7
with isometry of finite order 6
given by
[ 1    1    2    1    0    0    1]
[-1   -2   -3   -2   -1   -1   -1]
[ 0    1    2    1    1    1    1]
[ 0    0   -1   -1   -1   -1   -1]
[ 1    1    2    2    2    1    1]
[ 0    0   -1   -1   -1    0    0]
[ 0    0    0    1    0    0    0]

julia> reps = splitting_of_mixed_prime_power(Lf, 2)
2-element Vector{ZZLatWithIsom}:
Integer lattice with isometry of finite order 12
Integer lattice with isometry of finite order 12

julia> all(LL -> is_of_same_type(Lf, LL^2), reps)
true
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

Note that an important feature from the theory in [BH23] is the notion of admissible gluings and equivariant primitive embeddings for admissible triples. In the next chapter, we present the methods regarding Nikulins's theory on primitive embeddings and their equivariant version. We use this basis to introduce the method admissible_equivariant_primitive_extensions (Algorithm 2 in [BH23]) which is the major tool making the previous enumeration possible and fast, from an algorithmic point of view.