# Enumeration of isometries

One of the main features of this project is the enumeration of lattices with isometry of finite order with at most two prime divisors. This is the content of Simon Brandhorst, Tommy Hofmann (2023) which has been implemented. We guide the user here to the global aspects of the available theory, and we refer to the paper Simon Brandhorst, Tommy Hofmann (2023) 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 certain cases, `C`

can be obtained as a primitive extension $A \perp 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 Simon Brandhorst, Tommy Hofmann (2023)).

We say that a triple `(AA, BB, CC)`

of genus symbols for integer lattices is *$p$-admissible* if there are some lattices $A \in AA$, $B \in BB$ and $C \in CC$ such that $(A, B, C)$ is $p$-admissible.

We use Definition 4.13. and Algorithm 1 of Simon Brandhorst, Tommy Hofmann (2023) 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) -> 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$.

**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)
```

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

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 Simon Brandhorst, Tommy Hofmann (2023).

### Global function

As we will see later, the algorithms from Simon Brandhorst, Tommy Hofmann (2023) 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 integral 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 integral 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.

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 Simon Brandhorst, Tommy Hofmann (2023) used previously to enumerate lattices with isometry:

`representatives_of_hermitian_type`

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

Given a lattice with isometry $(L, f)$ of 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 of hermitian type $(M, g)$ and such that the type of $(B, 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
```

`splitting_of_hermitian_prime_power`

— Method`splitting_of_hermitian_prime_power(Lf::ZZLatWithIsom, p::Int) -> Vector{ZZLatWithIsom}`

Given a 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
```

`splitting_of_prime_power`

— Method```
splitting_of_prime_power(Lf::ZZLatWithIsom, p::Int, b::Int = 0)
-> Vector{ZZLatWithIsom}
```

Given a 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`

is of 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
```

`splitting_of_pure_mixed_prime_power`

— Method```
splitting_of_pure_mixed_prime_power(Lf::ZZLatWithIsom, p::Int)
-> Vector{ZZLatWithIsom}
```

Given a 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.

`splitting_of_mixed_prime_power`

— Method```
splitting_of_mixed_prime_power(Lf::ZZLatWithIsom, p::Int, b::Int = 1)
-> Vector{ZZLatWithIsom}
```

Given a lattice with isometry $(L, f)$ and a prime number `p`

such that `f`

is of 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`

is of order $p^{d+1}q^e$.

Note that `d`

and `e`

can be both zero.

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

Note that an important feature from the theory in Simon Brandhorst, Tommy Hofmann (2023) 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_extension`

(Algorithm 2 in Simon Brandhorst, Tommy Hofmann (2023)) which is the major tool making the previous enumeration possible and fast, from an algorithmic point of view.