The package consists of three complementary components:
Since the permutation representation in the usual sense is impossible for nonassociative structures, and since the theory of nonassociative presentations is not well understood, we had to resort to multiplication tables to represent quasigroups in 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).
Consequently, the package is intended primarily for quasigroups and loops of small order, say up to 1000.
The GAP categories
IsLoop are declared in LOOPS as follows:
DeclareCategory( "IsQuasigroupElement", IsMultiplicativeElement ); DeclareRepresentation( "IsQuasigroupElmRep", IsPositionalObjectRep and IsMultiplicativeElement,  ); DeclareCategory( "IsLoopElement", IsQuasigroupElement and IsMultiplicativeElementWithInverse ); DeclareRepresentation( "IsLoopElmRep", IsPositionalObjectRep and IsMultiplicativeElementWithInverse,  ); ## latin (auxiliary category for GAP to tell apart IsMagma and IsQuasigroup) DeclareCategory( "IsLatin", IsObject ); DeclareCategory( "IsQuasigroup", IsMagma and IsLatin ); DeclareCategory( "IsLoop", IsQuasigroup and IsMultiplicativeElementWithInverseCollection);
Whether an object is considered a magma, quasigroup, loop or group is a matter of declaration in LOOPS. Loops are automatically quasigroups, and both groups and quasigroups are automatically magmas. All standard GAP commands for magmas are therefore available for quasigroups and loops, too.
In GAP, functions of the type
) convert the domain X into
Something, if possible, without changing the underlying domain X. For
example, if X is declared as magma but is associative and has neutral element
) returns the corresponding group with the
underlying domain X.
We have opted for a more general kind of conversions in LOOPS (starting with
version 2.1.0), using functions of the type
). The two main
features that distinguish
)does not necessarily return the same domain as X. The reason is that X can be a group, for instance, defined on one of many possible domains, while
)must result in a loop, and hence be defined on a subset of some interval
[1,..,n](see Section About Cayley tables).
)allows to convert X into
Somethingeven though X does not have all the properties of
Something. For instance, every quasigroup is isotopic to a loop, so it makes sense to allow conversions of the type
)even if the quasigroup Q does not posses a neutral element.
Details of all conversions in LOOPS can be found in Section Conversions.
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 the above-mentioned translations, and we illustrate it with a few examples:
Example 1: 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 ∈ Q, or we can ask if Lxy=LxLy for every x, y ∈ Q. Note that since Lxy, Lx, Ly 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.
Example 2: This example shows how properties of loops can be translated into properties of translations in a way that requires some theory.
A left Bol loop is a loop satisfying x(y(xz)) = (x(yx))z. We claim (without proof) that a loop L is left Bol if and only if LxLyLx is a left translation for every x, y ∈ L.
Example 3: This example shows that many properties of loops become purely group-theoretical once they are expresses in terms of translations.
A loop is simple if it has no nontrivial congruences. Then it is easy to see 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:
GAP displays information about objects in two modes:
Only loops contained in the libraries of LOOPS are named. For instance, the
loop obtained via
MoufangLoop( 32, 4 ), the 4th Moufang loop of order 32,
Moufang loop 32/4.
When Q is a quasigroup of order n, it is displayed as
order n>. Similarly, a loop of order n appears as
<loop of order n>.
The displayed information for a loop L is enhanced when it is known that L has certain additional properties. At this point, we support:
<associative loop ...> <extra loop ...> <Moufang loop ...> <C loop ...> <left Bol loop ...> <right Bol loop ...> <LC loop ...> <RC loop ...> <alternative loop ...> <left alternative loop ...> <right alternative loop ...> <flexible loop ...>The corresponding mathematical definitions and an example can be found in Section Loops of Bol-Moufang type.
It is possible for a loop to have several of the above properties. In such a case, we display the first property on the list that is satisfied.
By default, elements of a quasigroup appear as
and elements of a loop
in both display modes. The neutral element of a loop is always
l1. However, one can change the names of elements of a quasigroup
Q or loop L to name with
For quasigroups and loops in the
In the following example, L is a loop with two elements.
gap> L; <loop of order 2> gap> Print( L ); <loop with multiplication table [ [ 1, 2 ], [ 2, 1 ] ]> gap> Elements( L ); [ l1, l2 ] gap> SetLoopElmName( L, "loop_element" );; Elements( L ); [ loop_element1, loop_element2 ]
[Up] [Previous] [Next] [Index]