\Chapter{Basic methods and attributes}

We describe the basic core methods and attributes of the {\LOOPS} package in this chapter.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Basic attributes}

We associate many attributes with quasigroups in order to speed up computation.
This section lists some basic attributes of quasigroups and loops.

The list of elements of a quasigroup $Q$ is obtained by the usual command

\>Elements( <Q> ) A

The Cayley table of a quasigroup $Q$ is returned with

\>CayleyTable( <Q> ) A

One can use `Display( CayleyTable( <Q> ) )' for pretty matrix-style output of
small Cayley tables.

The neutral element of a loop $L$ is obtained via

\>One( <L> ) A

If you want to know if a quasigroup $Q$ has a neutral element, you can find out
with the standard function for magmas

\>MultiplicativeNeutralElement( <Q> ) A

The size of a quasigroup $Q$ is calculated by

\>Size( <Q> ) A

When $L$ is a <power associative loop>\index{power
associative!loop}\index{loop!power associative}, i.e., the powers of elements
are well-defined in $L$, the <exponent>\index{exponent} of $L$ is the smallest
positive integer divisible by orders of all elements of $L$. The following
attribute calculates the exponent without testing for power-associativity:

\>Exponent( <L> ) A

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Basic arithmetic operations}

Each quasigroup element in {\GAP} knows which quasigroup it belongs to. 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 {\GAP}.
Since multiplication of at least three elements is ambiguous in the
nonassociative case, we by default parenthesize elements 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.

Universal algebraists introduce two additional operations for quasigroups.
Namely the <left division>\index{division!left} $x\backslash y$ defined by
$x\cdot(x\backslash y)=y$, and the <right division>\index{division!right} $x/y$
defined by $(x/y)\cdot y=x$. These two operations can be found in {\LOOPS} as:

\>LeftDivision( <x>, <y> ) O
\>RightDivision( <x>, <y> ) O

When $Q$ is a quasigroup, $x$ is an element of $Q$, and $S$ is a list of
elements of $Q$, then

\>LeftDivision( <S>, <x> ) O
\>LeftDivision( <x>, <S> ) O
\>RightDivision( <S>, <x> ) O
\>RightDivision( <x>, <S> ) O

returns the list of elements obtained by performing the respective
division of $S$ by $x$, or of $x$ by $S$, using one element of $S$ at a time.

We also support $/$ in place of `RightDivision'. But we do not support
$\backslash$ in place of `LeftDivision'.

To obtain the Cayley tables for the operation left division or
right division, use

\>LeftDivisionCayleyTable( <Q> ) O
\>RightDivisionCayleyTable( <Q> ) O

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Powers and inverses}

Powers of elements are generally not well-defined in quasigroups. We say that
the quasigroup $Q$ is <power associative>\index{power
associative!quasigroup}\index{quasigroup!power associative}, if for any $x\in
Q$, the submagma generated by $x$ is associative.

For magmas and positive integer exponents, {\GAP} defines the 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 $\log_2(k)$ steps. For
{\LOOPS}, we have decided to keep this method, hoping that everybody will use
it with care for quasigroups that are not power associative.

Let $x$ be an element of a loop $L$ with neutral element $1$. Then the <left
inverse>\index{inverse!left} $x^\lambda$ of $x$ is the unique element of $L$
satisfying $x^\lambda x=1$. Similarly, the <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 <inverse>\index{inverse} of $x$.

\>LeftInverse( <x> ) O
\>RightInverse( <x> ) O
\>Inverse( <x> ) O

The following examples illustrates the concept of inverses for a given loop $M$
in which $M$.$i$ coincides with the $i$th element:

\beginexample
gap> CayleyTable( M );
[ [ 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 ] ]
gap> [ LeftInverse( M.3 ), RightInverse( M.3 ), Inverse( M.3 ) ];
[ l5, l4, fail ]
\endexample

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Associators and commutators}

Let $Q$ be a quasigroup and $x$, $y$, $z\in Q$. Then the
<associator>\index{associator} of $x$, $y$, $z$ is the unique element $u$ such
that $(xy)z=(x(yz))u$. The <commutator>\index{commutator} of $x$, $y$ is the
unique element $v$ such that $xy=(yx)v$.

\>Associator( <x>, <y>, <z> ) O
\>Commutator( <x>, <y> ) O

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Generators}

The following two attributes are synonyms of `GeneratorsOfMagma':

\>GeneratorsOfQuasigroup( <Q> ) A
\>GeneratorsOfLoop( <L> ) A

As usual in {\GAP}, one can refer to the $i$th generator of a quasigroup $Q$ by
`Q.i'. Note that it is not necessarily the case that `Q.i = Elements( Q )[ i
]', since the set of generators can be a proper subset of the elements.

It is easy to prove that a quasigroup of order $n$ can be generated by a subset
containing at most $\log_2{n}$ elements. When $Q$ is a quasigroup

\>GeneratorsSmallest( <Q> ) A

returns a generating set $\{q_0$, $\dots$, $q_m\}$ of $Q$ such that
$Q_0=\emptyset$, $Q_m=Q$, $Q_i=\langle q_1$, $\dots$, $q_i \rangle$, $q_{i+1}$
is the least element of $Q\setminus Q_i$.
