\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}
%
, 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 elements is ambiguous in the nonassociative case, we
always multiply elements from left to right, i.e., $x*y*z$ means $((x*y)*z)$.
Of course, one can specify association by parentheses.

Universal algebraists introduce two additional operations for quasigroups.
Namely the <left division>
%
\index{left division}
%
 $x\backslash y$ satisfying $x\cdot(x\backslash
y)=y$, and the <right division>
%
\index{right division}
%
 $x/y$ satisfying $(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 not well-defined in quasigroups, since bracketing can
matter even for a single element. We say that the quasigroup $Q$ is
<power-associative>
%
\index{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 non power-associative quasigroups.

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