Genera of Integer Lattices
Two $\mathbb{Z}$-lattices $M$ and $N$ are said to be in the same genus if their completions $M \otimes \mathbb{Z}_p$ and $N \otimes \mathbb{Z}_p$ are isometric for all prime numbers $p$ as well as $M \otimes \mathbb{R} \cong N\otimes \mathbb{R}$.
The genus of a $\mathbb{Z}$-lattice is encoded in its Conway-Sloane genus symbol. The genus symbol itself is a collection of its local genus symbols. See [CS99] Chapter 15 for the definitions. Note that genera for non-integral lattices are supported.
The class ZZGenus supports genera of $\mathbb{Z}$-lattices.
Creation of Genera
From an integral Lattice
From a gram matrix
Enumeration of genus symbols
integer_genera — Method
integer_genera(sig_pair::Vector{Int}, determinant::RationalUnion;
min_scale::RationalUnion = min(one(QQ), QQ(abs(determinant))),
max_scale::RationalUnion = max(one(QQ), QQ(abs(determinant))),
even=false) -> Vector{ZZGenus}Return a list of all genera with the given conditions. Genera of non-integral $\mathbb Z$-lattices are also supported.
Arguments
sig_pair: a pair of non-negative integers giving the signaturedeterminant: a rational number; the sign is ignoredmin_scale: a rational number; return only genera whose scale is an integer multiple ofmin_scale(default:min(one(QQ), QQ(abs(determinant))))max_scale: a rational number; return only genera such thatmax_scaleis an integer multiple of the scale (default:max(one(QQ), QQ(abs(determinant))))even: boolean; if set to true, return only the even genera (default:false)
From other genus symbols
direct_sum — Method
direct_sum(G1::ZZGenus, G2::ZZGenus) -> ZZGenusReturn the genus of the direct sum of G1 and G2.
The direct sum is defined via representatives.
Attributes of the genus
is_definite — Method
is_definite(G::ZZGenus) -> BoolReturn if this genus is definite.
is_integral — Method
is_integral(G::ZZGenus) -> BoolReturn whether G is a genus of integral $\mathbb Z$-lattices.
Discriminant group
Primary genera
is_primary_with_prime — Method
is_primary_with_prime(G::ZZGenus) -> Bool, ZZRingElemGiven a genus of $\mathbb Z$-lattices G, return whether it is primary, that is whether the bilinear form is integral and the associated discriminant form (see discriminant_group) is a p-group for some prime number p. In case it is, p is also returned as second output.
Note that for unimodular genera, this function returns (true, 1). If the genus is not primary, the second return value is -1 by default.
is_primary — Method
is_primary(G::ZZGenus, p::Union{Integer, ZZRingElem}) -> BoolGiven a genus of integral $\mathbb Z$-lattices G and a prime number p, return whether G is p-primary, that is whether the associated discriminant form (see discriminant_group) is a p-group.
is_elementary_with_prime — Method
is_elementary_with_prime(G::ZZGenus) -> Bool, ZZRingElemGiven a genus of $\mathbb Z$-lattices G, return whether it is elementary, that is whether the bilinear form is inegtral and the associated discriminant form (see discriminant_group) is an elementary p-group for some prime number p. In case it is, p is also returned as second output.
Note that for unimodular genera, this function returns (true, 1). If the genus is not elementary, the second return value is -1 by default.
is_elementary — Method
is_elementary(G::ZZGenus, p::Union{Integer, ZZRingElem}) -> BoolGiven a genus of integral $\mathbb Z$-lattices G and a prime number p, return whether G is p-elementary, that is whether its associated discriminant form (see discriminant_group) is an elementary p-group.
Local symbol
local_symbol — Method
local_symbol(G::ZZGenus, p) -> ZZLocalGenusReturn the local symbol at p.
Representative(s)
quadratic_space — Method
quadratic_space(G::ZZGenus) -> QuadSpace{QQField, QQMatrix}Return the quadratic space defined by this genus.
rational_representative — Method
rational_representative(G::ZZGenus) -> QuadSpace{QQField, QQMatrix}Return the quadratic space defined by this genus.
representative — Method
representative(G::ZZGenus) -> ZZLatCompute a representative of this genus && cache it.
representatives — Method
representatives(G::ZZGenus) -> Vector{ZZLat}Return a list of representatives of the isometry classes in this genus.
class_number — Method
class_number(G::ZZGenus) -> IntReturn the number of isometry classes of lattices in $G$.
Examples
julia> L = root_lattice(:E, 8);
julia> class_number(genus(L))
1Embeddings and Representations
represents — Method
represents(G1::ZZGenus, G2::ZZGenus) -> BoolReturn if G1 represents G2. That is if some element in the genus of G1 represents some element in the genus of G2.
Local genus Symbols
ZZLocalGenus — Type
ZZLocalGenusLocal genus symbol over a p-adic ring.
The genus symbol of a component p^m A for odd prime = p is of the form (m,n,d), where
m= valuation of the componentn= rank of Ad = det(A) \in \{1,u\}for a normalized quadratic non-residueu.
The genus symbol of a component 2^m A is of the form (m, n, s, d, o), where
m= valuation of the componentn= rank ofAd=det(A)in{1,3,5,7}s= 0 (or 1) if even (or odd)o= oddity ofA(= 0 if s = 0) inZ/8Z= the trace of the diagonalization ofA
The genus symbol is a list of such symbols (ordered by m) for each of the Jordan blocks A_1,...,A_t.
Reference: [CS99] Chapter 15, Section 7.
Arguments
prime: a prime numbersymbol: the list of invariants for Jordan blocksA_t,...,A_tgiven as a list of lists of integers
Creation
Attributes
hasse_invariant — Method
hasse_invariant(S::ZZLocalGenus) -> IntReturn the Hasse invariant of a representative. If the representative is diagonal (a1, ... , an) Then the Hasse invariant is
\[\prod_{i < j}(a_i, a_j)_p\]
.
Representative
representative — Method
representative(S::ZZLocalGenus) -> ZZLatReturn an integer lattice which represents this local genus.
gram_matrix — Method
gram_matrix(S::ZZLocalGenus) -> MatElemReturn a gram matrix of some representative of this local genus.
Direct sums
direct_sum — Method
direct_sum(S1::ZZLocalGenus, S2::ZZLocalGenus) -> ZZLocalGenusReturn the local genus of the direct sum of two representatives.
Embeddings/Representations
represents — Method
represents(g1::ZZLocalGenus, g2::ZZLocalGenus) -> BoolReturn whether g1 represents g2.
Based on O'Meara Integral Representations of Quadratic Forms Over Local Fields Note that for p == 2 there is a typo in O'Meara Theorem 3 (V). The correct statement is (V) $2^i(1+4\omega) \to \mathfrak{L}_{i+1}/\mathfrak{l}_{[i]}$.
Canonical symbols
canonical_symbol — Function
canonical_symbol(
G::ZZGenus;
with_signature::Bool=true,
odd_ones::Bool=true,
) -> StringReturn the canonical symbol for the genus of nondegenerate integer lattices G. See canonical_symbol(::ZZLocalGenus) for canonical symbols of local genera.
If with_signature is false, then the signature pair of G does not appear in the output.
If odd_ones is false, then the factor for the unimodular constituent at each odd prime do not appear in the output.
Examples
julia> G = first(integer_genera((5, 1), 4//3, min_scale = 1//18, max_scale = 12))
Genus symbol for integer lattices
Signatures: (5, 0, 1)
Local symbols:
Local genus symbol at 2: (1/2)^1_1 1^2 2^-3_5
Local genus symbol at 3: (1/9)^-1 (1/3)^-1 1^2 3^-2
julia> canonical_symbol(G)
"{(5, 1)}{1/2}^{-1}_{5}{1}^{2}_{II}{2}^{3}_{1}{1/9}^{-1}{1/3}^{-1}{1}^{2}{3}^{-2}"
julia> canonical_symbol(G; with_signature=false, odd_ones=false)
"{1/2}^{-1}_{5}{1}^{2}_{II}{2}^{3}_{1}{1/9}^{-1}{1/3}^{-1}{3}^{-2}"canonical_symbol(g::ZZLocalGenus; odd_ones::Bool=true) -> StringReturn the canonical symbol for the genus of $p$-adic lattices defined by g. The ouput is given in the form of a string.
If $p$ is odd, the symbol is uniquely determined by the invariants of g.
If $p == 2$, then we use the Conway–Sloane canonicalization procedure following [AGM20]
If $p$ is odd and odd_ones is false, then the output does not contain the factor for the unimodular constituent in g.
Examples
julia> g = first(Hecke._local_genera(ZZ(2), 7, 6, 0, 4, false))
Local genus symbol for integer lattices
Prime: 2
Jordan blocks (val, rank, det, sign, oddity):
(0, 4, 7, 1, 2)
(1, 2, 3, 1, 4)
(4, 1, 1, 1, 1)
julia> canonical_symbol(g)
"[{1}^{-4}{2}^{2}]_{2}{16}^{1}_{1}"