# 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.

## Admissible triples

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_triples`

— Method```
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
julia> admissible_triples(g, 5)
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)
julia> admissible_triples(g, 2)
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)
```

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

`is_admissible_triple`

— Method`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);
julia> is_admissible_triple(genus(F), genus(C), genus(Lf), 5)
true
```

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

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_type`

— Method```
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.

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

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

`representatives_of_hermitian_type`

— Method```
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.

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

### 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_isometry`

— Method```
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.

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

`enumerate_prime_power_isometries`

— Method```
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.

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

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_type`

— Method```
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
```

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

`splitting_of_hermitian_prime_power`

— Method`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
```

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

`splitting_of_prime_power`

— Method```
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
```

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

`splitting_of_pure_mixed_prime_power`

— Method```
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.

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

`splitting_of_mixed_prime_power`

— Method```
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
```

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

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.