Lattice with isometry
We call lattice with isometry any pair $(L, f)$ consisting of an integer lattice $L$ together with an isometry $f \in O(L)$. We refer to the section about integer lattices of the documentation for new users.
In Oscar, such a pair is encoded in the type called ZZLatWithIsom
:
ZZLatWithIsom
— TypeZZLatWithIsom
A container type for pairs (L, f)
consisting on an integer lattice L
of type ZZLat
and an isometry f
given as a QQMatrix
representing the action on a given basis of L
.
We store the ambient space V
of L
together with an isometry f_ambient
inducing f
on L
seen as a pair $(V, f_ambient)$ of type QuadSpaceWithIsom
. We moreover store the order n
of f
, which can be finite or infinite.
To construct an object of type ZZLatWithIsom
, see the following examples:
Examples
One first way to construct such object, is by entering directly the lattice with an isometry. The isometry can be a honnest isometry of the lattice, or it can be an isometry of the ambient space preserving the lattice. Depending on this choice, one should enter the appropriate boolean value ambient_representation
. This direct construction is done through the constructors integer_lattice_with_isometry
.
julia> L = root_lattice(:E, 6);
julia> f = matrix(QQ, 6, 6, [ 1 2 3 2 1 1;
-1 -2 -2 -2 -1 -1;
0 1 0 0 0 0;
1 0 0 0 0 0;
-1 -1 -1 0 0 -1;
0 0 1 1 0 1]);
julia> Lf = integer_lattice_with_isometry(L, f, ambient_representation = false)
Integer lattice of rank 6 and degree 6
with isometry of finite order 8
given by
[ 1 2 3 2 1 1]
[-1 -2 -2 -2 -1 -1]
[ 0 1 0 0 0 0]
[ 1 0 0 0 0 0]
[-1 -1 -1 0 0 -1]
[ 0 0 1 1 0 1]
julia> B = matrix(QQ,1,6, [1 2 3 1 -1 3]);
julia> I = lattice_in_same_ambient_space(L, B); # This is the invariant sublattice L^f
julia> If = integer_lattice_with_isometry(I, ambient_isometry(Lf))
Integer lattice of rank 1 and degree 6
with isometry of finite order 1
given by
[1]
julia> integer_lattice_with_isometry(I, neg=true)
Integer lattice of rank 1 and degree 6
with isometry of finite order 2
given by
[-1]
Another way to construct such objects is to see them as sub-objects of their ambient space, of type QuadSpaceWithIsom
. Through the constructors lattice
and lattice_in_same_ambient_space
, one can then construct lattices with isometry for free, in a given space, as long as the module they define is preserved by the fixed isometry of the ambient space.
Examples
julia> G = matrix(QQ, 6, 6 , [ 3 1 -1 1 0 0;
1 3 1 1 1 1;
-1 1 3 0 0 1;
1 1 0 4 2 2;
0 1 0 2 4 2;
0 1 1 2 2 4]);
julia> V = quadratic_space(QQ, G);
julia> f = matrix(QQ, 6, 6, [ 1 0 0 0 0 0
0 0 -1 0 0 0
-1 1 -1 0 0 0
0 0 0 1 0 -1
0 0 0 0 0 -1
0 0 0 0 1 -1]);
julia> Vf = quadratic_space_with_isometry(V, f);
julia> Lf = lattice(Vf)
Integer lattice of rank 6 and degree 6
with isometry of finite order 3
given by
[ 1 0 0 0 0 0]
[ 0 0 -1 0 0 0]
[-1 1 -1 0 0 0]
[ 0 0 0 1 0 -1]
[ 0 0 0 0 0 -1]
[ 0 0 0 0 1 -1]
julia> B = matrix(QQ, 4, 6, [1 0 3 0 0 0;
0 1 1 0 0 0;
0 0 0 0 1 0;
0 0 0 0 0 1]);
julia> Cf = lattice(Vf, B) # coinvariant sublattice L_f
Integer lattice of rank 4 and degree 6
with isometry of finite order 3
given by
[-2 3 0 0]
[-1 1 0 0]
[ 0 0 0 -1]
[ 0 0 1 -1]
julia> Cf2 = lattice_in_same_ambient_space(Lf, B)
Integer lattice of rank 4 and degree 6
with isometry of finite order 3
given by
[-2 3 0 0]
[-1 1 0 0]
[ 0 0 0 -1]
[ 0 0 1 -1]
julia> Cf == Cf2
true
The last equality of the last example shows why we care about "ambient context": the two pairs of lattice with isometry Cf
and Cf2
are basically the same mathematical objects. Indeed, they lie in the same space, defines the same module and their respective isometries are induced by the same isometry of the ambient space. As for regular ZZLat
, as soon as the lattices are in the same ambient space, we can compare them as $\mathbb Z$-modules, endowed with an isometry.
and it is seen as a quadruple $(Vf, L, f, n)$ where $Vf = (V, f_a)$ consists of the ambient rational quadratic space $V$ of $L$ and an isometry $f_a$ of $V$ preserving $L$ and inducing $f$ on $L$. The integer $n$ is the order of $f$, which is a divisor of the order of the isometry $f_a\in O(V)$.
Given a lattice with isometry $(L, f)$, we provide the following accessors to the elements of the previously described quadruple:
ambient_isometry
— Methodambient_isometry(Lf::ZZLatWithIsom) -> QQMatrix
Given a lattice with isometry $(L, f)$, return an isometry of the ambient space of L
inducing f
on L
.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L; neg=true);
julia> ambient_isometry(Lf)
[-1 0 0 0 0]
[ 0 -1 0 0 0]
[ 0 0 -1 0 0]
[ 0 0 0 -1 0]
[ 0 0 0 0 -1]
ambient_space
— Methodambient_space(Lf::ZZLatWithIsom) -> QuadSpaceWithIsom
Given a lattice with isometry $(L, f)$, return the pair $(V, g)$ where V
is the ambient quadratic space of L
and g
is an isometry of V
inducing f
on L
.
Note that g
might not be unique and we fix such a global isometry together with V
into a container type QuadSpaceWithIsom
.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L; neg=true);
julia> Vf = ambient_space(Lf)
Quadratic space of dimension 5
with isometry of finite order 2
given by
[-1 0 0 0 0]
[ 0 -1 0 0 0]
[ 0 0 -1 0 0]
[ 0 0 0 -1 0]
[ 0 0 0 0 -1]
julia> typeof(Vf)
QuadSpaceWithIsom
isometry
— Methodisometry(Lf::ZZLatWithIsom) -> QQMatrix
Given a lattice with isometry $(L, f)$, return the underlying isometry f
.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L; neg=true);
julia> isometry(Lf)
[-1 0 0 0 0]
[ 0 -1 0 0 0]
[ 0 0 -1 0 0]
[ 0 0 0 -1 0]
[ 0 0 0 0 -1]
lattice
— Methodlattice(Lf::ZZLatWithIsom) -> ZZLat
Given a lattice with isometry $(L, f)$, return the underlying lattice L
.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L; neg=true);
julia> lattice(Lf) === L
true
order_of_isometry
— Methodorder_of_isometry(Lf::ZZLatWithIsom) -> IntExt
Given a lattice with isometry $(L, f)$, return the order of the underlying isometry f
.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L; neg=true);
julia> order_of_isometry(Lf) == 2
true
Note that for some computations, it is more convenient to work either with the isometry of the lattice itself, or with the fixed isometry of the ambient quadratic space inducing it on the lattice.
Constructor
We provide two ways to construct a pair $Lf = (L,f)$ consisting of an integer lattice endowed with an isometry. One way to construct an object of type ZZLatWithIsom
is through the methods integer_lattice_with_isometry
. These two methods do not require as input an ambient quadratic space with isometry.
integer_lattice_with_isometry
— Methodinteger_lattice_with_isometry(L::ZZLat, f::QQMatrix; check::Bool = true,
ambient_representation = true)
-> ZZLatWithIsom
Given a $\mathbb Z$-lattice L
and a matrix f
, if f
defines an isometry of L
of order n
, return the corresponding lattice with isometry pair $(L, f)$.
If ambient_representation
is set to true, f
is consider as an isometry of the ambient space of L
and the induced isometry on L
is automatically computed. Otherwise, an isometry of the ambient space of L
is constructed, setting the identity on the complement of the rational span of L
if it is not of full rank.
Examples
The way we construct the lattice can have an influence on the isometry of the ambient space we store. Indeed, if one mentions an isometry of the lattice, this isometry will be extended by the identity on the orthogonal complement of the rational span of the lattice. In the following example, Lf
and Lf2
are the same object, but the isometry of their ambient space stored are different (one has order 2, the other one is the identity).
julia> B = matrix(QQ, 3, 5, [1 0 0 0 0;
0 0 1 0 1;
0 0 0 1 0]);
julia> G = matrix(QQ, 5, 5, [ 2 -1 0 0 0;
-1 2 -1 0 0;
0 -1 2 -1 0;
0 0 -1 2 -1;
0 0 0 -1 2]);
julia> L = integer_lattice(B; gram = G);
julia> f = matrix(QQ, 5, 5, [ 1 0 0 0 0;
-1 -1 -1 -1 -1;
0 0 0 0 1;
0 0 0 1 0;
0 0 1 0 0]);
julia> Lf = integer_lattice_with_isometry(L, f)
Integer lattice of rank 3 and degree 5
with isometry of finite order 1
given by
[1 0 0]
[0 1 0]
[0 0 1]
julia> ambient_isometry(Lf)
[ 1 0 0 0 0]
[-1 -1 -1 -1 -1]
[ 0 0 0 0 1]
[ 0 0 0 1 0]
[ 0 0 1 0 0]
julia> Lf2 = integer_lattice_with_isometry(L, isometry(Lf); ambient_representation=false)
Integer lattice of rank 3 and degree 5
with isometry of finite order 1
given by
[1 0 0]
[0 1 0]
[0 0 1]
julia> ambient_isometry(Lf2)
[1 0 0 0 0]
[0 1 0 0 0]
[0 0 1 0 0]
[0 0 0 1 0]
[0 0 0 0 1]
integer_lattice_with_isometry
— Methodinteger_lattice_with_isometry(L::ZZLat; neg::Bool = false) -> ZZLatWithIsom
Given a $\mathbb Z$-lattice L
return the lattice with isometry pair $(L, f)$, where f
corresponds to the identity mapping of L
.
If neg
is set to true
, then the isometry f
is negative the identity of L
.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L; neg=true)
Integer lattice of rank 5 and degree 5
with isometry of finite order 2
given by
[-1 0 0 0 0]
[ 0 -1 0 0 0]
[ 0 0 -1 0 0]
[ 0 0 0 -1 0]
[ 0 0 0 0 -1]
By default, the first constructor will always check whether the matrix defines an isometry of the lattice, or its ambient space. We recommend not to disable this parameter to avoid any further issues. Note that as in the case of quadratic spaces with isometry, both isometries of integer lattices of finite order and infinite order are supported.
Another way of constructing such lattices with isometry is by fixing an ambient quadratic space with isometry, of type QuadSpaceWithIsom
, and specifying a basis for an integral lattice in that space. If this lattice is preserved by the fixed isometry of the quadratic space considered, then we endow it with the induced action.
lattice
— Methodlattice(Vf::QuadSpaceWithIsom) -> ZZLatWithIsom
Given a quadratic space with isometry $(V, f)$, return the full rank lattice L
in V
with basis the standard basis, together with the induced action of f
on L
.
Examples
julia> V = quadratic_space(QQ, QQ[2 -1; -1 2])
Quadratic space of dimension 2
over rational field
with gram matrix
[ 2 -1]
[-1 2]
julia> f = matrix(QQ, 2, 2, [1 1; 0 -1])
[1 1]
[0 -1]
julia> Vf = quadratic_space_with_isometry(V, f)
Quadratic space of dimension 2
with isometry of finite order 2
given by
[1 1]
[0 -1]
julia> Lf = lattice(Vf)
Integer lattice of rank 2 and degree 2
with isometry of finite order 2
given by
[1 1]
[0 -1]
lattice
— Methodlattice(Vf::QuadSpaceWithIsom, B::MatElem{<:RationalUnion};
isbasis::Bool = true, check::Bool = true)
-> ZZLatWithIsom
Given a quadratic space with isometry $(V, f)$ and a matrix B
generating a lattice L
in V
, if L
is preserved under the action of f
, return the lattice with isometry $(L, f_L)$ where $f_L$ is induced by the action of f
on L
.
Examples
julia> V = quadratic_space(QQ, QQ[ 2 -1 0 0 0;
-1 2 -1 0 0;
0 -1 2 -1 0;
0 0 -1 2 -1;
0 0 0 -1 2]);
julia> f = matrix(QQ, 5, 5, [ 1 0 0 0 0;
-1 -1 -1 -1 -1;
0 0 0 0 1;
0 0 0 1 0;
0 0 1 0 0]);
julia> Vf = quadratic_space_with_isometry(V, f);
julia> B = matrix(QQ,3,5,[1 0 0 0 0;
0 0 1 0 1;
0 0 0 1 0])
[1 0 0 0 0]
[0 0 1 0 1]
[0 0 0 1 0]
julia> lattice(Vf, B)
Integer lattice of rank 3 and degree 5
with isometry of finite order 1
given by
[1 0 0]
[0 1 0]
[0 0 1]
lattice_in_same_ambient_space
— Methodlattice_in_same_ambient_space(L::ZZLatWithIsom, B::MatElem;
check::Bool = true)
-> ZZLatWithIsom
Given a lattice with isometry $(L, f)$ and a matrix B
whose rows define a free system of vectors in the ambient space V
of L
, if the lattice M
in V
defined by B
is preserved under the fixed isometry g
of V
inducing f
on L
, return the lattice with isometry pair $(M, f_M)$ where $f_M$ is induced by the action of g
on M
.
Examples
julia> L = root_lattice(:A,5);
julia> f = matrix(QQ, 5, 5, [ 1 0 0 0 0;
-1 -1 -1 -1 -1;
0 0 0 0 1;
0 0 0 1 0;
0 0 1 0 0]);
julia> Lf = integer_lattice_with_isometry(L, f);
julia> B = matrix(QQ,3,5,[1 0 0 0 0;
0 0 1 0 1;
0 0 0 1 0])
[1 0 0 0 0]
[0 0 1 0 1]
[0 0 0 1 0]
julia> I = lattice_in_same_ambient_space(Lf, B)
Integer lattice of rank 3 and degree 5
with isometry of finite order 1
given by
[1 0 0]
[0 1 0]
[0 0 1]
julia> ambient_space(I) === ambient_space(Lf)
true
Attributes and first operations
Given a lattice with isometry $Lf := (L, f)$, one can have access most of the attributes of $L$ and $f$ by calling the similar function for the pair. For instance, in order to know the genus of $L$, one can simply call genus(Lf)
. Here is a list of what are the current accessible attributes:
basis_matrix
— Methodbasis_matrix(Lf::ZZLatWithIsom) -> QQMatrix
Given a lattice with isometry $(L, f)$, return the basis matrix of the underlying lattice L
.
Examples
julia> L = root_lattice(:A,5);
julia> f = matrix(QQ,5,5,[ 1 0 0 0 0;
-1 -1 -1 -1 -1;
0 0 0 0 1;
0 0 0 1 0;
0 0 1 0 0])
[ 1 0 0 0 0]
[-1 -1 -1 -1 -1]
[ 0 0 0 0 1]
[ 0 0 0 1 0]
[ 0 0 1 0 0]
julia> Lf = integer_lattice_with_isometry(L, f);
julia> invariant_lattice(Lf);
julia> I = invariant_lattice(Lf);
julia> basis_matrix(I)
[1 0 0 0 0]
[0 0 1 0 1]
[0 0 0 1 0]
characteristic_polynomial
— Methodcharacteristic_polynomial(Lf::ZZLatWithIsom) -> QQPolyRingElem
Given a lattice with isometry $(L, f)$, return the characteristic polynomial of the underlying isometry f
.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L; neg=true);
julia> factor(characteristic_polynomial(Lf))
1 * (x + 1)^5
degree
— Methoddegree(Lf::ZZLatWithIsom) -> Int
Given a lattice with isometry $(L, f)$, return the degree of the underlying lattice L
.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L);
julia> degree(Lf)
5
det
— Methoddet(Lf::ZZLatWithIsom) -> QQFieldElem
Given a lattice with isometry $(L, f)$, return the determinant of the underlying lattice L
.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L);
julia> det(Lf)
6
discriminant
— Methoddiscriminant(Lf::ZZLatWithIsom) -> QQFieldElem
Given a lattice with isometry $(L, f)$, return the discriminant of the underlying lattice L
.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L);
julia> discriminant(Lf) == det(Lf) == 6
true
genus
— Methodgenus(Lf::ZZLatWithIsom) -> ZZGenus
Given a lattice with isometry $(L, f)$, return the genus of the underlying lattice L
.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L; neg=true);
julia> genus(Lf)
Genus symbol for integer lattices
Signatures: (5, 0, 0)
Local symbols:
Local genus symbol at 2: 1^-4 2^1_7
Local genus symbol at 3: 1^-4 3^1
gram_matrix
— Methodgram_matrix(Lf::ZZLatWithIsom) -> QQMatrix
Given a lattice with isometry $(L, f)$, return the gram matrix of the underlying lattice L
with respect to its basis matrix.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L);
julia> gram_matrix(Lf)
[ 2 -1 0 0 0]
[-1 2 -1 0 0]
[ 0 -1 2 -1 0]
[ 0 0 -1 2 -1]
[ 0 0 0 -1 2]
is_definite
— Methodis_definite(Lf::ZZLatWithIsom) -> Bool
Given a lattice with isometry $(L, f)$, return whether the underlying lattice L
is definite.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L);
julia> is_definite(Lf)
true
is_even
— Methodis_even(Lf::ZZLatWithIsom) -> Bool
Given a lattice with isometry $(L, f)$, return whether the underlying lattice L
is even.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L);
julia> is_even(Lf)
true
is_integral
— Methodis_integral(Lf::ZZLatWithIsom) -> Bool
Given a lattice with isometry $(L, f)$, return whether the underlying lattice L
is integral.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L);
julia> is_integral(Lf)
true
is_positive_definite
— Methodis_positive_definite(Lf::ZZLatWithIsom) -> Bool
Given a lattice with isometry $(L, f)$, return whether the underlying lattice L
is positive definite.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L);
julia> is_positive_definite(Lf)
true
is_negative_definite
— Methodis_negative_definite(Lf::ZZLatWithIsom) -> Bool
Given a lattice with isometry $(L, f)$, return whether the underlying lattice L
is negative definite.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L);
julia> is_negative_definite(Lf)
false
minimum
— Methodminimum(Lf::ZZLatWithIsom) -> QQFieldElem
Given a positive definite lattice with isometry $(L, f)$, return the minimum of the underlying lattice L
.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L);
julia> minimum(Lf)
2
minimal_polynomial
— Methodminimal_polynomial(Lf::ZZLatWithIsom) -> QQPolyRingElem
Given a lattice with isometry $(L, f)$, return the minimal polynomial of the underlying isometry f
.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L; neg=true);
julia> minimal_polynomial(Lf)
x + 1
norm
— Methodnorm(Lf::ZZLatWithIsom) -> QQFieldElem
Given a lattice with isometry $(L, f)$, return the norm of the underlying lattice L
.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L);
julia> norm(Lf)
2
rank
— Methodrank(Lf::ZZLatWithIsom) -> Integer
Given a lattice with isometry $(L, f)$, return the rank of the underlying lattice L
.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L; neg=true);
julia> rank(Lf)
5
rational_span
— Methodrational_span(Lf::ZZLatWithIsom) -> QuadSpaceWithIsom
Given a lattice with isometry $(L, f)$, return the rational span $L \otimes \mathbb{Q}$ of the underlying lattice L
together with the underlying isometry of L
.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L);
julia> Vf = rational_span(Lf)
Quadratic space of dimension 5
with isometry of finite order 1
given by
[1 0 0 0 0]
[0 1 0 0 0]
[0 0 1 0 0]
[0 0 0 1 0]
[0 0 0 0 1]
julia> typeof(Vf)
QuadSpaceWithIsom
scale
— Methodscale(Lf::ZZLatWithIsom) -> QQFieldElem
Given a lattice with isometry $(L, f)$, return the scale of the underlying lattice L
.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L);
julia> scale(Lf)
1
signature_tuple
— Methodsignature_tuple(Lf::ZZLatWithIsom) -> Tuple{Int, Int, Int}
Given a lattice with isometry $(L, f)$, return the signature tuple of the underlying lattice L
.
Examples
julia> L = root_lattice(:A,5);
julia> Lf = integer_lattice_with_isometry(L);
julia> signature_tuple(Lf)
(5, 0, 0)
Similarly, some basic operations on $\mathbb Z$-lattices are available for lattices with isometry.
^
— Method^(Lf::ZZLatWithIsom, n::Int) -> ZZLatWithIsom
Given a lattice with isometry $(L, f)$ and an integer $n$, return the pair $(L, f^n)$.
Examples
julia> L = root_lattice(:A,5);
julia> f = matrix(QQ, 5, 5, [ 1 0 0 0 0;
-1 -1 -1 -1 -1;
0 0 0 0 1;
0 0 0 1 0;
0 0 1 0 0]);
julia> Lf = integer_lattice_with_isometry(L, f)
Integer lattice of rank 5 and degree 5
with isometry of finite order 2
given by
[ 1 0 0 0 0]
[-1 -1 -1 -1 -1]
[ 0 0 0 0 1]
[ 0 0 0 1 0]
[ 0 0 1 0 0]
julia> Lf^0
Integer lattice of rank 5 and degree 5
with isometry of finite order 1
given by
[1 0 0 0 0]
[0 1 0 0 0]
[0 0 1 0 0]
[0 0 0 1 0]
[0 0 0 0 1]
biproduct
— Methodbiproduct(x::Vector{ZZLatWithIsom}) -> ZZLatWithIsom,
Vector{AbstractSpaceMor},
Vector{AbstractSpaceMor}
biproduct(x::Vararg{ZZLatWithIsom}) -> ZZLatWithIsom,
Vector{AbstractSpaceMor},
Vector{AbstractSpaceMor}
Given a collection of lattices with isometries $(L_1, f_1), \ldots, (L_n, f_n)$, return the lattice with isometry $(L, f)$ together with the injections $L_i \to L$ and the projections $L \to L_i$, where L
is the biproduct $L := L_1 \oplus \ldots \oplus L_n$ and f
is the isometry of L
induced by the diagonal actions of the $f_i$'s.
For objects of type ZZLatWithIsom
, finite direct sums and finite direct products agree and they are therefore called biproducts. If one wants to obtain $(L, f)$ as a direct sum with the injections $L_i \to L$, one should call direct_sum(x)
. If one wants to obtain $(L, f)$ as a direct product with the projections $L \to L_i$, one should call direct_product(x)
.
Examples
julia> L = root_lattice(:A,5);
julia> f = matrix(QQ, 5, 5, [ 1 0 0 0 0;
-1 -1 -1 -1 -1;
0 0 0 0 1;
0 0 0 1 0;
0 0 1 0 0]);
julia> g = matrix(QQ, 5, 5, [1 1 1 1 1;
0 -1 -1 -1 -1;
0 1 0 0 0;
0 0 1 0 0;
0 0 0 1 0]);
julia> Lf = integer_lattice_with_isometry(L, f)
Integer lattice of rank 5 and degree 5
with isometry of finite order 2
given by
[ 1 0 0 0 0]
[-1 -1 -1 -1 -1]
[ 0 0 0 0 1]
[ 0 0 0 1 0]
[ 0 0 1 0 0]
julia> Lg = integer_lattice_with_isometry(L, g)
Integer lattice of rank 5 and degree 5
with isometry of finite order 5
given by
[1 1 1 1 1]
[0 -1 -1 -1 -1]
[0 1 0 0 0]
[0 0 1 0 0]
[0 0 0 1 0]
julia> Lh, inj, proj = biproduct(Lf, Lg)
(Integer lattice with isometry of finite order 10, AbstractSpaceMor[Map with following data
Domain:
=======
Quadratic space of dimension 5
Codomain:
=========
Quadratic space of dimension 10, Map with following data
Domain:
=======
Quadratic space of dimension 5
Codomain:
=========
Quadratic space of dimension 10], AbstractSpaceMor[Map with following data
Domain:
=======
Quadratic space of dimension 10
Codomain:
=========
Quadratic space of dimension 5, Map with following data
Domain:
=======
Quadratic space of dimension 10
Codomain:
=========
Quadratic space of dimension 5])
julia> Lh
Integer lattice of rank 10 and degree 10
with isometry of finite order 10
given by
[ 1 0 0 0 0 0 0 0 0 0]
[-1 -1 -1 -1 -1 0 0 0 0 0]
[ 0 0 0 0 1 0 0 0 0 0]
[ 0 0 0 1 0 0 0 0 0 0]
[ 0 0 1 0 0 0 0 0 0 0]
[ 0 0 0 0 0 1 1 1 1 1]
[ 0 0 0 0 0 0 -1 -1 -1 -1]
[ 0 0 0 0 0 0 1 0 0 0]
[ 0 0 0 0 0 0 0 1 0 0]
[ 0 0 0 0 0 0 0 0 1 0]
julia> matrix(compose(inj[1], proj[1]))
[1 0 0 0 0]
[0 1 0 0 0]
[0 0 1 0 0]
[0 0 0 1 0]
[0 0 0 0 1]
julia> matrix(compose(inj[1], proj[2]))
[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]
direct_product
— Methoddirect_product(x::Vector{ZZLatWithIsom}) -> ZZLatWithIsom,
Vector{AbstractSpaceMor}
direct_product(x::Vararg{ZZLatWithIsom}) -> ZZLatWithIsom,
Vector{AbstractSpaceMor}
Given a collection of lattices with isometries $(L_1, f_1), \ldots, (L_n, f_n)$, return the lattice with isometry $(L, f)$ together with the projections $L \to L_i$, where L
is the direct product $L := L_1 \times \ldots \times L_n$ and f
is the isometry of L
induced by the diagonal actions of the $f_i$'s.
For objects of type ZZLatWithIsom
, finite direct sums and finite direct products agree and they are therefore called biproducts. If one wants to obtain $(L, f)$ as a direct sum with the injections $L_i \to L$, one should call direct_sum(x)
. If one wants to obtain $(L, f)$ as a biproduct with the injections $L_i \to L$ and the projections $L \to L_i$, one should call biproduct(x)
.
Examples
julia> L = root_lattice(:A,5);
julia> f = matrix(QQ, 5, 5, [ 1 0 0 0 0;
-1 -1 -1 -1 -1;
0 0 0 0 1;
0 0 0 1 0;
0 0 1 0 0]);
julia> g = matrix(QQ, 5, 5, [1 1 1 1 1;
0 -1 -1 -1 -1;
0 1 0 0 0;
0 0 1 0 0;
0 0 0 1 0]);
julia> Lf = integer_lattice_with_isometry(L, f)
Integer lattice of rank 5 and degree 5
with isometry of finite order 2
given by
[ 1 0 0 0 0]
[-1 -1 -1 -1 -1]
[ 0 0 0 0 1]
[ 0 0 0 1 0]
[ 0 0 1 0 0]
julia> Lg = integer_lattice_with_isometry(L, g)
Integer lattice of rank 5 and degree 5
with isometry of finite order 5
given by
[1 1 1 1 1]
[0 -1 -1 -1 -1]
[0 1 0 0 0]
[0 0 1 0 0]
[0 0 0 1 0]
julia> Lh, proj = direct_product(Lf, Lg)
(Integer lattice with isometry of finite order 10, AbstractSpaceMor[Map with following data
Domain:
=======
Quadratic space of dimension 10
Codomain:
=========
Quadratic space of dimension 5, Map with following data
Domain:
=======
Quadratic space of dimension 10
Codomain:
=========
Quadratic space of dimension 5])
julia> Lh
Integer lattice of rank 10 and degree 10
with isometry of finite order 10
given by
[ 1 0 0 0 0 0 0 0 0 0]
[-1 -1 -1 -1 -1 0 0 0 0 0]
[ 0 0 0 0 1 0 0 0 0 0]
[ 0 0 0 1 0 0 0 0 0 0]
[ 0 0 1 0 0 0 0 0 0 0]
[ 0 0 0 0 0 1 1 1 1 1]
[ 0 0 0 0 0 0 -1 -1 -1 -1]
[ 0 0 0 0 0 0 1 0 0 0]
[ 0 0 0 0 0 0 0 1 0 0]
[ 0 0 0 0 0 0 0 0 1 0]
direct_sum
— Methoddirect_sum(x::Vector{ZZLatWithIsom}) -> ZZLatWithIsom,
Vector{AbstractSpaceMor}
direct_sum(x::Vararg{ZZLatWithIsom}) -> ZZLatWithIsom,
Vector{AbstractSpaceMor}
Given a collection of lattices with isometries $(L_1, f_1), \ldots, (L_n, f_n)$, return the lattice with isometry $(L, f)$ together with the injections $L_i \to L$, where L
is the direct sum $L := L_1 \oplus \ldots \oplus L_n$ and f
is the isometry of L
induced by the diagonal actions of the $f_i$'s.
For objects of type ZZLatWithIsom
, finite direct sums and finite direct products agree and they are therefore called biproducts. If one wants to obtain $(L, f)$ as a direct product with the projections $L \to L_i$, one should call direct_product(x)
. If one wants to obtain $(L, f)$ as a biproduct with the injections $L_i \to L$ and the projections $L \to L_i$, one should call biproduct(x)
.
Examples
julia> L = root_lattice(:A,5);
julia> f = matrix(QQ, 5, 5, [ 1 0 0 0 0;
-1 -1 -1 -1 -1;
0 0 0 0 1;
0 0 0 1 0;
0 0 1 0 0]);
julia> g = matrix(QQ, 5, 5, [1 1 1 1 1;
0 -1 -1 -1 -1;
0 1 0 0 0;
0 0 1 0 0;
0 0 0 1 0]);
julia> Lf = integer_lattice_with_isometry(L, f)
Integer lattice of rank 5 and degree 5
with isometry of finite order 2
given by
[ 1 0 0 0 0]
[-1 -1 -1 -1 -1]
[ 0 0 0 0 1]
[ 0 0 0 1 0]
[ 0 0 1 0 0]
julia> Lg = integer_lattice_with_isometry(L, g)
Integer lattice of rank 5 and degree 5
with isometry of finite order 5
given by
[1 1 1 1 1]
[0 -1 -1 -1 -1]
[0 1 0 0 0]
[0 0 1 0 0]
[0 0 0 1 0]
julia> Lh, inj = direct_sum(Lf, Lg)
(Integer lattice with isometry of finite order 10, AbstractSpaceMor[Map with following data
Domain:
=======
Quadratic space of dimension 5
Codomain:
=========
Quadratic space of dimension 10, Map with following data
Domain:
=======
Quadratic space of dimension 5
Codomain:
=========
Quadratic space of dimension 10])
julia> Lh
Integer lattice of rank 10 and degree 10
with isometry of finite order 10
given by
[ 1 0 0 0 0 0 0 0 0 0]
[-1 -1 -1 -1 -1 0 0 0 0 0]
[ 0 0 0 0 1 0 0 0 0 0]
[ 0 0 0 1 0 0 0 0 0 0]
[ 0 0 1 0 0 0 0 0 0 0]
[ 0 0 0 0 0 1 1 1 1 1]
[ 0 0 0 0 0 0 -1 -1 -1 -1]
[ 0 0 0 0 0 0 1 0 0 0]
[ 0 0 0 0 0 0 0 1 0 0]
[ 0 0 0 0 0 0 0 0 1 0]
dual
— Methoddual(Lf::ZZLatWithIsom) -> ZZLatWithIsom
Given a lattice with isometry $(L, f)$ inside the space $(V, \Phi)$, such that f
is induced by an isometry g
of $(V, \Phi)$, return the lattice with isometry $(L^{\vee}, h)$ where $L^{\vee}$ is the dual of L
in $(V, \Phi)$ and h
is induced by g
.
Examples
julia> L = root_lattice(:A,5);
julia> f = matrix(QQ, 5, 5, [ 1 0 0 0 0;
-1 -1 -1 -1 -1;
0 0 0 0 1;
0 0 0 1 0;
0 0 1 0 0]);
julia> Lf = integer_lattice_with_isometry(L, f)
Integer lattice of rank 5 and degree 5
with isometry of finite order 2
given by
[ 1 0 0 0 0]
[-1 -1 -1 -1 -1]
[ 0 0 0 0 1]
[ 0 0 0 1 0]
[ 0 0 1 0 0]
julia> Lfv = dual(Lf)
Integer lattice of rank 5 and degree 5
with isometry of finite order 2
given by
[1 -1 0 0 0]
[0 -1 0 0 0]
[0 -1 0 0 1]
[0 -1 0 1 0]
[0 -1 1 0 0]
julia> ambient_space(Lfv) == ambient_space(Lf)
true
lll
— Methodlll(Lf::ZZLatWithIsom) -> ZZLatWithIsom
Given a lattice with isometry $(L, f)$, return the same lattice with isometry with a different basis matrix for L
obtained by performing an LLL-reduction on the associated gram matrix of L
.
Note that matrix representing the action of f
on L
changes but the global action on the ambient space of L
stays the same.
Examples
julia> L = root_lattice(:A,5);
julia> f = matrix(QQ, 5, 5, [ 1 0 0 0 0;
-1 -1 -1 -1 -1;
0 0 0 0 1;
0 0 0 1 0;
0 0 1 0 0]);
julia> Lf = integer_lattice_with_isometry(L, f)
Integer lattice of rank 5 and degree 5
with isometry of finite order 2
given by
[ 1 0 0 0 0]
[-1 -1 -1 -1 -1]
[ 0 0 0 0 1]
[ 0 0 0 1 0]
[ 0 0 1 0 0]
julia> Lf2 = lll(Lf)
Integer lattice of rank 5 and degree 5
with isometry of finite order 2
given by
[ 1 0 0 0 0]
[-1 0 0 0 -1]
[-1 0 0 -1 0]
[-1 0 -1 0 0]
[-1 -1 0 0 0]
julia> ambient_space(Lf2) == ambient_space(Lf)
true
rescale
— Methodrescale(Lf::ZZLatWithIsom, a::RationalUnion) -> ZZLatWithIsom
Given a lattice with isometry $(L, f)$ and a rational number a
, return the lattice with isometry $(L(a), f)$.
Examples
julia> L = root_lattice(:A,5)
Integer lattice of rank 5 and degree 5
with gram matrix
[ 2 -1 0 0 0]
[-1 2 -1 0 0]
[ 0 -1 2 -1 0]
[ 0 0 -1 2 -1]
[ 0 0 0 -1 2]
julia> f = matrix(QQ, 5, 5, [ 1 0 0 0 0;
-1 -1 -1 -1 -1;
0 0 0 0 1;
0 0 0 1 0;
0 0 1 0 0]);
julia> Lf = integer_lattice_with_isometry(L, f)
Integer lattice of rank 5 and degree 5
with isometry of finite order 2
given by
[ 1 0 0 0 0]
[-1 -1 -1 -1 -1]
[ 0 0 0 0 1]
[ 0 0 0 1 0]
[ 0 0 1 0 0]
julia> Lf2 = rescale(Lf, 1//2)
Integer lattice of rank 5 and degree 5
with isometry of finite order 2
given by
[ 1 0 0 0 0]
[-1 -1 -1 -1 -1]
[ 0 0 0 0 1]
[ 0 0 0 1 0]
[ 0 0 1 0 0]
julia> lattice(Lf2)
Integer lattice of rank 5 and degree 5
with gram matrix
[ 1 -1//2 0 0 0]
[-1//2 1 -1//2 0 0]
[ 0 -1//2 1 -1//2 0]
[ 0 0 -1//2 1 -1//2]
[ 0 0 0 -1//2 1]
Type for finite order isometries
Given a lattice with isometry $Lf := (L, f)$ where $f$ is of finite order $n$, one can compute the type of $Lf$, which can be seen as an equivalent of the genus used to classified single lattices.
type
— Methodtype(Lf::ZZLatWithIsom)
-> Dict{Int, Tuple{ <: Union{ZZGenus, HermGenus}, ZZGenus}}
Given a lattice with isometry $(L, f)$ with f
of finite order n
, return the type of $(L, f)$.
In this context, the type is defined as follows: for each divisor k
of n
, the k
-type of $(L, f)$ is the tuple $(H_k, A_K)$ consisting of the genus $H_k$ of the lattice $\ker(\Phi_k(f))$ viewed as a hermitian $\mathbb{Z}[\zeta_k]$- lattice (so a $\mathbb{Z}$-lattice for k= 1, 2) and of the genus $A_k$ of the $\mathbb{Z}$-lattice $\ker(f^k-1)$.
Examples
julia> L = root_lattice(:A,5);
julia> f = matrix(QQ, 5, 5, [1 1 1 1 1;
0 -1 -1 -1 -1;
0 1 0 0 0;
0 0 1 0 0;
0 0 0 1 0]);
julia> Lf = integer_lattice_with_isometry(L, f);
julia> t = type(Lf);
julia> genus(invariant_lattice(Lf)) == t[1][1]
true
Since determining whether two pairs of lattices with isometry are isomorphic is a challenging task, one can perform a coarser comparison by looking at the type. This set of data keeps track of some local and global invariants of the pair $(L, f)$ with respect to the action of $f$ on $L$.
is_of_type
— Methodis_of_type(Lf::ZZLatWithIsom, t::Dict) -> Bool
Given a lattice with isometry $(L, f)$, return whether $(L, f)$ is of type t
.
Examples
julia> L = root_lattice(:A,5);
julia> f = matrix(QQ, 5, 5, [1 1 1 1 1;
0 -1 -1 -1 -1;
0 1 0 0 0;
0 0 1 0 0;
0 0 0 1 0]);
julia> Lf = integer_lattice_with_isometry(L, f);
julia> t = type(Lf);
julia> is_of_type(Lf, t)
true
is_of_same_type
— Methodis_of_same_type(Lf::ZZLatWithIsom, Mg::ZZLatWithIsom) -> Bool
Given two lattices with isometry $(L, f)$ and $(M, g)$, return whether they are of the same type.
Examples
julia> L = root_lattice(:A,5);
julia> f = matrix(QQ, 5, 5, [1 1 1 1 1;
0 -1 -1 -1 -1;
0 1 0 0 0;
0 0 1 0 0;
0 0 0 1 0]);
julia> Lf = integer_lattice_with_isometry(L, f);
julia> M = coinvariant_lattice(Lf);
julia> is_of_same_type(Lf, M)
false
Finally, if the minimal polynomial of $f$ is irreducible, then we say that the pair $(L, f)$ is of hermitian type. The type of a lattice with isometry of hermitian type is called hermitian (note that the type is only defined for finite order isometries).
These namings follow from the fact that, by the trace equivalence, one can associate to the pair $(L, f)$ a hermitian lattice over the equation order of $f$, if it is maximal in the associated number field $\mathbb{Q}[f]$.
is_of_hermitian_type
— Methodis_of_hermitian_type(Lf::ZZLatWithIsom) -> Bool
Given a lattice with isometry $(L, f)$, return whether the minimal polynomial of the underlying isometry f
is irreducible.
Note that if $(L, f)$ is of hermitian type with f
of minimal polynomial $\chi$, then L
can be seen as a hermitian lattice over the order $\mathbb{Z}[\chi]$.
Examples
julia> L = root_lattice(:A,5);
julia> f = matrix(QQ, 5, 5, [1 1 1 1 1;
0 -1 -1 -1 -1;
0 1 0 0 0;
0 0 1 0 0;
0 0 0 1 0]);
julia> Lf = integer_lattice_with_isometry(L, f)
Integer lattice of rank 5 and degree 5
with isometry of finite order 5
given by
[1 1 1 1 1]
[0 -1 -1 -1 -1]
[0 1 0 0 0]
[0 0 1 0 0]
[0 0 0 1 0]
julia> is_of_hermitian_type(Lf)
false
julia> is_of_hermitian_type(coinvariant_lattice(Lf))
true
is_hermitian
— Methodis_hermitian(t::Dict) -> Bool
Given a type t
of lattices with isometry, return whether t
is hermitian, i.e. whether it defines the type of a hermitian lattice with isometry.
Examples
julia> L = root_lattice(:A,5);
julia> f = matrix(QQ, 5, 5, [1 1 1 1 1;
0 -1 -1 -1 -1;
0 1 0 0 0;
0 0 1 0 0;
0 0 0 1 0]);
julia> Lf = integer_lattice_with_isometry(L, f);
julia> M = coinvariant_lattice(Lf);
julia> is_hermitian(type(Lf))
false
julia> is_hermitian(type(M))
true
Hermitian structure and trace equivalence
As mentioned in the previous section, to a lattice with isometry $Lf := (L, f)$ such that the minimal polynomial of $f$ is irreducible, one can associate a hermitian lattice $\mathfrak{L}$ over the equation order of $f$, if it is maximal, for which $Lf$ is the associated trace lattice. Hecke provides the tools to perform the trace equivalence for lattices with isometry of hermitian type.
hermitian_structure
— Methodhermitian_structure(Lf::ZZLatWithIsom) -> HermLat
Given a lattice with isometry $(L, f)$ such that the minimal polynomial of the underlying isometry f
is irreducible, return the hermitian structure of the underlying lattice L
over the equation order of the minimal polynomial of f
.
If it exists, the hermitian structure is stored. For now, we only cover the case where the equation order is maximal (which is always the case when the order is finite, for instance, since the minimal polynomial is cyclotomic).
Examples
julia> L = root_lattice(:A,5);
julia> f = matrix(QQ, 5, 5, [1 1 1 1 1;
0 -1 -1 -1 -1;
0 1 0 0 0;
0 0 1 0 0;
0 0 0 1 0]);
julia> Lf = integer_lattice_with_isometry(L, f);
julia> M = coinvariant_lattice(Lf)
Integer lattice of rank 4 and degree 5
with isometry of finite order 5
given by
[-1 -1 -1 -1]
[ 1 0 0 0]
[ 0 1 0 0]
[ 0 0 1 0]
julia> H = hermitian_structure(M)
Hermitian lattice of rank 1 and degree 1
over relative maximal order of Relative number field of degree 2 over maximal real subfield of cyclotomic field of order 5
with pseudo-basis
(1, 1//1 * <1, 1>)
(z_5, 1//1 * <1, 1>)
julia> res = get_attribute(M, :transfer_data)
Map of change of scalars
from quadratic space of dimension 4
to hermitian space of dimension 1
julia> M2, f2 = trace_lattice_with_isometry(H, res)
(Integer lattice of rank 4 and degree 4, [-1 -1 -1 -1; 1 0 0 0; 0 1 0 0; 0 0 1 0])
julia> genus(M) == genus(M2) # One class in this genus, so they are isometric
true
julia> f2 == isometry(M)
true
Discriminant group
Given an integral lattice with isometry $Lf := (L, f)$, if one denotes by $D_L$ the discriminant group of $L$, there exists a natural map $\pi\colon O(L) \to O(D_L)$ sending any isometry to its induced action on the discriminant group of $L$. In general, this map is neither injective nor surjective. If we denote by $D_f := \pi(f)$ then $\pi$ induces a map between centralizers $O(L, f)\to O(D_L, D_f)$. Again, this induced map is in general neither injective nor surjective, and we denote its image by $G_{L,f}$.
discriminant_group
— Methoddiscriminant_group(Lf::ZZLatWithIsom) -> TorQuadModule, AutomorphismGroupElem
Given an integral lattice with isometry $(L, f)$, return the discriminant group q
of the underlying lattice L
as well as this image of the underlying isometry f
inside $O(q)$.
Examples
julia> L = root_lattice(:A,5);
julia> f = matrix(QQ, 5, 5, [1 1 1 1 1;
0 -1 -1 -1 -1;
0 1 0 0 0;
0 0 1 0 0;
0 0 0 1 0]);
julia> Lf = integer_lattice_with_isometry(L, f);
julia> qL, qf = discriminant_group(Lf)
(Finite quadratic module: Z/6 -> Q/2Z, [1])
julia> qL
Finite quadratic module
over integer ring
Abelian group: Z/6
Bilinear value module: Q/Z
Quadratic value module: Q/2Z
Gram matrix quadratic form:
[5//6]
julia> qf
Isometry of Finite quadratic module: Z/6 -> Q/2Z defined by
[1]
julia> f = matrix(QQ, 5, 5, [ 1 0 0 0 0;
-1 -1 -1 -1 -1;
0 0 0 0 1;
0 0 0 1 0;
0 0 1 0 0]);
julia> Lf = integer_lattice_with_isometry(L, f);
julia> discriminant_group(Lf)[2]
Isometry of Finite quadratic module: Z/6 -> Q/2Z defined by
[5]
For simple cases as for definite lattices, $f$ being plus-or-minus the identity or if the rank of $L$ is equal to the totient of the order of $f$ (in the finite case), $G_{L,f}$ can be easily computed. The only other case which can be currently handled is for lattices with isometry of hermitian type following the hermitian Miranda-Morisson theory from Simon Brandhorst, Tommy Hofmann (2023). This has been implemented in this project and it can be indirectly used through the general following method:
image_centralizer_in_Oq
— Methodimage_centralizer_in_Oq(Lf::ZZLatWithIsom) -> AutomorphismGroup{TorQuadModule},
GAPGroupHomomorphism
Given an integral lattice with isometry $(L, f)$, return the image $G_L$ in $O(q_L, \bar{f})$ of the centralizer $O(L, f)$ of f
in $O(L)$. Here $q_L$ denotes the discriminant group of L
and $\bar{f}$ is the isometry of $q_L$ induced by f
.
Examples
julia> L = root_lattice(:A,2);
julia> f = matrix(QQ, 2, 2, [1 1; 0 -1]);
julia> Lf = integer_lattice_with_isometry(L, f);
julia> G, _ = image_centralizer_in_Oq(Lf)
(Group of isometries of Finite quadratic module: Z/3 -> Q/2Z generated by 2 elements, Group homomorphism from
Group of isometries of Finite quadratic module: Z/3 -> Q/2Z generated by 2 elements
to
Group of isometries of Finite quadratic module: Z/3 -> Q/2Z generated by 1 elements)
julia> order(G)
2
For an implementation of the regular Miranda-Morisson theory, we refer to the function image_in_Oq
which actually computes the image of $\pi$ in both the definite and the indefinite case.
We will see later in the section about enumeration of lattices with isometry that one can compute $G_{L,f}$ in some particular cases arising from equivariant primitive embeddings of lattices with isometries.
Kernel sublattices
As for single integer lattices, it is possible to compute kernel sublattices of some $\mathbb{Z}$-module homomorphisms. We provide here the possibility to compute $\ker(p(f))$ as a sublattice of $L$ equipped with the induced action of $f$, where $p$ is a polynomial with rational coefficients.
kernel_lattice
— Methodkernel_lattice(Lf::ZZLatWithIsom, p::Union{fmpz_poly, QQPolyRingElem})
-> ZZLatWithIsom
Given a lattice with isometry $(L, f)$ and a polynomial p
with rational coefficients, return the sublattice $M := \ker(p(f))$ of the underlying lattice L
with isometry f
, together with the restriction $f_{\mid M}$.
Examples
julia> L = root_lattice(:A,5);
julia> f = matrix(QQ, 5, 5, [1 1 1 1 1;
0 -1 -1 -1 -1;
0 1 0 0 0;
0 0 1 0 0;
0 0 0 1 0]);
julia> Lf = integer_lattice_with_isometry(L, f);
julia> Zx,x = ZZ["x"]
(Univariate polynomial ring in x over ZZ, x)
julia> mf = minimal_polynomial(Lf)
x^5 - 1
julia> factor(mf)
1 * (x - 1) * (x^4 + x^3 + x^2 + x + 1)
julia> kernel_lattice(Lf, x-1)
Integer lattice of rank 1 and degree 5
with isometry of finite order 1
given by
[1]
julia> kernel_lattice(Lf, cyclotomic_polynomial(5))
Integer lattice of rank 4 and degree 5
with isometry of finite order 5
given by
[-1 -1 -1 -1]
[ 1 0 0 0]
[ 0 1 0 0]
[ 0 0 1 0]
kernel_lattice
— Methodkernel_lattice(Lf::ZZLatWithIsom, l::Integer) -> ZZLatWithIsom
Given a lattice with isometry $(L, f)$ and an integer l
, return the kernel lattice of $(L, f)$ associated to the l
-th cyclotomic polynomial.
Examples
julia> L = root_lattice(:A,5);
julia> f = matrix(QQ, 5, 5, [1 1 1 1 1;
0 -1 -1 -1 -1;
0 1 0 0 0;
0 0 1 0 0;
0 0 0 1 0]);
julia> Lf = integer_lattice_with_isometry(L, f);
julia> kernel_lattice(Lf, 5)
Integer lattice of rank 4 and degree 5
with isometry of finite order 5
given by
[-1 -1 -1 -1]
[ 1 0 0 0]
[ 0 1 0 0]
[ 0 0 1 0]
julia> kernel_lattice(Lf, 1)
Integer lattice of rank 1 and degree 5
with isometry of finite order 1
given by
[1]
Note that such sublattices are by definition primitive in $L$ since $L$ is non-degenerate. As particular kernel sublattices of $L$, one can also compute the so-called invariant and coinvariant lattices of $(L, f)$:
coinvariant_lattice
— Methodcoinvariant_lattice(Lf::ZZLatWithIsom) -> ZZLatWithIsom
Given a lattice with isometry $(L, f)$, return the coinvariant lattice $L_f$ of $(L, f)$ together with the restriction of f
to $L_f$.
The coinvariant lattice $L_f$ of $(L, f)$ is the orthogonal complement in L
of the invariant lattice $L_f$.
Examples
julia> L = root_lattice(:A,5);
julia> f = matrix(QQ, 5, 5, [1 1 1 1 1;
0 -1 -1 -1 -1;
0 1 0 0 0;
0 0 1 0 0;
0 0 0 1 0]);
julia> Lf = integer_lattice_with_isometry(L, f);
julia> coinvariant_lattice(Lf)
Integer lattice of rank 4 and degree 5
with isometry of finite order 5
given by
[-1 -1 -1 -1]
[ 1 0 0 0]
[ 0 1 0 0]
[ 0 0 1 0]
invariant_lattice
— Methodinvariant_lattice(Lf::ZZLatWithIsom) -> ZZLatWithIsom
Given a lattice with isometry $(L, f)$, return the invariant lattice $L^f$ of $(L, f)$ together with the restriction of f
to $L^f$ (which is the identity in this case).
Examples
julia> L = root_lattice(:A,5);
julia> f = matrix(QQ, 5, 5, [1 1 1 1 1;
0 -1 -1 -1 -1;
0 1 0 0 0;
0 0 1 0 0;
0 0 0 1 0]);
julia> Lf = integer_lattice_with_isometry(L, f);
julia> invariant_lattice(Lf)
Integer lattice of rank 1 and degree 5
with isometry of finite order 1
given by
[1]
Similarly, we provide the possibility to compute invariant and coinvariant sublattices given an orthogonal representation G
in matrix form of a finite group on a given lattice L
:
coinvariant_lattice
— Methodcoinvariant_lattice(L::ZZLat, G::MatrixGroup;
ambient_representation::Bool = true)
-> ZZLat, MatrixGroup
Given an integer lattice L
and a group G
of isometries of L
in matrix, return the coinvariant sublattice $L_G$ of L
, together with the subgroup H
of isometries of $L_G$ induced by the action of $G$.
If ambient_representation
is set to true, the isometries in G
and H
are seen as isometries of the ambient quadratic space of L
preserving L
. Otherwise, they are considered as honnest isometries of L
.
Examples
julia> L = root_lattice(:A,2);
julia> G = isometry_group(L);
julia> L2, G2 = coinvariant_lattice(L, G)
(Integer lattice of rank 2 and degree 2, Matrix group of degree 2 over Rational field)
julia> L == L2
true
julia> G == G2
true
invariant_lattice
— Methodinvariant_lattice(L::ZZLat, G::MatrixGroup;
ambient_representation::Bool = true) -> ZZLat
Given an integer lattice L
and a group G
of isometries of L
in matrix, return the invariant sublattice $L^G$ of L
.
If ambient_representation
is set to true, the isometries in G
are seen as isometries of the ambient quadratic space of L
preserving L
. Otherwise, they are considered as honnest isometries of L
.
Examples
julia> L = root_lattice(:A,2);
julia> G = isometry_group(L);
julia> invariant_lattice(L, G)
Integer lattice of rank 0 and degree 2
with gram matrix
0 by 0 empty matrix
invariant_coinvariant_pair
— Methodinvariant_coinvariant_pair(L::ZZLat, G::MatrixGroup;
ambient_representation::Bool = true)
-> ZZLat, ZZLat, MatrixGroup
Given an integer lattice L
and a group G
of isometries of L
in matrix, return the invariant sublattice $L^G$ of L
and its coinvariant sublattice $L_G$ together with the subgroup H
of isometries of $L_G$ induced by the action of $G$.
If ambient_representation
is set to true, the isometries in G
and H
are seen as isometries of the ambient quadratic space of L
preserving L
. Otherwise, they are considered as honnest isometries of L
.
Examples
julia> L = root_lattice(:A,2);
julia> G = isometry_group(L);
julia> Gsub, _ = sub(G, [gens(G)[end]]);
julia> F, C, G2 = invariant_coinvariant_pair(L, Gsub)
(Integer lattice of rank 1 and degree 2, Integer lattice of rank 1 and degree 2, Matrix group of degree 2 over Rational field)
julia> F
Integer lattice of rank 1 and degree 2
with gram matrix
[2]
julia> C
Integer lattice of rank 1 and degree 2
with gram matrix
[6]
Signatures
We conclude this introduction about standard functionalities for lattices with isometry by introducing a last invariant for lattices with finite isometry of hermitian type $(L, f)$, called the signatures. These signatures are are intrinsequely connected to the local archimedean invariants of the hermitian structure associated to $(L, f)$ via the trace equivalence.
signatures
— Methodsignatures(Lf::ZZLatWithIsom) -> Dict{Int, Tuple{Int, Int}}
Given a lattice with isometry $(L, f)$ where the minimal polynomial of f
is irreducible cyclotomic, return the signatures of $(L, f)$.
In this context, if we denote $z$ a primitive n
-th root of unity, where n
is the order of f
, then for each $1 \leq i \leq n/2$ such that $(i, n) = 1$, the $i$-th signature of $(L, f)$ is given by the signatures of the real quadratic form $\ker(f + f^{-1} - z^i - z^{-i})$.
Examples
julia> L = root_lattice(:A,5);
julia> f = matrix(QQ, 5, 5, [1 1 1 1 1;
0 -1 -1 -1 -1;
0 1 0 0 0;
0 0 1 0 0;
0 0 0 1 0]);
julia> Lf = integer_lattice_with_isometry(L, f);
julia> M = coinvariant_lattice(Lf);
julia> signatures(M)
Dict{Integer, Tuple{Int64, Int64}} with 2 entries:
2 => (2, 0)
1 => (2, 0)
Equality
We choose as a convention that two pairs $(L, f)$ and $(L', f')$ of integer lattices with isometries are equal if their ambient quadratic space with isometry of type QuadSpaceWithIsom
are equal, and if the underlying lattices $L$ and $L'$ are equal as $\mathbb Z$-modules in the common ambient quadratic space.