The ALCO package provides tools for algebraic combinatorics, most of which was written for GAP during the author's Ph.D. program [Nas23]. This package provides implementations in GAP of octonion algebras, Jordan algebras, and certain important integer subrings of those algebras. It also provides tools to compute the parameters of t-designs in spherical and projective spaces (modeled as manifolds of primitive idempotent elements in a simple Euclidean Jordan algebra). Finally, this package provides tools to explore octonion lattice constructions, including octonion Leech lattices. The following examples illustrate how one might use this package to explore these structures.
The ALCO package allows users to work with the octavian integer ring (also known as the octonion arithmetic), which is described carefully in [CS03, chaps. 9-11]. In the example below, we verify that the octavian integers define an \(E_8\) (Gossett) lattice relative to the standard octonion inner product:
gap> O := OctavianIntegers; OctavianIntegers gap> g := List(Basis(O), x -> List(Basis(O), y -> > Norm(x+y) - Norm(x) - Norm(y)));; gap> Display(g); [ [ 2, 0, -1, 0, 0, 0, 0, 0 ], [ 0, 2, 0, -1, 0, 0, 0, 0 ], [ -1, 0, 2, -1, 0, 0, 0, 0 ], [ 0, -1, -1, 2, -1, 0, 0, 0 ], [ 0, 0, 0, -1, 2, -1, 0, 0 ], [ 0, 0, 0, 0, -1, 2, -1, 0 ], [ 0, 0, 0, 0, 0, -1, 2, -1 ], [ 0, 0, 0, 0, 0, 0, -1, 2 ] ] gap> IsGossetLatticeGramMatrix(g); true
The ALCO package also provides tools to construct octonion lattices, including octonion Leech lattices (see for example [Wil09b]). In the following example we compute the shortest vectors in the OctavianIntegers
lattice and select one that is a root of polynomial \(x^2 + x + 2\). We use this root s
to define a set gens
of octonion triples to serve as generators for the lattice. Finally, we construct the lattice L
and confirm that it is a Leech lattice.
gap> short := Set(ShortestVectors(g,4).vectors, y -> > LinearCombination(Basis(OctavianIntegers), y));; gap> s := First(short, x -> x^2 + x + 2*One(x) = Zero(x)); (-1)*e1+(-1/2)*e2+(-1/2)*e3+(-1/2)*e4+(-1/2)*e8 gap> gens := List(Basis(OctavianIntegers), x -> > x*[[s,s,0],[0,s,s],ComplexConjugate([s,s,s])]);; gap> gens := Concatenation(gens);; gap> L := OctonionLatticeByGenerators(gens, One(O)*IdentityMat(3)/2); <free left module over Integers, with 24 generators> gap> IsLeechLatticeGramMatrix(GramMatrix(L)); true
We can also construct and study simple Euclidean Jordan algebras (described well in [FK94]), including the Albert algebra:
gap> J := AlbertAlgebra(Rationals); <algebra-with-one of dimension 27 over Rationals> gap> SemiSimpleType(Derivations(Basis(J))); "F4" gap> i := Basis(J){[1..8]}; [ i1, i2, i3, i4, i5, i6, i7, i8 ] gap> j := Basis(J){[9..16]}; [ j1, j2, j3, j4, j5, j6, j7, j8 ] gap> k := Basis(J){[17..24]}; [ k1, k2, k3, k4, k5, k6, k7, k8 ] gap> e := Basis(J){[25..27]}; [ ei, ej, ek ] gap> ForAll(e, IsIdempotent); true gap> Set(i, x -> x^2); [ ej+ek ] gap> Set(j, x -> x^2); [ ei+ek ] gap> One(J); ei+ej+ek gap> Determinant(One(J)); 1 gap> Trace(One(J)); 3
generated by GAPDoc2HTML