CurrentModule = Hecke
DocTestSetup = quote
using Hecke
end
Definition 8.3.1 ([Kir16])
Let
where the Jordan block
- if
$\mathfrak p$ is good, i.e. non ramified and non dyadic,
where
- if
$\mathfrak p$ is bad,
where for all i,
Note that we define the scale and the norm of the lattice
We call any tuple in
We say that two hermitian lattices
There are two ways of creating a local genus symbol for hermitian lattices:
- either abstractly, by choosing the extension
$E/K$ , the prime ideal$\mathfrak p$ of$\mathcal O_K$ , the Jordan blocksdata
and the type of the$d_i$ 's (either determinant class:det
or discriminant class:disc
);
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$\mathfrak p$ of$\mathcal O_K$ .
genus(L::HermLat, p::AbsNumFieldOrderIdeal{AbsSimpleNumField, AbsSimpleNumFieldElem}) -> HermLocalGenus
We will construct two examples for the rest of this section. Note that the prime chosen here is bad.
using Hecke # hide
Qx, x = QQ["x"];
K, a = number_field(x^2 - 2, "a");
Kt, t = K["t"];
E, b = number_field(t^2 - a, "b");
OK = maximal_order(K);
p = prime_decomposition(OK, 2)[1][1];
g1 = genus(HermLat, E, p, [(0, 1, 1, 0), (2, 2, -1, 1)], type = :det)
D = matrix(E, 3, 3, [5//2*a - 4, 0, 0, 0, a, a, 0, a, -4*a + 8]);
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])];
L = hermitian_lattice(E, gens, gram = D);
g2 = genus(L, p)
length(::HermLocalGenus)
base_field(::HermLocalGenus)
prime(::HermLocalGenus)
using Hecke # hide
Qx, x = QQ["x"];
K, a = number_field(x^2 - 2, "a");
Kt, t = K["t"];
E, b = number_field(t^2 - a, "b");
OK = maximal_order(K);
p = prime_decomposition(OK, 2)[1][1];
g1 = genus(HermLat, E, p, [(0, 1, 1, 0), (2, 2, -1, 1)], type = :det);
length(g1)
base_field(g1)
prime(g1)
scale(::HermLocalGenus, ::Int)
scale(::HermLocalGenus)
scales(::HermLocalGenus)
rank(::HermLocalGenus, ::Int)
rank(::HermLocalGenus)
ranks(::HermLocalGenus)
det(::HermLocalGenus, ::Int)
det(::HermLocalGenus)
dets(::HermLocalGenus)
discriminant(::HermLocalGenus, ::Int)
discriminant(::HermLocalGenus)
norm(::HermLocalGenus, ::Int)
norm(::HermLocalGenus)
norms(::HermLocalGenus)
using Hecke # hide
Qx, x = QQ["x"];
K, a = number_field(x^2 - 2, "a");
Kt, t = K["t"];
E, b = number_field(t^2 - a, "b");
OK = maximal_order(K);
p = prime_decomposition(OK, 2)[1][1];
D = matrix(E, 3, 3, [5//2*a - 4, 0, 0, 0, a, a, 0, a, -4*a + 8]);
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])];
L = hermitian_lattice(E, gens, gram = D);
g2 = genus(L, p);
scales(g2)
ranks(g2)
dets(g2)
norms(g2)
rank(g2), det(g2), discriminant(g2)
is_ramified(::HermLocalGenus)
is_split(::HermLocalGenus)
is_inert(::HermLocalGenus)
is_dyadic(::HermLocalGenus)
using Hecke # hide
Qx, x = QQ["x"];
K, a = number_field(x^2 - 2, "a");
Kt, t = K["t"];
E, b = number_field(t^2 - a, "b");
OK = maximal_order(K);
p = prime_decomposition(OK, 2)[1][1];
g1 = genus(HermLat, E, p, [(0, 1, 1, 0), (2, 2, -1, 1)], type = :det);
is_ramified(g1), is_split(g1), is_inert(g1), is_dyadic(g1)
uniformizer(::HermLocalGenus)
using Hecke # hide
Qx, x = QQ["x"];
K, a = number_field(x^2 - 2, "a");
Kt, t = K["t"];
E, b = number_field(t^2 - a, "b");
OK = maximal_order(K);
p = prime_decomposition(OK, 2)[1][1];
g1 = genus(HermLat, E, p, [(0, 1, 1, 0), (2, 2, -1, 1)], type = :det);
uniformizer(g1)
Let
det_representative(::HermLocalGenus, ::Int)
det_representative(::HermLocalGenus)
using Hecke # hide
Qx, x = QQ["x"];
K, a = number_field(x^2 - 2, "a");
Kt, t = K["t"];
E, b = number_field(t^2 - a, "b");
OK = maximal_order(K);
p = prime_decomposition(OK, 2)[1][1];
g1 = genus(HermLat, E, p, [(0, 1, 1, 0), (2, 2, -1, 1)], type = :det);
det_representative(g1)
det_representative(g1,2)
gram_matrix(::HermLocalGenus, ::Int)
gram_matrix(::HermLocalGenus)
using Hecke # hide
Qx, x = QQ["x"];
K, a = number_field(x^2 - 2, "a");
Kt, t = K["t"];
E, b = number_field(t^2 - a, "b");
OK = maximal_order(K);
p = prime_decomposition(OK, 2)[1][1];
D = matrix(E, 3, 3, [5//2*a - 4, 0, 0, 0, a, a, 0, a, -4*a + 8]);
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])];
L = hermitian_lattice(E, gens, gram = D);
g2 = genus(L, p);
gram_matrix(g2)
gram_matrix(g2,1)
Let
Note that prime ideals in
We say that two lattice
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 symbolsS
and the signaturessignatures
at the places in$S(E/K)$ . Note that this requires the given invariants to satisfy the product formula for Hilbert symbols.
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$ .
genus(L::HermLat) -> HermGenus
As before, we will construct two different global genus symbols for hermitian lattices, which we will use for the rest of this section.
using Hecke # hide
Qx, x = QQ["x"];
K, a = number_field(x^2 - 2, "a");
Kt, t = K["t"];
E, b = number_field(t^2 - a, "b");
OK = maximal_order(K);
p = prime_decomposition(OK, 2)[1][1];
g1 = genus(HermLat, E, p, [(0, 1, 1, 0), (2, 2, -1, 1)], type = :det);
infp = infinite_places(E)
SEK = unique([r.base_field_place for r in infp if isreal(r.base_field_place) && !isreal(r)]);
length(SEK)
G1 = genus([g1], [(SEK[1], 1)])
D = matrix(E, 3, 3, [5//2*a - 4, 0, 0, 0, a, a, 0, a, -4*a + 8]);
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])];
L = hermitian_lattice(E, gens, gram = D);
G2 = genus(L)
base_field(::HermGenus)
primes(::HermGenus)
signatures(::HermGenus)
rank(::HermGenus)
is_integral(::HermGenus)
local_symbols(::HermGenus)
scale(::HermGenus)
norm(::HermGenus)
using Hecke # hide
Qx, x = QQ["x"];
K, a = number_field(x^2 - 2, "a");
Kt, t = K["t"];
E, b = number_field(t^2 - a, "b");
OK = maximal_order(K);
p = prime_decomposition(OK, 2)[1][1];
D = matrix(E, 3, 3, [5//2*a - 4, 0, 0, 0, a, a, 0, a, -4*a + 8]);
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])];
L = hermitian_lattice(E, gens, gram = D);
G2 = genus(L);
base_field(G2)
primes(G2)
signatures(G2)
rank(G2)
Definition 4.2.1 [Kir16]
Let
Note that since
mass(::HermLat)
using Hecke # hide
Qx, x = polynomial_ring(FlintQQ, "x");
f = x^2 - 2;
K, a = number_field(f, "a", cached = false);
Kt, t = polynomial_ring(K, "t");
g = t^2 + 1;
E, b = number_field(g, "b", cached = false);
D = matrix(E, 3, 3, [1, 0, 0, 0, 1, 0, 0, 0, 1]);
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])];
L = hermitian_lattice(E, gens, gram = D);
mass(L)
representative(::HermLocalGenus)
Base.in(::HermLat, ::HermLocalGenus)
representative(::HermGenus)
Base.in(::HermLat, ::HermGenus)
representatives(::HermGenus)
genus_representatives(::HermLat)
using Hecke # hide
Qx, x = QQ["x"];
K, a = number_field(x^2 - 2, "a");
Kt, t = K["t"];
E, b = number_field(t^2 - a, "b");
OK = maximal_order(K);
p = prime_decomposition(OK, 2)[1][1];
g1 = genus(HermLat, E, p, [(0, 1, 1, 0), (2, 2, -1, 1)], type = :det);
SEK = unique([restrict(r, K) for r in infinite_places(E) if isreal(restrict(r, K)) && !isreal(r)]);
G1 = genus([g1], [(SEK[1], 1)]);
L1 = representative(g1)
L1 in g1
L2 = representative(G1)
L2 in G1, L2 in g1
length(genus_representatives(L1))
length(representatives(G1))
direct_sum(::HermLocalGenus, ::HermLocalGenus)
direct_sum(::HermGenus, ::HermGenus)
using Hecke # hide
Qx, x = QQ["x"];
K, a = number_field(x^2 - 2, "a");
Kt, t = K["t"];
E, b = number_field(t^2 - a, "b");
OK = maximal_order(K);
p = prime_decomposition(OK, 2)[1][1];
g1 = genus(HermLat, E, p, [(0, 1, 1, 0), (2, 2, -1, 1)], type = :det);
SEK = unique([restrict(r, K) for r in infinite_places(E) if isreal(restrict(r, K)) && !isreal(r)]);
G1 = genus([g1], [(SEK[1], 1)]);
D = matrix(E, 3, 3, [5//2*a - 4, 0, 0, 0, a, a, 0, a, -4*a + 8]);
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])];
L = hermitian_lattice(E, gens, gram = D);
g2 = genus(L, p);
G2 = genus(L);
direct_sum(g1, g2)
direct_sum(G1, G2)
hermitian_local_genera(E, p, ::Int, ::Int, ::Int, ::Int)
hermitian_genera(::Hecke.RelSimpleNumField, ::Int, ::Dict{InfPlc, Int}, ::Union{Hecke.RelNumFieldOrderIdeal, Hecke.RelNumFieldOrderFractionalIdeal})
using Hecke # hide
K, a = cyclotomic_real_subfield(8, "a");
Kt, t = K["t"];
E, b = number_field(t^2 - a * t + 1);
p = prime_decomposition(maximal_order(K), 2)[1][1];
hermitian_local_genera(E, p, 4, 2, 0, 4)
SEK = unique([restrict(r, K) for r in infinite_places(E) if isreal(restrict(r, K)) && !isreal(r)]);
hermitian_genera(E, 3, Dict(SEK[1] => 1, SEK[2] => 1), 30 * maximal_order(E))
rescale(g::HermLocalGenus, a::Union{FieldElem, RationalUnion})
rescale(G::HermGenus, a::Union{FieldElem, RationalUnion})