1#############################################################################
2##
3#W  quasigroups.gd  Representing, creating and displaying quasigroups [loops]
4##
5##
6#Y  Copyright (C)  2004,  G. P. Nagy (University of Szeged, Hungary),
7#Y                        P. Vojtechovsky (University of Denver, USA)
8##
9
10#############################################################################
11##  GAP CATEGORIES AND REPRESENTATIONS
12##  -------------------------------------------------------------------------
13
14## element of a quasigroup
15DeclareCategory( "IsQuasigroupElement", IsMultiplicativeElement );
16DeclareRepresentation( "IsQuasigroupElmRep",
17    IsPositionalObjectRep and IsMultiplicativeElement, [1] );
18
19## element of a loop
20DeclareCategory( "IsLoopElement",
21    IsQuasigroupElement and IsMultiplicativeElementWithInverse );
22DeclareRepresentation( "IsLoopElmRep",
23    IsPositionalObjectRep and IsMultiplicativeElementWithInverse, [1] );
24
25## latin (auxiliary category for GAP to tell apart IsMagma and IsQuasigroup)
26DeclareCategory( "IsLatinMagma", IsObject );
27
28## quasigroup
29DeclareCategory( "IsQuasigroup", IsMagma and IsLatinMagma );
30
31## loop
32DeclareCategory( "IsLoop", IsQuasigroup and IsMultiplicativeElementWithInverseCollection);
33
34#############################################################################
35##  TESTING MULTIPLICATION TABLES
36##  -------------------------------------------------------------------------
37
38DeclareOperation( "IsQuasigroupTable", [ IsMatrix ] );
39DeclareSynonym( "IsQuasigroupCayleyTable", IsQuasigroupTable );
40DeclareOperation( "IsLoopTable", [ IsMatrix ] );
41DeclareSynonym( "IsLoopCayleyTable", IsLoopTable );
42DeclareOperation( "CanonicalCayleyTable", [ IsMatrix ] );
43DeclareOperation( "NormalizedQuasigroupTable", [ IsMatrix ] );
44
45#############################################################################
46##  CREATING QUASIGROUPS AND LOOPS MANUALLY
47##  -------------------------------------------------------------------------
48
49DeclareAttribute( "CayleyTable", IsQuasigroup );
50DeclareOperation( "QuasigroupByCayleyTable", [ IsMatrix ] );
51DeclareOperation( "LoopByCayleyTable", [ IsMatrix ] );
52DeclareOperation( "SetQuasigroupElmName", [ IsQuasigroup, IsString ] );
53DeclareSynonym( "SetLoopElmName", SetQuasigroupElmName );
54DeclareOperation( "CanonicalCopy", [ IsQuasigroup ] );
55
56#############################################################################
57##  CREATING QUASIGROUPS AND LOOPS FROM A FILE
58##  -------------------------------------------------------------------------
59
60DeclareOperation( "QuasigroupFromFile", [ IsString, IsString ] );
61DeclareOperation( "LoopFromFile", [ IsString, IsString ] );
62
63#############################################################################
64##  CREATING QUASIGROUPS AND LOOPS BY SECTIONS
65##  -------------------------------------------------------------------------
66
67DeclareOperation( "CayleyTableByPerms", [ IsPermCollection ] );
68DeclareOperation( "QuasigroupByLeftSection", [ IsPermCollection ] );
69DeclareOperation( "LoopByLeftSection", [ IsPermCollection ] );
70DeclareOperation( "QuasigroupByRightSection", [ IsPermCollection ] );
71DeclareOperation( "LoopByRightSection", [ IsPermCollection ] );
72DeclareOperation( "QuasigroupByRightFolder", [ IsGroup, IsGroup, IsMultiplicativeElementCollection ] );
73DeclareOperation( "LoopByRightFolder", [ IsGroup, IsGroup, IsMultiplicativeElementCollection ] );
74
75#############################################################################
76##  CONVERSIONS
77##  -------------------------------------------------------------------------
78
79DeclareOperation( "IntoQuasigroup", [ IsMagma ] );
80DeclareOperation( "PrincipalLoopIsotope",
81    [ IsQuasigroup, IsQuasigroupElement, IsQuasigroupElement ] );
82DeclareOperation( "IntoLoop", [ IsMagma ] );
83DeclareOperation( "IntoGroup", [ IsMagma ] );
84
85#############################################################################
86## PRODUCTS OF QUASIGROUPS AND LOOPS
87## --------------------------------------------------------------------------
88
89#DirectProduct already declared for groups.
90
91#############################################################################
92## OPPOSITE QUASIGROUPS AND LOOPS
93## --------------------------------------------------------------------------
94
95DeclareOperation( "OppositeQuasigroup", [ IsQuasigroup ] );
96DeclareOperation( "OppositeLoop", [ IsLoop ] );
97DeclareAttribute( "Opposite", IsQuasigroup );
98
99#############################################################################
100## AUXILIARY
101## --------------------------------------------------------------------------
102DeclareGlobalFunction( "LOOPS_ReadCayleyTableFromFile" );
103DeclareGlobalFunction( "LOOPS_CayleyTableByRightFolder" );
104