An octonion vector is a tuple of octonions. Vector addition and scalar multiplication are defined in the usual way, as component-wise addition and scalar multiplication. We can define the octonion vector norm and corresponding inner product for an octonion vector in a number of ways, but require that the octonion norm of an octonion vector belongs to the ring of scalars.
An octonion lattice is a free left ℤ-module generated by a finite set of octonion vectors along with some octonion vector norm. Octonion lattice constructions of the Leech lattice are explored in several places, including [EG96], [Wil09b], [Wil11], [Nas22], [Nas23].
The ALCO package provides tools to construct and study octonion lattices, including the Leech lattice constructions given in the references above. This package constructs octonion lattices in GAP as free left modules (that satisfy IsFreeLeftModule
) with the additional structure needed to compute the norms of lattice points and their inner product. It also includes tools to identify the Leech lattice and Gosset (E_8) lattice by examining the Gram matrix of a lattice.
The Gram matrix of a lattice basis is a computed by taking the inner products of the basis vectors. When the inner product is real-valued, the Gram matrix of a lattice basis must be a positive definite symmetric matrix (see [CS13, chap. 1]). Certain important lattices may be identified using a Gram matrix of that lattice. The ALCO package provides the following tools to identify a Gosset or Leech lattice Gram matrix.
‣ IsLeechLatticeGramMatrix ( G ) | ( function ) |
This function tests whether G is a Gram matrix of the Leech lattice. In order for the function to return true
, argument G must satisfy the following. First, G must satisfy IsOrdinaryMatrix(G)
, DimensionsMat(G) = [24,24]
, TransposedMat(G) = G
, and ForAll(Flat(G), IsInt)
. If so, then this function verifies that G belongs to a unimodular lattice and computes ShortestVectors(G, 3)
. Provided that no vectors of norm 1, 2, or 3 exist, then by the classification of unimodular lattices in 24 dimensions, Gram matrix G must belong to a Leech lattice. For details about the classification see [CS13, chaps. 16-18].
‣ IsGossetLatticeGramMatrix ( G ) | ( function ) |
This function tests whether G is a Gram matrix of the Gosset lattice, also known as the E_8 lattice. In order for the function to return true
, argument G must satisfy the following. First, G must satisfy IsOrdinaryMatrix(G)
, DimensionsMat(G) = [8,8]
, TransposedMat(G) = G
, and ForAll(Flat(G), IsInt)
. If so, then this function verifies that G belongs to a unimodular lattice and computes ShortestVectors(G, 1)
. Provided that no vectors of norm 1 exist, then by the classification of unimodular lattices in 8 dimensions, Gram matrix G must belong to a Gosset lattice. For details about the classification see [CS13, chaps. 16-18].
‣ MOGLeechLatticeGeneratorMatrix | ( global variable ) |
‣ MOGLeechLatticeGramMatrix | ( global variable ) |
The Leech lattice is studied in detail in [CS13] using a specific set of coordinates, known as "Miracle Octad Generator" coordinates. The choice of MOG coordinates exhibits the M_{24} symmetries of the lattice. The ALCO package loads the following variables to construct the Leech lattice in MOG coordinates. The variable MOGLeechLatticeGeneratorMatrix
stores the 24 \times 24 integer matrix with rows that span a MOG Leech lattice [CS13, p. 133]. The variable MOGLeechLatticeGramMatrix
stores the Gram matrix of the generator matrix rows, with the inner product computed as x*y/8
.
gap> M := MOGLeechLatticeGeneratorMatrix;; gap> G := M*TransposedMat(M)/8;; gap> G = MOGLeechLatticeGramMatrix; true gap> IsLeechLatticeGramMatrix(G); true
‣ IsOctonionLattice | ( filter ) |
As described above, an octonion lattice is a free left ℤ-module generated by a finite set of octonion vectors and equipped with some octonion vector norm. The category IsOctonionLattice
is a subcategory of IsFreeLeftModule
used by the ALCO package to construct octonion lattices as free left modules with the additional structure of a norm on octonion vectors. The simplest available norm is perhaps to set the norm of an octonion vector to be the sum of the norms of the octonion coefficients. The norm for an octonion lattice in the ALCO package is defined (via an inner product) in a more general way, described below.
Let L be an object that satisfies IsOctonionLattice(L)
. Then L is equipped with an attribute G = OctonionGramMatrix(L)
. The matrix G is a Hermitian octonion matrix used to define the octonion lattice norm and inner product. For x, y octonion vectors in L, the inner product of x and y is computed as Trace(x*G*ComplexConjugate(y))
. The trace (twice the real part) satisfies Trace((x*y)*z) = Trace(x*(y*z))
for any octonions x,y,z [Wil09a, p. 145]. It follows that the inner product defined above for octonion vectors is also well defined despite the non-associativity of the octonion algebra. If we define the norm as the inner product of a vector with itself, then we can set the vector norm to be the sum of the norms of the octonion coefficients by setting G = OctonionGramMatrix(L)
to be half the identity matrix.
‣ OctonionLatticeByGenerators ( gens[, G[, B]] ) | ( function ) |
This function returns a free left module that satisfies IsOctonionLattice
(5.1-4). The attribute LeftActingDomain
is automatically set to Integers
. Argument gens must be a list of equal length octonion row vectors that satisfies IsOctonionCollColl(gens)
. The inner product is defined by optional argument G, which is an octonion Hermitian matrix that defaults to half the identity matrix. Optional argument B is a basis for the octonion algebra used to construct the vectors and defaults to the canonical basis of that algebra. All three arguments must satisfy IsHomogeneousList(Flat([gens, G, B]))
in order to ensure that the same octonion algebra is being used in each argument.
The input gens is stored as the attribute GeneratorsOfLeftOperatorAdditiveGroup
. The vectors in gens need not be linearly independent. The octonion algebra basis B is used to convert gens to a list of real coefficients using OctonionToRealVector(B, x)
for each x in gens. These converted vectors are stored as the attribute GeneratorsAsCoefficients
and are used to compute a basis for the lattice which is stored as the attribute LLLReducedBasisCoefficients
.
The argument G is stored as the attribute OctonionGramMatrix
and is used to define ScalarProduct(L, x, y) = Trace(x*G*ComplexConjugate(y))
for IsOctonionLattice(L)
and x,y octonion vectors in L.
In the following example, we construct the octonion lattice consisting of all octavian integer triples where the norm of a vector is the sum of the norms of the coefficients. We also supply the E_8 basis for the octavian integers as the underlying octonion ring basis B for the construction.
gap> O := OctavianIntegers;; gap> gens := Concatenation(List(IdentityMat(3), x -> List(Basis(O), y -> x*y))); [ [ (-1/2)*e1+(1/2)*e5+(1/2)*e6+(1/2)*e7, 0*e1, 0*e1 ], [ (-1/2)*e1+(-1/2)*e2+(-1/2)*e4+(-1/2)*e7, 0*e1, 0*e1 ], [ (1/2)*e2+(1/2)*e3+(-1/2)*e5+(-1/2)*e7, 0*e1, 0*e1 ], [ (1/2)*e1+(-1/2)*e3+(1/2)*e4+(1/2)*e5, 0*e1, 0*e1 ], [ (-1/2)*e2+(1/2)*e3+(-1/2)*e5+(1/2)*e7, 0*e1, 0*e1 ], [ (1/2)*e2+(-1/2)*e4+(1/2)*e5+(-1/2)*e6, 0*e1, 0*e1 ], [ (-1/2)*e1+(-1/2)*e3+(1/2)*e4+(-1/2)*e5, 0*e1, 0*e1 ], [ (1/2)*e1+(-1/2)*e4+(1/2)*e6+(-1/2)*e8, 0*e1, 0*e1 ], [ 0*e1, (-1/2)*e1+(1/2)*e5+(1/2)*e6+(1/2)*e7, 0*e1 ], [ 0*e1, (-1/2)*e1+(-1/2)*e2+(-1/2)*e4+(-1/2)*e7, 0*e1 ], [ 0*e1, (1/2)*e2+(1/2)*e3+(-1/2)*e5+(-1/2)*e7, 0*e1 ], [ 0*e1, (1/2)*e1+(-1/2)*e3+(1/2)*e4+(1/2)*e5, 0*e1 ], [ 0*e1, (-1/2)*e2+(1/2)*e3+(-1/2)*e5+(1/2)*e7, 0*e1 ], [ 0*e1, (1/2)*e2+(-1/2)*e4+(1/2)*e5+(-1/2)*e6, 0*e1 ], [ 0*e1, (-1/2)*e1+(-1/2)*e3+(1/2)*e4+(-1/2)*e5, 0*e1 ], [ 0*e1, (1/2)*e1+(-1/2)*e4+(1/2)*e6+(-1/2)*e8, 0*e1 ], [ 0*e1, 0*e1, (-1/2)*e1+(1/2)*e5+(1/2)*e6+(1/2)*e7 ], [ 0*e1, 0*e1, (-1/2)*e1+(-1/2)*e2+(-1/2)*e4+(-1/2)*e7 ], [ 0*e1, 0*e1, (1/2)*e2+(1/2)*e3+(-1/2)*e5+(-1/2)*e7 ], [ 0*e1, 0*e1, (1/2)*e1+(-1/2)*e3+(1/2)*e4+(1/2)*e5 ], [ 0*e1, 0*e1, (-1/2)*e2+(1/2)*e3+(-1/2)*e5+(1/2)*e7 ], [ 0*e1, 0*e1, (1/2)*e2+(-1/2)*e4+(1/2)*e5+(-1/2)*e6 ], [ 0*e1, 0*e1, (-1/2)*e1+(-1/2)*e3+(1/2)*e4+(-1/2)*e5 ], [ 0*e1, 0*e1, (1/2)*e1+(-1/2)*e4+(1/2)*e6+(-1/2)*e8 ] ] gap> G := IdentityMat(3)*One(O)/2;; gap> B := CanonicalBasis(O);; gap> O3 := OctonionLatticeByGenerators(gens, G, B); <free left module over Integers, with 24 generators> gap> KnownAttributesOfObject(O3); [ "LeftActingDomain", "Dimension", "GeneratorsOfLeftOperatorAdditiveGroup", "UnderlyingOctonionRing", "UnderlyingOctonionRingBasis", "OctonionGramMatrix", "GeneratorsAsCoefficients", "LLLReducedBasisCoefficients" ]
An free left module L that satisfies IsOctonionLattice(L)
has several attributes in addition to those of a free left module (such as LeftActingDomain
and GeneratorsOfLeftOperatorAdditiveGroup
). In the examples of this section, we use the octonion lattice O3
constructed above to illustrate these attributes.
‣ UnderlyingOctonionRing ( L ) | ( attribute ) |
When L satisfies IsOctonionLattice(L)
, this attribute stores the octonion algebra to which the coefficients of the generating octonion vectors gens belong. This algebra is determined by FamilyObj(One(Flat(gens)))!.fullSCAlgebra
where gens is given by GeneratorsOfLeftOperatorAdditiveGroup(L)
.
gap> UnderlyingOctonionRing(O3); <algebra-with-one of dimension 8 over Rationals>
‣ OctonionGramMatrix ( L ) | ( attribute ) |
When L satisfies IsOctonionLattice(L)
, this attribute stores the optional argument G of OctonionLatticeByGenerators
(5.1-5). When the optional argument is not supplied, the default value is half the appropriate octonion identity matrix. This octonion matrix is used to compute ScalarProduct
(5.3-2) between lattice vectors.
gap> OctonionGramMatrix(O3);; Display(last); [ [ (1/2)*e8, 0*e1, 0*e1 ], [ 0*e1, (1/2)*e8, 0*e1 ], [ 0*e1, 0*e1, (1/2)*e8 ] ]
‣ GeneratorsAsCoefficients ( L ) | ( attribute ) |
When L satisfies IsOctonionLattice(L)
, this attribute converts the lattice generators, GeneratorsOfLeftOperatorAdditiveGroup(L)
, into a list of coefficients using OctonionToRealVector(B, x)
for each generator x. Recall that B is an optional argument of OctonionLatticeByGenerators
(5.1-5) that defaults to CanonicalBasis(UnderlyingOctonionRing(L))
.
gap> GeneratorsAsCoefficients(O3); [ [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ] ]
‣ LLLReducedBasisCoefficients ( L ) | ( attribute ) |
When L satisfies IsOctonionLattice(L)
, this attribute stores the LLL reduced basis computed from GeneratorsAsCoefficients(L)
. These vectors define the CanonicalBasis
(5.2-7) for L and are used to compute the attribute GramMatrix
(5.2-6).
gap> LLLReducedBasisCoefficients(O3); [ [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 ] ]
‣ Dimension ( L ) | ( attribute ) |
‣ Rank ( L ) | ( attribute ) |
When L satisfies IsOctonionLattice(L)
, these attributes store the lattice dimension, also known as rank. This is calculated by evaluating Rank( GeneratorsAsCoefficients(L) )
.
gap> Dimension(O3); 24 gap> Rank(O3); 24
‣ GramMatrix ( L ) | ( attribute ) |
When L satisfies IsOctonionLattice(L)
, this attribute stores the Gram matrix defined by the basis stored using the LLLReducedBasisCoefficients
(5.2-4) attribute and the inner product defined on the lattice by ScalarProduct
(5.3-2).
gap> g := 2*GramMatrix(O3);; gap> DimensionsMat(g); [ 24, 24 ] gap> DeterminantMat(g); 1
‣ Basis ( L ) | ( attribute ) |
‣ CanonicalBasis ( L ) | ( attribute ) |
‣ BasisVectors ( B ) | ( attribute ) |
‣ IsOctonionLatticeBasis | ( filter ) |
When L satisfies IsOctonionLattice(L)
, these attributes are used to store the lattice canonical basis determined by LLLReducedBasisCoefficients
(5.2-4). The attributes Basis(L)
and CanonicalBasis(L)
are equivalent and satisfy the filter IsOctonionLatticeBasis
. The attribute BasisVectors
returns the vectors stored in the attribute LLLReducedBasisCoefficients
(5.2-4) converted into octonion vectors using RealToOctonionVector(UnderlyingOctonionRingBasis(L), x)
for each x in LLLReducedBasisCoefficients(L)
.
gap> IsOctonionLatticeBasis(Basis(O3)); true gap> b := BasisVectors(Basis(O3)); [ [ (-1/2)*e1+(1/2)*e5+(1/2)*e6+(1/2)*e7, 0*e1, 0*e1 ], [ (-1/2)*e1+(-1/2)*e2+(-1/2)*e4+(-1/2)*e7, 0*e1, 0*e1 ], [ (1/2)*e1+(1/2)*e2+(1/2)*e4+(-1/2)*e7, 0*e1, 0*e1 ], [ (1/2)*e2+(1/2)*e3+(-1/2)*e5+(-1/2)*e7, 0*e1, 0*e1 ], [ (1/2)*e1+(1/2)*e3+(1/2)*e4+(-1/2)*e5, 0*e1, 0*e1 ], [ (1/2)*e1+(1/2)*e2+(1/2)*e3+(-1/2)*e6, 0*e1, 0*e1 ], [ (1/2)*e2+(1/2)*e4+(-1/2)*e5+(-1/2)*e6, 0*e1, 0*e1 ], [ (1/2)*e1+(1/2)*e2+(-1/2)*e5+(-1/2)*e8, 0*e1, 0*e1 ], [ 0*e1, (-1/2)*e1+(1/2)*e5+(1/2)*e6+(1/2)*e7, 0*e1 ], [ 0*e1, (-1/2)*e1+(-1/2)*e2+(-1/2)*e4+(-1/2)*e7, 0*e1 ], [ 0*e1, (1/2)*e1+(1/2)*e2+(1/2)*e4+(-1/2)*e7, 0*e1 ], [ 0*e1, (1/2)*e2+(1/2)*e3+(-1/2)*e5+(-1/2)*e7, 0*e1 ], [ 0*e1, (1/2)*e1+(1/2)*e3+(1/2)*e4+(-1/2)*e5, 0*e1 ], [ 0*e1, (1/2)*e1+(1/2)*e2+(1/2)*e3+(-1/2)*e6, 0*e1 ], [ 0*e1, (1/2)*e2+(1/2)*e4+(-1/2)*e5+(-1/2)*e6, 0*e1 ], [ 0*e1, (1/2)*e1+(1/2)*e2+(-1/2)*e5+(-1/2)*e8, 0*e1 ], [ 0*e1, 0*e1, (-1/2)*e1+(1/2)*e5+(1/2)*e6+(1/2)*e7 ], [ 0*e1, 0*e1, (-1/2)*e1+(-1/2)*e2+(-1/2)*e4+(-1/2)*e7 ], [ 0*e1, 0*e1, (1/2)*e1+(1/2)*e2+(1/2)*e4+(-1/2)*e7 ], [ 0*e1, 0*e1, (1/2)*e2+(1/2)*e3+(-1/2)*e5+(-1/2)*e7 ], [ 0*e1, 0*e1, (1/2)*e1+(1/2)*e3+(1/2)*e4+(-1/2)*e5 ], [ 0*e1, 0*e1, (1/2)*e1+(1/2)*e2+(1/2)*e3+(-1/2)*e6 ], [ 0*e1, 0*e1, (1/2)*e2+(1/2)*e4+(-1/2)*e5+(-1/2)*e6 ], [ 0*e1, 0*e1, (1/2)*e1+(1/2)*e2+(-1/2)*e5+(-1/2)*e8 ] ] gap> GramMatrix(O3) = List(b, x -> List(b, y -> ScalarProduct(O3, x, y))); true
There are some additional operations available to study octonion lattices. In the examples that follow, we continue to use the lattice O3
defined in the example of OctonionLatticeByGenerators
(5.1-5).
5.3-1 \in
‣ \in ( x, L ) | ( operation ) |
When L satisfies IsOctonionLattice(L)
and x is an octonion row vector that satisfies IsOctonionCollection and IsRowVector
, this operation test whether vector x is in lattice L. This operation will return fail
when x and L do not share the same underlying octonion ring. Note that \in(x,L)
and x in L
are equivalent expression.
gap> x := Sum(BasisVectors(Basis(O3)){[2,3,4]}); [ (1/2)*e2+(1/2)*e3+(-1/2)*e5+(-3/2)*e7, 0*e1, 0*e1 ] gap> x in O3; true gap> \in( x, O3); true
‣ ScalarProduct ( L, x, y ) | ( operation ) |
When L satisfies IsOctonionLattice(L)
and x, y satisfy IsOctonionCollection and IsRowVector
then this operation returns Trace(x*OctonionGramMatrix(L)*ComplexConjugate(y))
. Here the trace is the method Trace
(2.2-2) acting on an octonion argument (corresponding to twice the real part, or identity coefficient, of the octonion x*OctonionGramMatrix(L)*ComplexConjugate(y)
). When x, y are not octonion vectors but rather coefficient vectors of the appropriate length, withIsHomogeneousList(Flat([x,y,GeneratorsAsCoefficients(L)]))
, then the operation ScalarProduct
converts x and y to suitable octonion vectors to compute the scalar product.
gap> b := BasisVectors(Basis(O3));; gap> b[1]; [ (-1/2)*e1+(1/2)*e5+(1/2)*e6+(1/2)*e7, 0*e1, 0*e1 ] gap> GramMatrix(O3) = List(b, x -> List(b, y -> ScalarProduct(O3, x, y))); true gap> c := LLLReducedBasisCoefficients(O3);; gap> c[1]; [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] gap> GramMatrix(O3) = List(c, x -> List(c, y -> ScalarProduct(O3, x, y))); true
‣ IsSublattice ( L, M ) | ( operation ) |
‣ IsSubset ( L, M ) | ( operation ) |
‣ \= ( L, M ) | ( operation ) |
When L and M both satisfy IsOctonionLattice(L)
, these operations determine whether M is a sublattice of L by checking whether the basis vectors for M are in L. If the lattices L and M do not share the same UnderlyingOctonionRing
(5.2-1) then the operation will return fail
. The operation \=
returns the value of IsSublattice(L, M) and IsSublattice(L, M)
. In the example below we construct an octonion Leech lattice Leech
and verify that it is a sublattice of O3
.
gap> s := LinearCombination(OctonionE8Basis, [ 1, 2, 1, 2, 2, 2, 2, 1 ]);; gap> leech_gens := List(Basis(OctavianIntegers), x -> > x*[[s,s,0],[0,s,s],ComplexConjugate([s,s,s])]);; gap> leech_gens := Concatenation(leech_gens);; gap> Leech := OctonionLatticeByGenerators(leech_gens, G, B); <free left module over Integers, with 24 generators> gap> IsLeechLatticeGramMatrix(GramMatrix(Leech)); true gap> IsSublattice(Leech, O3); false gap> IsSublattice(O3, Leech); true gap> IsSubset(O3, Leech); true
‣ Coefficients ( B, y ) | ( operation ) |
Let B satisfy IsOctonionLatticeBasis(B)
with basis B belonging to octonion lattice L. For y in L
such that IsOctonionCollection(y)
, the coefficients in y in the lattice basis B can be determined by Coefficients(B, y)
. For x
an integer row vector of suitable length, the linear combination of basis vectors is computed in the usual way as LinearCombination(B, x)
.
gap> rand := Random(O3);; gap> coeffs := Coefficients(Basis(O3), rand);; gap> rand = LinearCombination(Basis(O3), coeffs); true
generated by GAPDoc2HTML