Nikulin's theory on primitive embeddings

We introduce here the necessary definitions and results which lie behind the methods about primitive embeddings. Most of the content is taken from the first section of [Nik79]. This chapter only deals with nondegenerate $\mathbb{Z}$-lattices, which we simply call lattices.

Primitive embeddings

Given an embedding $i\colon M\hookrightarrow L$ of lattices, we call $i$ primitive if its cokernel $L/i(M)$ is torsionfree. There is a left action of the orthogonal group $O(L)$ and a right action of the orthogonal group $O(M)$ on the set of primitive embeddings as before. A problem which often arises is to determine representatives for the associated double cosets.

In [Nik79], Nikulin gives necessary and sufficient conditions for an even lattice $M$ to embed primitively into an even unimodular lattice with given invariants (see Theorem 1.12.2 in [Nik79]). More generally, the author also provides methods to compute primitive embeddings of any even lattice into an even lattice of a given genus (see Proposition 1.15.1 in [Nik79]). In this proposition, it is explained how to determine representatives for the double cosets of primitive embeddings as explained in the first paragraph. It turns out that Nikulin's approach generalizes to the following.

Let $M$ be an integral lattice and let $G$ be a genus of integral lattices. We denote by $L_1,\ldots, L_n$ a complete list of pairwise non-isometric lattices representing all the isometry classes in $G$. Let $O_M\subset O(M)$ be a subgroup of isometries, containing the kernel $O^\#(M)$ of the natural map $O(M) \to O(D_M)$, where $D_M$ denotes the discriminant group of $M$. Then, following Nikulin's theory on primitive embeddings, there exists an algorithm which returns a complete set of representatives for the double cosets

\[O(L)\backslash \{M\hookrightarrow L \text{ primitive embedding}\}/O_M\]

where $L$ runs over all the $L_i$'s.

Note

The lattice $M$ may not admit a primitive embedding in each of the $L_i$'s. In particular, if $G$ consists of more than one isometry class, Nikulin's approach does not allow to choose into which of the $L_i$'s the lattice $M$ embeds: This would require instead to filter the output using some isometry test. However, if $M$ embeds into one of the $L_i$'s, then any lattice in the same genus as $M$ also embeds primitively into some of the $L_j$'s (the nature of Nikulin's approach is local; global invariants such as $O(M)$ are only used for the classification purpose at hand).

Such an algorithm has been designed and implemented as part of this package, and it can be accessed via the following function.

primitive_embeddingsMethod
primitive_embeddings(
  G::ZZGenus,
  M::ZZLat;
  kwargs...,
) -> Bool, Vector{Tuple{ZZLat, ZZLat, ZZLat}}

Given a genus $G$ of integral $\mathbb Z$-lattice, and an integral $\mathbb Z$-lattice $M$, return a boolean T and a list $V$ of representatives of double cosets of primitive embeddings $M \hookrightarrow L$ where $L$ is a lattice in $G$, for the right and left actions of $O(M)$ and $O(L)$ respectively.

The second output $V$ consists of triples $(L, M_1, N)$ where $L$ is a lattice in $G$, $M_1$ is a primitive sublattice of $L$ isometric to $M$, and $N$ is the orthogonal complement of $M_1$ in $L$.

Alternatively, one can also choose as first input:

  • a lattice $L$ representing $G$: one would therefore call primitive_embeddings(L, M; kwargs...),
  • the discriminant form q and the signature pair (p, n) of $G$: one would therefore call primitive_embeddings(q, (p, n), M; kwargs...).
Warning

In the first alternative option above, if the genus $G$ consists of more than one isometry class of lattices, the algorithm also computes primitive embeddings of $M$ into some other lattices in $G$.

Here is a complete list of currently supported keyword arguments:

  • right_action::MatGroup{QQFieldElem, QQMatrix} -> replace the right action of $O(M)$ by a right action of the group generated by right_action and the kernel of $O(M) \to O(D_M)$.
  • right_discriminant_action::AutomorphismGroup{TorQuadModule} -> replace the right action of $O(M)$ by a right action of the largest subgroup whose discriminant representation surjects onto right_discriminant_action.
  • first::Bool -> if set to true, return the first primitive embedding computed.
  • exist_only::Bool -> if set to true, return only whether a primitive embedding exists together with an empty list.
  • check::Bool -> is set to true and the first input is a lattice $L_0$, the function filters the output to keep only triples $(L, M_1, N)$ such that $L$ is isometric to $L_0$.
Note

If right_action is provided by the user, then the algorithm assumes that the isometries are given by their matrix representation on the ambient quadratic space of $M$.

Warning

If right_discriminant_action is provided by the user, the algorithm assumes without checking it, that the given group lies in the image of $O(M) \to O(D_M)$.

Examples

We can use such primitive embeddings algorithm to classify embedding in unimodular lattices

julia> E8 = root_lattice(:E, 8);

julia> A4 = root_lattice(:A, 4);

julia> bool, pe = primitive_embeddings(E8, A4)
(true, Tuple{ZZLat, ZZLat, ZZLat}[(Integer lattice of rank 8 and degree 8, Integer lattice of rank 4 and degree 8, Integer lattice of rank 4 and degree 8)])

julia> pe
1-element Vector{Tuple{ZZLat, ZZLat, ZZLat}}:
 (Integer lattice of rank 8 and degree 8, Integer lattice of rank 4 and degree 8, Integer lattice of rank 4 and degree 8)

julia> genus(pe[1][2]) == genus(pe[1][3])
true

To be understood: There exists a unique class of primitive embedding of the root lattice $A_4$ into the root lattice $E_8$, and the orthogonal primitive sublattice is isometric to $A_4$.

source
Warning

The algorithm tends to be slow for large rank or determinant. This has to do with computations of orbits and stabilizers of subgroups in finite abelian groups.

The idea behind the algorithm is a generalization of the proof of Proposition 1.15.1 of [Nik79]. In order to embed $M$ primitively in a lattice $L$ in $G$, we construct a lattice $N$ which is unique in its genus, such that $D_N$ and $D_L(-1)$ are isometric (note that $D_L$ only depends on $G$) and such that $O(N)\to O(D_N)$ is surjective. We then classify primitive extensions of $M$ and $N$, up to the right action of $O_M$ and the left action of $O(N)$.

Primitive extensions

A primitive extension of a finite collection of lattices $\{M_i\}_{i=1,\ldots,n}$ is an overlattice $L$ of $\bigoplus_{i=1}^nM_i$ such that each $M_i$ is primitive in $L$. Given two integral lattices $M$ and $N$, their primitive extensions are in bijection with anti-isometries between subgroups of their respective discriminant groups. The corresponding overlattice is determined by the graph of such an anti-isometry, also known as a glue map.

In Proposition 1.5.1 of [Nik79], Nikulin describes the basis for an algorithm which answers to the following problem. Given $M$ and $N$ two integral lattices and given $O^\#(M)\subset O_M\subset O(M)$ and $O^\#(N)\subset O_N\subset O(N)$ subgroups of isometries, return a complete set of representatives for the double cosets in

\[O_N\backslash \{M\oplus N\subset L \text{ primitive extension}\}/O_M.\]

Note

As in the case of primitive embeddings, since Nikulin's approach focuses on working with the discriminant groups of lattices involved, all of the classifications are up to the actions of the group of isometries acting trivially on said discriminant groups. Therefore, in order to make sense, we need to add the action of such groups to the problems.

An algorithm answering to the previous problem, based on Nikulin's work, is available via the following function.

primitive_extensionsMethod
primitive_extensions(
  M::ZZLat,
  N::ZZLat;
  kwargs...,
) -> Bool, Vector{Tuple{ZZLat, ZZLat, ZZLat}}

Given two integral $\mathbb Z$-lattices $M$ and $N$, return a boolean T and a list $V$ of representatives of double cosets of primitive extensions $M \oplus N \subseteq L$, for the right and left actions of $O(M)$ and $O(N)$ respectively.

Here is a complete list of currently supported keyword arguments:

  • right_action::MatGroup{QQFieldElem, QQMatrix} -> replace the right action of $O(M)$ by a right action of the group generated by right_action and the kernel of $O(M) \to O(D_M)$.
  • left_action::MatGroup{QQFieldElem, QQMatrix} -> replace the left action of $O(N)$ by a left action of the group generated by left_action and the kernel of $O(N) \to O(D_N)$.
  • right_discriminant_action::AutomorphismGroup{TorQuadModule} -> replace the right action of $O(M)$ by a right action of the largest subgroup whose discriminant representation surjects onto right_discriminant_action.
  • left_discriminant_action::AutomorphismGroup{TorQuadModule} -> replace the left action of $O(N)$ by a left action of the largest subgroup whose discriminant representation surjects onto left_discriminant_action.
  • first::Bool -> if set to true, return the first primitive extension computed.
  • exist_only::Bool -> if set to true, return only whether a primitive extension exists together with an empty list.
  • glue_order::AbstractVector{IntegerUnion} -> provide a list of possible orders for the glue groups associated to each primitive extension in output. If no such list is provided, then the algorithm assumes no restriction.
  • form_over::Vector{TorQuadModule} -> provide a list of possible discriminant groups for the primitive extensions in output. If no such list is provided, then the algorithm assumes no restriction.
  • even::Bool -> if set to true, return only even primitive extensions.
Note

If right_action is provided by the user, then the algorithm assumes that the isometries are given by their matrix representation on the ambient quadratic space of $M$. Similarly for left_action.

Warning

If right_discriminant_action is provided by the user, then the algorithm assumes without checking it, that the given group lies in the image of $O(M) \to O(D_M)$. Similarly for left_discriminant_action.

source

Equivariant primitive extensions

An equivariant primitive extension of a finite family of pairs of lattices with isometry $\{(M_i, f_i)\}_{i=1,\ldots,n}$ is a primitive extension $L$ of $\{M_i\}_{i=1,\ldots,n}$ preserved by the diagonal action of the $f_i$'s. Given two pairs $(M, f_M)$ and $(N, f_N)$ where $M$ and $N$ are integral, their equivariant primitive extensions are in bijection with glue maps $\gamma$ between subgroups $H_M\leq D_M$ and $H_N\leq D_N$ which are stable under the respective actions of $f_M$ and $f_N$, and for which the following holds:

\[\gamma\circ D_{f_M}|_{H_M} = D_{f_N}|_{H_N}\circ \gamma.\]

In fact, given any such glue map, the corresponding overlattice $L$ of $M\oplus N$ is equipped with an isometry $f_L$ which preserves both $M$ and $N$, and restricts to $f_M$ and $f_N$ respectively.

Similarly to plain primitive extensions, the work of Nikulin provides all the ingredients to build an algorithm which computes representatives for all double cosets of equivariant primitive extensions, for given group actions. Note that we can actually go a bit further.

If we are given an integral lattice with isometry $(M, f_M)$ and a definite integral lattice $N$, one can as well classify primitive extensions $L$ of $M$ and $N$ which are equipped with an isometry $f_L$ preserving $M$ and whose restriction to $M$ is conjugate to $f_M$. This requires an extra step: Once a representative $L$ of a double coset of primitive extensions is computed, the algorithm computes representatives for conjugacy classes of isometries of $N$ (hence requiring $N$ to be definite) which can be extended by $f_M$ to an isometry of $L$.

The two problems described above can be solved by calling the following function.

equivariant_primitive_extensionsMethod
equivariant_primitive_extensions(
  M::Union{ZZLat, ZZLatWithIsom},
  N::Union{ZZLat, ZZLatWithIsom};
  kwargs...,
) -> Bool, Vector{Tuple{ZZLatWithIsom, ZZLatWithIsom, ZZLatWithIsom}}

Given two integral $\mathbb Z$-lattices with isometry $(M, f_M)$ and $(N, f_N)$, return a boolean T and a list $V$ of representatives of double cosets of equivariant primitive extensions $(M, f_M) \oplus (N, f_N) \subset (L, f_L)$, for the right and left actions of $O(M, f_M)$ and $O(N, f_N)$ respectively.

Alternatively, one can choose exactly one of the two inputs to be an integral $\mathbb Z$-lattice without isometry. In that situation, such a lattice must be definite and for each possible primitive extension, the algorithm computes representatives for the conjugacy classes of isometries which can be extended with the other fixed isometry along the primitive extension.

Here is a complete list of currently supported keyword arguments:

  • right_action::MatGroup{QQFieldElem, QQMatrix} -> replace the right action of $O(M, f_M)$ by a right action of the centralizer of $f_M$ in the group generated by right_action and the kernel of $O(M) \to O(D_M)$.
  • left_action::MatGroup{QQFieldElem, QQMatrix} -> replace the left action of $O(N, f_N)$ by a left action of the centralizer of $f_N$ in the group generated by left_action and the kernel of $O(N) \to O(D_N)$.
  • right_discriminant_action::AutomorphismGroup{TorQuadModule} -> replace the right action of $O(M, f_M)$ by a right action of the largest subgroup whose discriminant representation surjects onto right_discriminant_action.
  • left_discriminant_action::AutomorphismGroup{TorQuadModule} -> replace the left action of $O(N, f_N)$ by a left action of the largest subgroup whose discriminant representation surjects onto left_discriminant_action.
  • first::Bool -> if set to true, return the first equivariant primitive extension computed.
  • exist_only::Bool -> if set to true, return only whether an equivariant primitive extension exists together with an empty list.
  • glue_order::AbstractVector{IntegerUnion} -> provide a list of possible orders for the glue groups associated to each primitive extension in output. If no such list is provided, then the algorithm assumes no restriction.
  • form_over::Vector{TorQuadModule} -> provide a list of possible discriminant groups for the primitive extensions in output. If no such list is provided, then the algorithm assumes no restriction.
  • even::Bool -> if set to true, return only even primitive extensions.
  • compute_bar_Gf::Bool -> if set to true, compute the image of the map $O(L, f_L) \to O(D_L)$ for every equivariant primitive extension $(L, f_L)$ in output. This can be computed directly at the level of gluings.
  • first_fitting_isometry::Bool -> if set to true and one of the lattices in input is not equipped with an isometry, the algorithm computes only one possible isometry to be extended along every primitive extensions.
Note

If right_action is provided by the user, then the algorithm assumes that the isometries are given by their matrix representation on the ambient quadratic space of $M$. Similarly for left_action.

Warning

If right_discriminant_action is provided by the user, the algorithm assumes without checking it, that the given group lies in the image of $O(M, f_M) \to O(D_M)$. Similarly for left_discriminant_action.

source

Admissible equivariant primitive extensions

The following function is a major tool provided by [BH23]. Given a triple of even lattices with isometry $((A, a), (B, b), (C, c))$ and two prime numbers $p$ and $q$ (possibly equal), if $(A, B, C)$ is $p$-admissible, this function returns representatives of isomorphism classes of equivariant primitive extensions $(A, a)\oplus (B, b)\to (D, d)$ such that the type of $(D, d^q)$ is equal to the type of $(C, c)$ (see type(::ZZLatWithIsom)).

admissible_equivariant_primitive_extensionsMethod
admissible_equivariant_primitive_extensions(
  Afa::ZZLatWithIsom,
  Bfb::ZZLatWithIsom,
  Cfc::ZZLatWithIsom,
  p::IntegerUnion,
  q::IntegerUnion = p;
  check::Bool=true,
  test_type::Bool=true,
) -> Vector{ZZLatWithIsom}

Given a triple of lattices with isometry $(A, f_A)$, $(B, f_B)$ and $(C, f_C)$, and a prime number $p$, such that $(A, B, C)$ is $p$-admissible, return a set of representatives of the double coset $G_B\backslash S/G_A$ where:

  • $G_A$ and $G_B$ are the respective images of the morphisms $O(A, f_A) \to O(D_A, D_{f_A})$ and $O(B, f_B) \to O(D_B, D_{f_B})$;
  • $S$ is the set of all primitive extensions $A \oplus B \subseteq C'$ with isometry $f_C'$ where $p\cdot C' \subseteq A\oplus B$ and such that the type of $(C', (f_C')^q)$ is equal to the type of $(C, f_C)$.

If check == true the input triple is checked to a $p$-admissible triple of even lattices (with isometry) with $f_A$ and $f_B$ having relatively coprime irreducible minimal polynomials. Moreover, the function checks that $A$ and $B$ are orthogonal if $A$, $B$ and $C$ lie in the same ambient quadratic space.

Note moreover that the function computes the image of the natural map $O(C, f_C) \to O(D_C, D_{f_C})$ along the primitive extension $A\oplus B\subseteq C$ (see Algorithm 2, Line 22 of [BH23]).

If one sets test_type to false, then the function does not check if the outputs satisfy the type condition.

source