Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  ALCO.tex

  Sprache: Latech
 

% generated by GAPDoc2LaTeX from XML source (Frank Luebeck)
\documentclass[a4paper,11pt]{report}

\usepackage[top=37mm,bottom=37mm,left=27mm,right=27mm]{geometry}
\sloppy
\pagestyle{myheadings}
\usepackage{amssymb}
\usepackage[utf8]{inputenc}
\usepackage{makeidx}
\makeindex
\usepackage{color}
\definecolor{FireBrick}{rgb}{0.5812,0.0074,0.0083}
\definecolor{RoyalBlue}{rgb}{0.0236,0.0894,0.6179}
\definecolor{RoyalGreen}{rgb}{0.0236,0.6179,0.0894}
\definecolor{RoyalRed}{rgb}{0.6179,0.0236,0.0894}
\definecolor{LightBlue}{rgb}{0.8544,0.9511,1.0000}
\definecolor{Black}{rgb}{0.0,0.0,0.0}

\definecolor{linkColor}{rgb}{0.0,0.0,0.554}
\definecolor{citeColor}{rgb}{0.0,0.0,0.554}
\definecolor{fileColor}{rgb}{0.0,0.0,0.554}
\definecolor{urlColor}{rgb}{0.0,0.0,0.554}
\definecolor{promptColor}{rgb}{0.0,0.0,0.589}
\definecolor{brkpromptColor}{rgb}{0.589,0.0,0.0}
\definecolor{gapinputColor}{rgb}{0.589,0.0,0.0}
\definecolor{gapoutputColor}{rgb}{0.0,0.0,0.0}

%%  for a long time these were red and blue by default,
%%  now black, but keep variables to overwrite
\definecolor{FuncColor}{rgb}{0.0,0.0,0.0}
%% strange name because of pdflatex bug:
\definecolor{Chapter }{rgb}{0.0,0.0,0.0}
\definecolor{DarkOlive}{rgb}{0.1047,0.2412,0.0064}


\usepackage{fancyvrb}

\usepackage{mathptmx,helvet}
\usepackage[T1]{fontenc}
\usepackage{textcomp}


\usepackage[
            pdftex=true,
            bookmarks=true,        
            a4paper=true,
            pdftitle={Written with GAPDoc},
            pdfcreator={LaTeX with hyperref package / GAPDoc},
            colorlinks=true,
            backref=page,
            breaklinks=true,
            linkcolor=linkColor,
            citecolor=citeColor,
            filecolor=fileColor,
            urlcolor=urlColor,
            pdfpagemode={UseNone}, 
           ]{hyperref}

\newcommand{\maintitlesize}{\fontsize{50}{55}\selectfont}

% write page numbers to a .pnr log file for online help
\newwrite\pagenrlog
\immediate\openout\pagenrlog =\jobname.pnr
\immediate\write\pagenrlog{PAGENRS := [}
\newcommand{\logpage}[1]{\protect\write\pagenrlog{#1, \thepage,}}
%% were never documented, give conflicts with some additional packages

\newcommand{\GAP}{\textsf{GAP}}

%% nicer description environments, allows long labels
\usepackage{enumitem}
\setdescription{style=nextline}

%% depth of toc
\setcounter{tocdepth}{1}





%% command for ColorPrompt style examples
\newcommand{\gapprompt}[1]{\color{promptColor}{\bfseries #1}}
\newcommand{\gapbrkprompt}[1]{\color{brkpromptColor}{\bfseries #1}}
\newcommand{\gapinput}[1]{\color{gapinputColor}{#1}}


\begin{document}

\logpage{[ 0, 0, 0 ]}
\begin{titlepage}
\mbox{}\vfill

\begin{center}{\maintitlesize \textbf{ ALCO \mbox{}}}\\
\vfill

\hypersetup{pdftitle= ALCO }
\markright{\scriptsize \mbox{}\hfill  ALCO  \hfill\mbox{}}
{\Huge \textbf{ Tools for algebraic combinatorics \mbox{}}}\\
\vfill

{\Huge  1.1.2 \mbox{}}\\[1cm]
{ 5 September 2025 \mbox{}}\\[1cm]
\mbox{}\\[2cm]
{\Large \textbf{ Benjamin Nasmith\\
   \mbox{}}}\\
\hypersetup{pdfauthor= Benjamin Nasmith\\
   }
\end{center}\vfill

\mbox{}\\
{\mbox{}\\
\small \noindent \textbf{ Benjamin Nasmith\\
   }  Email: \href{mailto://bnasmith@proton.me} {\texttt{bnasmith@proton.me}}\\
  Homepage: \href{https://github.com/BNasmith/} {\texttt{https://github.com/BNasmith/}}}\\
\end{titlepage}

\newpage\setcounter{page}{2}
{\small 
\section*{Abstract}
\logpage{[ 0, 0, 1 ]}
 ALCO provides implementations in \textsf{GAP} of octonion algebras, Jordan algebras, and certain important integer subrings
of those algebras. It also provides tools to compute the parameters of
t\texttt{\symbol{45}}designs in spherical and projective spaces (modeled as
manifolds of primitive idempotent elements in a simple Euclidean Jordan
algebra). Finally, this package provides tools to explore octonion lattice
constructions, including octonion Leech lattices. \mbox{}}\\[1cm]
{\small 
\section*{Copyright}
\logpage{[ 0, 0, 2 ]}
 {\copyright} 2024 by Benjamin Nasmith

 This package may be distributed under the terms and conditions of the GNU
Public License Version 3 or (at your option) any later version. \mbox{}}\\[1cm]
{\small 
\section*{Acknowledgements}
\logpage{[ 0, 0, 3 ]}
 This documentation was prepared using the \textsf{GAPDoc} package. 

 \mbox{}}\\[1cm]
\newpage

\def\contentsname{Contents\logpage{[ 0, 0, 4 ]}}

\tableofcontents
\newpage

 
\chapter{\textcolor{Chapter }{Introduction}}\logpage{[ 1, 0, 0 ]}
\hyperdef{L}{X7DFB63A97E67C0A1}{}
{
  The \textsf{ALCO} package provides tools for algebraic combinatorics, most of which was written
for \textsf{GAP} during the author's Ph.D. program \cite{nasmith_tight_2023}. This package provides implementations in \textsf{GAP} of octonion algebras, Jordan algebras, and certain important integer subrings
of those algebras. It also provides tools to compute the parameters of
t\texttt{\symbol{45}}designs in spherical and projective spaces (modeled as
manifolds of primitive idempotent elements in a simple Euclidean Jordan
algebra). Finally, this package provides tools to explore octonion lattice
constructions, including octonion Leech lattices. The following examples
illustrate how one might use this package to explore these structures.

 The \textsf{ALCO} package allows users to work with the octavian integer ring (also known as the
octonion arithmetic), which is described carefully in \cite[chaps. 9\texttt{\symbol{45}}11]{conway_quaternions_2003}. In the example below, we verify that the octavian integers define an $E_8$ (Gossett) lattice relative to the standard octonion inner product: 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@O := OctavianIntegers;|
  OctavianIntegers
  !gapprompt@gap>| !gapinput@g := List(Basis(O), x -> List(Basis(O), y -> |
  !gapprompt@>| !gapinput@Norm(x+y) - Norm(x) - Norm(y)));;|
  !gapprompt@gap>| !gapinput@Display(g);|
  [ [   2,   0,  -1,   0,   0,   0,   0,   0 ],
    [   0,   2,   0,  -1,   0,   0,   0,   0 ],
    [  -1,   0,   2,  -1,   0,   0,   0,   0 ],
    [   0,  -1,  -1,   2,  -1,   0,   0,   0 ],
    [   0,   0,   0,  -1,   2,  -1,   0,   0 ],
    [   0,   0,   0,   0,  -1,   2,  -1,   0 ],
    [   0,   0,   0,   0,   0,  -1,   2,  -1 ],
    [   0,   0,   0,   0,   0,   0,  -1,   2 ] ]
  !gapprompt@gap>| !gapinput@IsGossetLatticeGramMatrix(g);|
  true
\end{Verbatim}
 

 The \textsf{ALCO} package also provides tools to construct octonion lattices, including octonion
Leech lattices (see for example \cite{wilson_octonions_2009}). In the following example we compute the shortest vectors in the \texttt{OctavianIntegers} lattice and select one that is a root of polynomial $x^2 + x + 2$. We use this root \texttt{s} to define a set \texttt{gens} of octonion triples to serve as generators for the lattice. Finally, we
construct the lattice \texttt{L} and confirm that it is a Leech lattice. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@short := Set(ShortestVectors(g,4).vectors, y -> |
  !gapprompt@>| !gapinput@LinearCombination(Basis(OctavianIntegers), y));;|
  !gapprompt@gap>| !gapinput@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
  !gapprompt@gap>| !gapinput@gens := List(Basis(OctavianIntegers), x -> |
  !gapprompt@>| !gapinput@x*[[s,s,0],[0,s,s],ComplexConjugate([s,s,s])]);;|
  !gapprompt@gap>| !gapinput@gens := Concatenation(gens);; |
  !gapprompt@gap>| !gapinput@L := OctonionLatticeByGenerators(gens, One(O)*IdentityMat(3)/2);|
  <free left module over Integers, with 24 generators>
  !gapprompt@gap>| !gapinput@IsLeechLatticeGramMatrix(GramMatrix(L));|
  true
\end{Verbatim}
 We can also construct and study simple Euclidean Jordan algebras (described
well in \cite{faraut_analysis_1994}), including the Albert algebra: 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@J := AlbertAlgebra(Rationals);|
  <algebra-with-one of dimension 27 over Rationals>
  !gapprompt@gap>| !gapinput@SemiSimpleType(Derivations(Basis(J)));|
  "F4"
  !gapprompt@gap>| !gapinput@i := Basis(J){[1..8]};|
  [ i1, i2, i3, i4, i5, i6, i7, i8 ]
  !gapprompt@gap>| !gapinput@j := Basis(J){[9..16]};|
  [ j1, j2, j3, j4, j5, j6, j7, j8 ]
  !gapprompt@gap>| !gapinput@k := Basis(J){[17..24]};|
  [ k1, k2, k3, k4, k5, k6, k7, k8 ]
  !gapprompt@gap>| !gapinput@e := Basis(J){[25..27]};|
  [ ei, ej, ek ]
  !gapprompt@gap>| !gapinput@ForAll(e, IsIdempotent);|
  true
  !gapprompt@gap>| !gapinput@Set(i, x -> x^2);|
  [ ej+ek ]
  !gapprompt@gap>| !gapinput@Set(j, x -> x^2);|
  [ ei+ek ]
  !gapprompt@gap>| !gapinput@One(J);|
  ei+ej+ek
  !gapprompt@gap>| !gapinput@Determinant(One(J));|
  1
  !gapprompt@gap>| !gapinput@Trace(One(J));|
  3
\end{Verbatim}
 }

 
\chapter{\textcolor{Chapter }{Octonions}}\logpage{[ 2, 0, 0 ]}
\hyperdef{L}{X7E7EE82D811283C0}{}
{
  Let $C$ be a vector space over field $k$ equipped with a non\texttt{\symbol{45}}degenerate quadratic form $N:C \rightarrow k$. If $C$ is also an algebra with a product that satifies the composition rule $N(x y) = N(x) N(y)$ for all $x,y$ in $C$ then we call $C$ a \emph{composition algebra}. Quaternions and octonions are examples of composition algebras.

 As described in \cite[Theorm 1.6.2]{springer_octonions_2000}, a composition algebra has dimension $1$, $2$, $ 4$, or $8$. Compositions algebras of dimension $1$ or $2$ are commutative and associative. A \emph{quaternion algebra} is a composition algebra of dimension $4$. Quaternion algebras are associative but noncommutative. An \emph{octonion algebra} is a composition algebra of dimension $8$. Octonion algebras are both noncommutative and nonassociative but still have
many interesting properties. 

 The non\texttt{\symbol{45}}degenerate quadratic form $N$ of a composition algebra is called the \emph{norm} of that algebra. In fact, a composition algebra is determined up to
isomorphism by its norm so the task of classifying composition algebras is
equivalent to the task of classifying the possible norms in that vector space \cite[chap. 1, sec. 7]{springer_octonions_2000}. A norm is either isotropic or anisotropic according to whether or not there
exists a non\texttt{\symbol{45}}zero element $x$ such that $N(x) = 0$. A composition algebra with a isotropic norm is called a \emph{split composition algebra}. A composition algebra with an anisotropic norm is called a \emph{division composition algebra} since each non\texttt{\symbol{45}}zero element has an inverse. An important
theorem \cite[Theorem 1.8.1]{springer_octonions_2000} shows that for each field $k$ there exists up to isomorphism one split composition algebra of dimension $2$, $ 4$, and $8$. The built\texttt{\symbol{45}}in \texttt{OctaveAlgebra(\mbox{\texttt{\mdseries\slshape F}})} function in \textsf{GAP} constructs the split\texttt{\symbol{45}}octonion algebra over the field given
as the argument. 

 As described in \cite[chap. 1, sec. 10]{springer_octonions_2000}, there are precisely one division composition algebra of dimension $4$ and one of dimension $ 8$ over the real number field (likewise over the rationals). The \textsf{ALCO} package provides constructions of \emph{non\texttt{\symbol{45}}split} octonion algebras, provided that the algebra is constructed over a suitable
field (e.g., octonions over any finite field are split). 
\section{\textcolor{Chapter }{Octonion Algebras}}\label{sec:octalg}
\logpage{[ 2, 1, 0 ]}
\hyperdef{L}{X7833529F8000FCAD}{}
{
  
\subsection{\textcolor{Chapter }{Octonion Filters}}\logpage{[ 2, 1, 1 ]}
\hyperdef{L}{X81A45FA7806BF5AC}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsOctonion\index{IsOctonion@\texttt{IsOctonion}}
\label{IsOctonion}
}\hfill{\scriptsize (filter)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsOctonionCollection\index{IsOctonionCollection@\texttt{IsOctonionCollection}}
\label{IsOctonionCollection}
}\hfill{\scriptsize (filter)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsOctonionAlgebra\index{IsOctonionAlgebra@\texttt{IsOctonionAlgebra}}
\label{IsOctonionAlgebra}
}\hfill{\scriptsize (filter)}}\\


These filters determine whether an element is an octonion, an octonion
collection, or an octonion algebra.}

 

\subsection{\textcolor{Chapter }{OctonionAlgebra}}
\logpage{[ 2, 1, 2 ]}\nobreak
\hyperdef{L}{X78767B4A7F44F77D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{OctonionAlgebra({\mdseries\slshape F})\index{OctonionAlgebra@\texttt{OctonionAlgebra}}
\label{OctonionAlgebra}
}\hfill{\scriptsize (function)}}\\


 Returns an octonion algebra over field \mbox{\texttt{\mdseries\slshape F}} in a standard orthonormal basis $\{e_{i}, i = 1,...,8\}$ such that $1 = e_8$ is the identity element and $e_{i} = e_{i+1}e_{i+3} = - e_{i+3}e_{i+1}$ for $i = 1,...,7$, with indices evaluated modulo 7. This corresponds to the basis provided in \cite{baez_octonions_2002} and \cite{conway_quaternions_2003} (except that \texttt{ e7} corresponds to $e_0$ in the literature, since the first entry in \textsf{GAP} list has index 1). Whether or not the algebra constructed is a division
algebra or a split\texttt{\symbol{45}}octonion algebra depends on the choice
of field \mbox{\texttt{\mdseries\slshape F}}. For example, \texttt{OctonionAlgebra(Rationals)} is a division composition algebra, but \texttt{OctonionAlgebra(GF(3))} is a split composition algebra. Other examples are discussed in \cite[chap. 1, sec. 10]{springer_octonions_2000}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@O := OctonionAlgebra(Rationals);|
  <algebra-with-one of dimension 8 over Rationals>
  !gapprompt@gap>| !gapinput@LeftActingDomain(O);|
  Rationals
  !gapprompt@gap>| !gapinput@IsAssociative(O);|
  false
  !gapprompt@gap>| !gapinput@e := BasisVectors(Basis(O));|
  [ e1, e2, e3, e4, e5, e6, e7, e8 ]
  !gapprompt@gap>| !gapinput@One(O);|
  e8
  !gapprompt@gap>| !gapinput@e[1]*e[2];|
  e4
  !gapprompt@gap>| !gapinput@e[2]*e[1];|
  (-1)*e4
  !gapprompt@gap>| !gapinput@Derivations(Basis(O));|
  <Lie algebra of dimension 14 over Rationals>
  !gapprompt@gap>| !gapinput@SemiSimpleType(last);|
  "G2"
\end{Verbatim}
 }

 
\subsection{\textcolor{Chapter }{Octavian Integers}}\logpage{[ 2, 1, 3 ]}
\hyperdef{L}{X87ABC5C38446DA89}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{OctavianIntegers\index{OctavianIntegers@\texttt{OctavianIntegers}}
\label{OctavianIntegers}
}\hfill{\scriptsize (global variable)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsOctavianInt({\mdseries\slshape x})\index{IsOctavianInt@\texttt{IsOctavianInt}}
\label{IsOctavianInt}
}\hfill{\scriptsize (operation)}}\\


 The \texttt{OctavianIntegers} are a subring of the octonion algebra with elements that have the geometry of
scaled $E_8$ lattice. This ring is named and studied in \cite[p. 105]{conway_quaternions_2003}. \texttt{ CanonicalBasis(OctavianIntegers)} returns \texttt{OctonionE8Basis} (\ref{OctonionE8Basis}). We can test whether an octonion is in \texttt{OctavianIntegers} using the operation \texttt{IsOctavianInt(\mbox{\texttt{\mdseries\slshape x}})}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@a := BasisVectors(Basis(OctavianIntegers));;|
  !gapprompt@gap>| !gapinput@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
  (1/2)*e2+(1/2)*e3+(-1/2)*e5+(-1/2)*e7
  (1/2)*e1+(-1/2)*e3+(1/2)*e4+(1/2)*e5
  (-1/2)*e2+(1/2)*e3+(-1/2)*e5+(1/2)*e7
  (1/2)*e2+(-1/2)*e4+(1/2)*e5+(-1/2)*e6
  (-1/2)*e1+(-1/2)*e3+(1/2)*e4+(-1/2)*e5
  (1/2)*e1+(-1/2)*e4+(1/2)*e6+(-1/2)*e8
  !gapprompt@gap>| !gapinput@ForAll(a, IsOctavianInt);|
  true
  !gapprompt@gap>| !gapinput@ForAll(a/2, IsOctavianInt);|
  false
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{OctonionE8Basis}}
\logpage{[ 2, 1, 4 ]}\nobreak
\hyperdef{L}{X7E4DEB1E7C7F2C1D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{OctonionE8Basis\index{OctonionE8Basis@\texttt{OctonionE8Basis}}
\label{OctonionE8Basis}
}\hfill{\scriptsize (global variable)}}\\


 The \textsf{ALCO} package also loads a basis for \texttt{OctonionAlgebra(\mbox{\texttt{\mdseries\slshape Rationals}})} which also serves as generators for \texttt{OctavianIntegers} (\ref{OctavianIntegers}). This octonion integer lattice has the geometry of a $E_8$ (Gossett) lattice relative to the inner product defined by the octonion norm. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@BasisVectors(OctonionE8Basis) = BasisVectors(Basis(OctavianIntegers));|
  true
  !gapprompt@gap>| !gapinput@g := List(OctonionE8Basis, x -> List(OctonionE8Basis, y -> |
  !gapprompt@>| !gapinput@Norm(x+y) - Norm(x) - Norm(y)));;|
  !gapprompt@gap>| !gapinput@IsGossetLatticeGramMatrix(g);|
  true
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Properties of Octonions}}\label{sec:octattr}
\logpage{[ 2, 2, 0 ]}
\hyperdef{L}{X86E4523081C49806}{}
{
  

\subsection{\textcolor{Chapter }{Norm (Octonions)}}
\logpage{[ 2, 2, 1 ]}\nobreak
\hyperdef{L}{X7CEAB1C67B22DA7E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{Norm({\mdseries\slshape x})\index{Norm@\texttt{Norm}!Octonions}
\label{Norm:Octonions}
}\hfill{\scriptsize (method)}}\\


Returns the norm of octonion \mbox{\texttt{\mdseries\slshape x}}. Recall that an octonion algebra with norm $N$ satisfies the composition property $N(xy) = N(x)N(y)$. In the canonical basis for \texttt{OctonionAlgebra} (\ref{OctonionAlgebra}), the norm is the sum of the squares of the coefficients. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@Oct := OctonionAlgebra(Rationals);;|
  !gapprompt@gap>| !gapinput@List(Basis(Oct), Norm);|
  [ 1, 1, 1, 1, 1, 1, 1, 1 ]
  !gapprompt@gap>| !gapinput@x := Random(Oct);; y := Random(Oct);;|
  !gapprompt@gap>| !gapinput@Norm(x*y) = Norm(x)*Norm(y);|
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Trace (Octonions)}}
\logpage{[ 2, 2, 2 ]}\nobreak
\hyperdef{L}{X8794715F82DE210B}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{Trace({\mdseries\slshape x})\index{Trace@\texttt{Trace}!Octonions}
\label{Trace:Octonions}
}\hfill{\scriptsize (method)}}\\


Returns the trace of octonion \mbox{\texttt{\mdseries\slshape x}}. In the canonical basis for \texttt{OctonionAlgebra} (\ref{OctonionAlgebra}), the trace is twice the coefficient of the identity element \texttt{e8}. The trace and real part are related via \texttt{RealPart(\mbox{\texttt{\mdseries\slshape x}}) = Trace(\mbox{\texttt{\mdseries\slshape x}})*One(\mbox{\texttt{\mdseries\slshape x}})/2}. Note that \texttt{Trace(\mbox{\texttt{\mdseries\slshape x}})} is an element of \texttt{LeftActingDomain(\mbox{\texttt{\mdseries\slshape A}})}, where \mbox{\texttt{\mdseries\slshape A}} is the octonion algebra containing \mbox{\texttt{\mdseries\slshape x}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@e := BasisVectors(Basis(OctonionAlgebra(Rationals)));|
  [ e1, e2, e3, e4, e5, e6, e7, e8 ]
  !gapprompt@gap>| !gapinput@List(e, Trace);|
  [ 0, 0, 0, 0, 0, 0, 0, 2 ]
  !gapprompt@gap>| !gapinput@List(e, RealPart);|
  [ 0*e1, 0*e1, 0*e1, 0*e1, 0*e1, 0*e1, 0*e1, e8 ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{ComplexConjugate (Octonions)}}
\logpage{[ 2, 2, 3 ]}\nobreak
\hyperdef{L}{X7DA1C9FC867AE862}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ComplexConjugate({\mdseries\slshape x})\index{ComplexConjugate@\texttt{ComplexConjugate}!Octonions}
\label{ComplexConjugate:Octonions}
}\hfill{\scriptsize (method)}}\\


Returns the octonion conjugate of octonion \mbox{\texttt{\mdseries\slshape x}}, defined b\texttt{One(x)*Trace(x) \texttt{\symbol{45}} x}. In the canonical basis of \texttt{OctonionAlgebra} (\ref{OctonionAlgebra}), this method negates the coefficients of $e_1, e_2, \ldots, e_7$ but leaves the identity $e_8$ fixed. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@e := BasisVectors(Basis(OctonionAlgebra(Rationals)));|
  [ e1, e2, e3, e4, e5, e6, e7, e8 ]
  !gapprompt@gap>| !gapinput@List(e, ComplexConjugate);|
  [ (-1)*e1, (-1)*e2, (-1)*e3, (-1)*e4, (-1)*e5, (-1)*e6, (-1)*e7, e8 ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{RealPart (Octonions)}}
\logpage{[ 2, 2, 4 ]}\nobreak
\hyperdef{L}{X7FCF154F7BD4E4ED}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{RealPart({\mdseries\slshape x})\index{RealPart@\texttt{RealPart}!Octonions}
\label{RealPart:Octonions}
}\hfill{\scriptsize (method)}}\\


Returns the real component of octonion \mbox{\texttt{\mdseries\slshape x}}, defined by \texttt{ (1/2)*One(x)*Trace(x)}. Note that \texttt{RealPart} returns an octonion in the subspace spanned by the octonion identity element
while \texttt{Trace} returns an element in the coefficient field of the octonion algebra. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@e := BasisVectors(Basis(OctonionAlgebra(Rationals)));|
  [ e1, e2, e3, e4, e5, e6, e7, e8 ]
  !gapprompt@gap>| !gapinput@List(e, RealPart);|
  [ 0*e1, 0*e1, 0*e1, 0*e1, 0*e1, 0*e1, 0*e1, e8 ]
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Other Octonion Tools}}\logpage{[ 2, 3, 0 ]}
\hyperdef{L}{X80488CD07C9B9BD7}{}
{
  
\subsection{\textcolor{Chapter }{Converting Octonion Vectors}}\logpage{[ 2, 3, 1 ]}
\hyperdef{L}{X7D66EA0A7C8036F6}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{OctonionToRealVector({\mdseries\slshape B, x})\index{OctonionToRealVector@\texttt{OctonionToRealVector}}
\label{OctonionToRealVector}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{RealToOctonionVector({\mdseries\slshape B, y})\index{RealToOctonionVector@\texttt{RealToOctonionVector}}
\label{RealToOctonionVector}
}\hfill{\scriptsize (function)}}\\


 Let \mbox{\texttt{\mdseries\slshape x}} be an octonion vector of the form $x = (x_1, x_2, ..., x_n)$, for $x_i$ octonion valued coefficients. Let \mbox{\texttt{\mdseries\slshape B}} be a basis for the octonion algebra containing coefficients $x_i$. The function \texttt{OctonionToRealVector(\mbox{\texttt{\mdseries\slshape B}}, \mbox{\texttt{\mdseries\slshape x}})} returns a vector \mbox{\texttt{\mdseries\slshape y}} of length $8n$ containing the concatenation of the coefficients of $x_i$ in the octonion basis given by \mbox{\texttt{\mdseries\slshape B}}. The function \texttt{RealToOctonionVector(\mbox{\texttt{\mdseries\slshape B}}, \mbox{\texttt{\mdseries\slshape y}})} provides the inverse operation. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@O := UnderlyingLeftModule(OctonionE8Basis);|
  <algebra-with-one of dimension 8 over Rationals>
  !gapprompt@gap>| !gapinput@BasisVectors(CanonicalBasis(O));|
  [ e1, e2, e3, e4, e5, e6, e7, e8 ]
  !gapprompt@gap>| !gapinput@x := 2*OctonionE8Basis{[1,2]};|
  [ (-1)*e1+e5+e6+e7, (-1)*e1+(-1)*e2+(-1)*e4+(-1)*e7 ]
  !gapprompt@gap>| !gapinput@y := OctonionToRealVector(CanonicalBasis(O), x);|
  [ -1, 0, 0, 0, 1, 1, 1, 0, -1, -1, 0, -1, 0, 0, -1, 0 ]
  !gapprompt@gap>| !gapinput@RealToOctonionVector(CanonicalBasis(O), y);|
  [ (-1)*e1+e5+e6+e7, (-1)*e1+(-1)*e2+(-1)*e4+(-1)*e7 ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{VectorToIdempotentMatrix}}
\logpage{[ 2, 3, 2 ]}\nobreak
\hyperdef{L}{X85B2EBB27ED8A073}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{VectorToIdempotentMatrix({\mdseries\slshape x})\index{VectorToIdempotentMatrix@\texttt{VectorToIdempotentMatrix}}
\label{VectorToIdempotentMatrix}
}\hfill{\scriptsize (function)}}\\


 Let \mbox{\texttt{\mdseries\slshape x}} be a vector satisfying \texttt{IsHomogeneousList} and \texttt{IsAssociative} with elements that satisfy \texttt{IsCyc}, \texttt{IsQuaternion}, or \texttt{IsOctonion}. Then this function returns the idempotent matrix \texttt{M/Trace(M)} where \texttt{M = TransposedMat([ComplexConjugate(\mbox{\texttt{\mdseries\slshape x}})])*[\mbox{\texttt{\mdseries\slshape x}}]}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@Oct := OctonionAlgebra(Rationals);;|
  !gapprompt@gap>| !gapinput@x := Basis(Oct){[8,1,2]};|
  [ e8, e1, e2 ]
  !gapprompt@gap>| !gapinput@y := VectorToIdempotentMatrix(x);; Display(y);|
  [ [   (1/3)*e8,   (1/3)*e1,   (1/3)*e2 ],
    [  (-1/3)*e1,   (1/3)*e8,  (-1/3)*e4 ],
    [  (-1/3)*e2,   (1/3)*e4,   (1/3)*e8 ] ]
  !gapprompt@gap>| !gapinput@IsIdempotent(y);|
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{WeylReflection}}
\logpage{[ 2, 3, 3 ]}\nobreak
\hyperdef{L}{X83DFA8B38603F6D6}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{WeylReflection({\mdseries\slshape r, x})\index{WeylReflection@\texttt{WeylReflection}}
\label{WeylReflection}
}\hfill{\scriptsize (function)}}\\


 Let \mbox{\texttt{\mdseries\slshape r}} be a vector satisfying \texttt{IsHomogeneousList} and \texttt{ IsAssociative} with elements in \texttt{IsCyc}, \texttt{IsQuaternion}, or \texttt{ IsOctonion} and let \texttt{IsHomogeneousList(Flat([\mbox{\texttt{\mdseries\slshape r}},\mbox{\texttt{\mdseries\slshape x}}]))}. Then this function returns the Weyl reflection of vector \mbox{\texttt{\mdseries\slshape x}} using the projector defined by \texttt{VectorToIdempotentMatrix(\mbox{\texttt{\mdseries\slshape r}})}. Specifically, the result is \texttt{x \texttt{\symbol{45}} 2*x*VectorToIdempotentMatrix(r)}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@WeylReflection([1,0,1],[0,1,1]);|
  [ -1, 1, 0 ]
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Quaternion Tools}}\logpage{[ 2, 4, 0 ]}
\hyperdef{L}{X7991AA0A852ABD60}{}
{
  The \textsf{ALCO} package provides some additional tools for studying quaternion algebras i\textsf{GAP}. These tools include methods to compute the quaternion norm and trace,
certain important bases, and the subrings generated by those bases. \textsf{GAP} already provides some built\texttt{\symbol{45}}in tools to construct and study
the quaternion algebra in the standard Hamiltonian basis. The following
example illustrates these tools: 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@H := QuaternionAlgebra(Rationals);|
  <algebra-with-one of dimension 4 over Rationals>
  !gapprompt@gap>| !gapinput@IsQuaternion(Random(H));|
  true
  !gapprompt@gap>| !gapinput@IsAssociative(H);|
  true
  !gapprompt@gap>| !gapinput@IsCommutative(H);|
  false
  !gapprompt@gap>| !gapinput@One(H);|
  e
  !gapprompt@gap>| !gapinput@b := BasisVectors(CanonicalBasis(H));|
  [ e, i, j, k ]
  !gapprompt@gap>| !gapinput@List(b, ComplexConjugate);|
  [ e, (-1)*i, (-1)*j, (-1)*k ]
  !gapprompt@gap>| !gapinput@List(b, Inverse);|
  [ e, (-1)*i, (-1)*j, (-1)*k ] 
  !gapprompt@gap>| !gapinput@List(b, RealPart);|
  [ e, 0*e, 0*e, 0*e ]
  !gapprompt@gap>| !gapinput@List(b, ImaginaryPart);|
  [ 0*e, e, k, (-1)*j ]
\end{Verbatim}
 Note that the \textsf{GAP} method \texttt{ImaginaryPart} acting on objects that satisfy \texttt{IsQuaternion} involves dividing by \texttt{i}, which yields a different result than the \texttt{x \texttt{\symbol{45}} RealPart(x)} that some users may expect. The \textsf{ALCO} package does not define an \texttt{ImaginaryPart} method for octonions in order to avoid confusion about the behaviour of that
method when applied to quaternions or octonions. 

\subsection{\textcolor{Chapter }{Norm (Quaternions)}}
\logpage{[ 2, 4, 1 ]}\nobreak
\hyperdef{L}{X7F1D2B237E4AF7A6}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{Norm({\mdseries\slshape x})\index{Norm@\texttt{Norm}!Quaternions}
\label{Norm:Quaternions}
}\hfill{\scriptsize (method)}}\\


Returns the norm of quaternion \mbox{\texttt{\mdseries\slshape x}}. Recall that a quaternion algebra with norm $N$ satisfies the composition property $N(xy) = N(x)N(y)$. In the canonical basis of \texttt{QuaternionAlgebra}, the norm is the sum of the squares of the coefficients. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@H := QuaternionAlgebra(Rationals);;|
  !gapprompt@gap>| !gapinput@b := BasisVectors(CanonicalBasis(H));|
  [ e, i, j, k ]
  !gapprompt@gap>| !gapinput@List(b, Norm);|
  [ 1, 1, 1, 1 ]
  !gapprompt@gap>| !gapinput@x := Random(H);; y := Random(H);;|
  !gapprompt@gap>| !gapinput@Norm(x*y) = Norm(x)*Norm(y);|
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Trace (Quaternions)}}
\logpage{[ 2, 4, 2 ]}\nobreak
\hyperdef{L}{X855FA7867B9D0A9E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{Trace({\mdseries\slshape x})\index{Trace@\texttt{Trace}!Quaternions}
\label{Trace:Quaternions}
}\hfill{\scriptsize (method)}}\\


Returns the trace of quaternion \mbox{\texttt{\mdseries\slshape x}}, such that \texttt{RealPart(\mbox{\texttt{\mdseries\slshape x}}) = Trace(\mbox{\texttt{\mdseries\slshape x}})*One(\mbox{\texttt{\mdseries\slshape x}})/2}. In the canonical basis of \texttt{QuaternionAlgebra}, the trace is twice the coefficient of the identity element. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@H := QuaternionAlgebra(Rationals);;|
  !gapprompt@gap>| !gapinput@b := BasisVectors(CanonicalBasis(H));|
  [ e, i, j, k ]
  !gapprompt@gap>| !gapinput@List(b, Trace);|
  [ 2, 0, 0, 0 ]
\end{Verbatim}
 }

 
\subsection{\textcolor{Chapter }{Hurwitz Integers}}\logpage{[ 2, 4, 3 ]}
\hyperdef{L}{X7A4069927811A5B7}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{HurwitzIntegers\index{HurwitzIntegers@\texttt{HurwitzIntegers}}
\label{HurwitzIntegers}
}\hfill{\scriptsize (global variable)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsHurwitzInt({\mdseries\slshape x})\index{IsHurwitzInt@\texttt{IsHurwitzInt}}
\label{IsHurwitzInt}
}\hfill{\scriptsize (operation)}}\\


 The \texttt{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 \cite[p. 55]{conway_quaternions_2003}. \texttt{CanonicalBasis(HurwitzIntegers)} returns \texttt{QuaternionD4Basis} (\ref{QuaternionD4Basis}). We can test whether a quaternion is in \texttt{HurwitzIntegers} using the operation \texttt{IsHurwitzInt(\mbox{\texttt{\mdseries\slshape x}})}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@f := BasisVectors(Basis(HurwitzIntegers));;|
  !gapprompt@gap>| !gapinput@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
  (-1/2)*e+(1/2)*i+(-1/2)*j+(-1/2)*k
  e
  !gapprompt@gap>| !gapinput@ForAll(f, IsHurwitzInt);|
  true
  !gapprompt@gap>| !gapinput@ForAll(f/2, IsHurwitzInt);|
  false
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{QuaternionD4Basis}}
\logpage{[ 2, 4, 4 ]}\nobreak
\hyperdef{L}{X78FF8724803E2AB4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{QuaternionD4Basis\index{QuaternionD4Basis@\texttt{QuaternionD4Basis}}
\label{QuaternionD4Basis}
}\hfill{\scriptsize (global variable)}}\\


 The \textsf{ALCO} package loads a basis for a quaternion algebra over {\ensuremath{\mathbb Q}}
with the geometry of a $D_4$ simple root system. The {\ensuremath{\mathbb Z}}\texttt{\symbol{45}}span of
this basis is the \texttt{HurwitzIntegers} (\ref{HurwitzIntegers}) ring. These basis vectors close under pairwise reflection or multiplication to
form a $ D_4$ root system. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@B := QuaternionD4Basis;;|
  !gapprompt@gap>| !gapinput@for x in BasisVectors(B) 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
  (-1/2)*e+(1/2)*i+(-1/2)*j+(-1/2)*k
  e
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Icosian Tools}}\logpage{[ 2, 5, 0 ]}
\hyperdef{L}{X79CDD8757D97A598}{}
{
  The icosian ring is a subring of the quaternion algebra over the "golden
field" $\mathbb{Q}(\sqrt{5})$ This ring is described and studied in \cite[pp. 207\texttt{\symbol{45}}211]{conway_sphere_2013} and \cite[p. 220]{wilson_finite_2009}. The icosian ring has $120$ units, or elements with quaternion norm of $1$. These units are closed under quaternion multiplication. These icosian units
also exhibit a $H_4$ geometry in the sense that they are closed under Weyl reflection relative to
the standard Euclidean inner product defined by the quaternion norm. The
Coxeter group generated by these reflections is the group $W(H_4)$. The coefficients of an icosian in the standard quaternion basis belong to
the integer subring of the golden field, meaning that these coefficients have
the form $a + b \sigma$, where $a,b$ are rational integers and $\sigma = (1-\sqrt{5})/2$. 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$\texttt{\symbol{45}}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 \textsf{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 \textsf{GAP} as \texttt{NF(5, [ 1, 4 ])} or \texttt{Field(Sqrt(5))} and that $\sigma$ is given by \texttt{\texttt{\symbol{45}}EB(5)}. 
\subsection{\textcolor{Chapter }{Icosian Ring}}\logpage{[ 2, 5, 1 ]}
\hyperdef{L}{X87BAE3917C966AA5}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IcosianRing\index{IcosianRing@\texttt{IcosianRing}}
\label{IcosianRing}
}\hfill{\scriptsize (global variable)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsIcosian({\mdseries\slshape x})\index{IsIcosian@\texttt{IsIcosian}}
\label{IsIcosian}
}\hfill{\scriptsize (operation)}}\\


 The \texttt{IcosianRing} is a subring of the the quaternion algebra over \texttt{NF(5,[1,4])} generated by a set of vectors with an $H_4$ geometry. This ring is described well in \cite[p. 220]{wilson_finite_2009}. \texttt{CanonicalBasis(IcosianRing)} returns \texttt{IcosianH4Generators} (\ref{IcosianH4Generators}). We can test whether a quaternion is in \texttt{IcosianRing} using the operation \texttt{IsIcosian(\mbox{\texttt{\mdseries\slshape x}})}. Note that a quaternion is an icosian when it is a {\ensuremath{\mathbb
Z}}\texttt{\symbol{45}}linear combination of the union of \texttt{Basis(IcosianRing)} and \texttt{Basis(IcosianRing)*EB(5)}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@f := BasisVectors(Basis(IcosianRing));;|
  !gapprompt@gap>| !gapinput@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
  !gapprompt@gap>| !gapinput@ForAll(f, IsIcosian);|
  true
  !gapprompt@gap>| !gapinput@ForAll(f/2, IsIcosian);|
  false
  !gapprompt@gap>| !gapinput@ForAll(f*EB(5), IsIcosian);|
  true
  !gapprompt@gap>| !gapinput@ForAll(f*Sqrt(5), IsIcosian);|
  true
  !gapprompt@gap>| !gapinput@ForAll(f*(1-Sqrt(5))/2, IsIcosian);|
  true
  !gapprompt@gap>| !gapinput@ForAll(f*(1+Sqrt(5))/2, IsIcosian);|
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IcosianH4Generators}}
\logpage{[ 2, 5, 2 ]}\nobreak
\hyperdef{L}{X7F4267A77E5F8547}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IcosianH4Generators\index{IcosianH4Generators@\texttt{IcosianH4Generators}}
\label{IcosianH4Generators}
}\hfill{\scriptsize (global variable)}}\\


 The \textsf{ALCO} package loads this variable as a basis for a quaternion algebra over \texttt{NF(5,[1,4])}. Note that a quaternion is an icosian when it is a {\ensuremath{\mathbb
Z}}\texttt{\symbol{45}}linear combination of the union of \texttt{ IcosianH4Generators} and \texttt{IcosianH4Generators*EB(5)}. These basis vectors close under pairwise reflection or multiplication to
form a $H_4$ set of vectors. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@f := BasisVectors(IcosianH4Generators);;|
  !gapprompt@gap>| !gapinput@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
\end{Verbatim}
 }

 
\subsection{\textcolor{Chapter }{GoldenModSigma}}\logpage{[ 2, 5, 3 ]}
\hyperdef{L}{X7C5123127E6FFFA7}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{GoldenModSigma({\mdseries\slshape x})\index{GoldenModSigma@\texttt{GoldenModSigma}}
\label{GoldenModSigma}
}\hfill{\scriptsize (function)}}\\


 For \mbox{\texttt{\mdseries\slshape x}} in the golden field \texttt{NF(5,[ 1, 4 ])}, this function returns the rational coefficient of \texttt{1} in the basis \texttt{Basis(NF(5,[ 1, 4 ]), [1, (1\texttt{\symbol{45}}Sqrt(5))/2])}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@sigma := (1-Sqrt(5))/2;; tau := (1+Sqrt(5))/2;;|
  !gapprompt@gap>| !gapinput@x := 5 + 3*sigma;; GoldenModSigma(x);|
  5
  !gapprompt@gap>| !gapinput@GoldenModSigma(sigma);|
  0
  !gapprompt@gap>| !gapinput@GoldenModSigma(tau);|
  1
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Other Integer Rings}}\logpage{[ 2, 6, 0 ]}
\hyperdef{L}{X816679827A2DC3D4}{}
{
  Certain addition integer subrings of elements satisfying \texttt{IsCyc} are also included in the \textsf{ALCO} package. The rings constructed below are described in \cite[pp. 16\texttt{\symbol{45}}18]{conway_quaternions_2003}. 

\subsection{\textcolor{Chapter }{EisensteinIntegers}}
\logpage{[ 2, 6, 1 ]}\nobreak
\hyperdef{L}{X87AE22947AC81C0E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{EisensteinIntegers\index{EisensteinIntegers@\texttt{EisensteinIntegers}}
\label{EisensteinIntegers}
}\hfill{\scriptsize (global variable)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsEisenInt({\mdseries\slshape x})\index{IsEisenInt@\texttt{IsEisenInt}}
\label{IsEisenInt}
}\hfill{\scriptsize (operation)}}\\


 The \texttt{EisensteinIntegers} is a subring of the complex numbers generated by \texttt{1} and \texttt{E(3)}. This subring has the geometry of an $A_2$ lattice. This ring is described well in \cite[p. 16]{conway_quaternions_2003}. We can test whether an element in \texttt{IsCyc} is an Eisenstein integer using the operation \texttt{IsEisenInt(\mbox{\texttt{\mdseries\slshape x}})}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@f := BasisVectors(Basis(EisensteinIntegers));|
  [ 1, E(3) ]
  !gapprompt@gap>| !gapinput@IsEisenInt(E(4));|
  false
  !gapprompt@gap>| !gapinput@IsEisenInt(1+E(3)^2);|
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{KleinianIntegers}}
\logpage{[ 2, 6, 2 ]}\nobreak
\hyperdef{L}{X82AA45BF87E1AE33}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{KleinianIntegers\index{KleinianIntegers@\texttt{KleinianIntegers}}
\label{KleinianIntegers}
}\hfill{\scriptsize (global variable)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsKleinInt({\mdseries\slshape x})\index{IsKleinInt@\texttt{IsKleinInt}}
\label{IsKleinInt}
}\hfill{\scriptsize (operation)}}\\


 The \texttt{KleinianIntegers} is a subring of the complex numbers generated by \texttt{1} an\texttt{(1/2)*(\texttt{\symbol{45}}1+Sqrt(\texttt{\symbol{45}}7))}. This ring is described in \cite[p. 18]{conway_quaternions_2003}. We can test whether an element in \texttt{IsCyc} is an Kleinian integer using the operation \texttt{IsKleinInt(\mbox{\texttt{\mdseries\slshape x}})}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@f := BasisVectors(Basis(KleinianIntegers));|
  [ 1, E(7)+E(7)^2+E(7)^4 ]
  !gapprompt@gap>| !gapinput@IsKleinInt(E(4));|
  false
  !gapprompt@gap>| !gapinput@IsKleinInt(1+E(7)+E(7)^2+E(7)^4);|
  true
\end{Verbatim}
 }

 }

 }

 
\chapter{\textcolor{Chapter }{Simple Euclidean Jordan Algebras}}\logpage{[ 3, 0, 0 ]}
\hyperdef{L}{X7E13C2AE7DEAF62D}{}
{
  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 Jordan algebra on the same
elements using the product $x \circ y = (xy + yx)/2$. A Jordan algebra $V$ is \emph{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$ \cite[p. 42]{faraut_analysis_1994}. Euclidean Jordan algebras are in
one\texttt{\symbol{45}}to\texttt{\symbol{45}}one correspondence with
structures known as symmetric cones, and any Euclidean Jordan algebra is the
direct sum of simple Euclidean Jordan algebras \cite[chap. 3]{faraut_analysis_1994}. 

 The simple Euclidean Jordan algebras, in turn, are classified by rank and
degree into four families and one exception \cite[chap. 5]{faraut_analysis_1994}. 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 \textsf{ALCO} package provides a number of tools to construct and manipulate simple
Euclidean Jordan algebras (described well in \cite{faraut_analysis_1994}), including their homotope and isotopes algebras (defined in \cite[p. 86]{mccrimmon_taste_2004}). Among other applications, these tools can reproduce many of the examples
found in \cite{elkies_exceptional_1996} and \cite{elkies_cubic_2001}. 
\section{\textcolor{Chapter }{Filters and Basic Attributes}}\logpage{[ 3, 1, 0 ]}
\hyperdef{L}{X802D4E3380BC3177}{}
{
  
\subsection{\textcolor{Chapter }{Jordan Filters}}\logpage{[ 3, 1, 1 ]}
\hyperdef{L}{X878107A77FBFD00A}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsJordanAlgebra\index{IsJordanAlgebra@\texttt{IsJordanAlgebra}}
\label{IsJordanAlgebra}
}\hfill{\scriptsize (filter)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsJordanAlgebraObj\index{IsJordanAlgebraObj@\texttt{IsJordanAlgebraObj}}
\label{IsJordanAlgebraObj}
}\hfill{\scriptsize (filter)}}\\


These filters determine whether an element is a Jordan algebra (\texttt{IsJordanAlgebra}) or is an element in a Jordan algebra (\texttt{IsJordanAlgebraObj}). }

 
\subsection{\textcolor{Chapter }{Jordan Rank}}\logpage{[ 3, 1, 2 ]}
\hyperdef{L}{X7D20807E8513CEE8}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanRank({\mdseries\slshape x})\index{JordanRank@\texttt{JordanRank}}
\label{JordanRank}
}\hfill{\scriptsize (method)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{Rank({\mdseries\slshape x})\index{Rank@\texttt{Rank}!Jordan Algebras}
\label{Rank:Jordan Algebras}
}\hfill{\scriptsize (method)}}\\


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 \mbox{\texttt{\mdseries\slshape x}} when \texttt{IsJordanAlgebra(\mbox{\texttt{\mdseries\slshape x}})} or the rank of the Jordan algebra containing \mbox{\texttt{\mdseries\slshape x}} (computed as \texttt{FamilyObj(x)!.fullSCAlgebra}) when \texttt{IsJordanAlgebraObj(\mbox{\texttt{\mdseries\slshape x}})}. The method \texttt{Rank(\mbox{\texttt{\mdseries\slshape x}})} returns \texttt{JordanRank(\mbox{\texttt{\mdseries\slshape x}})} when \mbox{\texttt{\mdseries\slshape x}} satisfies either \texttt{IsJordanAlgebra} o\texttt{IsJordanAlgebraObj}. }

 
\subsection{\textcolor{Chapter }{Jordan Degree}}\logpage{[ 3, 1, 3 ]}
\hyperdef{L}{X7CFD4EB480976FF8}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDegree({\mdseries\slshape x})\index{JordanDegree@\texttt{JordanDegree}}
\label{JordanDegree}
}\hfill{\scriptsize (method)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{Degree({\mdseries\slshape x})\index{Degree@\texttt{Degree}!Jordan Algebras}
\label{Degree:Jordan Algebras}
}\hfill{\scriptsize (method)}}\\


 The degree of a Jordan algebra is the dimension of the
off\texttt{\symbol{45}}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 \mbox{\texttt{\mdseries\slshape x}} when \texttt{IsJordanAlgebra(\mbox{\texttt{\mdseries\slshape x}})} or the degree of the Jordan algebra containing \mbox{\texttt{\mdseries\slshape x}} (computed as \texttt{FamilyObj(x)!.fullSCAlgebra}) when \texttt{IsJordanAlgebraObj(\mbox{\texttt{\mdseries\slshape x}})}. The method \texttt{Degree(\mbox{\texttt{\mdseries\slshape x}})} returns \texttt{JordanDegree(\mbox{\texttt{\mdseries\slshape x}})} when \mbox{\texttt{\mdseries\slshape x}} satisfies either \texttt{IsJordanAlgebra} or \texttt{IsJordanAlgebraObj}. }

 Each vector in a simple Euclidean Jordan algebra can be written as a
{\ensuremath{\mathbb R}}\texttt{\symbol{45}}linear combination of mutually
orthogonal primitive idempotents. This is called the \emph{spectral decomposition} of a Jordan algebra element. The coefficients in the decomposition are the \emph{eigenvalues} of the element. The Jordan trace and determinant, described below, are
respectively the sum and product of these eigenvalues with multiplicities
included \cite[p. 44]{faraut_analysis_1994}. 

\subsection{\textcolor{Chapter }{Trace (Jordan Algebras)}}
\logpage{[ 3, 1, 4 ]}\nobreak
\hyperdef{L}{X80051D4E7B64E102}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{Trace({\mdseries\slshape x})\index{Trace@\texttt{Trace}!Jordan Algebras}
\label{Trace:Jordan Algebras}
}\hfill{\scriptsize (method)}}\\


Returns the Jordan trace of \mbox{\texttt{\mdseries\slshape x}} when \texttt{IsJordanAlgebraObj(\mbox{\texttt{\mdseries\slshape x}})}. The trace of a Jordan algebra element is the sum of the eigenvalues of that
element (with multiplicies included). }

 

\subsection{\textcolor{Chapter }{Determinant (Jordan Algebras)}}
\logpage{[ 3, 1, 5 ]}\nobreak
\hyperdef{L}{X844D03667EC7C372}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{Determinant({\mdseries\slshape x})\index{Determinant@\texttt{Determinant}!Jordan Algebras}
\label{Determinant:Jordan Algebras}
}\hfill{\scriptsize (method)}}\\


Returns the Jordan determinant of \mbox{\texttt{\mdseries\slshape x}} when \texttt{IsJordanAlgebraObj(\mbox{\texttt{\mdseries\slshape x}})}. The determinant of a Jordan algebra element is the product of the
eigenvalues of that element (with multiplicies included).}

 

\subsection{\textcolor{Chapter }{Norm (Jordan Algebras)}}
\logpage{[ 3, 1, 6 ]}\nobreak
\hyperdef{L}{X83B5D76B87AEF802}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{Norm({\mdseries\slshape x})\index{Norm@\texttt{Norm}!Jordan Algebras}
\label{Norm:Jordan Algebras}
}\hfill{\scriptsize (method)}}\\


Returns the Jordan norm of \mbox{\texttt{\mdseries\slshape x}} when \texttt{IsJordanAlgebraObj(\mbox{\texttt{\mdseries\slshape x}})}. The Jordan norm has the value \texttt{Trace(\mbox{\texttt{\mdseries\slshape x}}\texttt{\symbol{94}}2)/2}. }

 

\subsection{\textcolor{Chapter }{GenericMinimalPolynomial}}
\logpage{[ 3, 1, 7 ]}\nobreak
\hyperdef{L}{X85D508B5853906E5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{GenericMinimalPolynomial({\mdseries\slshape x})\index{GenericMinimalPolynomial@\texttt{GenericMinimalPolynomial}}
\label{GenericMinimalPolynomial}
}\hfill{\scriptsize (attribute)}}\\


 Returns the generic minimal polynomial of \mbox{\texttt{\mdseries\slshape x}} when \texttt{IsJordanAlgebraObj(\mbox{\texttt{\mdseries\slshape x}})} as defined in \cite[p. 478]{faraut_analysis_2000} (see also \cite[pp. 27\texttt{\symbol{45}}31]{faraut_analysis_1994}). 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. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@J := AlbertAlgebra(Rationals);;|
  !gapprompt@gap>| !gapinput@x := Sum(Basis(J){[4,5,6,25,26,27]});|
  i4+i5+i6+ei+ej+ek
  !gapprompt@gap>| !gapinput@[JordanRank(J), JordanDegree(J)];|
  [ 3, 8 ]
  !gapprompt@gap>| !gapinput@[JordanRank(x), JordanDegree(x)];|
  [ 3, 8 ]
  !gapprompt@gap>| !gapinput@p := GenericMinimalPolynomial(x);|
  [ 2, 0, -3, 1 ]
  !gapprompt@gap>| !gapinput@Trace(x);|
  3
  !gapprompt@gap>| !gapinput@Determinant(x);|
  -2
  !gapprompt@gap>| !gapinput@Norm(x);|
  9/2
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Jordan Algebra Constructions}}\logpage{[ 3, 2, 0 ]}
\hyperdef{L}{X7FBD095A7B884F7F}{}
{
  The classification of simple Euclidean Jordan algebras is described in \cite[chap. 5]{faraut_analysis_1994}. 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 \cite[p. 25]{faraut_analysis_1994}. 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 \textsf{ALCO} package provides tools to use both constructions to create simple Euclidean
Jordan algebras with elements that satisfy \texttt{IsSCAlgebraObj}. 

\subsection{\textcolor{Chapter }{SimpleEuclideanJordanAlgebra}}
\logpage{[ 3, 2, 1 ]}\nobreak
\hyperdef{L}{X7852050A81DEB9F4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{SimpleEuclideanJordanAlgebra({\mdseries\slshape rho, d[, args]})\index{SimpleEuclideanJordanAlgebra@\texttt{SimpleEuclideanJordanAlgebra}}
\label{SimpleEuclideanJordanAlgebra}
}\hfill{\scriptsize (function)}}\\


 Returns a simple Euclidean Jordan algebra over {\ensuremath{\mathbb Q}}. The
construction used depends on the arguments given in the following manner. 

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

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

 Note that (in contrast to \texttt{AlbertAlgebra} (\ref{AlbertAlgebra})) the Hermitian Jordan algebras constructed using \texttt{SimpleEuclideanJordanAlgebra} uses the upper triangular entries of the Hermitian matrices define the basis
vectors. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@J := SimpleEuclideanJordanAlgebra(3,8);|
  <algebra-with-one of dimension 27 over Rationals>
  !gapprompt@gap>| !gapinput@Derivations(Basis(J));; SemiSimpleType(last);|
  "F4"
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{JordanSpinFactor}}
\logpage{[ 3, 2, 2 ]}\nobreak
\hyperdef{L}{X86C6713C8178A69F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanSpinFactor({\mdseries\slshape G})\index{JordanSpinFactor@\texttt{JordanSpinFactor}}
\label{JordanSpinFactor}
}\hfill{\scriptsize (function)}}\\


 Returns a Jordan spin factor algebra when \mbox{\texttt{\mdseries\slshape G}} is a positive definite Gram matrix. This is the Jordan algebra of rank 2
constructed from a symmetric bilinear form, as described in \cite[p. 25]{faraut_analysis_1994}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@J := JordanSpinFactor(IdentityMat(8));|
  <algebra-with-one of dimension 9 over Rationals>
  !gapprompt@gap>| !gapinput@One(J);|
  v.1
  !gapprompt@gap>| !gapinput@[JordanRank(J), JordanDegree(J)];|
  [ 2, 7 ]
  !gapprompt@gap>| !gapinput@Derivations(Basis(J));|
  <Lie algebra of dimension 28 over Rationals>
  !gapprompt@gap>| !gapinput@SemiSimpleType(last);|
  "D4"
  !gapprompt@gap>| !gapinput@x := Sum(Basis(J){[4,5,6,7]});|
  v.4+v.5+v.6+v.7
  !gapprompt@gap>| !gapinput@[Trace(x), Determinant(x)];|
  [ 0, -4 ]
  !gapprompt@gap>| !gapinput@p := GenericMinimalPolynomial(x);|
  [ -4, 0, 1 ]
  !gapprompt@gap>| !gapinput@ValuePol(p,x);|
  0*v.1
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HermitianSimpleJordanAlgebra}}
\logpage{[ 3, 2, 3 ]}\nobreak
\hyperdef{L}{X859F001D7CB6CBD8}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{HermitianSimpleJordanAlgebra({\mdseries\slshape r, B})\index{HermitianSimpleJordanAlgebra@\texttt{HermitianSimpleJordanAlgebra}}
\label{HermitianSimpleJordanAlgebra}
}\hfill{\scriptsize (function)}}\\


 Returns a simple Euclidean Jordan algebra of rank \mbox{\texttt{\mdseries\slshape r}} with the basis for the off\texttt{\symbol{45}}diagonal components defined
using composition algebra basis \mbox{\texttt{\mdseries\slshape B}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@J := HermitianSimpleJordanAlgebra(3,QuaternionD4Basis);|
  <algebra-with-one of dimension 15 over Rationals>
  !gapprompt@gap>| !gapinput@[JordanRank(J), JordanDegree(J)];|
  [ 3, 4 ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{JordanHomotope}}
\logpage{[ 3, 2, 4 ]}\nobreak
\hyperdef{L}{X800B48C383196E06}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanHomotope({\mdseries\slshape J, u[, s]})\index{JordanHomotope@\texttt{JordanHomotope}}
\label{JordanHomotope}
}\hfill{\scriptsize (function)}}\\


 For \mbox{\texttt{\mdseries\slshape J}} a Jordan algebra satisfying \texttt{IsJordanAlgebra(\mbox{\texttt{\mdseries\slshape J}} )}, and for \mbox{\texttt{\mdseries\slshape u}} a vector in \mbox{\texttt{\mdseries\slshape J}}, this function returns the corresponding \mbox{\texttt{\mdseries\slshape u}}\texttt{\symbol{45}}homotope algebra with the product of $x$ and $y$ defined as $x(uy)+(xu)y - u(xy)$. The \mbox{\texttt{\mdseries\slshape u}}\texttt{\symbol{45}}homotope algebra also belongs to the filter \texttt{IsJordanAlgebra}. 

 Of note, if \mbox{\texttt{\mdseries\slshape u}} is invertible in \mbox{\texttt{\mdseries\slshape J}} then the corresponding \mbox{\texttt{\mdseries\slshape u}}\texttt{\symbol{45}}homotope algebra is called a \mbox{\texttt{\mdseries\slshape u}}\texttt{\symbol{45}}isotope. The optional argument \mbox{\texttt{\mdseries\slshape 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 \cite[pp.82\texttt{\symbol{45}}86]{mccrimmon_taste_2004}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@J := SimpleEuclideanJordanAlgebra(2,7);|
  <algebra-with-one of dimension 9 over Rationals>
  !gapprompt@gap>| !gapinput@u := Sum(Basis(J){[1,2,7,8]});|
  v.1+v.2+v.7+v.8
  !gapprompt@gap>| !gapinput@Inverse(u);|
  (-1/2)*v.1+(1/2)*v.2+(1/2)*v.7+(1/2)*v.8
  !gapprompt@gap>| !gapinput@GenericMinimalPolynomial(u);|
  [ -2, -2, 1 ]
  !gapprompt@gap>| !gapinput@H := JordanHomotope(J, u, "w.");|
  <algebra-with-one of dimension 9 over Rationals>
  !gapprompt@gap>| !gapinput@One(H);|
  (-1/2)*w.1+(1/2)*w.2+(1/2)*w.7+(1/2)*w.8
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{The Albert Algebra}}\logpage{[ 3, 3, 0 ]}
\hyperdef{L}{X7B9397277AF7F920}{}
{
  The exceptional simple Euclidean Jordan algebra, or Albert algebra, may be
constructed using \texttt{SimpleEuclideanJordanAlgebra} (\ref{SimpleEuclideanJordanAlgebra}) with rank 3 and degree 8. However, that construction uses the upper triangular
entries of the Hermitian matrices define the basis vectors (i.e., the \texttt{[1][2], [2][3], [1][3]} entries). Much of the literature on the Albert algebra instead uses the \texttt{[1][2], [2][3], [3][1]} entries of the Hermitian matrices to define the basis vectors (see for exampl\cite[pp. 147\texttt{\symbol{45}}148]{wilson_finite_2009}). The \textsf{ALCO} package provides a specific construction of the Albert algebra that uses this
convention for defining basis vectors, described below. 

\subsection{\textcolor{Chapter }{AlbertAlgebra}}
\logpage{[ 3, 3, 1 ]}\nobreak
\hyperdef{L}{X7A6AFFE07994B4A9}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{AlbertAlgebra({\mdseries\slshape F})\index{AlbertAlgebra@\texttt{AlbertAlgebra}}
\label{AlbertAlgebra}
}\hfill{\scriptsize (function)}}\\


 For \mbox{\texttt{\mdseries\slshape F}} a field, this function returns an Albert algebra over \mbox{\texttt{\mdseries\slshape F}}. For \texttt{\mbox{\texttt{\mdseries\slshape F}} = Rationals}, this algebra is isomorphic to \texttt{HermitianSimpleJordanAlgebra(3,8,Basis(Oct))} but in a basis that is more convenient for reproducing certain calculations in
the literature. Specifically, while \texttt{HermitianSimpleJordanAlgebra(3,8,Basis(Oct))} uses the upper\texttt{\symbol{45}}triangular elements of a Hermitian matrix as
representative, \texttt{AlbertAlgebra(\mbox{\texttt{\mdseries\slshape F}})} uses the \texttt{[1][2], [2][3], [3][1]} entries as representative. These are respectively labeled using \texttt{k,i,j}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@A := AlbertAlgebra(Rationals);|
  <algebra-with-one of dimension 27 over Rationals>
  !gapprompt@gap>| !gapinput@i := Basis(A){[1..8]};;|
  !gapprompt@gap>| !gapinput@j := Basis(A){[9..16]};;|
  !gapprompt@gap>| !gapinput@k := Basis(A){[17..24]};; |
  !gapprompt@gap>| !gapinput@e := Basis(A){[25..27]};;|
  !gapprompt@gap>| !gapinput@Display(i); Display(j); Display(k); Display(e);|
  [ i1, i2, i3, i4, i5, i6, i7, i8 ]
  [ j1, j2, j3, j4, j5, j6, j7, j8 ]
  [ k1, k2, k3, k4, k5, k6, k7, k8 ]
  [ ei, ej, ek ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{AlbertVectorToHermitianMatrix}}
\logpage{[ 3, 3, 2 ]}\nobreak
\hyperdef{L}{X860036647BB9325E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{AlbertVectorToHermitianMatrix({\mdseries\slshape x})\index{AlbertVectorToHermitianMatrix@\texttt{AlbertVectorToHermitianMatrix}}
\label{AlbertVectorToHermitianMatrix}
}\hfill{\scriptsize (function)}}\\


For an element \mbox{\texttt{\mdseries\slshape x}} in \texttt{AlbertAlgebra(\mbox{\texttt{\mdseries\slshape Rationals}})}, this function returns the corresponding 3 x 3 Hermitian matrix with octonion
entries in \texttt{OctonionAlgebra(\mbox{\texttt{\mdseries\slshape Rationals}})}. }

 

\subsection{\textcolor{Chapter }{HermitianMatrixToAlbertVector}}
\logpage{[ 3, 3, 3 ]}\nobreak
\hyperdef{L}{X8385802B7AE842E6}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{HermitianMatrixToAlbertVector({\mdseries\slshape x})\index{HermitianMatrixToAlbertVector@\texttt{HermitianMatrixToAlbertVector}}
\label{HermitianMatrixToAlbertVector}
}\hfill{\scriptsize (function)}}\\


For 3 x 3 Hermitian matrix with elements in \texttt{OctonionAlgebra(\mbox{\texttt{\mdseries\slshape Rationals}})}, this function returns the corresponding vector in in \texttt{AlbertAlgebra(\mbox{\texttt{\mdseries\slshape Rationals}})}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@j := Basis(AlbertAlgebra(Rationals)){[9..16]};|
  [ j1, j2, j3, j4, j5, j6, j7, j8 ]
  !gapprompt@gap>| !gapinput@mat := AlbertVectorToHermitianMatrix(j[3]);; Display(mat);|
  [ [     0*e1,     0*e1,  (-1)*e3 ],
    [     0*e1,     0*e1,     0*e1 ],
    [       e3,     0*e1,     0*e1 ] ]
  !gapprompt@gap>| !gapinput@HermitianMatrixToAlbertVector(mat);|
  j3
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{The Quadratic Representation}}\logpage{[ 3, 4, 0 ]}
\hyperdef{L}{X7F03850D819127E2}{}
{
  Many important features of simple Euclidean Jordan algebra and their isotopes
are related to the quadratic representation. This aspect of Jordan algebras is
described well in \cite[pp.82\texttt{\symbol{45}}86]{mccrimmon_taste_2004} and \cite[pp. 32\texttt{\symbol{45}}38]{faraut_analysis_1994}. The following methods allow for the construction of Jordan quadratic maps
and the standard triple product on a Jordan algebra. 

\subsection{\textcolor{Chapter }{JordanQuadraticOperator}}
\logpage{[ 3, 4, 1 ]}\nobreak
\hyperdef{L}{X79DF7566833EA9F9}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanQuadraticOperator({\mdseries\slshape x[, y]})\index{JordanQuadraticOperator@\texttt{JordanQuadraticOperator}}
\label{JordanQuadraticOperator}
}\hfill{\scriptsize (operation)}}\\


 For \mbox{\texttt{\mdseries\slshape x}} and \mbox{\texttt{\mdseries\slshape y}} Jordan algebra elements, satisfying \texttt{IsJordanAlgebraObj} this operation applies two methods. In the case of \texttt{JordanQuadraticOperator(\mbox{\texttt{\mdseries\slshape x}}, y)}, this operation returns \texttt{2*x*(x*y) \texttt{\symbol{45}} (x\texttt{\symbol{94}}2)*y}. In the case of \texttt{JordanQuadraticOperator(x)}, this operation returns the matrix representing the quadratic map in the
canonical basis of the Jordan algebra \mbox{\texttt{\mdseries\slshape J}} containing \mbox{\texttt{\mdseries\slshape x}}. For \texttt{L(x)} the matrix \texttt{AdjointMatrix(CanonicalBasis(J), x)}, the operation \texttt{JordanQuadraticOperator(\mbox{\texttt{\mdseries\slshape x}})} returns the matrix \texttt{2 L(x)\texttt{\symbol{94}}2 \texttt{\symbol{45}} L(x\texttt{\symbol{94}}2)}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@J := JordanSpinFactor(IdentityMat(3));|
  <algebra-with-one of dimension 4 over Rationals>
  !gapprompt@gap>| !gapinput@x := [-1,4/3,-1,1]*Basis(J);|
  (-1)*v.1+(4/3)*v.2+(-1)*v.3+v.4
  !gapprompt@gap>| !gapinput@y := [-1, -1/2, 2, -1/2]*Basis(J);|
  (-1)*v.1+(-1/2)*v.2+(2)*v.3+(-1/2)*v.4
  !gapprompt@gap>| !gapinput@JordanQuadraticOperator(x,y);|
  (14/9)*v.1+(-79/18)*v.2+(-11/9)*v.3+(-53/18)*v.4
  !gapprompt@gap>| !gapinput@JordanQuadraticOperator(x);; Display(last);|
  [ [  43/9,  -8/3,     2,    -2 ],
    [  -8/3,   7/9,  -8/3,   8/3 ],
    [     2,  -8/3,  -7/9,    -2 ],
    [    -2,   8/3,    -2,  -7/9 ] ]
  !gapprompt@gap>| !gapinput@LinearCombination(Basis(J), JordanQuadraticOperator(x)|
  !gapprompt@>| !gapinput@*ExtRepOfObj(y)) = JordanQuadraticOperator(x,y);|
  true
  !gapprompt@gap>| !gapinput@ExtRepOfObj(JordanQuadraticOperator(x,y)) = |
  !gapprompt@>| !gapinput@JordanQuadraticOperator(x)*ExtRepOfObj(y);|
  true
  !gapprompt@gap>| !gapinput@JordanQuadraticOperator(2*x) = 4*JordanQuadraticOperator(x);|
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{JordanTripleSystem}}
\logpage{[ 3, 4, 2 ]}\nobreak
\hyperdef{L}{X7B5ABEA7816F6258}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanTripleSystem({\mdseries\slshape x, y, z})\index{JordanTripleSystem@\texttt{JordanTripleSystem}}
\label{JordanTripleSystem}
}\hfill{\scriptsize (operation)}}\\


 For Jordan algebra elements \mbox{\texttt{\mdseries\slshape x}}, \mbox{\texttt{\mdseries\slshape y}}, \mbox{\texttt{\mdseries\slshape z}} satisfying \texttt{IsJordanAlgebraObj}, the operation \texttt{JordanTripleSystem(\mbox{\texttt{\mdseries\slshape x}},\mbox{\texttt{\mdseries\slshape y}},\mbox{\texttt{\mdseries\slshape z}})} returns the Jordan triple product defined in terms of the Jordan product as \texttt{\mbox{\texttt{\mdseries\slshape x}}*(\mbox{\texttt{\mdseries\slshape y}}*\mbox{\texttt{\mdseries\slshape z}}) + (\mbox{\texttt{\mdseries\slshape x}}*\mbox{\texttt{\mdseries\slshape y}})*\mbox{\texttt{\mdseries\slshape z}} \texttt{\symbol{45}} \mbox{\texttt{\mdseries\slshape y}}*(\mbox{\texttt{\mdseries\slshape x}}*\mbox{\texttt{\mdseries\slshape z}})}. Equivalently, \texttt{2*JordanTripleSystem(\mbox{\texttt{\mdseries\slshape x}},\mbox{\texttt{\mdseries\slshape y}},\mbox{\texttt{\mdseries\slshape z}})} is equal to \texttt{JordanQuadraticOperator(x+z, y) \texttt{\symbol{45}}
JordanQuadraticOperator(x, y) \texttt{\symbol{45}} JordanQuadraticOperator(z,
y)}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@J := AlbertAlgebra(Rationals);|
  <algebra-with-one of dimension 27 over Rationals>
  !gapprompt@gap>| !gapinput@i := Basis(J){[1..8]};|
  [ i1, i2, i3, i4, i5, i6, i7, i8 ]
  !gapprompt@gap>| !gapinput@j := Basis(J){[9..16]};|
  [ j1, j2, j3, j4, j5, j6, j7, j8 ]
  !gapprompt@gap>| !gapinput@k := Basis(J){[17..24]};|
  [ k1, k2, k3, k4, k5, k6, k7, k8 ]
  !gapprompt@gap>| !gapinput@e := Basis(J){[25..27]};|
  [ ei, ej, ek ]
  !gapprompt@gap>| !gapinput@List(i, x -> JordanTripleSystem(i[1],i[1],x));|
  [ i1, i2, i3, i4, i5, i6, i7, i8 ]
  !gapprompt@gap>| !gapinput@List(j, x -> 2*JordanTripleSystem(i[1],i[1],x));|
  [ j1, j2, j3, j4, j5, j6, j7, j8 ]
  !gapprompt@gap>| !gapinput@List(k, x -> 2*JordanTripleSystem(i[1],i[1],x));|
  [ k1, k2, k3, k4, k5, k6, k7, k8 ]
  !gapprompt@gap>| !gapinput@List(e, x -> JordanTripleSystem(i[1],i[1],x));|
  [ 0*i1, ej, ek ]
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Additional Tools and Properties}}\logpage{[ 3, 5, 0 ]}
\hyperdef{L}{X7EA1D48F853C02F1}{}
{
  

\subsection{\textcolor{Chapter }{HermitianJordanAlgebraBasis}}
\logpage{[ 3, 5, 1 ]}\nobreak
\hyperdef{L}{X7C236EB080D05CD4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{HermitianJordanAlgebraBasis({\mdseries\slshape r, B})\index{HermitianJordanAlgebraBasis@\texttt{HermitianJordanAlgebraBasis}}
\label{HermitianJordanAlgebraBasis}
}\hfill{\scriptsize (function)}}\\


 Returns a set of Hermitian matrices to serve as a basis for the Jordan algebra
of rank \mbox{\texttt{\mdseries\slshape r}} and degree given by the cardinality of composition algebra basis \mbox{\texttt{\mdseries\slshape B}}. The elements spanning each off\texttt{\symbol{45}}diagonal components are
determined by basis \mbox{\texttt{\mdseries\slshape B}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@H := QuaternionAlgebra(Rationals);;|
  !gapprompt@gap>| !gapinput@for x in HermitianJordanAlgebraBasis(2, Basis(H)) do Display(x); od;|
  [ [    e,  0*e ],
    [  0*e,  0*e ] ]
  [ [  0*e,  0*e ],
    [  0*e,    e ] ]
  [ [  0*e,    e ],
    [    e,  0*e ] ]
  [ [     0*e,       i ],
    [  (-1)*i,     0*e ] ]
  [ [     0*e,       j ],
    [  (-1)*j,     0*e ] ]
  [ [     0*e,       k ],
    [  (-1)*k,     0*e ] ]
  !gapprompt@gap>| !gapinput@AsList(Basis(H));|
  [ e, i, j, k ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{JordanMatrixBasis}}
\logpage{[ 3, 5, 2 ]}\nobreak
\hyperdef{L}{X853480DC7F9B0BD7}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanMatrixBasis({\mdseries\slshape J})\index{JordanMatrixBasis@\texttt{JordanMatrixBasis}}
\label{JordanMatrixBasis}
}\hfill{\scriptsize (attribute)}}\\


 If \texttt{IsJordanAlgebra( \mbox{\texttt{\mdseries\slshape J}} )} and \mbox{\texttt{\mdseries\slshape J}} has been constructed using \texttt{HermitianSimpleJordanAlgebra} (\ref{HermitianSimpleJordanAlgebra}), then the set of matrices corresponding to \texttt{CanonicalBasis( \mbox{\texttt{\mdseries\slshape J}} )} can be obtained using \texttt{JordanMatrixBasis( \mbox{\texttt{\mdseries\slshape J}} )}. }

 

\subsection{\textcolor{Chapter }{HermitianMatrixToJordanVector}}
\logpage{[ 3, 5, 3 ]}\nobreak
\hyperdef{L}{X7D167A057F3CB029}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{HermitianMatrixToJordanVector({\mdseries\slshape mat, J})\index{HermitianMatrixToJordanVector@\texttt{HermitianMatrixToJordanVector}}
\label{HermitianMatrixToJordanVector}
}\hfill{\scriptsize (function)}}\\


 Converts matrix \mbox{\texttt{\mdseries\slshape mat}} into an element of Jordan algebra \mbox{\texttt{\mdseries\slshape J}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@H := QuaternionAlgebra(Rationals);;|
  !gapprompt@gap>| !gapinput@J := HermitianSimpleJordanAlgebra(2,Basis(H));|
  <algebra-with-one of dimension 6 over Rationals>
  !gapprompt@gap>| !gapinput@AsList(CanonicalBasis(J));|
  [ v.1, v.2, v.3, v.4, v.5, v.6 ]
  !gapprompt@gap>| !gapinput@JordanMatrixBasis(J);; for x in last do Display(x); od;|
  [ [    e,  0*e ],
    [  0*e,  0*e ] ]
  [ [  0*e,  0*e ],
    [  0*e,    e ] ]
  [ [  0*e,    e ],
    [    e,  0*e ] ]
  [ [     0*e,       i ],
    [  (-1)*i,     0*e ] ]
  [ [     0*e,       j ],
    [  (-1)*j,     0*e ] ]
  [ [     0*e,       k ],
    [  (-1)*k,     0*e ] ]
  !gapprompt@gap>| !gapinput@List(JordanMatrixBasis(J), x -> HermitianMatrixToJordanVector(x, J));|
  [ v.1, v.2, v.3, v.4, v.5, v.6 ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{JordanAlgebraGramMatrix}}
\logpage{[ 3, 5, 4 ]}\nobreak
\hyperdef{L}{X7B6084887C1C5AF1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanAlgebraGramMatrix({\mdseries\slshape J})\index{JordanAlgebraGramMatrix@\texttt{JordanAlgebraGramMatrix}}
\label{JordanAlgebraGramMatrix}
}\hfill{\scriptsize (attribute)}}\\


 For \texttt{IsJordanAlgebra( \mbox{\texttt{\mdseries\slshape J}} )}, returns the Gram matrix on \texttt{CanonicalBasis( \mbox{\texttt{\mdseries\slshape J}} )} using inner produc\texttt{Trace(x*y)}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@J := HermitianSimpleJordanAlgebra(2,OctonionE8Basis);|
  <algebra-with-one of dimension 10 over Rationals>
  !gapprompt@gap>| !gapinput@List(Basis(J), x -> List(Basis(J), y -> Trace(x*y))) = |
  !gapprompt@>| !gapinput@JordanAlgebraGramMatrix(J);|
  true
  !gapprompt@gap>| !gapinput@DiagonalOfMat(JordanAlgebraGramMatrix(J));|
  [ 1, 1, 2, 2, 2, 2, 2, 2, 2, 2 ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{JordanAdjugate}}
\logpage{[ 3, 5, 5 ]}\nobreak
\hyperdef{L}{X806F76C07B315DE4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanAdjugate({\mdseries\slshape x})\index{JordanAdjugate@\texttt{JordanAdjugate}}
\label{JordanAdjugate}
}\hfill{\scriptsize (function)}}\\


 For \texttt{IsJordanAlgebraObj( \mbox{\texttt{\mdseries\slshape x}} )}, returns the adjugate of \mbox{\texttt{\mdseries\slshape x}}, which satisfies \texttt{x*JordanAdjugate(\mbox{\texttt{\mdseries\slshape x}}) = One(\mbox{\texttt{\mdseries\slshape x}})*Determinant(\mbox{\texttt{\mdseries\slshape x}})}. When \texttt{Determinant(\mbox{\texttt{\mdseries\slshape x}})} is non\texttt{\symbol{45}}zero, \texttt{JordanAdjugate(\mbox{\texttt{\mdseries\slshape x}})} is proportional to \texttt{Inverse(\mbox{\texttt{\mdseries\slshape x}})}. }

 

\subsection{\textcolor{Chapter }{IsPositiveDefinite}}
\logpage{[ 3, 5, 6 ]}\nobreak
\hyperdef{L}{X7C82B2EB78CF9C17}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsPositiveDefinite({\mdseries\slshape x})\index{IsPositiveDefinite@\texttt{IsPositiveDefinite}}
\label{IsPositiveDefinite}
}\hfill{\scriptsize (filter)}}\\


 For \texttt{IsJordanAlgebraObj( \mbox{\texttt{\mdseries\slshape x}} )}, returns \texttt{true} when \mbox{\texttt{\mdseries\slshape x}} is positive definite and \texttt{false} otherwise. This filter uses \texttt{GenericMinimalPolynomial} (\ref{GenericMinimalPolynomial}) to determine whether \mbox{\texttt{\mdseries\slshape x}} is positive definite. }

 }

 }

 
\chapter{\textcolor{Chapter }{Spherical and Projective Designs}}\logpage{[ 4, 0, 0 ]}
\hyperdef{L}{X7B34D3B17F1B8391}{}
{
  A spherical or projective design is a finite subset of a sphere or projective
space (see \cite{delsarte_spherical_1977} and \cite{hoggar_t-designs_1982} for more details). Certain designs have special properties and interesting
symmetries. The \textsf{ALCO} package allows users to study both spherical and projective designs by
modelling both as finite sets of primitive idempotents of a simple Euclidean
Jordan algebra. 

 Specifically, the primitive idempotents of simple Euclidean Jordan algebras of
rank $2$ have the geometry of a sphere. The correspondence involves converting
Euclidean inner product $\cos(\alpha)$ between two unit vectors on a sphere into the corresponding Jordan inner
product $\mathrm{Tr}(x\circ y)$ given by $(1 + \cos(\alpha))/2$ (described in \cite[p. 72]{nasmith_tight_2023}). Likewise, the primitive idempotents of a simple Euclidean Jordan algebras
of degrees $1$, $2$, $4$, or $8$ have the geometry of a real, complex, quaternion, or octonion projective
space. 

 The tools below allow one to construct a \textsf{GAP} object to represent a design and collect various computed attributes.
Constructing a design and its parameters using these tools does not guarantee
the existence of such a design, although known examples and possible instances
may be studied using these tools. 
\section{\textcolor{Chapter }{Jacobi Polynomials}}\logpage{[ 4, 1, 0 ]}
\hyperdef{L}{X79A71E957D5B9755}{}
{
  One advantage of studying spherical and projective designs together as sets of
Jordan primitive idempotents is both the spherical and projective cases can be
studied together using Jacobi polynomials, with suitable parameters chosen for
the appropriate simple Euclidean Jordan algebra. 

\subsection{\textcolor{Chapter }{JacobiPolynomial}}
\logpage{[ 4, 1, 1 ]}\nobreak
\hyperdef{L}{X872DC5F085155040}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JacobiPolynomial({\mdseries\slshape k, a, b})\index{JacobiPolynomial@\texttt{JacobiPolynomial}}
\label{JacobiPolynomial}
}\hfill{\scriptsize (function)}}\\


 This function returns the Jacobi polynomial $P_k^{(a,b)}(x)$ of degree \mbox{\texttt{\mdseries\slshape k}} and type \mbox{\texttt{\mdseries\slshape (a,b)}} as defined in \cite[chap. 22]{abramowitz_handbook_1972}. The argument \mbox{\texttt{\mdseries\slshape k}} must be a non\texttt{\symbol{45}}negative integer. The arguments \mbox{\texttt{\mdseries\slshape a}} and \mbox{\texttt{\mdseries\slshape b}} must be either rational numbers greater than $-1$ or must satisfy \texttt{IsPolynomial}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@a := Indeterminate(Rationals, "a");; |
  !gapprompt@gap>| !gapinput@b := Indeterminate(Rationals, "b");; |
  !gapprompt@gap>| !gapinput@x := Indeterminate(Rationals, "x");;|
  !gapprompt@gap>| !gapinput@JacobiPolynomial(0,a,b);|
  [ 1 ]
  !gapprompt@gap>| !gapinput@JacobiPolynomial(1,a,b);|
  [ 1/2*a-1/2*b, 1/2*a+1/2*b+1 ]
  !gapprompt@gap>| !gapinput@ValuePol(last,x);|
  1/2*a*x+1/2*b*x+1/2*a-1/2*b+x
\end{Verbatim}
 }

 
\subsection{\textcolor{Chapter }{Renormalized Jacobi Polynomials}}\logpage{[ 4, 1, 2 ]}
\hyperdef{L}{X7C78C3A57DDC372B}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{Q{\textunderscore}k{\textunderscore}epsilon({\mdseries\slshape k, epsilon, rank, degree, x})\index{Q{\textunderscore}k{\textunderscore}epsilon@\texttt{Q{\textunderscore}k{\textunderscore}epsilon}}
\label{QuScorekuScoreepsilon}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{R{\textunderscore}k{\textunderscore}epsilon({\mdseries\slshape k, epsilon, rank, degree, x})\index{R{\textunderscore}k{\textunderscore}epsilon@\texttt{R{\textunderscore}k{\textunderscore}epsilon}}
\label{RuScorekuScoreepsilon}
}\hfill{\scriptsize (function)}}\\


 These functions return polynomials of degree \mbox{\texttt{\mdseries\slshape k}} in the indeterminate \mbox{\texttt{\mdseries\slshape x}} corresponding the the renormalized Jacobi polynomials given in \cite{hoggar_t-designs_1982}. The value of \mbox{\texttt{\mdseries\slshape epsilon}} must be 0 or 1. The arguments \mbox{\texttt{\mdseries\slshape rank}} and \mbox{\texttt{\mdseries\slshape degree}} correspond to the rank and degree of the relevant simple Euclidean Jordan
algebra. }

 }

 
\section{\textcolor{Chapter }{Jordan Designs}}\logpage{[ 4, 2, 0 ]}
\hyperdef{L}{X83D7DAD082EAD26D}{}
{
  The \textsf{ALCO} package defines new categories within \texttt{IsObject} in order to construct and study Jordan designs. 
\subsection{\textcolor{Chapter }{Jordan Design Categories}}\logpage{[ 4, 2, 1 ]}
\hyperdef{L}{X82BCF4BA84BDEE9E}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsJordanDesign\index{IsJordanDesign@\texttt{IsJordanDesign}}
\label{IsJordanDesign}
}\hfill{\scriptsize (filter)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsSphericalJordanDesign\index{IsSphericalJordanDesign@\texttt{IsSphericalJordanDesign}}
\label{IsSphericalJordanDesign}
}\hfill{\scriptsize (filter)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsProjectiveJordanDesign\index{IsProjectiveJordanDesign@\texttt{IsProjectiveJordanDesign}}
\label{IsProjectiveJordanDesign}
}\hfill{\scriptsize (filter)}}\\


These filters determine whether an object is a Jordan design and whether the
design is constructed in a spherical or projective manifold of Jordan
primitive idempotents.}

 

\subsection{\textcolor{Chapter }{JordanDesignByParameters}}
\logpage{[ 4, 2, 2 ]}\nobreak
\hyperdef{L}{X7FD006D77B3C98E2}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignByParameters({\mdseries\slshape rank, degree})\index{JordanDesignByParameters@\texttt{JordanDesignByParameters}}
\label{JordanDesignByParameters}
}\hfill{\scriptsize (function)}}\\


 This function constructs a Jordan design in the manifold of Jordan primitive
idempotents of rank \mbox{\texttt{\mdseries\slshape rank}} and degree \mbox{\texttt{\mdseries\slshape degree}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByParameters(3,8);|
  <design with rank 3 and degree 8>
  !gapprompt@gap>| !gapinput@IsJordanDesign(D);|
  true
  !gapprompt@gap>| !gapinput@IsSphericalJordanDesign(D);|
  false
  !gapprompt@gap>| !gapinput@IsProjectiveJordanDesign(D);|
  true
  !gapprompt@gap>| !gapinput@JordanDesignByParameters(4,8);|
  fail
  !gapprompt@gap>| !gapinput@JordanDesignByParameters(3,9);|
  fail
\end{Verbatim}
 }

 
\subsection{\textcolor{Chapter }{Jordan Rank and Degree}}\logpage{[ 4, 2, 3 ]}
\hyperdef{L}{X82BB5F997B7B7B3A}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignRank({\mdseries\slshape D})\index{JordanDesignRank@\texttt{JordanDesignRank}}
\label{JordanDesignRank}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignDegree({\mdseries\slshape D})\index{JordanDesignDegree@\texttt{JordanDesignDegree}}
\label{JordanDesignDegree}
}\hfill{\scriptsize (attribute)}}\\


 The rank and degree of an object satisfying filter \texttt{IsJordanDesign} are stored as attributes. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByParameters(3,8);|
  <design with rank 3 and degree 8>
  !gapprompt@gap>| !gapinput@[JordanDesignRank(D), JordanDesignDegree(D)];|
  [ 3, 8 ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{JordanDesignQPolynomials}}
\logpage{[ 4, 2, 4 ]}\nobreak
\hyperdef{L}{X87D80CFF7F4FD7D6}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignQPolynomials({\mdseries\slshape D})\index{JordanDesignQPolynomials@\texttt{JordanDesignQPolynomials}}
\label{JordanDesignQPolynomials}
}\hfill{\scriptsize (attribute)}}\\


 Many properties of a Jordan design are computed using the family of
renormalized Jacobi polynomials that correspond to the spherical or projective
space in question. This attribute stores a function \texttt{DesignQPolynomial(\mbox{\texttt{\mdseries\slshape D}})(\mbox{\texttt{\mdseries\slshape k}})} that returns the \mbox{\texttt{\mdseries\slshape k}}\texttt{\symbol{45}}th polynomial in the family, as a list of coefficients,
where \mbox{\texttt{\mdseries\slshape k}} is a non\texttt{\symbol{45}}negative integer
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByParameters(3,8);|
  <design with rank 3 and degree 8>
  !gapprompt@gap>| !gapinput@r := JordanDesignRank(D);; d := JordanDesignDegree(D);;|
  !gapprompt@gap>| !gapinput@x := Indeterminate(Rationals, "x");;|
  !gapprompt@gap>| !gapinput@JordanDesignQPolynomials(D);|
  function( k ) ... end
  !gapprompt@gap>| !gapinput@JordanDesignQPolynomials(D)(2);|
  [ 90, -585, 819 ]
  !gapprompt@gap>| !gapinput@CoefficientsOfUnivariatePolynomial(Q_k_epsilon(2,0,r,d,x));|
  [ 90, -585, 819 ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{JordanDesignConnectionCoefficients}}
\logpage{[ 4, 2, 5 ]}\nobreak
\hyperdef{L}{X80A1BCF87B87D691}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignConnectionCoefficients({\mdseries\slshape D})\index{JordanDesignConnectionCoefficients@\texttt{JordanDesignConnectionCoefficients}}
\label{JordanDesignConnectionCoefficients}
}\hfill{\scriptsize (attribute)}}\\


 The connection coefficients of a design \mbox{\texttt{\mdseries\slshape D}} determine which linear combinations of \texttt{JordanDesignQPolynomials(\mbox{\texttt{\mdseries\slshape D}})} yield each power of the indeterminate \cite[p. 261]{hoggar_t-designs_1992}. This attribute stores a function \texttt{JordanDesignConnectionCoefficients(\mbox{\texttt{\mdseries\slshape D}})(\mbox{\texttt{\mdseries\slshape s}})} that computes the connection coefficients of each power up to positive integer \mbox{\texttt{\mdseries\slshape s}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByParameters(3,8);|
  <design with rank 3 and degree 8>
  !gapprompt@gap>| !gapinput@JordanDesignConnectionCoefficients(D);|
  function( s ) ... end
  !gapprompt@gap>| !gapinput@f := JordanDesignConnectionCoefficients(D)(3);; Display(f);|
  [ [        1,        0,        0,        0 ],
    [      1/3,     1/39,        0,        0 ],
    [     5/39,    5/273,    1/819,        0 ],
    [     5/91,     1/91,    1/728,  1/12376 ] ]
  !gapprompt@gap>| !gapinput@for j in [1..4] do Display(Sum(List([1..4], i -> |
  !gapprompt@>| !gapinput@f[j][i]*JordanDesignQPolynomials(D)(i-1)))); od;|
  [ 1, 0, 0, 0 ]
  [ 0, 1, 0, 0 ]
  [ 0, 0, 1, 0 ]
  [ 0, 0, 0, 1 ]
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Designs with an Angle Set}}\logpage{[ 4, 3, 0 ]}
\hyperdef{L}{X87DA51657F7EC947}{}
{
  The angle set of a design is the set of all inner products between distinct
elements in the design. In the case of a Jordan design, each inner product is
computed as $\mathrm{Tr}(x\circ y)$ for $x$ and $y$ primitive idempotents. This means that the angle set of a design is a set of
real numbers in the interval $[0, 1)$. We can compute many additional properties of a design once the angle set is
known. 

\subsection{\textcolor{Chapter }{IsJordanDesignWithAngleSet}}
\logpage{[ 4, 3, 1 ]}\nobreak
\hyperdef{L}{X848E40D6842751A6}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsJordanDesignWithAngleSet\index{IsJordanDesignWithAngleSet@\texttt{IsJordanDesignWithAngleSet}}
\label{IsJordanDesignWithAngleSet}
}\hfill{\scriptsize (filter)}}\\


This filter identifies whether an object that satisfies \texttt{IsJordanDesign} is equipped with an angle set. }

 
\subsection{\textcolor{Chapter }{Design Angle Sets}}\logpage{[ 4, 3, 2 ]}
\hyperdef{L}{X78AC6815875A2024}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignAddAngleSet({\mdseries\slshape D, A})\index{JordanDesignAddAngleSet@\texttt{JordanDesignAddAngleSet}}
\label{JordanDesignAddAngleSet}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignAngleSet({\mdseries\slshape D})\index{JordanDesignAngleSet@\texttt{JordanDesignAngleSet}}
\label{JordanDesignAngleSet}
}\hfill{\scriptsize (attribute)}}\\


For a design \mbox{\texttt{\mdseries\slshape D}} without an angle set, records the angle set \mbox{\texttt{\mdseries\slshape A}} as an attribute \texttt{JordanDesignAngleSet}. The angle set \mbox{\texttt{\mdseries\slshape A}} must be a list of real\texttt{\symbol{45}}valued elements in \texttt{IsCyc} in the interval $[0, 1)$. Note that when \mbox{\texttt{\mdseries\slshape A}} contains irrational elements for which {\textless} does not provide an
ordering, inclusion in the interval given above is not checked. Also note that
the angle set cannot be modified once set as an attribute of the design. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByParameters(4,4);|
  <design with rank 4 and degree 4>
  !gapprompt@gap>| !gapinput@JordanDesignAddAngleSet(D, [2]);|
  fail
  !gapprompt@gap>| !gapinput@D;|
  <design with rank 4 and degree 4>
  !gapprompt@gap>| !gapinput@JordanDesignAddAngleSet(D, [1/3,1/9]);|
  <design with rank 4, degree 4, and angle set [ 1/9, 1/3 ]>
  !gapprompt@gap>| !gapinput@JordanDesignAngleSet(D);|
  [ 1/9, 1/3 ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{JordanDesignByAngleSet}}
\logpage{[ 4, 3, 3 ]}\nobreak
\hyperdef{L}{X840BF5428457449B}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignByAngleSet({\mdseries\slshape rank, degree, A})\index{JordanDesignByAngleSet@\texttt{JordanDesignByAngleSet}}
\label{JordanDesignByAngleSet}
}\hfill{\scriptsize (function)}}\\


This function constructs a new design with Jordan rank and degree given by \mbox{\texttt{\mdseries\slshape rank}} and \mbox{\texttt{\mdseries\slshape degree}}, with angle set \mbox{\texttt{\mdseries\slshape A}}. The same constrains on angle set \mbox{\texttt{\mdseries\slshape A}} given in \texttt{JordanDesignAddAngleSet} (\ref{JordanDesignAddAngleSet}) apply. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByAngleSet(4, 4, [1/3, 1/9]);|
  <design with rank 4, degree 4, and angle set [ 1/9, 1/3 ]>
  !gapprompt@gap>| !gapinput@JordanDesignAngleSet(D);|
  [ 1/9, 1/3 ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{JordanDesignNormalizedAnnihilatorPolynomial}}
\logpage{[ 4, 3, 4 ]}\nobreak
\hyperdef{L}{X7923181A81406714}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignNormalizedAnnihilatorPolynomial({\mdseries\slshape D})\index{JordanDesignNormalizedAnnihilatorPolynomial@\texttt{Jordan}\-\texttt{Design}\-\texttt{Normalized}\-\texttt{Annihilator}\-\texttt{Polynomial}}
\label{JordanDesignNormalizedAnnihilatorPolynomial}
}\hfill{\scriptsize (attribute)}}\\


The normalized annihilator polynomial is defined for an angle set $A$ as the polynomial $p(x)$ of degree equal to the cardinality of $A$ with the elements of $A$ for roots and normalization such that $p(1) = 1$ \cite[p. 185]{bannai_algebraic_2021}. The coefficients of this polynomial are stored as an attribute of a design
with an angle set. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByAngleSet(4, 4, [1/3, 1/9]);|
  <design with rank 4, degree 4, and angle set [ 1/9, 1/3 ]>
  !gapprompt@gap>| !gapinput@p := JordanDesignNormalizedAnnihilatorPolynomial(D);|
  [ 1/16, -3/4, 27/16 ]
  !gapprompt@gap>| !gapinput@ValuePol(p, 1/9);|
  0
  !gapprompt@gap>| !gapinput@ValuePol(p, 1/3);|
  0
  !gapprompt@gap>| !gapinput@ValuePol(p, 1);|
  1
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{JordanDesignNormalizedIndicatorCoefficients}}
\logpage{[ 4, 3, 5 ]}\nobreak
\hyperdef{L}{X85E104A27EC8435A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignNormalizedIndicatorCoefficients({\mdseries\slshape D})\index{JordanDesignNormalizedIndicatorCoefficients@\texttt{Jordan}\-\texttt{Design}\-\texttt{Normalized}\-\texttt{Indicator}\-\texttt{Coefficients}}
\label{JordanDesignNormalizedIndicatorCoefficients}
}\hfill{\scriptsize (attribute)}}\\


 The normalized indicator coefficients are the \texttt{JordanDesignQPolynomials(\mbox{\texttt{\mdseries\slshape D}})}\texttt{\symbol{45}}expansion coefficients of \texttt{JordanDesignNormalizedAnnihilatorPolynomial(\mbox{\texttt{\mdseries\slshape D}})}, discussed for the spherical case in \cite[p. 185]{bannai_algebraic_2021}. These coefficients are stored as an attribute of a design with an angle set. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByAngleSet(4, 4, [1/3, 1/9]);|
  <design with rank 4, degree 4, and angle set [ 1/9, 1/3 ]>
  !gapprompt@gap>| !gapinput@f := JordanDesignNormalizedIndicatorCoefficients(D);|
  [ 1/64, 7/960, 9/3520 ]
  !gapprompt@gap>| !gapinput@Sum(List([1..3], i -> f[i]*JordanDesignQPolynomials(D)(i-1)));|
  [ 1/16, -3/4, 27/16 ]
  !gapprompt@gap>| !gapinput@JordanDesignNormalizedAnnihilatorPolynomial(D);|
  [ 1/16, -3/4, 27/16 ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IsJordanDesignWithPositiveIndicatorCoefficients}}
\logpage{[ 4, 3, 6 ]}\nobreak
\hyperdef{L}{X85E1790D86685EAF}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsJordanDesignWithPositiveIndicatorCoefficients\index{IsJordanDesignWithPositiveIndicatorCoefficients@\texttt{IsJordan}\-\texttt{Design}\-\texttt{With}\-\texttt{Positive}\-\texttt{Indicator}\-\texttt{Coefficients}}
\label{IsJordanDesignWithPositiveIndicatorCoefficients}
}\hfill{\scriptsize (filter)}}\\


 This filter determines whether the normalized indicator coefficients of a
design are positive, which has significance for certain theorems about
designs. }

 

\subsection{\textcolor{Chapter }{JordanDesignSpecialBound}}
\logpage{[ 4, 3, 7 ]}\nobreak
\hyperdef{L}{X858B619F7E32D5EB}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignSpecialBound({\mdseries\slshape D})\index{JordanDesignSpecialBound@\texttt{JordanDesignSpecialBound}}
\label{JordanDesignSpecialBound}
}\hfill{\scriptsize (attribute)}}\\


 The special bound of a design satisfying \texttt{IsJordanDesignWithPositiveIndicatorCoefficients} is the upper limit on the possible cardinality for the given angle set \cite[pp. 257\texttt{\symbol{45}}258]{hoggar_t-designs_1992}. This attribute stores the special bound when it exists for a design. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByAngleSet(4, 4, [1/3,1/9]);|
  <design with rank 4, degree 4, and angle set [ 1/9, 1/3 ]>
  !gapprompt@gap>| !gapinput@IsJordanDesignWithPositiveIndicatorCoefficients(D);|
  true
  !gapprompt@gap>| !gapinput@JordanDesignSpecialBound(D);|
  64
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Designs with Angle Set and Cardinality}}\logpage{[ 4, 4, 0 ]}
\hyperdef{L}{X803F6A9986E27413}{}
{
  Many more properties of a design with an angle set can be computed once the
cardinality of the design is also known. In what follows let $v$ be the cardinality of a design and let $s$ be the cardinality of the angle set $A$ of that design. 
\subsection{\textcolor{Chapter }{Design Cardinality}}\logpage{[ 4, 4, 1 ]}
\hyperdef{L}{X7F730A1C7FC9D987}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsJordanDesignWithCardinality\index{IsJordanDesignWithCardinality@\texttt{IsJordanDesignWithCardinality}}
\label{IsJordanDesignWithCardinality}
}\hfill{\scriptsize (filter)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignAddCardinality({\mdseries\slshape D, v})\index{JordanDesignAddCardinality@\texttt{JordanDesignAddCardinality}}
\label{JordanDesignAddCardinality}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignCardinality({\mdseries\slshape D})\index{JordanDesignCardinality@\texttt{JordanDesignCardinality}}
\label{JordanDesignCardinality}
}\hfill{\scriptsize (attribute)}}\\


 As a finite set, each design has a cardinality. When this cardinality is known
for an object \mbox{\texttt{\mdseries\slshape D}} that satisfies \texttt{IsJordanDesign(\mbox{\texttt{\mdseries\slshape D}})}, the cardinality is stored as the attribute \texttt{JordanDesignCardinality(\mbox{\texttt{\mdseries\slshape D}})}. In order to set the cardinality of a design, we can use the operation \texttt{JordanDesignAddCardinality(\mbox{\texttt{\mdseries\slshape D}}, v)}. When \texttt{JordanDesignAddCardinality} is called, the \textsf{ALCO} package immediately attempts to compute \texttt{JordanDesignStrength} (\ref{JordanDesignStrength}). 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByAngleSet(4,4, [1/3,1/9]);|
  <design with rank 4, degree 4, and angle set [ 1/9, 1/3 ]>
  !gapprompt@gap>| !gapinput@HasJordanDesignCardinality(D);|
  false
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(D, 64);|
  <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]>
  !gapprompt@gap>| !gapinput@JordanDesignCardinality(D);|
  64
\end{Verbatim}
 }

 
\subsection{\textcolor{Chapter }{Designs at the Special Bound}}\logpage{[ 4, 4, 2 ]}
\hyperdef{L}{X7CA9D3F585A7CBC3}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsSpecialBoundJordanDesign\index{IsSpecialBoundJordanDesign@\texttt{IsSpecialBoundJordanDesign}}
\label{IsSpecialBoundJordanDesign}
}\hfill{\scriptsize (filter)}}\\


 As described in \texttt{JordanDesignSpecialBound} (\ref{JordanDesignSpecialBound}), we can compute the special bound of a design using the angle set. Once the
cardinality is also known we can assess whether the design reaches the special
bound. This filter identifies when a design with an angle set and cardinality
also meets the special bound. }

 

\subsection{\textcolor{Chapter }{JordanDesignAnnihilatorPolynomial}}
\logpage{[ 4, 4, 3 ]}\nobreak
\hyperdef{L}{X80BE4157859BAA6A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignAnnihilatorPolynomial({\mdseries\slshape D})\index{JordanDesignAnnihilatorPolynomial@\texttt{JordanDesignAnnihilatorPolynomial}}
\label{JordanDesignAnnihilatorPolynomial}
}\hfill{\scriptsize (attribute)}}\\


 The annihilator polynomial for design \mbox{\texttt{\mdseries\slshape D}} is defined by multiplying the \texttt{JordanDesignNormalizedAnnihilatorPolynomial(\mbox{\texttt{\mdseries\slshape D}})} by \texttt{JordanDesignCardinality(\mbox{\texttt{\mdseries\slshape D}})}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByAngleSet(4, 4, [1/3, 1/9]);; |
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(D, 64);; D;|
  <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]>
  !gapprompt@gap>| !gapinput@JordanDesignAnnihilatorPolynomial(D);|
  [ 4, -48, 108 ]
  !gapprompt@gap>| !gapinput@ValuePol(last, 1);|
  64
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{JordanDesignIndicatorCoefficients}}
\logpage{[ 4, 4, 4 ]}\nobreak
\hyperdef{L}{X7C7C5DEF86F051F4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignIndicatorCoefficients({\mdseries\slshape D})\index{JordanDesignIndicatorCoefficients@\texttt{JordanDesignIndicatorCoefficients}}
\label{JordanDesignIndicatorCoefficients}
}\hfill{\scriptsize (attribute)}}\\


 The indicator coefficients for design \mbox{\texttt{\mdseries\slshape D}} are defined by multiplying \texttt{ JordanDesignNormalizedIndicatorCoefficients(\mbox{\texttt{\mdseries\slshape D}})} by \texttt{JordanDesignCardinality(\mbox{\texttt{\mdseries\slshape D}})}. These indicator coefficients are often useful for directly determining the
strength of a design at the special bound. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByAngleSet(4, 4, [1/3, 1/9]);; JordanDesignAddCardinality(D, 64);; D;|
  <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]>
  !gapprompt@gap>| !gapinput@JordanDesignIndicatorCoefficients(D);|
  [ 1, 7/15, 9/55 ]
\end{Verbatim}
 }

 
\subsection{\textcolor{Chapter }{Design Strength}}\logpage{[ 4, 4, 5 ]}
\hyperdef{L}{X7C4ADEEA8355A774}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsJordanDesignWithStrength\index{IsJordanDesignWithStrength@\texttt{IsJordanDesignWithStrength}}
\label{IsJordanDesignWithStrength}
}\hfill{\scriptsize (filter)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignStrength({\mdseries\slshape D})\index{JordanDesignStrength@\texttt{JordanDesignStrength}}
\label{JordanDesignStrength}
}\hfill{\scriptsize (attribute)}}\\


 The $t$\texttt{\symbol{45}}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$\texttt{\symbol{45}}design (see \cite{delsarte_spherical_1977} and \cite{hoggar_t-designs_1982} for detailed definitions). The parameter $t$ is called the \emph{strength} of the design. 

 For a design \mbox{\texttt{\mdseries\slshape D}} that satisfies \texttt{IsJordanDesignWithPositiveIndicatorCoefficients}, \texttt{IsJordanDesignWithCardinality}, and \texttt{IsSpecialBoundJordanDesign}, we can compute the strength $t$ of the design using a theorem given in \cite[p. 258]{hoggar_t-designs_1992} that examines the indicator coefficients. The filter \texttt{IsJordanDesignWithStrength} indicates when the attribute \texttt{JordanDesignStrength} has been successfully computed. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByAngleSet(4,4, [1/3,1/9]);|
  <design with rank 4, degree 4, and angle set [ 1/9, 1/3 ]>
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(D, 64);|
  <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]>
  !gapprompt@gap>| !gapinput@IsJordanDesignWithStrength(D);|
  true
  !gapprompt@gap>| !gapinput@JordanDesignStrength(D);|
  2
\end{Verbatim}
 }

 
\subsection{\textcolor{Chapter }{Schemes and Tight Designs}}\logpage{[ 4, 4, 6 ]}
\hyperdef{L}{X7DBF21947AB79F1B}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsRegularSchemeJordanDesign\index{IsRegularSchemeJordanDesign@\texttt{IsRegularSchemeJordanDesign}}
\label{IsRegularSchemeJordanDesign}
}\hfill{\scriptsize (filter)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsAssociationSchemeJordanDesign\index{IsAssociationSchemeJordanDesign@\texttt{IsAssociationSchemeJordanDesign}}
\label{IsAssociationSchemeJordanDesign}
}\hfill{\scriptsize (filter)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsTightJordanDesign\index{IsTightJordanDesign@\texttt{IsTightJordanDesign}}
\label{IsTightJordanDesign}
}\hfill{\scriptsize (filter)}}\\


 These filters identify various special categories of designs that satisfy \texttt{IsJordanDesignWithStrength} (\ref{IsJordanDesignWithStrength}). In what follows recall that $t$ denotes the strength of the design and $s$ denotes the cardinality of the angle set $A$. The definitions below are provided in \cite{hoggar_t-designs_1992}. 

 A design admits a \emph{regular scheme} when $t \ge s - 1 $. The filter \texttt{IsRegularSchemeJordanDesign} returns true when both $t$ and $s$ are known and satisfy the regular scheme inequality given above. 

 A design admits an \emph{association scheme} when $t \ge 2s - 2 $. The filter \texttt{IsAssociationSchemeJordanDesign} returns true when both $t$ and $s$ are known and satisfy the association scheme inequality given above. 

 Finally, a design is \emph{tight} when it satisfies $t = 2s - 1$ for $0$ in $A$ or $t = 2s$ otherwise. The filter \texttt{IsTightJordanDesign} returns true when the appropriate equality is satisfied for a design. }

 }

 
\section{\textcolor{Chapter }{Designs Admitting a Regular Scheme}}\logpage{[ 4, 5, 0 ]}
\hyperdef{L}{X814E031B82F35E16}{}
{
  

\subsection{\textcolor{Chapter }{JordanDesignSubdegrees}}
\logpage{[ 4, 5, 1 ]}\nobreak
\hyperdef{L}{X83501A01792752CC}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignSubdegrees({\mdseries\slshape D})\index{JordanDesignSubdegrees@\texttt{JordanDesignSubdegrees}}
\label{JordanDesignSubdegrees}
}\hfill{\scriptsize (attribute)}}\\


 For a design \mbox{\texttt{\mdseries\slshape D}} with cardinality and angle set that satisfies \texttt{IsRegularSchemeJordanDesign}, namely $t \ge s - 1$, we can compute the regular subdegrees as described in \cite[Theorem 3.2]{hoggar_t-designs_1992}. The subdegrees count thnumber of elements forming each angle with some
representative element in the design. So, in the example below, there are $27$ elements forming an angle (inner product) of $1/9$ with some representative design element. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByAngleSet(4, 4, [1/3, 1/9]);; JordanDesignAddCardinality(D, 64);; D;|
  <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]>
  !gapprompt@gap>| !gapinput@JordanDesignSubdegrees(D);|
  [ 27, 36 ]
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Designs Admitting an Association Scheme}}\logpage{[ 4, 6, 0 ]}
\hyperdef{L}{X7EE9F8D97A51FBF9}{}
{
  When a design satisfies $t \ge 2s - 2$ then it also admits an association scheme. We can use results given in \cite{hoggar_t-designs_1992} to determine the parameters of the corresponding association scheme. For more
details about association schemes see \cite{cameron_designs_1991} or \cite{bannai_algebraic_2021}. 

\subsection{\textcolor{Chapter }{JordanDesignBoseMesnerAlgebra}}
\logpage{[ 4, 6, 1 ]}\nobreak
\hyperdef{L}{X85F7CF2D7FDF58D7}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignBoseMesnerAlgebra({\mdseries\slshape D})\index{JordanDesignBoseMesnerAlgebra@\texttt{JordanDesignBoseMesnerAlgebra}}
\label{JordanDesignBoseMesnerAlgebra}
}\hfill{\scriptsize (attribute)}}\\


 For a design that satisfies \texttt{IsAssociationSchemeJordanDesign}, we can define the corresponding Bose\texttt{\symbol{45}}Mesner algebra \cite[pp. 53\texttt{\symbol{45}}57]{bannai_algebraic_2021}. The canonical basis for this algebra corresponds to the adjacency matrices $A_i$, with the \texttt{s+1}\texttt{\symbol{45}}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 \texttt{IsSCAlgebraObj}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByAngleSet(4, 4, [1/3, 1/9]);; JordanDesignAddCardinality(D, 64);; D;|
  <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]>
  !gapprompt@gap>| !gapinput@B := JordanDesignBoseMesnerAlgebra(D);|
  <algebra of dimension 3 over Rationals>
  !gapprompt@gap>| !gapinput@BasisVectors(CanonicalBasis(B));|
  [ A1, A2, A3 ]
  !gapprompt@gap>| !gapinput@One(B); IsSCAlgebraObj(last);|
  A3
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{JordanDesignBoseMesnerIdempotentBasis}}
\logpage{[ 4, 6, 2 ]}\nobreak
\hyperdef{L}{X7F95AE4A7B7B5B2B}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignBoseMesnerIdempotentBasis({\mdseries\slshape D})\index{JordanDesignBoseMesnerIdempotentBasis@\texttt{Jordan}\-\texttt{Design}\-\texttt{Bose}\-\texttt{Mesner}\-\texttt{Idempotent}\-\texttt{Basis}}
\label{JordanDesignBoseMesnerIdempotentBasis}
}\hfill{\scriptsize (attribute)}}\\


For a design that satisfies \texttt{IsAssociationSchemeJordanDesign}, we can also define the idempotent basis of the corresponding
Bose\texttt{\symbol{45}}Mesner algebra \cite[pp. 53\texttt{\symbol{45}}57]{bannai_algebraic_2021}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByAngleSet(4, 4, [1/3, 1/9]);; JordanDesignAddCardinality(D, 64);; D;|
  <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]>
  !gapprompt@gap>| !gapinput@for x in BasisVectors(JordanDesignBoseMesnerIdempotentBasis(D)) do Display(x); |
  !gapprompt@>| !gapinput@od;|
  (-5/64)*A1+(3/64)*A2+(27/64)*A3
  (1/16)*A1+(-1/16)*A2+(9/16)*A3
  (1/64)*A1+(1/64)*A2+(1/64)*A3
  !gapprompt@gap>| !gapinput@ForAll(JordanDesignBoseMesnerIdempotentBasis(D), IsIdempotent);|
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{JordanDesignIntersectionNumbers}}
\logpage{[ 4, 6, 3 ]}\nobreak
\hyperdef{L}{X851F03427CFDC513}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignIntersectionNumbers({\mdseries\slshape D})\index{JordanDesignIntersectionNumbers@\texttt{JordanDesignIntersectionNumbers}}
\label{JordanDesignIntersectionNumbers}
}\hfill{\scriptsize (attribute)}}\\


 The intersection numbers $p^k_{i,j}$ are given by \texttt{ JordanDesignIntersectionNumbers(\mbox{\texttt{\mdseries\slshape D}})[k][i][j]}. These intersection numbers serve as the structure constants for the \texttt{JordanDesignBoseMesnerAlgebra(\mbox{\texttt{\mdseries\slshape D}})}. Namely, $A_i A_j = \sum_{k = 1}^{s+1} p^{k}_{i,j} A_k$ (see \cite[pp. 53\texttt{\symbol{45}}57]{bannai_algebraic_2021}). 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByAngleSet(4, 4, [1/3, 1/9]);; JordanDesignAddCardinality(D, 64);; D;|
  <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]>
  !gapprompt@gap>| !gapinput@A := BasisVectors(Basis(JordanDesignBoseMesnerAlgebra(D)));;|
  !gapprompt@gap>| !gapinput@p := JordanDesignIntersectionNumbers(D);;|
  !gapprompt@gap>| !gapinput@A[1]*A[2] = Sum(List([1..3]), k -> p[k][1][2]*A[k]);|
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{JordanDesignKreinNumbers}}
\logpage{[ 4, 6, 4 ]}\nobreak
\hyperdef{L}{X84E0CAFE83145B3F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignKreinNumbers({\mdseries\slshape D})\index{JordanDesignKreinNumbers@\texttt{JordanDesignKreinNumbers}}
\label{JordanDesignKreinNumbers}
}\hfill{\scriptsize (attribute)}}\\


 The Krein numbers $q^k_{i,j}$ are given by \texttt{JordanDesignKreinNumbers(\mbox{\texttt{\mdseries\slshape D}})[k][i][j]}. The Krein numbers serve as the structure constants for the \texttt{JordanDesignBoseMesnerAlgebra(\mbox{\texttt{\mdseries\slshape D}})} in the idempotent basis given by \texttt{JordanDesignBoseMesnerIdempotentBasis(\mbox{\texttt{\mdseries\slshape D}})} using the Hadamard matrix product $\circ$. Namely, for idempotent basis $E_i$ and Hadamard product $\circ$, we have $E_i \circ E_j = \sum_{k = 1}^{s+1} q^{k}_{i,j} E_k$ (see \cite[pp. 53\texttt{\symbol{45}}57]{bannai_algebraic_2021}). 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByAngleSet(4, 4, [1/3, 1/9]);; JordanDesignAddCardinality(D, 64);; D;|
  <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]>
  !gapprompt@gap>| !gapinput@q := JordanDesignKreinNumbers(D);; |
  !gapprompt@gap>| !gapinput@Display(q);|
  [ [ [ 10, 16, 1 ], [ 16, 20, 0 ], [ 1, 0, 0 ] ], 
    [ [ 12, 15, 0 ], [ 15, 20, 1 ], [ 0, 1, 0 ] ], 
    [ [ 27, 0, 0 ], [ 0, 36, 0 ], [ 0, 0, 1 ] ] ]
    
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{JordanDesignFirstEigenmatrix}}
\logpage{[ 4, 6, 5 ]}\nobreak
\hyperdef{L}{X87C0A2067F13F01A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignFirstEigenmatrix({\mdseries\slshape D})\index{JordanDesignFirstEigenmatrix@\texttt{JordanDesignFirstEigenmatrix}}
\label{JordanDesignFirstEigenmatrix}
}\hfill{\scriptsize (attribute)}}\\


 As describe in \cite[p. 58]{bannai_algebraic_2021}, the first eigenmatrix of a Bose\texttt{\symbol{45}}Mesner algebra $P_i(j)$ defines the expansion of the adjacency matrix basis $A_i$ in terms of the idempotent basis $E_j$ as follows: $A_i = \sum_{j = 1}^{s+1} P_i(j) E_j $. This attribute returns the component $P_i(j)$ as \texttt{JordanDesignFirstEigenmatrix(\mbox{\texttt{\mdseries\slshape D}})[i][j]}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByAngleSet(4,4,[1/3,1/9]);; JordanDesignAddCardinality(D, 64);; D;|
  <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]>
  !gapprompt@gap>| !gapinput@a := Basis(JordanDesignBoseMesnerAlgebra(D));;|
  !gapprompt@gap>| !gapinput@e := JordanDesignBoseMesnerIdempotentBasis(D);;|
  !gapprompt@gap>| !gapinput@ForAll([1..3], i -> a[i] = Sum([1..3], j ->|
  !gapprompt@>| !gapinput@JordanDesignFirstEigenmatrix(D)[i][j]*e[j]));|
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{JordanDesignSecondEigenmatrix}}
\logpage{[ 4, 6, 6 ]}\nobreak
\hyperdef{L}{X7FC9FDCC7DD82286}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignSecondEigenmatrix({\mdseries\slshape D})\index{JordanDesignSecondEigenmatrix@\texttt{JordanDesignSecondEigenmatrix}}
\label{JordanDesignSecondEigenmatrix}
}\hfill{\scriptsize (attribute)}}\\


 As describe in \cite[p. 58]{bannai_algebraic_2021}, the second eigenmatrix of a Bose\texttt{\symbol{45}}Mesner algebra $Q_i(j)$ defines the expansion of the idempotent basis $E_i$ in terms of the adjacency matrix basis $A_j$ as follows: $E_i = (1/v)\sum_{j = 1}^{s+1} Q_i(j) A_j $. This attribute returns the component $Q_i(j)$ as \texttt{JordanDesignSecondEigenmatrix(\mbox{\texttt{\mdseries\slshape D}})[i][j]}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByAngleSet(4,4,[1/3,1/9]);; JordanDesignAddCardinality(D, 64);; D;|
  <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]>
  !gapprompt@gap>| !gapinput@a := Basis(JordanDesignBoseMesnerAlgebra(D));;|
  !gapprompt@gap>| !gapinput@e := JordanDesignBoseMesnerIdempotentBasis(D);;|
  !gapprompt@gap>| !gapinput@ForAll([1..3], i -> e[i]*JordanDesignCardinality(D) =|
  !gapprompt@>| !gapinput@Sum([1..3], j -> JordanDesignSecondEigenmatrix(D)[i][j]*a[j]));|
  true
  !gapprompt@gap>| !gapinput@JordanDesignFirstEigenmatrix(D) = Inverse(JordanDesignSecondEigenmatrix(D))|
  !gapprompt@>| !gapinput@*JordanDesignCardinality(D);|
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{JordanDesignMultiplicities}}
\logpage{[ 4, 6, 7 ]}\nobreak
\hyperdef{L}{X7FB944C182A2FBE3}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignMultiplicities({\mdseries\slshape D})\index{JordanDesignMultiplicities@\texttt{JordanDesignMultiplicities}}
\label{JordanDesignMultiplicities}
}\hfill{\scriptsize (attribute)}}\\


 As describe in \cite[pp. 58\texttt{\symbol{45}}59]{bannai_algebraic_2021}, the design multiplicy $m_i$ is defined as the dimension of the space that idempotent matrix $E_i$ projects onto, or $m_i = \mathrm{Tr}(E_i)$. We also have $m_i = Q_i(s+1)$. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByAngleSet(4,4,[1/3,1/9]);; JordanDesignAddCardinality(D, 64);; D;|
  <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]>
  !gapprompt@gap>| !gapinput@JordanDesignMultiplicities(D);|
  [ 27, 36, 1 ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{DesignValencies}}
\logpage{[ 4, 6, 8 ]}\nobreak
\hyperdef{L}{X7E7012EB7BFE889D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{DesignValencies({\mdseries\slshape D})\index{DesignValencies@\texttt{DesignValencies}}
\label{DesignValencies}
}\hfill{\scriptsize (attribute)}}\\


 As describe in \cite[pp. 55, 59]{bannai_algebraic_2021}, the design valency $k_i$ is defined as the fixed number of $i$\texttt{\symbol{45}}associates of any element in the association scheme (also
known as the subdegree). We also have $k_i = P_i(s+1)$. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@D := JordanDesignByAngleSet(4,4,[1/3,1/9]);; JordanDesignAddCardinality(D, 64);; D;|
  <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]>
  !gapprompt@gap>| !gapinput@DesignValencies(D);|
  [ 27, 36, 1 ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{JordanDesignReducedAdjacencyMatrices}}
\logpage{[ 4, 6, 9 ]}\nobreak
\hyperdef{L}{X788831797E45CE02}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{JordanDesignReducedAdjacencyMatrices({\mdseries\slshape D})\index{JordanDesignReducedAdjacencyMatrices@\texttt{Jordan}\-\texttt{Design}\-\texttt{Reduced}\-\texttt{Adjacency}\-\texttt{Matrices}}
\label{JordanDesignReducedAdjacencyMatrices}
}\hfill{\scriptsize (attribute)}}\\


 As defined in \cite[p. 201]{cameron_designs_1991}, the reduced adjacency matrices multiply with the same structure constants as
the adjacency matrices, which allows for a simpler construction of an algebra
isomorphic to the Bose\texttt{\symbol{45}}Mesner algebra. The matrices \texttt{JordanDesignReducedAdjacencyMatrices(\mbox{\texttt{\mdseries\slshape D}})} are used to construct \texttt{JordanDesignBoseMesnerAlgebra(\mbox{\texttt{\mdseries\slshape D}})}. }

 }

 
\section{\textcolor{Chapter }{Examples}}\logpage{[ 4, 7, 0 ]}
\hyperdef{L}{X7A489A5D79DA9E5C}{}
{
  This section provides a number of known examples that can be studied using the \textsf{ALCO} package. The following tight projective t\texttt{\symbol{45}}designs are
identified in \cite[Examples 1\texttt{\symbol{45}}11]{hoggar_t-designs_1982}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(2, 1, [0,1/2]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <Tight 3-design with rank 2, degree 1, cardinality 4, and angle set 
  [ 0, 1/2 ]> 
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(2, 2, [0,1/2]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <Tight 3-design with rank 2, degree 2, cardinality 6, and angle set
  [ 0, 1/2 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(2, 4, [0,1/2]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <Tight 3-design with rank 2, degree 4, cardinality 10, and angle set
  [ 0, 1/2 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(2, 8, [0,1/2]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <Tight 3-design with rank 2, degree 8, cardinality 18, and angle set
  [ 0, 1/2 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(3, 2, [1/4]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <Tight 2-design with rank 3, degree 2, cardinality 9, and angle set [ 1/4 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(4, 2, [0,1/3]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <Tight 3-design with rank 4, degree 2, cardinality 40, and angle set
  [ 0, 1/3 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(6, 2, [0,1/4]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <Tight 3-design with rank 6, degree 2, cardinality 126, and angle set
  [ 0, 1/4 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(8, 2, [1/9]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <Tight 2-design with rank 8, degree 2, cardinality 64, and angle set [ 1/9 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(5, 4, [0,1/4]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <Tight 3-design with rank 5, degree 4, cardinality 165, and angle set
  [ 0, 1/4 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(3, 8, [0,1/4,1/2]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <Tight 5-design with rank 3, degree 8, cardinality 819, and angle set
  [ 0, 1/4, 1/2 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(24, 1, [0,1/16,1/4]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <Tight 5-design with rank 24, degree 1, cardinality 98280, and angle set
  [ 0, 1/16, 1/4 ]>
\end{Verbatim}
 An additional icosahedron projective example is identified in \cite{lyubich_tight_2009}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(2, 2, [ 0, (5-Sqrt(5))/10, (5+Sqrt(5))/10 ]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <Tight 5-design with rank 2, degree 2, cardinality 12, and angle set
  [ 0, -3/5*E(5)-2/5*E(5)^2-2/5*E(5)^3-3/5*E(5)^4,
    -2/5*E(5)-3/5*E(5)^2-3/5*E(5)^3-2/5*E(5)^4 ]>
\end{Verbatim}
 The Leech lattice short vector design and several other tight spherical
designs are given below: 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(2, 23, [ 0, 1/4, 3/8, 1/2, 5/8, 3/4 ]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <Tight 11-design with rank 2, degree 23, cardinality 196560, and angle set
  [ 0, 1/4, 3/8, 1/2, 5/8, 3/4 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(2, 5, [ 1/4, 5/8 ]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <Tight 4-design with rank 2, degree 5, cardinality 27, and angle set
  [ 1/4, 5/8 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(2, 6, [0,1/3,2/3]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <Tight 5-design with rank 2, degree 6, cardinality 56, and angle set
  [ 0, 1/3, 2/3 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(2, 21, [3/8, 7/12]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <Tight 4-design with rank 2, degree 21, cardinality 275, and angle set
  [ 3/8, 7/12 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(2, 22, [0,2/5,3/5]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <Tight 5-design with rank 2, degree 22, cardinality 552, and angle set
  [ 0, 2/5, 3/5 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(2, 7, [0,1/4,1/2,3/4]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <Tight 7-design with rank 2, degree 7, cardinality 240, and angle set
  [ 0, 1/4, 1/2, 3/4 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(2, 22, [0,1/3,1/2,2/3]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <Tight 7-design with rank 2, degree 22, cardinality 4600, and angle set
  [ 0, 1/3, 1/2, 2/3 ]>
\end{Verbatim}
 Some projective designs meeting the special bound are given in \cite[Examples 1\texttt{\symbol{45}}11]{hoggar_t-designs_1982}: 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(4, 4, [0,1/4,1/2]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <3-design with rank 4, degree 4, cardinality 180, and angle set
  [ 0, 1/4, 1/2 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(3, 2, [0,1/3]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <2-design with rank 3, degree 2, cardinality 12, and angle set [ 0, 1/3 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(5, 2, [0,1/4]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <2-design with rank 5, degree 2, cardinality 45, and angle set [ 0, 1/4 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(9, 2, [0,1/9]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <2-design with rank 9, degree 2, cardinality 90, and angle set [ 0, 1/9 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(28, 2, [0,1/16]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <2-design with rank 28, degree 2, cardinality 4060, and angle set [ 0, 1/16 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(4, 4, [0,1/4]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <2-design with rank 4, degree 4, cardinality 36, and angle set [ 0, 1/4 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(4, 4, [1/9,1/3]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <2-design with rank 4, degree 4, cardinality 64, and angle set [ 1/9, 1/3 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(16, 1, [0,1/9]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <2-design with rank 16, degree 1, cardinality 256, and angle set [ 0, 1/9 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(4, 2, [0,1/4,1/2]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <3-design with rank 4, degree 2, cardinality 60, and angle set
  [ 0, 1/4, 1/2 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(16, 1, [0,1/16,1/4]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <3-design with rank 16, degree 1, cardinality 2160, and angle set
  [ 0, 1/16, 1/4 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(3, 4, [0,1/4,1/2]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <3-design with rank 3, degree 4, cardinality 63, and angle set
  [ 0, 1/4, 1/2 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(3, 4, [0,1/4,1/2,(3+Sqrt(5))/8, (3-Sqrt(5))/8]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <5-design with rank 3, degree 4, cardinality 315, and angle set
  [ 0, 1/4, 1/2, -1/2*E(5)-1/4*E(5)^2-1/4*E(5)^3-1/2*E(5)^4,
    -1/4*E(5)-1/2*E(5)^2-1/2*E(5)^3-1/4*E(5)^4 ]>
  !gapprompt@gap>| !gapinput@JordanDesignByAngleSet(12, 2, [0,1/3,1/4,1/12]);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <5-design with rank 12, degree 2, cardinality 32760, and angle set
  [ 0, 1/12, 1/4, 1/3 ]>
\end{Verbatim}
 Two important designs related to the $H_4$ Weyl group are as follows: 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@A := [ 0, 1/4, 1/2, 3/4, (5-Sqrt(5))/8, (5+Sqrt(5))/8,|
  !gapprompt@>| !gapinput@(3-Sqrt(5))/8, (3+Sqrt(5))/8 ];;|
  !gapprompt@gap>| !gapinput@D := JordanDesignByAngleSet(2, 3, A);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <11-design with rank 2, degree 3, cardinality 120, and angle set
  [ 0, 1/4, 1/2, 3/4, -3/4*E(5)-1/2*E(5)^2-1/2*E(5)^3-3/4*E(5)^4,
    -1/2*E(5)-3/4*E(5)^2-3/4*E(5)^3-1/2*E(5)^4,
    -1/2*E(5)-1/4*E(5)^2-1/4*E(5)^3-1/2*E(5)^4,
    -1/4*E(5)-1/2*E(5)^2-1/2*E(5)^3-1/4*E(5)^4 ]>
  !gapprompt@gap>| !gapinput@A := [ 0, 1/4, (3-Sqrt(5))/8, (3+Sqrt(5))/8 ];;|
  !gapprompt@gap>| !gapinput@D := JordanDesignByAngleSet(4, 1, A);;|
  !gapprompt@gap>| !gapinput@JordanDesignAddCardinality(last, JordanDesignSpecialBound(last));|
  <5-design with rank 4, degree 1, cardinality 60, and angle set
  [ 0, 1/4, -1/2*E(5)-1/4*E(5)^2-1/4*E(5)^3-1/2*E(5)^4,
    -1/4*E(5)-1/2*E(5)^2-1/2*E(5)^3-1/4*E(5)^4 ]>
\end{Verbatim}
 }

 }

 
\chapter{\textcolor{Chapter }{Octonion Lattice Constructions}}\logpage{[ 5, 0, 0 ]}
\hyperdef{L}{X7F6AA3C97E706F4F}{}
{
  An \emph{octonion vector} is a tuple of octonions. Vector addition and scalar multiplication are defined
in the usual way, as component\texttt{\symbol{45}}wise addition and scalar
multiplication. We can define the \emph{octonion vector norm} and corresponding inner product for an octonion vector in a number of ways,
but require that the octonion norm of an octonion vector belongs to the ring
of scalars. 

 An \emph{octonion lattice} is a free left {\ensuremath{\mathbb Z}}\texttt{\symbol{45}}module generated by
a finite set of octonion vectors along with some octonion vector norm.
Octonion lattice constructions of the Leech lattice are explored in several
places, including \cite{elkies_exceptional_1996}, \cite{wilson_octonions_2009}, \cite{wilson_conways_2011}, \cite{nasmith_octonions_2022}, \cite{nasmith_tight_2023}. 

 The \textsf{ALCO} package provides tools to construct and study octonion lattices, including the
Leech lattice constructions given in the references above. This package
constructs octonion lattices in \textsf{GAP} as free left modules (that satisfy \texttt{IsFreeLeftModule}) with the additional structure needed to compute the norms of lattice points
and their inner product. It also includes tools to identify the Leech lattice
and Gosset ($E_8$) lattice by examining the Gram matrix of a lattice. 
\section{\textcolor{Chapter }{Gram Matrices and Octonion Lattices}}\logpage{[ 5, 1, 0 ]}
\hyperdef{L}{X86D2839985CED826}{}
{
  The Gram matrix of a lattice basis is a computed by taking the inner products
of the basis vectors. When the inner product is
real\texttt{\symbol{45}}valued, the Gram matrix of a lattice basis must be a
positive definite symmetric matrix (see \cite[chap. 1]{conway_sphere_2013}). Certain important lattices may be identified using a Gram matrix of that
lattice. The \textsf{ALCO} package provides the following tools to identify a Gosset or Leech lattice
Gram matrix. 

\subsection{\textcolor{Chapter }{IsLeechLatticeGramMatrix}}
\logpage{[ 5, 1, 1 ]}\nobreak
\hyperdef{L}{X86B3BD9C84639A7E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsLeechLatticeGramMatrix({\mdseries\slshape G})\index{IsLeechLatticeGramMatrix@\texttt{IsLeechLatticeGramMatrix}}
\label{IsLeechLatticeGramMatrix}
}\hfill{\scriptsize (function)}}\\


 This function tests whether \mbox{\texttt{\mdseries\slshape G}} is a Gram matrix of the Leech lattice. In order for the function to return \texttt{true}, argument \mbox{\texttt{\mdseries\slshape G}} must satisfy the following. First, \mbox{\texttt{\mdseries\slshape G}} must satisfy \texttt{IsOrdinaryMatrix(\mbox{\texttt{\mdseries\slshape G}})}, \texttt{DimensionsMat(\mbox{\texttt{\mdseries\slshape G}}) = [24,24]}, \texttt{TransposedMat(\mbox{\texttt{\mdseries\slshape G}}) = \mbox{\texttt{\mdseries\slshape G}}}, and \texttt{ForAll(Flat(\mbox{\texttt{\mdseries\slshape G}}), IsInt)}. If so, then this function verifies that \mbox{\texttt{\mdseries\slshape G}} belongs to a unimodular lattice and computes \texttt{ShortestVectors(\mbox{\texttt{\mdseries\slshape G}}, 3)}. Provided that no vectors of norm $1$, $2$, or $3$ exist, then by the classification of unimodular lattices in $24$ dimensions, Gram matrix \mbox{\texttt{\mdseries\slshape G}} must belong to a Leech lattice. For details about the classification see \cite[chaps. 16\texttt{\symbol{45}}18]{conway_sphere_2013}. }

 

\subsection{\textcolor{Chapter }{IsGossetLatticeGramMatrix}}
\logpage{[ 5, 1, 2 ]}\nobreak
\hyperdef{L}{X78F07E967C6779FF}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsGossetLatticeGramMatrix({\mdseries\slshape G})\index{IsGossetLatticeGramMatrix@\texttt{IsGossetLatticeGramMatrix}}
\label{IsGossetLatticeGramMatrix}
}\hfill{\scriptsize (function)}}\\


 This function tests whether \mbox{\texttt{\mdseries\slshape G}} is a Gram matrix of the Gosset lattice, also known as the $E_8$ lattice. In order for the function to return \texttt{true}, argument \mbox{\texttt{\mdseries\slshape G}} must satisfy the following. First, \mbox{\texttt{\mdseries\slshape G}} must satisfy \texttt{IsOrdinaryMatrix(\mbox{\texttt{\mdseries\slshape G}})}, \texttt{DimensionsMat(\mbox{\texttt{\mdseries\slshape G}}) = [8,8]}, \texttt{TransposedMat(\mbox{\texttt{\mdseries\slshape G}}) = \mbox{\texttt{\mdseries\slshape G}}}, and \texttt{ForAll(Flat(\mbox{\texttt{\mdseries\slshape G}}), IsInt)}. If so, then this function verifies that \mbox{\texttt{\mdseries\slshape G}} belongs to a unimodular lattice and computes \texttt{ShortestVectors(\mbox{\texttt{\mdseries\slshape G}}, 1)}. Provided that no vectors of norm $1$ exist, then by the classification of unimodular lattices in $8$ dimensions, Gram matrix \mbox{\texttt{\mdseries\slshape G}} must belong to a Gosset lattice. For details about the classification see \cite[chaps. 16\texttt{\symbol{45}}18]{conway_sphere_2013}. }

 
\subsection{\textcolor{Chapter }{Miracle Octad Generator (MOG) Coordinates}}\logpage{[ 5, 1, 3 ]}
\hyperdef{L}{X824D0D267A7C0765}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{MOGLeechLatticeGeneratorMatrix\index{MOGLeechLatticeGeneratorMatrix@\texttt{MOGLeechLatticeGeneratorMatrix}}
\label{MOGLeechLatticeGeneratorMatrix}
}\hfill{\scriptsize (global variable)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{MOGLeechLatticeGramMatrix\index{MOGLeechLatticeGramMatrix@\texttt{MOGLeechLatticeGramMatrix}}
\label{MOGLeechLatticeGramMatrix}
}\hfill{\scriptsize (global variable)}}\\


 The Leech lattice is studied in detail in \cite{conway_sphere_2013} using a specific set of coordinates, known as "Miracle Octad Generator"
coordinates. The choice of MOG coordinates exhibits the $M_{24}$ symmetries of the lattice. The \textsf{ALCO} package loads the following variables to construct the Leech lattice in MOG
coordinates. The variable \texttt{MOGLeechLatticeGeneratorMatrix} stores the $24 \times 24$ integer matrix with rows that span a MOG Leech lattice \cite[p. 133]{conway_sphere_2013}. The variable \texttt{MOGLeechLatticeGramMatrix} stores the Gram matrix of the generator matrix rows, with the inner product
computed as \texttt{x*y/8}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@M := MOGLeechLatticeGeneratorMatrix;;|
  !gapprompt@gap>| !gapinput@G := M*TransposedMat(M)/8;;|
  !gapprompt@gap>| !gapinput@G = MOGLeechLatticeGramMatrix;|
  true
  !gapprompt@gap>| !gapinput@IsLeechLatticeGramMatrix(G);|
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IsOctonionLattice}}
\logpage{[ 5, 1, 4 ]}\nobreak
\hyperdef{L}{X7C043B907EC1FE89}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsOctonionLattice\index{IsOctonionLattice@\texttt{IsOctonionLattice}}
\label{IsOctonionLattice}
}\hfill{\scriptsize (filter)}}\\


 As described above, an octonion lattice is a free left {\ensuremath{\mathbb
Z}}\texttt{\symbol{45}}module generated by a finite set of octonion vectors
and equipped with some octonion vector norm. The category \texttt{IsOctonionLattice} is a subcategory of \texttt{IsFreeLeftModule} used by the \textsf{ALCO} package to construct octonion lattices as free left modules with the
additional structure of a norm on octonion vectors. The simplest available
norm is perhaps to set the norm of an octonion vector to be the sum of the
norms of the octonion coefficients. The norm for an octonion lattice in the \textsf{ALCO} package is defined (via an inner product) in a more general way, described
below. 

 Let \mbox{\texttt{\mdseries\slshape L}} be an object that satisfies \texttt{IsOctonionLattice(\mbox{\texttt{\mdseries\slshape L}})}. Then \mbox{\texttt{\mdseries\slshape L}} is equipped with an attribute \texttt{\mbox{\texttt{\mdseries\slshape G}} = OctonionGramMatrix(\mbox{\texttt{\mdseries\slshape L}})}. The matrix \mbox{\texttt{\mdseries\slshape G}} is a Hermitian octonion matrix used to define the octonion lattice norm and
inner product. For \mbox{\texttt{\mdseries\slshape x}}, \mbox{\texttt{\mdseries\slshape y}} octonion vectors in \mbox{\texttt{\mdseries\slshape L}}, the inner product of \mbox{\texttt{\mdseries\slshape x}} and \mbox{\texttt{\mdseries\slshape y}} is computed as \texttt{Trace(\mbox{\texttt{\mdseries\slshape x}}*\mbox{\texttt{\mdseries\slshape G}}*ComplexConjugate(\mbox{\texttt{\mdseries\slshape y}}))}. The trace (twice the real part) satisfies \texttt{Trace((\mbox{\texttt{\mdseries\slshape x}}*\mbox{\texttt{\mdseries\slshape y}})*\mbox{\texttt{\mdseries\slshape z}}) = Trace(\mbox{\texttt{\mdseries\slshape x}}*(\mbox{\texttt{\mdseries\slshape y}}*\mbox{\texttt{\mdseries\slshape z}}))} for any octonions \mbox{\texttt{\mdseries\slshape x,y,z}} \cite[p. 145]{wilson_finite_2009}. It follows that the inner product defined above for octonion vectors is also
well defined despite the non\texttt{\symbol{45}}associativity of the octonion
algebra. If we define the norm as the inner product of a vector with itself,
then we can set the vector norm to be the sum of the norms of the octonion
coefficients by setting \texttt{\mbox{\texttt{\mdseries\slshape G}} = OctonionGramMatrix(\mbox{\texttt{\mdseries\slshape L}})} to be half the identity matrix. }

 

\subsection{\textcolor{Chapter }{OctonionLatticeByGenerators}}
\logpage{[ 5, 1, 5 ]}\nobreak
\hyperdef{L}{X7FCBD0FF7D8C0C19}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{OctonionLatticeByGenerators({\mdseries\slshape gens[, G[, B]]})\index{OctonionLatticeByGenerators@\texttt{OctonionLatticeByGenerators}}
\label{OctonionLatticeByGenerators}
}\hfill{\scriptsize (function)}}\\


 This function returns a free left module that satisfies \texttt{IsOctonionLattice} (\ref{IsOctonionLattice}). The attribute \texttt{LeftActingDomain} is automatically set to \texttt{Integers}. Argument \mbox{\texttt{\mdseries\slshape gens}} must be a list of equal length octonion row vectors that satisfies \texttt{IsOctonionCollColl(\mbox{\texttt{\mdseries\slshape gens}})}. The inner product is defined by optional argument \mbox{\texttt{\mdseries\slshape G}}, which is an octonion Hermitian matrix that defaults to half the identity
matrix. Optional argument \mbox{\texttt{\mdseries\slshape 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 \texttt{IsHomogeneousList(Flat([\mbox{\texttt{\mdseries\slshape gens}}, \mbox{\texttt{\mdseries\slshape G}}, \mbox{\texttt{\mdseries\slshape B}}]))} in order to ensure that the same octonion algebra is being used in each
argument. 

 The input \mbox{\texttt{\mdseries\slshape gens}} is stored as the attribute \texttt{GeneratorsOfLeftOperatorAdditiveGroup}. The vectors in \mbox{\texttt{\mdseries\slshape gens}} need not be linearly independent. The octonion algebra basis \mbox{\texttt{\mdseries\slshape B}} is used to convert \mbox{\texttt{\mdseries\slshape gens}} to a list of real coefficients using \texttt{OctonionToRealVector(\mbox{\texttt{\mdseries\slshape B}}, \mbox{\texttt{\mdseries\slshape x}})} for each \mbox{\texttt{\mdseries\slshape x}} in \mbox{\texttt{\mdseries\slshape gens}}. These converted vectors are stored as the attribute \texttt{GeneratorsAsCoefficients} and are used to compute a basis for the lattice which is stored as the
attribute \texttt{ LLLReducedBasisCoefficients}. 

 The argument \mbox{\texttt{\mdseries\slshape G}} is stored as the attribute \texttt{OctonionGramMatrix} and is used to define \texttt{ScalarProduct(\mbox{\texttt{\mdseries\slshape L}}, \mbox{\texttt{\mdseries\slshape x}}, \mbox{\texttt{\mdseries\slshape y}}) = Trace(\mbox{\texttt{\mdseries\slshape x}}*\mbox{\texttt{\mdseries\slshape G}}*ComplexConjugate(\mbox{\texttt{\mdseries\slshape y}}))} for \texttt{IsOctonionLattice(\mbox{\texttt{\mdseries\slshape L}})} and \mbox{\texttt{\mdseries\slshape x,y}} octonion vectors in \mbox{\texttt{\mdseries\slshape L}}. 

 In the following example, we construct the octonion lattice consisting of all
octavian integer triples where the norm of a vector is the sum of the norms of
the coefficients. We also supply the $E_8$ basis for the octavian integers as the underlying octonion ring basis \mbox{\texttt{\mdseries\slshape B}} for the construction. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@O := OctavianIntegers;;|
  !gapprompt@gap>| !gapinput@gens := Concatenation(List(IdentityMat(3), x -> List(Basis(O), y -> x*y)));|
  [ [ (-1/2)*e1+(1/2)*e5+(1/2)*e6+(1/2)*e7, 0*e1, 0*e1 ],
    [ (-1/2)*e1+(-1/2)*e2+(-1/2)*e4+(-1/2)*e7, 0*e1, 0*e1 ],
    [ (1/2)*e2+(1/2)*e3+(-1/2)*e5+(-1/2)*e7, 0*e1, 0*e1 ],
    [ (1/2)*e1+(-1/2)*e3+(1/2)*e4+(1/2)*e5, 0*e1, 0*e1 ],
    [ (-1/2)*e2+(1/2)*e3+(-1/2)*e5+(1/2)*e7, 0*e1, 0*e1 ],
    [ (1/2)*e2+(-1/2)*e4+(1/2)*e5+(-1/2)*e6, 0*e1, 0*e1 ],
    [ (-1/2)*e1+(-1/2)*e3+(1/2)*e4+(-1/2)*e5, 0*e1, 0*e1 ],
    [ (1/2)*e1+(-1/2)*e4+(1/2)*e6+(-1/2)*e8, 0*e1, 0*e1 ],
    [ 0*e1, (-1/2)*e1+(1/2)*e5+(1/2)*e6+(1/2)*e7, 0*e1 ],
    [ 0*e1, (-1/2)*e1+(-1/2)*e2+(-1/2)*e4+(-1/2)*e7, 0*e1 ],
    [ 0*e1, (1/2)*e2+(1/2)*e3+(-1/2)*e5+(-1/2)*e7, 0*e1 ],
    [ 0*e1, (1/2)*e1+(-1/2)*e3+(1/2)*e4+(1/2)*e5, 0*e1 ],
    [ 0*e1, (-1/2)*e2+(1/2)*e3+(-1/2)*e5+(1/2)*e7, 0*e1 ],
    [ 0*e1, (1/2)*e2+(-1/2)*e4+(1/2)*e5+(-1/2)*e6, 0*e1 ],
    [ 0*e1, (-1/2)*e1+(-1/2)*e3+(1/2)*e4+(-1/2)*e5, 0*e1 ],
    [ 0*e1, (1/2)*e1+(-1/2)*e4+(1/2)*e6+(-1/2)*e8, 0*e1 ],
    [ 0*e1, 0*e1, (-1/2)*e1+(1/2)*e5+(1/2)*e6+(1/2)*e7 ],
    [ 0*e1, 0*e1, (-1/2)*e1+(-1/2)*e2+(-1/2)*e4+(-1/2)*e7 ],
    [ 0*e1, 0*e1, (1/2)*e2+(1/2)*e3+(-1/2)*e5+(-1/2)*e7 ],
    [ 0*e1, 0*e1, (1/2)*e1+(-1/2)*e3+(1/2)*e4+(1/2)*e5 ],
    [ 0*e1, 0*e1, (-1/2)*e2+(1/2)*e3+(-1/2)*e5+(1/2)*e7 ],
    [ 0*e1, 0*e1, (1/2)*e2+(-1/2)*e4+(1/2)*e5+(-1/2)*e6 ],
    [ 0*e1, 0*e1, (-1/2)*e1+(-1/2)*e3+(1/2)*e4+(-1/2)*e5 ],
    [ 0*e1, 0*e1, (1/2)*e1+(-1/2)*e4+(1/2)*e6+(-1/2)*e8 ] ]
  !gapprompt@gap>| !gapinput@G := IdentityMat(3)*One(O)/2;;|
  !gapprompt@gap>| !gapinput@B := CanonicalBasis(O);;|
  !gapprompt@gap>| !gapinput@O3 := OctonionLatticeByGenerators(gens, G, B);|
  <free left module over Integers, with 24 generators>
  !gapprompt@gap>| !gapinput@KnownAttributesOfObject(O3);|
  [ "LeftActingDomain""Dimension""GeneratorsOfLeftOperatorAdditiveGroup",
    "UnderlyingOctonionRing""UnderlyingOctonionRingBasis",
    "OctonionGramMatrix""GeneratorsAsCoefficients",
    "LLLReducedBasisCoefficients" ]
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Octonion Lattice Attributes}}\logpage{[ 5, 2, 0 ]}
\hyperdef{L}{X786A725B7ADE7BDE}{}
{
  An free left module \mbox{\texttt{\mdseries\slshape L}} that satisfies \texttt{IsOctonionLattice(\mbox{\texttt{\mdseries\slshape L}})} has several attributes in addition to those of a free left module (such as \texttt{LeftActingDomain} and \texttt{GeneratorsOfLeftOperatorAdditiveGroup}). In the examples of this section, we use the octonion lattice \texttt{O3} constructed above to illustrate these attributes. 

\subsection{\textcolor{Chapter }{UnderlyingOctonionRing}}
\logpage{[ 5, 2, 1 ]}\nobreak
\hyperdef{L}{X781F36A17CD9FDA6}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{UnderlyingOctonionRing({\mdseries\slshape L})\index{UnderlyingOctonionRing@\texttt{UnderlyingOctonionRing}}
\label{UnderlyingOctonionRing}
}\hfill{\scriptsize (attribute)}}\\


 When \mbox{\texttt{\mdseries\slshape L}} satisfies \texttt{IsOctonionLattice(\mbox{\texttt{\mdseries\slshape L}})}, this attribute stores the octonion algebra to which the coefficients of the
generating octonion vectors \mbox{\texttt{\mdseries\slshape gens}} belong. This algebra is determined by \texttt{FamilyObj(One(Flat(\mbox{\texttt{\mdseries\slshape gens}})))!.fullSCAlgebra} where \mbox{\texttt{\mdseries\slshape gens}} is given by \texttt{GeneratorsOfLeftOperatorAdditiveGroup(\mbox{\texttt{\mdseries\slshape L}})}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@UnderlyingOctonionRing(O3);|
  <algebra-with-one of dimension 8 over Rationals>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{OctonionGramMatrix}}
\logpage{[ 5, 2, 2 ]}\nobreak
\hyperdef{L}{X8120692484549A5B}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{OctonionGramMatrix({\mdseries\slshape L})\index{OctonionGramMatrix@\texttt{OctonionGramMatrix}}
\label{OctonionGramMatrix}
}\hfill{\scriptsize (attribute)}}\\


 When \mbox{\texttt{\mdseries\slshape L}} satisfies \texttt{IsOctonionLattice(\mbox{\texttt{\mdseries\slshape L}})}, this attribute stores the optional argument \mbox{\texttt{\mdseries\slshape G}} of \texttt{OctonionLatticeByGenerators} (\ref{OctonionLatticeByGenerators}). When the optional argument is not supplied, the default value is half the
appropriate octonion identity matrix. This octonion matrix is used to compute \texttt{ScalarProduct} (\ref{ScalarProduct:Octonion Lattices}) between lattice vectors. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@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 ] ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{GeneratorsAsCoefficients}}
\logpage{[ 5, 2, 3 ]}\nobreak
\hyperdef{L}{X79113ABC7A39CFFB}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{GeneratorsAsCoefficients({\mdseries\slshape L})\index{GeneratorsAsCoefficients@\texttt{GeneratorsAsCoefficients}}
\label{GeneratorsAsCoefficients}
}\hfill{\scriptsize (attribute)}}\\


 When \mbox{\texttt{\mdseries\slshape L}} satisfies \texttt{IsOctonionLattice(\mbox{\texttt{\mdseries\slshape L}})}, this attribute converts the lattice generators, \texttt{GeneratorsOfLeftOperatorAdditiveGroup(\mbox{\texttt{\mdseries\slshape L}})}, into a list of coefficients using \texttt{OctonionToRealVector(\mbox{\texttt{\mdseries\slshape B}}, \mbox{\texttt{\mdseries\slshape x}})} for each generator \mbox{\texttt{\mdseries\slshape x}}. Recall that \mbox{\texttt{\mdseries\slshape B}} is an optional argument of \texttt{OctonionLatticeByGenerators} (\ref{OctonionLatticeByGenerators}) that defaults to \texttt{CanonicalBasis(UnderlyingOctonionRing(\mbox{\texttt{\mdseries\slshape L}}))}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@GeneratorsAsCoefficients(O3);|
  [ [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ] ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{LLLReducedBasisCoefficients}}
\logpage{[ 5, 2, 4 ]}\nobreak
\hyperdef{L}{X80B8907778F550EE}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{LLLReducedBasisCoefficients({\mdseries\slshape L})\index{LLLReducedBasisCoefficients@\texttt{LLLReducedBasisCoefficients}}
\label{LLLReducedBasisCoefficients}
}\hfill{\scriptsize (attribute)}}\\


 When \mbox{\texttt{\mdseries\slshape L}} satisfies \texttt{IsOctonionLattice(\mbox{\texttt{\mdseries\slshape L}})}, this attribute stores the LLL reduced basis computed from \texttt{GeneratorsAsCoefficients(\mbox{\texttt{\mdseries\slshape L}})}. These vectors define the \texttt{CanonicalBasis} (\ref{CanonicalBasis:Octonion Lattices}) for \mbox{\texttt{\mdseries\slshape L}} and are used to compute the attribute \texttt{GramMatrix} (\ref{GramMatrix:Octonion Lattices}). 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@LLLReducedBasisCoefficients(O3);|
  [ [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0 ],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 ] ]
\end{Verbatim}
 }

 
\subsection{\textcolor{Chapter }{Octonion Lattice Dimension}}\logpage{[ 5, 2, 5 ]}
\hyperdef{L}{X844164BC82764599}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{Dimension({\mdseries\slshape L})\index{Dimension@\texttt{Dimension}!Octonion Lattices}
\label{Dimension:Octonion Lattices}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{Rank({\mdseries\slshape L})\index{Rank@\texttt{Rank}!Octonion Lattices}
\label{Rank:Octonion Lattices}
}\hfill{\scriptsize (attribute)}}\\


 When \mbox{\texttt{\mdseries\slshape L}} satisfies \texttt{IsOctonionLattice(\mbox{\texttt{\mdseries\slshape L}})}, these attributes store the lattice dimension, also known as rank. This is
calculated by evaluating \texttt{Rank( GeneratorsAsCoefficients(\mbox{\texttt{\mdseries\slshape L}}) )}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@Dimension(O3);|
  24
  !gapprompt@gap>| !gapinput@Rank(O3);|
  24
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{GramMatrix (Octonion Lattices)}}
\logpage{[ 5, 2, 6 ]}\nobreak
\hyperdef{L}{X7F4BF549811C33EA}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{GramMatrix({\mdseries\slshape L})\index{GramMatrix@\texttt{GramMatrix}!Octonion Lattices}
\label{GramMatrix:Octonion Lattices}
}\hfill{\scriptsize (attribute)}}\\


 When \mbox{\texttt{\mdseries\slshape L}} satisfies \texttt{IsOctonionLattice(\mbox{\texttt{\mdseries\slshape L}})}, this attribute stores the Gram matrix defined by the basis stored using the \texttt{LLLReducedBasisCoefficients} (\ref{LLLReducedBasisCoefficients}) attribute and the inner product defined on the lattice by \texttt{ScalarProduct} (\ref{ScalarProduct:Octonion Lattices}). 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@g := 2*GramMatrix(O3);;|
  !gapprompt@gap>| !gapinput@DimensionsMat(g);|
  [ 24, 24 ]
  !gapprompt@gap>| !gapinput@DeterminantMat(g);|
  1
\end{Verbatim}
 }

 
\subsection{\textcolor{Chapter }{Lattice Basis}}\logpage{[ 5, 2, 7 ]}
\hyperdef{L}{X825D41AE7A411640}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{Basis({\mdseries\slshape L})\index{Basis@\texttt{Basis}!Octonion Lattices}
\label{Basis:Octonion Lattices}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{CanonicalBasis({\mdseries\slshape L})\index{CanonicalBasis@\texttt{CanonicalBasis}!Octonion Lattices}
\label{CanonicalBasis:Octonion Lattices}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{BasisVectors({\mdseries\slshape B})\index{BasisVectors@\texttt{BasisVectors}!Octonion Lattices}
\label{BasisVectors:Octonion Lattices}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsOctonionLatticeBasis\index{IsOctonionLatticeBasis@\texttt{IsOctonionLatticeBasis}!Octonion Lattices}
\label{IsOctonionLatticeBasis:Octonion Lattices}
}\hfill{\scriptsize (filter)}}\\


 When \mbox{\texttt{\mdseries\slshape L}} satisfies \texttt{IsOctonionLattice(\mbox{\texttt{\mdseries\slshape L}})}, these attributes are used to store the lattice canonical basis determined by \texttt{LLLReducedBasisCoefficients} (\ref{LLLReducedBasisCoefficients}). The attributes \texttt{Basis(\mbox{\texttt{\mdseries\slshape L}})} and \texttt{CanonicalBasis(\mbox{\texttt{\mdseries\slshape L}})} are equivalent and satisfy the filter \texttt{IsOctonionLatticeBasis}. The attribute \texttt{BasisVectors} returns the vectors stored in the attribute \texttt{LLLReducedBasisCoefficients} (\ref{LLLReducedBasisCoefficients}) converted into octonion vectors using \texttt{RealToOctonionVector(UnderlyingOctonionRingBasis(\mbox{\texttt{\mdseries\slshape L}}), \mbox{\texttt{\mdseries\slshape x}})} for each \mbox{\texttt{\mdseries\slshape x}} in \texttt{LLLReducedBasisCoefficients(\mbox{\texttt{\mdseries\slshape L}})}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@IsOctonionLatticeBasis(Basis(O3));|
  true
  !gapprompt@gap>| !gapinput@b := BasisVectors(Basis(O3));|
  [ [ (-1/2)*e1+(1/2)*e5+(1/2)*e6+(1/2)*e7, 0*e1, 0*e1 ],
    [ (-1/2)*e1+(-1/2)*e2+(-1/2)*e4+(-1/2)*e7, 0*e1, 0*e1 ],
    [ (1/2)*e1+(1/2)*e2+(1/2)*e4+(-1/2)*e7, 0*e1, 0*e1 ],
    [ (1/2)*e2+(1/2)*e3+(-1/2)*e5+(-1/2)*e7, 0*e1, 0*e1 ],
    [ (1/2)*e1+(1/2)*e3+(1/2)*e4+(-1/2)*e5, 0*e1, 0*e1 ],
    [ (1/2)*e1+(1/2)*e2+(1/2)*e3+(-1/2)*e6, 0*e1, 0*e1 ],
    [ (1/2)*e2+(1/2)*e4+(-1/2)*e5+(-1/2)*e6, 0*e1, 0*e1 ],
    [ (1/2)*e1+(1/2)*e2+(-1/2)*e5+(-1/2)*e8, 0*e1, 0*e1 ],
    [ 0*e1, (-1/2)*e1+(1/2)*e5+(1/2)*e6+(1/2)*e7, 0*e1 ],
    [ 0*e1, (-1/2)*e1+(-1/2)*e2+(-1/2)*e4+(-1/2)*e7, 0*e1 ],
    [ 0*e1, (1/2)*e1+(1/2)*e2+(1/2)*e4+(-1/2)*e7, 0*e1 ],
    [ 0*e1, (1/2)*e2+(1/2)*e3+(-1/2)*e5+(-1/2)*e7, 0*e1 ],
    [ 0*e1, (1/2)*e1+(1/2)*e3+(1/2)*e4+(-1/2)*e5, 0*e1 ],
    [ 0*e1, (1/2)*e1+(1/2)*e2+(1/2)*e3+(-1/2)*e6, 0*e1 ],
    [ 0*e1, (1/2)*e2+(1/2)*e4+(-1/2)*e5+(-1/2)*e6, 0*e1 ],
    [ 0*e1, (1/2)*e1+(1/2)*e2+(-1/2)*e5+(-1/2)*e8, 0*e1 ],
    [ 0*e1, 0*e1, (-1/2)*e1+(1/2)*e5+(1/2)*e6+(1/2)*e7 ],
    [ 0*e1, 0*e1, (-1/2)*e1+(-1/2)*e2+(-1/2)*e4+(-1/2)*e7 ],
    [ 0*e1, 0*e1, (1/2)*e1+(1/2)*e2+(1/2)*e4+(-1/2)*e7 ],
    [ 0*e1, 0*e1, (1/2)*e2+(1/2)*e3+(-1/2)*e5+(-1/2)*e7 ],
    [ 0*e1, 0*e1, (1/2)*e1+(1/2)*e3+(1/2)*e4+(-1/2)*e5 ],
    [ 0*e1, 0*e1, (1/2)*e1+(1/2)*e2+(1/2)*e3+(-1/2)*e6 ],
    [ 0*e1, 0*e1, (1/2)*e2+(1/2)*e4+(-1/2)*e5+(-1/2)*e6 ],
    [ 0*e1, 0*e1, (1/2)*e1+(1/2)*e2+(-1/2)*e5+(-1/2)*e8 ] ]
  !gapprompt@gap>| !gapinput@GramMatrix(O3) = List(b, x -> List(b, y -> ScalarProduct(O3, x, y)));|
  true
\end{Verbatim}
 }

  }

 
\section{\textcolor{Chapter }{Octonion Lattice Operations}}\logpage{[ 5, 3, 0 ]}
\hyperdef{L}{X79F28E887AF17FFC}{}
{
  There are some additional operations available to study octonion lattices. In
the examples that follow, we continue to use the lattice \texttt{O3} defined in the example of \texttt{OctonionLatticeByGenerators} (\ref{OctonionLatticeByGenerators}). 

\subsection{\textcolor{Chapter }{\texttt{\symbol{92}}in}}
\logpage{[ 5, 3, 1 ]}\nobreak
\hyperdef{L}{X87BDB89B7AAFE8AD}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{\texttt{\symbol{92}}in({\mdseries\slshape x, L})\index{\texttt{\symbol{92}}in@\texttt{\texttt{\symbol{92}}in}}
\label{bSlashin}
}\hfill{\scriptsize (operation)}}\\


 When \mbox{\texttt{\mdseries\slshape L}} satisfies \texttt{IsOctonionLattice(\mbox{\texttt{\mdseries\slshape L}})} and \mbox{\texttt{\mdseries\slshape x}} is an octonion row vector that satisfies \texttt{IsOctonionCollection and IsRowVector}, this operation test whether vector \mbox{\texttt{\mdseries\slshape x}} is in lattice \mbox{\texttt{\mdseries\slshape L}}. This operation will return \texttt{fail} when \mbox{\texttt{\mdseries\slshape x}} and \mbox{\texttt{\mdseries\slshape L}} do not share the same underlying octonion ring. Note that \texttt{\texttt{\symbol{92}}in(\mbox{\texttt{\mdseries\slshape x}},\mbox{\texttt{\mdseries\slshape L}})} and \texttt{\mbox{\texttt{\mdseries\slshape x}} in \mbox{\texttt{\mdseries\slshape L}}} are equivalent expression. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@x := Sum(BasisVectors(Basis(O3)){[2,3,4]});|
  [ (1/2)*e2+(1/2)*e3+(-1/2)*e5+(-3/2)*e7, 0*e1, 0*e1 ]
  !gapprompt@gap>| !gapinput@x in O3;|
  true
  !gapprompt@gap>| !gapinput@\in( x, O3);|
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{ScalarProduct (Octonion Lattices)}}
\logpage{[ 5, 3, 2 ]}\nobreak
\hyperdef{L}{X84CF857E83452B67}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ScalarProduct({\mdseries\slshape L, x, y})\index{ScalarProduct@\texttt{ScalarProduct}!Octonion Lattices}
\label{ScalarProduct:Octonion Lattices}
}\hfill{\scriptsize (operation)}}\\


 When \mbox{\texttt{\mdseries\slshape L}} satisfies \texttt{IsOctonionLattice(\mbox{\texttt{\mdseries\slshape L}})} and \mbox{\texttt{\mdseries\slshape x}}, \mbox{\texttt{\mdseries\slshape y}} satisfy \texttt{IsOctonionCollection and IsRowVector} then this operation returns \texttt{Trace(\mbox{\texttt{\mdseries\slshape x}}*OctonionGramMatrix(\mbox{\texttt{\mdseries\slshape L}})*ComplexConjugate(\mbox{\texttt{\mdseries\slshape y}}))}. Here the trace is the method \texttt{Trace} (\ref{Trace:Octonions}) acting on an octonion argument (corresponding to twice the real part, or
identity coefficient, of the octonion \texttt{\mbox{\texttt{\mdseries\slshape x}}*OctonionGramMatrix(\mbox{\texttt{\mdseries\slshape L}})*ComplexConjugate(\mbox{\texttt{\mdseries\slshape y}})}). When \mbox{\texttt{\mdseries\slshape x}}, \mbox{\texttt{\mdseries\slshape y}} are not octonion vectors but rather coefficient vectors of the appropriate
length, with\texttt{IsHomogeneousList(Flat([x,y,GeneratorsAsCoefficients(L)]))}, then the operation \texttt{ScalarProduct} converts \mbox{\texttt{\mdseries\slshape x}} an\mbox{\texttt{\mdseries\slshape y}} to suitable octonion vectors to compute the scalar product. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@b := BasisVectors(Basis(O3));;|
  !gapprompt@gap>| !gapinput@b[1];|
  [ (-1/2)*e1+(1/2)*e5+(1/2)*e6+(1/2)*e7, 0*e1, 0*e1 ]
  !gapprompt@gap>| !gapinput@GramMatrix(O3) = List(b, x -> List(b, y -> ScalarProduct(O3, x, y)));|
  true
  !gapprompt@gap>| !gapinput@c := LLLReducedBasisCoefficients(O3);;|
  !gapprompt@gap>| !gapinput@c[1];|
  [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
  !gapprompt@gap>| !gapinput@GramMatrix(O3) = List(c, x -> List(c, y -> ScalarProduct(O3, x, y)));|
  true
\end{Verbatim}
 }

 
\subsection{\textcolor{Chapter }{Sublattice Identification}}\logpage{[ 5, 3, 3 ]}
\hyperdef{L}{X7F68456883DCEE5D}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsSublattice({\mdseries\slshape L, M})\index{IsSublattice@\texttt{IsSublattice}}
\label{IsSublattice}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsSubset({\mdseries\slshape L, M})\index{IsSubset@\texttt{IsSubset}}
\label{IsSubset}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{\texttt{\symbol{92}}=({\mdseries\slshape L, M})\index{\texttt{\symbol{92}}=@\texttt{\texttt{\symbol{92}}=}}
\label{bSlash=}
}\hfill{\scriptsize (operation)}}\\


 When \mbox{\texttt{\mdseries\slshape L}} and \mbox{\texttt{\mdseries\slshape M}} both satisfy \texttt{IsOctonionLattice(\mbox{\texttt{\mdseries\slshape L}})}, these operations determine whether \mbox{\texttt{\mdseries\slshape M}} is a sublattice of \mbox{\texttt{\mdseries\slshape L}} by checking whether the basis vectors for \mbox{\texttt{\mdseries\slshape M}} are in \mbox{\texttt{\mdseries\slshape L}}. If the lattices \mbox{\texttt{\mdseries\slshape L}} and \mbox{\texttt{\mdseries\slshape M}} do not share the same \texttt{UnderlyingOctonionRing} (\ref{UnderlyingOctonionRing}) then the operation will return \texttt{fail}. The operation \texttt{\texttt{\symbol{92}}=} returns the value of \texttt{IsSublattice(\mbox{\texttt{\mdseries\slshape L}}, \mbox{\texttt{\mdseries\slshape M}}) and IsSublattice(\mbox{\texttt{\mdseries\slshape L}}, \mbox{\texttt{\mdseries\slshape M}})}. In the example below we construct an octonion Leech lattice \texttt{Leech} and verify that it is a sublattice of \texttt{O3}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@s := LinearCombination(OctonionE8Basis, [ 1, 2, 1, 2, 2, 2, 2, 1 ]);;|
  !gapprompt@gap>| !gapinput@leech_gens := List(Basis(OctavianIntegers), x -> |
  !gapprompt@>| !gapinput@x*[[s,s,0],[0,s,s],ComplexConjugate([s,s,s])]);;|
  !gapprompt@gap>| !gapinput@leech_gens := Concatenation(leech_gens);;|
  !gapprompt@gap>| !gapinput@Leech := OctonionLatticeByGenerators(leech_gens, G, B);|
  <free left module over Integers, with 24 generators>
  !gapprompt@gap>| !gapinput@IsLeechLatticeGramMatrix(GramMatrix(Leech));|
  true
  !gapprompt@gap>| !gapinput@IsSublattice(Leech, O3);|
  false
  !gapprompt@gap>| !gapinput@IsSublattice(O3, Leech);|
  true
  !gapprompt@gap>| !gapinput@IsSubset(O3, Leech);|
  true
\end{Verbatim}
 }

 
\subsection{\textcolor{Chapter }{Lattice Vector Coefficients}}\logpage{[ 5, 3, 4 ]}
\hyperdef{L}{X83B4296D7A2F59F8}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{Coefficients({\mdseries\slshape B, y})\index{Coefficients@\texttt{Coefficients}!Octonion Lattices}
\label{Coefficients:Octonion Lattices}
}\hfill{\scriptsize (operation)}}\\


 Let \mbox{\texttt{\mdseries\slshape B}} satisfy \texttt{IsOctonionLatticeBasis(\mbox{\texttt{\mdseries\slshape B}})} with basis \mbox{\texttt{\mdseries\slshape B}} belonging to octonion lattice \mbox{\texttt{\mdseries\slshape L}}. For \texttt{\mbox{\texttt{\mdseries\slshape y}} in \mbox{\texttt{\mdseries\slshape L}}} such that \texttt{IsOctonionCollection(\mbox{\texttt{\mdseries\slshape y}})}, the coefficients in \mbox{\texttt{\mdseries\slshape y}} in the lattice basis \mbox{\texttt{\mdseries\slshape B}} can be determined by \texttt{Coefficients(\mbox{\texttt{\mdseries\slshape B}}, \mbox{\texttt{\mdseries\slshape y}})}. For \texttt{\mbox{\texttt{\mdseries\slshape x}}} an integer row vector of suitable length, the linear combination of basis
vectors is computed in the usual way as \texttt{LinearCombination(\mbox{\texttt{\mdseries\slshape B}}, \mbox{\texttt{\mdseries\slshape x}})}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@rand := Random(O3);;|
  !gapprompt@gap>| !gapinput@coeffs := Coefficients(Basis(O3), rand);;|
  !gapprompt@gap>| !gapinput@rand = LinearCombination(Basis(O3), coeffs);|
  true
\end{Verbatim}
 }

 }

 }

 
\chapter{\textcolor{Chapter }{Closure Tools}}\logpage{[ 6, 0, 0 ]}
\hyperdef{L}{X86ED1AD579C62F21}{}
{
  The \textsf{ALCO} package provides some basic tools to compute the closure of a set with respect
to a binary operation. Some of these tools compute the closure by brute force,
while others use random selection of pairs to attempt to find new members not
in the set. 
\section{\textcolor{Chapter }{Brute Force Method}}\logpage{[ 6, 1, 0 ]}
\hyperdef{L}{X811639F384636DE8}{}
{
  

\subsection{\textcolor{Chapter }{Closure}}
\logpage{[ 6, 1, 1 ]}\nobreak
\hyperdef{L}{X87E8AA6582245C3E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{Closure({\mdseries\slshape gens, op[, option]})\index{Closure@\texttt{Closure}}
\label{Closure}
}\hfill{\scriptsize (function)}}\\


 For \mbox{\texttt{\mdseries\slshape gens}} satisfying \texttt{IsHomogeneousList}, this function computes the closure of \mbox{\texttt{\mdseries\slshape gens}} by addition of all elements of the form \texttt{\mbox{\texttt{\mdseries\slshape op}}(x,y)}, starting with \texttt{x} and \texttt{y} any elements in \mbox{\texttt{\mdseries\slshape gens}}. The function will not terminate until no new members are produced when
applying \mbox{\texttt{\mdseries\slshape op}} to all ordered pairs of generated elements. The argument \mbox{\texttt{\mdseries\slshape option}}, if supplied, ensures that the function treats \mbox{\texttt{\mdseries\slshape op}} as a commutative operation. 

 Caution must be exercised when using this function to prevent attempting to
compute the closure of large or possibly infinite sets. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@Closure([1,E(7)], \*);|
  [ 1, E(7)^6, E(7)^5, E(7)^4, E(7)^3, E(7)^2, E(7) ]
  !gapprompt@gap>| !gapinput@QuaternionD4Basis;|
  Basis( <algebra-with-one of dimension 4 over Rationals>,
  [ (-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 ] )
  !gapprompt@gap>| !gapinput@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/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 ]
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Random Choice Methods}}\logpage{[ 6, 2, 0 ]}
\hyperdef{L}{X7F865ED67CC5740F}{}
{
  In many cases the \texttt{Closure} (\ref{Closure}) 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. 

\subsection{\textcolor{Chapter }{RandomElementClosure}}
\logpage{[ 6, 2, 1 ]}\nobreak
\hyperdef{L}{X78DC531B815591E8}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{RandomElementClosure({\mdseries\slshape gens, op[, N[, print]]})\index{RandomElementClosure@\texttt{RandomElementClosure}}
\label{RandomElementClosure}
}\hfill{\scriptsize (function)}}\\


 For \mbox{\texttt{\mdseries\slshape gens}} satisfying \texttt{IsHomogeneousList}, this function selects a random element \mbox{\texttt{\mdseries\slshape r}} in \mbox{\texttt{\mdseries\slshape gens}} and computes all elements of the form \texttt{\mbox{\texttt{\mdseries\slshape  op}}(\mbox{\texttt{\mdseries\slshape r}},\mbox{\texttt{\mdseries\slshape x}})} for \mbox{\texttt{\mdseries\slshape x}} either in \mbox{\texttt{\mdseries\slshape gens}} or obtained in a previous closure step. Once this process yields a set of
elements with equal cardinality \texttt{\mbox{\texttt{\mdseries\slshape N}}+1} times, the function terminates and returns all elements obtained so far as a
set. The default value of \mbox{\texttt{\mdseries\slshape N}} is \texttt{1}. The optional \mbox{\texttt{\mdseries\slshape print}} argument, if supplied, prints the cardinality of the set of elements obtain so
far at each iteration. 

 Caution must be exercised when using this function to prevent attempting to
compute the random closure of an infinite set. Caution is also required in
interpreting the output. Even for large values of \mbox{\texttt{\mdseries\slshape N}}, the result is not necessarily the full closure of set \mbox{\texttt{\mdseries\slshape gens}}. Furthermore, repeated calls to this function may result in different outputs
due to the random selection of elements involved throughout. If the size of
the expected closed set is known, use of a \texttt{repeat}\texttt{\symbol{45}}\texttt{until} loop can permit generating the full set of elements faster than \texttt{Closure} (\ref{Closure}) would. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@start := Basis(QuaternionAlgebra(Rationals)){[2,3]};|
  [ i, j ]
  !gapprompt@gap>| !gapinput@repeat|
  !gapprompt@>| !gapinput@start := RandomElementClosure(start, \*);|
  !gapprompt@>| !gapinput@until Length(start) = 8;|
  !gapprompt@gap>| !gapinput@start;|
  [ (-1)*e, (-1)*i, (-1)*j, (-1)*k, k, j, i, e ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{RandomOrbitOnSets}}
\logpage{[ 6, 2, 2 ]}\nobreak
\hyperdef{L}{X7A4675E27B489038}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{RandomOrbitOnSets({\mdseries\slshape gens, start, op[, N[, print]]})\index{RandomOrbitOnSets@\texttt{RandomOrbitOnSets}}
\label{RandomOrbitOnSets}
}\hfill{\scriptsize (function)}}\\


 This function proceeds in a manner very similar to \texttt{RandomElementClosure} (\ref{RandomElementClosure}) with the following differences. This function instead selects a random element \mbox{\texttt{\mdseries\slshape r}} in \mbox{\texttt{\mdseries\slshape gens}} and then for every \mbox{\texttt{\mdseries\slshape x}} in \mbox{\texttt{\mdseries\slshape start}}, or the set of previously generated elements, computes \texttt{\mbox{\texttt{\mdseries\slshape op}}(\mbox{\texttt{\mdseries\slshape r}},\mbox{\texttt{\mdseries\slshape x}})}. At each step the cardinality of the union of \mbox{\texttt{\mdseries\slshape start}} and any previously generated elements is computed. Once the cardinality is
fixed for \mbox{\texttt{\mdseries\slshape N + 1}} steps, the function returns the set of generated elements. 

 The same cautions as described in \texttt{RandomElementClosure} (\ref{RandomElementClosure}) apply. Note that while \mbox{\texttt{\mdseries\slshape start}} is always a subset of the output, the elements of \mbox{\texttt{\mdseries\slshape gens}} are not necessarily included in the output. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@start := Basis(QuaternionAlgebra(Rationals)){[1,2]};|
  [ e, i ]
  !gapprompt@gap>| !gapinput@gens := Basis(QuaternionAlgebra(Rationals)){[3]};|
  [ j ]
  !gapprompt@gap>| !gapinput@repeat |
  !gapprompt@>| !gapinput@start := RandomOrbitOnSets(gens, start, {x,y} -> x*y);|
  !gapprompt@>| !gapinput@until Length(start) = 8;|
  !gapprompt@gap>| !gapinput@start;|
  [ (-1)*e, (-1)*i, (-1)*j, (-1)*k, k, j, i, e ]
\end{Verbatim}
 }

 }

 }

 \def\bibname{References\logpage{[ "Bib", 0, 0 ]}
\hyperdef{L}{X7A6F98FD85F02BFE}{}
}

\bibliographystyle{alpha}
\bibliography{alco}

\addcontentsline{toc}{chapter}{References}

\def\indexname{Index\logpage{[ "Ind", 0, 0 ]}
\hyperdef{L}{X83A0356F839C696F}{}
}

\cleardoublepage
\phantomsection
\addcontentsline{toc}{chapter}{Index}


\printindex

\immediate\write\pagenrlog{["Ind", 0, 0], \arabic{page},}
\newpage
\immediate\write\pagenrlog{["End"], \arabic{page}];}
\immediate\closeout\pagenrlog
\end{document}

Messung V0.5 in Prozent
C=100 H=100 G=100

¤ Dauer der Verarbeitung: 0.59 Sekunden  (vorverarbeitet am  2026-04-26) ¤

*© Formatika GbR, Deutschland






Normalansicht

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge