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

\usepackage{a4wide}
\sloppy
\pagestyle{myheadings}
\usepackage{amssymb}
\usepackage[latin1]{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{The \textsf{LOOPS} Package\mbox{}}}\\
\vfill

\hypersetup{pdftitle=The \textsf{LOOPS} Package}
\markright{\scriptsize \mbox{}\hfill The \textsf{LOOPS} Package \hfill\mbox{}}
{\Huge \textbf{Computing with quasigroups and loops in \textsf{GAP}\mbox{}}}\\
\vfill

{\Huge Version 3.1.0\mbox{}}\\[1cm]
\mbox{}\\[2cm]
{\Large \textbf{G{\a'a}bor P. Nagy   \mbox{}}}\\
{\Large \textbf{Petr Vojt{\v e}chovsk{\a'y}   \mbox{}}}\\
\hypersetup{pdfauthor=G{\a'a}bor P. Nagy   ; Petr Vojt{\v e}chovsk{\a'y}   }
\end{center}\vfill

\mbox{}\\
{\mbox{}\\
\small \noindent \textbf{G{\a'a}bor P. Nagy   }  Email: \href{mailto://nagyg@math.u-szeged.hu} {\texttt{nagyg@math.u-szeged.hu}}\\
  Address: \begin{minipage}[t]{8cm}\noindent
Department of Mathematics, University of Szeged\end{minipage}
}\\
{\mbox{}\\
\small \noindent \textbf{Petr Vojt{\v e}chovsk{\a'y}   }  Email: \href{mailto://petr@math.du.edu} {\texttt{petr@math.du.edu}}\\
  Address: \begin{minipage}[t]{8cm}\noindent
Department of Mathematics, University of Denver\end{minipage}
}\\
\end{titlepage}

\newpage\setcounter{page}{2}
{\small 
\section*{Copyright}
\logpage{[ 0, 0, 1 ]}
{\copyright} 2015 G{\a'a}bor P. Nagy and Petr Vojt{\v e}chovsk{\a'y}. \mbox{}}\\[1cm]
\newpage

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

\tableofcontents
\newpage

  
\chapter{\textcolor{Chapter }{Introduction}}\label{Chap:Introduction}
\logpage{[ 1, 0, 0 ]}
\hyperdef{L}{X7DFB63A97E67C0A1}{}
{
  \textsf{LOOPS} is a package for \textsf{GAP4} whose purpose is to: 
\begin{itemize}
\item provide researchers in nonassociative algebra with a powerful computational
tool concerning finite loops and quasigroups,
\item extend \textsf{GAP} toward the realm of nonassociative structures.
\end{itemize}
 \textsf{LOOPS} has been accepted as an official package of \textsf{GAP} in May 2015.  
\section{\textcolor{Chapter }{License}}\label{Sec:License}
\logpage{[ 1, 1, 0 ]}
\hyperdef{L}{X861E5DF986F89AE2}{}
{
  \textsf{LOOPS} is free software. You can redistribute it and/or modify it under the terms of
the GNU General Public License version 3 as published by the Free Software
Foundation. }

  
\section{\textcolor{Chapter }{Installation}}\label{Sec:Installation}
\logpage{[ 1, 2, 0 ]}
\hyperdef{L}{X8360C04082558A12}{}
{
  Have \textsf{GAP 4.7} or newer installed on your computer. 

If you do not see the subfolder \texttt{pkg/loops} in the main directory of \textsf{GAP} then download the \textsf{LOOPS} package from the distribution website \href{http://www.math.du.edu/loops} {\texttt{http://www.math.du.edu/loops}} and unpack the downloaded file into the \texttt{pkg} subfolder. 

The package \textsf{LOOPS} can then be loaded to \textsf{GAP} anytime by calling \texttt{LoadPackage("loops");}. 

If you wish to load \textsf{LOOPS} automatically while starting \textsf{GAP}, start \textsf{GAP}, execute the following commands, 
\begin{verbatim}  
  gap> pref := UserPreference( "PackagesToLoad " );;
  gap> Add( pref, "loops" );;
  gap> SetUserPreference( "PackagesToLoad", pref );;
  gap> WriteGapIniFile();;
\end{verbatim}
 quit \textsf{GAP} and restart it. }

  
\section{\textcolor{Chapter }{Documentation}}\label{Sec:Documentation}
\logpage{[ 1, 3, 0 ]}
\hyperdef{L}{X7F4F8D6F7CD6B765}{}
{
  The documentation has been prepared with the \textsf{GAPDoc} package and is therefore available in several formats: {\LaTeX}, pdf, ps, html, and as an inline help in \textsf{GAP}. All these formats have been obtained directly from the master XML
documentation file. Consequently, the different formats of the documentation
differ only in their appearance, not in content. 

The preferred format of the documentation is html with MathJax turned on. 

All formats of the documentation can be found in the \texttt{doc} folder of \textsf{LOOPS}. You can also download the documentation from the \textsf{LOOPS} distribution website. 

The inline \textsf{GAP} help is available upon installing \textsf{LOOPS} and can be accessed in the usual way, i.e., upon typing \texttt{?command}, \textsf{GAP} displays the section of the \textsf{LOOPS} manual containing information about \texttt{command}. }

  
\section{\textcolor{Chapter }{Test Files}}\label{Sec:TestFiles}
\logpage{[ 1, 4, 0 ]}
\hyperdef{L}{X801051CC86594630}{}
{
  Test files conforming to \textsf{GAP} standards are provided for \textsf{LOOPS} and can be found in the folder \texttt{tst}. The command \texttt{ReadPackage("loops","tst/testall.g")} runs all tests for \textsf{LOOPS}. }

  
\section{\textcolor{Chapter }{Memory Management}}\label{Sec:MemoryManagement}
\logpage{[ 1, 5, 0 ]}
\hyperdef{L}{X79342B4E7E55FD0F}{}
{
  Some libraries of loops are loaded only upon explicit demand and can occupy a
lot of memory. For instance, the library or RCC loops occupies close to 100 MB
of memory when fully loaded. The command \texttt{LOOPS{\textunderscore}FreeMemory();} will attempt to free memory by unbinding on-demand library data loaded by \textsf{LOOPS}. }

  
\section{\textcolor{Chapter }{Feedback}}\label{Sec:Feedback}
\logpage{[ 1, 6, 0 ]}
\hyperdef{L}{X80D704CC7EBFDF7A}{}
{
  We welcome all comments and suggestions on \textsf{LOOPS}, especially those concerning the future development of the package. You can
contact us by e-mail. }

  
\section{\textcolor{Chapter }{Acknowledgment}}\label{Sec:Acknowledgment}
\logpage{[ 1, 7, 0 ]}
\hyperdef{L}{X811B08C07BD79486}{}
{
  We thank the following people for sending us remarks and comments, and for
suggesting new functionality of the package: Muniru Asiru, Bjoern Assmann,
Andreas Distler, Ale{\v s} Dr{\a'a}pal, Steve Flammia, Kenneth W. Johnson,
Michael K. Kinyon, Alexander Konovalov, Frank L{\"u}beck and Jonathan D.H.
Smith. 

The library of Moufang loops of order 243 was generated from data provided by
Michael C. Slattery and Ashley L. Zenisek. The library of right conjugacy
closed loops of order less than 28 was generated from data provided by
Katharina Artic. 

G{\a'a}bor P. Nagy was supported by OTKA grants F042959 and T043758, and Petr
Vojt{\v e}chovsk{\a'y} was supported by the 2006 PROF grant of the University
of Denver and by the Simons Foundation Collaboration Grant 210176. }

 }

  
\chapter{\textcolor{Chapter }{Mathematical Background}}\label{Chap:MathematicalBackground}
\logpage{[ 2, 0, 0 ]}
\hyperdef{L}{X7EF1B6708069B0C7}{}
{
  We assume that you are familiar with the theory of quasigroups and loops, for
instance with the textbook of Bruck \cite{Br} or Pflugfelder \cite{Pf}. Nevertheless, we did include definitions and results in this manual in order
to unify terminology and improve legibility of the text. Some general concepts
of quasigroups and loops can be found in this chapter. More special concepts
are defined throughout the text as needed.  
\section{\textcolor{Chapter }{Quasigroups and Loops}}\label{Sec:QuasigroupsAndLoops}
\logpage{[ 2, 1, 0 ]}
\hyperdef{L}{X80243DE5826583B8}{}
{
  A set with one binary operation (denoted $\cdot$ here) is called \index{groupoid}\emph{groupoid} or \index{magma}\emph{magma}, the latter name being used in \textsf{GAP}. 

An element $1$ of a groupoid $G$ is a \index{neutral element}\emph{neutral element} or an \index{identity!element}\emph{identity element} if $1\cdot x = x\cdot 1 = x$ for every $x$ in $G$. 

Let $G$ be a groupoid with neutral element $1$. Then an element $x^{-1}$ is called a \index{inverse!two-sided}\emph{two-sided inverse} of $x$ in $G$ if $ x\cdot x^{-1} = x^{-1}\cdot x = 1$. 

Recall that \index{group}groups are associative groupoids with an identity element and two-sided
inverses. Groups can be reached in another way from groupoids, namely via
quasigroups and loops. 

A \index{quasigroup}\emph{quasigroup} $Q$ is a groupoid such that the equation $x\cdot y=z$ has a unique solution in $Q$ whenever two of the three elements $x$, $y$, $z$ of $Q$ are specified. Note that multiplication tables of finite quasigroups are
precisely \index{latin square}\emph{latin squares}, i.e., square arrays with symbols arranged so that each symbol occurs in each
row and in each column exactly once. A \index{loop}\emph{loop} $L$ is a quasigroup with a neutral element. 

Groups are clearly loops. Conversely, it is not hard to show that associative
quasigroups are groups. }

  
\section{\textcolor{Chapter }{Translations}}\label{Sec:Translations}
\logpage{[ 2, 2, 0 ]}
\hyperdef{L}{X7EC01B437CC2B2C9}{}
{
  Given an element $x$ of a quasigroup $Q$, we can associative two permutations of $Q$ with it: the \index{translation!left}\emph{left translation} $L_x:Q\to Q$ defined by $y\mapsto x\cdot y$, and the \index{translation!right}\emph{right translation} $R_x:Q\to Q$ defined by $y\mapsto y\cdot x$. 

The binary operation $x\backslash y = L_x^{-1}(y)$ is called the \index{division!left}\emph{left division}, and $x/y = R_y^{-1}(x)$ is called the \index{division!right}\emph{right division}. 

Although it is possible to compose two left (right) translations of a
quasigroup, the resulting permutation is not necessarily a left (right)
translation. The set $\{L_x|x\in Q\}$ is called the \index{section!left}\emph{left section} of $Q$, and $\{R_x|x\in Q\}$ is the \index{section!right}\emph{right section} of $Q$. 

Let $S_Q$ be the symmetric group on $Q$. Then the subgroup ${\rm Mlt}_{\lambda}(Q)=\langle L_x|x\in Q\rangle$ of $S_Q$ generated by all left translations is the \index{multiplication group!left}\emph{left multiplication group} of $Q$. Similarly, ${\rm Mlt}_{\rho}(Q)= \langle R_x|x\in Q\rangle$ is the \index{multiplication group!right}\emph{right multiplication group} of $Q$. The smallest group containing both ${\rm Mlt}_{\lambda}(Q)$ and ${\rm Mlt}_{\rho}(Q)$ is called the \index{multiplication group}\emph{multiplication group} of $Q$ and is denoted by ${\rm Mlt}(Q)$. 

For a loop $Q$, the \index{inner mapping group!left}\emph{left inner mapping group} ${\rm Inn}_{\lambda}(Q)$ is the stabilizer of $1$ in ${\rm Mlt}_{\lambda}(Q)$. The \index{inner mapping group!right}\emph{right inner mapping group} ${\rm Inn}_{\rho}(Q)$ is defined dually. The \index{inner mapping group}\emph{inner mapping group} ${\rm Inn}(Q)$ is the stabilizer of $1$ in $Q$. }

  
\section{\textcolor{Chapter }{Subquasigroups and Subloops}}\label{Sec:SubquasigroupsAndSubloops}
\logpage{[ 2, 3, 0 ]}
\hyperdef{L}{X83EDF04F7952143F}{}
{
  A nonempty subset $S$ of a quasigroup $Q$ is a \index{subquasigroup}\emph{subquasigroup} if it is closed under multiplication and the left and right divisions. In the
finite case, it suffices for $S$ to be closed under multiplication. \index{subloop}\emph{Subloops} are defined analogously when $Q$ is a loop. 

The \index{nucleus!left}\emph{left nucleus} ${\rm Nuc}_{\lambda}(Q)$ of $Q$ consists of all elements $x$ of $Q$ such that $x(yz) = (xy)z$ for every $y$, $z$ in $Q$. The \index{nucleus!middle}\emph{middle nucleus} ${\rm Nuc}_{\mu}(Q)$ and the \index{nucleus!right}\emph{right nucleus} ${\rm Nuc}_{\rho}(Q)$ are defined analogously. The \index{nucleus}\emph{nucleus} ${\rm Nuc}(Q)$ is the intersection of the left, middle and right nuclei. 

The \index{commutant}\emph{commutant} $C(Q)$ of $Q$ consists of all elements $x$ of $Q$ that commute with all elements of $Q$. The \index{center}\emph{center} $Z(Q)$ of $Q$ is the intersection of ${\rm Nuc}(Q)$ with $C(Q)$. 

A subloop $S$ of $Q$ is \index{subloop!normal}\emph{normal} in $Q$ if $f(S)=S$ for every inner mapping $f$ of $Q$. }

  
\section{\textcolor{Chapter }{Nilpotence and Solvability}}\label{Sec:NilpotenceAndSolvability}
\logpage{[ 2, 4, 0 ]}
\hyperdef{L}{X869CBCE381E2C422}{}
{
  For a loop $Q$ define $Z_0(Q) = 1$ and let $Z_{i+1}(Q)$ be the preimage of the center of $Q/Z_i(Q)$ in $Q$. A loop $Q$ is \index{nilpotence class}\index{nilpotent loop}\index{loop!nilpotent}\emph{nilpotent of class} $n$ if $n$ is the least nonnegative integer such that $Z_n(Q)=Q$. In such case $Z_0(Q)\le Z_1(Q)\le \dots \le Z_n(Q)$ is the \emph{upper central series}\index{central series!upper}. 

The \index{derived subloop}\emph{derived subloop} $Q'$ of $Q$ is the least normal subloop of $Q$ such that $Q/Q'$ is a commutative group. Define $Q^{(0)}=Q$ and let $Q^{(i+1)}$ be the derived subloop of $Q^{(i)}$. Then $Q$ is \index{solvability class}\index{solvable loop}\index{loop!solvable}\emph{solvable of class} $n$ if $n$ is the least nonnegative integer such that $Q^{(n)} = 1$. In such a case $Q^{(0)}\ge Q^{(1)}\ge \cdots \ge Q^{(n)}$ is the \emph{derived series}\index{derived series} of $Q$. }

  
\section{\textcolor{Chapter }{Associators and Commutators}}\label{Sec:AssociatorsAndCommutators}
\logpage{[ 2, 5, 0 ]}
\hyperdef{L}{X7E0849977869E53D}{}
{
  Let $Q$ be a quasigroup and let $x$, $y$, $z$ be elements of $Q$. Then the \index{commutator}\emph{commutator} of $x$, $y$ is the unique element $[x,y]$ of $Q$ such that $xy = [x,y](yx)$, and the \index{associator}\emph{associator} of $x$, $y$, $z$ is the unique element $[x,y,z]$ of $Q$ such that $(xy)z = [x,y,z](x(yz))$. 

The \index{associator subloop}\emph{associator subloop} $A(Q)$ of $Q$ is the least normal subloop of $Q$ such that $Q/A(Q)$ is a group. 

It is not hard to see that $A(Q)$ is the least normal subloop of $Q$ containing all commutators, and $Q'$ is the least normal subloop of $Q$ containing all commutators and associators. }

  
\section{\textcolor{Chapter }{Homomorphism and Homotopisms}}\label{Sec:HomomorphismsAndHomotopisms}
\logpage{[ 2, 6, 0 ]}
\hyperdef{L}{X791066ED7DD9F254}{}
{
  Let $K$, $H$ be two quasigroups. Then a map $f:K\to H$ is a \index{homomorphism}\emph{homomorphism} if $f(x)\cdot f(y)=f(x\cdot y)$ for every $x$, $y\in K$. If $f$ is also a bijection, we speak of an \index{isomorphism}\emph{isomorphism}, and the two quasigroups are called isomorphic. 

An ordered triple $(\alpha,\beta,\gamma)$ of maps $\alpha$, $\beta$, $\gamma:K\to H$ is a \index{homotopism}\emph{homotopism} if $\alpha(x)\cdot\beta(y) = \gamma(x\cdot y)$ for every $x$, $y$ in $K$. If the three maps are bijections, then $(\alpha,\beta,\gamma)$ is an \index{isotopism}\emph{isotopism}, and the two quasigroups are isotopic. 

Isotopic groups are necessarily isomorphic, but this is certainly not true for
nonassociative quasigroups or loops. In fact, every quasigroup is isotopic to
a loop. 

Let $(K,\cdot)$, $(K,\circ)$ be two quasigroups defined on the same set $K$. Then an isotopism $(\alpha,\beta,{\rm id}_K)$ is called a \index{isotopism!principal}\emph{principal isotopism}. An important class of principal isotopisms is obtained as follows: Let $(K,\cdot)$ be a quasigroup, and let $f$, $g$ be elements of $K$. Define a new operation $\circ$ on $K$ by $x\circ y = R_g^{-1}(x)\cdot L_f^{-1}(y)$, where $R_g$, $L_f$ are translations. Then $(K,\circ)$ is a quasigroup isotopic to $(K,\cdot)$, in fact a loop with neutral element $f\cdot g$. We call $(K,\circ)$ a \index{loop isotope!principal}\emph{principal loop isotope} of $(K,\cdot)$. }

 }

  
\chapter{\textcolor{Chapter }{How the Package Works}}\label{Chap:HowThePackageWorks}
\logpage{[ 3, 0, 0 ]}
\hyperdef{L}{X7A6DF65E826B8CFF}{}
{
  The package consists of three complementary components: 
\begin{itemize}
\item the core algorithms for quasigroup theoretical notions (see Chapters \ref{Chap:CreatingQuasigroupsAndLoops}, \ref{Chap:BasicMethodsAndAttributes}, \ref{Chap:MethodsBasedOnPermutationGroups} and \ref{Chap:TestingPropertiesOfQuasigroupsAndLoops}),
\item algorithms for specific varieties of loops, mostly for Moufang loops (see
Chapter \ref{Chap:SpecificMethods}),
\item the library of small loops (see Chapter \ref{Chap:LibrariesOfLoops}).
\end{itemize}
 Although we do not explain the algorithms in detail here, we describe the
general philosophy so that users can anticipate the capabilities and behavior
of \textsf{LOOPS}.  
\section{\textcolor{Chapter }{Representing Quasigroups}}\label{Sec:RepresentingQuasigroups}
\logpage{[ 3, 1, 0 ]}
\hyperdef{L}{X86F02BBD87FEA1C6}{}
{
  Since permutation representation in the usual sense is impossible for
nonassociative structures, and since the theory of nonassociative
presentations is not well understood, we resorted to multiplication tables to
represent quasigroups in \textsf{GAP}. (In order to save storage space, we sometimes use one multiplication table
to represent several quasigroups, for instance when a quasigroup is a
subquasigroup of another quasigroup. See Section \ref{Sec:AboutCayleyTables} for more details.) 

Consequently, the package is intended primarily for quasigroups and loops of
small order, say up to 1000. 

The \textsf{GAP} categories \index{IsQuasigroupElement}\texttt{IsQuasigroupElement}, \index{IsLoopElement}\texttt{IsLoopElement}, \index{IsQuasigroup}\texttt{IsQuasigroup} and \index{IsLoop}\texttt{IsLoop} are declared in \textsf{LOOPS} as follows: 
\begin{verbatim}  
  DeclareCategory( "IsQuasigroupElement", IsMultiplicativeElement );
  DeclareRepresentation( "IsQuasigroupElmRep",
      IsPositionalObjectRep and IsMultiplicativeElement, [1] );
  DeclareCategory( "IsLoopElement",
      IsQuasigroupElement and IsMultiplicativeElementWithInverse );
  DeclareRepresentation( "IsLoopElmRep",
      IsPositionalObjectRep and IsMultiplicativeElementWithInverse, [1] );
  ## latin (auxiliary category for GAP to tell apart IsMagma and IsQuasigroup)
  DeclareCategory( "IsLatin", IsObject );
  DeclareCategory( "IsQuasigroup", IsMagma and IsLatin );
  DeclareCategory( "IsLoop", IsQuasigroup and
      IsMultiplicativeElementWithInverseCollection);
\end{verbatim}
 }

  
\section{\textcolor{Chapter }{Conversions between magmas, quasigroups, loops and groups}}\label{Sec:ConversionsEtc}
\logpage{[ 3, 2, 0 ]}
\hyperdef{L}{X807D76EF81B9D061}{}
{
  Whether an object is considered a magma, quasigroup, loop or group is a matter
of declaration in \textsf{LOOPS}. Loops are automatically quasigroups, and both groups and quasigroups are
automatically magmas. All standard \textsf{GAP} commands for magmas are therefore available for quasigroups and loops. 

In \textsf{GAP}, functions of the type \texttt{AsSomething(\mbox{\texttt{\mdseries\slshape X}})} convert the domain \mbox{\texttt{\mdseries\slshape X}} into \texttt{Something}, if possible, without changing the underlying domain \mbox{\texttt{\mdseries\slshape X}}. For example, if \mbox{\texttt{\mdseries\slshape X}} is declared as magma but is associative and has neutral element and inverses, \texttt{AsGroup(\mbox{\texttt{\mdseries\slshape X}})} returns the corresponding group with the underlying domain \mbox{\texttt{\mdseries\slshape X}}. 

We have opted for a more general kind of conversions in \textsf{LOOPS} (starting with version 2.1.0), using functions of the type \texttt{IntoSomething(\mbox{\texttt{\mdseries\slshape X}})}. The two main features that distinguish \texttt{IntoSomething} from \texttt{AsSomething} are: 
\begin{itemize}
\item The function \texttt{IntoSomething(\mbox{\texttt{\mdseries\slshape X}})} does not necessarily return the same domain as \mbox{\texttt{\mdseries\slshape X}}. The reason is that \mbox{\texttt{\mdseries\slshape X}} can be a group, for instance, defined on one of many possible domains, while \texttt{IntoLoop(\mbox{\texttt{\mdseries\slshape X}})} must result in a loop, and hence be defined on a subset of some interval $1$, $\dots$, $n$ (see Section \ref{Sec:ParentOfAQuasigroup}).
\item In some special situations, the function \texttt{IntoSomething(\mbox{\texttt{\mdseries\slshape X}})} allows to convert \mbox{\texttt{\mdseries\slshape X}} into \texttt{Something} even though \mbox{\texttt{\mdseries\slshape X}} does not have all the properties of \texttt{Something}. For instance, every quasigroup is isotopic to a loop, so it makes sense to
allow the conversion \texttt{IntoLoop(\mbox{\texttt{\mdseries\slshape Q}})} even if the quasigroup \mbox{\texttt{\mdseries\slshape Q}} does not posses a neutral element.
\end{itemize}
 Details of all conversions in \textsf{LOOPS} can be found in Section \ref{Sec:Conversions}. }

  
\section{\textcolor{Chapter }{Calculating with Quasigroups}}\label{Sec:CalculationWithQuasigroups}
\logpage{[ 3, 3, 0 ]}
\hyperdef{L}{X87E49ED884FA6DC4}{}
{
  Although the quasigroups are ultimately represented by multiplication tables,
the algorithms are efficient because nearly all calculations are delegated to
groups. The connection between quasigroups and groups is facilitated via
translations (see Section \ref{Sec:Translations}), and we illustrate it with a few examples: \\


\textsc{Example:} This example shows how properties of quasigroups can be translated into
properties of translations in a straightforward way. Let $Q$ be a quasigroup. We ask if $Q$ is associative. We can either test if $(xy)z=x(yz)$ for every $x$, $y$, $z$ in $Q$, or we can ask if $L_{xy}=L_xL_y$ for every $x$, $y$ in $Q$. Note that since $L_{xy}$, $L_x$ and $L_y$ are elements of a permutation group, we do not have to refer directly to the
multiplication table once the left translations of $Q$ are known. \\


\textsc{Example:} This example shows how properties of loops can be translated into properties
of translations in a way that requires some theory. A \index{Bol loop!left}\index{loop!left Bol}\emph{left Bol loop} is a loop satisfying $x(y(xz)) = (x(yx))z$. We claim (without proof) that a loop $Q$ is left Bol if and only if $L_xL_yL_x$ is a left translation for every $x$, $y$ in $Q$. \\


\textsc{Example:} This example shows that many properties of loops become purely
group-theoretical once they are expressed in terms of translations. A loop is \index{simple loop}\index{loop!simple}\emph{simple} if it has no nontrivial congruences. It is possible to show that a loop is
simple if and only if its multiplication group is a primitive permutation
group. \\


The main idea of the package is therefore to: 
\begin{itemize}
\item calculate the translations and the associated permutation groups when they are
needed,
\item store them as attributes,
\item use them in algorithms as often as possible.
\end{itemize}
 }

  
\section{\textcolor{Chapter }{Naming, Viewing and Printing Quasigroups and their Elements}}\label{Sec:NamingEtc}
\logpage{[ 3, 4, 0 ]}
\hyperdef{L}{X7D75C7A6787AF72A}{}
{
  \textsf{GAP} displays information about objects in two modes: the \texttt{View} mode (default, short), and the \texttt{Print} mode (longer). Moreover, when the name of an object is set, the name is always
shown, no matter which display mode is used. 

Only loops contained in the libraries of \textsf{LOOPS} are named. For instance, the loop obtained via \texttt{MoufangLoop(32,4)}, the 4th Moufang loop of order 32, is named "Moufang loop 32/4'' and is shown
as \texttt{{\textless}Moufang loop 32/4{\textgreater}}. 

A generic quasigroup of order $n$ is displayed as \texttt{{\textless}quasigroup of order n{\textgreater}}. Similarly, a loop of order $n$ appears as \texttt{{\textless}loop of order n{\textgreater}}. 

The displayed information of a generic loop is enhanced if more information
about the loop becomes available. For instance, when it is established that a
loop of order 12 has the left alternative property, the loop will be shown as \texttt{{\textless}left alternative loop of order 12{\textgreater}} until a stronger property is obtained. Which property is diplayed is governed
by the filters built into \textsf{LOOPS} (see Appendix \ref{Apx:Filters}). 
\subsection{\textcolor{Chapter }{SetQuasigroupElmName and SetLoopElmName}}\logpage{[ 3, 4, 1 ]}
\hyperdef{L}{X7A7EB1B579273D07}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SetQuasigroupElmName({\mdseries\slshape Q, name})\index{SetQuasigroupElmName@\texttt{SetQuasigroupElmName}}
\label{SetQuasigroupElmName}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SetLoopElmName({\mdseries\slshape Q, name})\index{SetLoopElmName@\texttt{SetLoopElmName}}
\label{SetLoopElmName}
}\hfill{\scriptsize (function)}}\\


The above functions change the names of elements of a quasigroup (resp. loop) \mbox{\texttt{\mdseries\slshape Q}} to \mbox{\texttt{\mdseries\slshape name}}.

By default, elements of a quasigroup appear as \texttt{qi} and elements of a loop appear as \texttt{li} in both display modes, where \texttt{i} is a positive integer. The neutral element of a loop is always indexed by 1.\\
}

 

For quasigroups and loops in the \texttt{Print} mode, we display the multiplication table (if it is known), otherwise we
display the elements. \\


In the following example, \texttt{L} is a loop with two elements. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@L;
|
  <loop of order 2>
  !gapprompt@gap>| !gapinput@Print( L );
|
  <loop with multiplication table [ [ 1,  2 ], [  2,  1 ] ]>
  !gapprompt@gap>| !gapinput@Elements( L );
|
  [ l1, l2 ]
  !gapprompt@gap>| !gapinput@SetLoopElmName( L, "loop_element" );; Elements( L );
|
  [ loop_element1, loop_element2 ]
\end{Verbatim}
 }

 }

  
\chapter{\textcolor{Chapter }{Creating Quasigroups and Loops}}\label{Chap:CreatingQuasigroupsAndLoops}
\logpage{[ 4, 0, 0 ]}
\hyperdef{L}{X7AA4B9C0877550ED}{}
{
  In this chapter we describe several ways in which quasigroups and loops can be
created in \textsf{LOOPS}.  
\section{\textcolor{Chapter }{About Cayley Tables}}\label{Sec:AboutCayleyTables}
\logpage{[ 4, 1, 0 ]}
\hyperdef{L}{X7DE8405B82BC36A9}{}
{
  Let $X=\{x_1,\dots,x_n\}$ be a set and $\cdot$ a binary operation on $X$. Then an $n$ by $n$ array with rows and columns bordered by $x_1$, $\dots$, $x_n$, in this order, is a \index{Cayley table}\emph{Cayley table}, or a \index{multiplication table}\emph{multiplication table} of $\cdot$, if the entry in the row $x_i$ and column $x_j$ is $x_i\cdot x_j$. 

A Cayley table is a \index{quasigroup table}\emph{quasigroup table} if it is a \index{latin square}latin square, i.e., if every entry $x_i$ appears in every column and every row exactly once. 

An unfortunate feature of multiplication tables in practice is that they are
often not bordered, that is, it is up to the reader to figure out what is
meant. Throughout this manual and in \textsf{LOOPS}, we therefore make the following assumption: \emph{All distinct entries in a quasigroup table must be positive integers, say $x_1 < x_2 < \cdots < x_n$, and if no border is specified, we assume that the table is bordered by $x_1$, $\dots$, $x_n$, in this order.} Note that we do not assume that the distinct entries $x_1$, $\dots$, $x_n$ form the interval $1$, $\dots$, $n$. The significance of this observation will become clear in Chapter \ref{Chap:MethodsBasedOnPermutationGroups}. 

Finally, we say that a quasigroup table is a \index{loop table}\emph{loop table} if the first row and the first column are the same, and if the entries in the
first row are ordered in an ascending fashion. }

  
\section{\textcolor{Chapter }{Testing Cayley Tables}}\label{Sec:TestingCayleyTables}
\logpage{[ 4, 2, 0 ]}
\hyperdef{L}{X7827BF877AA87246}{}
{
  
\subsection{\textcolor{Chapter }{IsQuasigroupTable and IsQuasigroupCayleyTable}}\logpage{[ 4, 2, 1 ]}
\hyperdef{L}{X81179355869B9DFE}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsQuasigroupTable({\mdseries\slshape T})\index{IsQuasigroupTable@\texttt{IsQuasigroupTable}}
\label{IsQuasigroupTable}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsQuasigroupCayleyTable({\mdseries\slshape T})\index{IsQuasigroupCayleyTable@\texttt{IsQuasigroupCayleyTable}}
\label{IsQuasigroupCayleyTable}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape T}} is a quasigroup table as defined above, else \texttt{false}.

}

 
\subsection{\textcolor{Chapter }{IsLoopTable and IsLoopCayleyTable}}\logpage{[ 4, 2, 2 ]}
\hyperdef{L}{X7AAE48507A471069}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsLoopTable({\mdseries\slshape T})\index{IsLoopTable@\texttt{IsLoopTable}}
\label{IsLoopTable}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsLoopCayleyTable({\mdseries\slshape T})\index{IsLoopCayleyTable@\texttt{IsLoopCayleyTable}}
\label{IsLoopCayleyTable}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape T}} is a loop table as defined above, else \texttt{false}.\\


}

 

\textsc{Remark:}The package \textsf{GUAVA} also contains operations dealing with latin squares. In particular, \texttt{IsLatinSquare} is declared in \textsf{GUAVA}. }

  
\section{\textcolor{Chapter }{Canonical and Normalized Cayley Tables}}\label{Sec:CanonicalAndNormalizedCayleyTables}
\logpage{[ 4, 3, 0 ]}
\hyperdef{L}{X7BA749CA7DB4EA87}{}
{
  

\subsection{\textcolor{Chapter }{CanonicalCayleyTable}}
\logpage{[ 4, 3, 1 ]}\nobreak
\hyperdef{L}{X7971CCB87DAFF7B9}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CanonicalCayleyTable({\mdseries\slshape T})\index{CanonicalCayleyTable@\texttt{CanonicalCayleyTable}}
\label{CanonicalCayleyTable}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
Canonical Cayley table constructed from Cayley table \mbox{\texttt{\mdseries\slshape T}} by replacing entries $x_i$ with $i$.



A Cayley table is said to be \index{Cayley table!canonical}\emph{canonical} if it is based on elements $1$, $\dots$, $n$. Although we do not assume that every quasigroup table is canonical, it is
often desirable to present quasigroup tables in canonical way.}

 

\subsection{\textcolor{Chapter }{NormalizedQuasigroupTable}}
\logpage{[ 4, 3, 2 ]}\nobreak
\hyperdef{L}{X821A2F9E85FAD8BF}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NormalizedQuasigroupTable({\mdseries\slshape T})\index{NormalizedQuasigroupTable@\texttt{NormalizedQuasigroupTable}}
\label{NormalizedQuasigroupTable}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
A normalized version of the Cayley table \mbox{\texttt{\mdseries\slshape T}}.



A given Cayley table \mbox{\texttt{\mdseries\slshape T}} is normalized in three steps as follows: first, \texttt{CanonicalCayleyTable} is called to rename entries to $1$, $\dots$, $n$, then the columns of \mbox{\texttt{\mdseries\slshape T}} are permuted so that the first row reads $1$, $\dots$, $n$, and finally the rows of \mbox{\texttt{\mdseries\slshape T}} are permuted so that the first column reads $1$, $\dots$, $n$.}

 }

  
\section{\textcolor{Chapter }{Creating Quasigroups and Loops From Cayley Tables}}\label{Sec:CreatingQuasigroupsAndLoopsFromCayleyTables}
\logpage{[ 4, 4, 0 ]}
\hyperdef{L}{X7C2372BB8739C5A2}{}
{
  
\subsection{\textcolor{Chapter }{QuasigroupByCayleyTable and LoopByCayleyTable}}\logpage{[ 4, 4, 1 ]}
\hyperdef{L}{X860135BB85F2DB19}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{QuasigroupByCayleyTable({\mdseries\slshape T})\index{QuasigroupByCayleyTable@\texttt{QuasigroupByCayleyTable}}
\label{QuasigroupByCayleyTable}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LoopByCayleyTable({\mdseries\slshape T})\index{LoopByCayleyTable@\texttt{LoopByCayleyTable}}
\label{LoopByCayleyTable}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
The quasigroup (resp. loop) with quasigroup table (resp. loop table) \mbox{\texttt{\mdseries\slshape T}}.



Since \texttt{CanonicalCayleyTable} is called within the above operation, the resulting quasigroup will have
Cayley table with distinct entries $1$, $\dots$, $n$. }

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ct := CanonicalCayleyTable( [[5,3],[3,5]] );
|
  [ [ 2, 1 ], [ 1, 2 ] ]
  !gapprompt@gap>| !gapinput@NormalizedQuasigroupTable( ct );
|
  [ [ 1, 2 ], [ 2, 1 ] ]
  !gapprompt@gap>| !gapinput@LoopByCayleyTable( last );
|
  <loop of order 2>
  !gapprompt@gap>| !gapinput@[ IsQuasigroupTable( ct ), IsLoopTable( ct ) ];
|
  [ true, false ]
\end{Verbatim}
 }

  
\section{\textcolor{Chapter }{Creating Quasigroups and Loops from a File}}\label{Sec:CreatingQuasigroupsAndLoopsFromAFile}
\logpage{[ 4, 5, 0 ]}
\hyperdef{L}{X849944F17E2B37F8}{}
{
  Typing a large multiplication table manually is tedious and error-prone. We
have therefore included a general method in \textsf{LOOPS} that reads multiplication tables of quasigroups from a file. 

Instead of writing a separate algorithm for each common format, our algorithm
relies on the user to provide a bit of information about the input file. Here
is an outline of the algorithm, with file named \mbox{\texttt{\mdseries\slshape filename}} and a string \mbox{\texttt{\mdseries\slshape del}} as input (in essence, the characters of \mbox{\texttt{\mdseries\slshape del}} will be ignored while reading the file): 
\begin{itemize}
\item read the entire content of \mbox{\texttt{\mdseries\slshape filename}} into a string \mbox{\texttt{\mdseries\slshape s}},
\item replace all end-of-line characters in \mbox{\texttt{\mdseries\slshape s}} by spaces,
\item replace by spaces all characters of \mbox{\texttt{\mdseries\slshape s}} that appear in \mbox{\texttt{\mdseries\slshape del}},
\item split \mbox{\texttt{\mdseries\slshape s}} into maximal substrings without spaces, called \emph{chunks} here,
\item let $n$ be the number of distinct chunks,
\item if the number of chunks is not $n^2$, report error,
\item construct the multiplication table by assigning numerical values $1$, $\dots$, $n$ to chunks, depending on their position among distinct chunks.
\end{itemize}
 

The following examples clarify the algorithm and document its versatility. All
examples are of the form $F+D\Longrightarrow T$, meaning that an input file containing $F$ together with the deletion string $D$ produce multiplication table $T$. \\


\textsc{Example:} Data does not have to be arranged into an array of any kind. 
\[ \begin{array}{cccc} 0&1&2&1\\ 2&0&2& \\ 0&1& & \end{array}\quad + \quad ""
\quad \Longrightarrow\quad \begin{array}{ccc} 1&2&3\\ 2&3&1\\ 3&1&2
\end{array} \]
 

\textsc{Example:} Chunks can be any strings. 
\[ \begin{array}{cc} {\rm red}&{\rm green}\\ {\rm green}&{\rm red}\\
\end{array}\quad + \quad "" \quad \Longrightarrow\quad \begin{array}{cc} 1&
2\\ 2& 1 \end{array} \]
 

\textsc{Example:} A typical table produced by \textsf{GAP} is easily parsed by deleting brackets and commas. 
\[ [ [0, 1], [1, 0] ] \quad + \quad "[,]" \quad \Longrightarrow\quad
\begin{array}{cc} 1& 2\\ 2& 1 \end{array} \]
 

\textsc{Example:} A typical {\TeX} table with rows separated by lines is also easily converted. Note that we have
to use $\backslash\backslash$ to ensure that every occurrence of $\backslash$ is deleted, since $\backslash\backslash$ represents the character $\backslash$ in \textsf{GAP} 
\[ \begin{array}{lll} x\&& y\&&\ z\backslash\backslash\cr y\&& z\&&\
x\backslash\backslash\cr z\&& x\&&\ y \end{array} \quad + \quad
"\backslash\backslash\&" \quad \Longrightarrow\quad \begin{array}{ccc}
1&2&3\cr 2&3&1\cr 3&1&2 \end{array} \]
 
\subsection{\textcolor{Chapter }{QuasigroupFromFile and LoopFromFile}}\logpage{[ 4, 5, 1 ]}
\hyperdef{L}{X81A1DB918057933E}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{QuasigroupFromFile({\mdseries\slshape filename, del})\index{QuasigroupFromFile@\texttt{QuasigroupFromFile}}
\label{QuasigroupFromFile}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LoopFromFile({\mdseries\slshape filename, del})\index{LoopFromFile@\texttt{LoopFromFile}}
\label{LoopFromFile}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
The quasigroup (resp. loop) whose multiplication table data is in file \mbox{\texttt{\mdseries\slshape filename}}, ignoring the characters contained in the string \mbox{\texttt{\mdseries\slshape del}}.

}

 }

  
\section{\textcolor{Chapter }{Creating Quasigroups and Loops From Sections}}\label{Sec:CreatingQuasigroupsAndLoopsFromSections}
\logpage{[ 4, 6, 0 ]}
\hyperdef{L}{X820E67F88319C38B}{}
{
  

\subsection{\textcolor{Chapter }{CayleyTableByPerms}}
\logpage{[ 4, 6, 1 ]}\nobreak
\hyperdef{L}{X7F94C8DD7E1A3470}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CayleyTableByPerms({\mdseries\slshape P})\index{CayleyTableByPerms@\texttt{CayleyTableByPerms}}
\label{CayleyTableByPerms}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
If \mbox{\texttt{\mdseries\slshape P}} is a set of $n$ permutations of an $n$-element set $X$, returns Cayley table $C$ such that $C[i][j] = X[j]^{P[i]}$.





The cardinality of the underlying set is determined by the moved points of the
first permutation in \mbox{\texttt{\mdseries\slshape P}}, unless the first permutation is the identity permutation, in which case the
second permutation is used. 

In particular, if \mbox{\texttt{\mdseries\slshape P}} is the left section of a quasigroup \mbox{\texttt{\mdseries\slshape Q}}, \texttt{CayleyTableByPerms(\mbox{\texttt{\mdseries\slshape Q}})} returns the multiplication table of \mbox{\texttt{\mdseries\slshape Q}}. }

 
\subsection{\textcolor{Chapter }{QuasigroupByLeftSection and LoopByLeftSection}}\logpage{[ 4, 6, 2 ]}
\hyperdef{L}{X7EC1EB0D7B8382A1}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{QuasigroupByLeftSection({\mdseries\slshape P})\index{QuasigroupByLeftSection@\texttt{QuasigroupByLeftSection}}
\label{QuasigroupByLeftSection}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LoopByLeftSection({\mdseries\slshape P})\index{LoopByLeftSection@\texttt{LoopByLeftSection}}
\label{LoopByLeftSection}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
If \mbox{\texttt{\mdseries\slshape P}} is a set of permutations corresponding to the left translations of a
quasigroup (resp. loop), returns the corresponding quasigroup (resp. loop).



The order of permutations in \mbox{\texttt{\mdseries\slshape P}} is important in the quasigroup case, but it is disregarded in the loop case,
since then the order of rows in the corresponding multiplication table is
determined by the presence of the neutral element.}

 
\subsection{\textcolor{Chapter }{QuasigroupByRightSection and LoopByRightSection}}\logpage{[ 4, 6, 3 ]}
\hyperdef{L}{X80B436ED7CC0749E}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{QuasigroupByRightSection({\mdseries\slshape P})\index{QuasigroupByRightSection@\texttt{QuasigroupByRightSection}}
\label{QuasigroupByRightSection}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LoopByRightSection({\mdseries\slshape P})\index{LoopByRightSection@\texttt{LoopByRightSection}}
\label{LoopByRightSection}
}\hfill{\scriptsize (operation)}}\\


 These are the dual operations to \texttt{QuasigroupByLeftSection} and \texttt{LoopByLeftSection}.}

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@S := Subloop( MoufangLoop( 12, 1 ), [ 3 ] );;
|
  !gapprompt@gap>| !gapinput@ls := LeftSection( S );
|
  [ (), (1,3,5), (1,5,3) ]
  !gapprompt@gap>| !gapinput@CayleyTableByPerms( ls );
|
  [ [ 1, 3, 5 ], [ 3, 5, 1 ], [ 5, 1, 3 ] ]
  !gapprompt@gap>| !gapinput@CayleyTable( LoopByLeftSection( ls ) );
|
  [ [ 1, 2, 3 ], [ 2, 3, 1 ], [ 3, 1, 2 ] ]
\end{Verbatim}
 }

  
\section{\textcolor{Chapter }{Creating Quasigroups and Loops From Folders}}\label{Sec:CreatingQuasigroupsAndLoopsFromFolders}
\logpage{[ 4, 7, 0 ]}
\hyperdef{L}{X85ABE99E84E5B0E8}{}
{
  Let $G$ be a group, $H$ a subgroup of $G$, and $T$ a right transversal to $H$ in $G$. Let $\tau:G\to T$ be defined by $x\in H\tau(x)$. Then the operation $\circ$ defined on the right cosets $Q = \{Ht|t\in T\}$ by $Hs\circ Ht = H\tau(st)$ turns $Q$ into a quasigroup if and only if $T$ is a right transversal to all conjugates $g^{-1}Hg$ of $H$ in $G$. (In fact, every quasigroup $Q$ can be obtained in this way by letting $G={\rm Mlt}_\rho(Q)$, $H={\rm Inn}_\rho(Q)$ and $T=\{R_x|x\in Q\}$.) 

We call the triple $(G,H,T)$ a \index{folder!quasigroup}\emph{right quasigroup (or loop) folder}. 
\subsection{\textcolor{Chapter }{QuasigroupByRightFolder and LoopByRightFolder}}\logpage{[ 4, 7, 1 ]}
\hyperdef{L}{X83168E62861F70AB}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{QuasigroupByRightFolder({\mdseries\slshape G, H, T})\index{QuasigroupByRightFolder@\texttt{QuasigroupByRightFolder}}
\label{QuasigroupByRightFolder}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LoopByRightFolder({\mdseries\slshape G, H, T})\index{LoopByRightFolder@\texttt{LoopByRightFolder}}
\label{LoopByRightFolder}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
The quasigroup (resp. loop) from the right folder (\mbox{\texttt{\mdseries\slshape G}}, \mbox{\texttt{\mdseries\slshape H}}, \mbox{\texttt{\mdseries\slshape T}}).

}

 

\textsc{Remark:} We do not support the dual operations for left sections since, by default,
actions in \textsf{GAP} act on the right. \\


Here is a simple example in which $T$ is actually the right section of the resulting loop. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@T := [ (), (1,2)(3,4,5), (1,3,5)(2,4), (1,4,3)(2,5), (1,5,4)(2,3) ];;
|
  !gapprompt@gap>| !gapinput@G := Group( T );; H := Stabilizer( G, 1 );;
|
  !gapprompt@gap>| !gapinput@LoopByRightFolder( G, H, T );
|
  <loop of order 5>
\end{Verbatim}
 }

  
\section{\textcolor{Chapter }{Creating Quasigroups and Loops By Nuclear Extensions}}\label{Sec:CreatingQuasigroupsAndLoopsByNuclearExtensions}
\logpage{[ 4, 8, 0 ]}
\hyperdef{L}{X8759431780AC81A9}{}
{
  Let $K$, $F$ be loops. Then a loop $Q$ is an \index{extension}\emph{extension} of $K$ by $F$ if $K$ is a normal subloop of $Q$ such that $Q/K$ is isomorphic to $F$. An extension $Q$ of $K$ by $F$ is \index{extension!nuclear}\emph{nuclear} if $K$ is an abelian group and $K\le N(Q)$. 

A map $\theta:F\times F\to K$ is a \index{cocycle}\emph{cocycle} if $\theta(1,x) = \theta(x,1) = 1$ for every $x\in F$. 

The following theorem holds for loops $Q$, $F$ and an abelian group $K$: $Q$ is a nuclear extension of $K$ by $F$ if and only if there is a cocycle $\theta:F\times F\to K$ and a homomorphism $\varphi:F\to{\rm Aut}(Q)$ such that $K\times F$ with multiplication $(a,x)(b,y) = (a\varphi_x(b)\theta(x,y),xy)$ is isomorphic to $Q$. 

\subsection{\textcolor{Chapter }{NuclearExtension}}
\logpage{[ 4, 8, 1 ]}\nobreak
\hyperdef{L}{X784733C67AA6B2FA}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NuclearExtension({\mdseries\slshape Q, K})\index{NuclearExtension@\texttt{NuclearExtension}}
\label{NuclearExtension}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
 The data necessary to construct \mbox{\texttt{\mdseries\slshape Q}} as a nuclear extension of the subloop \mbox{\texttt{\mdseries\slshape K}} by \mbox{\texttt{\mdseries\slshape Q}}$/$\mbox{\texttt{\mdseries\slshape K}}, namely $[K, F, \varphi, \theta]$ as above. Note that \mbox{\texttt{\mdseries\slshape K}} must be a commutative subloop of the nucleus of \mbox{\texttt{\mdseries\slshape Q}}.



If $n=|F|$ and $m=|$\mbox{\texttt{\mdseries\slshape K}}$|$, the cocycle $\theta$ is returned as an $n\times n$ array with entries in $\{1,\dots,m\}$, and the homomorphism $\varphi$ is returned as a list of length $n$ of permutations of $\{1,\dots,m\}$.}

 

\subsection{\textcolor{Chapter }{LoopByExtension}}
\logpage{[ 4, 8, 2 ]}\nobreak
\hyperdef{L}{X79AEE93E7E15B802}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LoopByExtension({\mdseries\slshape K, F, f, t})\index{LoopByExtension@\texttt{LoopByExtension}}
\label{LoopByExtension}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
The extension of an abelian group \mbox{\texttt{\mdseries\slshape K}} by a loop \mbox{\texttt{\mdseries\slshape F}}, using action \mbox{\texttt{\mdseries\slshape f}} and cocycle \mbox{\texttt{\mdseries\slshape t}}. The arguments must be formatted as the output of \texttt{NuclearExtension}.

}

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@F := IntoLoop( Group( (1,2) ) );
|
  <loop of order 2>
  !gapprompt@gap>| !gapinput@K := DirectProduct( F, F );;
|
  !gapprompt@gap>| !gapinput@phi := [ (), (2,3) ];;
|
  !gapprompt@gap>| !gapinput@theta := [ [ 1, 1 ], [ 1, 3 ] ];;
|
  !gapprompt@gap>| !gapinput@LoopByExtension( K, F, phi, theta );
|
  <loop of order 8>
  !gapprompt@gap>| !gapinput@IsAssociative( last );
|
  false
\end{Verbatim}
 }

  
\section{\textcolor{Chapter }{Random Quasigroups and Loops}}\label{Sec:RandomQuasigroupsAndLoops}
\logpage{[ 4, 9, 0 ]}
\hyperdef{L}{X7AE29A1A7AA5C25A}{}
{
  An algorithm is said to select a latin square of order $n$ \emph{at random}\index{latin square!random} if every latin square of order $n$ is returned by the algorithm with the same probability. Selecting a latin
square at random is a nontrivial problem. 

In \cite{JaMa}, Jacobson and Matthews defined a random walk on the space of latin squares
and so-called improper latin squares that visits every latin square with the
same probability. The diameter of the space is no more than $4(n-1)^3$ in the sense that no more than $4(n-1)^3$ properly chosen steps are needed to travel from one latin square of order $n$ to another. 

The Jacobson-Matthews algorithm can be used to generate random quasigroups as
follows: (i) select any latin square of order $n$, for instance the canonical multiplication table of the cyclic group of order $n$, (ii) perform sufficiently many steps of the random walk, stopping at a
proper or improper latin square, (iii) if necessary, perform a few more steps
to end up with a proper latin square. Upon normalizing the resulting latin
square, we obtain a random loop of order $n$. 

By the above result, it suffices to use about $n^3$ steps to arrive at any latin square of order $n$ from the initial latin square. In fact, a smaller number of steps is probably
sufficient. 
\subsection{\textcolor{Chapter }{RandomQuasigroup and RandomLoop}}\logpage{[ 4, 9, 1 ]}
\hyperdef{L}{X8271C0F5786B6FA9}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RandomQuasigroup({\mdseries\slshape n[, iter]})\index{RandomQuasigroup@\texttt{RandomQuasigroup}}
\label{RandomQuasigroup}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RandomLoop({\mdseries\slshape n[, iter]})\index{RandomLoop@\texttt{RandomLoop}}
\label{RandomLoop}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
A random quasigroup (resp. loop) of order \mbox{\texttt{\mdseries\slshape n}} using the Jacobson-Matthews algorithm. If the optional argument \mbox{\texttt{\mdseries\slshape iter}} is omitted, \mbox{\texttt{\mdseries\slshape n}}${}^3$ steps are used. Otherwise \mbox{\texttt{\mdseries\slshape iter}} steps are used.



If \mbox{\texttt{\mdseries\slshape iter}} is small, the Cayley table of the returned quasigroup (resp. loop) will be
close to the canonical Cayley table of the cyclic group of order \mbox{\texttt{\mdseries\slshape n}}.}

 

\subsection{\textcolor{Chapter }{RandomNilpotentLoop}}
\logpage{[ 4, 9, 2 ]}\nobreak
\hyperdef{L}{X817132C887D3FD3A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RandomNilpotentLoop({\mdseries\slshape lst})\index{RandomNilpotentLoop@\texttt{RandomNilpotentLoop}}
\label{RandomNilpotentLoop}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
A random nilpotent loop\index{loop!nilpotent} as follows (see Section \ref{Sec:NilpotencyAndCentralSeries} for more information on nilpotency): \mbox{\texttt{\mdseries\slshape lst}} must be a list of positive integers and/or finite abelian groups. If \texttt{\mbox{\texttt{\mdseries\slshape lst}}=[a1]} and \texttt{a1} is an integer, a random abelian group of order \texttt{a1} is returned, else \texttt{a1} is an abelian group and \texttt{AsLoop(a1)} is returned. If \texttt{\mbox{\texttt{\mdseries\slshape lst}}= [a1,...,am]}, a random central extension of \texttt{RandomNilpotentLoop([a1])} by \texttt{RandomNilpotentLoop([a2,...,am])} is returned.



To determine the nilpotency class $c$ of the resulting loop, assume that \mbox{\texttt{\mdseries\slshape lst}} has length at least 2, contains only integers bigger than 1, and let $m$ be the last entry of \mbox{\texttt{\mdseries\slshape lst}}. If $m>2$ then $c$ is equal to \texttt{Length(\mbox{\texttt{\mdseries\slshape lst}})}, else $c$ is equal to \texttt{Length(\mbox{\texttt{\mdseries\slshape lst}})-1}.}

 }

  
\section{\textcolor{Chapter }{Conversions}}\label{Sec:Conversions}
\logpage{[ 4, 10, 0 ]}
\hyperdef{L}{X7BC2D8877A943D74}{}
{
  \textsf{LOOPS} contains methods that convert between magmas, quasigroups, loops and groups,
provided such conversions are possible. Each of the conversion methods \texttt{IntoQuasigroup}, \texttt{IntoLoop} and \texttt{IntoGroup} returns \texttt{fail} if the requested conversion is not possible. \\


\textsc{Remark:} Up to version 2.0.0 of \textsf{LOOPS}, we supported \texttt{AsQuasigroup}, \texttt{AsLoop} and \texttt{AsGroup} in place of \texttt{IntoQuasigroup}, \texttt{IntoLoop} and \texttt{IntoGroup}, respectively. We have changed the terminology starting with version 2.1.0 in
order to comply with \textsf{GAP} naming rules for \texttt{AsSomething}, as explained in Chapter \ref{Chap:HowThePackageWorks}. Finally, the method \texttt{AsGroup} is a core method of \textsf{GAP} that returns an fp group if its argument is an associative loop. 

\subsection{\textcolor{Chapter }{IntoQuasigroup}}
\logpage{[ 4, 10, 1 ]}\nobreak
\hyperdef{L}{X84575A4B78CC545E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IntoQuasigroup({\mdseries\slshape M})\index{IntoQuasigroup@\texttt{IntoQuasigroup}}
\label{IntoQuasigroup}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
If \mbox{\texttt{\mdseries\slshape M}} is a declared magma that happens to be a quasigroup, the corresponding
quasigroup is returned. If \mbox{\texttt{\mdseries\slshape M}} is already declared as a quasigroup, \mbox{\texttt{\mdseries\slshape M}} is returned.

}

 

\subsection{\textcolor{Chapter }{PrincipalLoopIsotope}}
\logpage{[ 4, 10, 2 ]}\nobreak
\hyperdef{L}{X79CEA57C850C7070}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PrincipalLoopIsotope({\mdseries\slshape M, f, g})\index{PrincipalLoopIsotope@\texttt{PrincipalLoopIsotope}}
\label{PrincipalLoopIsotope}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
An isomorphic copy of the principal isotope $($\mbox{\texttt{\mdseries\slshape M}},$\circ)$ via the transposition $(1$,\mbox{\texttt{\mdseries\slshape f}}$\cdot$\mbox{\texttt{\mdseries\slshape g}}$)$. An isomorphic copy is returned rather than $($\mbox{\texttt{\mdseries\slshape M}},$\circ)$ because in \textsf{LOOPS} all loops have to have neutral element labeled as $1$.



Given a quasigroup $M$ and two of its elements $f$, $g$, the principal loop isotope $x\circ y = R_g^{-1}(x)\cdot L_f^{-1}(y)$ turns $(M,\circ)$ into a loop with neutral element $f\cdot g$ (see Section \ref{Sec:HomomorphismsAndHomotopisms}).}

 

\subsection{\textcolor{Chapter }{IntoLoop}}
\logpage{[ 4, 10, 3 ]}\nobreak
\hyperdef{L}{X7A59C36683118E5A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IntoLoop({\mdseries\slshape M})\index{IntoLoop@\texttt{IntoLoop}}
\label{IntoLoop}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
If \mbox{\texttt{\mdseries\slshape M}} is a declared magma that happens to be a quasigroup (but not necessarily a
loop!), a loop is returned as follows: If \mbox{\texttt{\mdseries\slshape M}} is already declared as a loop, \mbox{\texttt{\mdseries\slshape M}} is returned. Else, if \mbox{\texttt{\mdseries\slshape M}} possesses a neutral element $e$ and if $f$ is the first element of \mbox{\texttt{\mdseries\slshape M}}, then an isomorphic copy of \mbox{\texttt{\mdseries\slshape M}} via the transposition $(e,f)$ is returned. If \mbox{\texttt{\mdseries\slshape M}} does not posses a neutral element, \texttt{PrincipalLoopIsotope(\mbox{\texttt{\mdseries\slshape M}}, \mbox{\texttt{\mdseries\slshape M.1}}, \mbox{\texttt{\mdseries\slshape M.1}})} is returned.\\


}

 

\textsc{Remark:} One could obtain a loop from a declared magma \mbox{\texttt{\mdseries\slshape M}} in yet another way, by normalizing the Cayley table of \mbox{\texttt{\mdseries\slshape M}}. The three approaches can result in nonisomorphic loops in general. 

\subsection{\textcolor{Chapter }{IntoGroup}}
\logpage{[ 4, 10, 4 ]}\nobreak
\hyperdef{L}{X7B5C6C64831B866E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IntoGroup({\mdseries\slshape M})\index{IntoGroup@\texttt{IntoGroup}}
\label{IntoGroup}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
If \mbox{\texttt{\mdseries\slshape M}} is a declared magma that happens to be a group, the corresponding group is
returned as follows: If \mbox{\texttt{\mdseries\slshape M}} is already declared as a group, \mbox{\texttt{\mdseries\slshape M}} is returned, else \texttt{RightMultiplicationGroup(IntoLoop(\mbox{\texttt{\mdseries\slshape M}}))} is returned, which is a permutation group isomorphic to \mbox{\texttt{\mdseries\slshape M}}.

}

 }

  
\section{\textcolor{Chapter }{Products of Loops}}\label{Sec:ProductsOfLoops}
\logpage{[ 4, 11, 0 ]}
\hyperdef{L}{X8328348F855B1482}{}
{
  

\subsection{\textcolor{Chapter }{DirectProduct}}
\logpage{[ 4, 11, 1 ]}\nobreak
\hyperdef{L}{X861BA02C7902A4F4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DirectProduct({\mdseries\slshape L1, ..., Ln})\index{DirectProduct@\texttt{DirectProduct}}
\label{DirectProduct}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
If each \mbox{\texttt{\mdseries\slshape Li}} is either a declared loop or a declared group, the direct product of \mbox{\texttt{\mdseries\slshape L1}}, $\dots$, \mbox{\texttt{\mdseries\slshape Ln}} is returned. If every \mbox{\texttt{\mdseries\slshape Li}} is a declared group, a group is returned, otherwise a loop is returned.

}

 }

  
\section{\textcolor{Chapter }{Opposite Quasigroups and Loops}}\label{Sec:OppositeQuasigroupsAndLoops}
\logpage{[ 4, 12, 0 ]}
\hyperdef{L}{X7865FC8D7854C2E3}{}
{
  When $Q$ is a quasigroup with multiplication $\cdot$, the \index{opposite quasigroup}\index{quasigroup!opposite}\emph{opposite quasigroup} of $Q$ is a quasigroup with the same underlying set as $Q$ and with multiplication $*$ defined by $x*y=y\cdot x$. 
\subsection{\textcolor{Chapter }{Opposite, OppositeQuasigroup and OppositeLoop}}\logpage{[ 4, 12, 1 ]}
\hyperdef{L}{X87B6AED47EE2BCD3}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Opposite({\mdseries\slshape Q})\index{Opposite@\texttt{Opposite}}
\label{Opposite}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{OppositeQuasigroup({\mdseries\slshape Q})\index{OppositeQuasigroup@\texttt{OppositeQuasigroup}}
\label{OppositeQuasigroup}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{OppositeLoop({\mdseries\slshape Q})\index{OppositeLoop@\texttt{OppositeLoop}}
\label{OppositeLoop}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
 The opposite of the quasigroup (resp. loop) \mbox{\texttt{\mdseries\slshape Q}}. Note that if \texttt{OppositeQuasigroup(\mbox{\texttt{\mdseries\slshape Q}})} or \texttt{OppositeLoop(\mbox{\texttt{\mdseries\slshape Q}})} are called, then the returned quasigroup or loop is not stored as an attribute
of \mbox{\texttt{\mdseries\slshape Q}}.

}

 }

 }

  
\chapter{\textcolor{Chapter }{Basic Methods And Attributes}}\label{Chap:BasicMethodsAndAttributes}
\logpage{[ 5, 0, 0 ]}
\hyperdef{L}{X7B9F619279641FAA}{}
{
  In this chapter we describe the basic core methods and attributes of the \textsf{LOOPS} package.  
\section{\textcolor{Chapter }{Basic Attributes}}\label{Sec:BasicAttributes}
\logpage{[ 5, 1, 0 ]}
\hyperdef{L}{X8373A7348161DB23}{}
{
  We associate many attributes with quasigroups in order to speed up
computation. This section lists some basic attributes of quasigroups and
loops. 

\subsection{\textcolor{Chapter }{Elements}}
\logpage{[ 5, 1, 1 ]}\nobreak
\hyperdef{L}{X79B130FC7906FB4C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Elements({\mdseries\slshape Q})\index{Elements@\texttt{Elements}}
\label{Elements}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
The list of elements of a quasigroup \mbox{\texttt{\mdseries\slshape Q}}.



See Section \ref{Sec:NamingEtc} for more information about element labels.}

 

\subsection{\textcolor{Chapter }{CayleyTable}}
\logpage{[ 5, 1, 2 ]}\nobreak
\hyperdef{L}{X85457FA27DE7114D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CayleyTable({\mdseries\slshape Q})\index{CayleyTable@\texttt{CayleyTable}}
\label{CayleyTable}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
The Cayley table of a quasigroup \mbox{\texttt{\mdseries\slshape Q}}.



See Section \ref{Sec:AboutCayleyTables} for more information about quasigroup Cayley tables.}

 

\subsection{\textcolor{Chapter }{One}}
\logpage{[ 5, 1, 3 ]}\nobreak
\hyperdef{L}{X8129A6877FFD804B}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{One({\mdseries\slshape Q})\index{One@\texttt{One}}
\label{One}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
The identity element of a loop \mbox{\texttt{\mdseries\slshape Q}}.

}

 

\textsc{Remark:}If you want to know if a quasigroup \mbox{\texttt{\mdseries\slshape Q}} has a neutral element, you can find out with the standard function for magmas \texttt{MultiplicativeNeutralElement(\mbox{\texttt{\mdseries\slshape Q}})}. 

\subsection{\textcolor{Chapter }{Size}}
\logpage{[ 5, 1, 4 ]}\nobreak
\hyperdef{L}{X858ADA3B7A684421}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Size({\mdseries\slshape Q})\index{Size@\texttt{Size}}
\label{Size}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
The size of a quasigroup \mbox{\texttt{\mdseries\slshape Q}}.

}

 

\subsection{\textcolor{Chapter }{Exponent}}
\logpage{[ 5, 1, 5 ]}\nobreak
\hyperdef{L}{X7D44470C7DA59C1C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Exponent({\mdseries\slshape Q})\index{Exponent@\texttt{Exponent}}
\label{Exponent}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
The exponent of a power associative loop \mbox{\texttt{\mdseries\slshape Q}}. (The method does not test if \mbox{\texttt{\mdseries\slshape Q}} is power associative.)



When \mbox{\texttt{\mdseries\slshape Q}} is a \emph{power associative loop}\index{loop!power associative}\index{power associative loop}, that is, the powers of elements are well-defined in \mbox{\texttt{\mdseries\slshape Q}}, then the \emph{exponent}\index{exponent} of \mbox{\texttt{\mdseries\slshape Q}} is the smallest positive integer divisible by the orders of all elements of \mbox{\texttt{\mdseries\slshape Q}}. }

 }

  
\section{\textcolor{Chapter }{Basic Arithmetic Operations}}\label{Sec:BasicArithemticOperations}
\logpage{[ 5, 2, 0 ]}
\hyperdef{L}{X82F2CA4A848ABD2B}{}
{
  Each quasigroup element in \textsf{GAP} knows to which quasigroup it belongs. It is therefore possible to perform
arithmetic operations with quasigroup elements without referring to the
quasigroup. All elements involved in the calculation must belong to the same
quasigroup. 

Two elements $x$, $y$ of the same quasigroup are multiplied by $x*y$ in \textsf{GAP}. Since multiplication of at least three elements is ambiguous in the
nonassociative case, we parenthesize elements by default from left to right,
i.e., $x*y*z$ means $((x*y)*z)$. Of course, one can specify the order of multiplications by providing
parentheses. 
\subsection{\textcolor{Chapter }{LeftDivision and RightDivision}}\logpage{[ 5, 2, 1 ]}
\hyperdef{L}{X7D5956967BCC1834}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LeftDivision({\mdseries\slshape x, y})\index{LeftDivision@\texttt{LeftDivision}}
\label{LeftDivision}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RightDivision({\mdseries\slshape x, y})\index{RightDivision@\texttt{RightDivision}}
\label{RightDivision}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
The left division \mbox{\texttt{\mdseries\slshape x}}$\backslash$\mbox{\texttt{\mdseries\slshape y}} (resp. the right division \mbox{\texttt{\mdseries\slshape x}}$/$\mbox{\texttt{\mdseries\slshape y}}) of two elements \mbox{\texttt{\mdseries\slshape x}}, \mbox{\texttt{\mdseries\slshape y}} of the same quasigroup.\\


\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LeftDivision({\mdseries\slshape S, x})\index{LeftDivision@\texttt{LeftDivision}}
\label{LeftDivision}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LeftDivision({\mdseries\slshape x, S})\index{LeftDivision@\texttt{LeftDivision}}
\label{LeftDivision}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RightDivision({\mdseries\slshape S, x})\index{RightDivision@\texttt{RightDivision}}
\label{RightDivision}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RightDivision({\mdseries\slshape x, S})\index{RightDivision@\texttt{RightDivision}}
\label{RightDivision}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
The list of elements obtained by performing the specified arithmetical
operation elementwise using a list \mbox{\texttt{\mdseries\slshape S}} of elements and an element \mbox{\texttt{\mdseries\slshape x}}.\\


}

 

\textsc{Remark:} We support $/$ in place of \texttt{RightDivision}. But we do not support $\backslash$ in place of \texttt{LeftDivision}. 
\subsection{\textcolor{Chapter }{LeftDivisionCayleyTable and RightDivisionCayleyTable}}\logpage{[ 5, 2, 2 ]}
\hyperdef{L}{X804F67C8796A0EB3}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LeftDivisionCayleyTable({\mdseries\slshape Q})\index{LeftDivisionCayleyTable@\texttt{LeftDivisionCayleyTable}}
\label{LeftDivisionCayleyTable}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RightDivisionCayleyTable({\mdseries\slshape Q})\index{RightDivisionCayleyTable@\texttt{RightDivisionCayleyTable}}
\label{RightDivisionCayleyTable}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
The Cayley table of the respective arithmetic operation of a quasigroup \mbox{\texttt{\mdseries\slshape Q}}.

}

 }

  
\section{\textcolor{Chapter }{Powers and Inverses}}\label{Sec:PowersAndInverses}
\logpage{[ 5, 3, 0 ]}
\hyperdef{L}{X810850247ADB4EE9}{}
{
  Powers of elements are generally not well-defined in quasigroups. For magmas
and a positive integral exponent, \textsf{GAP} calculates powers in the following way: $x^1=x$, $x^{2k}=(x^k)\cdot(x^k)$ and $x^{2k+1}=(x^{2k})\cdot x$. One can easily see that this returns $x^k$ in about $\log_2(k)$ steps. For \textsf{LOOPS}, we have decided to keep this method, but the user should be aware that the
method is sound only in power associative quasigroups. 

Let $x$ be an element of a loop $Q$ with neutral element $1$. Then the \emph{left inverse}\index{inverse!left} $x^\lambda$ of $x$ is the unique element of $Q$ satisfying $x^\lambda x=1$. Similarly, the \emph{right inverse}\index{inverse!right} $x^\rho$ satisfies $xx^\rho=1$. If $x^\lambda=x^\rho$, we call $x^{-1}=x^\lambda=x^\rho$ the \emph{inverse}\index{inverse} of $x$. 
\subsection{\textcolor{Chapter }{LeftInverse, RightInverse and Inverse}}\logpage{[ 5, 3, 1 ]}
\hyperdef{L}{X805781838020CF44}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LeftInverse({\mdseries\slshape x})\index{LeftInverse@\texttt{LeftInverse}}
\label{LeftInverse}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RightInverse({\mdseries\slshape x})\index{RightInverse@\texttt{RightInverse}}
\label{RightInverse}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Inverse({\mdseries\slshape x})\index{Inverse@\texttt{Inverse}}
\label{Inverse}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
The left inverse, right inverse and inverse, respectively, of the quasigroup
element \mbox{\texttt{\mdseries\slshape x}}.

}

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@CayleyTable( Q );
|
  [ [ 1, 2, 3, 4, 5 ],
    [ 2, 1, 4, 5, 3 ],
    [ 3, 4, 5, 1, 2 ],
    [ 4, 5, 2, 3, 1 ],
    [ 5, 3, 1, 2, 4 ] ]
  !gapprompt@gap>| !gapinput@elms := Elements( Q );
|
  !gapprompt@gap>| !gapinput@[ l1, l2, l3, l4, l5 ];
|
  !gapprompt@gap>| !gapinput@[ LeftInverse( elms[3] ), RightInverse( elms[3] ), Inverse( elms[3] ) ];
|
  [ l5, l4, fail ]
\end{Verbatim}
 }

  
\section{\textcolor{Chapter }{Associators and Commutators}}\label{Sec:AssociatorsAndCommutators2}
\logpage{[ 5, 4, 0 ]}
\hyperdef{L}{X7E0849977869E53D}{}
{
  See Section \ref{Sec:AssociatorsAndCommutators} for definitions of associators and commutators. 

\subsection{\textcolor{Chapter }{Associator}}
\logpage{[ 5, 4, 1 ]}\nobreak
\hyperdef{L}{X82B7448879B91F7B}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Associator({\mdseries\slshape x, y, z})\index{Associator@\texttt{Associator}}
\label{Associator}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
The associator of the elements \mbox{\texttt{\mdseries\slshape x}}, \mbox{\texttt{\mdseries\slshape y}}, \mbox{\texttt{\mdseries\slshape z}} of the same quasigroup.

}

 

\subsection{\textcolor{Chapter }{Commutator}}
\logpage{[ 5, 4, 2 ]}\nobreak
\hyperdef{L}{X7D624A9587FB1FE5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Commutator({\mdseries\slshape x, y})\index{Commutator@\texttt{Commutator}}
\label{Commutator}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
The commutator of the elements \mbox{\texttt{\mdseries\slshape x}}, \mbox{\texttt{\mdseries\slshape y}} of the same quasigroup.

}

 }

  
\section{\textcolor{Chapter }{Generators}}\label{Sec:Generators}
\logpage{[ 5, 5, 0 ]}
\hyperdef{L}{X7BD5B55C802805B4}{}
{
  
\subsection{\textcolor{Chapter }{GeneratorsOfQuasigroup and GeneratorsOfLoop}}\logpage{[ 5, 5, 1 ]}
\hyperdef{L}{X83944A777D161D10}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{GeneratorsOfQuasigroup({\mdseries\slshape Q})\index{GeneratorsOfQuasigroup@\texttt{GeneratorsOfQuasigroup}}
\label{GeneratorsOfQuasigroup}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{GeneratorsOfLoop({\mdseries\slshape Q})\index{GeneratorsOfLoop@\texttt{GeneratorsOfLoop}}
\label{GeneratorsOfLoop}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
A set of generators of a quasigroup (resp. loop) \mbox{\texttt{\mdseries\slshape Q}}. (Both methods are synonyms of \texttt{GeneratorsOfMagma}.)

}

 

As usual in \textsf{GAP}, one can refer to the \texttt{i}th generator of a quasigroup \texttt{Q} by \texttt{Q.i}. Note that while it is often the case that \texttt{ Q.i = Elements(Q)[i]}, it is not necessarily so. 

\subsection{\textcolor{Chapter }{GeneratorsSmallest}}
\logpage{[ 5, 5, 2 ]}\nobreak
\hyperdef{L}{X82FD78AF7F80A0E2}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{GeneratorsSmallest({\mdseries\slshape Q})\index{GeneratorsSmallest@\texttt{GeneratorsSmallest}}
\label{GeneratorsSmallest}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
A generating set $\{q_0$, $\dots$, $q_m\}$ of \mbox{\texttt{\mdseries\slshape Q}} such that $Q_0=\emptyset$, $Q_m=$\mbox{\texttt{\mdseries\slshape Q}}, $Q_i=\langle q_1$, $\dots$, $q_i \rangle$, and $q_{i+1}$ is the least element of \mbox{\texttt{\mdseries\slshape Q}}$\setminus Q_i$.

}

 }

 }

  
\chapter{\textcolor{Chapter }{Methods Based on Permutation Groups}}\label{Chap:MethodsBasedOnPermutationGroups}
\logpage{[ 6, 0, 0 ]}
\hyperdef{L}{X794A04C5854D352B}{}
{
  Most calculations in the \textsf{LOOPS} package are delegated to groups, taking advantage of the various permutations
and permutation groups associated with quasigroups. This chapter explains in
detail how the permutations associated with a quasigroup are calculated, and
it also describes some of the core methods of \textsf{LOOPS} based on permutations. Additional core methods can be found in Chapter \ref{Chap:TestingPropertiesOfQuasigroupsAndLoops}.  
\section{\textcolor{Chapter }{Parent of a Quasigroup}}\label{Sec:ParentOfAQuasigroup}
\logpage{[ 6, 1, 0 ]}
\hyperdef{L}{X8731D818827C08F3}{}
{
  Let $Q$ be a quasigroup and $S$ a subquasigroup of $Q$. Since the multiplication in $S$ coincides with the multiplication in $Q$, it is reasonable not to store the multiplication table of $S$. However, the quasigroup $S$ then must know that it is a subquasigroup of $Q$. 

\subsection{\textcolor{Chapter }{Parent}}
\logpage{[ 6, 1, 1 ]}\nobreak
\hyperdef{L}{X7BC856CC7F116BB0}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Parent({\mdseries\slshape Q})\index{Parent@\texttt{Parent}}
\label{Parent}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
The parent quasigroup of the quasigroup \mbox{\texttt{\mdseries\slshape Q}}.



When \mbox{\texttt{\mdseries\slshape Q}} is not created as a subquasigroup of another quasigroup, the attribute \texttt{Parent(\mbox{\texttt{\mdseries\slshape Q}})} is set to \mbox{\texttt{\mdseries\slshape Q}}. When \mbox{\texttt{\mdseries\slshape Q}} is created as a subquasigroup of a quasigroup \mbox{\texttt{\mdseries\slshape H}}, we set \texttt{Parent(\mbox{\texttt{\mdseries\slshape Q}})} equal to \texttt{Parent(\mbox{\texttt{\mdseries\slshape H}})}. Thus, in effect, \texttt{Parent(\mbox{\texttt{\mdseries\slshape Q}})} is the largest quasigroup from which \mbox{\texttt{\mdseries\slshape Q}} has been created.}

 

\subsection{\textcolor{Chapter }{Position}}
\logpage{[ 6, 1, 2 ]}\nobreak
\hyperdef{L}{X79975EC6783B4293}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Position({\mdseries\slshape Q, x})\index{Position@\texttt{Position}}
\label{Position}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
The position of \mbox{\texttt{\mdseries\slshape x}} among the elements of \mbox{\texttt{\mdseries\slshape Q}}.\\


}

 

Let \mbox{\texttt{\mdseries\slshape Q}} be a quasigroup with parent \mbox{\texttt{\mdseries\slshape P}}, where \mbox{\texttt{\mdseries\slshape P}} is some $n$-element quasigroup. Let \mbox{\texttt{\mdseries\slshape x}} be an element of \mbox{\texttt{\mdseries\slshape Q}}. Then \texttt{\mbox{\texttt{\mdseries\slshape x}}![1]} is the position of \mbox{\texttt{\mdseries\slshape x}} among the elements of \mbox{\texttt{\mdseries\slshape P}}, i.e., \texttt{\mbox{\texttt{\mdseries\slshape x}}![1] = Position(Elements(\mbox{\texttt{\mdseries\slshape P}}),\mbox{\texttt{\mdseries\slshape x}})}. 

While referring to elements of \mbox{\texttt{\mdseries\slshape Q}} by their positions, the user should understand whether the positions are meant
among the elements of \mbox{\texttt{\mdseries\slshape Q}}, or among the elements of the parent \mbox{\texttt{\mdseries\slshape P}} of \mbox{\texttt{\mdseries\slshape Q}}. Since it requires no calculation to obtain \texttt{\mbox{\texttt{\mdseries\slshape x}}![1]}, we always use the position of an element in its parent quasigroup in \textsf{LOOPS}. In this way, many attributes of a quasigroup, including its Cayley table,
are permanently tied to its parent. 

It is now clear why we have not insisted that Cayley tables of quasigroups
must have entries covering the entire interval $1$, $\dots$, $n$ for some $n$. 

\subsection{\textcolor{Chapter }{PosInParent}}
\logpage{[ 6, 1, 3 ]}\nobreak
\hyperdef{L}{X832295DE866E44EE}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PosInParent({\mdseries\slshape S})\index{PosInParent@\texttt{PosInParent}}
\label{PosInParent}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
When \mbox{\texttt{\mdseries\slshape S}} is a list of quasigroup elements (not necessarily from the same quasigroup),
returns the corresponding list of positions of elements of \mbox{\texttt{\mdseries\slshape S}} in the corresponding parent, i.e., \texttt{PosInParent(\mbox{\texttt{\mdseries\slshape S}})[i] = \mbox{\texttt{\mdseries\slshape S}}[i]![1] = Position(Parent(\mbox{\texttt{\mdseries\slshape S}}[i]),\mbox{\texttt{\mdseries\slshape S}}[i])}.\\


}

 

Quasigroups with the same parent can be compared as follows. Assume that $A$, $B$ are two quasigroups with common parent $Q$. Let $G_A$, $G_B$ be the canonical generating sets of $A$ and $B$, respectively, obtained by the method \texttt{GeneratorsSmallest} (see Section \ref{Sec:Generators}). Then we define $A<B$ if and only if $G_A<G_B$ lexicographically. }

  
\section{\textcolor{Chapter }{Subquasigroups and Subloops}}\label{Sec:SubquasigroupsAndSubloops2}
\logpage{[ 6, 2, 0 ]}
\hyperdef{L}{X83EDF04F7952143F}{}
{
  

\subsection{\textcolor{Chapter }{Subquasigroup}}
\logpage{[ 6, 2, 1 ]}\nobreak
\hyperdef{L}{X7DD511FF864FCDFF}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Subquasigroup({\mdseries\slshape Q, S})\index{Subquasigroup@\texttt{Subquasigroup}}
\label{Subquasigroup}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
When \mbox{\texttt{\mdseries\slshape S}} is a subset (of elements or indices) of a quasigroup \mbox{\texttt{\mdseries\slshape Q}}, returns the smallest subquasigroup (resp. subloop) of \mbox{\texttt{\mdseries\slshape Q}} containing \mbox{\texttt{\mdseries\slshape S}}.



We allow \mbox{\texttt{\mdseries\slshape S}} to be a list of elements of \mbox{\texttt{\mdseries\slshape Q}}, or a list of integers representing the positions of the respective elements
in the parent quasigroup (resp. loop) of \mbox{\texttt{\mdseries\slshape Q}}. 

If \mbox{\texttt{\mdseries\slshape S}} is empty, \texttt{Subloop(\mbox{\texttt{\mdseries\slshape Q}},\mbox{\texttt{\mdseries\slshape S}})} returns the one-element subloop of \mbox{\texttt{\mdseries\slshape Q}}, while \texttt{Subquasigroup(\mbox{\texttt{\mdseries\slshape Q}},\mbox{\texttt{\mdseries\slshape S}})} returns the empty set. 

\textsc{Remark:} The empty set is sometimes considered to be a subquasigroup of \mbox{\texttt{\mdseries\slshape Q}} (although not in \textsf{LOOPS}). The above convention is useful for handling certain situations, for
instance when the user calls \texttt{Center(\mbox{\texttt{\mdseries\slshape Q}})} for a quasigroup \mbox{\texttt{\mdseries\slshape Q}} with empty center.}

 

\subsection{\textcolor{Chapter }{Subloop}}
\logpage{[ 6, 2, 2 ]}\nobreak
\hyperdef{L}{X84E6744E804AE830}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Subloop({\mdseries\slshape Q, S})\index{Subloop@\texttt{Subloop}}
\label{Subloop}
}\hfill{\scriptsize (operation)}}\\


This is a loop analog of \texttt{IsSubquasigroup(\mbox{\texttt{\mdseries\slshape Q}},\mbox{\texttt{\mdseries\slshape S}})}.}

 
\subsection{\textcolor{Chapter }{IsSubquasigroup and IsSubloop}}\logpage{[ 6, 2, 3 ]}
\hyperdef{L}{X87AC8B7E80CE9260}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsSubquasigroup({\mdseries\slshape Q, S})\index{IsSubquasigroup@\texttt{IsSubquasigroup}}
\label{IsSubquasigroup}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsSubloop({\mdseries\slshape Q, S})\index{IsSubloop@\texttt{IsSubloop}}
\label{IsSubloop}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape S}} is a subquasigroup (resp. subloop) of a quasigroup (resp. loop) \mbox{\texttt{\mdseries\slshape Q}}, \texttt{false} otherwise. In other words, returns \texttt{true} if \mbox{\texttt{\mdseries\slshape S}} and \mbox{\texttt{\mdseries\slshape Q}} are quasigroups (resp. loops) with the same parent and \mbox{\texttt{\mdseries\slshape S}} is a subset of \mbox{\texttt{\mdseries\slshape Q}}.

}

 

\subsection{\textcolor{Chapter }{AllSubloops}}
\logpage{[ 6, 2, 4 ]}\nobreak
\hyperdef{L}{X81EF252585592001}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AllSubloops({\mdseries\slshape Q})\index{AllSubloops@\texttt{AllSubloops}}
\label{AllSubloops}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
A list of all subloops of a loop \mbox{\texttt{\mdseries\slshape Q}}.

}

 

\subsection{\textcolor{Chapter }{RightCosets}}
\logpage{[ 6, 2, 5 ]}\nobreak
\hyperdef{L}{X835F48248571364F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RightCosets({\mdseries\slshape Q, S})\index{RightCosets@\texttt{RightCosets}}
\label{RightCosets}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
If \mbox{\texttt{\mdseries\slshape S}} is a subloop of \mbox{\texttt{\mdseries\slshape Q}}, returns a list of all right cosets\index{coset} of \mbox{\texttt{\mdseries\slshape S}} in \mbox{\texttt{\mdseries\slshape Q}}.



The coset \mbox{\texttt{\mdseries\slshape S}} is listed first, and the elements of each coset are ordered in the same way as
the elements of \mbox{\texttt{\mdseries\slshape S}}, i.e., if \mbox{\texttt{\mdseries\slshape S}}$ = [s_1,\dots,s_m]$, then \mbox{\texttt{\mdseries\slshape S}}$x=[s_1x,\dots,s_mx]$.}

 

\subsection{\textcolor{Chapter }{RightTransversal}}
\logpage{[ 6, 2, 6 ]}\nobreak
\hyperdef{L}{X85C65D06822E716F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RightTransversal({\mdseries\slshape Q, S})\index{RightTransversal@\texttt{RightTransversal}}
\label{RightTransversal}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
A right transversal of a subloop \mbox{\texttt{\mdseries\slshape S}} in a loop \mbox{\texttt{\mdseries\slshape Q}}. The transversal consists of the list of first elements from the right cosets
obtained by \texttt{RightCosets(\mbox{\texttt{\mdseries\slshape Q}},\mbox{\texttt{\mdseries\slshape S}})}.



When \mbox{\texttt{\mdseries\slshape S}} is a subloop of \mbox{\texttt{\mdseries\slshape Q}}, the right transversal\index{transversal} of \mbox{\texttt{\mdseries\slshape S}} with respect to \mbox{\texttt{\mdseries\slshape Q}} is a subset of \mbox{\texttt{\mdseries\slshape Q}} containing one element from each right coset of \mbox{\texttt{\mdseries\slshape S}} in \mbox{\texttt{\mdseries\slshape Q}}.}

 }

  
\section{\textcolor{Chapter }{Translations and Sections}}\label{Sec:TranslationsAndSections}
\logpage{[ 6, 3, 0 ]}
\hyperdef{L}{X78AA3D177CCA49FF}{}
{
  When $x$ is an element of a quasigroup $Q$, the left translation $L_x$ is a permutation of $Q$. In \textsf{LOOPS}, all permutations associated with quasigroups and their elements are
permutations in the sense of \textsf{GAP}, i.e., they are bijections of some interval $1$, $\dots$, $n$. Moreover, following our convention, the numerical entries of the
permutations point to the positions among elements of the parent of $Q$, not among elements of $Q$. 
\subsection{\textcolor{Chapter }{LeftTranslation and RightTranslation}}\logpage{[ 6, 3, 1 ]}
\hyperdef{L}{X7B45B48C7C4D6061}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LeftTranslation({\mdseries\slshape Q, x})\index{LeftTranslation@\texttt{LeftTranslation}}
\label{LeftTranslation}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RightTranslation({\mdseries\slshape Q, x})\index{RightTranslation@\texttt{RightTranslation}}
\label{RightTranslation}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
If \mbox{\texttt{\mdseries\slshape x}} is an element of a quasigroup \mbox{\texttt{\mdseries\slshape Q}}, returns the left translation (resp. right translation) by \mbox{\texttt{\mdseries\slshape x}} in \mbox{\texttt{\mdseries\slshape Q}}.

}

 
\subsection{\textcolor{Chapter }{LeftSection and RightSection}}\logpage{[ 6, 3, 2 ]}
\hyperdef{L}{X7EB9197C80FB4664}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LeftSection({\mdseries\slshape Q})\index{LeftSection@\texttt{LeftSection}}
\label{LeftSection}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RightSection({\mdseries\slshape Q})\index{RightSection@\texttt{RightSection}}
\label{RightSection}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
The left section (resp. right section) of a quasigroup \mbox{\texttt{\mdseries\slshape Q}}.\\


}

 

Here is an example illustrating the main features of the subquasigroup
construction and the relationship between a quasigroup and its parent. 

Note how the Cayley table of a subquasigroup is created only upon explicit
demand. Also note that changing the names of elements of a subquasigroup
(subloop) automatically changes the names of the elements of the parent
subquasigroup (subloop). This is because the elements are shared. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@M := MoufangLoop( 12, 1 );; S := Subloop( M, [ M.5 ] );
|
  <loop of order 3>
  !gapprompt@gap>| !gapinput@[ Parent( S ) = M, Elements( S ), PosInParent( S ) ];
|
  [ true, [ l1, l3, l5], [ 1, 3, 5 ] ]
  !gapprompt@gap>| !gapinput@HasCayleyTable( S );
|
  false
  !gapprompt@gap>| !gapinput@SetLoopElmName( S, "s" );; Elements( S ); Elements( M );
|
  [ s1, s3, s5 ]
  [ s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12 ]
  !gapprompt@gap>| !gapinput@CayleyTable( S );
|
  [ [ 1, 3, 5 ], [ 3, 5, 1 ], [ 5, 1, 3 ] ]
  !gapprompt@gap>| !gapinput@LeftSection( S );
|
  [ (), (1,3,5), (1,5,3) ]
  !gapprompt@gap>| !gapinput@[ HasCayleyTable( S ), Parent( S ) = M ];
|
  [ true, true ]
  !gapprompt@gap>| !gapinput@L := LoopByCayleyTable( CayleyTable( S ) );; Elements( L );
|
  [ l1, l2, l3 ]
  !gapprompt@gap>| !gapinput@[ Parent( L ) = L, IsSubloop( M, S ), IsSubloop( M, L ) ];
|
  [ true, true, false ]
  !gapprompt@gap>| !gapinput@LeftSection( L );
|
  [ (), (1,2,3), (1,3,2) ]
\end{Verbatim}
 }

  
\section{\textcolor{Chapter }{Multiplication Groups}}\label{Sec:MultiplicationGroups}
\logpage{[ 6, 4, 0 ]}
\hyperdef{L}{X78ED50F578A88046}{}
{
  
\subsection{\textcolor{Chapter }{LeftMutliplicationGroup, RightMultiplicationGroup and MultiplicationGroup}}\logpage{[ 6, 4, 1 ]}
\hyperdef{L}{X87302BE983A5FC61}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LeftMultiplicationGroup({\mdseries\slshape Q})\index{LeftMultiplicationGroup@\texttt{LeftMultiplicationGroup}}
\label{LeftMultiplicationGroup}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RightMultiplicationGroup({\mdseries\slshape Q})\index{RightMultiplicationGroup@\texttt{RightMultiplicationGroup}}
\label{RightMultiplicationGroup}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{MultiplicationGroup({\mdseries\slshape Q})\index{MultiplicationGroup@\texttt{MultiplicationGroup}}
\label{MultiplicationGroup}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
The left multiplication group, right multiplication group, resp.
multiplication group of a quasigroup \mbox{\texttt{\mdseries\slshape Q}}.

}

 
\subsection{\textcolor{Chapter }{RelativeLeftMultiplicationGroup, RelativeRightMultiplicationGroup and
RelativeMultiplicationGroup}}\logpage{[ 6, 4, 2 ]}
\hyperdef{L}{X847256B779E1E7E5}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RelativeLeftMultiplicationGroup({\mdseries\slshape Q, S})\index{RelativeLeftMultiplicationGroup@\texttt{RelativeLeftMultiplicationGroup}}
\label{RelativeLeftMultiplicationGroup}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RelativeRightMultiplicationGroup({\mdseries\slshape Q, S})\index{RelativeRightMultiplicationGroup@\texttt{RelativeRightMultiplicationGroup}}
\label{RelativeRightMultiplicationGroup}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RelativeMultiplicationGroup({\mdseries\slshape Q, S})\index{RelativeMultiplicationGroup@\texttt{RelativeMultiplicationGroup}}
\label{RelativeMultiplicationGroup}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
The relative left multiplication group, the relative right multiplication
group, resp. the relative multiplication group of a quasigroup \mbox{\texttt{\mdseries\slshape Q}} with respect to a subquasigroup \mbox{\texttt{\mdseries\slshape S}} of \mbox{\texttt{\mdseries\slshape Q}}.



Let $S$ be a subquasigroup of a quasigroup $Q$. Then the \index{multiplication group!relative left}\emph{relative left multiplication group} of $Q$ with respect to $S$ is the group $\langle L(x)|x\in S\rangle$, where $L(x)$ is the left translation by $x$ in $Q$ restricted to $S$. The \index{multiplication group!relative right }\emph{relative right multiplication group} and the \index{multiplication group!relative}\emph{relative multiplication group} are defined analogously.}

 }

  
\section{\textcolor{Chapter }{Inner Mapping Groups}}\label{Sec:InnerMappingGroups}
\logpage{[ 6, 5, 0 ]}
\hyperdef{L}{X8740D61178ACD217}{}
{
  By a result of Bruck, the left inner mapping group of a loop is generated by
all \index{inner mapping!left}\emph{left inner mappings} $L(x,y) = L_{yx}^{-1}L_yL_x$, and the right inner mapping group is generated by all \index{inner mapping!right}\emph{right inner mappings} $R(x,y) = R_{xy}^{-1}R_yR_x$. 

In analogy with group theory, we define the \index{conjugation}\emph{conjugations} or the \index{inner mapping!middle}\emph{middle inner mappings} as $T(x) = L_x^{-1}R_x$. The \index{inner mapping group!middle}\emph{middle inner mapping grroup} is then the group generated by all conjugations. 
\subsection{\textcolor{Chapter }{LeftInnerMapping, RightInnerMapping, MiddleInnerMapping}}\logpage{[ 6, 5, 1 ]}
\hyperdef{L}{X7EE1E78C856C6F7C}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LeftInnerMapping({\mdseries\slshape Q, x, y})\index{LeftInnerMapping@\texttt{LeftInnerMapping}}
\label{LeftInnerMapping}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RightInnerMapping({\mdseries\slshape Q, x, y})\index{RightInnerMapping@\texttt{RightInnerMapping}}
\label{RightInnerMapping}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{MiddleInnerMapping({\mdseries\slshape Q, x})\index{MiddleInnerMapping@\texttt{MiddleInnerMapping}}
\label{MiddleInnerMapping}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
The left inner mapping $L($\mbox{\texttt{\mdseries\slshape x}},\mbox{\texttt{\mdseries\slshape y}}$)$, the right inner mapping $R($\mbox{\texttt{\mdseries\slshape x}},\mbox{\texttt{\mdseries\slshape y}}$)$, resp. the middle inner mapping $T($\mbox{\texttt{\mdseries\slshape x}}$)$ of a loop \mbox{\texttt{\mdseries\slshape Q}}.

}

 
\subsection{\textcolor{Chapter }{LeftInnerMappingGroup, RightInnerMappingGroup, MiddleInnerMappingGroup}}\logpage{[ 6, 5, 2 ]}
\hyperdef{L}{X79CDA09A7D48BF2B}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LeftInnerMappingGroup({\mdseries\slshape Q})\index{LeftInnerMappingGroup@\texttt{LeftInnerMappingGroup}}
\label{LeftInnerMappingGroup}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RightInnerMappingGroup({\mdseries\slshape Q})\index{RightInnerMappingGroup@\texttt{RightInnerMappingGroup}}
\label{RightInnerMappingGroup}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{MiddleInnerMappingGroup({\mdseries\slshape Q})\index{MiddleInnerMappingGroup@\texttt{MiddleInnerMappingGroup}}
\label{MiddleInnerMappingGroup}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
The left inner mapping group, right inner mapping group, resp. middle inner
mapping group of a loop \mbox{\texttt{\mdseries\slshape Q}}.

}

 

\subsection{\textcolor{Chapter }{InnerMappingGroup}}
\logpage{[ 6, 5, 3 ]}\nobreak
\hyperdef{L}{X82513A3B7C3A6420}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{InnerMappingGroup({\mdseries\slshape Q})\index{InnerMappingGroup@\texttt{InnerMappingGroup}}
\label{InnerMappingGroup}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
The inner mapping group of a loop \mbox{\texttt{\mdseries\slshape Q}}.\\


}

 

Here is an example for multiplication groups and inner mapping groups: 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@M := MoufangLoop(12,1);
|
  <Moufang loop 12/1>
  !gapprompt@gap>| !gapinput@LeftSection(M)[2];
|
  (1,2)(3,4)(5,6)(7,8)(9,12)(10,11)
  !gapprompt@gap>| !gapinput@Mlt := MultiplicationGroup(M); Inn := InnerMappingGroup(M);
|
  <permutation group of size 2592 with 23 generators>
  Group([ (4,6)(7,11), (7,11)(8,10), (2,6,4)(7,9,11), (3,5)(9,11), (8,12,10) ])
  !gapprompt@gap>| !gapinput@Size(Inn);
|
  216
\end{Verbatim}
 }

  
\section{\textcolor{Chapter }{Nuclei, Commutant, Center, and Associator Subloop}}\label{Sec:NucleiEtal}
\logpage{[ 6, 6, 0 ]}
\hyperdef{L}{X7B45C2AF7C2E28AB}{}
{
  See Section \ref{Sec:SubquasigroupsAndSubloops} for the relevant definitions. 
\subsection{\textcolor{Chapter }{LeftNucles, MiddleNucleus, and RightNucleus}}\logpage{[ 6, 6, 1 ]}
\hyperdef{L}{X7DF536FC85BBD1D2}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LeftNucleus({\mdseries\slshape Q})\index{LeftNucleus@\texttt{LeftNucleus}}
\label{LeftNucleus}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{MiddleNucleus({\mdseries\slshape Q})\index{MiddleNucleus@\texttt{MiddleNucleus}}
\label{MiddleNucleus}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RightNucleus({\mdseries\slshape Q})\index{RightNucleus@\texttt{RightNucleus}}
\label{RightNucleus}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
The left nucleus, middle nucleus, resp. right nucleus of a quasigroup \mbox{\texttt{\mdseries\slshape Q}}.

}

 
\subsection{\textcolor{Chapter }{Nuc, NucleusOfQuasigroup and NucleusOfLoop}}\logpage{[ 6, 6, 2 ]}
\hyperdef{L}{X84D389677A91C290}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Nuc({\mdseries\slshape Q})\index{Nuc@\texttt{Nuc}}
\label{Nuc}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NucleusOfQuasigroup({\mdseries\slshape Q})\index{NucleusOfQuasigroup@\texttt{NucleusOfQuasigroup}}
\label{NucleusOfQuasigroup}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NucleusOfLoop({\mdseries\slshape Q})\index{NucleusOfLoop@\texttt{NucleusOfLoop}}
\label{NucleusOfLoop}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
These synonymous attributes return the nucleus of a quasigroup \mbox{\texttt{\mdseries\slshape Q}}.



Since all nuclei are subquasigroups of \mbox{\texttt{\mdseries\slshape Q}}, they are returned as subquasigroups (resp. subloops). When \mbox{\texttt{\mdseries\slshape Q}} is a loop then all nuclei are in fact groups, and they are returned as
associative loops. 

\textsc{Remark:} The name \texttt{Nucleus} is a global function of \textsf{GAP} with two variables. We have therefore used \texttt{Nuc} rather than \texttt{Nucleus} for the nucleus. This abbreviation is sometimes used in the literature, too.}

 

\subsection{\textcolor{Chapter }{Commutant}}
\logpage{[ 6, 6, 3 ]}\nobreak
\hyperdef{L}{X7C8428DE791F3CE1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Commutant({\mdseries\slshape Q})\index{Commutant@\texttt{Commutant}}
\label{Commutant}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
The commutant of a quasigroup \mbox{\texttt{\mdseries\slshape Q}}.

}

 

\subsection{\textcolor{Chapter }{Center}}
\logpage{[ 6, 6, 4 ]}\nobreak
\hyperdef{L}{X7C1FBE7A84DD4873}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Center({\mdseries\slshape Q})\index{Center@\texttt{Center}}
\label{Center}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
The center of a quasigroup \mbox{\texttt{\mdseries\slshape Q}}.



If \mbox{\texttt{\mdseries\slshape Q}} is a loop, the center of \mbox{\texttt{\mdseries\slshape Q}} is a subgroup of \mbox{\texttt{\mdseries\slshape Q}} and it is returned as an associative loop.}

 

\subsection{\textcolor{Chapter }{AssociatorSubloop}}
\logpage{[ 6, 6, 5 ]}\nobreak
\hyperdef{L}{X7F7FDE82780EDD7E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AssociatorSubloop({\mdseries\slshape Q})\index{AssociatorSubloop@\texttt{AssociatorSubloop}}
\label{AssociatorSubloop}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
The associator subloop of a loop \mbox{\texttt{\mdseries\slshape Q}}.



We calculate the associator subloop of \mbox{\texttt{\mdseries\slshape Q}} as the smallest normal subloop of \mbox{\texttt{\mdseries\slshape Q}} containing all elements $x\backslash\alpha(x)$, where $x$ is an element of \mbox{\texttt{\mdseries\slshape Q}} and $\alpha$ is a left inner mapping of \mbox{\texttt{\mdseries\slshape Q}}.}

 }

  
\section{\textcolor{Chapter }{Normal Subloops and Simple Loops}}\label{Sec:NormalSubloopsAndSimpleLoops}
\logpage{[ 6, 7, 0 ]}
\hyperdef{L}{X85B650D284FE39F3}{}
{
  

\subsection{\textcolor{Chapter }{IsNormal}}
\logpage{[ 6, 7, 1 ]}\nobreak
\hyperdef{L}{X838186F9836F678C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsNormal({\mdseries\slshape Q, S})\index{IsNormal@\texttt{IsNormal}}
\label{IsNormal}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape S}} is a normal subloop of a loop \mbox{\texttt{\mdseries\slshape Q}}.



A subloop $S$ of a loop $Q$ is \emph{normal}\index{subloop!normal}\index{normal subloop} if it is invariant under all inner mappings of $Q$. }

 

\subsection{\textcolor{Chapter }{NormalClosure}}
\logpage{[ 6, 7, 2 ]}\nobreak
\hyperdef{L}{X7BDEA0A98720D1BB}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NormalClosure({\mdseries\slshape Q, S})\index{NormalClosure@\texttt{NormalClosure}}
\label{NormalClosure}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
The normal closure of a subset \mbox{\texttt{\mdseries\slshape S}} of a loop \mbox{\texttt{\mdseries\slshape Q}}.



For a subset $S$ of a loop $Q$, the \emph{normal closure}\index{normal closure} of $S$ in $Q$ is the smallest normal subloop of $Q$ containing $S$.}

 

\subsection{\textcolor{Chapter }{IsSimple}}
\logpage{[ 6, 7, 3 ]}\nobreak
\hyperdef{L}{X7D8E63A7824037CC}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsSimple({\mdseries\slshape Q})\index{IsSimple@\texttt{IsSimple}}
\label{IsSimple}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a simple loop.



A loop $Q$ is \emph{simple}\index{simple loop}\index{loop!simple} if $\{1\}$ and $Q$ are the only normal subloops of $Q$.}

 }

  
\section{\textcolor{Chapter }{Factor Loops}}\label{Sec:FactorLoops}
\logpage{[ 6, 8, 0 ]}
\hyperdef{L}{X87F66DB383C29A4A}{}
{
  

\subsection{\textcolor{Chapter }{FactorLoop}}
\logpage{[ 6, 8, 1 ]}\nobreak
\hyperdef{L}{X83E1953980E2DE2F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{FactorLoop({\mdseries\slshape Q, S})\index{FactorLoop@\texttt{FactorLoop}}
\label{FactorLoop}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
When \mbox{\texttt{\mdseries\slshape S}} is a normal subloop of a loop \mbox{\texttt{\mdseries\slshape Q}}, returns the factor loop \mbox{\texttt{\mdseries\slshape Q}}$/$\mbox{\texttt{\mdseries\slshape S}}.

}

 

\subsection{\textcolor{Chapter }{NaturalHomomorphismByNormalSubloop}}
\logpage{[ 6, 8, 2 ]}\nobreak
\hyperdef{L}{X870FCB497AECC730}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NaturalHomomorphismByNormalSubloop({\mdseries\slshape Q, S})\index{NaturalHomomorphismByNormalSubloop@\texttt{NaturalHomomorphismByNormalSubloop}}
\label{NaturalHomomorphismByNormalSubloop}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
When \mbox{\texttt{\mdseries\slshape S}} is a normal subloop of a loop \mbox{\texttt{\mdseries\slshape Q}}, returns the natural projection from \mbox{\texttt{\mdseries\slshape Q}} onto \mbox{\texttt{\mdseries\slshape Q}}$/$\mbox{\texttt{\mdseries\slshape S}}.

}

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@M := MoufangLoop( 12, 1 );; S := Subloop( M, [ M.3 ] );
|
  <loop of order 3>
  !gapprompt@gap>| !gapinput@IsNormal( M, S );
|
  true
  !gapprompt@gap>| !gapinput@F := FactorLoop( M, S );
|
  <loop of order 4>
  !gapprompt@gap>| !gapinput@NaturalHomomorphismByNormalSubloop( M, S );
|
  MappingByFunction( <loop of order 12>, <loop of order 4>,
      function( x ) ... end )
\end{Verbatim}
 }

  
\section{\textcolor{Chapter }{Nilpotency and Central Series}}\label{Sec:NilpotencyAndCentralSeries}
\logpage{[ 6, 9, 0 ]}
\hyperdef{L}{X821F40748401D698}{}
{
  See Section \ref{Sec:NilpotenceAndSolvability} for the relevant definitions. 

\subsection{\textcolor{Chapter }{IsNilpotent}}
\logpage{[ 6, 9, 1 ]}\nobreak
\hyperdef{L}{X78A4B93781C96AAE}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsNilpotent({\mdseries\slshape Q})\index{IsNilpotent@\texttt{IsNilpotent}}
\label{IsNilpotent}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a nilpotent loop.

}

 

\subsection{\textcolor{Chapter }{NilpotencyClassOfLoop}}
\logpage{[ 6, 9, 2 ]}\nobreak
\hyperdef{L}{X7D5FC62581A99482}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NilpotencyClassOfLoop({\mdseries\slshape Q})\index{NilpotencyClassOfLoop@\texttt{NilpotencyClassOfLoop}}
\label{NilpotencyClassOfLoop}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
The nilpotency class of a loop \mbox{\texttt{\mdseries\slshape Q}} if \mbox{\texttt{\mdseries\slshape Q}} is nilpotent, \texttt{fail} otherwise.

}

 

\subsection{\textcolor{Chapter }{IsStronglyNilpotent}}
\logpage{[ 6, 9, 3 ]}\nobreak
\hyperdef{L}{X7E7C2D117B55F6A0}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsStronglyNilpotent({\mdseries\slshape Q})\index{IsStronglyNilpotent@\texttt{IsStronglyNilpotent}}
\label{IsStronglyNilpotent}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a strongly nilpotent loop.



A loop $Q$ is said to be \emph{strongly nilpotent}\index{strongly nilpotent loop}\index{nilpotent loop!strongly}\index{loop!strongly nilpotent} if its multiplication group is nilpotent.}

 

\subsection{\textcolor{Chapter }{UpperCentralSeries}}
\logpage{[ 6, 9, 4 ]}\nobreak
\hyperdef{L}{X7ED37AA07BEE79E0}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{UpperCentralSeries({\mdseries\slshape Q})\index{UpperCentralSeries@\texttt{UpperCentralSeries}}
\label{UpperCentralSeries}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
When \mbox{\texttt{\mdseries\slshape Q}} is a nilpotent loop, returns the upper central series of \mbox{\texttt{\mdseries\slshape Q}}, else returns \texttt{fail}.

}

 

\subsection{\textcolor{Chapter }{LowerCentralSeries}}
\logpage{[ 6, 9, 5 ]}\nobreak
\hyperdef{L}{X817BDBC2812992ED}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LowerCentralSeries({\mdseries\slshape Q})\index{LowerCentralSeries@\texttt{LowerCentralSeries}}
\label{LowerCentralSeries}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
When \mbox{\texttt{\mdseries\slshape Q}} is a nilpotent loop, returns the lower central series of \mbox{\texttt{\mdseries\slshape Q}}, else returns \texttt{fail}.



The \emph{lower central series}\index{central series!lower} for loops is defined analogously to groups.}

 }

  
\section{\textcolor{Chapter }{Solvability, Derived Series and Frattini Subloop}}\label{Sec:SolvabilityEtc}
\logpage{[ 6, 10, 0 ]}
\hyperdef{L}{X83A38A6C7EDBCA63}{}
{
  See Section \ref{Sec:NilpotenceAndSolvability} for definitions of solvability an derived subloop. 

\subsection{\textcolor{Chapter }{IsSolvable}}
\logpage{[ 6, 10, 1 ]}\nobreak
\hyperdef{L}{X79B10B337A3B1C6E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsSolvable({\mdseries\slshape Q})\index{IsSolvable@\texttt{IsSolvable}}
\label{IsSolvable}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a solvable loop.

}

 

\subsection{\textcolor{Chapter }{DerivedSubloop}}
\logpage{[ 6, 10, 2 ]}\nobreak
\hyperdef{L}{X7A82DC4680DAD67C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DerivedSubloop({\mdseries\slshape Q})\index{DerivedSubloop@\texttt{DerivedSubloop}}
\label{DerivedSubloop}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
The derived subloop of a loop \mbox{\texttt{\mdseries\slshape Q}}.

}

 

\subsection{\textcolor{Chapter }{DerivedLength}}
\logpage{[ 6, 10, 3 ]}\nobreak
\hyperdef{L}{X7A9AA1577CEC891F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DerivedLength({\mdseries\slshape Q})\index{DerivedLength@\texttt{DerivedLength}}
\label{DerivedLength}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
If \mbox{\texttt{\mdseries\slshape Q}} is solvable, returns the derived length of \mbox{\texttt{\mdseries\slshape Q}}, else returns \texttt{fail}.

}

 
\subsection{\textcolor{Chapter }{FrattiniSubloop and FrattinifactorSize}}\logpage{[ 6, 10, 4 ]}
\hyperdef{L}{X85BD2C517FA7A47E}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{FrattiniSubloop({\mdseries\slshape Q})\index{FrattiniSubloop@\texttt{FrattiniSubloop}}
\label{FrattiniSubloop}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
The Frattini subloop of \mbox{\texttt{\mdseries\slshape Q}}. The method is implemented only for strongly nilpotent loops.



\emph{Frattini subloop}\index{Frattini subloop} of a loop $Q$ is the intersection of maximal subloops of $Q$.}

 

\subsection{\textcolor{Chapter }{FrattinifactorSize}}
\logpage{[ 6, 10, 5 ]}\nobreak
\hyperdef{L}{X855286367A2D5A54}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{FrattinifactorSize({\mdseries\slshape Q})\index{FrattinifactorSize@\texttt{FrattinifactorSize}}
\label{FrattinifactorSize}
}\hfill{\scriptsize (attribute)}}\\
}

 }

  
\section{\textcolor{Chapter }{Isomorphisms and Automorphisms}}\label{Sec:IsomorphismsAndAutomorphisms}
\logpage{[ 6, 11, 0 ]}
\hyperdef{L}{X81F3496578EAA74E}{}
{
  

\subsection{\textcolor{Chapter }{IsomorphismLoops}}
\logpage{[ 6, 11, 1 ]}\nobreak
\hyperdef{L}{X7D7B10D6836FCA9F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsomorphismLoops({\mdseries\slshape Q, L})\index{IsomorphismLoops@\texttt{IsomorphismLoops}}
\label{IsomorphismLoops}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
An isomorphism from a loop \mbox{\texttt{\mdseries\slshape Q}} to a loop \mbox{\texttt{\mdseries\slshape L}} if the loops are isomorphic, \texttt{fail} otherwise.



If an isomorphism exists, it is returned as a permutation $f$ of $1,\dots,|$\mbox{\texttt{\mdseries\slshape Q}}$|$, where $i^f=j$ means that the $i$th element of \mbox{\texttt{\mdseries\slshape Q}} is mapped onto the $j$th element of \mbox{\texttt{\mdseries\slshape L}}. Note that this convention is used even if the underlying sets of \mbox{\texttt{\mdseries\slshape L}}, \mbox{\texttt{\mdseries\slshape M}} are not indexed by consecutive integers.}

 

\subsection{\textcolor{Chapter }{LoopsUpToIsomorphism}}
\logpage{[ 6, 11, 2 ]}\nobreak
\hyperdef{L}{X8308F38283C61B20}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LoopsUpToIsomorphism({\mdseries\slshape ls})\index{LoopsUpToIsomorphism@\texttt{LoopsUpToIsomorphism}}
\label{LoopsUpToIsomorphism}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
Given a list \mbox{\texttt{\mdseries\slshape ls}} of loops, returns a sublist of \mbox{\texttt{\mdseries\slshape ls}} consisting of representatives of isomorphism classes of loops from \mbox{\texttt{\mdseries\slshape ls}}.

}

 

\subsection{\textcolor{Chapter }{AutomorphismGroup}}
\logpage{[ 6, 11, 3 ]}\nobreak
\hyperdef{L}{X87677B0787B4461A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AutomorphismGroup({\mdseries\slshape Q})\index{AutomorphismGroup@\texttt{AutomorphismGroup}}
\label{AutomorphismGroup}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
The automorphism group of a loop \mbox{\texttt{\mdseries\slshape Q}}, with the same convention on permutations as in the case of \texttt{IsomorphismLoops}.\\


}

 

\textsc{Remark:} Since two isomorphisms differ by an automorphism, all isomorphisms from \mbox{\texttt{\mdseries\slshape Q}} to \mbox{\texttt{\mdseries\slshape L}} can be obtained by a combination of \texttt{IsomorphismLoops(\mbox{\texttt{\mdseries\slshape Q}},\mbox{\texttt{\mdseries\slshape L}})} and \texttt{AutomorphismGroup(\mbox{\texttt{\mdseries\slshape L}})}. \\


While dealing with Cayley tables, it is often useful to rename or reorder the
elements of the underlying quasigroup without changing the isomorphism type of
the quasigroups. \textsf{LOOPS} contains several functions for this purpose. 

\subsection{\textcolor{Chapter }{IsomorphicCopyByPerm}}
\logpage{[ 6, 11, 4 ]}\nobreak
\hyperdef{L}{X85B3E22679FD8D81}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsomorphicCopyByPerm({\mdseries\slshape Q, f})\index{IsomorphicCopyByPerm@\texttt{IsomorphicCopyByPerm}}
\label{IsomorphicCopyByPerm}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
When \mbox{\texttt{\mdseries\slshape Q}} is a quasigroup and \mbox{\texttt{\mdseries\slshape f}} is a permutation of $1,\dots,|$\mbox{\texttt{\mdseries\slshape Q}}$|$, returns a quasigroup defined on the same set as \mbox{\texttt{\mdseries\slshape Q}} with multiplication $*$ defined by $x*y = $\mbox{\texttt{\mdseries\slshape f}}$($\mbox{\texttt{\mdseries\slshape f}}${}^{-1}(x)$\mbox{\texttt{\mdseries\slshape f}}${}^{-1}(y))$. When \mbox{\texttt{\mdseries\slshape Q}} is a declared loop, a loop is returned. Consequently, when \mbox{\texttt{\mdseries\slshape Q}} is a declared loop and \mbox{\texttt{\mdseries\slshape f}}$(1) = k\ne 1$, then \mbox{\texttt{\mdseries\slshape f}} is first replaced with \mbox{\texttt{\mdseries\slshape f}}$\circ (1,k)$, to make sure that the resulting Cayley table is normalized.

}

 

\subsection{\textcolor{Chapter }{IsomorphicCopyByNormalSubloop}}
\logpage{[ 6, 11, 5 ]}\nobreak
\hyperdef{L}{X8121DE3A78795040}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsomorphicCopyByNormalSubloop({\mdseries\slshape Q, S})\index{IsomorphicCopyByNormalSubloop@\texttt{IsomorphicCopyByNormalSubloop}}
\label{IsomorphicCopyByNormalSubloop}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
When \mbox{\texttt{\mdseries\slshape S}} is a normal subloop of a loop \mbox{\texttt{\mdseries\slshape Q}}, returns an isomorphic copy of \mbox{\texttt{\mdseries\slshape Q}} in which the elements are ordered according to the right cosets of \mbox{\texttt{\mdseries\slshape S}}. In particular, the Cayley table of \mbox{\texttt{\mdseries\slshape S}} will appear in the top left corner of the Cayley table of the resulting loop.\\


}

 

In order to speed up the search for isomorphisms and automorphisms, we first
calculate some loop invariants preserved under isomorphisms, and then we use
these invariants to partition the loop into blocks of elements preserved under
isomorphisms. The following two operations are used in the search. 

\subsection{\textcolor{Chapter }{Discriminator}}
\logpage{[ 6, 11, 6 ]}\nobreak
\hyperdef{L}{X7D09D8957E4A0973}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Discriminator({\mdseries\slshape Q})\index{Discriminator@\texttt{Discriminator}}
\label{Discriminator}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
A data structure with isomorphism invariants of a loop \mbox{\texttt{\mdseries\slshape Q}}. See \cite{Vo} or the file \texttt{iso.gi} for more details.

}

 

If two loops have different discriminators, they are not isomorphic. If they
have identical discriminators, they may or may not be isomorphic. 

\subsection{\textcolor{Chapter }{AreEqualDiscriminators}}
\logpage{[ 6, 11, 7 ]}\nobreak
\hyperdef{L}{X812F0DEE7C896E18}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AreEqualDiscriminators({\mdseries\slshape D1, D2})\index{AreEqualDiscriminators@\texttt{AreEqualDiscriminators}}
\label{AreEqualDiscriminators}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape D1}}, \mbox{\texttt{\mdseries\slshape D2}} are equal discriminators for the purposes of isomorphism searches.

}

 }

  
\section{\textcolor{Chapter }{Isotopisms}}\label{Sec:Isotopism}
\logpage{[ 6, 12, 0 ]}
\hyperdef{L}{X7E996BDD81E594F9}{}
{
  At the moment, \textsf{LOOPS} contains only slow methods for testing if two loops are isotopic. The method
works as follows: It is well known that if a loop $K$ is isotopic to a loop $L$ then there exist a principal loop isotope $P$ of $K$ such that $P$ is isomorphic to $L$. The algorithm first finds all principal isotopes of $K$, then filters them up to isomorphism, and then checks if any of them is
isomorphic to $L$. This is rather slow already for small orders. 

\subsection{\textcolor{Chapter }{IsotopismLoops}}
\logpage{[ 6, 12, 1 ]}\nobreak
\hyperdef{L}{X84C5ADE77F910F63}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsotopismLoops({\mdseries\slshape K, L})\index{IsotopismLoops@\texttt{IsotopismLoops}}
\label{IsotopismLoops}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
\texttt{fail} if \mbox{\texttt{\mdseries\slshape K}}, \mbox{\texttt{\mdseries\slshape L}} are not isotopic loops, else it returns an isotopism as a triple of bijections
on $1,\dots,|$\mbox{\texttt{\mdseries\slshape K}}$|$.

}

 

\subsection{\textcolor{Chapter }{LoopsUpToIsotopism}}
\logpage{[ 6, 12, 2 ]}\nobreak
\hyperdef{L}{X841E540B7A7EF29F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LoopsUpToIsotopism({\mdseries\slshape ls})\index{LoopsUpToIsotopism@\texttt{LoopsUpToIsotopism}}
\label{LoopsUpToIsotopism}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
Given a list \mbox{\texttt{\mdseries\slshape ls}} of loops, returns a sublist of \mbox{\texttt{\mdseries\slshape ls}} consisting of representatives of isotopism classes of loops from \mbox{\texttt{\mdseries\slshape ls}}.

}

 }

 }

  
\chapter{\textcolor{Chapter }{Testing Properties of Quasigroups and Loops}}\label{Chap:TestingPropertiesOfQuasigroupsAndLoops}
\logpage{[ 7, 0, 0 ]}
\hyperdef{L}{X7910E575825C713E}{}
{
  Although loops are quasigroups, it is often the case in the literature that a
property of the same name can differ for quasigroups and loops. For instance,
a Steiner loop is not necessarily a Steiner quasigroup. 

To avoid such ambivalences, we often include the noun \texttt{Loop} or \texttt{Quasigroup} as part of the name of the property, e.g., \texttt{IsSteinerQuasigroup} versus \texttt{IsSteinerLoop}. 

On the other hand, some properties coincide for quasigroups and loops and we
therefore do not include \texttt{Loop}, \texttt{Quasigroup} as part of the name of the property, e.g., \texttt{IsCommutative}.  
\section{\textcolor{Chapter }{Associativity, Commutativity and Generalizations}}\label{Sec:AssociativityCommutativityAndGeneralizations}
\logpage{[ 7, 1, 0 ]}
\hyperdef{L}{X7960E3FB7A7F0F00}{}
{
  

\subsection{\textcolor{Chapter }{IsAssociative}}
\logpage{[ 7, 1, 1 ]}\nobreak
\hyperdef{L}{X7C83B5A47FD18FB7}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsAssociative({\mdseries\slshape Q})\index{IsAssociative@\texttt{IsAssociative}}
\label{IsAssociative}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is an associative quasigroup.

}

 

\subsection{\textcolor{Chapter }{IsCommutative}}
\logpage{[ 7, 1, 2 ]}\nobreak
\hyperdef{L}{X830A4A4C795FBC2D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsCommutative({\mdseries\slshape Q})\index{IsCommutative@\texttt{IsCommutative}}
\label{IsCommutative}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a commutative quasigroup.

}

 

\subsection{\textcolor{Chapter }{IsPowerAssociative}}
\logpage{[ 7, 1, 3 ]}\nobreak
\hyperdef{L}{X7D53EA947F1CDA69}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsPowerAssociative({\mdseries\slshape Q})\index{IsPowerAssociative@\texttt{IsPowerAssociative}}
\label{IsPowerAssociative}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a power associative loop.



A loop $Q$ is said to be \emph{power associative}\index{loop!power associative}\index{power associative loop} if every element of $Q$ generates an associative loop.}

 

\subsection{\textcolor{Chapter }{IsDiassociative}}
\logpage{[ 7, 1, 4 ]}\nobreak
\hyperdef{L}{X872DCA027E1A4A1D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsDiassociative({\mdseries\slshape Q})\index{IsDiassociative@\texttt{IsDiassociative}}
\label{IsDiassociative}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a diassociative loop.



A loop $Q$ is said to be \emph{diassociative}\index{loop!diassociative}\index{diassociative loop} if any two elements of $Q$ generate an associative sublop.}

 }

  
\section{\textcolor{Chapter }{Inverse Propeties}}\label{Sec:InverseProperties}
\logpage{[ 7, 2, 0 ]}
\hyperdef{L}{X853841C5820BFEA4}{}
{
  For an element $x$ of a loop $Q$, the \emph{left inverse}\index{inverse!left} of $x$ is the element $x^\lambda$ of $Q$ such that $x^\lambda \cdot x = 1$, while the \emph{right inverse}\index{inverse!right} of $x$ is the element $x^\rho$ of $Q$ such that $x\cdot x^\rho = 1$. 
\subsection{\textcolor{Chapter }{HasLeftInverseProperty, HasRightInverseProperty and HasInverseProperty}}\logpage{[ 7, 2, 1 ]}
\hyperdef{L}{X85EDD10586596458}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HasLeftInverseProperty({\mdseries\slshape Q})\index{HasLeftInverseProperty@\texttt{HasLeftInverseProperty}}
\label{HasLeftInverseProperty}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HasRightInverseProperty({\mdseries\slshape Q})\index{HasRightInverseProperty@\texttt{HasRightInverseProperty}}
\label{HasRightInverseProperty}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HasInverseProperty({\mdseries\slshape Q})\index{HasInverseProperty@\texttt{HasInverseProperty}}
\label{HasInverseProperty}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if a loop \mbox{\texttt{\mdseries\slshape Q}} has the left inverse property, right inverse property, resp. inverse property.



A loop $Q$ has the \emph{left inverse property}\index{inverse property!left} if $x^\lambda(xy)=y$ for every $x$, $y$ in $Q$. Dually, $Q$ has the \emph{right inverse property}\index{inverse property!right} if $(yx)x^\rho=y$ for every $x$, $y$ in $Q$. If $Q$ has both the left inverse property and the right inverse property, it has the \emph{inverse property}\index{inverse property}.}

 

\subsection{\textcolor{Chapter }{HasTwosidedInverses}}
\logpage{[ 7, 2, 2 ]}\nobreak
\hyperdef{L}{X86B93E1B7AEA6EDA}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HasTwosidedInverses({\mdseries\slshape Q})\index{HasTwosidedInverses@\texttt{HasTwosidedInverses}}
\label{HasTwosidedInverses}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if a loop \mbox{\texttt{\mdseries\slshape Q}} has two-sided inverses.



A loop $Q$ is said to have \emph{two-sided inverses}\index{inverse!two-sided} if $x^\lambda=x^\rho$ for every $x$ in $Q$.}

 

\subsection{\textcolor{Chapter }{HasWeakInverseProperty}}
\logpage{[ 7, 2, 3 ]}\nobreak
\hyperdef{L}{X793909B780761EA8}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HasWeakInverseProperty({\mdseries\slshape Q})\index{HasWeakInverseProperty@\texttt{HasWeakInverseProperty}}
\label{HasWeakInverseProperty}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if a loop \mbox{\texttt{\mdseries\slshape Q}} has the weak inverse property.



A loop $Q$ has the \emph{weak inverse property}\index{inverse property!weak} if $(xy)^\lambda x = y^\lambda$ (equivalently, $x(yx)^\rho = y^\rho$) holds for every $x$, $y$ in $Q$.}

 

\subsection{\textcolor{Chapter }{HasAutomorphicInverseProperty}}
\logpage{[ 7, 2, 4 ]}\nobreak
\hyperdef{L}{X7F46CE6B7D387158}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HasAutomorphicInverseProperty({\mdseries\slshape Q})\index{HasAutomorphicInverseProperty@\texttt{HasAutomorphicInverseProperty}}
\label{HasAutomorphicInverseProperty}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if a loop \mbox{\texttt{\mdseries\slshape Q}} has the automorphic inverse property.



According to \cite{Ar}, a loop $Q$ has the \emph{automorphic inverse property}\index{automorphic inverse property}\index{inverse property!automorphic} if $(xy)^\lambda = x^\lambda y^\lambda$, or, equivalently, $(xy)^\rho = x^\rho y^\rho$ holds for every $x$, $y$ in $Q$.}

 

\subsection{\textcolor{Chapter }{HasAntiautomorphicInverseProperty}}
\logpage{[ 7, 2, 5 ]}\nobreak
\hyperdef{L}{X8538D4638232DB51}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HasAntiautomorphicInverseProperty({\mdseries\slshape Q})\index{HasAntiautomorphicInverseProperty@\texttt{HasAntiautomorphicInverseProperty}}
\label{HasAntiautomorphicInverseProperty}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if a loop \mbox{\texttt{\mdseries\slshape Q}} has the antiautomorphic inverse property.



A loop $Q$ has the \emph{antiautomorphic inverse property}\index{antiautomorphic inverse property}\index{inverse property!antiautomorphic} if $(xy)^\lambda=y^\lambda x^\lambda$, or, equivalently, $(xy)^\rho = y^\rho x^\rho$ holds for every $x$, $y$ in $Q$.\\
}

 

See Appendix \ref{Apx:Filters} for implications implemented in \textsf{LOOPS} among various inverse properties. }

  
\section{\textcolor{Chapter }{Some Properties of Quasigroups}}\label{Sec:SomePropertiesOfQuasigroups}
\logpage{[ 7, 3, 0 ]}
\hyperdef{L}{X7D8CB6DA828FD744}{}
{
  

\subsection{\textcolor{Chapter }{IsSemisymmetric}}
\logpage{[ 7, 3, 1 ]}\nobreak
\hyperdef{L}{X834848ED85F9012B}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsSemisymmetric({\mdseries\slshape Q})\index{IsSemisymmetric@\texttt{IsSemisymmetric}}
\label{IsSemisymmetric}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a semisymmetric quasigroup.



A quasigroup $Q$ is \emph{semisymmetric}\index{semisymmetric quasigroup}\index{quasigroup!semisymmetric} if $(xy)x=y$, or, equivalently $x(yx)=y$ holds for every $x$, $y$ in $Q$.}

 

\subsection{\textcolor{Chapter }{IsTotallySymmetric}}
\logpage{[ 7, 3, 2 ]}\nobreak
\hyperdef{L}{X834F809B8060B754}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsTotallySymmetric({\mdseries\slshape Q})\index{IsTotallySymmetric@\texttt{IsTotallySymmetric}}
\label{IsTotallySymmetric}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a totally symmetric quasigroup.



A commutative semisymmetric quasigroup is called \emph{totally symmetric}\index{totally symmetric quasigroup}\index{quasigroup!totally symmetric}. Totally symmetric quasigroups are precisely the quasigroups satisfying $xy=x\backslash y = x/y$.}

 

\subsection{\textcolor{Chapter }{IsIdempotent}}
\logpage{[ 7, 3, 3 ]}\nobreak
\hyperdef{L}{X7CB5896082D29173}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsIdempotent({\mdseries\slshape Q})\index{IsIdempotent@\texttt{IsIdempotent}}
\label{IsIdempotent}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is an idempotent quasigroup.



A quasigroup is \emph{idempotent}\index{idempotent quasigroup}\index{quasigroup!idempotent} if it satisfies $x^2=x$.}

 

\subsection{\textcolor{Chapter }{IsSteinerQuasigroup}}
\logpage{[ 7, 3, 4 ]}\nobreak
\hyperdef{L}{X83DE7DD77C056C1F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsSteinerQuasigroup({\mdseries\slshape Q})\index{IsSteinerQuasigroup@\texttt{IsSteinerQuasigroup}}
\label{IsSteinerQuasigroup}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a Steiner quasigroup.



A totally symmetric idempotent quasigroup is called a \emph{Steiner quasigroup}\index{Steiner quasigroup}\index{quasigroup!Steiner}.}

 

\subsection{\textcolor{Chapter }{IsUnipotent}}
\logpage{[ 7, 3, 5 ]}\nobreak
\hyperdef{L}{X7CA3DCA07B6CB9BD}{}
{

A quasigroup $Q$ is \emph{unipotent}\index{unipotent quasigroup}\index{quasigroup!unipotent} if it satisfies $x^2=y^2$ for every $x$, $y$ in $Q$.\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsUnipotent({\mdseries\slshape Q})\index{IsUnipotent@\texttt{IsUnipotent}}
\label{IsUnipotent}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a unipotent quasigroup.

}

 
\subsection{\textcolor{Chapter }{IsLeftDistributive, IsRightDistributive, IsDistributive}}\logpage{[ 7, 3, 6 ]}
\hyperdef{L}{X7B76FD6E878ED4F1}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsLeftDistributive({\mdseries\slshape Q})\index{IsLeftDistributive@\texttt{IsLeftDistributive}}
\label{IsLeftDistributive}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsRightDistributive({\mdseries\slshape Q})\index{IsRightDistributive@\texttt{IsRightDistributive}}
\label{IsRightDistributive}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsDistributive({\mdseries\slshape Q})\index{IsDistributive@\texttt{IsDistributive}}
\label{IsDistributive}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a left distributive quasigroup, resp. a right distributive quasigroup,
resp. a distributive quasigroup.



A quasigroup is \emph{left distributive}\index{quasigroup!left distributive}\index{distributive quasigroup!left} if it satisfies $x(yz) = (xy)(xz)$, \emph{right distributive}\index{quasigroup!right distributive}\index{distributive quasigroup!right} if it satisfies $(xy)z = (xz)(yz)$, and \emph{distributive}\index{quasigroup!distributive}\index{distributive quasigroup} if it is both left distributive and right distributive. 

\textsc{Remark:} In order to be compatible with \textsf{GAP}s terminology, we also support the synonyms \texttt{IsLDistributive} and \texttt{IsRDistributive} of \texttt{IsLeftDistributive} and \texttt{IsRightDistributive}, respectively.}

 
\subsection{\textcolor{Chapter }{IsEntropic and IsMedial}}\logpage{[ 7, 3, 7 ]}
\hyperdef{L}{X7F23D4D97A38D223}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsEntropic({\mdseries\slshape Q})\index{IsEntropic@\texttt{IsEntropic}}
\label{IsEntropic}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsMedial({\mdseries\slshape Q})\index{IsMedial@\texttt{IsMedial}}
\label{IsMedial}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is an entropic (aka medial) quasigroup.



A quasigroup is \emph{entropic}\index{entropic quasigroup}\index{quasigroup!entropic} or \emph{medial}\index{medial quasigroup}\index{quasigroup!medial} if it satisfies the identity $(xy)(uv) = (xu)(yv)$.}

 }

  
\section{\textcolor{Chapter }{Loops of Bol Moufang Type}}\label{Sec:LoopsOfBolMoufangType}
\logpage{[ 7, 4, 0 ]}
\hyperdef{L}{X780D907986EBA6C7}{}
{
  Following \cite{Fe} and \cite{PhiVoj}, a variety of loops is said to be of \emph{Bol-Moufang type}\index{loop!of Bol-Moufang type} if it is defined by a single \emph{identity of Bol-Moufang type}\index{identity!of Bol-Moufang type}, i.e., by an identity that contains the same 3 variables on both sides,
exactly one of the variables occurs twice on both sides, and the variables
occur in the same order on both sides. 

It is proved in \cite{PhiVoj} that there are 13 varieties of nonassociative loops of Bol-Moufang type. These
are: 
\begin{itemize}
\item \emph{left alternative loops}\index{alternative loop!left}\index{loop!left alternative} defined by $x(xy) = (xx)y$,
\item \emph{right alternative loops}\index{alternative loop!right}\index{loop!right alternative} defined by $x(yy) = (xy)y$,
\item \emph{left nuclear square loops}\index{nuclear square loop!left}\index{loop!left nuclear square} defined by $(xx)(yz) = ((xx)y)z$,
\item \emph{middle nuclear square loops}\index{nuclear square loop!middle}\index{loop!middle nuclear square}defined by $x((yy)z) = (x(yy))z$,
\item \emph{right nuclear square loops}\index{nuclear square loop!right}\index{loop!right nuclear square} defined by $x(y(zz)) = (xy)(zz)$,
\item \emph{flexible loops}\index{flexible loop}\index{loop!flexible} defined by $x(yx) = (xy)x$,
\item \emph{left Bol loops}\index{Bol loop!left}\index{loop!left Bol} defined by $x(y(xz)) = (x(yx))z$, always left alternative,
\item \emph{right Bol loops}\index{Bol loop!right}\index{loop!right Bol} defined by $x((yz)y) = ((xy)z)y$, always right alternative,
\item \emph{LC loops}\index{LC loop}\index{loop!LC} defined by $(xx)(yz) = (x(xy))z$, always left alternative, left nuclear square and middle nuclear square,
\item \emph{RC loops}\index{RC loop}\index{loop!RC} defined by $x((yz)z) = (xy)(zz)$, always right alternative, right nuclear square and middle nuclear square,
\item \emph{Moufang loops}\index{Moufang loop}\index{loop!Moufang} defined by $(xy)(zx) = (x(yz))x$, always flexible, left Bol and right Bol,
\item \emph{C loops}\index{C loop}\index{loop!C} defined by $x(y(yz)) = ((xy)y)z$, always LC and RC,
\item \emph{extra loops}\index{extra loop}\index{loop!extra} defined by $x(y(zx)) = ((xy)z)x$, always Moufang and C.
\end{itemize}
 

Note that although some of the defining identities are not of Bol-Moufang
type, they are equivalent to a Bol-Moufang identity. Moreover, many varieties
of loops of Bol-Moufang type can be defined by one of several equivalent
identities of Bol-Moufang type. 

There are also several varieties related to loops of Bol-Moufang type. A loop
is said to be \emph{alternative}\index{alternative loop}\index{loop!alternative} if it is both left alternative and right alternative. A loop is \emph{nuclear square}\index{nuclear square loop}\index{loop!nuclear square} if it is left nuclear square, middle nuclear square and right nuclear square. 

\subsection{\textcolor{Chapter }{IsExtraLoop}}
\logpage{[ 7, 4, 1 ]}\nobreak
\hyperdef{L}{X7988AFE27D06ACB5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsExtraLoop({\mdseries\slshape Q})\index{IsExtraLoop@\texttt{IsExtraLoop}}
\label{IsExtraLoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is an extra loop.

}

 

\subsection{\textcolor{Chapter }{IsMoufangLoop}}
\logpage{[ 7, 4, 2 ]}\nobreak
\hyperdef{L}{X7F1C151484C97E61}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsMoufangLoop({\mdseries\slshape Q})\index{IsMoufangLoop@\texttt{IsMoufangLoop}}
\label{IsMoufangLoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a Moufang loop.

}

 

\subsection{\textcolor{Chapter }{IsCLoop}}
\logpage{[ 7, 4, 3 ]}\nobreak
\hyperdef{L}{X866F04DC7AE54B7C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsCLoop({\mdseries\slshape Q})\index{IsCLoop@\texttt{IsCLoop}}
\label{IsCLoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a C loop.

}

 

\subsection{\textcolor{Chapter }{IsLeftBolLoop}}
\logpage{[ 7, 4, 4 ]}\nobreak
\hyperdef{L}{X801DAAE8834A1A65}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsLeftBolLoop({\mdseries\slshape Q})\index{IsLeftBolLoop@\texttt{IsLeftBolLoop}}
\label{IsLeftBolLoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a left Bol loop.

}

 

\subsection{\textcolor{Chapter }{IsRightBolLoop}}
\logpage{[ 7, 4, 5 ]}\nobreak
\hyperdef{L}{X79279F9787E72566}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsRightBolLoop({\mdseries\slshape Q})\index{IsRightBolLoop@\texttt{IsRightBolLoop}}
\label{IsRightBolLoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a right Bol loop.

}

 

\subsection{\textcolor{Chapter }{IsLCLoop}}
\logpage{[ 7, 4, 6 ]}\nobreak
\hyperdef{L}{X789E0A6979697C4C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsLCLoop({\mdseries\slshape Q})\index{IsLCLoop@\texttt{IsLCLoop}}
\label{IsLCLoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is an LC loop.

}

 

\subsection{\textcolor{Chapter }{IsRCLoop}}
\logpage{[ 7, 4, 7 ]}\nobreak
\hyperdef{L}{X7B03CC577802F4AB}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsRCLoop({\mdseries\slshape Q})\index{IsRCLoop@\texttt{IsRCLoop}}
\label{IsRCLoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is an RC loop.

}

 

\subsection{\textcolor{Chapter }{IsLeftNuclearSquareLoop}}
\logpage{[ 7, 4, 8 ]}\nobreak
\hyperdef{L}{X819F285887B5EB9E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsLeftNuclearSquareLoop({\mdseries\slshape Q})\index{IsLeftNuclearSquareLoop@\texttt{IsLeftNuclearSquareLoop}}
\label{IsLeftNuclearSquareLoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a left nuclear square loop.

}

 

\subsection{\textcolor{Chapter }{IsMiddleNuclearSquareLoop}}
\logpage{[ 7, 4, 9 ]}\nobreak
\hyperdef{L}{X8474F55681244A8A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsMiddleNuclearSquareLoop({\mdseries\slshape Q})\index{IsMiddleNuclearSquareLoop@\texttt{IsMiddleNuclearSquareLoop}}
\label{IsMiddleNuclearSquareLoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a middle nuclear square loop.

}

 

\subsection{\textcolor{Chapter }{IsRightNuclearSquareLoop}}
\logpage{[ 7, 4, 10 ]}\nobreak
\hyperdef{L}{X807B3B21825E3076}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsRightNuclearSquareLoop({\mdseries\slshape Q})\index{IsRightNuclearSquareLoop@\texttt{IsRightNuclearSquareLoop}}
\label{IsRightNuclearSquareLoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a right nuclear square loop.

}

 

\subsection{\textcolor{Chapter }{IsNuclearSquareLoop}}
\logpage{[ 7, 4, 11 ]}\nobreak
\hyperdef{L}{X796650088213229B}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsNuclearSquareLoop({\mdseries\slshape Q})\index{IsNuclearSquareLoop@\texttt{IsNuclearSquareLoop}}
\label{IsNuclearSquareLoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a nuclear square loop.

}

 

\subsection{\textcolor{Chapter }{IsFlexible}}
\logpage{[ 7, 4, 12 ]}\nobreak
\hyperdef{L}{X7C32851A7AF1C45F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsFlexible({\mdseries\slshape Q})\index{IsFlexible@\texttt{IsFlexible}}
\label{IsFlexible}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a flexible quasigroup.

}

 

\subsection{\textcolor{Chapter }{IsLeftAlternative}}
\logpage{[ 7, 4, 13 ]}\nobreak
\hyperdef{L}{X7DF0196786B9CE08}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsLeftAlternative({\mdseries\slshape Q})\index{IsLeftAlternative@\texttt{IsLeftAlternative}}
\label{IsLeftAlternative}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a left alternative quasigroup.

}

 

\subsection{\textcolor{Chapter }{IsRightAlternative}}
\logpage{[ 7, 4, 14 ]}\nobreak
\hyperdef{L}{X8416FAD87F148F5D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsRightAlternative({\mdseries\slshape Q})\index{IsRightAlternative@\texttt{IsRightAlternative}}
\label{IsRightAlternative}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a right alternative quasigroup.

}

 

\subsection{\textcolor{Chapter }{IsAlternative}}
\logpage{[ 7, 4, 15 ]}\nobreak
\hyperdef{L}{X8379356E82DB5DDA}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsAlternative({\mdseries\slshape Q})\index{IsAlternative@\texttt{IsAlternative}}
\label{IsAlternative}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is an alternative quasigroup.\\


}

 

While listing the varieties of loops of Bol-Moufang type, we have also listed
all inclusions among them. These inclusions are built into \textsf{LOOPS} as filters. \\


The following trivial example shows some of the implications and the naming
conventions of \textsf{LOOPS} at work: 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@L := LoopByCayleyTable( [ [ 1, 2 ], [ 2, 1 ] ] );
|
  <loop of order 2>
  !gapprompt@gap>| !gapinput@[ IsLeftBolLoop( L ), L ]
|
  [ true, <left Bol loop of order 2> ]
  !gapprompt@gap>| !gapinput@[ HasIsLeftAlternativeLoop( L ), IsLeftAlternativeLoop( L ) ];
|
  [ true, true ]
  !gapprompt@gap>| !gapinput@[ HasIsRightBolLoop( L ), IsRightBolLoop( L ) ];
|
  [ false, true ]
  !gapprompt@gap>| !gapinput@L;
|
  <Moufang loop of order 2>
  !gapprompt@gap>| !gapinput@[ IsAssociative( L ), L ];
|
  [ true, <associative loop of order 2> ]
\end{Verbatim}
 

The analogous terminology for quasigroups of Bol-Moufang type is not standard
yet, and hence is not supported in \textsf{LOOPS} except for the situations explicitly noted above. }

  
\section{\textcolor{Chapter }{Power Alternative Loops}}\label{Sec:PowerAlternativeLoops}
\logpage{[ 7, 5, 0 ]}
\hyperdef{L}{X83A501387E1AC371}{}
{
  A loop is \emph{left power alternative}\index{power alternative loop!left}\index{loop!left power alternative} if it is power associative and satisfies $x^n(x^m y) = x^{n+m}y$ for all elements $x$, $y$ and all integers $m$, $n$. Similarly, a loop is \emph{right power alternative}\index{power alternative loop!right}\index{loop!right power alternative} if it is power associative and satisfies $(x y^n)y^m = xy^{n+m}$ for all elements $x$, $y$ and all integers $m$, $n$. A loop is \emph{power alternative}\index{power alternative loop}\index{loop!power alternative} if it is both left power alternative and right power alternative. 

Left power alternative loops are left alternative and have the left inverse
property. Left Bol loops and LC loops are left power alternative. 
\subsection{\textcolor{Chapter }{IsLeftPowerAlternative, IsRightPowerAlternative and IsPowerAlternative}}\logpage{[ 7, 5, 1 ]}
\hyperdef{L}{X875C3DF681B3FAE2}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsLeftPowerAlternative({\mdseries\slshape Q})\index{IsLeftPowerAlternative@\texttt{IsLeftPowerAlternative}}
\label{IsLeftPowerAlternative}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsRightPowerAlternative({\mdseries\slshape Q})\index{IsRightPowerAlternative@\texttt{IsRightPowerAlternative}}
\label{IsRightPowerAlternative}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsPowerAlternative({\mdseries\slshape Q})\index{IsPowerAlternative@\texttt{IsPowerAlternative}}
\label{IsPowerAlternative}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a left power alternative loop, resp. a right power alternative loop, resp.
a power alternative loop.

}

 }

  
\section{\textcolor{Chapter }{Conjugacy Closed Loops and Related Properties}}\label{Sec:ConjugacyClosedEtc}
\logpage{[ 7, 6, 0 ]}
\hyperdef{L}{X8176B2C47A4629CD}{}
{
  A loop $Q$ is \emph{left conjugacy closed}\index{conjugacy closed loop!left}\index{loop!left conjugacy closed} if the set of left translations of $Q$ is closed under conjugation (by itself). Similarly, a loop $Q$ is \emph{right conjugacy closed}\index{conjugacy closed loop!right}\index{loop!right conjugacy closed} if the set of right translations of $Q$ is closed under conjugation. A loop is \emph{conjugacy closed}\index{conjugacy closed loop}\index{loop!conjugacy closed} if it is both left conjugacy closed and right conjugacy closed. It is common
to refer to these loops as LCC, RCC, and CC loops, respectively. 

The equivalence LCC $+$ RCC $=$ CC is built into \textsf{LOOPS}. 

\subsection{\textcolor{Chapter }{IsLCCLoop}}
\logpage{[ 7, 6, 1 ]}\nobreak
\hyperdef{L}{X784E08CD7B710AF4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsLCCLoop({\mdseries\slshape Q})\index{IsLCCLoop@\texttt{IsLCCLoop}}
\label{IsLCCLoop}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsLeftConjugacyClosedLoop({\mdseries\slshape Q})\index{IsLeftConjugacyClosedLoop@\texttt{IsLeftConjugacyClosedLoop}}
\label{IsLeftConjugacyClosedLoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a left conjugacy closed loop.

}

 

\subsection{\textcolor{Chapter }{IsRCCLoop}}
\logpage{[ 7, 6, 2 ]}\nobreak
\hyperdef{L}{X7B3016B47A1A8213}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsRCCLoop({\mdseries\slshape Q})\index{IsRCCLoop@\texttt{IsRCCLoop}}
\label{IsRCCLoop}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsRightConjugacyClosedLoop({\mdseries\slshape Q})\index{IsRightConjugacyClosedLoop@\texttt{IsRightConjugacyClosedLoop}}
\label{IsRightConjugacyClosedLoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a right conjugacy closed loop.

}

 

\subsection{\textcolor{Chapter }{IsCCLoop}}
\logpage{[ 7, 6, 3 ]}\nobreak
\hyperdef{L}{X878B614479DCB83F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsCCLoop({\mdseries\slshape Q})\index{IsCCLoop@\texttt{IsCCLoop}}
\label{IsCCLoop}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsConjugacyClosedLoop({\mdseries\slshape Q})\index{IsConjugacyClosedLoop@\texttt{IsConjugacyClosedLoop}}
\label{IsConjugacyClosedLoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a conjugacy closed loop.

}

 

\subsection{\textcolor{Chapter }{IsOsbornLoop}}
\logpage{[ 7, 6, 4 ]}\nobreak
\hyperdef{L}{X8655956878205FC1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsOsbornLoop({\mdseries\slshape Q})\index{IsOsbornLoop@\texttt{IsOsbornLoop}}
\label{IsOsbornLoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is an Osborn loop.



A loop is \emph{Osborn}\index{Osborn loop}\index{loop!Osborn} if it satisfies $x(yz\cdot x)=(x^\lambda\backslash y)(zx)$. Both Moufang loops and CC loops are Osborn.}

 }

  
\section{\textcolor{Chapter }{Automorphic Loops}}\label{Sec:AutomorphicLoops}
\logpage{[ 7, 7, 0 ]}
\hyperdef{L}{X793B22EA8643C667}{}
{
  A loop $Q$ whose all left (resp. middle, resp. right) inner mappings are automorphisms of $Q$ is known as a \emph{left automorphic loop}\index{automorphic loop!left}\index{loop!left automorphic} (resp. \emph{middle automorphic loop}\index{automorphic loop!middle}\index{loop!middle automorphic}, resp. \emph{right automorphic loop}\index{automorphic loop!right}\index{loop!right automorphic}). 

A loop $Q$ is an \emph{automorphic loop}\index{automorphic loop}\index{loop!automorphic} if all inner mappings of $Q$ are automorphisms of $Q$. 

Automorphic loops are also known as \emph{A loops}, and similar terminology exists for left, right and middle automorphic loops. 

Diassociative automorphic loops are Moufang by \cite{KiKuPh}. See the built-in filters for additional properties of automorphic loops. 

\subsection{\textcolor{Chapter }{IsLeftAutomorphicLoop}}
\logpage{[ 7, 7, 1 ]}\nobreak
\hyperdef{L}{X7F063914804659F1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsLeftAutomorphicLoop({\mdseries\slshape Q})\index{IsLeftAutomorphicLoop@\texttt{IsLeftAutomorphicLoop}}
\label{IsLeftAutomorphicLoop}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsLeftALoop({\mdseries\slshape Q})\index{IsLeftALoop@\texttt{IsLeftALoop}}
\label{IsLeftALoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a left automorphic loop.

}

 

\subsection{\textcolor{Chapter }{IsMiddleAutomorphicLoop}}
\logpage{[ 7, 7, 2 ]}\nobreak
\hyperdef{L}{X7DFE830584A769E5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsMiddleAutomorphicLoop({\mdseries\slshape Q})\index{IsMiddleAutomorphicLoop@\texttt{IsMiddleAutomorphicLoop}}
\label{IsMiddleAutomorphicLoop}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsMiddleALoop({\mdseries\slshape Q})\index{IsMiddleALoop@\texttt{IsMiddleALoop}}
\label{IsMiddleALoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a middle automorphic loop.

}

 

\subsection{\textcolor{Chapter }{IsRightAutomorphicLoop}}
\logpage{[ 7, 7, 3 ]}\nobreak
\hyperdef{L}{X7EA9165A87F99E35}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsRightAutomorphicLoop({\mdseries\slshape Q})\index{IsRightAutomorphicLoop@\texttt{IsRightAutomorphicLoop}}
\label{IsRightAutomorphicLoop}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsRightALoop({\mdseries\slshape Q})\index{IsRightALoop@\texttt{IsRightALoop}}
\label{IsRightALoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a right automorphic loop.

}

 

\subsection{\textcolor{Chapter }{IsAutomorphicLoop}}
\logpage{[ 7, 7, 4 ]}\nobreak
\hyperdef{L}{X7899603184CF13FD}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsAutomorphicLoop({\mdseries\slshape Q})\index{IsAutomorphicLoop@\texttt{IsAutomorphicLoop}}
\label{IsAutomorphicLoop}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsALoop({\mdseries\slshape Q})\index{IsALoop@\texttt{IsALoop}}
\label{IsALoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is an automorphic loop.

}

 

\textsc{Remark:} Be careful not to confuse \texttt{IsALoop} and \texttt{IsLoop}. }

  
\section{\textcolor{Chapter }{Additonal Varieties of Loops}}\label{Sec:AdditionalVarietiesOfLoops}
\logpage{[ 7, 8, 0 ]}
\hyperdef{L}{X846F363879BAB349}{}
{
  

\subsection{\textcolor{Chapter }{IsCodeLoop}}
\logpage{[ 7, 8, 1 ]}\nobreak
\hyperdef{L}{X790FA1188087D5C1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsCodeLoop({\mdseries\slshape Q})\index{IsCodeLoop@\texttt{IsCodeLoop}}
\label{IsCodeLoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a code loop.



A \emph{code loop}\index{code loop}\index{loop!code} is a Moufang 2-loop with a Frattini subloop of order 1 or 2. Code loops are
extra and conjugacy closed.}

 

\subsection{\textcolor{Chapter }{IsSteinerLoop}}
\logpage{[ 7, 8, 2 ]}\nobreak
\hyperdef{L}{X793600C9801F4F62}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsSteinerLoop({\mdseries\slshape Q})\index{IsSteinerLoop@\texttt{IsSteinerLoop}}
\label{IsSteinerLoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a Steiner loop.



A \emph{Steiner loop}\index{Steiner loop}\index{loop!Steiner} is an inverse property loop of exponent 2. Steiner loops are commutative.}

 
\subsection{\textcolor{Chapter }{IsLeftBruckLoop and IsLeftKLoop}}\logpage{[ 7, 8, 3 ]}
\hyperdef{L}{X85F1BD4280E44F5B}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsLeftBruckLoop({\mdseries\slshape Q})\index{IsLeftBruckLoop@\texttt{IsLeftBruckLoop}}
\label{IsLeftBruckLoop}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsLeftKLoop({\mdseries\slshape Q})\index{IsLeftKLoop@\texttt{IsLeftKLoop}}
\label{IsLeftKLoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a left Bruck loop (aka left K loop).



A left Bol loop with the automorphic inverse property is known as a \emph{left Bruck loop}\index{Bruck loop!left}\index{loop!left Bruck} or a \emph{left K loop}\index{K loop!left}\index{loop!left K}.}

 
\subsection{\textcolor{Chapter }{IsRightBruckLoop and IsRightKLoop}}\logpage{[ 7, 8, 4 ]}
\hyperdef{L}{X857B373E7B4E0519}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsRightBruckLoop({\mdseries\slshape Q})\index{IsRightBruckLoop@\texttt{IsRightBruckLoop}}
\label{IsRightBruckLoop}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsRightKLoop({\mdseries\slshape Q})\index{IsRightKLoop@\texttt{IsRightKLoop}}
\label{IsRightKLoop}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if \mbox{\texttt{\mdseries\slshape Q}} is a right Bruck loop (aka right K loop).



A right Bol loop with the automorphic inverse property is known as a \emph{right Bruck loop}\index{Bruck loop!right}\index{loop!right Bruck} or a \emph{right K loop}\index{K loop!right}\index{loop!right K}.}

 }

 }

  
\chapter{\textcolor{Chapter }{Specific Methods}}\label{Chap:SpecificMethods}
\logpage{[ 8, 0, 0 ]}
\hyperdef{L}{X85AFC9C47FD3C03F}{}
{
  This chapter describes methods of \textsf{LOOPS} that apply to specific classes of loops, mostly Bol and Moufang loops.  
\section{\textcolor{Chapter }{Core Methods for Bol Loops}}\label{Sec:CoreMethodsForBolLoops}
\logpage{[ 8, 1, 0 ]}
\hyperdef{L}{X7990F2F880E717EE}{}
{
  
\subsection{\textcolor{Chapter }{AssociatedLeftBruckLoop and AssociatedRightBruckLoop}}\logpage{[ 8, 1, 1 ]}
\hyperdef{L}{X8664CA927DD73DBE}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AssociatedLeftBruckLoop({\mdseries\slshape Q})\index{AssociatedLeftBruckLoop@\texttt{AssociatedLeftBruckLoop}}
\label{AssociatedLeftBruckLoop}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AssociatedRightBruckLoop({\mdseries\slshape Q})\index{AssociatedRightBruckLoop@\texttt{AssociatedRightBruckLoop}}
\label{AssociatedRightBruckLoop}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
The left (resp. right) Bruck loop associated with a uniquely 2-divisible left
(resp. right) Bol loop \mbox{\texttt{\mdseries\slshape Q}}.



Let $Q$ be a left Bol loop\index{loop!left Bol}\index{Bol loop!left} such that the mapping $x\mapsto x^2$ is a permutation of $Q$. Define a new operation $*$ on $Q$ by $x*y =(x(y^2x))^{1/2}$. Then $(Q,*)$ is a left Bruck loop, called the \emph{associated left Bruck loop}\index{Bruck loop!associated left}\index{loop!associated left Bruck}. (In fact, Bruck used the isomorphic operation $x*y = x^{1/2}(yx^{1/2})$ instead. Our approach is more natural in the sense that the left Bruck loop
associated with a left Bruck loop is identical to the original loop.)
Associated right Bruck loops are defined dually.}

 

\subsection{\textcolor{Chapter }{IsExactGroupFactorization}}
\logpage{[ 8, 1, 2 ]}\nobreak
\hyperdef{L}{X82FC16F386CE11F1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsExactGroupFactorization({\mdseries\slshape G, H1, H2})\index{IsExactGroupFactorization@\texttt{IsExactGroupFactorization}}
\label{IsExactGroupFactorization}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} if (\mbox{\texttt{\mdseries\slshape G}}, \mbox{\texttt{\mdseries\slshape H1}}, \mbox{\texttt{\mdseries\slshape H2}}) is an exact group factorization.



Many right Bol loops can be constructed from exact group factorizations. The
triple $(G,H_1,H_2)$ is an \emph{exact group factorization}\index{exact group factorization} if $H_1$, $H_2$ are subgroups of $G$ such that $H_1H_2=G$ and $H_1\cap H_2=1$.}

 

\subsection{\textcolor{Chapter }{RightBolLoopByExactGroupFactorization}}
\logpage{[ 8, 1, 3 ]}\nobreak
\hyperdef{L}{X7DCA64807F899127}{}
{

If $(G,H_1,H_2)$ is an exact group factorization then $(G\times G, H_1\times H_2, T)$ with $T=\{(x,x^{-1})| x\in G\}$ is a loop folder that gives rise to a right Bol loop.\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RightBolLoopByExactGroupFactorization({\mdseries\slshape arg})\index{RightBolLoopByExactGroupFactorization@\texttt{Right}\-\texttt{Bol}\-\texttt{Loop}\-\texttt{By}\-\texttt{Exact}\-\texttt{Group}\-\texttt{Factorization}}
\label{RightBolLoopByExactGroupFactorization}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
The right Bol loop constructed from an exact group factorization. The argument \mbox{\texttt{\mdseries\slshape arg}} can either be an exact group factorization \texttt{[G,H1,H2]}, or the tuple \texttt{[G,H]}, where \texttt{H} is a regular subgroup of \texttt{G}. We also allow \mbox{\texttt{\mdseries\slshape arg}} to be separate entries rather than a list of entries.

}

 }

  
\section{\textcolor{Chapter }{Moufang Modifications}}\label{Sec:MoufangModifications}
\logpage{[ 8, 2, 0 ]}
\hyperdef{L}{X819F82737C2A860D}{}
{
  Dr{\a'a}pal \cite{DrapalCD} described two prominent families of extensions of Moufang loops. It turns out
that these extensions suffice to obtain all nonassociative Moufang loops of
order at most 64 if one starts with so-called Chein loops. We call the two
constructions \emph{Moufang modifications}\index{modification!Moufang}. The library of Moufang loops included in \textsf{LOOPS} is based on Moufang modifications. See \cite{DrVo} for details. 

\subsection{\textcolor{Chapter }{LoopByCyclicModification}}
\logpage{[ 8, 2, 1 ]}\nobreak
\hyperdef{L}{X7B3165C083709831}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LoopByCyclicModification({\mdseries\slshape Q, S, a, h})\index{LoopByCyclicModification@\texttt{LoopByCyclicModification}}
\label{LoopByCyclicModification}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
The cyclic modification of a Moufang loop \mbox{\texttt{\mdseries\slshape Q}} obtained from \mbox{\texttt{\mdseries\slshape S}}, \mbox{\texttt{\mdseries\slshape a}}$=\alpha$ and \mbox{\texttt{\mdseries\slshape h}} described below.



Assume that $Q$ is a Moufang loop with a normal subloop $S$ such that $Q/S$ is a cyclic group of order $2m$. Let $h\in S\cap Z(L)$. Let $\alpha$ be a generator of $Q/S$ and write $Q = \bigcup_{i\in M} \alpha^i$, where $M=\{-m+1$, $\dots$, $m\}$. Let $\sigma:\mathbb{Z}\to M$ be defined by $\sigma(i)=0$ if $i\in M$, $\sigma(i)=1$ if $i>m$, and $\sigma(i)=-1$ if $i<-m+1$. Introduce a new multiplication $*$ on $Q$ by $x*y = xyh^{\sigma(i+j)}$, where $x\in \alpha^i$, $y\in\alpha^j$, $i\in M$ and $j\in M$. Then $(Q,*)$ is a Moufang loop, a \emph{cyclic modification}\index{modification!cyclic} of $Q$.}

 

\subsection{\textcolor{Chapter }{LoopByDihedralModification}}
\logpage{[ 8, 2, 2 ]}\nobreak
\hyperdef{L}{X7D7717C587BC2D1E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LoopByDihedralModification({\mdseries\slshape Q, S, e, f, h})\index{LoopByDihedralModification@\texttt{LoopByDihedralModification}}
\label{LoopByDihedralModification}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
The dihedral modification of a Moufang loop \mbox{\texttt{\mdseries\slshape Q}} obtained from \mbox{\texttt{\mdseries\slshape S}}, \mbox{\texttt{\mdseries\slshape e}}, \mbox{\texttt{\mdseries\slshape f}} and \mbox{\texttt{\mdseries\slshape h}} as described below.



Let $Q$ be a Moufang loop with a normal subloop $S$ such that $Q/S$ is a dihedral group of order $4m$, with $m\ge 1$. Let $M$ and $\sigma$ be defined as in the cyclic case. Let $\beta$, $\gamma$ be two involutions of $Q/S$ such that $\alpha=\beta\gamma$ generates a cyclic subgroup of $Q/S$ of order $2m$. Let $e\in\beta$ and $f\in\gamma$ be arbitrary. Then $Q$ can be written as a disjoint union $Q=\bigcup_{i\in M}(\alpha^i\cup e\alpha^i)$, and also $Q=\bigcup_{i\in M}(\alpha^i\cup \alpha^if)$. Let $G_0=\bigcup_{i\in M}\alpha^i$, and $G_1=L\setminus G_0$. Let $h\in S\cap N(L)\cap Z(G_0)$. Introduce a new multiplication $*$ on $Q$ by $x*y = xyh^{(-1)^r\sigma(i+j)}$, where $x\in\alpha^i\cup e\alpha^i$, $y\in\alpha^j\cup \alpha^jf$, $i\in M$, $j\in M$, $y\in G_r$ and $r\in\{0,1\}$. Then $(Q,*)$ is a Moufang loop, a \emph{dihedral modification}\index{modification!dihedral} of $Q$.}

 

\subsection{\textcolor{Chapter }{LoopMG2}}
\logpage{[ 8, 2, 3 ]}\nobreak
\hyperdef{L}{X7CC6CDB786E9BBA0}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LoopMG2({\mdseries\slshape G})\index{LoopMG2@\texttt{LoopMG2}}
\label{LoopMG2}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
The Chein loop constructed from a group \mbox{\texttt{\mdseries\slshape G}}.



Let $G$ be a group. Let $\overline{G}=\{\overline{g}|g\in G\}$ be a disjoint copy of elements of $G$. Define multiplication $*$ on $Q=G\cup \overline{G}$ by $g*h = gh$, $g*\overline{h}=\overline{hg}$, $\overline{g}*h = \overline{gh^{-1}}$ and $\overline{g}*\overline{h}=h^{-1}g$, where $g$, $h\in G$. Then $(Q,*)=M(G,2)$ is a so-called \emph{Chein loop}\index{Chein loop}\index{loop!Chein}, which is always a Moufang loop, and it is associative if and only if $G$ is commutative.}

 }

  
\section{\textcolor{Chapter }{Triality for Moufang Loops}}\label{Sec:TrialityForMoufangLoops}
\logpage{[ 8, 3, 0 ]}
\hyperdef{L}{X83E73A767D79FAFD}{}
{
  Let $G$ be a group and $\sigma$, $\rho$ be automorphisms of $G$ satisfying $\sigma^2 = \rho^3 = (\sigma \rho)^2 = 1$. Below we write automorphisms as exponents and $[g,\sigma]$ for $g^{-1}g^\sigma$. We say that the triple $(G,\rho,\sigma)$ is a \emph{group with triality}\index{group with triality} if $[g, \sigma] [g,\sigma]^\rho [g,\sigma]^{\rho^2} =1$ holds for all $g \in G$. It is known that one can associate a group with triality $(G,\rho,\sigma)$ in a canonical way with a Moufang loop $Q$. See \cite{NaVo2003} for more details. 

For any Moufang loop $Q$, we can calculate the triality group as a permutation group acting on $3|Q|$ points. If the multiplication group of $Q$ is polycyclic, then we can also represent the triality group as a pc group. In
both cases, the automorphisms $\sigma$ and $\rho$ are in the same family as the elements of $G$. 

\subsection{\textcolor{Chapter }{TrialityPermGroup}}
\logpage{[ 8, 3, 1 ]}\nobreak
\hyperdef{L}{X7DB4DE647F6F56F0}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{TrialityPermGroup({\mdseries\slshape Q})\index{TrialityPermGroup@\texttt{TrialityPermGroup}}
\label{TrialityPermGroup}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
A record with components \texttt{G}, \texttt{rho}, \texttt{sigma}, where \texttt{G} is the canonical group with triality associated with a Moufang loop \mbox{\texttt{\mdseries\slshape Q}}, and \texttt{rho}, \texttt{sigma} are the corresponding triality automorphisms.

}

 

\subsection{\textcolor{Chapter }{TrialityPcGroup}}
\logpage{[ 8, 3, 2 ]}\nobreak
\hyperdef{L}{X82CC977085DFDFE8}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{TrialityPcGroup({\mdseries\slshape Q})\index{TrialityPcGroup@\texttt{TrialityPcGroup}}
\label{TrialityPcGroup}
}\hfill{\scriptsize (function)}}\\


This is a variation of \texttt{TrialityPermGroup} in which \texttt{G} is returned as a pc group.}

 }

  
\section{\textcolor{Chapter }{Realizing Groups as Multiplication Groups of Loops}}\label{Sec:RealizingGroupsEtc}
\logpage{[ 8, 4, 0 ]}
\hyperdef{L}{X841ED66B8084AA73}{}
{
  It is difficult to determine which groups can occur as multiplication groups
of loops. 

The following operations search for loops whose multiplication groups are
contained within a specified transitive permutation group \mbox{\texttt{\mdseries\slshape G}}. In all these operations, one can speed up the search by increasing the
optional argument \mbox{\texttt{\mdseries\slshape depth}}, the price being a much higher memory consumption. The argument \mbox{\texttt{\mdseries\slshape depth}} is optimally chosen if in the permutation group \mbox{\texttt{\mdseries\slshape G}} there are not many permutations fixing \mbox{\texttt{\mdseries\slshape depth}} elements. It is safe to omit the argument or set it equal to 2. 

The optional argument \mbox{\texttt{\mdseries\slshape infolevel}} determines the amount of information displayed during the search. With \texttt{\mbox{\texttt{\mdseries\slshape infolevel}}=0}, no information is provided. With \texttt{\mbox{\texttt{\mdseries\slshape infolevel}}=1}, you get some information on timing and hits. With \texttt{\mbox{\texttt{\mdseries\slshape infolevel}}=2}, the results are printed as well. 

\subsection{\textcolor{Chapter }{AllLoopTablesInGroup}}
\logpage{[ 8, 4, 1 ]}\nobreak
\hyperdef{L}{X804F40087DD1225D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AllLoopTablesInGroup({\mdseries\slshape G[, depth[, infolevel]]})\index{AllLoopTablesInGroup@\texttt{AllLoopTablesInGroup}}
\label{AllLoopTablesInGroup}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
All Cayley tables of loops whose multiplication group is contained in the
transitive permutation group \mbox{\texttt{\mdseries\slshape G}}.

}

 

\subsection{\textcolor{Chapter }{AllProperLoopTablesInGroup}}
\logpage{[ 8, 4, 2 ]}\nobreak
\hyperdef{L}{X7854C8E382DC8E8B}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AllProperLoopTablesInGroup({\mdseries\slshape G[, depth[, infolevel]]})\index{AllProperLoopTablesInGroup@\texttt{AllProperLoopTablesInGroup}}
\label{AllProperLoopTablesInGroup}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
All Cayley tables of nonassociative loops whose multiplication group is
contained in the transitive permutation group \mbox{\texttt{\mdseries\slshape G}}.

}

 

\subsection{\textcolor{Chapter }{OneLoopTableInGroup}}
\logpage{[ 8, 4, 3 ]}\nobreak
\hyperdef{L}{X7BFFC66A824BA6AA}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{OneLoopTableInGroup({\mdseries\slshape G[, depth[, infolevel]]})\index{OneLoopTableInGroup@\texttt{OneLoopTableInGroup}}
\label{OneLoopTableInGroup}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
A Cayley table of a loop whose multiplication group is contained in the
transitive permutation group \mbox{\texttt{\mdseries\slshape G}}.

}

 

\subsection{\textcolor{Chapter }{OneProperLoopTableInGroup}}
\logpage{[ 8, 4, 4 ]}\nobreak
\hyperdef{L}{X84C5A76585B335FF}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{OneProperLoopTableInGroup({\mdseries\slshape G[, depth[, infolevel]]})\index{OneProperLoopTableInGroup@\texttt{OneProperLoopTableInGroup}}
\label{OneProperLoopTableInGroup}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
A Cayley table of a nonassociative loop whose multiplication group is
contained in the transitive permutation group \mbox{\texttt{\mdseries\slshape G}}.

}

 

\subsection{\textcolor{Chapter }{AllLoopsWithMltGroup}}
\logpage{[ 8, 4, 5 ]}\nobreak
\hyperdef{L}{X7E5F1C2879358EEF}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AllLoopsWithMltGroup({\mdseries\slshape G[, depth[, infolevel]]})\index{AllLoopsWithMltGroup@\texttt{AllLoopsWithMltGroup}}
\label{AllLoopsWithMltGroup}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
A list of all loops (given as sections) whose multiplication group is equal to
the transitive permutation group \mbox{\texttt{\mdseries\slshape G}}.

}

 

\subsection{\textcolor{Chapter }{OneLoopWithMltGroup}}
\logpage{[ 8, 4, 6 ]}\nobreak
\hyperdef{L}{X8266DE05824226E6}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{OneLoopWithMltGroup({\mdseries\slshape G[, depth[, infolevel]]})\index{OneLoopWithMltGroup@\texttt{OneLoopWithMltGroup}}
\label{OneLoopWithMltGroup}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
One loop (given as a section) whose multiplication group is equal to the
transitive permutation group \mbox{\texttt{\mdseries\slshape G}}.

}

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@g:=PGL(3,3);
|
  Group([ (6,7)(8,11)(9,13)(10,12), (1,2,5,7,13,3,8,6,10,9,12,4,11) ])
  !gapprompt@gap>| !gapinput@a:=AllLoopTablesInGroup(g,3,0);; Size(a);
|
  56
  !gapprompt@gap>| !gapinput@a:=AllLoopsWithMltGroup(g,3,0);; Size(a);
|
  52
\end{Verbatim}
 }

 }

  
\chapter{\textcolor{Chapter }{Libraries of Loops}}\label{Chap:LibrariesOfLoops}
\logpage{[ 9, 0, 0 ]}
\hyperdef{L}{X7BF3EE6E7953560D}{}
{
  Libraries of small loops form an integral part of \textsf{LOOPS}. The loops are stored in libraries up to isomorphism and, sometimes, up to
isotopism.  
\section{\textcolor{Chapter }{A Typical Library}}\label{Sec:ATypicalLibrary}
\logpage{[ 9, 1, 0 ]}
\hyperdef{L}{X874DFEAA79B3377C}{}
{
  A library named \emph{my Library} is stored in file \texttt{data/mylibrary.tbl}, and the corresponding data structure is named \texttt{LOOPS{\textunderscore}my{\textunderscore}library{\textunderscore}data}. For example, when the library is called \emph{left Bol}, the corresponding data file is called \texttt{data/leftbol.tbl} and the corresponding data structure is named \texttt{LOOPS{\textunderscore}left{\textunderscore}bol{\textunderscore}data}. 

In most cases, the array \texttt{LOOPS{\textunderscore}my{\textunderscore}library{\textunderscore}data} consists of three lists: 
\begin{itemize}
\item \texttt{LOOPS{\textunderscore}my{\textunderscore}library{\textunderscore}data[1]} is a list of orders for which there is at least one loop in the library,
\item \texttt{LOOPS{\textunderscore}my{\textunderscore}library{\textunderscore}data[2][k]} is the number of loops of order \texttt{LOOPS{\textunderscore}my{\textunderscore}library{\textunderscore}data[1][k]} in the library,
\item \texttt{LOOPS{\textunderscore}my{\textunderscore}library{\textunderscore}data[3][k][s]} contains data necessary to produce the \texttt{s}th loop of order \texttt{LOOPS{\textunderscore}my{\textunderscore}library{\textunderscore}data[1][k]} in the library.
\end{itemize}
 The format of \texttt{LOOPS{\textunderscore}my{\textunderscore}library{\textunderscore}data[3]} depends heavily on the particular library and is not standardized in any way.
The data is often coded to save space. 

\subsection{\textcolor{Chapter }{LibraryLoop}}
\logpage{[ 9, 1, 1 ]}\nobreak
\hyperdef{L}{X849865D6786EEF9B}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LibraryLoop({\mdseries\slshape libname, n, m})\index{LibraryLoop@\texttt{LibraryLoop}}
\label{LibraryLoop}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
The \mbox{\texttt{\mdseries\slshape m}}th loop of order \mbox{\texttt{\mdseries\slshape n}} from the library named \mbox{\texttt{\mdseries\slshape libname}}.

}

 

\subsection{\textcolor{Chapter }{MyLibraryLoop}}
\logpage{[ 9, 1, 2 ]}\nobreak
\hyperdef{L}{X78C4B8757902D49F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{MyLibraryLoop({\mdseries\slshape n, m})\index{MyLibraryLoop@\texttt{MyLibraryLoop}}
\label{MyLibraryLoop}
}\hfill{\scriptsize (function)}}\\


This is a template function that retrieves the \mbox{\texttt{\mdseries\slshape m}}th loop of order \mbox{\texttt{\mdseries\slshape n}} from the library named \emph{my library}.}

 

For example, the \mbox{\texttt{\mdseries\slshape m}}th left Bol loop of order \mbox{\texttt{\mdseries\slshape n}} is obtained via \texttt{LeftBolLoop(\mbox{\texttt{\mdseries\slshape n}},\mbox{\texttt{\mdseries\slshape m}})} or via \texttt{LibraryLoop("left Bol",\mbox{\texttt{\mdseries\slshape n}},\mbox{\texttt{\mdseries\slshape m}})}. 

\subsection{\textcolor{Chapter }{DisplayLibraryInfo}}
\logpage{[ 9, 1, 3 ]}\nobreak
\hyperdef{L}{X7A64372E81E713B4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DisplayLibraryInfo({\mdseries\slshape libname})\index{DisplayLibraryInfo@\texttt{DisplayLibraryInfo}}
\label{DisplayLibraryInfo}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
Brief information about the loops contained in the library named \mbox{\texttt{\mdseries\slshape libname}}.\\


}

 

We are now going to describe the individual libraries. }

  
\section{\textcolor{Chapter }{Left Bol Loops and Right Bol Loops}}\label{Sec:LeftBolLoopsEtc}
\logpage{[ 9, 2, 0 ]}
\hyperdef{L}{X7DF21BD685FBF258}{}
{
  The library named \emph{left Bol} contains all nonassociative left Bol loops of order less than 17, including
Moufang loops, as well as all left Bol loops of order $pq$ for primes $p>q>2$. There are 6 such loops of order 8, 1 of order 12, 2 of order 15, 2038 of
order 16, and $(p+q-4)/2$ of order $pq$. 

The classification of left Bol loops of order 16 was first accomplished by
Moorhouse \cite{Mo}. Our library was generated independently and it agrees with Moorhouse's
results. The left Bol loops of order $pq$ were classified in \cite{KiNaVo2015}. 

\subsection{\textcolor{Chapter }{LeftBolLoop}}
\logpage{[ 9, 2, 1 ]}\nobreak
\hyperdef{L}{X7EE99F647C537994}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LeftBolLoop({\mdseries\slshape n, m})\index{LeftBolLoop@\texttt{LeftBolLoop}}
\label{LeftBolLoop}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
The \mbox{\texttt{\mdseries\slshape m}}th left Bol loop of order \mbox{\texttt{\mdseries\slshape n}} in the library.

}

 

\subsection{\textcolor{Chapter }{RightBolLoop}}
\logpage{[ 9, 2, 2 ]}\nobreak
\hyperdef{L}{X8774304282654C58}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RightBolLoop({\mdseries\slshape n, m})\index{RightBolLoop@\texttt{RightBolLoop}}
\label{RightBolLoop}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
The \mbox{\texttt{\mdseries\slshape m}}th right Bol loop of order \mbox{\texttt{\mdseries\slshape n}} in the library.

}

 

\textsc{Remark:} Only left Bol loops are stored in the library. Right Bol loops are retrieved
by calling \texttt{Opposite} on left Bol loops. }

  
\section{\textcolor{Chapter }{Moufang Loops}}\label{Sec:MoufangLoops}
\logpage{[ 9, 3, 0 ]}
\hyperdef{L}{X7953702D84E60AF4}{}
{
  The library named \emph{Moufang} contains all nonassociative Moufang loops of order $n\le 64$ and $n\in\{81,243\}$. 

\subsection{\textcolor{Chapter }{MoufangLoop}}
\logpage{[ 9, 3, 1 ]}\nobreak
\hyperdef{L}{X81E82098822543EE}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{MoufangLoop({\mdseries\slshape n, m})\index{MoufangLoop@\texttt{MoufangLoop}}
\label{MoufangLoop}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
The \mbox{\texttt{\mdseries\slshape m}}th Moufang loop of order \mbox{\texttt{\mdseries\slshape n}} in the library.

}

 

For $n\le 63$, our catalog numbers coincide with those of Goodaire et al. \cite{Go}. The classification of Moufang loops of order 64 and 81 was carried out in \cite{NaVo2007}. The classification of Moufang loops of order 243 was carried out by Slattery
and Zenisek \cite{SlZe2011}. 

The extent of the library is summarized below: 
\[ \begin{array}{r|rrrrrrrrrrrrrrrrrr}
order&12&16&20&24&28&32&36&40&42&44&48&52&54&56&60&64&81&243\cr loops&1 &5 &1
&5 &1 &71&4 &5 &1 &1 &51&1 &2 &4 &5 &4262& 5 &72 \end{array} \]
 

The \emph{octonion loop}\index{octonion loop}\index{loop!octonion} of order 16 (i.e., the multiplication loop of the basis elements in the
8-dimensional standard real octonion algebra) can be obtained as \texttt{MoufangLoop(16,3)}. }

  
\section{\textcolor{Chapter }{Code Loops}}\label{Sec:CodeLoops}
\logpage{[ 9, 4, 0 ]}
\hyperdef{L}{X7BCA6BCB847F79DC}{}
{
  The library named \emph{code} contains all nonassociative code loops of order less than 65. There are 5 such
loops of order 16, 16 of order 32, and 80 of order 64, all Moufang. The
library merely points to the corresponding Moufang loops. See \cite{NaVo2007} for a classification of small code loops. 

\subsection{\textcolor{Chapter }{CodeLoop}}
\logpage{[ 9, 4, 1 ]}\nobreak
\hyperdef{L}{X7DB4D3B27BB4D7EE}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CodeLoop({\mdseries\slshape n, m})\index{CodeLoop@\texttt{CodeLoop}}
\label{CodeLoop}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
The \mbox{\texttt{\mdseries\slshape m}}th code loop of order \mbox{\texttt{\mdseries\slshape n}} in the library.

}

 }

  
\section{\textcolor{Chapter }{Steiner Loops}}\label{Sec:SteinerLoops}
\logpage{[ 9, 5, 0 ]}
\hyperdef{L}{X84E941EE7846D3EE}{}
{
  Here is how the libary named \emph{Steiner} is described within \textsf{LOOPS}: 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@DisplayLibraryInfo( "Steiner" );
|
  The library contains all nonassociative Steiner loops of order less or equal to 16.
  It also contains the associative Steiner loops of order 4 and 8.
  ------
  Extent of the library:
     1 loop of order 4
     1 loop of order 8
     1 loop of order 10
     2 loops of order 14
     80 loops of order 16
  true
\end{Verbatim}
 

Our labeling of Steiner loops of order 16 coincides with the labeling of
Steiner triple systems of order 15 in \cite{CoRo}. 

\subsection{\textcolor{Chapter }{SteinerLoop}}
\logpage{[ 9, 5, 1 ]}\nobreak
\hyperdef{L}{X87C235457E859AF4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SteinerLoop({\mdseries\slshape n, m})\index{SteinerLoop@\texttt{SteinerLoop}}
\label{SteinerLoop}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
The \mbox{\texttt{\mdseries\slshape m}}th Steiner loop of order \mbox{\texttt{\mdseries\slshape n}} in the library.

}

 }

  
\section{\textcolor{Chapter }{Conjugacy Closed Loops}}\label{Sec:ConjugacyClosedLoops}
\logpage{[ 9, 6, 0 ]}
\hyperdef{L}{X867E5F0783FEB8B5}{}
{
  The library named \emph{RCC} contains all nonassocitive right conjugacy closed loops of order $n\le 27$ up to isomorphism. The data for the library was generated by Katharina Artic \cite{Artic} who can also provide additional data for all right conjugacy closed loops of
order $n\le 31$. 

Let $Q$ be a right conjugacy closed loop, $G$ its right multiplication group and $T$ its right section. Then $\langle T\rangle = G$ is a transitive group, and $T$ is a union of conjugacy classes of $G$. Every right conjugacy closed loop of order $n$ can therefore be represented as a union of certain conjugacy classes of a
transitive group of degree $n$. This is how right conjugacy closed loops of order less than $28$ are represented in \textsf{LOOPS}. The following table summarizes the number of right conjugacy closed loops of
a given order up to isomorphism: 
\[ \begin{array}{r|rrrrrrrrrrrrrrrr} order &6& 8&9&10& 12&14&15& 16& 18& 20&\cr
loops &3&19&5&16&155&97& 17&6317&1901&8248&\cr \hline order &21& 22& 24& 25&
26& 27\cr loops &119&10487&471995& 119&151971&152701 \end{array} \]
 
\subsection{\textcolor{Chapter }{RCCLoop and RightConjugacyClosedLoop}}\logpage{[ 9, 6, 1 ]}
\hyperdef{L}{X806B2DE67990E42F}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RCCLoop({\mdseries\slshape n, m})\index{RCCLoop@\texttt{RCCLoop}}
\label{RCCLoop}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RightConjugacyClosedLoop({\mdseries\slshape n, m})\index{RightConjugacyClosedLoop@\texttt{RightConjugacyClosedLoop}}
\label{RightConjugacyClosedLoop}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
The \mbox{\texttt{\mdseries\slshape m}}th right conjugacy closed loop of order \mbox{\texttt{\mdseries\slshape n}} in the library.

}

 
\subsection{\textcolor{Chapter }{LCCLoop and LeftConjugacyClosedLoop}}\logpage{[ 9, 6, 2 ]}
\hyperdef{L}{X80AB8B107D55FB19}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LCCLoop({\mdseries\slshape n, m})\index{LCCLoop@\texttt{LCCLoop}}
\label{LCCLoop}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LeftConjugacyClosedLoop({\mdseries\slshape n, m})\index{LeftConjugacyClosedLoop@\texttt{LeftConjugacyClosedLoop}}
\label{LeftConjugacyClosedLoop}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
The \mbox{\texttt{\mdseries\slshape m}}th left conjugacy closed loop of order \mbox{\texttt{\mdseries\slshape n}} in the library.



\textsc{Remark:} Only the right conjugacy closed loops are stored in the library. Left
conjugacy closed loops are obtained from right conjugacy closed loops via \texttt{Opposite}.\\
}

 

The library named \emph{CC} contains all nonassociative conjugacy closed loops of order $n\le 27$ and also of orders $2p$ and $p^2$ for all primes $p$. 

By results of Kunen \cite{Kun}, for every odd prime $p$ there are precisely 3 nonassociative conjugacy closed loops of order $p^2$. Cs{\"o}rg{\H o} and Dr{\a'a}pal \cite{CsDr} described these 3 loops by multiplicative formulas on $\mathbb{Z}_{p^2}$ and $\mathbb{Z}_p \times \mathbb{Z}_p$ as follows: 
\begin{itemize}
\item Case $m = 1$:Let $k$ be the smallest positive integer relatively prime to $p$ and such that $k$ is a square modulo $p$ (i.e., $k=1$). Define multiplication on $\mathbb{Z}_{p^2}$ by $x\cdot y = x + y + kpx^2y$.
\item Case $m = 2$: Let $k$ be the smallest positive integer relatively prime to $p$ and such that $k$ is not a square modulo $p$. Define multiplication on $\mathbb{Z}_{p^2}$ by $x\cdot y = x + y + kpx^2y$.
\item Case $m = 3$: Define multiplication on $\mathbb{Z}_p \times \mathbb{Z}_p$ by $(x,a)(y,b) = (x+y, a+b+x^2y )$.
\end{itemize}
 

Moreover, Wilson \cite{Wi} constructed a nonassociative conjugacy closed loop of order $2p$ for every odd prime $p$, and Kunen \cite{Kun} showed that there are no other nonassociative conjugacy closed oops of this
order. Here is the relevant multiplication formula on $\mathbb{Z}_2 \times \mathbb{Z}_p$: $(0,m)(0,n) = ( 0, m + n )$, $(0,m)(1,n) = ( 1, -m + n )$, $(1,m)(0,n) = ( 1, m + n)$, $(1,m)(1,n) = ( 0, 1 - m + n )$. 
\subsection{\textcolor{Chapter }{CCLoop and ConjugacyClosedLoop}}\logpage{[ 9, 6, 3 ]}
\hyperdef{L}{X798BC601843E8916}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CCLoop({\mdseries\slshape n, m})\index{CCLoop@\texttt{CCLoop}}
\label{CCLoop}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ConjugacyClosedLoop({\mdseries\slshape n, m})\index{ConjugacyClosedLoop@\texttt{ConjugacyClosedLoop}}
\label{ConjugacyClosedLoop}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
The \mbox{\texttt{\mdseries\slshape m}}th conjugacy closed loop of order \mbox{\texttt{\mdseries\slshape n}} in the library.

}

 }

  
\section{\textcolor{Chapter }{Small Loops}}\label{Sec:SmallLoops}
\logpage{[ 9, 7, 0 ]}
\hyperdef{L}{X7E3A8F2C790F2CA1}{}
{
  The library named \emph{small} contains all nonassociative loops of order 5 and 6. There are 5 and 107 such
loops, respectively. 

\subsection{\textcolor{Chapter }{SmallLoop}}
\logpage{[ 9, 7, 1 ]}\nobreak
\hyperdef{L}{X7C6EE23E84CD87D3}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SmallLoop({\mdseries\slshape n, m})\index{SmallLoop@\texttt{SmallLoop}}
\label{SmallLoop}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
The \mbox{\texttt{\mdseries\slshape m}}th loop of order \mbox{\texttt{\mdseries\slshape n}} in the library.

}

 }

  
\section{\textcolor{Chapter }{Paige Loops}}\label{Sec:PaigeLoops}
\logpage{[ 9, 8, 0 ]}
\hyperdef{L}{X8135C8FD8714C606}{}
{
  \emph{Paige loops}\index{Paige loop}\index{loop!Paige} are nonassociative finite simple Moufang loops. By \cite{Li}, there is precisely one Paige loop for every finite field. 

The library named \emph{Paige} contains the smallest nonassociative simple Moufang loop. 

\subsection{\textcolor{Chapter }{PaigeLoop}}
\logpage{[ 9, 8, 1 ]}\nobreak
\hyperdef{L}{X7FCF4D6B7AD66D74}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PaigeLoop({\mdseries\slshape q})\index{PaigeLoop@\texttt{PaigeLoop}}
\label{PaigeLoop}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
The Paige loop constructed over the finite field of order \mbox{\texttt{\mdseries\slshape q}}. Only the case \texttt{\mbox{\texttt{\mdseries\slshape q}}=2} is implemented.

}

 }

  
\section{\textcolor{Chapter }{Nilpotent Loops}}\label{Sec:NilpotentLoops}
\logpage{[ 9, 9, 0 ]}
\hyperdef{L}{X86695C577A4D1784}{}
{
  The library named \emph{nilpotent} contains all nonassociative nilpotent loops of order less than 12 up to
isomorphism. There are 2 nonassociative nilpotent loops of order 6, 134 of
order 8, 8 of order 9 and 1043 of order 10. 

See \cite{DaVo} for more on enumeration of nilpotent loops. For instance, there are 2623755
nilpotent loops of order 12, and 123794003928541545927226368 nilpotent loops
of order 22. 

\subsection{\textcolor{Chapter }{NilpotentLoop}}
\logpage{[ 9, 9, 1 ]}\nobreak
\hyperdef{L}{X7A9C960D86E2AD28}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NilpotentLoop({\mdseries\slshape n, m})\index{NilpotentLoop@\texttt{NilpotentLoop}}
\label{NilpotentLoop}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
The \mbox{\texttt{\mdseries\slshape m}}th nilpotent loop of order \mbox{\texttt{\mdseries\slshape n}} in the library.

}

 }

  
\section{\textcolor{Chapter }{Automorphic Loops}}\label{Sec:AutomorphicLoops}
\logpage{[ 9, 10, 0 ]}
\hyperdef{L}{X793B22EA8643C667}{}
{
  The library named \emph{automorphic} contains all nonassociative automorphic loops of order less than 16 up to
isomorphism. There is 1 such loop of order 6, 7 of order 8, 3 of order 10, 2
of order 12, 5 of order 14, and 2 of order 15. 

\subsection{\textcolor{Chapter }{AutomorphicLoop}}
\logpage{[ 9, 10, 1 ]}\nobreak
\hyperdef{L}{X784FFA9E7FDA9F43}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AutomorphicLoop({\mdseries\slshape n, m})\index{AutomorphicLoop@\texttt{AutomorphicLoop}}
\label{AutomorphicLoop}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
The \mbox{\texttt{\mdseries\slshape m}}th automorphic loop of order \mbox{\texttt{\mdseries\slshape n}} in the library.

}

 }

  
\section{\textcolor{Chapter }{Interesting Loops}}\label{Sec:InterestingLoops}
\logpage{[ 9, 11, 0 ]}
\hyperdef{L}{X843BD73F788049F7}{}
{
  The library named \emph{interesting} contains some loops that are illustrative in the theory of loops. At this
point, the library contains a nonassociative loop of order 5, a nonassociative
nilpotent loop of order 6, a non-Moufang left Bol loop of order 16, the loop
of sedenions\index{sedenion loop}\index{loop!sedenion} of order 32 (sedenions generalize octonions), and the unique nonassociative
simple right Bol loop of order 96 and exponent 2. 

\subsection{\textcolor{Chapter }{InterestingLoop}}
\logpage{[ 9, 11, 1 ]}\nobreak
\hyperdef{L}{X87F24AD3811910D3}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{InterestingLoop({\mdseries\slshape n, m})\index{InterestingLoop@\texttt{InterestingLoop}}
\label{InterestingLoop}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
The \mbox{\texttt{\mdseries\slshape m}}th interesting loop of order \mbox{\texttt{\mdseries\slshape n}} in the library.

}

 }

  
\section{\textcolor{Chapter }{Libraries of Loops Up To Isotopism}}\label{Sec:LibrariesOfLoopsUpToIsotopism}
\logpage{[ 9, 12, 0 ]}
\hyperdef{L}{X864839227D5C0A90}{}
{
  For the library named \emph{small} we also provide the corresponding library of loops up to isotopism. In
general, given a library named \emph{libname}, the corresponding library of loops up to isotopism is named \emph{itp lib}, and the loops can be retrieved by the template \texttt{ItpLibLoop(n,m)}. 

\subsection{\textcolor{Chapter }{ItpSmallLoop}}
\logpage{[ 9, 12, 1 ]}\nobreak
\hyperdef{L}{X850C4C01817A098D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ItpSmallLoop({\mdseries\slshape n, m})\index{ItpSmallLoop@\texttt{ItpSmallLoop}}
\label{ItpSmallLoop}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
The \mbox{\texttt{\mdseries\slshape m}}th small loop of order \mbox{\texttt{\mdseries\slshape n}} up to isotopism in the library.

}

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@SmallLoop( 6, 14 );
|
  <small loop 6/14>
  !gapprompt@gap>| !gapinput@ItpSmallLoop( 6, 14 );
|
  <small loop 6/42>
  !gapprompt@gap>| !gapinput@LibraryLoop( "itp small", 6, 14 );
|
  <small loop 6/42>
\end{Verbatim}
 

Note that loops up to isotopism form a subset of the corresponding library of
loops up to isomorphism. For instance, the above example shows that the 14th
small loop of order 6 up to isotopism is in fact the 42nd small loop of order
6 up to isomorphism. }

 }

 

\appendix


\chapter{\textcolor{Chapter }{Files}}\label{Apx:Files}
\logpage{[ "A", 0, 0 ]}
\hyperdef{L}{X7BC4571A79FFB7D0}{}
{
  Below is a list of all relevant files forming the \textsf{LOOPS} package. Some technical files are not included. A typical user will not need
to know any of this information. All paths are relative to the \texttt{pkg/loops} folder. \\
\\
\texttt{../README.loops} (installation and usage instructions) \\
\texttt{init.g} (declarations) \\
\texttt{PackageInfo.g} (loading info for GAP 4.4) \\
\texttt{read.g} (implementations) \\
\texttt{data/automorphic.tbl} (library of automorphic loops) \\
\texttt{data/cc.tbl} (library of conjugacy closed loops) \\
\texttt{data/code.tbl} (library of code loops) \\
\texttt{data/interesting.tbl} (library of interesting loops) \\
\texttt{data/itp{\textunderscore}small.tbl} (library of small loops up to isotopism) \\
\texttt{data/leftbol.tbl} (library of left Bol loops) \\
\texttt{data/moufang.tbl} (library of Moufang loops) \\
\texttt{data/nilpotent.tbl} (library of small nilpotent loops) \\
\texttt{data/rcc.tbl} (library of right conjugacy closed loops) \\
\texttt{data/rcc/*.*} (additional files for the library of right conjugacy closed loops) \\
\texttt{data/paige.tbl} (library of Paige loops) \\
\texttt{data/small.tbl} (library of small loops) \\
\texttt{data/steiner.tbl} (library of Steiner loops) \\
\texttt{doc/*.*} (all documentation files) \\
\texttt{doc/loops.xml} (the main documentation file for GAPDoc) \\
\texttt{doc/loops.bib} (the main bibliography file for documentation) \\
\texttt{gap/banner.g} (banner of LOOPS) \\
\texttt{gap/bol{\textunderscore}core{\textunderscore}methods.gd .gi} (core methods for Bol loops) \\
\texttt{gap/classes.gd .gi} (properties of quasigroups and loops) \\
\texttt{gap/convert.gd .gi} (methods for data conversion and compression) \\
\texttt{gap/core{\textunderscore}methods.gd .gi} (core methods for quasigroups and loops) \\
\texttt{gap/elements.gd .gi} (elements and basic arithmetic operations) \\
\texttt{gap/examples.gd .gi} (methods for libraries of loops) \\
\texttt{gap/extensions.gd .gi} (methods for extensions of loops) \\
\texttt{gap/iso.gd .gi} (methods for isomorphisms and isotopisms of loops) \\
\texttt{gap/memory.gd .gi} (memory management) \\
\texttt{gap/mlt{\textunderscore}search.gd .gi} (realizing groups as multiplication groups of loops) \\
\texttt{gap/moufang{\textunderscore}modifications.gd .gi} (methods for Moufang modifications) \\
\texttt{gap/moufang{\textunderscore}triality.gd .gi} (methods for triality of Moufang loops) \\
\texttt{gap/quasigroups.gd .gi} (representing, creating and displaying quasigroups) \\
\texttt{gap/random.gd .gi} (random quasigroups and loops) \\
\texttt{tst/bol.tst} (test file for Bol loops) \\
\texttt{tst/core{\textunderscore}methods.tst} (test file for core methods) \\
\texttt{tst/iso.tst} (test file for isomorphisms and automorphisms) \\
\texttt{tst/lib.tst} (test file for libraries of loops, except Moufang loops) \\
\texttt{tst/nilpot.tst} (test file for nilpotency and triality) \\
\texttt{tst/testall.g} (batch for all tets files) }


\chapter{\textcolor{Chapter }{Filters}}\label{Apx:Filters}
\logpage{[ "B", 0, 0 ]}
\hyperdef{L}{X84EFA4C07D4277BB}{}
{
  Many implications among properties of loops are built directly into \textsf{LOOPS}. A sizeable portion of these properties are of trivial character or are based
on definitions (e.g., alternative loops $=$ left alternative loops $+$ right alternative loops). The remaining implications are theorems. 

All filters of \textsf{LOOPS} are summarized below, using the \textsf{GAP} convention that the property on the left is implied by the property
(properties) on the right. \\
\\
 \texttt{( IsExtraLoop, IsAssociative and IsLoop )} \\
\texttt{( IsExtraLoop, IsCodeLoop )} \\
\texttt{( IsCCLoop, IsCodeLoop )} \\
\texttt{( HasTwosidedInverses, IsPowerAssociative )} \\
\texttt{( IsPowerAlternative, IsDiassociative )} \\
\texttt{( IsFlexible, IsDiassociative )} \\
\texttt{( HasAntiautomorphicInverseProperty, HasAutomorphicInverseProperty and
IsCommutative )} \\
\texttt{( HasAutomorphicInverseProperty, HasAntiautomorphicInverseProperty and
IsCommutative )} \\
\texttt{( HasLeftInverseProperty, HasInverseProperty )} \\
\texttt{( HasRightInverseProperty, HasInverseProperty )} \\
\texttt{( HasWeakInverseProperty, HasInverseProperty )} \\
\texttt{( HasAntiautomorphicInverseProperty, HasInverseProperty )} \\
\texttt{( HasTwosidedInverses, HasAntiautomorphicInverseProperty )} \\
\texttt{( HasInverseProperty, HasLeftInverseProperty and IsCommutative )} \\
\texttt{( HasInverseProperty, HasRightInverseProperty and IsCommutative )} \\
\texttt{( HasInverseProperty, HasLeftInverseProperty and HasRightInverseProperty )} \\
\texttt{( HasInverseProperty, HasLeftInverseProperty and HasWeakInverseProperty )} \\
\texttt{( HasInverseProperty, HasRightInverseProperty and HasWeakInverseProperty )} \\
\texttt{( HasInverseProperty, HasLeftInverseProperty and
HasAntiautomorphicInverseProperty )} \\
\texttt{( HasInverseProperty, HasRightInverseProperty and
HasAntiautomorphicInverseProperty )} \\
\texttt{( HasInverseProperty, HasWeakInverseProperty and
HasAntiautomorphicInverseProperty )} \\
\texttt{( HasTwosidedInverses, HasLeftInverseProperty )} \\
\texttt{( HasTwosidedInverses, HasRightInverseProperty )} \\
\texttt{( HasTwosidedInverses, IsFlexible and IsLoop )} \\
\texttt{( IsMoufangLoop, IsExtraLoop )} \\
\texttt{( IsCLoop, IsExtraLoop )} \\
\texttt{( IsExtraLoop, IsMoufangLoop and IsLeftNuclearSquareLoop )} \\
\texttt{( IsExtraLoop, IsMoufangLoop and IsMiddleNuclearSquareLoop )} \\
\texttt{( IsExtraLoop, IsMoufangLoop and IsRightNuclearSquareLoop )} \\
\texttt{( IsLeftBolLoop, IsMoufangLoop )} \\
\texttt{( IsRightBolLoop, IsMoufangLoop )} \\
\texttt{( IsDiassociative, IsMoufangLoop )} \\
\texttt{( IsMoufangLoop, IsLeftBolLoop and IsRightBolLoop )} \\
\texttt{( IsLCLoop, IsCLoop )} \\
\texttt{( IsRCLoop, IsCLoop )} \\
\texttt{( IsDiassociative, IsCLoop and IsFlexible)} \\
\texttt{( IsCLoop, IsLCLoop and IsRCLoop )} \\
\texttt{( IsRightBolLoop, IsLeftBolLoop and IsCommutative )} \\
\texttt{( IsLeftPowerAlternative, IsLeftBolLoop )} \\
\texttt{( IsLeftBolLoop, IsRightBolLoop and IsCommutative )} \\
\texttt{( IsRightPowerAlternative, IsRightBolLoop )} \\
\texttt{( IsLeftPowerAlternative, IsLCLoop )} \\
\texttt{( IsLeftNuclearSquareLoop, IsLCLoop )} \\
\texttt{( IsMiddleNuclearSquareLoop, IsLCLoop )} \\
\texttt{( IsRCLoop, IsLCLoop and IsCommutative )} \\
\texttt{( IsRightPowerAlternative, IsRCLoop )} \\
\texttt{( IsRightNuclearSquareLoop, IsRCLoop )} \\
\texttt{( IsMiddleNuclearSquareLoop, IsRCLoop )} \\
\texttt{( IsLCLoop, IsRCLoop and IsCommutative )} \\
\texttt{( IsRightNuclearSquareLoop, IsLeftNuclearSquareLoop and IsCommutative )} \\
\texttt{( IsLeftNuclearSquareLoop, IsRightNuclearSquareLoop and IsCommutative )} \\
\texttt{( IsLeftNuclearSquareLoop, IsNuclearSquareLoop )} \\
\texttt{( IsRightNuclearSquareLoop, IsNuclearSquareLoop )} \\
\texttt{( IsMiddleNuclearSquareLoop, IsNuclearSquareLoop )} \\
\texttt{( IsNuclearSquareLoop, IsLeftNuclearSquareLoop and IsRightNuclearSquareLoop} \\
\texttt{ and IsMiddleNuclearSquareLoop )} \\
\texttt{( IsFlexible, IsCommutative )} \\
\texttt{( IsRightAlternative, IsLeftAlternative and IsCommutative )} \\
\texttt{( IsLeftAlternative, IsRightAlternative and IsCommutative )} \\
\texttt{( IsLeftAlternative, IsAlternative )} \\
\texttt{( IsRightAlternative, IsAlternative )} \\
\texttt{( IsAlternative, IsLeftAlternative and IsRightAlternative )} \\
\texttt{( IsLeftAlternative, IsLeftPowerAlternative )} \\
\texttt{( HasLeftInverseProperty, IsLeftPowerAlternative )} \\
\texttt{( IsPowerAssociative, IsLeftPowerAlternative )} \\
\texttt{( IsRightAlternative, IsRightPowerAlternative )} \\
\texttt{( HasRightInverseProperty, IsRightPowerAlternative )} \\
\texttt{( IsPowerAssociative, IsRightPowerAlternative )} \\
\texttt{( IsLeftPowerAlternative, IsPowerAlternative )} \\
\texttt{( IsRightPowerAlternative, IsPowerAlternative )} \\
\texttt{( IsAssociative, IsLCCLoop and IsCommutative )} \\
\texttt{( IsExtraLoop, IsLCCLoop and IsMoufangLoop )} \\
\texttt{( IsAssociative, IsRCCLoop and IsCommutative )} \\
\texttt{( IsExtraLoop, IsRCCLoop and IsMoufangLoop )} \\
\texttt{( IsLCCLoop, IsCCLoop )} \\
\texttt{( IsRCCLoop, IsCCLoop )} \\
\texttt{( IsCCLoop, IsLCCLoop and IsRCCLoop )} \\
\texttt{( IsOsbornLoop, IsMoufangLoop )} \\
\texttt{( IsOsbornLoop, IsCCLoop )} \\
\texttt{( HasAutomorphicInverseProperty, IsLeftBruckLoop )} \\
\texttt{( IsLeftBolLoop, IsLeftBruckLoop )} \\
\texttt{( IsRightBruckLoop, IsLeftBruckLoop and IsCommutative )} \\
\texttt{( IsLeftBruckLoop, IsLeftBolLoop and HasAutomorphicInverseProperty )} \\
\texttt{( HasAutomorphicInverseProperty, IsRightBruckLoop )} \\
\texttt{( IsRightBolLoop, IsRightBruckLoop )} \\
\texttt{( IsLeftBruckLoop, IsRightBruckLoop and IsCommutative )} \\
\texttt{( IsRightBruckLoop, IsRightBolLoop and HasAutomorphicInverseProperty )} \\
\texttt{( IsCommutative, IsSteinerLoop )} \\
\texttt{( IsCLoop, IsSteinerLoop )} \\
\texttt{( IsLeftAutomorphicLoop, IsAutomorphicLoop )} \\
\texttt{( IsRightAutomorphicLoop, IsAutomorphicLoop )} \\
\texttt{( IsMiddleAutomorphicLoop, IsAutomorphicLoop )} \\
\texttt{( IsMiddleAutomorphicLoop, IsCommutative )} \\
\texttt{( IsAutomorphicLoop, IsLeftAutomorphicLoop and IsCommutative )} \\
\texttt{( IsAutomorphicLoop, IsRightAutomorphicLoop and IsCommutative )} \\
\texttt{( IsLeftAutomorphicLoop, IsRightAutomorphicLoop and
HasAntiautomorphicInverseProperty )} \\
\texttt{( IsRightAutomorphicLoop, IsLeftAutomorphicLoop and
HasAntiautomorphicInverseProperty )} \\
\texttt{( IsFlexible, IsMiddleAutomorphicLoop )} \\
\texttt{( HasAntiautomorphicInverseProperty, IsFlexible and IsLeftAutomorphicLoop )} \\
\texttt{( HasAntiautomorphicInverseProperty, IsFlexible and IsRightAutomorphicLoop )} \\
\texttt{( IsMoufangLoop, IsAutomorphicLoop and IsLeftAlternative )} \\
\texttt{( IsMoufangLoop, IsAutomorphicLoop and IsRightAlternative )} \\
\texttt{( IsMoufangLoop, IsAutomorphicLoop and HasLeftInverseProperty )} \\
\texttt{( IsMoufangLoop, IsAutomorphicLoop and HasRightInverseProperty )} \\
\texttt{( IsMoufangLoop, IsAutomorphicLoop and HasWeakInverseProperty )} \\
\texttt{( IsLeftAutomorphicLoop, IsLeftBruckLoop )} \\
\texttt{( IsLeftAutomorphicLoop, IsLCCLoop )} \\
\texttt{( IsRightAutomorphicLoop, IsRightBruckLoop )} \\
\texttt{( IsRightAutomorphicLoop, IsRCCLoop )} \\
\texttt{( IsAutomorphicLoop, IsCommutative and IsMoufangLoop )} }

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

\bibliographystyle{alpha}
\bibliography{loops_bib.xml}

\addcontentsline{toc}{chapter}{References}

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

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


\printindex

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