Skip to content

Genera for hermitian lattices

Local genus symbols

Definition 8.3.1 ([Kir16]) Let L be a hermitian lattice over E/K and let p be a prime ideal of OK. Let P be the largest ideal of OE over p being invariant under the involution of E. We suppose that we are given a Jordan decomposition

Lp=i=1tLi

where the Jordan block Li is Psi-modular for 1it, for a strictly increasing sequence of integers s1<<st. In particular, s(Li)=Psi. Then, the local genus symbol g(L,p) of Lp is defined to be:

  • if p is good, i.e. non ramified and non dyadic,
g(L,p):=[(s1,r1,d1),,(st,rt,dt)]

where di=1 if the determinant (resp. discriminant) of Li is a norm in Kp×, and di=1 otherwise, and ri:=rank(Li) for all i;

  • if p is bad,
g(L,p):=[(s1,r1,d1,n1),,(st,rt,dt,nt)]

where for all i, ni:=ordp(n(Li))

Note that we define the scale and the norm of the lattice Li (1in) defined over the extension of local fields EP/Kp similarly to the ones of L, by extending by continuity the sesquilinear form of the ambient space of L to the completion. Regarding the determinant (resp. discriminant), it is defined as the determinant of the Gram matrix associated to a basis of Li relatively to the extension of the sesquilinear form (resp. (1)(m(m1)/2 times the determinant, where m is the rank of Li).

We call any tuple in g:=g(L,p)=[g1,,gt] a Jordan block of g since it corresponds to invariants of a Jordan block of the completion of the lattice L at p. For any such block gi, we call respectively si,ri,di,ni the scale, the rank, the determinant class (resp. discriminant class) and the norm of gi. Note that the norm is necessary only when the prime ideal is bad.

We say that two hermitian lattices L and L over E/K are in the same local genus at p if g(L,p)=g(L,p).

Creation of local genus symbols

There are two ways of creating a local genus symbol for hermitian lattices:

  • either abstractly, by choosing the extension E/K, the prime ideal p of OK, the Jordan blocks data and the type of the di's (either determinant class :det or discriminant class :disc);
julia
   genus(HermLat, E::NumField, p::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, data::Vector; type::Symbol = :det,
                                                          check::Bool = false)
                                                             -> HermLocalGenus
  • or by constructing the local genus symbol of the completion of a hermitian lattice L over E/K at a prime ideal p of OK.
julia
   genus(L::HermLat, p::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> HermLocalGenus

Examples

We will construct two examples for the rest of this section. Note that the prime chosen here is bad.

julia

julia> Qx, x = QQ["x"];

julia> K, a = number_field(x^2 - 2, "a");

julia> Kt, t  = K["t"];

julia> E, b = number_field(t^2 - a, "b");

julia> OK = maximal_order(K);

julia> p = prime_decomposition(OK, 2)[1][1];

julia> g1 = genus(HermLat, E, p, [(0, 1, 1, 0), (2, 2, -1, 1)], type = :det)
Local genus symbol for hermitian lattices
  over relative maximal order of Relative number field of degree 2 over number field
  with pseudo-basis
  (1, 1//1 * <1, 1>)
  (b, 1//1 * <1, 1>)
Prime ideal: <2, a>
Jordan blocks (scale, rank, det, norm):
  (0, 1, +, 0)
  (2, 2, -, 1)

julia> D = matrix(E, 3, 3, [5//2*a - 4, 0, 0, 0, a, a, 0, a, -4*a + 8]);

julia> gens = Vector{Hecke.RelSimpleNumFieldElem{AbsSimpleNumFieldElem}}[map(E, [1, 0, 0]), map(E, [a, 0, 0]), map(E, [b, 0, 0]), map(E, [a*b, 0, 0]), map(E, [0, 1, 0]), map(E, [0, a, 0]), map(E, [0, b, 0]), map(E, [0, a*b, 0]), map(E, [0, 0, 1]), map(E, [0, 0, a]), map(E, [0, 0, b]), map(E, [0, 0, a*b])];

julia> L = hermitian_lattice(E, gens, gram = D);

julia> g2 = genus(L, p)
Local genus symbol for hermitian lattices
  over relative maximal order of Relative number field of degree 2 over number field
  with pseudo-basis
  (1, 1//1 * <1, 1>)
  (b, 1//1 * <1, 1>)
Prime ideal: <2, a>
Jordan blocks (scale, rank, det, norm):
  (-2, 1, +, -1)
  (2, 2, +, 1)

Attributes

# lengthMethod.
julia
length(g::HermLocalGenus) -> Int

Given a local genus symbol g for hermitian lattices, return the number of Jordan blocks of g.

source


# base_fieldMethod.
julia
base_field(g::HermLocalGenus) -> NumField

Given a local genus symbol g for hermitian lattices over E/K, return E.

source


# primeMethod.
julia
prime(g::HermLocalGenus) -> AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}

Given a local genus symbol g for hermitian lattices over E/K at a prime ideal p of OK, return p.

source


Examples

julia

julia> Qx, x = QQ["x"];

julia> K, a = number_field(x^2 - 2, "a");

julia> Kt, t  = K["t"];

julia> E, b = number_field(t^2 - a, "b");

julia> OK = maximal_order(K);

julia> p = prime_decomposition(OK, 2)[1][1];

julia> g1 = genus(HermLat, E, p, [(0, 1, 1, 0), (2, 2, -1, 1)], type = :det);

julia> length(g1)
2

julia> base_field(g1)
Relative number field with defining polynomial t^2 - a
  over number field with defining polynomial x^2 - 2
    over rational field

julia> prime(g1)
<2, a>
Norm: 2
Minimum: 2
basis_matrix
[2 0; 0 1]
two normal wrt: 2

Invariants

# scaleMethod.
julia
scale(g::HermLocalGenus, i::Int) -> Int

Given a local genus symbol g for hermitian lattices over E/K at a prime p of OK, return the P-valuation of the scale of the ith Jordan block of g, where P is a prime ideal of OE lying over p.

source


# scaleMethod.
julia
scale(g::HermLocalGenus) -> AbsSimpleNumFieldOrderFractionalIdeal

Given a local genus symbol g for hermitian lattices over E/K at a prime p of OK, return the scale of the Jordan block of minimum P-valuation, where P is a prime ideal of OE lying over p.

source


# scalesMethod.
julia
scales(g::HermLocalGenus) -> Vector{Int}

Given a local genus symbol g for hermitian lattices over E/K at a prime p of OK, return the P-valuation of the scales of the Jordan blocks of g, where P is a prime ideal of OE lying over p.

source


# rankMethod.
julia
rank(g::HermLocalGenus, i::Int) -> Int

Given a local genus symbol g for hermitian lattices, return the rank of the ith Jordan block of g.

source


# rankMethod.
julia
rank(g::HermLocalGenus) -> Int

Given a local genus symbol g for hermitian lattices over E/K at a prime ideal p of OK, return the rank of any hermitian lattice whose p-adic completion has local genus symbol g.

source


# ranksMethod.
julia
ranks(g::HermLocalGenus) -> Vector{Int}

Given a local genus symbol g for hermitian lattices, return the ranks of the Jordan blocks of g.

source


# detMethod.
julia
det(g::HermLocalGenus, i::Int) -> Int

Given a local genus symbol g for hermitian lattices over E/K, return the determinant of the ith Jordan block of g.

The returned value is 1 or 1 depending on whether the determinant is a local norm in K.

source


# detMethod.
julia
det(g::HermLocalGenus) -> Int

Given a local genus symbol g for hermitian lattices over E/K at a prime ideal p of OK, return the determinant of a hermitian lattice whose p-adic completion has local genus symbol g.

The returned value is 1 or 1 depending on whether the determinant is a local norm in K.

source


# detsMethod.
julia
dets(g::HermLocalGenus) -> Vector{Int}

Given a local genus symbol g for hermitian lattices over E/K, return the determinants of the Jordan blocks of g.

The returned values are 1 or 1 depending on whether the respective determinants are are local norms in K.

source


# discriminantMethod.
julia
discriminant(g::HermLocalGenus, i::Int) -> Int

Given a local genus symbol g for hermitian lattices over E/K, return the discriminant of the ith Jordan block of g.

The returned value is 1 or 1 depending on whether the discriminant is a local norm in K.

source


# discriminantMethod.
julia
discriminant(g::HermLocalGenus) -> Int

Given a local genus symbol g for hermitian lattices over E/K at a prime ideal p of OK, return the discriminant of a hermitian lattice whose p-adic completion has local genus symbol g.

The returned value is 1 or 1 depending on whether the discriminant is a local norm in K.

source


# normMethod.
julia
norm(g::HermLocalGenus, i::Int) -> Int

Given a local genus symbol g for hermitian lattices over E/K at a prime ideal p of OK, return the p-valuation of the norm of the ith Jordan block of g.

source


# normMethod.
julia
norm(g::HermLocalGenus) -> AbsSimpleNumFieldOrderFractionalIdeal

Return the norm of g, i.e. the norm of any of its representatives.

Given a local genus symbol g of hermitian lattices over E/K at a prime ideal p of OK, it norm is computed as the norm of the Jordan block of minimum p-valuation.

source


# normsMethod.
julia
norms(g::HermLocalGenus) -> Vector{Int}

Given a local genus symbol g for hermitian lattices over E/K at a prime ideal p of OK, return the p-valuations of the norms of the Jordan blocks of g.

source


Examples

julia

julia> Qx, x = QQ["x"];

julia> K, a = number_field(x^2 - 2, "a");

julia> Kt, t  = K["t"];

julia> E, b = number_field(t^2 - a, "b");

julia> OK = maximal_order(K);

julia> p = prime_decomposition(OK, 2)[1][1];

julia> D = matrix(E, 3, 3, [5//2*a - 4, 0, 0, 0, a, a, 0, a, -4*a + 8]);

julia> gens = Vector{Hecke.RelSimpleNumFieldElem{AbsSimpleNumFieldElem}}[map(E, [1, 0, 0]), map(E, [a, 0, 0]), map(E, [b, 0, 0]), map(E, [a*b, 0, 0]), map(E, [0, 1, 0]), map(E, [0, a, 0]), map(E, [0, b, 0]), map(E, [0, a*b, 0]), map(E, [0, 0, 1]), map(E, [0, 0, a]), map(E, [0, 0, b]), map(E, [0, 0, a*b])];

julia> L = hermitian_lattice(E, gens, gram = D);

julia> g2 = genus(L, p);

julia> scales(g2)
2-element Vector{Int64}:
 -2
  2

julia> ranks(g2)
2-element Vector{Int64}:
 1
 2

julia> dets(g2)
2-element Vector{Int64}:
 1
 1

julia> norms(g2)
2-element Vector{Int64}:
 -1
  1

julia> rank(g2), det(g2), discriminant(g2)
(3, 1, -1)

Predicates

# is_ramifiedMethod.
julia
is_ramified(g::HermLocalGenus) -> Bool

Given a local genus symbol g for hermitian lattices over E/K at a prime ideal p of OK, return whether p is ramified in OE.

source


# is_splitMethod.
julia
is_split(g::HermLocalGenus) -> Bool

Given a local genus symbol g for hermitian lattices over E/K at a prime ideal p of OK, return whether p is split in OE.

source


# is_inertMethod.
julia
is_inert(g::HermLocalGenus) -> Bool

Given a local genus symbol g for hermitian lattices over E/K at a prime ideal p of OK, return whether p is inert in OE.

source


# is_dyadicMethod.
julia
is_dyadic(g::HermLocalGenus) -> Bool

Given a local genus symbol g for hermitian lattices over E/K at a prime ideal p of OK, return whether p is dyadic.

source


Examples

julia

julia> Qx, x = QQ["x"];

julia> K, a = number_field(x^2 - 2, "a");

julia> Kt, t  = K["t"];

julia> E, b = number_field(t^2 - a, "b");

julia> OK = maximal_order(K);

julia> p = prime_decomposition(OK, 2)[1][1];

julia> g1 = genus(HermLat, E, p, [(0, 1, 1, 0), (2, 2, -1, 1)], type = :det);

julia> is_ramified(g1), is_split(g1), is_inert(g1), is_dyadic(g1)
(true, false, false, true)

Local uniformizer

# uniformizerMethod.
julia
uniformizer(g::HermLocalGenus) -> NumFieldElem

Given a local genus symbol g for hermitian lattices over E/K at a prime ideal p of OK, return a generator for the largest ideal of OE containing p and invariant under the action of the non-trivial involution of E.

source


Example

julia

julia> Qx, x = QQ["x"];

julia> K, a = number_field(x^2 - 2, "a");

julia> Kt, t  = K["t"];

julia> E, b = number_field(t^2 - a, "b");

julia> OK = maximal_order(K);

julia> p = prime_decomposition(OK, 2)[1][1];

julia> g1 = genus(HermLat, E, p, [(0, 1, 1, 0), (2, 2, -1, 1)], type = :det);

julia> uniformizer(g1)
-a

Determinant representatives

Let g be a local genus symbol for hermitian lattices. Its determinant class, or the determinant class of its Jordan blocks, are given by ±1, depending on whether the determinants are local norms or not. It is possible to get a representative of this determinant class in terms of powers of the uniformizer of g.

# det_representativeMethod.
julia
det_representative(g::HermLocalGenus, i::Int) -> NumFieldElem

Given a local genus symbol g for hermitian lattices over E/K, return a representative of the norm class of the determinant of the ith Jordan block of g in K×.

source


# det_representativeMethod.
julia
det_representative(g::HermLocalGenus) -> NumFieldElem

Given a local genus symbol g for hermitian lattices over E/K, return a representative of the norm class of the determinant of g in K×.

source


Examples

julia

julia> Qx, x = QQ["x"];

julia> K, a = number_field(x^2 - 2, "a");

julia> Kt, t  = K["t"];

julia> E, b = number_field(t^2 - a, "b");

julia> OK = maximal_order(K);

julia> p = prime_decomposition(OK, 2)[1][1];

julia> g1 = genus(HermLat, E, p, [(0, 1, 1, 0), (2, 2, -1, 1)], type = :det);

julia> det_representative(g1)
-8*a + 10

julia> det_representative(g1,2)
-8*a + 10

Gram matrices

# gram_matrixMethod.
julia
gram_matrix(g::HermLocalGenus, i::Int) -> MatElem

Given a local genus symbol g for hermitian lattices over E/K at a prime ideal p of OK, return a Gram matrix M of the ith Jordan block of g, with coefficients in E. M is such that any hermitian lattice over E/K with Gram matrix M satisfies that the local genus symbol of its completion at p is equal to the ith Jordan block of g.

source


# gram_matrixMethod.
julia
gram_matrix(g::HermLocalGenus) -> MatElem

Given a local genus symbol g for hermitian lattices over E/K at a prime ideal p of OK, return a Gram matrix M of g, with coefficients in E.M is such that any hermitian lattice over E/K with Gram matrix M satisfies that the local genus symbol of its completion at p is g.

source


Examples

julia

julia> Qx, x = QQ["x"];

julia> K, a = number_field(x^2 - 2, "a");

julia> Kt, t  = K["t"];

julia> E, b = number_field(t^2 - a, "b");

julia> OK = maximal_order(K);

julia> p = prime_decomposition(OK, 2)[1][1];

julia> D = matrix(E, 3, 3, [5//2*a - 4, 0, 0, 0, a, a, 0, a, -4*a + 8]);

julia> gens = Vector{Hecke.RelSimpleNumFieldElem{AbsSimpleNumFieldElem}}[map(E, [1, 0, 0]), map(E, [a, 0, 0]), map(E, [b, 0, 0]), map(E, [a*b, 0, 0]), map(E, [0, 1, 0]), map(E, [0, a, 0]), map(E, [0, b, 0]), map(E, [0, a*b, 0]), map(E, [0, 0, 1]), map(E, [0, 0, a]), map(E, [0, 0, b]), map(E, [0, 0, a*b])];

julia> L = hermitian_lattice(E, gens, gram = D);

julia> g2 = genus(L, p);

julia> gram_matrix(g2)
[-3//2*a + 4   0         0]
[          0   a         a]
[          0   a   4*a - 8]

julia> gram_matrix(g2,1)
[-3//2*a + 4]


Global genus symbols

Let L be a hermitian lattice over E/K. Let P(L) be the set of all prime ideals of OK which are bad (ramified or dyadic), which are dividing the scale of L or which are dividing the volume of L. Let S(E/K) be the set of real infinite places of K which split into complex places in E. We define the global genus symbol G(L) of L to be the datum consisting of the local genus symbols of L at each prime of P(L) and the signatures (i.e. the negative index of inertia) of the Gram matrix of the rational span of L at each place in S(E/K).

Note that prime ideals in P(L) which don't ramify correspond to those for which the corresponding completions of L are not unimodular.

We say that two lattice L and L over E/K are in the same genus, if G(L)=G(L).

Creation of global genus symbols

Similarly, there are two ways of constructing a global genus symbol for hermitian lattices:

  • either abstractly, by choosing the extension E/K, the set of local genus symbols S and the signatures signatures at the places in S(E/K). Note that this requires the given invariants to satisfy the product formula for Hilbert symbols.
julia
   genus(S::Vector{HermLocalGenus}, signatures) -> HermGenus

Here signatures can be a dictionary with keys the infinite places and values the corresponding signatures, or a collection of tuples of the type (::InfPlc, ::Int);

  • or by constructing the global genus symbol of a given hermitian lattice L.
julia
   genus(L::HermLat) -> HermGenus

Examples

As before, we will construct two different global genus symbols for hermitian lattices, which we will use for the rest of this section.

julia

julia> Qx, x = QQ["x"];

julia> K, a = number_field(x^2 - 2, "a");

julia> Kt, t  = K["t"];

julia> E, b = number_field(t^2 - a, "b");

julia> OK = maximal_order(K);

julia> p = prime_decomposition(OK, 2)[1][1];

julia> g1 = genus(HermLat, E, p, [(0, 1, 1, 0), (2, 2, -1, 1)], type = :det);

julia> infp = infinite_places(E)
3-element Vector{InfPlc{Hecke.RelSimpleNumField{AbsSimpleNumFieldElem}, RelSimpleNumFieldEmbedding{AbsSimpleNumFieldEmbedding, Hecke.RelSimpleNumField{AbsSimpleNumFieldElem}}}}:
 Infinite place corresponding to (Complex embedding corresponding to root -1.19 of relative number field)
 Infinite place corresponding to (Complex embedding corresponding to root 1.19 of relative number field)
 Infinite place corresponding to (Complex embedding corresponding to root 0.00 + 1.19 * i of relative number field)

julia> SEK = unique([r.base_field_place for r in infp if isreal(r.base_field_place) && !isreal(r)]);
ERROR: type InfPlc has no field base_field_place

julia> length(SEK)
ERROR: UndefVarError: `SEK` not defined

julia> G1 = genus([g1], [(SEK[1], 1)])
ERROR: UndefVarError: `SEK` not defined

julia> D = matrix(E, 3, 3, [5//2*a - 4, 0, 0, 0, a, a, 0, a, -4*a + 8]);

julia> gens = Vector{Hecke.RelSimpleNumFieldElem{AbsSimpleNumFieldElem}}[map(E, [1, 0, 0]), map(E, [a, 0, 0]), map(E, [b, 0, 0]), map(E, [a*b, 0, 0]), map(E, [0, 1, 0]), map(E, [0, a, 0]), map(E, [0, b, 0]), map(E, [0, a*b, 0]), map(E, [0, 0, 1]), map(E, [0, 0, a]), map(E, [0, 0, b]), map(E, [0, 0, a*b])];

julia> L = hermitian_lattice(E, gens, gram = D);

julia> G2 = genus(L)
Genus symbol for hermitian lattices
  over relative maximal order of Relative number field of degree 2 over number field
  with pseudo-basis
  (1, 1//1 * <1, 1>)
  (b, 1//1 * <1, 1>)
Signature:
  infinite place corresponding to (Complex embedding of number field) => 2
Local symbols:
  <2, a> => (-2, 1, +, -1)(2, 2, +, 1)
  <7, a + 4> => (0, 1, +)(1, 2, +)

Attributes

# base_fieldMethod.
julia
base_field(G::HermGenus) -> NumField

Given a global genus symbol G for hermitian lattices over E/K, return E.

source


# primesMethod.
julia
primes(G::HermGenus) -> Vector{AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}}

Given a global genus symbol G for hermitian lattices over E/K, return the list of prime ideals of OK at which G has a local genus symbol.

source


# signaturesMethod.
julia
signatures(G::HermGenus) -> Dict{InfPlc, Int}

Given a global genus symbol G for hermitian lattices over E/K, return the signatures at the infinite places of K. For each real place, it is given by the negative index of inertia of the Gram matrix of the rational span of a hermitian lattice whose global genus symbol is G.

The output is given as a dictionary with keys the infinite places of K and value the corresponding signatures.

source


# rankMethod.
julia
rank(G::HermGenus) -> Int

Return the rank of any hermitian lattice with global genus symbol G.

source


# is_integralMethod.
julia
is_integral(G::HermGenus) -> Bool

Return whether G defines a genus of integral hermitian lattices.

source


# local_symbolsMethod.
julia
local_symbols(G::HermGenus) -> Vector{HermLocalGenus}

Given a global genus symbol of hermitian lattices, return its associated local genus symbols.

source


# scaleMethod.
julia
scale(G::HermGenus) -> AbsSimpleNumFieldOrderFractionalIdeal

Return the scale ideal of any hermitian lattice with global genus symbol G.

source


# normMethod.
julia
norm(G::HermGenus) -> AbsSimpleNumFieldOrderFractionalIdeal

Return the norm ideal of any hermitian lattice with global genus symbol G.

source


Examples

julia

julia> Qx, x = QQ["x"];

julia> K, a = number_field(x^2 - 2, "a");

julia> Kt, t  = K["t"];

julia> E, b = number_field(t^2 - a, "b");

julia> OK = maximal_order(K);

julia> p = prime_decomposition(OK, 2)[1][1];

julia> D = matrix(E, 3, 3, [5//2*a - 4, 0, 0, 0, a, a, 0, a, -4*a + 8]);

julia> gens = Vector{Hecke.RelSimpleNumFieldElem{AbsSimpleNumFieldElem}}[map(E, [1, 0, 0]), map(E, [a, 0, 0]), map(E, [b, 0, 0]), map(E, [a*b, 0, 0]), map(E, [0, 1, 0]), map(E, [0, a, 0]), map(E, [0, b, 0]), map(E, [0, a*b, 0]), map(E, [0, 0, 1]), map(E, [0, 0, a]), map(E, [0, 0, b]), map(E, [0, 0, a*b])];

julia> L = hermitian_lattice(E, gens, gram = D);

julia> G2 = genus(L);

julia> base_field(G2)
Relative number field with defining polynomial t^2 - a
  over number field with defining polynomial x^2 - 2
    over rational field

julia> primes(G2)
2-element Vector{AbsSimpleNumFieldOrderIdeal}:
 <2, a>
Norm: 2
Minimum: 2
basis_matrix
[2 0; 0 1]
two normal wrt: 2
 <7, a + 4>
Norm: 7
Minimum: 7
basis_matrix
[7 0; 4 1]
two normal wrt: 7

julia> signatures(G2)
Dict{InfPlc{AbsSimpleNumField, AbsSimpleNumFieldEmbedding}, Int64} with 1 entry:
  Infinite place corresponding to (Complex embedding corresponding to -1.4=> 2

julia> rank(G2)
3

Mass

Definition 4.2.1 [Kir16] Let L be a hermitian lattice over E/K, and suppose that L is definite. In particular, the automorphism group of L is finite. Let L1,,Ln be a set of representatives of isometry classes in the genus of L. This means that if L is a lattice over E/K in the genus of L (i.e. they are in the same genus), then L is isometric to one of the Li's, and these representatives are pairwise non-isometric. Then we define the mass of the genus G(L) of L to be

mass(G(L)):=i=1n1#Aut(Li).

Note that since L is definite, any lattice in the genus of L is also definite, and the definition makes sense.

# massMethod.
julia
mass(L::HermLat) -> QQFieldElem

Given a definite hermitian lattice L, return the mass of its genus.

source


Example

julia

julia> Qx, x = polynomial_ring(FlintQQ, "x");

julia> f = x^2 - 2;

julia> K, a = number_field(f, "a", cached = false);

julia> Kt, t = polynomial_ring(K, "t");

julia> g = t^2 + 1;

julia> E, b = number_field(g, "b", cached = false);

julia> D = matrix(E, 3, 3, [1, 0, 0, 0, 1, 0, 0, 0, 1]);

julia> gens = Vector{Hecke.RelSimpleNumFieldElem{AbsSimpleNumFieldElem}}[map(E, [(-3*a + 7)*b + 3*a, (5//2*a - 1)*b - 3//2*a + 4, 0]), map(E, [(3004*a - 4197)*b - 3088*a + 4348, (-1047//2*a + 765)*b + 5313//2*a - 3780, (-a - 1)*b + 3*a - 1]), map(E, [(728381*a - 998259)*b + 3345554*a - 4653462, (-1507194*a + 2168244)*b - 1507194*a + 2168244, (-5917//2*a - 915)*b - 4331//2*a - 488])];

julia> L = hermitian_lattice(E, gens, gram = D);

julia> mass(L)
1//1024


Representatives of a genus

# representativeMethod.
julia
representative(g::HermLocalGenus) -> HermLat

Given a local genus symbol g for hermitian lattices over E/K at a prime ideal p of OK, return a hermitian lattice over E/K whose completion at p admits g as local genus symbol.

source


# inMethod.
julia
in(L::HermLat, g::HermLocalGenus) -> Bool

Return whether g and the local genus symbol of the completion of the hermitian lattice L at prime(g) agree. Note that L being in g requires both L and g to be defined over the same extension E/K.

source


# representativeMethod.
julia
representative(G::HermGenus) -> HermLat

Given a global genus symbol G for hermitian lattices over E/K, return a hermitian lattice over E/K which admits G as global genus symbol.

source


# inMethod.
julia
in(L::HermLat, G::HermGenus) -> Bool

Return whether G and the global genus symbol of the hermitian lattice L agree.

source


# representativesMethod.
julia
representatives(G::HermGenus) -> Vector{HermLat}

Given a global genus symbol G for hermitian lattices, return representatives for the isometry classes of hermitian lattices in G.

source


# genus_representativesMethod.
julia
genus_representatives(L::HermLat; max = inf, use_auto = true,
                                             use_mass = false)
                                                      -> Vector{HermLat}

Return representatives for the isometry classes in the genus of the hermitian lattice L. At most max representatives are returned.

If L is definite, the use of the automorphism group of L is enabled by default. It can be disabled by use_auto = false. In the case where L is indefinite, the entry use_auto has no effect. The computation of the mass can be enabled by use_mass = true.

source


Examples

julia

julia> Qx, x = QQ["x"];

julia> K, a = number_field(x^2 - 2, "a");

julia> Kt, t  = K["t"];

julia> E, b = number_field(t^2 - a, "b");

julia> OK = maximal_order(K);

julia> p = prime_decomposition(OK, 2)[1][1];

julia> g1 = genus(HermLat, E, p, [(0, 1, 1, 0), (2, 2, -1, 1)], type = :det);

julia> SEK = unique([restrict(r, K) for r in infinite_places(E) if isreal(restrict(r, K)) && !isreal(r)]);

julia> G1 = genus([g1], [(SEK[1], 1)]);

julia> L1 = representative(g1)
Hermitian lattice of rank 3 and degree 3
  over relative maximal order of Relative number field of degree 2 over number field
  with pseudo-basis
  (1, 1//1 * <1, 1>)
  (b, 1//1 * <1, 1>)

julia> L1 in g1
true

julia> L2 = representative(G1)
Hermitian lattice of rank 3 and degree 3
  over relative maximal order of Relative number field of degree 2 over number field
  with pseudo-basis
  (1, 1//1 * <1, 1>)
  (b, 1//1 * <1, 1>)

julia> L2 in G1, L2 in g1
(true, true)

julia> length(genus_representatives(L1))
1

julia> length(representatives(G1))
1

Sum of genera

# direct_sumMethod.
julia
direct_sum(g1::HermLocalGenus, g2::HermLocalGenus) -> HermLocalGenus

Given two local genus symbols g1 and g2 for hermitian lattices over E/K at the same prime ideal p of OK, return their direct sum. It corresponds to the local genus symbol of the p-adic completion of the direct sum of respective representatives of g1 and g2.

source


# direct_sumMethod.
julia
direct_sum(G1::HermGenus, G2::HermGenus) -> HermGenus

Given two global genus symbols G1 and G2 for hermitian lattices over E/K, return their direct sum. It corresponds to the global genus symbol of the direct sum of respective representatives of G1 and G2.

source


Examples

julia

julia> Qx, x = QQ["x"];

julia> K, a = number_field(x^2 - 2, "a");

julia> Kt, t  = K["t"];

julia> E, b = number_field(t^2 - a, "b");

julia> OK = maximal_order(K);

julia> p = prime_decomposition(OK, 2)[1][1];

julia> g1 = genus(HermLat, E, p, [(0, 1, 1, 0), (2, 2, -1, 1)], type = :det);

julia> SEK = unique([restrict(r, K) for r in infinite_places(E) if isreal(restrict(r, K)) && !isreal(r)]);

julia> G1 = genus([g1], [(SEK[1], 1)]);

julia> D = matrix(E, 3, 3, [5//2*a - 4, 0, 0, 0, a, a, 0, a, -4*a + 8]);

julia> gens = Vector{Hecke.RelSimpleNumFieldElem{AbsSimpleNumFieldElem}}[map(E, [1, 0, 0]), map(E, [a, 0, 0]), map(E, [b, 0, 0]), map(E, [a*b, 0, 0]), map(E, [0, 1, 0]), map(E, [0, a, 0]), map(E, [0, b, 0]), map(E, [0, a*b, 0]), map(E, [0, 0, 1]), map(E, [0, 0, a]), map(E, [0, 0, b]), map(E, [0, 0, a*b])];

julia> L = hermitian_lattice(E, gens, gram = D);

julia> g2 = genus(L, p);

julia> G2 = genus(L);

julia> direct_sum(g1, g2)
Local genus symbol for hermitian lattices
  over relative maximal order of Relative number field of degree 2 over number field
  with pseudo-basis
  (1, 1//1 * <1, 1>)
  (b, 1//1 * <1, 1>)
Prime ideal: <2, a>
Jordan blocks (scale, rank, det, norm):
  (-2, 1, +, -1)
  (0, 1, +, 0)
  (2, 4, -, 1)

julia> direct_sum(G1, G2)
Genus symbol for hermitian lattices
  over relative maximal order of Relative number field of degree 2 over number field
  with pseudo-basis
  (1, 1//1 * <1, 1>)
  (b, 1//1 * <1, 1>)
Signature:
  infinite place corresponding to (Complex embedding of number field) => 3
Local symbols:
  <2, a> => (-2, 1, +, -1)(0, 1, +, 0)(2, 4, -, 1)
  <7, a + 4> => (0, 4, +)(1, 2, +)

Enumeration of genera

# hermitian_local_generaMethod.
julia
hermitian_local_genera(E::NumField, p::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}, rank::Int,
                       det_val::Int, min_scale::Int, max_scale::Int)
                                                  -> Vector{HermLocalGenus}

Return all local genus symbols for hermitian lattices over the algebra E, with base field K, at the prime idealp of OK. Each of them has rank equal to rank, scale P-valuations bounded between min_scale and max_scale and determinant p-valuations equal to det_val, where P is a prime ideal of OE lying above p.

source


# hermitian_generaMethod.
julia
hermitian_genera(E::NumField, rank::Int,
                              signatures::Dict{InfPlc, Int},
                              determinant::Union{Hecke.RelNumFieldOrderIdeal, Hecke.RelNumFieldOrderFractionalIdeal};
                              min_scale::Union{Hecke.RelNumFieldOrderIdeal, Hecke.RelNumFieldOrderFractionalIdeal} = is_integral(determinant) ? inv(1*order(determinant)) : determinant,
                              max_scale::Union{Hecke.RelNumFieldOrderIdeal, Hecke.RelNumFieldOrderFractionalIdeal} = is_integral(determinant) ? determinant : inv(1*order(determinant)))
                                                                                                             -> Vector{HermGenus}

Return all global genus symbols for hermitian lattices over the algebraE with rank rank, signatures given by signatures, scale bounded by max_scale and determinant class equal to determinant.

If max_scale == nothing, it is set to be equal to determinant.

source


Examples

julia

julia> K, a = cyclotomic_real_subfield(8, "a");

julia> Kt, t = K["t"];

julia> E, b = number_field(t^2 - a * t + 1);

julia> p = prime_decomposition(maximal_order(K), 2)[1][1];

julia> hermitian_local_genera(E, p, 4, 2, 0, 4)
15-element Vector{HermLocalGenus{Hecke.RelSimpleNumField{AbsSimpleNumFieldElem}, AbsSimpleNumFieldOrderIdeal}}:
 Local genus symbol for hermitian lattices over the 2-adic integers
 Local genus symbol for hermitian lattices over the 2-adic integers
 Local genus symbol for hermitian lattices over the 2-adic integers
 Local genus symbol for hermitian lattices over the 2-adic integers
 Local genus symbol for hermitian lattices over the 2-adic integers
 Local genus symbol for hermitian lattices over the 2-adic integers
 Local genus symbol for hermitian lattices over the 2-adic integers
 Local genus symbol for hermitian lattices over the 2-adic integers
 Local genus symbol for hermitian lattices over the 2-adic integers
 Local genus symbol for hermitian lattices over the 2-adic integers
 Local genus symbol for hermitian lattices over the 2-adic integers
 Local genus symbol for hermitian lattices over the 2-adic integers
 Local genus symbol for hermitian lattices over the 2-adic integers
 Local genus symbol for hermitian lattices over the 2-adic integers
 Local genus symbol for hermitian lattices over the 2-adic integers

julia> SEK = unique([restrict(r, K) for r in infinite_places(E) if isreal(restrict(r, K)) && !isreal(r)]);

julia> hermitian_genera(E, 3, Dict(SEK[1] => 1, SEK[2] => 1), 30 * maximal_order(E))
6-element Vector{HermGenus{Hecke.RelSimpleNumField{AbsSimpleNumFieldElem}, AbsSimpleNumFieldOrderIdeal, HermLocalGenus{Hecke.RelSimpleNumField{AbsSimpleNumFieldElem}, AbsSimpleNumFieldOrderIdeal}, Dict{InfPlc{AbsSimpleNumField, AbsSimpleNumFieldEmbedding}, Int64}}}:
 Genus symbol for hermitian lattices of rank 3 over relative maximal order of Relative number field
with pseudo-basis
(1, 1//1 * <1, 1>)
(_$, 1//1 * <1, 1>)
 Genus symbol for hermitian lattices of rank 3 over relative maximal order of Relative number field
with pseudo-basis
(1, 1//1 * <1, 1>)
(_$, 1//1 * <1, 1>)
 Genus symbol for hermitian lattices of rank 3 over relative maximal order of Relative number field
with pseudo-basis
(1, 1//1 * <1, 1>)
(_$, 1//1 * <1, 1>)
 Genus symbol for hermitian lattices of rank 3 over relative maximal order of Relative number field
with pseudo-basis
(1, 1//1 * <1, 1>)
(_$, 1//1 * <1, 1>)
 Genus symbol for hermitian lattices of rank 3 over relative maximal order of Relative number field
with pseudo-basis
(1, 1//1 * <1, 1>)
(_$, 1//1 * <1, 1>)
 Genus symbol for hermitian lattices of rank 3 over relative maximal order of Relative number field
with pseudo-basis
(1, 1//1 * <1, 1>)
(_$, 1//1 * <1, 1>)

Rescaling

# rescaleMethod.
julia
rescale(g::HermLocalGenus, a::Union{FieldElem, RationalUnion})
                                                          -> HermLocalGenus

Given a local genus symbol G of hermitian lattices and an element a lying in the base field E of g, return the local genus symbol at the prime ideal p associated to g of any representative of g rescaled by a.

source


# rescaleMethod.
julia
rescale(G::HermGenus, a::Union{FieldElem, RationalUnion}) -> HermGenus

Given a global genus symbol G of hermitian lattices and an element a lying in the base field E of G, return the global genus symbol of any representative of G rescaled by a.

source