In this chapter we present functions that check various properties of right quasigroups, quasigroups and loops, some on the level of magmas. Any identity of right quasigroups, quasigroups and loops can be verified or refuted with the custom-built parser. Specific (and typically faster) methods are provided for many identities and properties of right quasigroups, and we recommend using them, rather than the generic parser method, whenever possible.
RightQuasigroups contains a simple, custom-built parser for parsing of right quasigroup, quasigroup and loop terms and for verification of right quasigroup, quasigroup and loop identities. For the purposes of the parser:
variables are lower case characters a
, ..., z
,
the multiplication operation is denoted by *
,
the right division operation is denoted by /
,
the left division operation is denoted by |
(since \
behaves badly in GAP strings) and is only allowed in quasigroup and loop terms,
the neutral element is denoted by 1
and is only allowed in loop terms,
parentheses and brackets (
, [
, {
and )
, ]
, }
are allowed and they are all treated as (
and )
, respectively,
the three binary operations have the same priority and if terms are not fully parenthesized, the term is parsed from right to left, (e.g., x*y\z
is parsed as (x*y)\z
) in accordance with GAP conventions for parsing of products,
spaces are allowed and ignorred,
no other characters are allowed.
‣ RightQuasigroupTermFromString ( s ) | ( operation ) |
‣ QuasigroupTermFromString ( s ) | ( operation ) |
‣ LoopTermFromString ( s ) | ( operation ) |
Returns: the right quasigroup (quasigroup, loop) term corresponding to the string s
. The term is returned as a structured list mimicking the infix tree for the term.
It is possible to verify identities directly in GAP. For instance, ForAll( Q, x -> ForAll( Q, y -> ForAll( Q, z -> x*(y*z) = (x*y)*z ) ) )
returns true
iff Q
is associative.
For the convenience of the user, we support checking of identities in right quasigroups, quasigroups and loops by the custom-built parser. Despite some effort to make the checking fast, it is about half as fast as the direct check using GAP code.
‣ RightQuasigroupSatisfiesIdentity ( Q, s ) | ( operation ) |
‣ QuasigroupSatisfiesIdentity ( Q, s ) | ( operation ) |
‣ LoopSatisfiesIdentity ( Q, s ) | ( operation ) |
Returns: true
if the right quasigroup (quasigroup, loop) Q
satisfies the right quasigroup (quasigroup, loop) identity represented by the string s
. If Q
does not satisfy s
, the function returns a list of variables of s
and their values in Q
that violate s
.
gap> Q := AsLoop( CyclicGroup( 6 ) );; gap> LoopSatisfiesIdentity( Q, "x*y=y*x" ); true gap> LoopSatisfiesIdentity( Q, "x*x=1" ); [ [ 'x', lf1 ] ] gap> RightQuasigroupTermFromString("x*(y/z)"); [ 24, '*', [ 25, '/', 26 ] ] gap> QuasigroupTermFromString("(a|b)/(c*d)"); # note the symbol | for left division [ [ 1, '|', 2 ], '/', [ 3, '*', 4 ] ]
To speed up evaluation of identities, the parser produces terms in which variables have been replaced by their positions in the global variable string RQ_parserVarNames = "abcedfghijklmnopqrstuvwxyz"
. The current values of all variables are stored in the global list RQ_parserVars
of length 26. The current value of the neutral element is stored in the global variable RQ_parserOne
. A term t
produced by RightQuasigroupTermFromString
, QuasigroupTermFromString
or LoopTermFromString
is then evaluated via RQ_EvaluateTerm( t )
.
The following list summarizes (mostly equational) properties of magmas tested in RightQuasigroups. All identities are universally quantified with respect to all variables.
3-power associative: x(xx)=(xx)x
alternative: x(xy) = (xx)y and x(yy)=(xy)y
associative: x(yz)=(xy)z
commutative: xy=yx
diassociative: every submagma generated by two elements is associative
flexible: x(yx)=(xy)x
idempotent: xx=x
left alternative: x(xy)=(xx)y
left self-distributive: x(yz)=(xy)(xz)
power associative: every submagma generated by a single element is associative
right alternative: x(yy)=(xy)y
right self-distributive: (xy)z=(xz)(yz)
self-distributive: x(yz)=(xy)(xz) and (xy)z=(xz)(yz)
unipotent: xx=yy
Some of these methods for magmas are already available in GAP, e.g., IsCommutative
. In such a case, we provide a new method for right quasigroups that takes advantage of right translations as permutations.
‣ Is3PowerAssociative ( Q ) | ( property ) |
‣ IsAlternative ( Q ) | ( property ) |
‣ IsAssociative ( Q ) | ( property ) |
‣ IsCommutative ( Q ) | ( property ) |
‣ IsDiassociative ( Q ) | ( property ) |
‣ IsFlexible ( Q ) | ( property ) |
‣ IsIdempotent ( Q ) | ( property ) |
‣ IsLeftAlternative ( Q ) | ( property ) |
‣ IsLeftSelfDistributive ( Q ) | ( property ) |
‣ IsPowerAssociative ( Q ) | ( property ) |
‣ IsRightAlternative ( Q ) | ( property ) |
‣ IsRightSelfDistributive ( Q ) | ( property ) |
‣ IsSelfDistributive ( Q ) | ( property ) |
‣ IsUnipotent ( Q ) | ( property ) |
Returns: true
if Q
is a magma with the property in the title of the function, else returns false
‣ IsFaithfulRightQuasigroup ( Q ) | ( property ) |
Returns: true
if Q is a faithful right quasigroup, that is, a right quasigroup for which the mapping x\mapsto R_x is injective.
‣ IsProjectionRightQuasigroup ( Q ) | ( property ) |
Returns: true
if Q is a projection right quasigroup, that is, a right quasigroup satisfying the identity xy=x.
‣ IsSemisymmetric ( Q ) | ( property ) |
Returns: true
if Q
is a semisymmetric quasigroup (that is, a quasigroup satisfying (x*y)*x=y
for all x
, y
), else returns false
.
‣ IsTotallySymmetric ( Q ) | ( property ) |
Returns: true
if Q
is a totally symmetric quasigroup (that is, a quasigroup that is semisymmetric and commutative), else returns false
.
‣ IsSteinerQuasigroup ( Q ) | ( property ) |
Returns: true
if Q
is a Steiner quasigroup (that is, a quasigroup that is idempotent and totally symmetric), else returns false
. We also support the synonym IsMedial
.
‣ IsEntropic ( Q ) | ( property ) |
Returns: true
if Q
is an entropic quasigroup (that is, a quasigroup satisfying (x*u)*(v*y) = (x*v)*(u*y)
for all x
, y
, u
, v
), else returns false
. We also support the synonym IsMedial
.
In a loop Q with neutral element e, for every x\in Q there is a unique left inverse x^\ell of x satisfying x^\ell x = e and a unique right inverse x^r of x satisfying xx^r=e, cf. Section 1.5. If x^ell = x^r then the two-sided inverse of x is denoted by x^{-1}.
‣ HasTwosidedInverses ( Q ) | ( property ) |
Returns: true
if Q
is a loop with two-sided inverses, else returns false
.
‣ HasRightInverseProperty ( Q ) | ( property ) |
‣ HasLeftInverseProperty ( Q ) | ( property ) |
‣ HasInverseProperty ( Q ) | ( property ) |
Returns: true
if the loop Q
has the right inverse property (resp. left inverse property, inverse property), else returns false
.
A loop Q has the right inverse property (resp. left inverse property) if (xy)y^r=x (resp. x^\ell(xy)=y) holds for all x,y\in Q. It has the inverse property if it is has the right inverse property and the left inverse property. In all three cases, the loop automatically has two-sided inverses.
‣ HasWeakInverseProperty ( Q ) | ( property ) |
Returns: true
if the loop Q
has the weak inverse property.
A loop Q has the weak inverse property if (xy)^\ell x = y^\ell holds for all x,y\in Q. The dual identity x(yx)^r = y^r is equivalent to the weak inverse property. A weak inverse property loop does not necessarily posses two-sided inverses.
‣ HasAutomorphicInverseProperty ( Q ) | ( property ) |
‣ HasAntiautomorphicInverseProperty ( Q ) | ( property ) |
Returns: true
if the loop Q
has the automorphic inverse property (resp. antiautomorphic inverse property), else returns false
.
A loop Q has the automorphic inverse property if (xy)^r = x^r y^r holds for all x,y\in Q (the dual identity (xy)^\ell = x^\ell y^\ell is equivalent to it in loops). An automorphic inverse property loop does not necessarily posses two-sided inverses. A loop Q has the antiautomorphic inverse property if (xy)^r = y^r x^r holds for all x,y\in Q (the dual identity (xy)^\ell = y^\ell x^\ell is equivalent to it in loops). An antiautomorphic inverse property loop automatically possesses two-sided inverses and the definining identity can therefore be restated as (xy)^{-1}=y^{-1}x^{-1}.
A loop identity is said to be of Bol-Moufang type if two of its three variables occur once on each side, the third variable occurs twice on each side, and the order in which the variables appear on both sides is the same, cf. ((xy)x)z=x(y(xz)). A variety of loops is of Bol-Moufang type if it is defined by a single identity of Bol-Moufang type. It can be shown that there are precisey 14 varieties of loops of Bol-Moufang type; the 11 varieties included in the list below plus the already introduced associative loops (aka groups), flexible loops, left alternative loops and right alternative loops.
Here are the 11 varieties of loops of Bol-Moufang type not yet introduced. In some cases there are several equivalent identities of Bol-Moufang type for the given variety but we only list one such identity.
C loops: x(y(yz))=((xy)y)z
extra loops: x(y(zx))=((xy)z)x
LC loops: (xx)(yz)=(x(xy))z
left Bol loops: x(y(xz)) = (x(yx))z
left nuclear square loops: (xx)(yz)=((xx)y)z
middle nuclear square loops: x((yy)z)=(x(yy))z
Moufang loops: (xy)(zx)=(x(yz))x
RC loops: x((yz)z)=(xy)(zz)
right Bol loops: x((yz)y)=((xy)z)y
right nuclear square loops: x(y(zz))=(xy)(zz)
‣ IsCLoop ( Q ) | ( property ) |
‣ IsExtraLoop ( Q ) | ( property ) |
‣ IsLCLoop ( Q ) | ( property ) |
‣ IsLeftBolLoop ( Q ) | ( property ) |
‣ IsLeftNuclearSquareLoop ( Q ) | ( property ) |
‣ IsMiddleNuclearSquareLoop ( Q ) | ( property ) |
‣ IsMoufangLoop ( Q ) | ( property ) |
‣ IsRCLoop ( Q ) | ( property ) |
‣ IsRightBolLoop ( Q ) | ( property ) |
‣ IsRightNuclearSquareLoop ( Q ) | ( property ) |
Returns: true
if the loop Q
has the property in the title of the function, else returns false
.
‣ IsNuclearSquareLoop ( Q ) | ( property ) |
Returns: true
if Q
is a nuclear square loop (that is, a loop where the square of every element lies in the nucleus), else returns false
. The variety of nuclear square loops is technically not of Bol-Moufang type, but can be obtained by interesecting varieties of Bol-Moufang type.
A loop Q is right power alternative (resp. left power alternative) if it is power associative and (xy^n)y^m = xy^{n+m} (resp. x^n(x^my) = x^{n+m}y) holds for all x,y\in Q and all integers n, m. A loop is power alternative if it is both right and left power alternative.
‣ IsRightPowerAlternative ( Q ) | ( property ) |
‣ IsLeftPowerAlternative ( Q ) | ( property ) |
‣ IsPowerAlternative ( Q ) | ( property ) |
Returns: true
if the loop Q
is right power alternative (resp. left power alternative, power alternative), else returns false
.
A loop Q is right conjugacy closed (aka RCC) if for all x,y\in Q the permutation R_x^{-1}R_yR_x is a right translation. Dually, Q is left conjugacy closed (aka LCC) if for all x,y\in Q the permutation L_x^{-1}L_yL_x is a left translation. A loop Q is conjugacy closed (aka CC) if it is both RCC and LCC.
‣ IsRightConjugacyClosedLoop ( Q ) | ( property ) |
‣ IsLeftConjugacyClosedLoop ( Q ) | ( property ) |
‣ IsConjugacyClosedLoop ( Q ) | ( property ) |
Returns: true
or false
The synonyms IsRCCLoop
, IsLCCLoop
and IsCCLoop
are also supported.
‣ IsOsbornLoop ( Q ) | ( property ) |
Returns: true
if Q
is an Osborn loop (that is, a loop satisfying y\backslash (x(zx)) = ((y/x)z)x), else returns false
.
‣ IsCodeLoop ( Q ) | ( property ) |
Returns: true
if Q
is a code loop, else returns false
. A loop Q is a code loop if it a Moufang loop containing a central subloop Z of size 2 such that Q/Z is an elementary abelian 2-group.
‣ IsSteinerLoop ( Q ) | ( property ) |
Returns: true
if Q
is a Steiner loop, else retunrs false
. A loop Q is a Steiner loop if it is an inverse property loop of exponent at most 2.
‣ IsRightBruckLoop ( Q ) | ( property ) |
‣ IsLeftBruckLoop ( Q ) | ( property ) |
Returns: true
if Q
is a right Bruck loop (resp. left Bruck loop), else returns false
.
A loop Q is a right Bruck loop (aka right K-loop) if it is right Bol an has the automorphic inverse property. A loop Q is a left Bruck loop (aka left K-loop) if it is left Bol and has the automorphic inverse property. The synonyms IsRightKLoop
and IsLeftKLoop
are also supported.
‣ IsRightAutomorphicLoop ( Q ) | ( property ) |
‣ IsMiddleAutomorphicLoop ( Q ) | ( property ) |
‣ IsLeftAutomorphicLoop ( Q ) | ( property ) |
‣ IsAutomorphicLoop ( Q ) | ( property ) |
Returns: true
if Q
is a right automorphic loop (resp. middle automorphic loop, left automorphic loop, automorphic loop), else returns false
.
A loop Q is a right automorphic loop (aka right A-loop) if all right inner mapping of Q are automorphisms of Q. A loop Q is a middle automorphic loop (aka middle A-loop) if all its middle inner mappings are automorphisms of Q. A loop Q is a left automorphic loop (aka left A-loop) if all its left inner mappings are automorphisms of Q. A loop Q is an automorphic loop (aka A-loop) if all its inner mappings are automorphisms of Q.
The synonyms IsRightALoop
, IsMiddleALoop
, IsLeftALoop
and IsALoop
are also supported.
generated by GAPDoc2HTML