From 89c5b8ac34dc6cf77caaf4a626667bac4954ff58 Mon Sep 17 00:00:00 2001 From: Benjamin Nasmith Date: Sun, 4 Feb 2024 17:21:39 -0600 Subject: [PATCH] Version 0.2 - applied all initial feedback --- PackageInfo.g | 4 +- doc/ALCO.xml | 454 ++++++++++++++++++++++++------------------------- lib/alco.gd | 2 +- lib/alco.gi | 8 +- makedoc.g | 2 + tst/alco01.tst | 8 +- tst/alco02.tst | 45 +++-- tst/alco03.tst | 33 ++-- tst/alco04.tst | 59 +++---- tst/alco05.tst | 26 +-- tst/alco06.tst | 17 +- 11 files changed, 324 insertions(+), 334 deletions(-) diff --git a/PackageInfo.g b/PackageInfo.g index c6eaa09..4f658ba 100644 --- a/PackageInfo.g +++ b/PackageInfo.g @@ -7,8 +7,8 @@ SetPackageInfo( rec( PackageName := "ALCO", Subtitle := "Tools for algebraic combinatorics", - Version := "0.1", - Date := "15/01/2024", # dd/mm/yyyy format + Version := "0.2", + Date := "04/02/2024", # dd/mm/yyyy format License := "GPL-3.0-or-later", PackageWWWHome := "https://github.com/BNasmith/alco", diff --git a/doc/ALCO.xml b/doc/ALCO.xml index 41009c0..40828b5 100644 --- a/doc/ALCO.xml +++ b/doc/ALCO.xml @@ -40,9 +40,10 @@ true]]>

The ALCO package also provides tools to construct octonion lattices, including octonion Leech lattices (see for example ). 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. short := Set(ShortestVectors(g,4).vectors, y -> + 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. + 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 @@ -64,8 +65,8 @@ gap> k := Basis(J){[17..24]}; [ k1, k2, k3, k4, k5, k6, k7, k8 ] gap> e := Basis(J){[25..27]}; [ ei, ej, ek ] -gap> List(e, IsIdempotent); -[ true, true, true ] +gap> ForAll(e, IsIdempotent); +true gap> Set(i, x -> x^2); [ ej+ek ] gap> Set(j, x -> x^2); @@ -131,10 +132,12 @@ gap> Trace(One(J)); Key="baez_octonions_2002" /> and (except that e7 corresponds to e_0 in the literature, since the first entry in a ⪆ list has index 1). Whether or not the algebra constructed is a division algebra or a - split-octonion algebra depends on the choices of field F. For example, - OctonionAlgebra(Rationals) is a division composition algebra, but - OctonionAlgebra(GF(3)) is a split composition algebra. Other examples are discussed in . O := OctonionAlgebra(Rationals); + split-octonion algebra depends on the choice of field F. For example, + OctonionAlgebra(Rationals) is a division composition algebra, but + OctonionAlgebra(GF(3)) is a split composition algebra. + Other examples are discussed in . + O := OctonionAlgebra(Rationals); gap> LeftActingDomain(O); Rationals @@ -163,8 +166,9 @@ gap> SemiSimpleType(last); elements that have the geometry of scaled E_8 lattice. This ring is named and studied in . CanonicalBasis(OctavianIntegers) returns . We can test - whether an octonion is in OctavianIntegers using the operation - IsOctavianInt(x). a := BasisVectors(Basis(OctavianIntegers));; + whether an octonion is in OctavianIntegers using the operation + IsOctavianInt(x). + a := BasisVectors(Basis(OctavianIntegers));; gap> for x in a do Display(x); od; (-1/2)*e1+(1/2)*e5+(1/2)*e6+(1/2)*e7 (-1/2)*e1+(-1/2)*e2+(-1/2)*e4+(-1/2)*e7 @@ -184,37 +188,19 @@ false]]> - The ALCO package also loads a basis for - OctonionAlgebra(Rationals) which also serves as generators for . This octonion integer lattice has the geometry of a - E_8 (Gossett) lattice relative to the inner product defined by the octonion norm. BasisVectors(OctonionE8Basis) = BasisVectors(Basis(OctavianIntegers)); + The ALCO package also loads a basis for + OctonionAlgebra(Rationals) which also serves as generators for + . This octonion integer lattice has the geometry of a + E_8 (Gossett) lattice relative to the inner product defined by the octonion norm. + BasisVectors(OctonionE8Basis) = BasisVectors(Basis(OctavianIntegers)); true -gap> g := List(OctonionE8Basis, x -> -> List(OctonionE8Basis, y -> +gap> g := List(OctonionE8Basis, x -> List(OctonionE8Basis, y -> > Norm(x+y) - Norm(x) - Norm(y)));; gap> IsGossetLatticeGramMatrix(g); true]]> - - - @@ -226,8 +212,10 @@ a3+a4+a7+a8]]> Returns the norm of octonion x. Recall that an octonion algebra - satisfies the composition property N(xy) = N(x)N(y). In the canonical basis for , the norm is the sum of the squares of the coefficients. Oct := OctonionAlgebra(Rationals);; + with norm N satisfies the composition property N(xy) = N(x)N(y). + In the canonical basis for , the norm is the sum of the squares + of the coefficients. + Oct := OctonionAlgebra(Rationals);; gap> List(Basis(Oct), Norm); [ 1, 1, 1, 1, 1, 1, 1, 1 ] gap> x := Random(Oct);; y := Random(Oct);; @@ -239,9 +227,13 @@ true]]> Returns the trace of octonion x. In the canonical basis for , the trace is twice the coefficient of the identity element 1 = e_8. The trace and real part are related via RealPart(x) = Trace(x)*One(x)/2. Note that Trace(x) is an element - of LeftActingDomain(A), where A is the octonion algebra - containing x. e := BasisVectors(Basis(OctonionAlgebra(Rationals))); + Func="OctonionAlgebra" />, the trace is twice the coefficient of the identity element + e8. The trace and real part are related via + RealPart(x) = Trace(x)*One(x)/2. + Note that Trace(x) is an element of + LeftActingDomain(A), where A is the octonion algebra + containing x. + e := BasisVectors(Basis(OctonionAlgebra(Rationals))); [ e1, e2, e3, e4, e5, e6, e7, e8 ] gap> List(e, Trace); [ 0, 0, 0, 0, 0, 0, 0, 2 ] @@ -304,10 +296,12 @@ gap> RealToOctonionVector(CanonicalBasis(O), y); - Let x be a vector satisfying IsHomogeneousList and - IsAssociative with elements that satisfy IsCyc, IsQuaternion, or - IsOctonion. Then this function returns the idempotent matrix M/Trace(M) - where M = TransposedMat([ComplexConjugate(x)])*[x]. Oct := OctonionAlgebra(Rationals);; + Let x be a vector satisfying IsHomogeneousList and + IsAssociative with elements that satisfy IsCyc, + IsQuaternion, or IsOctonion. Then this function returns + the idempotent matrix M/Trace(M) where + M = TransposedMat([ComplexConjugate(x)])*[x]. + Oct := OctonionAlgebra(Rationals);; gap> x := Basis(Oct){[8,1,2]}; [ e8, e1, e2 ] gap> y := VectorToIdempotentMatrix(x);; Display(y); @@ -362,9 +356,11 @@ gap> List(b, ImaginaryPart); - Returns the norm of quaternion x. Recall that a quaternion algebra - satisfies the composition property N(xy) = N(x)N(y). In the canonical basis of - QuaternionAlgebra, the norm is the sum of the squares of the coefficients. H := QuaternionAlgebra(Rationals);; + Returns the norm of quaternion x. Recall that a quaternion algebra with + norm N + satisfies the composition property N(xy) = N(x)N(y). In the canonical basis of + QuaternionAlgebra, the norm is the sum of the squares of the coefficients. + H := QuaternionAlgebra(Rationals);; gap> b := BasisVectors(CanonicalBasis(H)); [ e, i, j, k ] gap> List(b, Norm); @@ -378,8 +374,9 @@ true]]> Returns the trace of quaternion x, such that RealPart(x) - = Trace(x)*One(x)/2. In the canonical basis of - QuaternionAlgebra, the trace is twice the coefficient of the identity element. H := QuaternionAlgebra(Rationals);; + = Trace(x)*One(x)/2. In the canonical basis of + QuaternionAlgebra, the trace is twice the coefficient of the identity element. + H := QuaternionAlgebra(Rationals);; gap> b := BasisVectors(CanonicalBasis(H)); [ e, i, j, k ] gap> List(b, Trace); @@ -387,67 +384,17 @@ gap> List(b, Trace); - - - - Hurwitz Integers The HurwitzIntegers are a subring of the quaternion algebra with elements that have the geometry of scaled D_4 lattice. This ring is named - and studied in . - CanonicalBasis(HurwitzIntegers) returns . + CanonicalBasis(HurwitzIntegers) returns . We can test - whether a quaternion is in HurwitzIntegers using the operation - IsHurwitzInt(x). f := BasisVectors(Basis(HurwitzIntegers));; + whether a quaternion is in HurwitzIntegers using the operation + IsHurwitzInt(x). f := BasisVectors(Basis(HurwitzIntegers));; gap> for x in f do Display(x); od; (-1/2)*e+(-1/2)*i+(-1/2)*j+(1/2)*k (-1/2)*e+(-1/2)*i+(1/2)*j+(-1/2)*k @@ -488,42 +435,21 @@ e]]> The Euclidean inner product between any two icosians will be a golden field integer. As described in the references given above, if we define a new inner product between icosians that discards the \sigma-coefficient b then the icosian ring will exhibit the geometry of an E_8 lattice relative to this new inner product. It is also possible to define a Leech lattice geometry on icosian triples.

- The ALCO package provides tools to explore these icosian properties construction certain important lattices using icosians. Note that the golden field can be constructed in ⪆ as NF(5, [ 1, 4 ]) or Field(Sqrt(5)) and that \sigma is equal to -EB(5) in ⪆. - - + The ALCO package provides tools to explore these icosian properties and construct certain important lattices using icosians. Note that the golden field can be constructed in ⪆ as NF(5, [ 1, 4 ]) or Field(Sqrt(5)) and that \sigma is given by -EB(5). Icosian Ring - The IcosianRing is a subring of the the quaternion algebra over - NF(5,[1,4]) generated by a set of vectors with an H_4 geometry. This ring - is described well in . - CanonicalBasis(IcosianRing) returns . We can test whether a + The IcosianRing is a subring of the the quaternion algebra over + NF(5,[1,4]) generated by a set of vectors with an H_4 geometry. This ring + is described well in . + CanonicalBasis(IcosianRing) returns . We can test whether a quaternion is in IcosianRing using the operation IsIcosian(x). - Note that a quaternion is an icosian when it is a &ZZ;-linear combination of the union of - Basis(IcosianRing) and Basis(IcosianRing)*EB(5). f := BasisVectors(Basis(IcosianRing));; + Note that a quaternion is an icosian when it is a &ZZ;-linear combination of the union of + Basis(IcosianRing) and Basis(IcosianRing)*EB(5). + f := BasisVectors(Basis(IcosianRing));; gap> for x in f do Display(x); od; (-1)*i (-1/2*E(5)^2-1/2*E(5)^3)*i+(1/2)*j+(-1/2*E(5)-1/2*E(5)^4)*k @@ -545,12 +471,12 @@ true]]> - + The ALCO package loads this variable as a basis for a quaternion algebra over NF(5,[1,4]). Note that a quaternion is an icosian when it is a &ZZ;-linear combination of the union of - IcosianH4Basis and IcosianH4Basis*EB(5). These basis vectors close - under pairwise reflection or multiplication to form a H_4 set of vectors. f := BasisVectors(IcosianH4Basis);; + IcosianH4Generators and IcosianH4Generators*EB(5). These basis vectors close + under pairwise reflection or multiplication to form a H_4 set of vectors. f := BasisVectors(IcosianH4Generators);; gap> for x in f do Display(x); od; (-1)*i (-1/2*E(5)^2-1/2*E(5)^3)*i+(1/2)*j+(-1/2*E(5)-1/2*E(5)^4)*k @@ -563,7 +489,9 @@ gap> for x in f do Display(x); od; GoldenModSigma For x in the golden field NF(5,[ 1, 4 ]), this - function returns the rational coefficient of 1 in the basis Basis(NF(5,[ 1, 4 ]), [1, (1-Sqrt(5))/2]). sigma := (1-Sqrt(5))/2;; tau := (1+Sqrt(5))/2;; + function returns the rational coefficient of 1 in the basis + Basis(NF(5,[ 1, 4 ]), [1, (1-Sqrt(5))/2]). + sigma := (1-Sqrt(5))/2;; tau := (1+Sqrt(5))/2;; gap> x := 5 + 3*sigma;; GoldenModSigma(x); 5 gap> GoldenModSigma(sigma); @@ -585,10 +513,12 @@ gap> GoldenModSigma(tau); The EisensteinIntegers is a subring of the complex numbers - generated by 1 and E(3). This subring has the geometry of an - A_2 lattice. This ring is described well in 1 and E(3). This subring has the geometry of an + A_2 lattice. This ring is described well in + . We can test whether an element in IsCyc is an - Eisenstein integer using the operation IsEisenInt(x). f := BasisVectors(Basis(EisensteinIntegers)); + Eisenstein integer using the operation IsEisenInt(x). + f := BasisVectors(Basis(EisensteinIntegers)); [ 1, E(3) ] gap> IsEisenInt(E(4)); false @@ -601,9 +531,11 @@ true]]> The KleinianIntegers is a subring of the complex numbers - generated by 1 and (1/2)*(-1+Sqrt(-7)). This ring is described in . We can test whether an element in - IsCyc is an Kleinian integer using the operation IsKleinInt(x). f := BasisVectors(Basis(KleinianIntegers)); + generated by 1 and (1/2)*(-1+Sqrt(-7)). This ring is described in + . We can test whether an element in + IsCyc is an Kleinian integer using the operation + IsKleinInt(x). + f := BasisVectors(Basis(KleinianIntegers)); [ 1, E(7)+E(7)^2+E(7)^4 ] gap> IsKleinInt(E(4)); false @@ -619,17 +551,19 @@ true]]> Simple Euclidean Jordan Algebras A Jordan algebra is a commutative yet - nonassociative algebra with product \circ that satisfies the Jordan identity x\circ - (x^2 \circ y) = x^2 \circ (x\circ y). Given an associative algebra, we can define a + nonassociative algebra with product \circ that satisfies the Jordan identity + x\circ(x^2 \circ y) = x^2 \circ (x\circ y). Given an associative algebra, we can define a Jordan algebra on the same elements using the product x \circ y = (xy + yx)/2. A - Jordan algebra V is Euclidean when there exists an inner product - (x,y) on V that satisfies (x\circ y, z) = (y, x\circ z) for + Jordan algebra V is Euclidean when there exists an inner product + (x,y) on V that satisfies (x\circ y, z) = (y, x\circ z) for all x,y,z in V . Euclidean Jordan algebras are in one-to-one correspondence with structures known as symmetric - cones, and any Euclidean Jordan algebra is the direct sum of simple Euclidean Jordan algebras .

The simple Euclidean Jordan algebras, - in turn, are classified by rank and degree into four families and one exception . The first family consists of rank 2 algebras + cones, and any Euclidean Jordan algebra is the direct sum of simple Euclidean Jordan algebras + .

+ + The simple Euclidean Jordan algebras, + in turn, are classified by rank and degree into four families and one exception + . The first family consists of rank 2 algebras with degree any positive integer. The remaining three families consist Jordan algebras with degree 1, 2, or 4 with rank a positive integer greater than 2. The exceptional algebra has rank 3 and degree 8.

The ALCO package provides a number of tools to @@ -637,14 +571,17 @@ true]]> Key="faraut_analysis_1994" />), including their homotope and isotopes algebras (defined in ). Among other applications, these tools can reproduce many of the examples found in and .

+ Key="elkies_cubic_2001" />. + +
Filters and Basic Attributes Jordan Filters - These filters determine whether an element is a Jordan algebra (IsJordanAlgebra) or is an element in a Jordan algebra (IsJordanAlgebraObj - ). + These filters determine whether an element is a Jordan algebra + (IsJordanAlgebra) or is an element in a Jordan algebra + (IsJordanAlgebraObj). @@ -654,10 +591,13 @@ true]]> The rank of a Jordan algeba is the size of a maximal set of mutually orthogonal primitive idempotents in the algebra. The rank and degree are used to classify the - simple Euclidean Jordan algebras. This method returns the rank of x when - IsJordanAlgebra(x) or the rank of the Jordan algebra containing x (computed as FamilyObj(x)!.fullSCAlgebra) when IsJordanAlgebraObj(x). The method Rank(x) - returns JordanRank(x) when x satisfies either - IsJordanAlgebra or IsJordanAlgebraObj. + simple Euclidean Jordan algebras. This method returns the rank of x when + IsJordanAlgebra(x) or the rank of the Jordan algebra containing + x (computed as FamilyObj(x)!.fullSCAlgebra) when + IsJordanAlgebraObj(x). The method Rank(x) + returns JordanRank(x) when x satisfies either + IsJordanAlgebra or IsJordanAlgebraObj. + @@ -666,12 +606,14 @@ true]]> The degree of a Jordan algebra is the dimension of the off-diagonal entries in a Pierce decomposition of the Jordan algebra. For example, a Jordan algebra of quaternion - hermitian matrices has degree 4. This method returns the degree of x when - IsJordanAlgebra(x) or the degree of the Jordan algebra containing x - (computed as FamilyObj(x)!.fullSCAlgebra) - when IsJordanAlgebraObj(x). The method Degree(x) - returns JordanDegree(x) when x satisfies either - IsJordanAlgebra or IsJordanAlgebraObj. + hermitian matrices has degree 4. This method returns the degree of x when + IsJordanAlgebra(x) or the degree of the Jordan algebra containing + x (computed as FamilyObj(x)!.fullSCAlgebra) + when IsJordanAlgebraObj(x). The method + Degree(x) + returns JordanDegree(x) when x satisfies either + IsJordanAlgebra or IsJordanAlgebraObj. + @@ -704,13 +646,15 @@ true]]> - Returns the generic minimal polynomial of x when - IsJordanAlgebraObj(x) as defined in Returns the generic minimal polynomial of x when + IsJordanAlgebraObj(x) as defined in + (see also ). The output is given as a list of polynomial coefficients. Note that the generic minimal polynomial is a monic polynomial of degree equal to the rank of the Jordan algebra. The trace and determinant of a Jordan algebra element are, to within a sign, given by the coefficients - of the second highest degree term and the constant term. J := AlbertAlgebra(Rationals);; + of the second highest degree term and the constant term. + J := AlbertAlgebra(Rationals);; gap> x := Sum(Basis(J){[4,5,6,25,26,27]}); i4+i5+i6+ei+ej+ek gap> [JordanRank(J), JordanDegree(J)]; @@ -734,25 +678,39 @@ gap> Norm(x);
Jordan Algebra Constructions - The classification of simple Euclidean Jordan algebras is described in . + The classification of simple Euclidean Jordan algebras is described in + . A simple Euclidean Jordan algebra can be constructed in the following two ways. - A rank 2 algebra can be constructed from a positive definite Gram matrix in the manner described in . + A rank 2 algebra can be constructed from a positive definite Gram matrix in the manner described in + . A degree 1, 2, 4, or 8 algebra can be constructed using Hermitian matrices over a composition algebra of dimension equal to the degree with the product (xy+yx)/2. In certain cases both constructions are possible. The ALCO package provides tools to use both constructions to create simple Euclidean Jordan algebras with elements that satisfy IsSCAlgebraObj. - Returns a simple Euclidean Jordan algebra over &QQ;. The construction used depends on the arguments given in the following manner.

- - For Jordan algebras of rank rho equal to 2, the construction is used. - If optional args is empty then the result is JordanSpinFactor(IdentityMat(d+1)). - If optional args is a symmetric matrix of dimension d+1, then JordanSpinFactor(args) is used. - If neither of these rank 2 cases apply, and d is equal to 1,2,4, or 8, and if args is a composition algebra basis, then HermitianSimpleJordanAlgebra(rho, args) is used.

- - In the cases where rank rho is greater than 2, we must have d equal to one of 1, 2, 4, or 8. Note that d equals 8 is only permitted when rho equals 3. + Returns a simple Euclidean Jordan algebra over &QQ;. + The construction used depends on the arguments given in the following manner.

+ + For Jordan algebras of rank rho equal to 2, the + construction is used. + If optional args is empty then the result is + JordanSpinFactor(IdentityMat(d+1)). + If optional args is a symmetric matrix of dimension d+1, then + JordanSpinFactor(args) is used. + If neither of these rank 2 cases apply, and d is equal to 1,2,4, or 8, and if + args is a composition algebra basis, then + HermitianSimpleJordanAlgebra(rho, args) is used.

+ + In the cases where rank rho is greater than 2, we must have + d equal to one of 1, 2, 4, or 8. + Note that d equals 8 is only permitted when rho equals 3. When optional args is a composition algebra basis of dimension d, HermitianSimpleJordanAlgebra(rho, args) is used. - Otherwise, when optional args is empty, this function uses HermitianSimpleJordanAlgebra(rho, B) for B either CanonicalBasis(Rationals), Basis(CF(4), [1, E(4)]), CanonicalBasis(QuaternionAlgebra(Rationals)), or CanonicalBasis(OctonionAlgebra(Rationals)).

+ Otherwise, when optional args is empty, this function uses + HermitianSimpleJordanAlgebra(rho, B) for B either + CanonicalBasis(Rationals), Basis(CF(4), [1, E(4)]), + CanonicalBasis(QuaternionAlgebra(Rationals)), or + CanonicalBasis(OctonionAlgebra(Rationals)).

Note that (in contrast to ) the Hermitian Jordan algebras constructed using SimpleEuclideanJordanAlgebra uses the upper triangular entries of the Hermitian matrices define the basis vectors. J := SimpleEuclideanJordanAlgebra(3,8); @@ -767,7 +725,8 @@ gap> Derivations(Basis(J));; SemiSimpleType(last); Returns a Jordan spin factor algebra when G is a positive definite Gram matrix. This is the Jordan algebra of rank 2 constructed from a symmetric - bilinear form, as described in . J := JordanSpinFactor(IdentityMat(8)); + bilinear form, as described in . + J := JordanSpinFactor(IdentityMat(8)); gap> One(J); v.1 @@ -791,7 +750,8 @@ gap> ValuePol(p,x); Returns a simple Euclidean Jordan algebra of rank r with the - basis for the off-diagonal components defined using composition algebra basis B. J := HermitianSimpleJordanAlgebra(3,QuaternionD4Basis); + basis for the off-diagonal components defined using composition algebra basis B. + J := HermitianSimpleJordanAlgebra(3,QuaternionD4Basis); gap> [JordanRank(J), JordanDegree(J)]; [ 3, 4 ]]]> @@ -800,7 +760,8 @@ gap> [JordanRank(J), JordanDegree(J)]; - For J a Jordan algebra satisfying IsJordanAlgebra(J + For J a Jordan algebra satisfying + IsJordanAlgebra(J ), and for u a vector in J, this function returns the corresponding u-homotope algebra with the product of x and y defined as x(uy)+(xu)y - u(xy). The u-homotope algebra also belongs to @@ -810,7 +771,8 @@ gap> [JordanRank(J), JordanDegree(J)]; then the corresponding u-homotope algebra is called a u-isotope. The optional argument s is a string that determines the labels of the canonical basis vectors in the new algebra. The main definitions and properties of Jordan homotopes and - isotopes are given in . J := SimpleEuclideanJordanAlgebra(2,7); + isotopes are given in . + J := SimpleEuclideanJordanAlgebra(2,7); gap> u := Sum(Basis(J){[1,2,7,8]}); v.1+v.2+v.7+v.8 @@ -833,19 +795,22 @@ gap> One(H); 3 and degree 8. However, that construction uses the upper triangular entries of the Hermitian matrices define the basis vectors (i.e., the [1][2], [2][3], [1][3] entries). Much of the literature on the Albert algebra instead uses the [1][2], [2][3], [3][1] - entries of the Hermitian matrices to define the basis vectors (see for example ). The ALCO package provides a specific construction of the Albert algebra that uses this convention for defining basis vectors, described below. - For F a field, this function returns an Albert algebra over - F. For F = Rationals, this algebra is isomorphic to - HermitianSimpleJordanAlgebra(3,8,Basis(Oct)) but in a basis that is more convenient for - reproducing certain calculations in the literature. Specifically, while - HermitianSimpleJordanAlgebra(3,8,Basis(Oct)) uses the upper-triangular elements of a - Hermitian matrix as representative, AlbertAlgebra(F) uses the [1][2], - [2][3], [3][1] entries as representative. These are respectively labeled using - k,i,j. A := AlbertAlgebra(Rationals); + For F a field, this function returns an Albert algebra over + F. For F = Rationals, this algebra is isomorphic to + HermitianSimpleJordanAlgebra(3,8,Basis(Oct)) but in a basis that is + more convenient for + reproducing certain calculations in the literature. Specifically, while + HermitianSimpleJordanAlgebra(3,8,Basis(Oct)) uses the upper-triangular elements of a + Hermitian matrix as representative, AlbertAlgebra(F) uses the + [1][2], [2][3], [3][1] entries as representative. These are respectively labeled using + k,i,j. + A := AlbertAlgebra(Rationals); gap> i := Basis(A){[1..8]};; gap> j := Basis(A){[9..16]};; @@ -863,8 +828,9 @@ gap> Display(i); Display(j); Display(k); Display(e); For an element x in AlbertAlgebra(Rationals), - this function returns the corresponding 3 x 3 Hermitian matrix with octonion entries in - OctonionAlgebra(Rationals). + this function returns the corresponding 3 x 3 Hermitian matrix with octonion entries in + OctonionAlgebra(Rationals). + @@ -892,10 +858,11 @@ j3]]> For x and y Jordan algebra elements, satisfying IsJordanAlgebraObj this operation applies two methods. - In the case of JordanQuadraticOperator(x, y), this operation returns 2*x*(x*y) - (x^2)*y. + In the case of JordanQuadraticOperator(x, y), this operation returns + 2*x*(x*y) - (x^2)*y. In the case of JordanQuadraticOperator(x), this operation returns the matrix representing the quadratic map in the canonical basis of the Jordan algebra J - containing x. For L(x) the matrix AdjointMatrix(CanonicalBasis(J), x), the operation P(x) returns the matrix 2 L(x)^2 - L(x^2). + containing x. For L(x) the matrix AdjointMatrix(CanonicalBasis(J), x), the operation JordanQuadraticOperator(x) returns the matrix 2 L(x)^2 - L(x^2). J := JordanSpinFactor(IdentityMat(3)); gap> x := [-1,4/3,-1,1]*Basis(J); @@ -909,9 +876,11 @@ gap> JordanQuadraticOperator(x);; Display(last); [ -8/3, 7/9, -8/3, 8/3 ], [ 2, -8/3, -7/9, -2 ], [ -2, 8/3, -2, -7/9 ] ] -gap> LinearCombination(Basis(J), JordanQuadraticOperator(x)*ExtRepOfObj(y)) = JordanQuadraticOperator(x,y); +gap> LinearCombination(Basis(J), JordanQuadraticOperator(x) +> *ExtRepOfObj(y)) = JordanQuadraticOperator(x,y); true -gap> ExtRepOfObj(JordanQuadraticOperator(x,y)) = JordanQuadraticOperator(x)*ExtRepOfObj(y); +gap> ExtRepOfObj(JordanQuadraticOperator(x,y)) = +> JordanQuadraticOperator(x)*ExtRepOfObj(y); true gap> JordanQuadraticOperator(2*x) = 4*JordanQuadraticOperator(x); true]]> @@ -921,7 +890,8 @@ true]]> For Jordan algebra elements x, y, z - satisfying IsJordanAlgebraObj, the operation JordanTripleSystem(x,y,z) + satisfying IsJordanAlgebraObj, the operation + JordanTripleSystem(x,y,z) returns the Jordan triple product defined in terms of the Jordan product as x*(y*z) + (x*y)*z - y*(x*z). Equivalently, 2*JordanTripleSystem(x,y,z) is equal to @@ -956,9 +926,9 @@ gap> List(e, x -> JordanTripleSystem(i[1],i[1],x)); Returns a set of Hermitian matrices to serve as a basis for the Jordan - algebra with or rank r and degree given by the cardinality of composition algebra - basis B. The elements spanning each off-diagonal components are determined by basis - B. H := QuaternionAlgebra(Rationals);; + algebra of rank r and degree given by the cardinality of composition algebra + basis B. The elements spanning each off-diagonal components are determined by basis + B. H := QuaternionAlgebra(Rationals);; gap> for x in HermitianJordanAlgebraBasis(2, Basis(H)) do Display(x); od; [ [ e, 0*e ], [ 0*e, 0*e ] ] @@ -980,7 +950,7 @@ gap> AsList(Basis(H)); If IsJordanAlgebra( J ) and J has been - constructed using a matrix basis, then the set of matrices corresponding to + constructed using , then the set of matrices corresponding to CanonicalBasis( J ) can be obtained using JordanMatrixBasis( J ). @@ -988,8 +958,8 @@ gap> AsList(Basis(H)); - Converts matrix mat into an element of Jordan algebra J - . + Converts matrix mat into an element of Jordan algebra + J. H := QuaternionAlgebra(Rationals);; gap> J := HermitianSimpleJordanAlgebra(2,Basis(H)); @@ -1015,10 +985,12 @@ gap> List(JordanMatrixBasis(J), x -> HermitianMatrixToJordanVector(x, J)); - For IsJordanAlgebra( J ), returns the Gram matrix on - CanonicalBasis( J ) using inner product Trace(x*y). J := HermitianSimpleJordanAlgebra(2,OctonionE8Basis); + For IsJordanAlgebra( J ), returns the Gram matrix on + CanonicalBasis( J ) using inner product Trace(x*y). + J := HermitianSimpleJordanAlgebra(2,OctonionE8Basis); -gap> List(Basis(J), x -> List(Basis(J), y -> Trace(x*y))) = JordanAlgebraGramMatrix(J); +gap> List(Basis(J), x -> List(Basis(J), y -> Trace(x*y))) = +> JordanAlgebraGramMatrix(J); true gap> DiagonalOfMat(JordanAlgebraGramMatrix(J)); [ 1, 1, 2, 2, 2, 2, 2, 2, 2, 2 ]]]> @@ -1381,7 +1353,9 @@ gap> DesignIndicatorCoefficients(D); The t-design is a design with the following special property: the integral of any degree t polynomial over the sphere or projective space containing the design is equal to the average value of that polynomial - evaluated at the points of the t-design. + evaluated at the points of the t-design (see + and + for detailed definitions). The parameter t is called the strength of the design.

For a design D that satisfies IsDesignWithPositiveIndicatorCoefficients, IsDesignWithCardinality, and IsSpecialBoundDesign, we can compute the @@ -1407,7 +1381,7 @@ gap> DesignStrength(D); These filters identify various special categories of designs that satisfy . In what follows recall that t denotes the strength - of the design and s denotes the cardinality of the angle set A. + of the design and s denotes the cardinality of the angle set A. The definitions below are provided in .

A design admits a regular scheme when t \ge s - 1 . The filter @@ -1434,8 +1408,9 @@ gap> DesignStrength(D); - For a design D with cardinality and angle set that satisfies - IsRegularSchemeDesign, namely t \ge s - 1, we can compute the regular + For a design D with cardinality and angle set that satisfies + IsRegularSchemeDesign, namely t \ge s - 1, + we can compute the regular subdegrees as described in . The subdegrees count the number of elements forming each angle with some representative element in the design. @@ -1461,14 +1436,17 @@ gap> DesignSubdegrees(D); define the corresponding Bose-Mesner algebra . The canonical basis for this algebra corresponds to the adjacency matrices A_i, with the s+1-th basis vector corresponding to A_0. + The adjacenty matrices themselves are not provided and the algebra is constructed from the known + structure constants so that elements of this algebra satisfy IsSCAlgebraObj. D := DesignByAngleSet(4, 4, [1/3, 1/9]);; DesignAddCardinality(D, 64);; D; <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]> gap> B := DesignBoseMesnerAlgebra(D); gap> BasisVectors(CanonicalBasis(B)); [ A1, A2, A3 ] -gap> One(B); -A3]]> +gap> One(B); IsSCAlgebraObj(last); +A3 +true]]> @@ -1775,7 +1753,7 @@ gap> DesignAddCardinality(last, DesignSpecialBound(last)); Octonion Lattice Constructions An octonion vector is a tuple of octonions. Vector addition and scalar multiplication are - define in the usual way, as component-wise addition and multiplication by the scalar. + 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.

@@ -1800,7 +1778,8 @@ gap> DesignAddCardinality(last, DesignSpecialBound(last)); When the inner product is real-valued, the Gram matrix of a lattice basis must be a positive definite symmetric matrix (see ). Certain important lattices may be identified using a Gram matrix of that lattice. - The ALCO package + The ALCO package provides the following tools to identify a Gosset or Leech + lattice Gram matrix. @@ -1866,7 +1845,7 @@ true]]> As described above, an octonion lattice is a free left &ZZ;-module generated by a finite set - of octonion vectors equipped some octonion vector norm. + 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. @@ -1896,12 +1875,12 @@ true]]> - This function returns an free left module that satisfies . + This function returns a free left module that satisfies . 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 square matrix that defaults to half the identity matrix. + 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])) @@ -2005,7 +1984,7 @@ gap> KnownAttributesOfObject(O3); When L satisfies IsOctonionLattice(L), this attribute - stores converts the lattice generators, GeneratorsOfLeftOperatorAdditiveGroup(L), + 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 that defaults to @@ -2079,8 +2058,8 @@ gap> KnownAttributesOfObject(O3); When L satisfies IsOctonionLattice(L), these attributes - stores the lattice dimension, also known as rank. This is calculated by finding the - number of vectors in LLLReducedBasisCoefficients(L). + store the lattice dimension, also known as rank. This is calculated by evaluating + Rank( GeneratorsAsCoefficients(L) ). Dimension(O3); 24 gap> Rank(O3); @@ -2093,7 +2072,7 @@ gap> Rank(O3); When L satisfies IsOctonionLattice(L), this attribute stores the Gram matrix defined by the basis stored using the - attribute and the inner producte defined on the lattice by + attribute and the inner product defined on the lattice by . g := 2*GramMatrix(O3);; gap> DimensionsMat(g); @@ -2115,7 +2094,7 @@ gap> DeterminantMat(g); The attributes Basis(L) and CanonicalBasis(L) are equivalent and satisfy the filter IsOctonionLatticeBasis. The attribute BasisVectors returns the vectors stored in the attribute - converted into octonion triples using + converted into octonion vectors using RealToOctonionVector(UnderlyingOctonionRingBasis(L), x) for each x in LLLReducedBasisCoefficients(L). IsOctonionLatticeBasis(Basis(O3)); @@ -2196,7 +2175,8 @@ true]]> this operation returns Trace(x*OctonionGramMatrix(L)*ComplexConjugate(y)). Here the trace is the method acting on an octonion - argument (corresponding to twice the real part, or identity coefficient, of the 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 @@ -2228,8 +2208,6 @@ true]]> 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. s := LinearCombination(OctonionE8Basis, [ 1, 2, 1, 2, 2, 2, 2, 1 ]);; @@ -2300,11 +2278,12 @@ Basis( , [ (-1/2)*e+(-1/2)*i+(-1/2)*j+(1/2)*k, (-1/2)*e+(-1/2)*i+(1/2)*j+(-1/2)*k, (-1/2)*e+(1/2)*i+(-1/2)*j+(-1/2)*k, e ] ) gap> Closure(QuaternionD4Basis,\*); -[ (-1)*e, (-1/2)*e+(-1/2)*i+(-1/2)*j+(-1/2)*k, (-1/2)*e+(-1/2)*i+(-1/2)*j+(1/2)*k, - (-1/2)*e+(-1/2)*i+(1/2)*j+(-1/2)*k, (-1/2)*e+(-1/2)*i+(1/2)*j+(1/2)*k, - (-1/2)*e+(1/2)*i+(-1/2)*j+(-1/2)*k, (-1/2)*e+(1/2)*i+(-1/2)*j+(1/2)*k, - (-1/2)*e+(1/2)*i+(1/2)*j+(-1/2)*k, (-1/2)*e+(1/2)*i+(1/2)*j+(1/2)*k, (-1)*i, (-1)*j, - (-1)*k, k, j, i, (1/2)*e+(-1/2)*i+(-1/2)*j+(-1/2)*k, (1/2)*e+(-1/2)*i+(-1/2)*j+(1/2)*k, +[ (-1)*e, (-1/2)*e+(-1/2)*i+(-1/2)*j+(-1/2)*k, + (-1/2)*e+(-1/2)*i+(-1/2)*j+(1/2)*k, (-1/2)*e+(-1/2)*i+(1/2)*j+(-1/2)*k, + (-1/2)*e+(-1/2)*i+(1/2)*j+(1/2)*k, (-1/2)*e+(1/2)*i+(-1/2)*j+(-1/2)*k, + (-1/2)*e+(1/2)*i+(-1/2)*j+(1/2)*k, (-1/2)*e+(1/2)*i+(1/2)*j+(-1/2)*k, + (-1/2)*e+(1/2)*i+(1/2)*j+(1/2)*k, (-1)*i, (-1)*j, (-1)*k, k, j, i, + (1/2)*e+(-1/2)*i+(-1/2)*j+(-1/2)*k, (1/2)*e+(-1/2)*i+(-1/2)*j+(1/2)*k, (1/2)*e+(-1/2)*i+(1/2)*j+(-1/2)*k, (1/2)*e+(-1/2)*i+(1/2)*j+(1/2)*k, (1/2)*e+(1/2)*i+(-1/2)*j+(-1/2)*k, (1/2)*e+(1/2)*i+(-1/2)*j+(1/2)*k, (1/2)*e+(1/2)*i+(1/2)*j+(-1/2)*k, (1/2)*e+(1/2)*i+(1/2)*j+(1/2)*k, e ]]]> @@ -2316,7 +2295,9 @@ gap> Closure(QuaternionD4Basis,\*); Random Choice Methods In many cases the function is impractical to use due to the long computation time of the brute force method. The following functions provide tools to generate more elements of a set under a binary operation - without directly proving closure. + without directly proving closure. + + For gens satisfying IsHomogeneousList, this function selects a random element r in gens and computes all elements of the form @@ -2330,7 +2311,10 @@ gap> Closure(QuaternionD4Basis,\*); in interpreting the output. Even for large values of N, the result is not necessarily the full closure of set gens. Furthermore, repeated calls to this function may result in different outputs due to the random selection of elements involved - throughout. start := Basis(QuaternionAlgebra(Rationals)){[2,3]}; + throughout. + If the size of the expected closed set is known, use of a repeat-until loop can + permit generating the full set of elements faster than would. + start := Basis(QuaternionAlgebra(Rationals)){[2,3]}; [ i, j ] gap> repeat > start := RandomClosure(start, \*); @@ -2350,8 +2334,8 @@ gap> start; elements is computed. Once the cardinality is fixed for N + 1 steps, the function returns the set of generated elements.

The same cautions as described in apply. Note that while start is always a subset of - the output, Difference(gens,start) is not a subset of the - output. start := Basis(QuaternionAlgebra(Rationals)){[1,2]}; + the output, the elements of gens are not necessarily included in the output. + start := Basis(QuaternionAlgebra(Rationals)){[1,2]}; [ e, i ] gap> gens := Basis(QuaternionAlgebra(Rationals)){[3]}; [ j ] diff --git a/lib/alco.gd b/lib/alco.gd index 67d7e74..be2ad31 100644 --- a/lib/alco.gd +++ b/lib/alco.gd @@ -68,7 +68,7 @@ DeclareGlobalFunction( "GoldenIrrationalComponent" ); DeclareGlobalFunction( "GoldenModSigma" ); -DeclareGlobalVariable( "IcosianH4Basis" ); +DeclareGlobalVariable( "IcosianH4Generators" ); DeclareOperation("IsIcosian", [ IsQuaternion ] ); diff --git a/lib/alco.gi b/lib/alco.gi index 8a32e88..8870613 100644 --- a/lib/alco.gi +++ b/lib/alco.gi @@ -244,7 +244,7 @@ InstallGlobalFunction( GoldenModSigma, function(q) return Coefficients(Basis(NF(5,[1,4]), [1, (1-Sqrt(5))/2]), q)[1]; end ); -InstallValue( IcosianH4Basis, Basis(QuaternionAlgebra(Field(Sqrt(5))), +InstallValue( IcosianH4Generators, Basis(QuaternionAlgebra(Field(Sqrt(5))), List([ [ 0, -1, 0, 0 ], [ 0, -1/2*E(5)^2-1/2*E(5)^3, 1/2, -1/2*E(5)-1/2*E(5)^4 ], [ 0, 0, -1, 0 ], @@ -263,8 +263,8 @@ SetName( IcosianRing, "IcosianRing" ); SetString( IcosianRing, "IcosianRing" ); SetIsLeftActedOnByDivisionRing( IcosianRing, false ); SetSize( IcosianRing, infinity ); -SetGeneratorsOfRing( IcosianRing, AsList(IcosianH4Basis)); -SetGeneratorsOfLeftModule( IcosianRing, AsList(IcosianH4Basis) ); +SetGeneratorsOfRing( IcosianRing, AsList(IcosianH4Generators)); +SetGeneratorsOfLeftModule( IcosianRing, AsList(IcosianH4Generators) ); SetIsWholeFamily( IcosianRing, false ); SetIsAssociative( IcosianRing, false ); @@ -310,7 +310,7 @@ InstallMethod( CanonicalBasis, rec() ); SetUnderlyingLeftModule( B, IcosianRing ); SetIsIntegralBasis( B, true ); - SetBasisVectors( B, Immutable( BasisVectors(IcosianH4Basis))); + SetBasisVectors( B, Immutable( BasisVectors(IcosianH4Generators))); # Return the basis. return B; end ); diff --git a/makedoc.g b/makedoc.g index cfcc953..fcd3b3a 100644 --- a/makedoc.g +++ b/makedoc.g @@ -28,3 +28,5 @@ AutoDoc(rec( )); # Test("./tst/alco06.tst", rec(transformFunction := NormalizedWhitespace)); + +FORCE_QUIT_GAP(); \ No newline at end of file diff --git a/tst/alco01.tst b/tst/alco01.tst index 1dcd4ad..ff356e4 100644 --- a/tst/alco01.tst +++ b/tst/alco01.tst @@ -27,7 +27,7 @@ gap> Display(g); gap> IsGossetLatticeGramMatrix(g); true -# doc/ALCO.xml:45-55 +# doc/ALCO.xml:46-56 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)); @@ -40,7 +40,7 @@ gap> L := OctonionLatticeByGenerators(gens, One(O)*IdentityMat(3)/2); gap> IsLeechLatticeGramMatrix(GramMatrix(L)); true -# doc/ALCO.xml:55-78 +# doc/ALCO.xml:56-79 gap> J := AlbertAlgebra(Rationals); gap> SemiSimpleType(Derivations(Basis(J))); @@ -53,8 +53,8 @@ gap> k := Basis(J){[17..24]}; [ k1, k2, k3, k4, k5, k6, k7, k8 ] gap> e := Basis(J){[25..27]}; [ ei, ej, ek ] -gap> List(e, IsIdempotent); -[ true, true, true ] +gap> ForAll(e, IsIdempotent); +true gap> Set(i, x -> x^2); [ ej+ek ] gap> Set(j, x -> x^2); diff --git a/tst/alco02.tst b/tst/alco02.tst index b414cba..de432c9 100644 --- a/tst/alco02.tst +++ b/tst/alco02.tst @@ -10,7 +10,7 @@ # gap> START_TEST("alco02.tst"); -# doc/ALCO.xml:137-154 +# doc/ALCO.xml:140-157 gap> O := OctonionAlgebra(Rationals); gap> LeftActingDomain(O); @@ -30,7 +30,7 @@ gap> Derivations(Basis(O)); gap> SemiSimpleType(last); "G2" -# doc/ALCO.xml:167-180 +# doc/ALCO.xml:171-184 gap> a := BasisVectors(Basis(OctavianIntegers));; gap> for x in a do Display(x); od; (-1/2)*e1+(1/2)*e5+(1/2)*e6+(1/2)*e7 @@ -46,16 +46,15 @@ true gap> ForAll(a/2, IsOctavianInt); false -# doc/ALCO.xml:190-196 +# doc/ALCO.xml:195-200 gap> BasisVectors(OctonionE8Basis) = BasisVectors(Basis(OctavianIntegers)); true -gap> g := List(OctonionE8Basis, x -> -> List(OctonionE8Basis, y -> +gap> g := List(OctonionE8Basis, x -> List(OctonionE8Basis, y -> > Norm(x+y) - Norm(x) - Norm(y)));; gap> IsGossetLatticeGramMatrix(g); true -# doc/ALCO.xml:230-235 +# doc/ALCO.xml:218-223 gap> Oct := OctonionAlgebra(Rationals);; gap> List(Basis(Oct), Norm); [ 1, 1, 1, 1, 1, 1, 1, 1 ] @@ -63,7 +62,7 @@ gap> x := Random(Oct);; y := Random(Oct);; gap> Norm(x*y) = Norm(x)*Norm(y); true -# doc/ALCO.xml:244-249 +# doc/ALCO.xml:236-241 gap> e := BasisVectors(Basis(OctonionAlgebra(Rationals))); [ e1, e2, e3, e4, e5, e6, e7, e8 ] gap> List(e, Trace); @@ -71,19 +70,19 @@ gap> List(e, Trace); gap> List(e, RealPart); [ 0*e1, 0*e1, 0*e1, 0*e1, 0*e1, 0*e1, 0*e1, e8 ] -# doc/ALCO.xml:258-261 +# doc/ALCO.xml:250-253 gap> e := BasisVectors(Basis(OctonionAlgebra(Rationals))); [ e1, e2, e3, e4, e5, e6, e7, e8 ] gap> List(e, ComplexConjugate); [ (-1)*e1, (-1)*e2, (-1)*e3, (-1)*e4, (-1)*e5, (-1)*e6, (-1)*e7, e8 ] -# doc/ALCO.xml:269-272 +# doc/ALCO.xml:261-264 gap> e := BasisVectors(Basis(OctonionAlgebra(Rationals))); [ e1, e2, e3, e4, e5, e6, e7, e8 ] gap> List(e, RealPart); [ 0*e1, 0*e1, 0*e1, 0*e1, 0*e1, 0*e1, 0*e1, e8 ] -# doc/ALCO.xml:292-301 +# doc/ALCO.xml:284-293 gap> O := UnderlyingLeftModule(OctonionE8Basis); gap> BasisVectors(CanonicalBasis(O)); @@ -95,7 +94,7 @@ gap> y := OctonionToRealVector(CanonicalBasis(O), x); gap> RealToOctonionVector(CanonicalBasis(O), y); [ (-1)*e1+e5+e6+e7, (-1)*e1+(-1)*e2+(-1)*e4+(-1)*e7 ] -# doc/ALCO.xml:310-318 +# doc/ALCO.xml:304-312 gap> Oct := OctonionAlgebra(Rationals);; gap> x := Basis(Oct){[8,1,2]}; [ e8, e1, e2 ] @@ -106,11 +105,11 @@ gap> y := VectorToIdempotentMatrix(x);; Display(y); gap> IsIdempotent(y); true -# doc/ALCO.xml:330-331 +# doc/ALCO.xml:324-325 gap> WeylReflection([1,0,1],[0,1,1]); [ -1, 1, 0 ] -# doc/ALCO.xml:341-360 +# doc/ALCO.xml:335-354 gap> H := QuaternionAlgebra(Rationals); gap> IsQuaternion(Random(H)); @@ -132,7 +131,7 @@ gap> List(b, RealPart); gap> List(b, ImaginaryPart); [ 0*e, e, k, (-1)*j ] -# doc/ALCO.xml:367-374 +# doc/ALCO.xml:363-370 gap> H := QuaternionAlgebra(Rationals);; gap> b := BasisVectors(CanonicalBasis(H)); [ e, i, j, k ] @@ -142,14 +141,14 @@ gap> x := Random(H);; y := Random(H);; gap> Norm(x*y) = Norm(x)*Norm(y); true -# doc/ALCO.xml:382-386 +# doc/ALCO.xml:379-383 gap> H := QuaternionAlgebra(Rationals);; gap> b := BasisVectors(CanonicalBasis(H)); [ e, i, j, k ] gap> List(b, Trace); [ 2, 0, 0, 0 ] -# doc/ALCO.xml:450-459 +# doc/ALCO.xml:397-406 gap> f := BasisVectors(Basis(HurwitzIntegers));; gap> for x in f do Display(x); od; (-1/2)*e+(-1/2)*i+(-1/2)*j+(1/2)*k @@ -161,7 +160,7 @@ true gap> ForAll(f/2, IsHurwitzInt); false -# doc/ALCO.xml:469-474 +# doc/ALCO.xml:416-421 gap> B := QuaternionD4Basis;; gap> for x in BasisVectors(B) do Display(x); od; (-1/2)*e+(-1/2)*i+(-1/2)*j+(1/2)*k @@ -169,7 +168,7 @@ gap> for x in BasisVectors(B) do Display(x); od; (-1/2)*e+(1/2)*i+(-1/2)*j+(-1/2)*k e -# doc/ALCO.xml:526-543 +# doc/ALCO.xml:452-469 gap> f := BasisVectors(Basis(IcosianRing));; gap> for x in f do Display(x); od; (-1)*i @@ -189,15 +188,15 @@ true gap> ForAll(f*(1+Sqrt(5))/2, IsIcosian); true -# doc/ALCO.xml:553-558 -gap> f := BasisVectors(IcosianH4Basis);; +# doc/ALCO.xml:479-484 +gap> f := BasisVectors(IcosianH4Generators);; gap> for x in f do Display(x); od; (-1)*i (-1/2*E(5)^2-1/2*E(5)^3)*i+(1/2)*j+(-1/2*E(5)-1/2*E(5)^4)*k (-1)*j (-1/2*E(5)-1/2*E(5)^4)*e+(1/2)*j+(-1/2*E(5)^2-1/2*E(5)^3)*k -# doc/ALCO.xml:566-572 +# doc/ALCO.xml:494-500 gap> sigma := (1-Sqrt(5))/2;; tau := (1+Sqrt(5))/2;; gap> x := 5 + 3*sigma;; GoldenModSigma(x); 5 @@ -206,7 +205,7 @@ gap> GoldenModSigma(sigma); gap> GoldenModSigma(tau); 1 -# doc/ALCO.xml:591-596 +# doc/ALCO.xml:521-526 gap> f := BasisVectors(Basis(EisensteinIntegers)); [ 1, E(3) ] gap> IsEisenInt(E(4)); @@ -214,7 +213,7 @@ false gap> IsEisenInt(1+E(3)^2); true -# doc/ALCO.xml:606-611 +# doc/ALCO.xml:538-543 gap> f := BasisVectors(Basis(KleinianIntegers)); [ 1, E(7)+E(7)^2+E(7)^4 ] gap> IsKleinInt(E(4)); diff --git a/tst/alco03.tst b/tst/alco03.tst index abbdf78..1e6401c 100644 --- a/tst/alco03.tst +++ b/tst/alco03.tst @@ -10,7 +10,7 @@ # gap> START_TEST("alco03.tst"); -# doc/ALCO.xml:713-727 +# doc/ALCO.xml:657-671 gap> J := AlbertAlgebra(Rationals);; gap> x := Sum(Basis(J){[4,5,6,25,26,27]}); i4+i5+i6+ei+ej+ek @@ -27,13 +27,13 @@ gap> Determinant(x); gap> Norm(x); 9/2 -# doc/ALCO.xml:758-761 +# doc/ALCO.xml:716-719 gap> J := SimpleEuclideanJordanAlgebra(3,8); gap> Derivations(Basis(J));; SemiSimpleType(last); "F4" -# doc/ALCO.xml:770-787 +# doc/ALCO.xml:729-746 gap> J := JordanSpinFactor(IdentityMat(8)); gap> One(J); @@ -53,13 +53,13 @@ gap> p := GenericMinimalPolynomial(x); gap> ValuePol(p,x); 0*v.1 -# doc/ALCO.xml:794-797 +# doc/ALCO.xml:754-757 gap> J := HermitianSimpleJordanAlgebra(3,QuaternionD4Basis); gap> [JordanRank(J), JordanDegree(J)]; [ 3, 4 ] -# doc/ALCO.xml:813-824 +# doc/ALCO.xml:775-786 gap> J := SimpleEuclideanJordanAlgebra(2,7); gap> u := Sum(Basis(J){[1,2,7,8]}); @@ -73,7 +73,7 @@ gap> H := JordanHomotope(J, u, "w."); gap> One(H); (-1/2)*w.1+(1/2)*w.2+(1/2)*w.7+(1/2)*w.8 -# doc/ALCO.xml:848-858 +# doc/ALCO.xml:813-823 gap> A := AlbertAlgebra(Rationals); gap> i := Basis(A){[1..8]};; @@ -86,7 +86,7 @@ gap> Display(i); Display(j); Display(k); Display(e); [ k1, k2, k3, k4, k5, k6, k7, k8 ] [ ei, ej, ek ] -# doc/ALCO.xml:872-879 +# doc/ALCO.xml:838-845 gap> j := Basis(AlbertAlgebra(Rationals)){[9..16]}; [ j1, j2, j3, j4, j5, j6, j7, j8 ] gap> mat := AlbertVectorToHermitianMatrix(j[3]);; Display(mat); @@ -96,7 +96,7 @@ gap> mat := AlbertVectorToHermitianMatrix(j[3]);; Display(mat); gap> HermitianMatrixToAlbertVector(mat); j3 -# doc/ALCO.xml:899-917 +# doc/ALCO.xml:866-886 gap> J := JordanSpinFactor(IdentityMat(3)); gap> x := [-1,4/3,-1,1]*Basis(J); @@ -110,14 +110,16 @@ gap> JordanQuadraticOperator(x);; Display(last); [ -8/3, 7/9, -8/3, 8/3 ], [ 2, -8/3, -7/9, -2 ], [ -2, 8/3, -2, -7/9 ] ] -gap> LinearCombination(Basis(J), JordanQuadraticOperator(x)*ExtRepOfObj(y)) = JordanQuadraticOperator(x,y); +gap> LinearCombination(Basis(J), JordanQuadraticOperator(x) +> *ExtRepOfObj(y)) = JordanQuadraticOperator(x,y); true -gap> ExtRepOfObj(JordanQuadraticOperator(x,y)) = JordanQuadraticOperator(x)*ExtRepOfObj(y); +gap> ExtRepOfObj(JordanQuadraticOperator(x,y)) = +> JordanQuadraticOperator(x)*ExtRepOfObj(y); true gap> JordanQuadraticOperator(2*x) = 4*JordanQuadraticOperator(x); true -# doc/ALCO.xml:929-946 +# doc/ALCO.xml:899-916 gap> J := AlbertAlgebra(Rationals); gap> i := Basis(J){[1..8]}; @@ -137,7 +139,7 @@ gap> List(k, x -> 2*JordanTripleSystem(i[1],i[1],x)); gap> List(e, x -> JordanTripleSystem(i[1],i[1],x)); [ 0*i1, ej, ek ] -# doc/ALCO.xml:961-976 +# doc/ALCO.xml:931-946 gap> H := QuaternionAlgebra(Rationals);; gap> for x in HermitianJordanAlgebraBasis(2, Basis(H)) do Display(x); od; [ [ e, 0*e ], @@ -155,7 +157,7 @@ gap> for x in HermitianJordanAlgebraBasis(2, Basis(H)) do Display(x); od; gap> AsList(Basis(H)); [ e, i, j, k ] -# doc/ALCO.xml:993-1012 +# doc/ALCO.xml:963-982 gap> H := QuaternionAlgebra(Rationals);; gap> J := HermitianSimpleJordanAlgebra(2,Basis(H)); @@ -177,10 +179,11 @@ gap> JordanMatrixBasis(J);; for x in last do Display(x); od; gap> List(JordanMatrixBasis(J), x -> HermitianMatrixToJordanVector(x, J)); [ v.1, v.2, v.3, v.4, v.5, v.6 ] -# doc/ALCO.xml:1019-1024 +# doc/ALCO.xml:990-996 gap> J := HermitianSimpleJordanAlgebra(2,OctonionE8Basis); -gap> List(Basis(J), x -> List(Basis(J), y -> Trace(x*y))) = JordanAlgebraGramMatrix(J); +gap> List(Basis(J), x -> List(Basis(J), y -> Trace(x*y))) = +> JordanAlgebraGramMatrix(J); true gap> DiagonalOfMat(JordanAlgebraGramMatrix(J)); [ 1, 1, 2, 2, 2, 2, 2, 2, 2, 2 ] diff --git a/tst/alco04.tst b/tst/alco04.tst index 19db62e..809ba89 100644 --- a/tst/alco04.tst +++ b/tst/alco04.tst @@ -10,7 +10,7 @@ # gap> START_TEST("alco04.tst"); -# doc/ALCO.xml:1084-1092 +# doc/ALCO.xml:1056-1064 gap> a := Indeterminate(Rationals, "a");; gap> b := Indeterminate(Rationals, "b");; gap> x := Indeterminate(Rationals, "x");; @@ -21,7 +21,7 @@ gap> JacobiPolynomial(1,a,b); gap> ValuePol(last,x); 1/2*a*x+1/2*b*x+1/2*a-1/2*b+x -# doc/ALCO.xml:1127-1138 +# doc/ALCO.xml:1099-1110 gap> D := DesignByJordanParameters(3,8); gap> IsDesign(D); @@ -35,13 +35,13 @@ fail gap> DesignByJordanParameters(3,9); fail -# doc/ALCO.xml:1147-1150 +# doc/ALCO.xml:1119-1122 gap> D := DesignByJordanParameters(3,8); gap> [DesignJordanRank(D), DesignJordanDegree(D)]; [ 3, 8 ] -# doc/ALCO.xml:1159-1168 +# doc/ALCO.xml:1131-1140 gap> D := DesignByJordanParameters(3,8); gap> r := DesignJordanRank(D);; d := DesignJordanDegree(D);; @@ -53,7 +53,7 @@ gap> DesignQPolynomials(D)(2); gap> CoefficientsOfUnivariatePolynomial(Q_k_epsilon(2,0,r,d,x)); [ 90, -585, 819 ] -# doc/ALCO.xml:1179-1193 +# doc/ALCO.xml:1151-1165 gap> D := DesignByJordanParameters(3,8); gap> DesignConnectionCoefficients(D); @@ -70,7 +70,7 @@ gap> for j in [1..4] do Display(Sum(List([1..4], i -> [ 0, 0, 1, 0 ] [ 0, 0, 0, 1 ] -# doc/ALCO.xml:1224-1233 +# doc/ALCO.xml:1196-1205 gap> D := DesignByJordanParameters(4,4); gap> DesignAddAngleSet(D, [2]); @@ -82,13 +82,13 @@ gap> DesignAddAngleSet(D, [1/3,1/9]); gap> DesignAngleSet(D); [ 1/9, 1/3 ] -# doc/ALCO.xml:1241-1244 +# doc/ALCO.xml:1213-1216 gap> D := DesignByAngleSet(4, 4, [1/3, 1/9]); gap> DesignAngleSet(D); [ 1/9, 1/3 ] -# doc/ALCO.xml:1254-1263 +# doc/ALCO.xml:1226-1235 gap> D := DesignByAngleSet(4, 4, [1/3, 1/9]); gap> p := DesignNormalizedAnnihilatorPolynomial(D); @@ -100,7 +100,7 @@ gap> ValuePol(p, 1/3); gap> ValuePol(p, 1); 1 -# doc/ALCO.xml:1273-1280 +# doc/ALCO.xml:1245-1252 gap> D := DesignByAngleSet(4, 4, [1/3, 1/9]); gap> f := DesignNormalizedIndicatorCoefficients(D); @@ -110,7 +110,7 @@ gap> Sum(List([1..3], i -> f[i]*DesignQPolynomials(D)(i-1))); gap> DesignNormalizedAnnihilatorPolynomial(D); [ 1/16, -3/4, 27/16 ] -# doc/ALCO.xml:1298-1303 +# doc/ALCO.xml:1270-1275 gap> D := DesignByAngleSet(4, 4, [1/3,1/9]); gap> IsDesignWithPositiveIndicatorCoefficients(D); @@ -118,7 +118,7 @@ true gap> DesignSpecialBound(D); 64 -# doc/ALCO.xml:1325-1332 +# doc/ALCO.xml:1297-1304 gap> D := DesignByAngleSet(4,4, [1/3,1/9]); gap> HasDesignCardinality(D); @@ -128,7 +128,7 @@ gap> DesignAddCardinality(D, 64); gap> DesignCardinality(D); 64 -# doc/ALCO.xml:1353-1359 +# doc/ALCO.xml:1325-1331 gap> D := DesignByAngleSet(4, 4, [1/3, 1/9]);; gap> DesignAddCardinality(D, 64);; D; <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]> @@ -137,13 +137,13 @@ gap> DesignAnnihilatorPolynomial(D); gap> ValuePol(last, 1); 64 -# doc/ALCO.xml:1369-1372 +# doc/ALCO.xml:1341-1344 gap> D := DesignByAngleSet(4, 4, [1/3, 1/9]);; DesignAddCardinality(D, 64);; D; <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]> gap> DesignIndicatorCoefficients(D); [ 1, 7/15, 9/55 ] -# doc/ALCO.xml:1392-1399 +# doc/ALCO.xml:1366-1373 gap> D := DesignByAngleSet(4,4, [1/3,1/9]); gap> DesignAddCardinality(D, 64); @@ -153,23 +153,24 @@ true gap> DesignStrength(D); 2 -# doc/ALCO.xml:1444-1447 +# doc/ALCO.xml:1419-1422 gap> D := DesignByAngleSet(4, 4, [1/3, 1/9]);; DesignAddCardinality(D, 64);; D; <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]> gap> DesignSubdegrees(D); [ 27, 36 ] -# doc/ALCO.xml:1464-1471 +# doc/ALCO.xml:1441-1449 gap> D := DesignByAngleSet(4, 4, [1/3, 1/9]);; DesignAddCardinality(D, 64);; D; <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]> gap> B := DesignBoseMesnerAlgebra(D); gap> BasisVectors(CanonicalBasis(B)); [ A1, A2, A3 ] -gap> One(B); +gap> One(B); IsSCAlgebraObj(last); A3 +true -# doc/ALCO.xml:1480-1488 +# doc/ALCO.xml:1458-1466 gap> D := DesignByAngleSet(4, 4, [1/3, 1/9]);; DesignAddCardinality(D, 64);; D; <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]> gap> for x in BasisVectors(DesignBoseMesnerIdempotentBasis(D)) do Display(x); @@ -180,7 +181,7 @@ gap> for x in BasisVectors(DesignBoseMesnerIdempotentBasis(D)) do Display(x); gap> ForAll(DesignBoseMesnerIdempotentBasis(D), IsIdempotent); true -# doc/ALCO.xml:1500-1505 +# doc/ALCO.xml:1478-1483 gap> D := DesignByAngleSet(4, 4, [1/3, 1/9]);; DesignAddCardinality(D, 64);; D; <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]> gap> A := BasisVectors(Basis(DesignBoseMesnerAlgebra(D)));; @@ -188,7 +189,7 @@ gap> p := DesignIntersectionNumbers(D);; gap> A[1]*A[2] = Sum(List([1..3]), k -> p[k][1][2]*A[k]); true -# doc/ALCO.xml:1519-1526 +# doc/ALCO.xml:1497-1504 gap> D := DesignByAngleSet(4, 4, [1/3, 1/9]);; DesignAddCardinality(D, 64);; D; <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]> gap> q := DesignKreinNumbers(D);; @@ -198,7 +199,7 @@ gap> Display(q); [ [ 27, 0, 0 ], [ 0, 36, 0 ], [ 0, 0, 1 ] ] ] -# doc/ALCO.xml:1539-1545 +# doc/ALCO.xml:1517-1523 gap> D := DesignByAngleSet(4,4,[1/3,1/9]);; DesignAddCardinality(D, 64);; D; <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]> gap> a := Basis(DesignBoseMesnerAlgebra(D));; @@ -207,7 +208,7 @@ gap> ForAll([1..3], i -> a[i] = Sum([1..3], j -> > DesignFirstEigenmatrix(D)[i][j]*e[j])); true -# doc/ALCO.xml:1558-1567 +# doc/ALCO.xml:1536-1545 gap> D := DesignByAngleSet(4,4,[1/3,1/9]);; DesignAddCardinality(D, 64);; D; <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]> gap> a := Basis(DesignBoseMesnerAlgebra(D));; @@ -219,19 +220,19 @@ gap> DesignFirstEigenmatrix(D) = Inverse(DesignSecondEigenmatrix(D)) > *DesignCardinality(D); true -# doc/ALCO.xml:1578-1581 +# doc/ALCO.xml:1556-1559 gap> D := DesignByAngleSet(4,4,[1/3,1/9]);; DesignAddCardinality(D, 64);; D; <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]> gap> DesignMultiplicities(D); [ 27, 36, 1 ] -# doc/ALCO.xml:1592-1595 +# doc/ALCO.xml:1570-1573 gap> D := DesignByAngleSet(4,4,[1/3,1/9]);; DesignAddCardinality(D, 64);; D; <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]> gap> DesignValencies(D); [ 27, 36, 1 ] -# doc/ALCO.xml:1615-1656 +# doc/ALCO.xml:1593-1634 gap> DesignByAngleSet(2, 1, [0,1/2]);; gap> DesignAddCardinality(last, DesignSpecialBound(last)); DesignAddCardinality(last, DesignSpecialBound(last)); -# doc/ALCO.xml:1660-1664 +# doc/ALCO.xml:1638-1642 gap> DesignByAngleSet(2, 2, [ 0, (5-Sqrt(5))/10, (5+Sqrt(5))/10 ]);; gap> DesignAddCardinality(last, DesignSpecialBound(last)); -# doc/ALCO.xml:1670-1697 +# doc/ALCO.xml:1648-1675 gap> DesignByAngleSet(2, 23, [ 0, 1/4, 3/8, 1/2, 5/8, 3/4 ]);; gap> DesignAddCardinality(last, DesignSpecialBound(last)); DesignAddCardinality(last, DesignSpecialBound(last)); -# doc/ALCO.xml:1702-1747 +# doc/ALCO.xml:1680-1725 gap> DesignByAngleSet(4, 4, [0,1/4,1/2]);; gap> DesignAddCardinality(last, DesignSpecialBound(last)); <3-design with rank 4, degree 4, cardinality 180, and angle set @@ -360,7 +361,7 @@ gap> DesignAddCardinality(last, DesignSpecialBound(last)); <5-design with rank 12, degree 2, cardinality 32760, and angle set [ 0, 1/12, 1/4, 1/3 ]> -# doc/ALCO.xml:1751-1765 +# doc/ALCO.xml:1729-1743 gap> A := [ 0, 1/4, 1/2, 3/4, (5-Sqrt(5))/8, (5+Sqrt(5))/8, > (3-Sqrt(5))/8, (3+Sqrt(5))/8 ];; gap> D := DesignByAngleSet(2, 3, A);; diff --git a/tst/alco05.tst b/tst/alco05.tst index 96db511..1b7dc29 100644 --- a/tst/alco05.tst +++ b/tst/alco05.tst @@ -10,7 +10,7 @@ # gap> START_TEST("alco05.tst"); -# doc/ALCO.xml:1856-1861 +# doc/ALCO.xml:1835-1840 gap> M := MOGLeechLatticeGeneratorMatrix;; gap> G := M*TransposedMat(M)/8;; gap> G = MOGLeechLatticeGramMatrix; @@ -18,7 +18,7 @@ true gap> IsLeechLatticeGramMatrix(G); true -# doc/ALCO.xml:1926-1960 +# doc/ALCO.xml:1905-1939 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 ], @@ -55,17 +55,17 @@ gap> KnownAttributesOfObject(O3); "OctonionGramMatrix", "GeneratorsAsCoefficients", "LLLReducedBasisCoefficients" ] -# doc/ALCO.xml:1983-1984 +# doc/ALCO.xml:1962-1963 gap> UnderlyingOctonionRing(O3); -# doc/ALCO.xml:1997-2000 +# doc/ALCO.xml:1976-1979 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 ] ] -# doc/ALCO.xml:2013-2037 +# doc/ALCO.xml:1992-2016 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 ], @@ -92,7 +92,7 @@ gap> GeneratorsAsCoefficients(O3); [ 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 ] ] -# doc/ALCO.xml:2048-2072 +# doc/ALCO.xml:2027-2051 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 ], @@ -119,20 +119,20 @@ gap> LLLReducedBasisCoefficients(O3); [ 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 ] ] -# doc/ALCO.xml:2084-2087 +# doc/ALCO.xml:2063-2066 gap> Dimension(O3); 24 gap> Rank(O3); 24 -# doc/ALCO.xml:2098-2102 +# doc/ALCO.xml:2077-2081 gap> g := 2*GramMatrix(O3);; gap> DimensionsMat(g); [ 24, 24 ] gap> DeterminantMat(g); 1 -# doc/ALCO.xml:2121-2149 +# doc/ALCO.xml:2100-2128 gap> IsOctonionLatticeBasis(Basis(O3)); true gap> b := BasisVectors(Basis(O3)); @@ -163,7 +163,7 @@ gap> b := BasisVectors(Basis(O3)); gap> GramMatrix(O3) = List(b, x -> List(b, y -> ScalarProduct(O3, x, y))); true -# doc/ALCO.xml:2182-2187 +# doc/ALCO.xml:2161-2166 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; @@ -171,7 +171,7 @@ true gap> \in( x, O3); true -# doc/ALCO.xml:2204-2213 +# doc/ALCO.xml:2184-2193 gap> b := BasisVectors(Basis(O3));; gap> b[1]; [ (-1/2)*e1+(1/2)*e5+(1/2)*e6+(1/2)*e7, 0*e1, 0*e1 ] @@ -183,7 +183,7 @@ gap> c[1]; gap> GramMatrix(O3) = List(c, x -> List(c, y -> ScalarProduct(O3, x, y))); true -# doc/ALCO.xml:2235-2248 +# doc/ALCO.xml:2213-2226 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])]);; @@ -199,7 +199,7 @@ true gap> IsSubset(O3, Leech); true -# doc/ALCO.xml:2266-2269 +# doc/ALCO.xml:2244-2247 gap> rand := Random(O3);; gap> coeffs := Coefficients(Basis(O3), rand);; gap> rand = LinearCombination(Basis(O3), coeffs); diff --git a/tst/alco06.tst b/tst/alco06.tst index 9e38165..baee930 100644 --- a/tst/alco06.tst +++ b/tst/alco06.tst @@ -10,7 +10,7 @@ # gap> START_TEST("alco06.tst"); -# doc/ALCO.xml:2296-2310 +# doc/ALCO.xml:2274-2289 gap> Closure([1,E(7)], \*); [ 1, E(7)^6, E(7)^5, E(7)^4, E(7)^3, E(7)^2, E(7) ] gap> QuaternionD4Basis; @@ -18,16 +18,17 @@ Basis( , [ (-1/2)*e+(-1/2)*i+(-1/2)*j+(1/2)*k, (-1/2)*e+(-1/2)*i+(1/2)*j+(-1/2)*k, (-1/2)*e+(1/2)*i+(-1/2)*j+(-1/2)*k, e ] ) gap> Closure(QuaternionD4Basis,\*); -[ (-1)*e, (-1/2)*e+(-1/2)*i+(-1/2)*j+(-1/2)*k, (-1/2)*e+(-1/2)*i+(-1/2)*j+(1/2)*k, - (-1/2)*e+(-1/2)*i+(1/2)*j+(-1/2)*k, (-1/2)*e+(-1/2)*i+(1/2)*j+(1/2)*k, - (-1/2)*e+(1/2)*i+(-1/2)*j+(-1/2)*k, (-1/2)*e+(1/2)*i+(-1/2)*j+(1/2)*k, - (-1/2)*e+(1/2)*i+(1/2)*j+(-1/2)*k, (-1/2)*e+(1/2)*i+(1/2)*j+(1/2)*k, (-1)*i, (-1)*j, - (-1)*k, k, j, i, (1/2)*e+(-1/2)*i+(-1/2)*j+(-1/2)*k, (1/2)*e+(-1/2)*i+(-1/2)*j+(1/2)*k, +[ (-1)*e, (-1/2)*e+(-1/2)*i+(-1/2)*j+(-1/2)*k, + (-1/2)*e+(-1/2)*i+(-1/2)*j+(1/2)*k, (-1/2)*e+(-1/2)*i+(1/2)*j+(-1/2)*k, + (-1/2)*e+(-1/2)*i+(1/2)*j+(1/2)*k, (-1/2)*e+(1/2)*i+(-1/2)*j+(-1/2)*k, + (-1/2)*e+(1/2)*i+(-1/2)*j+(1/2)*k, (-1/2)*e+(1/2)*i+(1/2)*j+(-1/2)*k, + (-1/2)*e+(1/2)*i+(1/2)*j+(1/2)*k, (-1)*i, (-1)*j, (-1)*k, k, j, i, + (1/2)*e+(-1/2)*i+(-1/2)*j+(-1/2)*k, (1/2)*e+(-1/2)*i+(-1/2)*j+(1/2)*k, (1/2)*e+(-1/2)*i+(1/2)*j+(-1/2)*k, (1/2)*e+(-1/2)*i+(1/2)*j+(1/2)*k, (1/2)*e+(1/2)*i+(-1/2)*j+(-1/2)*k, (1/2)*e+(1/2)*i+(-1/2)*j+(1/2)*k, (1/2)*e+(1/2)*i+(1/2)*j+(-1/2)*k, (1/2)*e+(1/2)*i+(1/2)*j+(1/2)*k, e ] -# doc/ALCO.xml:2333-2339 +# doc/ALCO.xml:2317-2323 gap> start := Basis(QuaternionAlgebra(Rationals)){[2,3]}; [ i, j ] gap> repeat @@ -36,7 +37,7 @@ gap> repeat gap> start; [ (-1)*e, (-1)*i, (-1)*j, (-1)*k, k, j, i, e ] -# doc/ALCO.xml:2354-2362 +# doc/ALCO.xml:2338-2346 gap> start := Basis(QuaternionAlgebra(Rationals)){[1,2]}; [ e, i ] gap> gens := Basis(QuaternionAlgebra(Rationals)){[3]};