# 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 J. H. Conway, N. J. A. Sloane (1999) 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.

## Creation of Genera

### From an integral Lattice

`genus`

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

Return the genus of the lattice `L`

.

### From a gram matrix

`genus`

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

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

.

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

)

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

## Attributes of the genus

`dim`

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

Return the dimension of this genus.

`rank`

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

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

.

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

`det`

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

Return the determinant of this genus.

`iseven`

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

Return if this genus is even.

`is_definite`

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

Return if this genus is definite.

`level`

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

Return the level of this genus.

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

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

.

`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\}$.

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

`is_integral`

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

Return 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, 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.

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

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

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

### local Symbol

`local_symbol`

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

Return 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) -> ZZLat`

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

`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)|}$.

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

.

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

.

## Local genus Symbols

`LocalZZGenus`

— Type`LocalZZGenus`

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: J. H. Conway, N. J. A. Sloane (1999) 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

### Creation

`genus`

— Method`genus(L::ZZLat, p) -> LocalZZGenus`

Return the local genus symbol of `L`

at the prime `p`

.

`genus`

— Method`genus(A::MatElem, p) -> LocalZZGenus`

Return the local genus symbol of a Z-lattice with gram matrix `A`

at the prime `p`

.

### Attributes

`prime`

— Method`prime(S::LocalZZGenus) -> ZZRingElem`

Return the prime `p`

of this `p`

-adic genus.

`iseven`

— Method`iseven(S::LocalZZGenus) -> Bool`

Return if the underlying `p`

-adic lattice is even.

If `p`

is odd, every lattice is even.

`symbol`

— Method`symbol(S::LocalZZGenus, scale::Int) -> Vector{Int}`

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

`hasse_invariant`

— Method`hasse_invariant(S::LocalZZGenus) -> Int`

Return the Hasse invariant of a representative. If the representative is diagonal (a*1, ... , a*n) Then the Hasse invariant is

\[\prod_{i < j}(a_i, a_j)_p\]

.

`det`

— Method`det(S::LocalZZGenus) -> QQFieldElem`

Return an rational representing the determinant of this genus.

`dim`

— Method`dim(S::LocalZZGenus) -> Int`

Return the dimension of this genus.

`rank`

— Method`rank(S::LocalZZGenus) -> Int`

Return the rank of (a representative of) `S`

.

`excess`

— Method`excess(S::LocalZZGenus) -> 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**

J. H. Conway, N. J. A. Sloane (1999) pp 370-371.

`signature`

— Method`signature(S::LocalZZGenus) -> zzModRingElem`

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

`oddity`

— Method`oddity(S::LocalZZGenus) -> zzModRingElem`

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

`scale`

— Method`scale(S::LocalZZGenus) -> 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)`

.

`norm`

— Method`norm(S::LocalZZGenus) -> 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\}$.

`level`

— Method`level(S::LocalZZGenus) -> QQFieldElem`

Return the maximal scale of a jordan component.

### Representative

`representative`

— Method`representative(S::LocalZZGenus) -> ZZLat`

Return an integer lattice which represents this local genus.

`gram_matrix`

— Method`gram_matrix(S::LocalZZGenus) -> MatElem`

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

`rescale`

— Method`rescale(G::LocalZZGenus, a::RationalUnion) -> LocalZZGenus`

Given a local genus symbol `G`

of $\mathbb Z$-lattices, return the local genus symbol of any representative of `G`

rescaled by `a`

.

### Direct sums

`direct_sum`

— Method`direct_sum(S1::LocalZZGenus, S2::LocalZZGenus) -> LocalZZGenus`

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

### Embeddings/Representations

`represents`

— Method`represents(g1::LocalZZGenus, g2::LocalZZGenus) -> 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]}$.