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]]>
TheOctavianIntegers
lattice and select one that is a
- root of polynomial . 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. 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.
+
e7
corresponds to 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
- OctonionAlgebra(Rationals)
is a division composition algebra, but
- OctonionAlgebra(GF(3))
is a split composition algebra. Other examples are discussed in . OctonionAlgebra(Rationals)
is a division composition algebra, but
+ OctonionAlgebra(GF(3))
is a split composition algebra.
+ Other examples are discussed in .
+
CanonicalBasis(OctavianIntegers)
returns . We can test
- whether an octonion is in OctavianIntegers
using the operation
- IsOctavianInt(x )
. OctavianIntegers
using the operation
+ IsOctavianInt(x )
.
+
- OctonionAlgebra(Rationals )
which also serves as generators for . This octonion integer lattice has the geometry of a (Gossett) lattice relative to the inner product defined by the octonion norm. OctonionAlgebra(Rationals )
which also serves as generators for
+ . This octonion integer lattice has the geometry of a
+ (Gossett) lattice relative to the inner product defined by the octonion norm.
+ RealPart(x ) = Trace(x )*One(x )/2
. Note that Trace(x )
is an element
- of LeftActingDomain(A )
, where 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 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 ]
. 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 ]
.
+
- QuaternionAlgebra
, the norm is the sum of the squares of the coefficients. QuaternionAlgebra
, the norm is the sum of the squares of the coefficients.
+ RealPart(x )
- = Trace(x )*One(x )/2
. In the canonical basis of
- QuaternionAlgebra
, the trace is twice the coefficient of the identity element. QuaternionAlgebra
, the trace is twice the coefficient of the identity element.
+ HurwitzIntegers
are a subring of the quaternion algebra
with elements that have the geometry of scaled 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 )
. HurwitzIntegers
using the operation
+ IsHurwitzInt(x )
. NF(5, [ 1, 4 ])
or Field(Sqrt(5))
and that is equal to -EB(5)
in ⪆.
-
-
+ The NF(5, [ 1, 4 ])
or Field(Sqrt(5))
and that is given by -EB(5)
.
IcosianRing
is a subring of the the quaternion algebra over
- NF(5,[1,4])
generated by a set of vectors with an geometry. This ring
- is described well in .
- CanonicalBasis(IcosianRing)
returns . We can test whether a
+ IcosianRing
is a subring of the the quaternion algebra over
+ NF(5,[1,4])
generated by a set of vectors with an 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)
. Basis(IcosianRing)
and Basis(IcosianRing)*EB(5)
.
+ 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 set of vectors. IcosianH4Generators*EB(5)
. These basis vectors close
+ under pairwise reflection or multiplication to form a set of vectors. 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])
. 1
in the basis
+ Basis(NF(5,[ 1, 4 ]), [1, (1-Sqrt(5))/2])
.
+ EisensteinIntegers
is a subring of the complex numbers
- generated by 1
and E(3)
. This subring has the geometry of an lattice. This ring is described well in 1 and E(3)
. This subring has the geometry of an
+ lattice. This ring is described well in
+ . We can test whether an element in IsCyc
is an
- Eisenstein integer using the operation IsEisenInt(x )
. IsEisenInt(x )
.
+ 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 )
. 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 )
.
+ IsJordanAlgebra
) or is an element in a Jordan algebra (IsJordanAlgebraObj
- ).
+ IsJordanAlgebra
) or is an element in a Jordan algebra
+ (IsJordanAlgebraObj
).
- IsJordanAlgebra(x )
or the rank of the Jordan algebra containing FamilyObj(x)!.fullSCAlgebra
) when IsJordanAlgebraObj(x )
. The method Rank(x )
- returns JordanRank(x )
when
- IsJordanAlgebra
or IsJordanAlgebraObj
. IsJordanAlgebra(x )
or the rank of the Jordan algebra containing
+ FamilyObj(x)!.fullSCAlgebra
) when
+ IsJordanAlgebraObj(x )
. The method Rank(x )
+ returns JordanRank(x )
when IsJordanAlgebra
or IsJordanAlgebraObj
.
+
- IsJordanAlgebra(x )
or the degree of the Jordan algebra containing FamilyObj(x)!.fullSCAlgebra
)
- when IsJordanAlgebraObj(x )
. The method Degree(x )
- returns JordanDegree(x )
when
- IsJordanAlgebra
or IsJordanAlgebraObj
. IsJordanAlgebra(x )
or the degree of the Jordan algebra containing
+ FamilyObj(x)!.fullSCAlgebra
)
+ when IsJordanAlgebraObj(x )
. The method
+ Degree(x )
+ returns JordanDegree(x )
when IsJordanAlgebra
or IsJordanAlgebraObj
.
+
- IsJordanAlgebraObj(x )
as defined in Returns the generic minimal polynomial of 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. IsSCAlgebraObj
.
JordanSpinFactor(IdentityMat(d +1))
.
- If optional JordanSpinFactor(args)
is used.
- If neither of these rank 2 cases apply, and HermitianSimpleJordanAlgebra(rho , args )
is used.
-
- In the cases where rank JordanSpinFactor(IdentityMat(d +1))
.
+ If optional JordanSpinFactor(args)
is used.
+ If neither of these rank 2 cases apply, and HermitianSimpleJordanAlgebra(rho , args )
is used.
+
+ In the cases where rank HermitianSimpleJordanAlgebra(rho , args )
is used.
- Otherwise, when optional HermitianSimpleJordanAlgebra(rho , B )
for CanonicalBasis(Rationals)
, Basis(CF(4), [1, E(4)])
, CanonicalBasis(QuaternionAlgebra(Rationals))
, or CanonicalBasis(OctonionAlgebra(Rationals))
.
+ Otherwise, when optional HermitianSimpleJordanAlgebra(rho , B )
for 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.
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 and
defined as . 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 -design is a design with the following special property:
the integral of any degree 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 -design.
+ evaluated at the points of the -design (see
+ and
+ for detailed definitions).
The parameter 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 denotes the strength
- of the design and s
denotes the cardinality of the angle set .
+ of the design and denotes the cardinality of the angle set .
The definitions below are provided in .
A design admits a regular scheme when . The filter
@@ -1434,8 +1408,9 @@ gap> DesignStrength(D);
- For a design D with cardinality and angle set that satisfies
- IsRegularSchemeDesign
, namely , we can compute the regular
+ For a design D with cardinality and angle set that satisfies
+ IsRegularSchemeDesign
, namely ,
+ 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 ,
with the s+1
-th basis vector corresponding to .
+ 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]};