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.

ZZGenus — Type
ZZGenus

A collection of local genus symbols (at primes) and a signature pair. Together they represent the genus of a non-degenerate integer_lattice.

source

Creation of Genera

From an integral Lattice

genus — Method
genus(L::ZZLat) -> ZZGenus

Return the genus of the lattice L.

source

From a gram matrix

genus — Method
genus(A::MatElem) -> ZZGenus

Return the genus of a $\mathbb Z$-lattice with gram matrix A.

source

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 signature
  • determinant: a rational number; the sign is ignored
  • min_scale: a rational number; return only genera whose scale is an integer multiple of min_scale (default: min(one(QQ), QQ(abs(determinant))))
  • max_scale: a rational number; return only genera such that max_scale is 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)
source

From other genus symbols

direct_sum — Method
direct_sum(G1::ZZGenus, G2::ZZGenus) -> ZZGenus

Return the genus of the direct sum of G1 and G2.

The direct sum is defined via representatives.

source

Attributes of the genus

dim — Method
dim(G::ZZGenus) -> Int

Return the dimension of this genus.

source
rank — Method
rank(G::ZZGenus) -> Int

Return the rank of a (representative of) the genus G.

source
signature — Method
signature(G::ZZGenus) -> Int

Return the signature of this genus.

The signature is p - n where p is the number of positive eigenvalues and n the number of negative eigenvalues.

source
det — Method
det(G::ZZGenus) -> QQFieldElem

Return the determinant of this genus.

source
iseven — Method
iseven(G::ZZGenus) -> Bool

Return if this genus is even.

source
is_definite — Method
is_definite(G::ZZGenus) -> Bool

Return if this genus is definite.

source
level — Method
level(G::ZZGenus) -> QQFieldElem

Return the level of this genus.

This is the denominator of the inverse gram matrix of a representative.

source
scale — Method
scale(G::ZZGenus) -> QQFieldElem

Return the scale of this genus.

Let L be a lattice with bilinear form b. The scale of (L,b) is defined as the ideal b(L,L).

source
norm — Method
norm(G::ZZGenus) -> QQFieldElem

Return the norm of this genus.

Let L be a lattice with bilinear form b. The norm of (L,b) is defined as the ideal generated by $\{b(x,x) | x \in L\}$.

source
primes — Method
primes(G::ZZGenus) -> Vector{ZZRingElem}

Return the list of primes of the local symbols of G.

Note that 2 is always in the output since the 2-adic symbol of a ZZGenus is, by convention, always defined.

source
is_integral — Method
is_integral(G::ZZGenus) -> Bool

Return whether G is a genus of integral $\mathbb Z$-lattices.

source

Discriminant group

discriminant_group(::ZZGenus)

Primary genera

is_primary_with_prime — Method
is_primary_with_prime(G::ZZGenus) -> Bool, ZZRingElem

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

source
is_primary — Method
is_primary(G::ZZGenus, p::Union{Integer, ZZRingElem}) -> Bool

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

source
is_elementary_with_prime — Method
is_elementary_with_prime(G::ZZGenus) -> Bool, ZZRingElem

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

source
is_elementary — Method
is_elementary(G::ZZGenus, p::Union{Integer, ZZRingElem}) -> Bool

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

source

Local symbol

local_symbol — Method
local_symbol(G::ZZGenus, p) -> ZZLocalGenus

Return the local symbol at p.

source

Representative(s)

quadratic_space — Method
quadratic_space(G::ZZGenus) -> QuadSpace{QQField, QQMatrix}

Return the quadratic space defined by this genus.

source
rational_representative — Method
rational_representative(G::ZZGenus) -> QuadSpace{QQField, QQMatrix}

Return the quadratic space defined by this genus.

source
representative — Method
representative(G::ZZGenus) -> ZZLat

Compute a representative of this genus && cache it.

source
representatives — Method
representatives(G::ZZGenus) -> Vector{ZZLat}

Return a list of representatives of the isometry classes in this genus.

source
class_number — Method
class_number(G::ZZGenus) -> Int

Return the number of isometry classes of lattices in $G$.

Examples

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

julia> class_number(genus(L))
1
source
mass — Method
mass(G::ZZGenus) -> QQFieldElem

Return the mass of this genus.

The genus must be definite. Let L_1, ... L_n be a complete list of representatives of the isometry classes in this genus. Its mass is defined as $\sum_{i=1}^n \frac{1}{|O(L_i)|}$.

source
rescale — Method
rescale(G::ZZGenus, a::RationalUnion) -> ZZGenus

Given a genus symbol G of $\mathbb Z$-lattices, return the genus symbol of any representative of G rescaled by a.

source

Embeddings and Representations

represents — Method
represents(G1::ZZGenus, G2::ZZGenus) -> Bool

Return if G1 represents G2. That is if some element in the genus of G1 represents some element in the genus of G2.

source

Local genus Symbols

ZZLocalGenus — Type
ZZLocalGenus

Local 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 component
  • n = rank of A
  • d = det(A) \in \{1,u\} for a normalized quadratic non-residue u.

The genus symbol of a component 2^m A is of the form (m, n, s, d, o), where

  • m = valuation of the component
  • n = rank of A
  • d = det(A) in {1,3,5,7}
  • s = 0 (or 1) if even (or odd)
  • o = oddity of A (= 0 if s = 0) in Z/8Z = the trace of the diagonalization of A

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 number
  • symbol: the list of invariants for Jordan blocks A_t,...,A_t given as a list of lists of integers
source

Creation

genus — Method
genus(L::ZZLat, p::IntegerUnion) -> ZZLocalGenus

Return the local genus symbol of L at the prime p.

source
genus — Method
genus(A::QQMatrix, p::IntegerUnion) -> ZZLocalGenus

Return the local genus symbol of a Z-lattice with gram matrix A at the prime p.

source

Attributes

prime — Method
prime(S::ZZLocalGenus) -> ZZRingElem

Return the prime p of this p-adic genus.

source
iseven — Method
iseven(S::ZZLocalGenus) -> Bool

Return if the underlying p-adic lattice is even.

If p is odd, every lattice is even.

source
symbol — Method
symbol(S::ZZLocalGenus, scale::Int) -> Vector{Int}

Return the underlying lists of integers for the Jordan block of the given scale

source
hasse_invariant — Method
hasse_invariant(S::ZZLocalGenus) -> Int

Return 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\]

.

source
det — Method
det(S::ZZLocalGenus) -> QQFieldElem

Return an rational representing the determinant of this genus.

source
dim — Method
dim(S::ZZLocalGenus) -> Int

Return the dimension of this genus.

source
rank — Method
rank(S::ZZLocalGenus) -> Int

Return the rank of (a representative of) S.

source
excess — Method
excess(S::ZZLocalGenus) -> zzModRingElem

Return the p-excess of the quadratic form whose Hessian matrix is the symmetric matrix A.

When p = 2 the p-excess is called the oddity. The p-excess is always even && is divisible by 4 if p is congruent 1 mod 4.

Reference

[CS99] pp 370-371.

source
signature — Method
signature(S::ZZLocalGenus) -> zzModRingElem

Return the $p$-signature of this $p$-adic form.

source
oddity — Method
oddity(S::ZZLocalGenus) -> zzModRingElem

Return the oddity of this even form. The oddity is also called the $2$-signature

source
scale — Method
scale(S::ZZLocalGenus) -> QQFieldElem

Return the scale of this local genus.

Let L be a lattice with bilinear form b. The scale of (L,b) is defined as the ideal b(L,L).

source
norm — Method
norm(S::ZZLocalGenus) -> QQFieldElem

Return the norm of this local genus.

Let L be a lattice with bilinear form b. The norm of (L,b) is defined as the ideal generated by $\{b(x,x) | x \in L\}$.

source
level — Method
level(S::ZZLocalGenus) -> QQFieldElem

Return the maximal scale of a jordan component.

source

Representative

representative — Method
representative(S::ZZLocalGenus) -> ZZLat

Return an integer lattice which represents this local genus.

source
gram_matrix — Method
gram_matrix(S::ZZLocalGenus) -> MatElem

Return a gram matrix of some representative of this local genus.

source
rescale — Method
rescale(G::ZZLocalGenus, a::RationalUnion) -> ZZLocalGenus

Given a local genus symbol G of $\mathbb Z$-lattices, return the local genus symbol of any representative of G rescaled by a.

source

Direct sums

direct_sum — Method
direct_sum(S1::ZZLocalGenus, S2::ZZLocalGenus) -> ZZLocalGenus

Return the local genus of the direct sum of two representatives.

source

Embeddings/Representations

represents — Method
represents(g1::ZZLocalGenus, g2::ZZLocalGenus) -> Bool

Return 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]}$.

source

Canonical symbols

canonical_symbol — Function
canonical_symbol(
  G::ZZGenus;
  with_signature::Bool=true,
  odd_ones::Bool=true,
) -> String

Return 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}"
source
canonical_symbol(g::ZZLocalGenus; odd_ones::Bool=true) -> String

Return 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}"
source