diff --git a/doc/main.xml b/doc/main.xml index f94e0fe77..329b4033e 100644 --- a/doc/main.xml +++ b/doc/main.xml @@ -64,15 +64,16 @@ <#Include SYSTEM "z-chap09.xml"> <#Include SYSTEM "z-chap10.xml"> <#Include SYSTEM "z-chap11.xml"> - <#Include SYSTEM "z-chap12.xml"> - <#Include SYSTEM "z-chap13.xml"> - <#Include SYSTEM "z-chap14.xml"> - <#Include SYSTEM "z-chap15.xml"> - <#Include SYSTEM "z-chap16.xml"> - <#Include SYSTEM "z-chap17.xml"> - <#Include SYSTEM "z-chap18.xml"> - <#Include SYSTEM "z-chap19.xml"> - + <#Include SYSTEM "z-chap12.xml"> + <#Include SYSTEM "z-chap13.xml"> + <#Include SYSTEM "z-chap14.xml"> + <#Include SYSTEM "z-chap15.xml"> + <#Include SYSTEM "z-chap16.xml"> + <#Include SYSTEM "z-chap17.xml"> + <#Include SYSTEM "z-chap18.xml"> + <#Include SYSTEM "z-chap19.xml"> + <#Include SYSTEM "z-chap20.xml"> + diff --git a/doc/semieunit.xml b/doc/semieunit.xml new file mode 100644 index 000000000..a74e4e39b --- /dev/null +++ b/doc/semieunit.xml @@ -0,0 +1,311 @@ +############################################################################ +## +#W semieunit.xml +#Y Copyright (C) 2016 Christopher Russell +## +## Licensing information can be found in the README file of this package. +## +############################################################################# +## + +<#GAPDoc Label="IsMcAlisterTripleSemigroup"> + + + true or false. + + This function returns true if S is a McAlister triple semigroup. + A McAlister triple semigroup is a special representation of an + E-unitary inverse semigroup + created by . + + +<#/GAPDoc> + +<#GAPDoc Label="McAlisterTripleSemigroup"> + + + A McAlister triple semigroup. + + + The following documentation covers the technical information needed to + create McAlister triple semigroups in GAP, the underlying theory can be + read in the introduction to Chapter + . +

+ + In this implementation the partial order X of a McAlister triple is + represented by a object X. + The digraph represents a partial order in the sense that vertices are the + elements of the partial order and the order relation is defined by + A \leq B if and only if there is an edge from B + to A. The semilattice Y of the McAlister triple should be an + induced subdigraph Y of X and the + must correspond to + the vertices of X on which Y is induced. That means that + the following: +

+ + Y = InducedSubdigraph(X, DigraphVertexLabels(Y)) +

+ + must return true. Herein if we say that a vertex A of X + is 'in' Y then we mean there is a vertex of Y whose label is + A. Alerternatively the user may choose to give the argument + Y as the vertices of X on which Y is the induced + subdigraph.

+ + A McAlister triple semigroup is created from a quadruple + (G, X, Y, act) where: + + + + G is a finite group. + + + X is a digraph satisfying + . + + + Y is a digraph satisfying + which + is an induced subdigraph of X satisfying the aforementioned + labeling criteria. Furthermore the of each vertex of X which is in Y + must contain only vertices which are in Y. + + + act is a function which takes as its first argument a vertex + of the digraph X, its second argument should be an element of + G, and it must return a vertex of X. + act must be a right action, meaning that + act(A,gh)=act(act(A,g),h) holds for all + A in X and g,h \in G. Furthermore + the permutation represenation of this action must be a subgroup of the + automorphism group of X. That means we require the following + to return true:

+ IsSubgroup(AutomorphismGroup(X), + Image(ActionHomomorphism(G, + DigraphVertices(X), act));

+ Furthermore every vertex of X must be in the orbit of some + vertex of X which is in Y. Finally, act must fix + the vertex of X which is the minimal vertex of Y, i.e. + the unique vertex of Y whose only out-neighbour is itself. + + + + For user convienience, there are multiple versions of + McAlisterTripleSemigroup. When the argument act is ommitted + it is assumed to be . Additionally, + the semilattice argument Y may be replaced by a homogeneous list + sub_ver of vertices of X. When sub_ver is provided, + McAlisterTripleSemigroup is called with Y equalling + InducedSubdigraph(X, sub_ver) with the appropriate + labels. + + x := Digraph([[1], [1, 2], [1, 2, 3], [1, 4], [1, 4, 5]]); + +gap> y := InducedSubdigraph(x, [1, 4, 5]); + +gap> DigraphVertexLabels(y); +[ 1, 4, 5 ] +gap> A := AutomorphismGroup(x); +Group([ (2,4)(3,5) ]) +gap> S := McAlisterTripleSemigroup(A, x, y, OnPoints); + +gap> T := McAlisterTripleSemigroup(A, x, y); + +gap> S = T; +false +gap> IsIsomorphicSemigroup(S, T); +true +gap> GeneratorsOfSemigroup(T); +[ (1, ()), (4, ()), (5, ()), (1, (2,4)(3,5)) ] +gap> AsSemigroup(IsPartialPermSemigroup, T); +]]> + + +<#/GAPDoc> + +<#GAPDoc Label="McAlisterTripleSemigroupGroup"> + + + A group. + + Returns the group used to create the McAlister triple semigroup S + via . + + +<#/GAPDoc> + +<#GAPDoc Label="McAlisterTripleSemigroupPartialOrder"> + + + A partial order digraph. + + Returns the used + to create the McAlister triple semigroup S via + . + + +<#/GAPDoc> + +<#GAPDoc Label="McAlisterTripleSemigroupSemilattice"> + + + A join-semilattice digraph. + + Returns the + used to create the McAlister triple semigroup S via + . + + +<#/GAPDoc> + +<#GAPDoc Label="McAlisterTripleSemigroupAction"> + + + A function. + + Returns the action used to create the McAlister triple semigroup + S via . + + +<#/GAPDoc> + +<#GAPDoc Label="IsMcAlisterTripleSemigroupElement"> + + + + true or false. + + Returns true if x is an element of a McAlister triple + semigroup; in particular, this returns true if x has been + created by . The functions + IsMTSE and IsMcAlisterTripleSemigroupElement are synonyms. + The mathematical description of these objects can be found in the + introduction to Chapter . + + +<#/GAPDoc> + +<#GAPDoc Label="McAlisterTripleSemigroupElement"> + + + + A McAlister triple semigroup element. + + Returns the McAlister triple semigroup element of the McAlister + triple semigroup S which corresponds to a label A of a + vertex from the of + S and a group element g of the of S. The pair + (A,g) only represents an element of S if the following + holds: + + A acted on by the inverse of g (via ) is a vertex of the + join-semilattice of S.

+ + The functions MTSE and McAlisterTripleSemigroupElement + are synonyms. + x := Digraph([[1], [1, 2], [1, 2, 3], [1, 4], [1, 4, 5]]); + +gap> y := InducedSubdigraph(x, [1, 2, 3]); + +gap> A := AutomorphismGroup(x); +Group([ (2,4)(3,5) ]) +gap> S := McAlisterTripleSemigroup(A, x, y, OnPoints); + +gap> T := McAlisterTripleSemigroup(A, x, y); + +gap> S = T; +false +gap> IsIsomorphicSemigroup(S, T); +true +gap> a := MTSE(S, 1, (2, 4)(3, 5)); +(1, (2,4)(3,5)) +gap> b := MTSE(S, 2, ()); +(2, ()) +gap> a * a; +(1, ()) +gap> IsMTSE(a * a); +true +gap> a = MTSE(T, 1, (2, 4)(3, 5)); +false +gap> a * b; +(1, (2,4)(3,5))]]> + + +<#/GAPDoc> + +<#GAPDoc Label="EUnitaryInverseCover"> + + + A homomorphism between semigroups. + + If the argument S is an inverse semigroup then this function + returns a finite E-unitary inverse cover of S. A finite E-unitary + cover of S is a surjective idempotent separating homomorphism from + a finite semigroup satisfying + to S. A semigroup homomorphism is said to be idempotent separating + if no two idempotents are mapped to the same element of the image. + S := InverseSemigroup([PartialPermNC([1, 2], [2, 1]), +> PartialPermNC([1], [1])]); + +gap> cov := EUnitaryInverseCover(S); +MappingByFunction( , , function( x ) ... end ) +gap> IsEUnitaryInverseSemigroup(Source(cov)); +true +gap> S = Range(cov); +true]]> + + +<#/GAPDoc> + +<#GAPDoc Label="IsFInverseSemigroup"> + + + true or false. + + This functions determines whether a given semigroup is an F-inverse + semigroup. An F-inverse semigroup is a semigroup which satisfies + as well as being isomorphic + to some where the + satisfies + . McAlister + triple semigroups are a represenation of E-unitary inverse semigroups and + more can be read about them in Chapter + . + S := InverseMonoid([PartialPermNC([1, 2], [1, 2]), +> PartialPermNC([1, 2, 3], [1, 2, 3]), +> PartialPermNC([1, 2, 4], [1, 2, 4]), +> PartialPermNC([1, 2], [2, 1]), PartialPermNC([1, 2, 3], [2, 1, 3]), +> PartialPermNC([1, 2, 4], [2, 1, 4])]);; +gap> IsEUnitaryInverseSemigroup(S); +true +gap> IsFInverseSemigroup(S); +false +gap> IsFInverseSemigroup(IdempotentGeneratedSubsemigroup(S)); +true]]> + + +<#/GAPDoc> + +<#GAPDoc Label="IsFInverseMonoid"> + + + true or false. + + This function determines whether a given semigroup is an F-inverse + monoid. A semigroup is an F-inverse monoid when it satisfies + and + . + + +<#/GAPDoc> diff --git a/doc/z-chap12.xml b/doc/z-chap12.xml index cd7e6b5d9..c0cdf458a 100644 --- a/doc/z-chap12.xml +++ b/doc/z-chap12.xml @@ -1,101 +1,112 @@ - + - Green's relations - + McAlister triple semigroups and E-unitary inverse semigroups + + In this section, we describe the functions in &GAP; for creating and + computing with McAlister triple semigroups and their subsemigroups. + This implementation is based on the section in Chapter 5 of + but differs from the treatment in Howie + by using right actions instead of left. Some definitions found in + the documentation are changed for this reason.

- In this chapter we describe the functions in &Semigroups; for - computing Green's classes and related properties of semigroups. - - - + The importance of the McAlister triple semigroups lies in the fact that + they are exactly the E-unitary inverse semigroups, which are an important + class in the study of inverse semigroups.

-

+ First we define E-unitary inverse semigroups. It is standard to + denote the subsemigroup of a semigroup consisting of its idempotents by + E. A semigroup S is said to be E-unitary if for all + e in E and for all s in S: - - Creating Green's classes and representatives - - - In this section, we describe the methods in the &Semigroups; package for - creating Green's classes. -

+ + + es \in E implies s \in E, + + + se \in E implies s \in E. + + - <#Include Label = "XClassOfYClass"> - <#Include Label = "GreensXClassOfElement"> - <#Include Label = "GreensXClassOfElementNC"> - <#Include Label = "GreensXClasses"> - <#Include Label = "XClassReps"> - <#Include Label = "MinimalDClass"> - <#Include Label = "MaximalDClasses"> - <#Include Label = "NrRegularDClasses"> - <#Include Label = "NrXClasses"> - <#Include Label = "PartialOrderOfDClasses"> - <#Include Label = "LengthOfLongestDClassChain"> - <#Include Label = "IsGreensDGreaterThanFunc"> + For inverse semigroups these two conditions are equivalent. We are only + interested in E-unitary inverse semigroups. + Before defining McAlister triple semigroups we define a McAlister triple. + A McAlister triple is a triple (G,X,Y) which consists of: -

- - - - -
+ + + a partial order X, + + + a subset Y of X, + + + a group G which acts on X, on the right, by order + automorphisms. That means for all A,B \in X and + for all g \in G: A \leq B if + and only if Ag \leq Bg. + + - - Iterators and enumerators of classes and representatives - - - In this section, we describe the methods in the &Semigroups; package for - incrementally determining Green's classes or their representatives. -

+ Furthermore, (G,X,Y) must satisfy the following four properties to + be a McAlister triple: - <#Include Label = "IteratorOfXClassReps"> - <#Include Label = "IteratorOfXClasses"> + + M1 + + Y is a subset of X which is a join-semilattice together + with the restriction of the order relation of X to Y. + + M2 + + Y is an order ideal of X. That is to say, for all A + \in X and for all B \in + Y: if A \leq B, then A \in + Y. + + M3 + + Every element of X is the image of some element in Y moved + by an element of G. That is to say, for every A \in + X, there exists some B \in Y and there exists + g \in G such that A = Bg. + + M4 + + Finally, for all g \in G, the intersection + {yg : y \in Y} \cap Y is non-empty. + + -

- - - + We may define an E-unitary inverse semigroup using a McAlister triple. Given + (G,X,Y) let M(G,X,Y) be the set of all pairs (A,g) in + Y x G such that A acted on by the inverse of g is in + Y together with multiplication defined by

-

- - - Properties of Green's classes - - - In this section, we describe the properties and operators of Green's - classes that are available in the &Semigroups; package -

- - <#Include Label = "\<"> - <#Include Label = "IsRegularGreensClass"> - <#Include Label = "IsGreensClassNC"> + (A,g)*(B,h) = (Join(A,Bg^-1),hg)

+ + where Join is the natural join operation of the semilattice and + Bg^-1 is B acted on by the inverse of g. With this + operation, M(G,X,Y) is a semigroup which we call a McAlister + triple semigroup over (G,X,Y). In fact every McAlister triple + semigroup is an E-unitary inverse semigroup and every E-unitary inverse + semigroup is isomorphic to some McAlister triple semigroup. Note that there + need not be a unqiue McAlister triple semigroup for a particular McAlister + triple because in general there is more than one way for a group to act on + a partial order. -

- - - -
- - Attributes of Green's classes + Creating McAlister triple semigroups - In this section, we describe the attributes of Green's classes that are - available in the &Semigroups; package -

- - <#Include Label = "GroupHClass"> - <#Include Label = "SchutzenbergerGroup"> - <#Include Label = "StructureDescriptionSchutzenbergerGroups"> - <#Include Label = "StructureDescriptionMaximalSubgroups"> - <#Include Label = "MultiplicativeNeutralElement"> - <#Include Label = "StructureDescription"> - <#Include Label = "InjectionPrincipalFactor"> - <#Include Label = "PrincipalFactor"> - + <#Include Label = "IsMcAlisterTripleSemigroup"> + <#Include Label = "McAlisterTripleSemigroup"> + <#Include Label = "McAlisterTripleSemigroupGroup"> + <#Include Label = "McAlisterTripleSemigroupPartialOrder"> + <#Include Label = "McAlisterTripleSemigroupSemilattice"> + <#Include Label = "McAlisterTripleSemigroupAction"> + <#Include Label = "IsMcAlisterTripleSemigroupElement"> + <#Include Label = "McAlisterTripleSemigroupElement">

- - - diff --git a/doc/z-chap13.xml b/doc/z-chap13.xml index b26612332..cd7e6b5d9 100644 --- a/doc/z-chap13.xml +++ b/doc/z-chap13.xml @@ -1,127 +1,36 @@ - + - Attributes and operations for semigroups + Green's relations - In this chapter we decribe the methods that are available in &Semigroups; for - determining the attributes of a semigroup, and the operations which can be - applied to a semigroup. - - - - -
- - Accessing the elements of a semigroup - - <#Include Label = "AsListCanonical"> - <#Include Label = "PositionCanonical"> - <#Include Label = "Enumerate"> - <#Include Label = "IsFullyEnumerated"> -
- - - - -
- - Cayley graphs - - <#Include Label = "RightCayleyDigraph"> -
- - - - -
+ In this chapter we describe the functions in &Semigroups; for + computing Green's classes and related properties of semigroups. - - Random elements of a semigroup - - - <#Include Label = "Random"> -
-
- - - Properties of elements in a semigroup - - - <#Include Label = "IndexPeriodOfSemigroupElement"> - <#Include Label = "SmallestIdempotentPower"> -
- - - -
- - Expressing semigroup elements as words in generators + Creating Green's classes and representatives - - It is possible to express an element of a semigroup as a word in the - generators of that semigroup. This section describes how to accomplish this - in &Semigroups;.

- <#Include Label = "EvaluateWord"> - <#Include Label = "Factorization"> - <#Include Label = "MinimalFactorization"> - -

- - - - -
- - - Generating sets - - - <#Include Label = "Generators"> - <#Include Label = "SmallGeneratingSet"> - <#Include Label = "IrredundantGeneratingSubset"> - <#Include Label = "MinimalGeneratingSet"> - <#Include Label = "GeneratorsSmallest"> - -
- - - - -
- - - Minimal ideals and multiplicative zeros - - - In this section we describe the attributes of a semigroup that can be found - using the &Semigroups; package. + In this section, we describe the methods in the &Semigroups; package for + creating Green's classes.

- - <#Include Label = "MinimalIdeal"> - <#Include Label = "RepresentativeOfMinimalIdeal"> - <#Include Label = "MultiplicativeZero"> - <#Include Label = "UnderlyingSemigroupOfSemigroupWithAdjoinedZero"> -

- - - - -
- - - Group of units and identity elements - - - <#Include Label = "GroupOfUnits"> - + <#Include Label = "XClassOfYClass"> + <#Include Label = "GreensXClassOfElement"> + <#Include Label = "GreensXClassOfElementNC"> + <#Include Label = "GreensXClasses"> + <#Include Label = "XClassReps"> + <#Include Label = "MinimalDClass"> + <#Include Label = "MaximalDClasses"> + <#Include Label = "NrRegularDClasses"> + <#Include Label = "NrXClasses"> + <#Include Label = "PartialOrderOfDClasses"> + <#Include Label = "LengthOfLongestDClassChain"> + <#Include Label = "IsGreensDGreaterThanFunc">
@@ -131,147 +40,61 @@
- Idempotents + Iterators and enumerators of classes and representatives - - <#Include Label = "Idempotents"> - <#Include Label = "NrIdempotents"> - <#Include Label = "IdempotentGeneratedSubsemigroup"> - -
- - - -
- - - Maximal subsemigroups - - - The &Semigroups; package provides methods to calculate the maximal - subsemigroups of a finite semigroup, subject to various conditions. A - maximal subsemigroup of a semigroup is a proper subsemigroup - that is contained in no other proper subsemigroup of the semigroup. - -

- - When computing the maximal subsemigroups of a regular Rees (0-)matrix - semigroup over a group, additional functionality is available. As described - in , a maximal subsemigroup of a finite regular - Rees (0-)matrix semigroup over a group is one of 6 possible types. Using the - &Semigroups; package, it is possible to search for only those maximal - subsemigroups of certain types. - + In this section, we describe the methods in the &Semigroups; package for + incrementally determining Green's classes or their representatives.

- A maximal subsemigroup of such a Rees (0-)matrix semigroup R over a - group G is either: - - - {0}; - formed by removing 0; - formed by removing a column (a non-zero &L;-class); - formed by removing a row (a non-zero &R;-class); - formed by removing a set of both rows and columns; - isomorphic to a Rees (0-)matrix semigroup of the same dimensions over - a maximal subgroup of G (in particular, the maximal subsemigroup - intersects every &H;-class of R). - - - Note that if R is a Rees matrix semigroup then it has no - maximal subsemigroups of types 1, 2, or 5. Only types 3, 4, and 6 - are relevant to a Rees matrix semigroup. - - <#Include Label = "MaximalSubsemigroups"> - <#Include Label = "NrMaximalSubsemigroups"> - <#Include Label = "IsMaximalSubsemigroup"> + <#Include Label = "IteratorOfXClassReps"> + <#Include Label = "IteratorOfXClasses">

- +
- + - The normalizer of a semigroup + Properties of Green's classes - - <#Include Label = "Normalizer"> -
- - - + In this section, we describe the properties and operators of Green's + classes that are available in the &Semigroups; package +

-

+ <#Include Label = "\<"> + <#Include Label = "IsRegularGreensClass"> + <#Include Label = "IsGreensClassNC"> - - Attributes of transformations and transformation semigroups - - - <#Include Label = "ComponentRepsOfTransformationSemigroup"> - <#Include Label = "ComponentsOfTransformationSemigroup"> - <#Include Label = "CyclesOfTransformationSemigroup"> - <#Include Label = "DigraphOfActionOnPairs"> - <#Include Label = "DigraphOfActionOnPoints"> - <#Include Label = "FixedPointsOfTransformationSemigroup"> - <#Include Label = "IsTransitive"> - <#Include Label = "SmallestElementSemigroup"> - <#Include Label = "CanonicalTransformation"> - <#Include Label = "IsConnectedTransformationSemigroup"> -
- - - Attributes of partial perm semigroups - - - <#Include Label = "ComponentRepsOfPartialPermSemigroup"> - <#Include Label = "ComponentsOfPartialPermSemigroup"> - <#Include Label = "CyclesOfPartialPerm"> - <#Include Label = "CyclesOfPartialPermSemigroup"> - -
- - - - - The content in this chapter is based partly on work by - https://academics.uccs.edu/zmesyan. - A full description of the objects described can be found in - . - -
- - - Attributes of Rees (0-)matrix semigroups - - - <#Include Label = "RZMSDigraph"> - <#Include Label = "RZMSConnectedComponents"> - -
- - - -
- - Changing the representation of a semigroup + Attributes of Green's classes - <#Include Label = "IsomorphismReesZeroMatrixSemigroup"> + In this section, we describe the attributes of Green's classes that are + available in the &Semigroups; package +

+ <#Include Label = "GroupHClass"> + <#Include Label = "SchutzenbergerGroup"> + <#Include Label = "StructureDescriptionSchutzenbergerGroups"> + <#Include Label = "StructureDescriptionMaximalSubgroups"> + <#Include Label = "MultiplicativeNeutralElement"> + <#Include Label = "StructureDescription"> + <#Include Label = "InjectionPrincipalFactor"> + <#Include Label = "PrincipalFactor"> +

- + diff --git a/doc/z-chap14.xml b/doc/z-chap14.xml index 95cc6444a..b26612332 100644 --- a/doc/z-chap14.xml +++ b/doc/z-chap14.xml @@ -1,55 +1,278 @@ - + - Properties of semigroups + Attributes and operations for semigroups In this chapter we decribe the methods that are available in &Semigroups; for - determining various properties of a semigroup. + determining the attributes of a semigroup, and the operations which can be + applied to a semigroup.
- Properties of semigroups + Accessing the elements of a semigroup + + <#Include Label = "AsListCanonical"> + <#Include Label = "PositionCanonical"> + <#Include Label = "Enumerate"> + <#Include Label = "IsFullyEnumerated"> +
+ + + + +
+ + Cayley graphs + + <#Include Label = "RightCayleyDigraph"> +
+ + + + +
+ + + Random elements of a semigroup + + + <#Include Label = "Random"> +
+ + + + +
+ + + Properties of elements in a semigroup + + + <#Include Label = "IndexPeriodOfSemigroupElement"> + <#Include Label = "SmallestIdempotentPower"> +
+ + + + +
+ + + Expressing semigroup elements as words in generators + + + It is possible to express an element of a semigroup as a word in the + generators of that semigroup. This section describes how to accomplish this + in &Semigroups;.

+ + <#Include Label = "EvaluateWord"> + <#Include Label = "Factorization"> + <#Include Label = "MinimalFactorization"> + +

+ + + + +
+ + + Generating sets + + <#Include Label = "Generators"> + <#Include Label = "SmallGeneratingSet"> + <#Include Label = "IrredundantGeneratingSubset"> + <#Include Label = "MinimalGeneratingSet"> + <#Include Label = "GeneratorsSmallest"> + +
+ + + - In this section we describe the properties of a semigroup that can be - determined using the &Semigroups; package. +
+ + + Minimal ideals and multiplicative zeros + + + In this section we describe the attributes of a semigroup that can be found + using the &Semigroups; package.

- <#Include Label = "IsBand"> - <#Include Label = "IsBlockGroup"> - <#Include Label = "IsCommutativeSemigroup"> - <#Include Label = "IsCompletelyRegularSemigroup"> - <#Include Label = "IsCongruenceFreeSemigroup"> - <#Include Label = "IsGroupAsSemigroup"> - <#Include Label = "IsIdempotentGenerated"> - <#Include Label = "IsLeftSimple"> - <#Include Label = "IsLeftZeroSemigroup"> - <#Include Label = "IsMonogenicSemigroup"> - <#Include Label = "IsMonogenicMonoid"> - <#Include Label = "IsMonoidAsSemigroup"> - <#Include Label = "IsOrthodoxSemigroup"> - <#Include Label = "IsRectangularBand"> - <#Include Label = "IsRectangularGroup"> - <#Include Label = "IsRegularSemigroup"> - <#Include Label = "IsRightZeroSemigroup"> - <#Include Label = "IsRTrivial"> - <#Include Label = "IsSemigroupWithAdjoinedZero"> - <#Include Label = "IsSemilattice"> - <#Include Label = "IsSimpleSemigroup"> - <#Include Label = "IsSynchronizingSemigroup"> - <#Include Label = "IsUnitRegularMonoid"> - <#Include Label = "IsZeroGroup"> - <#Include Label = "IsZeroRectangularBand"> - <#Include Label = "IsZeroSemigroup"> - <#Include Label = "IsZeroSimpleSemigroup"> + <#Include Label = "MinimalIdeal"> + <#Include Label = "RepresentativeOfMinimalIdeal"> + <#Include Label = "MultiplicativeZero"> + <#Include Label = "UnderlyingSemigroupOfSemigroupWithAdjoinedZero"> + +

+ + + + +
+ + + Group of units and identity elements + + <#Include Label = "GroupOfUnits"> + +
+ + + + +
+ + + Idempotents + + <#Include Label = "Idempotents"> + <#Include Label = "NrIdempotents"> + <#Include Label = "IdempotentGeneratedSubsemigroup"> + +
+ + +
- + + Maximal subsemigroups + + + The &Semigroups; package provides methods to calculate the maximal + subsemigroups of a finite semigroup, subject to various conditions. A + maximal subsemigroup of a semigroup is a proper subsemigroup + that is contained in no other proper subsemigroup of the semigroup. + +

+ + When computing the maximal subsemigroups of a regular Rees (0-)matrix + semigroup over a group, additional functionality is available. As described + in , a maximal subsemigroup of a finite regular + Rees (0-)matrix semigroup over a group is one of 6 possible types. Using the + &Semigroups; package, it is possible to search for only those maximal + subsemigroups of certain types. + +

+ + A maximal subsemigroup of such a Rees (0-)matrix semigroup R over a + group G is either: + + + {0}; + formed by removing 0; + formed by removing a column (a non-zero &L;-class); + formed by removing a row (a non-zero &R;-class); + formed by removing a set of both rows and columns; + isomorphic to a Rees (0-)matrix semigroup of the same dimensions over + a maximal subgroup of G (in particular, the maximal subsemigroup + intersects every &H;-class of R). + + + Note that if R is a Rees matrix semigroup then it has no + maximal subsemigroups of types 1, 2, or 5. Only types 3, 4, and 6 + are relevant to a Rees matrix semigroup. + + <#Include Label = "MaximalSubsemigroups"> + <#Include Label = "NrMaximalSubsemigroups"> + <#Include Label = "IsMaximalSubsemigroup"> + +

+ + + + +
+ + + The normalizer of a semigroup + + + <#Include Label = "Normalizer"> + +
+ + + +
+ + + Attributes of transformations and transformation semigroups + + + <#Include Label = "ComponentRepsOfTransformationSemigroup"> + <#Include Label = "ComponentsOfTransformationSemigroup"> + <#Include Label = "CyclesOfTransformationSemigroup"> + <#Include Label = "DigraphOfActionOnPairs"> + <#Include Label = "DigraphOfActionOnPoints"> + <#Include Label = "FixedPointsOfTransformationSemigroup"> + <#Include Label = "IsTransitive"> + <#Include Label = "SmallestElementSemigroup"> + <#Include Label = "CanonicalTransformation"> + <#Include Label = "IsConnectedTransformationSemigroup"> + +
+ + + + +
+ + + Attributes of partial perm semigroups + + + <#Include Label = "ComponentRepsOfPartialPermSemigroup"> + <#Include Label = "ComponentsOfPartialPermSemigroup"> + <#Include Label = "CyclesOfPartialPerm"> + <#Include Label = "CyclesOfPartialPermSemigroup"> + +
+ + + + + The content in this chapter is based partly on work by + https://academics.uccs.edu/zmesyan. + A full description of the objects described can be found in + . + +
+ + + Attributes of Rees (0-)matrix semigroups + + + <#Include Label = "RZMSDigraph"> + <#Include Label = "RZMSConnectedComponents"> + +
+ + + + +
+ + + Changing the representation of a semigroup + + + <#Include Label = "IsomorphismReesZeroMatrixSemigroup"> + +
+ + + + +
diff --git a/doc/z-chap15.xml b/doc/z-chap15.xml index 941147f46..95cc6444a 100644 --- a/doc/z-chap15.xml +++ b/doc/z-chap15.xml @@ -1,69 +1,55 @@ - + - Properties and attributes specific to inverse semigroups + Properties of semigroups - - - - - In this chapter we describe the attributes which are specific - to inverse semigroups that can be determined using &Semigroups;.

- - The functions - - - - - - - - - - - were written by Wilf A. Wilson and Robert Hancock.

- The function was written by - Jhevon Smith and Ben Steinberg. + In this chapter we decribe the methods that are available in &Semigroups; for + determining various properties of a semigroup.

- - Attributes specific to inverse semigroups + Properties of semigroups - - <#Include Label = "NaturalLeqInverseSemigroup"> - <#Include Label = "JoinIrreducibleDClasses"> - <#Include Label = "MajorantClosure"> - <#Include Label = "Minorants"> - <#Include Label = "PrimitiveIdempotents"> - <#Include Label = "RightCosetsOfInverseSemigroup"> - <#Include Label = "SameMinorantsSubgroup"> - <#Include Label = "SmallerDegreePartialPermRepresentation"> - <#Include Label = "VagnerPrestonRepresentation"> - <#Include Label = "CharacterTableOfInverseSemigroup"> + In this section we describe the properties of a semigroup that can be + determined using the &Semigroups; package. +

+ + <#Include Label = "IsBand"> + <#Include Label = "IsBlockGroup"> + <#Include Label = "IsCommutativeSemigroup"> + <#Include Label = "IsCompletelyRegularSemigroup"> + <#Include Label = "IsCongruenceFreeSemigroup"> + <#Include Label = "IsGroupAsSemigroup"> + <#Include Label = "IsIdempotentGenerated"> + <#Include Label = "IsLeftSimple"> + <#Include Label = "IsLeftZeroSemigroup"> + <#Include Label = "IsMonogenicSemigroup"> + <#Include Label = "IsMonogenicMonoid"> + <#Include Label = "IsMonoidAsSemigroup"> + <#Include Label = "IsOrthodoxSemigroup"> + <#Include Label = "IsRectangularBand"> + <#Include Label = "IsRectangularGroup"> + <#Include Label = "IsRegularSemigroup"> + <#Include Label = "IsRightZeroSemigroup"> + <#Include Label = "IsRTrivial"> + <#Include Label = "IsSemigroupWithAdjoinedZero"> + <#Include Label = "IsSemilattice"> + <#Include Label = "IsSimpleSemigroup"> + <#Include Label = "IsSynchronizingSemigroup"> + <#Include Label = "IsUnitRegularMonoid"> + <#Include Label = "IsZeroGroup"> + <#Include Label = "IsZeroRectangularBand"> + <#Include Label = "IsZeroSemigroup"> + <#Include Label = "IsZeroSimpleSemigroup"> +

-
- - Properties of inverse semigroups - - - <#Include Label = "IsCliffordSemigroup"> - <#Include Label = "IsBrandtSemigroup"> - <#Include Label = "IsEUnitaryInverseSemigroup"> - <#Include Label = "IsFactorisableInverseMonoid"> - <#Include Label = "IsJoinIrreducible"> - <#Include Label = "IsMajorantlyClosed"> - <#Include Label = "IsMonogenicInverseSemigroup"> - <#Include Label = "IsMonogenicInverseMonoid"> - -
-
+ diff --git a/doc/z-chap16.xml b/doc/z-chap16.xml index 787766fb1..7fa7e6f97 100644 --- a/doc/z-chap16.xml +++ b/doc/z-chap16.xml @@ -1,307 +1,75 @@ - - Congruences - - Congruences in &Semigroups; can be described in several different ways:

- + + + Properties and attributes specific to inverse semigroups + + + + + + In this chapter we describe the attributes which are specific + to inverse semigroups that can be determined using &Semigroups;.

+ + The functions - - Generating pairs -- the minimal congruence which contains these pairs - - - Rees congruences -- the congruence specified by a given ideal - - - Universal congruences -- the unique congruence with only one class - - - Linked triples -- only for simple or 0-simple semigroups (see below) - - - Kernel and trace -- only for inverse semigroups - + + + + + + + + + were written by Wilf A. Wilson and Robert Hancock.

- The operation can be used to create any - of these, interpreting the arguments in a smart way. The usual way of - specifying a congruence will be by giving a set of generating pairs, but a - user with an ideal could instead create a Rees congruence or universal - congruence.

- - If a congruence is specified by generating pairs on a simple, 0-simple, or - inverse semigroup, then the congruence may be converted automatically to one - of the last two items in the above list, to reduce the complexity of any - calculations to be performed. The user need not manually specify, or even be - aware of, the congruence's linked triple or kernel and trace.

- - We can also create left congruences and right congruences, using the and - functions.

+ The function was written by + Jhevon Smith and Ben Steinberg. - Please note that congruence objects made in &GAP; before loading the - &Semigroups; package may not behave correctly after &Semigroups; is loaded. - If &Semigroups; is loaded at the beginning of the session, or before any - congruence work is done, then the objects should behave correctly.

- -

Semigroup congruence objects - - <#Include Label="IsSemigroupCongruence"> - <#Include Label="IsLeftSemigroupCongruence"> - <#Include Label="IsRightSemigroupCongruence"> - -
- -
- - Creating congruences - - - <#Include Label = "SemigroupCongruence"> - <#Include Label = "LeftSemigroupCongruence"> - <#Include Label = "RightSemigroupCongruence"> - <#Include Label = "GeneratingPairsOfSemigroupCongruence"> - -
+ +
+ - Congruence classes + Attributes specific to inverse semigroups - - <#Include Label = "IsCongruenceClass"> - <#Include Label = "IsLeftCongruenceClass"> - <#Include Label = "IsRightCongruenceClass"> - <#Include Label = "CongruenceClassOfElement"> - <#Include Label = "CongruenceClasses"> - <#Include Label = "NonTrivialEquivalenceClasses"> - <#Include Label = "NonTrivialCongruenceClasses"> - <#Include Label = "NrEquivalenceClasses"> - <#Include Label = "NrCongruenceClasses"> - <#Include Label = "EquivalenceRelationLookup"> - <#Include Label = "EquivalenceRelationCanonicalLookup"> - <#Include Label = "EquivalenceRelationCanonicalPartition"> - <#Include Label = "OnLeftCongruenceClasses"> - <#Include Label = "OnRightCongruenceClasses"> - -
- -
- - Finding the congruences of a semigroup - - - <#Include Label = "CongruencesOfSemigroup"> - <#Include Label = "MinimalCongruencesOfSemigroup"> - <#Include Label = "PrincipalCongruencesOfSemigroup"> - <#Include Label = "IsCongruencePoset"> - <#Include Label = "LatticeOfCongruences"> - <#Include Label = "PosetOfPrincipalCongruences"> - <#Include Label = "CongruencesOfPoset"> - <#Include Label = "UnderlyingSemigroupOfCongruencePoset"> - <#Include Label = "PosetOfCongruences"> - <#Include Label = "JoinSemilatticeOfCongruences"> - <#Include Label = "MinimalCongruences"> - -
- -
- - Comparing congruences - - - <#Include Label = "IsSubrelation"> - <#Include Label = "IsSuperrelation"> - <#Include Label = "MeetSemigroupCongruences"> - <#Include Label = "JoinSemigroupCongruences"> + + <#Include Label = "NaturalLeqInverseSemigroup"> + <#Include Label = "JoinIrreducibleDClasses"> + <#Include Label = "MajorantClosure"> + <#Include Label = "Minorants"> + <#Include Label = "PrimitiveIdempotents"> + <#Include Label = "RightCosetsOfInverseSemigroup"> + <#Include Label = "SameMinorantsSubgroup"> + <#Include Label = "SmallerDegreePartialPermRepresentation"> + <#Include Label = "VagnerPrestonRepresentation"> + <#Include Label = "CharacterTableOfInverseSemigroup"> + <#Include Label = "EUnitaryInverseCover">
+ +
- Congruences on Rees matrix semigroups - - This section describes the implementation of congruences of simple and 0-simple - semigroups in the &Semigroups; package, and the functions associated with - them. This code and this part of the manual were written by Michael Torpey. - Most of the theorems used in this chapter are from Section 3.5 of - .

- - By the Rees Theorem, any 0-simple semigroup S is isomorphic to a - Rees 0-matrix semigroup (see ) over a group, with a regular sandwich matrix. - - That is, S \cong \mathcal{M} ^ 0[G; I, \Lambda; P], - where G is a group, \Lambda and I are non-empty - sets, and P is regular in the sense that it has no rows or columns - consisting solely of zeroes. - - - That is, S is isomorphic to M ^ 0[G; I, L; P] where G - is a group, L and I are non-empty sets and the matrix - P is regular in the sense that it has no rows or columns - consisting solely of zeroes. -

- - The congruences of a Rees 0-matrix semigroup are in 1-1 correspondence with - the linked triple, which is a triple of the form [N, S, T] where: - - - - N is a normal subgroup of the underlying group G, - - - S is an equivalence relation on the columns of P, - - - T is an equivalence relation on the rows of P, - - - - satisfying the following conditions: - - - - a pair of S-related columns must contain zeroes in - precisely the same rows, - - - a pair of T-related rows must contain zeroes in precisely - the same columns, - - - if i and j are S-related, k and - l are T-related and the matrix entries - p_{k, i}, p_{k, j}, p_{l, i}, p_{l, j} \neq 0, then - q_{k, l, i, j} \in N, where - q_{k, l, i, j} = p_{k, i} - p_{l, i} ^ {-1} p_{l, j} p_{k, j} ^ {-1}. - - - - By Theorem 3.5.9 in , for any finite 0-simple - Rees 0-matrix semigroup, there is a bijection between its non-universal - congruences and its linked triples. In this way, we can internally - represent any congruence of such a semigroup by storing its associated - linked triple instead of a set of generating pairs, and thus perform many - calculations on it more efficiently.

- - If a congruence is defined by a linked triple (N, S, T), then a - single class of that congruence can be defined by a triple (Nx, i / S, k - / S), where Nx is a right coset of N, i / S is - the equivalence class of i in S, and k / S is the - equivalence class of k in T. Thus we can internally - represent any class of such a congruence as a triple simply consisting of a - right coset and two positive integers.

- - An analogous condition exists for finite simple Rees matrix semigroups - without zero.

- - <#Include Label = "IsRZMSCongruenceByLinkedTriple"> - <#Include Label = "RZMSCongruenceByLinkedTriple"> - <#Include Label = "IsRZMSCongruenceClassByLinkedTriple"> - <#Include Label = "RZMSCongruenceClassByLinkedTriple"> - <#Include Label = "IsLinkedTriple"> - <#Include Label = "CanonicalRepresentative"> - <#Include Label = "AsSemigroupCongruenceByGeneratingPairs"> - <#Include Label = "AsRZMSCongruenceByLinkedTriple"> -

- -
- Congruences on inverse semigroups + Properties of inverse semigroups + + <#Include Label = "IsCliffordSemigroup"> + <#Include Label = "IsBrandtSemigroup"> + <#Include Label = "IsEUnitaryInverseSemigroup"> + <#Include Label = "IsFInverseSemigroup"> + <#Include Label = "IsFInverseMonoid"> + <#Include Label = "IsFactorisableInverseMonoid"> + <#Include Label = "IsJoinIrreducible"> + <#Include Label = "IsMajorantlyClosed"> + <#Include Label = "IsMonogenicInverseSemigroup"> + <#Include Label = "IsMonogenicInverseMonoid"> - This section describes the implementation of congruences of inverse - semigroups in the &Semigroups; package, and the functions associated with - them. This code and this part of the manual were written by Michael - Torpey. Most of the theorems used in this chapter are from Section 5.3 of - .

- - The congruences of an inverse semigroup are in 1-1 correspondence with its - congruence pairs. A congruence pair is a pair (N, t) such - that: - - - - N is a normal subsemigroup of S -- that is, a - self-conjugate subsemigroup which contains all the idempotents of - S, - - - t is a normal congruence on E, the subsemigroup of all - idempotents in S -- that is, a congruence on E such that - if (e, f) is a pair in t, then the pair - (a ^ {-1} e a, a ^ {-1} f a) is also in t, - - - - satisfying the following conditions: - - - - If ae \in N and (e, a ^ {-1} a) \in t, then a \in N, - - - If a \in N, then (aa ^ {-1} , a ^ {-1} a) \in t. - - - - By Theorem 5.3.3 in , for any inverse semigroup, - there is a bijection between its congruences and its congruence pairs. In - this way, we can internally represent any congruence of such a semigroup by - storing its associated congruence pair instead of a set of generating - pairs, and thus perform many calculations on it more efficiently.

- - If we have a congruence C with congruence pair (N, t), it - turns out that N is its kernel (that is, the set of all - elements congruent to an idempotent) and that t is its trace - (that is, the restriction of C to the idempotents). Hence, we refer - to a congruence stored in this format as a "congruence by kernel and - trace".

- - See cong_by_ker_trace_threshold in Section - - for details on when this method is used.

- - <#Include Label = "IsInverseSemigroupCongruenceByKernelTrace"> - <#Include Label = "InverseSemigroupCongruenceByKernelTrace"> - <#Include Label = "AsInverseSemigroupCongruenceByKernelTrace"> - <#Include Label = "KernelOfSemigroupCongruence"> - <#Include Label = "TraceOfSemigroupCongruence"> - <#Include Label = "IsInverseSemigroupCongruenceClassByKernelTrace"> - <#Include Label = "MinimumGroupCongruence"> -

- -
- Rees congruences - - A Rees congruence is defined by a semigroup ideal. It is a congruence on a - semigroup S which has one congruence class equal to a semigroup - ideal I of S, and every other congruence class being a - singleton.

- - <#Include Label = "SemigroupIdealOfReesCongruence"> - <#Include Label = "IsReesCongruenceClass">

-
- Universal congruences + + - The linked triples of a completely 0-simple Rees 0-matrix semigroup describe - only its non-universal congruences. In any one of these, the zero element - of the semigroup is related only to itself. However, for any semigroup - S the universal relation S \times - xS is a congruence; called the universal - congruence. The universal congruence on a semigroup has its own unique - representation.

- - Since many things we want to calculate about congruences are trivial in the - case of the universal congruence, this package contains a category - specifically designed for it, IsUniversalSemigroupCongruence. We also - define IsUniversalSemigroupCongruenceClass, which represents the single - congruence class of the universal congruence.

- - <#Include Label = "IsUniversalSemigroupCongruence"> - <#Include Label = "IsUniversalSemigroupCongruenceClass"> - <#Include Label = "UniversalSemigroupCongruence"> -

diff --git a/doc/z-chap17.xml b/doc/z-chap17.xml index 4496b0fea..787766fb1 100644 --- a/doc/z-chap17.xml +++ b/doc/z-chap17.xml @@ -1,122 +1,307 @@ - - - Semigroup homomorphisms - - - In this chapter we describe the various ways to define a homomorphism from a - semigroup to another semigroup. -

- - - + + Congruences + + Congruences in &Semigroups; can be described in several different ways:

+ + + + Generating pairs -- the minimal congruence which contains these pairs + + + Rees congruences -- the congruence specified by a given ideal + + + Universal congruences -- the unique congruence with only one class + + + Linked triples -- only for simple or 0-simple semigroups (see below) + + + Kernel and trace -- only for inverse semigroups + + + + The operation can be used to create any + of these, interpreting the arguments in a smart way. The usual way of + specifying a congruence will be by giving a set of generating pairs, but a + user with an ideal could instead create a Rees congruence or universal + congruence.

+ + If a congruence is specified by generating pairs on a simple, 0-simple, or + inverse semigroup, then the congruence may be converted automatically to one + of the last two items in the above list, to reduce the complexity of any + calculations to be performed. The user need not manually specify, or even be + aware of, the congruence's linked triple or kernel and trace.

+ + We can also create left congruences and right congruences, using the and + functions.

+ + Please note that congruence objects made in &GAP; before loading the + &Semigroups; package may not behave correctly after &Semigroups; is loaded. + If &Semigroups; is loaded at the beginning of the session, or before any + congruence work is done, then the objects should behave correctly.

+ +

Semigroup congruence objects + + <#Include Label="IsSemigroupCongruence"> + <#Include Label="IsLeftSemigroupCongruence"> + <#Include Label="IsRightSemigroupCongruence"> + +
- Isomorphisms of arbitrary semigroups + Creating congruences - <#Include Label = "IsIsomorphicSemigroup"> - <#Include Label = "SmallestMultiplicationTable"> - <#Include Label = "IsomorphismSemigroups"> + <#Include Label = "SemigroupCongruence"> + <#Include Label = "LeftSemigroupCongruence"> + <#Include Label = "RightSemigroupCongruence"> + <#Include Label = "GeneratingPairsOfSemigroupCongruence">
- - - - +
- Isomorphisms of Rees (0-)matrix semigroups + Congruence classes - An isomorphism between two regular finite Rees (0-)matrix semigroups whose - underlying semigroups are groups can be described by a triple defined in - terms of the matrices and underlying groups of the semigroups. For a full - description of the theory involved, see Section 3.4 of - .

- - An isomorphism described in this way can be constructed - using or , and - will satisfy the filter or - .

- - <#Include Label = "IsRMSIsoByTriple"> - <#Include Label = "RMSIsoByTriple"> - <#Include Label = "ELM_LIST"> - <#Include Label = "CompositionMapping2"> - <#Include Label = "ImagesElm"> - - - - - - - Operators for isomorphisms of Rees (0-)matrix semigroup by triples - - - - - map[i] - - ELM_LIST (for Rees (0-)matrix semigroup - isomorphisms by triples) - - map[i] returns the ith component of the Rees - (0-)matrix semigroup isomorphism by triple map when - i = 1, 2, 3; see - . - - - map1 * map2 - - * - (for Rees (0-)matrix semigroup isomorphisms by triples) - - returns the composition of map2 and map1; - see . - - - map1 < map2 - - < - (for Rees (0-)matrix semigroup isomorphisms by triples) - - returns true if map1 is lexicographically less than - map2. - - - map1 = map2 - - = - (for Rees (0-)matrix semigroup isomorphisms by triples) - - returns true if the Rees (0-)matrix semigroup - isomorphisms by triple map1 and map2 have equal source and - range, and are equal as functions, and false otherwise.

- - It is possible for map1 and map2 to be equal but to - have distinct components. - - - pt ^ map - - ^ - (for Rees (0-)matrix semigroup isomorphisms by triples) - - returns the image of the element pt of the source of - map under the isomorphism map; see - . - - - - - + <#Include Label = "IsCongruenceClass"> + <#Include Label = "IsLeftCongruenceClass"> + <#Include Label = "IsRightCongruenceClass"> + <#Include Label = "CongruenceClassOfElement"> + <#Include Label = "CongruenceClasses"> + <#Include Label = "NonTrivialEquivalenceClasses"> + <#Include Label = "NonTrivialCongruenceClasses"> + <#Include Label = "NrEquivalenceClasses"> + <#Include Label = "NrCongruenceClasses"> + <#Include Label = "EquivalenceRelationLookup"> + <#Include Label = "EquivalenceRelationCanonicalLookup"> + <#Include Label = "EquivalenceRelationCanonicalPartition"> + <#Include Label = "OnLeftCongruenceClasses"> + <#Include Label = "OnRightCongruenceClasses">

- - - -
+
+ + Finding the congruences of a semigroup + + + <#Include Label = "CongruencesOfSemigroup"> + <#Include Label = "MinimalCongruencesOfSemigroup"> + <#Include Label = "PrincipalCongruencesOfSemigroup"> + <#Include Label = "IsCongruencePoset"> + <#Include Label = "LatticeOfCongruences"> + <#Include Label = "PosetOfPrincipalCongruences"> + <#Include Label = "CongruencesOfPoset"> + <#Include Label = "UnderlyingSemigroupOfCongruencePoset"> + <#Include Label = "PosetOfCongruences"> + <#Include Label = "JoinSemilatticeOfCongruences"> + <#Include Label = "MinimalCongruences"> + +
+ +
+ + Comparing congruences + + + <#Include Label = "IsSubrelation"> + <#Include Label = "IsSuperrelation"> + <#Include Label = "MeetSemigroupCongruences"> + <#Include Label = "JoinSemigroupCongruences"> + +
+ + +
+ Congruences on Rees matrix semigroups + + This section describes the implementation of congruences of simple and 0-simple + semigroups in the &Semigroups; package, and the functions associated with + them. This code and this part of the manual were written by Michael Torpey. + Most of the theorems used in this chapter are from Section 3.5 of + .

+ + By the Rees Theorem, any 0-simple semigroup S is isomorphic to a + Rees 0-matrix semigroup (see ) over a group, with a regular sandwich matrix. + + That is, S \cong \mathcal{M} ^ 0[G; I, \Lambda; P], + where G is a group, \Lambda and I are non-empty + sets, and P is regular in the sense that it has no rows or columns + consisting solely of zeroes. + + + That is, S is isomorphic to M ^ 0[G; I, L; P] where G + is a group, L and I are non-empty sets and the matrix + P is regular in the sense that it has no rows or columns + consisting solely of zeroes. +

+ + The congruences of a Rees 0-matrix semigroup are in 1-1 correspondence with + the linked triple, which is a triple of the form [N, S, T] where: + + + + N is a normal subgroup of the underlying group G, + + + S is an equivalence relation on the columns of P, + + + T is an equivalence relation on the rows of P, + + + satisfying the following conditions: + + + + a pair of S-related columns must contain zeroes in + precisely the same rows, + + + a pair of T-related rows must contain zeroes in precisely + the same columns, + + + if i and j are S-related, k and + l are T-related and the matrix entries + p_{k, i}, p_{k, j}, p_{l, i}, p_{l, j} \neq 0, then + q_{k, l, i, j} \in N, where + q_{k, l, i, j} = p_{k, i} + p_{l, i} ^ {-1} p_{l, j} p_{k, j} ^ {-1}. + + + + By Theorem 3.5.9 in , for any finite 0-simple + Rees 0-matrix semigroup, there is a bijection between its non-universal + congruences and its linked triples. In this way, we can internally + represent any congruence of such a semigroup by storing its associated + linked triple instead of a set of generating pairs, and thus perform many + calculations on it more efficiently.

+ + If a congruence is defined by a linked triple (N, S, T), then a + single class of that congruence can be defined by a triple (Nx, i / S, k + / S), where Nx is a right coset of N, i / S is + the equivalence class of i in S, and k / S is the + equivalence class of k in T. Thus we can internally + represent any class of such a congruence as a triple simply consisting of a + right coset and two positive integers.

+ + An analogous condition exists for finite simple Rees matrix semigroups + without zero.

+ + <#Include Label = "IsRZMSCongruenceByLinkedTriple"> + <#Include Label = "RZMSCongruenceByLinkedTriple"> + <#Include Label = "IsRZMSCongruenceClassByLinkedTriple"> + <#Include Label = "RZMSCongruenceClassByLinkedTriple"> + <#Include Label = "IsLinkedTriple"> + <#Include Label = "CanonicalRepresentative"> + <#Include Label = "AsSemigroupCongruenceByGeneratingPairs"> + <#Include Label = "AsRZMSCongruenceByLinkedTriple"> +

+ +
+ + Congruences on inverse semigroups + + + This section describes the implementation of congruences of inverse + semigroups in the &Semigroups; package, and the functions associated with + them. This code and this part of the manual were written by Michael + Torpey. Most of the theorems used in this chapter are from Section 5.3 of + .

+ + The congruences of an inverse semigroup are in 1-1 correspondence with its + congruence pairs. A congruence pair is a pair (N, t) such + that: + + + + N is a normal subsemigroup of S -- that is, a + self-conjugate subsemigroup which contains all the idempotents of + S, + + + t is a normal congruence on E, the subsemigroup of all + idempotents in S -- that is, a congruence on E such that + if (e, f) is a pair in t, then the pair + (a ^ {-1} e a, a ^ {-1} f a) is also in t, + + + + satisfying the following conditions: + + + + If ae \in N and (e, a ^ {-1} a) \in t, then a \in N, + + + If a \in N, then (aa ^ {-1} , a ^ {-1} a) \in t. + + + + By Theorem 5.3.3 in , for any inverse semigroup, + there is a bijection between its congruences and its congruence pairs. In + this way, we can internally represent any congruence of such a semigroup by + storing its associated congruence pair instead of a set of generating + pairs, and thus perform many calculations on it more efficiently.

+ + If we have a congruence C with congruence pair (N, t), it + turns out that N is its kernel (that is, the set of all + elements congruent to an idempotent) and that t is its trace + (that is, the restriction of C to the idempotents). Hence, we refer + to a congruence stored in this format as a "congruence by kernel and + trace".

+ + See cong_by_ker_trace_threshold in Section + + for details on when this method is used.

+ + <#Include Label = "IsInverseSemigroupCongruenceByKernelTrace"> + <#Include Label = "InverseSemigroupCongruenceByKernelTrace"> + <#Include Label = "AsInverseSemigroupCongruenceByKernelTrace"> + <#Include Label = "KernelOfSemigroupCongruence"> + <#Include Label = "TraceOfSemigroupCongruence"> + <#Include Label = "IsInverseSemigroupCongruenceClassByKernelTrace"> + <#Include Label = "MinimumGroupCongruence"> +

+ +
+ Rees congruences + + A Rees congruence is defined by a semigroup ideal. It is a congruence on a + semigroup S which has one congruence class equal to a semigroup + ideal I of S, and every other congruence class being a + singleton.

+ + <#Include Label = "SemigroupIdealOfReesCongruence"> + <#Include Label = "IsReesCongruenceClass"> +

+ +
+ Universal congruences + + The linked triples of a completely 0-simple Rees 0-matrix semigroup describe + only its non-universal congruences. In any one of these, the zero element + of the semigroup is related only to itself. However, for any semigroup + S the universal relation S \times + xS is a congruence; called the universal + congruence. The universal congruence on a semigroup has its own unique + representation.

+ + Since many things we want to calculate about congruences are trivial in the + case of the universal congruence, this package contains a category + specifically designed for it, IsUniversalSemigroupCongruence. We also + define IsUniversalSemigroupCongruenceClass, which represents the single + congruence class of the universal congruence.

+ + <#Include Label = "IsUniversalSemigroupCongruence"> + <#Include Label = "IsUniversalSemigroupCongruenceClass"> + <#Include Label = "UniversalSemigroupCongruence"> +

+
diff --git a/doc/z-chap18.xml b/doc/z-chap18.xml index d14e6eac0..4496b0fea 100644 --- a/doc/z-chap18.xml +++ b/doc/z-chap18.xml @@ -1,90 +1,122 @@ - + - Visualising semigroups and elements + Semigroup homomorphisms - There are two operations and in &Semigroups; for creating &LaTeX; and dot (also - known as GraphViz) format pictures of the Green's class structure of a - semigroup and for visualising certain types of elements of a semigroup. There - is also a function for automatically processing the - output of and and - opening the resulting pdf file. - - - - -
- - - Automatic viewing - - - In this section we describe the function for - automatically processing and opening the strings output by and - - <#Include Label = "Splash"/> - -
+ In this chapter we describe the various ways to define a homomorphism from a + semigroup to another semigroup. +

- - dot pictures + Isomorphisms of arbitrary semigroups - In this section, we describe the operations in &Semigroups; for creating - pictures in dot format. -

- - The operations described in this section return strings, which - can be written to a file using the function or viewed using . - - <#Include Label = "DotString"/> - <#Include Label = "DotStringDigraph"/> - <#Include Label = "DotSemilatticeOfIdempotents"/> - <#Include Label = "DotLeftCayleyDigraph"> + <#Include Label = "IsIsomorphicSemigroup"> + <#Include Label = "SmallestMultiplicationTable"> + <#Include Label = "IsomorphismSemigroups">

- +
- tex output + Isomorphisms of Rees (0-)matrix semigroups - In this section, we describe the operations in &Semigroups; for creating - &LaTeX; representations of &GAP; objects. For pictures of &GAP; objects - please see Section . - <#Include Label = "TexString"> -
+ An isomorphism between two regular finite Rees (0-)matrix semigroups whose + underlying semigroups are groups can be described by a triple defined in + terms of the matrices and underlying groups of the semigroups. For a full + description of the theory involved, see Section 3.4 of + .

- - + An isomorphism described in this way can be constructed + using or , and + will satisfy the filter or + .

-

- - tikz pictures - + <#Include Label = "IsRMSIsoByTriple"> + <#Include Label = "RMSIsoByTriple"> + <#Include Label = "ELM_LIST"> + <#Include Label = "CompositionMapping2"> + <#Include Label = "ImagesElm"> - In this section, we describe the operations in &Semigroups; for creating - pictures in tikz format. -

+ - The functions described in this section return a string, which can be - written to a file using the function or viewed using . + - <#Include Label = "TikzString"> - <#Include Label = "TikzLeftCayleyDigraph"> + + Operators for isomorphisms of Rees (0-)matrix semigroup by triples + + + + + map[i] + + ELM_LIST (for Rees (0-)matrix semigroup + isomorphisms by triples) + + map[i] returns the ith component of the Rees + (0-)matrix semigroup isomorphism by triple map when + i = 1, 2, 3; see + . + + + map1 * map2 + + * + (for Rees (0-)matrix semigroup isomorphisms by triples) + + returns the composition of map2 and map1; + see . + + + map1 < map2 + + < + (for Rees (0-)matrix semigroup isomorphisms by triples) + + returns true if map1 is lexicographically less than + map2. + + + map1 = map2 + + = + (for Rees (0-)matrix semigroup isomorphisms by triples) + + returns true if the Rees (0-)matrix semigroup + isomorphisms by triple map1 and map2 have equal source and + range, and are equal as functions, and false otherwise.

+ + It is possible for map1 and map2 to be equal but to + have distinct components. + + + pt ^ map + + ^ + (for Rees (0-)matrix semigroup isomorphisms by triples) + + returns the image of the element pt of the source of + map under the isomorphism map; see + . + + + + +

+ + +
+ diff --git a/doc/z-chap19.xml b/doc/z-chap19.xml index d6b74647e..d14e6eac0 100644 --- a/doc/z-chap19.xml +++ b/doc/z-chap19.xml @@ -1,28 +1,90 @@ - + - IO + Visualising semigroups and elements -
Reading and writing elements to a file - The functions and can be used to read or write, respectively, elements - of a semigroup to a file. + There are two operations and in &Semigroups; for creating &LaTeX; and dot (also + known as GraphViz) format pictures of the Green's class structure of a + semigroup and for visualising certain types of elements of a semigroup. There + is also a function for automatically processing the + output of and and + opening the resulting pdf file. + + + + +
+ + + Automatic viewing + + + In this section we describe the function for + automatically processing and opening the strings output by and + + <#Include Label = "Splash"/> - <#Include Label = "ReadGenerators"> - <#Include Label = "WriteGenerators"> - <#Include Label = "IteratorFromPickledFile">
+ + +
- Reading and writing multiplication tables to a file - The functions and - can be used to read or write, - respectively, multiplication tables to a file. - - <#Include Label = "ReadMultiplicationTable"> - <#Include Label = "WriteMultiplicationTable"> - <#Include Label = "IteratorFromMultiplicationTableFile"> + + + dot pictures + + + In this section, we describe the operations in &Semigroups; for creating + pictures in dot format. +

+ + The operations described in this section return strings, which + can be written to a file using the function or viewed using . + + <#Include Label = "DotString"/> + <#Include Label = "DotStringDigraph"/> + <#Include Label = "DotSemilatticeOfIdempotents"/> + <#Include Label = "DotLeftCayleyDigraph"> +

+ + + +
+ + tex output + + In this section, we describe the operations in &Semigroups; for creating + &LaTeX; representations of &GAP; objects. For pictures of &GAP; objects + please see Section . + + <#Include Label = "TexString"> +
+ + + + +
+ + tikz pictures + + + In this section, we describe the operations in &Semigroups; for creating + pictures in tikz format. +

+ + The functions described in this section return a string, which can be + written to a file using the function or viewed using . + + <#Include Label = "TikzString"> + <#Include Label = "TikzLeftCayleyDigraph"> + +

diff --git a/doc/z-chap20.xml b/doc/z-chap20.xml index d17ef6342..d6b74647e 100644 --- a/doc/z-chap20.xml +++ b/doc/z-chap20.xml @@ -1,31 +1,28 @@ - + - Orbits + IO -
Looking for something in an orbit - The functions described in this section supplement the &Orb; package by - providing methods for finding something in an orbit, with the possibility - of continuing the orbit enumeration at some later point. - <#Include Label="EnumeratePosition"> - <#Include Label="LookForInOrb"> +
Reading and writing elements to a file + The functions and can be used to read or write, respectively, elements + of a semigroup to a file. + + <#Include Label = "ReadGenerators"> + <#Include Label = "WriteGenerators"> + <#Include Label = "IteratorFromPickledFile">
-
- Strongly connected components of orbits - The functions described in this section supplement the &Orb; package by - providing methods for operations related to strongly connected - components of orbits.

- If any of the functions is applied to an open orbit, then the orbit is - completely enumerated before any further calculation is performed. It is not - possible to calculate the strongly connected components of an orbit of a - semigroup acting on a set until the entire orbit has been found. +

+ Reading and writing multiplication tables to a file + The functions and + can be used to read or write, + respectively, multiplication tables to a file. - <#Include Label="OrbSCC"> - <#Include Label="OrbSCCLookup"> - <#Include Label="ReverseSchreierTreeOfSCC"> - <#Include Label="SchreierTreeOfSCC"> - <#Include Label="TraceSchreierTreeOfSCCBack"> - <#Include Label="TraceSchreierTreeOfSCCForward"> + <#Include Label = "ReadMultiplicationTable"> + <#Include Label = "WriteMultiplicationTable"> + <#Include Label = "IteratorFromMultiplicationTableFile">
+ + diff --git a/doc/z-chap21.xml b/doc/z-chap21.xml new file mode 100644 index 000000000..d17ef6342 --- /dev/null +++ b/doc/z-chap21.xml @@ -0,0 +1,31 @@ + + + Orbits + +
Looking for something in an orbit + The functions described in this section supplement the &Orb; package by + providing methods for finding something in an orbit, with the possibility + of continuing the orbit enumeration at some later point. + + <#Include Label="EnumeratePosition"> + <#Include Label="LookForInOrb"> +
+
+ Strongly connected components of orbits + The functions described in this section supplement the &Orb; package by + providing methods for operations related to strongly connected + components of orbits.

+ + If any of the functions is applied to an open orbit, then the orbit is + completely enumerated before any further calculation is performed. It is not + possible to calculate the strongly connected components of an orbit of a + semigroup acting on a set until the entire orbit has been found. + + <#Include Label="OrbSCC"> + <#Include Label="OrbSCCLookup"> + <#Include Label="ReverseSchreierTreeOfSCC"> + <#Include Label="SchreierTreeOfSCC"> + <#Include Label="TraceSchreierTreeOfSCCBack"> + <#Include Label="TraceSchreierTreeOfSCCForward"> +

+
diff --git a/gap/main/fropin.gi b/gap/main/fropin.gi index 5fbf1f595..adde4fe3e 100644 --- a/gap/main/fropin.gi +++ b/gap/main/fropin.gi @@ -57,6 +57,9 @@ InstallTrueMethod(IsGeneratorsOfEnumerableSemigroup, InstallTrueMethod(IsGeneratorsOfEnumerableSemigroup, IsGraphInverseSubsemigroup and IsFinite); +InstallTrueMethod(IsGeneratorsOfEnumerableSemigroup, + IsMcAlisterTripleSemigroupElementCollection); + InstallMethod(IsGeneratorsOfEnumerableSemigroup, "for a matrix over semiring collection", [IsMatrixOverSemiringCollection], IsGeneratorsOfSemigroup); diff --git a/gap/semigroups/semieunit.gd b/gap/semigroups/semieunit.gd new file mode 100644 index 000000000..35a610e49 --- /dev/null +++ b/gap/semigroups/semieunit.gd @@ -0,0 +1,100 @@ +############################################################################# +## +#W semieunit.gd +#Y Copyright (C) 2016 Christopher Russell +## +## Licensing information can be found in the README file of this package. +## +############################################################################# +## + +DeclareCategory("IsMcAlisterTripleSemigroupElement", + IsAssociativeElement and IsMultiplicativeElementWithInverse); + +# This is a representation for McAlister triple semigroup elements, which are +# created via the function McAlisterTripleSemigroupElement. +# +# The components are: +# +# Parent: A McAlister triple semigroup of which this is an element +# +# Vertex: A vertex of the McAlisterTripleSemigroupSemilattice of the Parent +# +# Group element: An element of the McAlisterTripleSemigroupGroup of the +# Parent + +DeclareRepresentation("IsMcAlisterTripleSemigroupElementRep", + IsMcAlisterTripleSemigroupElement + and IsPositionalObjectRep, 2); + +DeclareCategoryCollections("IsMcAlisterTripleSemigroupElement"); +DeclareSynonym("IsMTSE", IsMcAlisterTripleSemigroupElement); +DeclareSynonymAttr("IsMcAlisterTripleSemigroup", + IsInverseSemigroup and IsGeneratorsOfInverseSemigroup + and IsMcAlisterTripleSemigroupElementCollection + and IsWholeFamily and IsEnumerableSemigroupRep); + +# This is a representation for McAlister triple semigroup, which are +# created via the function McAlisterTripleSemigroup. +# +# The attributes stored upon creation are: +# +# McAlisterTripleSemigroupGroup +# McAlisterTripleSemigroupPartialOrder +# McAlisterTripleSemigroupSemilattice +# McAlisterTripleSemigroupAction +# +# their purpose is described in the section of the user manual on McAlister +# triple semigroups. + +DeclareRepresentation("IsMcAlisterTripleSemigroupDefaultRep", + IsMcAlisterTripleSemigroup and IsAttributeStoringRep, + []); + +InstallTrueMethod(IsGeneratorsOfInverseSemigroup, + IsMcAlisterTripleSemigroupElementCollection); + +# Operations for creating McAlister triple semigroups +DeclareOperation("McAlisterTripleSemigroup", + [IsGroup, IsDigraph, IsDigraph, IsFunction]); +DeclareOperation("McAlisterTripleSemigroup", + [IsGroup, IsDigraph, IsHomogeneousList, IsFunction]); +DeclareOperation("McAlisterTripleSemigroup", + [IsPermGroup, IsDigraph, IsDigraph]); +DeclareOperation("McAlisterTripleSemigroup", + [IsPermGroup, IsDigraph, IsHomogeneousList]); + +# Attributes for McAlister triple semigroups +DeclareAttribute("McAlisterTripleSemigroupGroup", + IsMcAlisterTripleSemigroup and IsWholeFamily); +DeclareAttribute("McAlisterTripleSemigroupAction", + IsMcAlisterTripleSemigroup and IsWholeFamily); +DeclareAttribute("McAlisterTripleSemigroupPartialOrder", + IsMcAlisterTripleSemigroup and IsWholeFamily); +DeclareAttribute("McAlisterTripleSemigroupSemilattice", + IsMcAlisterTripleSemigroup and IsWholeFamily); +DeclareAttribute("McAlisterTripleSemigroupElmList", + IsMcAlisterTripleSemigroup and IsWholeFamily); +DeclareAttribute("OneImmutable", + IsMcAlisterTripleSemigroup and IsWholeFamily and IsMonoid); + +# Operations for relating to McAlister triple semigroups +DeclareAttribute("IsomorphismMcAlisterTripleSemigroup", + IsSemigroup); + +# Operations for creating McAlister triple semigroup elements +DeclareOperation("McAlisterTripleSemigroupElement", + [IsMcAlisterTripleSemigroup, + IsPosInt, IsMultiplicativeElementWithInverse]); +DeclareSynonym("MTSE", McAlisterTripleSemigroupElement); + +# Operations for McAlister triple semigroup elements +DeclareAttribute("McAlisterTripleSemigroupElementParent", + IsMcAlisterTripleSemigroupElementRep); +DeclareSynonym("MTSEParent", McAlisterTripleSemigroupElementParent); +DeclareOperation("ELM_LIST", [IsMcAlisterTripleSemigroupElementRep, IsPosInt]); + +# Inverse semigroup methods +DeclareAttribute("EUnitaryInverseCover", IsSemigroup); +DeclareProperty("IsFInverseSemigroup", IsSemigroup); +DeclareProperty("IsFInverseMonoid", IsSemigroup); diff --git a/gap/semigroups/semieunit.gi b/gap/semigroups/semieunit.gi new file mode 100644 index 000000000..31bb254b0 --- /dev/null +++ b/gap/semigroups/semieunit.gi @@ -0,0 +1,719 @@ +############################################################################# +## +#W semieunit.gi +#Y Copyright (C) 2017 Christopher Russell +## +## Licensing information can be found in the README file of this package. +## +############################################################################# + +############################################################################# +# Methods for creating McAlister triple semigroups +############################################################################# + +InstallMethod(McAlisterTripleSemigroup, +"for a group, digraph, digraph, and action", +[IsGroup, IsDigraph, IsDigraph, IsFunction], +function(G, X, Y, act) + local anti_act, hom, out_nbrs, orbs, min, fam, filt, M, x, y; + + if not IsFinite(G) then + ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: usage,\n", + "the first argument must be a finite group,"); + fi; + + anti_act := function(pt, g) + return act(pt, g ^ -1); + end; + + hom := ActionHomomorphism(G, DigraphVertices(X), anti_act); + + if not IsSubgroup(AutomorphismGroup(X), Image(hom)) then + ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: usage,\n", + "the first argument (a group) must act by order ", + "automorphisms on the second argument (a partial order ", + "digraph),"); + elif not IsPartialOrderDigraph(X) then + ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: usage,\n", + "the second argument must be a partial order digraph,"); + fi; + + # Check that Y is a semilattice and an induced subdigraph of X + if not Y = InducedSubdigraph(X, DigraphVertexLabels(Y)) then + ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: usage,\n", + "the third argument must be an induced subdigraph of\n", + "the second argument with vertex labels corresponding\n", + "to the vertices of on which was induced,"); + elif not IsJoinSemilatticeDigraph(Y) then + ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: usage,\n", + "the third argument must be a join-semilattice digraph,"); + fi; + + # Check condition M2 (check that Y is an order ideal of X.) + # TODO: implement IsOrderIdeal for a subset of a partial order digraph. + out_nbrs := OutNeighbors(X); + for x in DigraphVertices(X) do + if not x in DigraphVertexLabels(Y) then + for y in DigraphSources(DigraphRemoveLoops(Y)) do + if x in out_nbrs[DigraphVertexLabel(Y, y)] then + ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: usage,\n", + "the out-neighbours of each vertex of which is ", + "in must contain only vertices which are in ", + "- see the documentation for more detail,"); + fi; + od; + fi; + od; + + orbs := Orbits(Image(hom)); + + # Check condition M3 (check that G.Y = X.) + if not ForAll(orbs, o -> ForAny(DigraphVertexLabels(Y), v -> v in o)) then + ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: usage,\n", + "every vertex of must be in the orbit of some vertex ", + "of which is in - see the documentation ", + "for more detail,"); + fi; + + for x in DigraphVertices(X) do + if not x in Union(orbs) and not (x in DigraphVertexLabels(Y)) then + ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: usage,\n", + "every vertex of must be in the orbit of some ", + "vertex of which is in - see the documentation", + " for more detail,"); + fi; + od; + + # Check condition M4 (essentially, check that G.Y = X is connected.) + min := DigraphVertexLabel(Y, DigraphSinks(DigraphRemoveLoops(Y))[1]); + if ForAny(GeneratorsOfGroup(Image(hom)), g -> min ^ g <> min) then + ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: \n", + " must fix the vertex of which is the minimal ", + "vertex of - see the documentation for more detail,"); + fi; + + fam := NewFamily("McAlisterTripleSemigroupFamily", + IsMcAlisterTripleSemigroupElement); + + # Check if this McAlister triple semigroup is a monoid + if IsMeetSemilatticeDigraph(Y) then + filt := IsMcAlisterTripleSemigroup and IsMonoid; + else + filt := IsMcAlisterTripleSemigroup; + fi; + + # Create the semigroup itself + M := Objectify(NewType(CollectionsFamily(fam), filt and IsAttributeStoringRep + and IsEUnitaryInverseSemigroup and IsWholeFamily), + rec()); + + M!.elementType := NewType(fam, IsMcAlisterTripleSemigroupElementRep); + + SetMcAlisterTripleSemigroupGroup(M, G); + SetMcAlisterTripleSemigroupAction(M, anti_act); + SetMcAlisterTripleSemigroupPartialOrder(M, X); + SetMcAlisterTripleSemigroupSemilattice(M, Y); + + GeneratorsOfSemigroup(M); + return M; +end); + +InstallMethod(McAlisterTripleSemigroup, +"for a perm group, digraph, and digraph", +[IsPermGroup, IsDigraph, IsDigraph], +function(G, X, Y) + return McAlisterTripleSemigroup(G, X, Y, OnPoints); +end); + +InstallMethod(McAlisterTripleSemigroup, +"for a perm group, digraph, homogeneous list, and action", +[IsGroup, IsDigraph, IsHomogeneousList, IsFunction], +function(G, X, sub_ver, act) + return McAlisterTripleSemigroup(G, X, InducedSubdigraph(X, sub_ver), act); +end); + +InstallMethod(McAlisterTripleSemigroup, +"for a perm group, digraph, and homogeneous list", +[IsPermGroup, IsDigraph, IsHomogeneousList], +function(G, X, sub_ver) + return McAlisterTripleSemigroup(G, X, InducedSubdigraph(X, sub_ver), + OnPoints); +end); + +############################################################################# +# Methods for McAlister triple semigroups +############################################################################# +# InstallMethod(\=, "for two McAlister triple semigroups", +# IsIdenticalObj, +# [IsMcAlisterTripleSemigroup, IsMcAlisterTripleSemigroup], +# function(x, y) +# local G, X, Y; +# G := McAlisterTripleSemigroupGroup(x); +# X := McAlisterTripleSemigroupPartialOrder(x); +# Y := McAlisterTripleSemigroupSemilattice(x); +# if G = McAlisterTripleSemigroupGroup(y) +# and X = McAlisterTripleSemigroupPartialOrder(y) +# and Y = McAlisterTripleSemigroupSemilattice(y) then +# if IsIsomorphicSemigroup(x, y) then +# return true; +# fi; +# fi; +# return false; +# end); + +InstallMethod(OneImmutable, "for a McAlister triple semigroup", +[IsMcAlisterTripleSemigroup], +function(S) + local Y; + if not IsMonoid(S) then + ErrorNoReturn("Semigroups: OneImutable (for McAlister triple semigroup):", + " usage,\n", "the argument must be a monoid,"); + fi; + Y := McAlisterTripleSemigroupSemilattice(S); + return MTSE(S, DigraphSources(DigraphRemoveLoops(Y))[1], ()); +end); + +# (A, g) in S if and only if Ag^-1 is a vertex of the semilattice of S +InstallMethod(AsList, "for a McAlister triple semigroup", +[IsMcAlisterTripleSemigroup], +function(S) + local out, g, A, V; + out := []; + V := DigraphVertexLabels(McAlisterTripleSemigroupSemilattice(S)); + for g in McAlisterTripleSemigroupGroup(S) do + for A in V do + if (McAlisterTripleSemigroupAction(S)(A, Inverse(g)) in V) then + Add(out, MTSE(S, A, g)); + fi; + od; + od; + SetMcAlisterTripleSemigroupElmList(S, out); + return out; +end); + +InstallMethod(String, "for a McAlister triple semigroup", +[IsMcAlisterTripleSemigroup], +function(S) + local G, X, Y; + G := McAlisterTripleSemigroupGroup(S); + X := McAlisterTripleSemigroupPartialOrder(S); + Y := McAlisterTripleSemigroupSemilattice(S); + return Concatenation("McAlisterTripleSemigroup(", String(G), ", ", + String(X), ", ", String(DigraphVertexLabels(Y)), ")"); +end); + +InstallMethod(PrintObj, "for a McAlister triple semigroup", +[IsMcAlisterTripleSemigroup], +function(S) + Print(String(S)); + return; +end); + +#TODO Linebreak hints + +InstallMethod(ViewString, "for a McAlister triple semigroup", +[IsMcAlisterTripleSemigroup], +function(S) + local G; + G := McAlisterTripleSemigroupGroup(S); + return Concatenation(""); +end); + +InstallMethod(IsomorphismSemigroups, "for two McAlister triple semigroups", +[IsMcAlisterTripleSemigroup, IsMcAlisterTripleSemigroup], +function(S, T) + local YS, YT, XT, iso_g, iso_x, im_YS, rep, A; + + iso_g := IsomorphismGroups(McAlisterTripleSemigroupGroup(S), + McAlisterTripleSemigroupGroup(T)); + + if iso_g = fail then + return fail; + fi; + + YS := McAlisterTripleSemigroupSemilattice(S); + YT := McAlisterTripleSemigroupSemilattice(T); + XT := McAlisterTripleSemigroupPartialOrder(T); + + if not IsIsomorphicDigraph(YS, YT) then + return fail; + fi; + + iso_x := IsomorphismDigraphs(McAlisterTripleSemigroupPartialOrder(S), XT); + + if iso_x = fail then + return fail; + fi; + + im_YS := List(DigraphVertexLabels(YS), a -> a ^ iso_x); + # if the restriction of iso_x to DigraphVertexLabels(YS) is not + # DigraphVertexLabels(YT) then we need to compose iso_x with an + # automorphism of McAlisterTripleSemilattice(T). Composing this with + # iso_x will restrict to an isomorphism from (the labels of) YS to YT. + if not im_YS = DigraphVertexLabels(YT) then + A := AutomorphismGroup(XT); + rep := RepresentativeAction(A, im_YS, DigraphVertexLabels(YT), OnSets); + if rep = fail then + return fail; + fi; + else + rep := (); + fi; + + if ForAll(McAlisterTripleSemigroupGroup(S), + g -> ForAll(DigraphVertices(McAlisterTripleSemigroupPartialOrder(S)), + x -> (McAlisterTripleSemigroupAction(S)(x, g)) ^ (rep * iso_x) = + McAlisterTripleSemigroupAction(T)((x ^ iso_x), (g ^ iso_g)) ^ rep)) then + return MappingByFunction(S, T, s -> MTSE(T, s[1] ^ iso_x, s[2] ^ iso_g)); + fi; + + return fail; +end); + +############################################################################# +# Methods for McAlister triple elements +############################################################################# +InstallMethod(McAlisterTripleSemigroupElement, +"for a McAlister triple semigroup, pos int, and perm", +[IsMcAlisterTripleSemigroup, IsPosInt, IsMultiplicativeElementWithInverse], +function(S, A, g) + if not A in DigraphVertexLabels(McAlisterTripleSemigroupSemilattice(S)) then + ErrorNoReturn("Semigroups: McAlisterTripleSemigroupElement: usage,\n", + "second argument should be a vertex label of the ", + "join-semilattice of the McAlister triple,"); + elif not g in McAlisterTripleSemigroupGroup(S) then + ErrorNoReturn("Semigroups: McAlisterTripleSemigroupElement: usage,\n", + "third argument must an element of the group of the ", + "McAlister triple,"); + elif not (McAlisterTripleSemigroupAction(S)(A, g ^ -1) in + DigraphVertexLabels(McAlisterTripleSemigroupSemilattice(S))) then + ErrorNoReturn("Semigroups: McAlisterTripleSemigroupElement: usage,\n", + "the arguments do not specify an element of the McAlister ", + "triple semigroup,"); + fi; + return Objectify(S!.elementType, [A, g, S]); +end); + +InstallMethod(ELM_LIST, +"for a McAlister triple semigroup element rep and a pos int", +[IsMcAlisterTripleSemigroupElementRep, IsPosInt], +function(x, i) + if i <= 2 then + return x![i]; + fi; + ErrorNoReturn("Semigroups: ELM_LIST (for a McAlisterTripleSemigroupElement)", + ": usage,\n", "the index must be at most 2,"); +end); + +InstallMethod(McAlisterTripleSemigroupElementParent, +"for a McAlister triple semigroup element rep", +[IsMcAlisterTripleSemigroupElementRep], +function(x) + return x![3]; +end); + +InstallMethod(String, "for a McAlister triple semigroup element rep", +[IsMcAlisterTripleSemigroupElementRep], +function(x) + return Concatenation("MTSE(", String(x![3]), ", ", String(x![1]), ", ", + String(x![2]), ")"); +end); + +#TODO Linebreak hints + +InstallMethod(ViewString, "for a McAlister triple semigroup element rep", +[IsMcAlisterTripleSemigroupElementRep], +function(x) + return Concatenation("(", ViewString(x[1]), ", ", ViewString(x[2]), ")"); +end); + +InstallMethod(\=, "for two McAlister triple semigroup element reps", +IsIdenticalObj, +[IsMcAlisterTripleSemigroupElementRep, IsMcAlisterTripleSemigroupElementRep], +function(x, y) + if x![1] = y![1] and x![2] = y![2] and x![3] = y![3] then + return true; + fi; + return false; +end); + +InstallMethod(\*, "for two McAlister triple semigroup element reps", +[IsMcAlisterTripleSemigroupElementRep, IsMcAlisterTripleSemigroupElementRep], +function(x, y) + local S, labels; + S := McAlisterTripleSemigroupElementParent(x); + if not S = McAlisterTripleSemigroupElementParent(y) then + ErrorNoReturn("Semigroups: \* (for an McAlisterTripleSemigroupElement): ", + "usage,\n", "the elements must be from the same McAlister ", + "triple semigroup,"); + fi; + labels := DigraphVertexLabels(McAlisterTripleSemigroupSemilattice(S)); + return MTSE(S, DigraphVertexLabel(McAlisterTripleSemigroupPartialOrder(S), + PartialOrderDigraphJoinOfVertices( + McAlisterTripleSemigroupPartialOrder(S), x[1], + McAlisterTripleSemigroupAction(S)(y[1], x[2]))), + x[2] * y[2]); +end); + +InstallMethod(\<, "for two McAlister triple semigroup element reps", +[IsMcAlisterTripleSemigroupElementRep, IsMcAlisterTripleSemigroupElementRep], +function(x, y) + return x[1] < y[1] or (x[1] = y[1] and x[2] < y[2]); +end); + +InstallMethod(InverseOp, "for a McAlister triple semigroup element rep", +[IsMcAlisterTripleSemigroupElementRep], +function(x) + return MTSE(x![3], McAlisterTripleSemigroupAction(x![3])(x[1], Inverse(x[2])), + Inverse(x[2])); +end); + +InstallMethod(\^, "for a McAlister triple semigroup element and a negative int", + [IsMcAlisterTripleSemigroupElement, IsNegInt], +function(x, i) + return InverseOp(x ^ - i); +end); + +############################################################################# +# Implementing IsomorphismSemigroup for IsMcAlisterTripleSemigroup +############################################################################# +SEMIGROUPS.EUISPrincipalRightIdeal := function(S, e) + local elements; + elements := ShallowCopy(Elements(S)); + Apply(elements, x -> e * x); + return DuplicateFreeList(elements); +end; + +SEMIGROUPS.McAlisterTripleSemigroupSemilatticeIsomorphism := function(S, cong) + local iso, s, YY; + + iso := function(s) + local ideal; + ideal := SEMIGROUPS.EUISPrincipalRightIdeal(S, s); + return Set(ideal, x -> [InverseOp(x) * x, + CongruenceClassOfElement(cong, x)]); + end; + + YY := Set(Idempotents(S), e -> iso(e)); + return MappingByFunction(S, Domain(YY), iso); +end; + +SEMIGROUPS.McAlisterTripleSemigroupConstructPartialOrder := function(S, Y, G) + local g, A, sc, out; + + out := ShallowCopy(Y); + for g in G do #TODO: if Ag = A then should not check powers of g + for A in Y do + sc := ShallowCopy(A); + sc := Set(sc, x -> [x[1], g * x[2]]); + if not sc in out then + Append(out, [sc]); + out := Set(out); + fi; + od; + od; + + return out; +end; + +SEMIGROUPS.McAlisterTripleSemigroupConstructAction := function(xx, map) + local map2, act, pt, g; + + map2 := InverseGeneralMapping(map); + act := function(pt, g) + local out; + out := Set(ShallowCopy(xx[pt]), x -> [x[1], (g ^ map2) * x[2]]); + return Position(xx, out); + end; + + return act; +end; + +SEMIGROUPS.McAlisterTripleSemigroupConstructStandardPartialOrder := function(x) + local sizes, vertices, adjacency, a, i, j, intr; + + sizes := ShallowCopy(x); + Apply(sizes, a -> Size(a)); + vertices := [1 .. Size(x)]; + adjacency := []; + + for i in vertices do + Append(adjacency, [[i]]); + od; + + for i in vertices do + for j in vertices do + if i < j then + # ignore symmetric pairs + intr := Intersection(x[i], x[j]); + if Size(intr) = sizes[i] then + Append(adjacency[j], [i]); + elif Size(intr) = sizes[j] then + Append(adjacency[i], [j]); + fi; + fi; + od; + od; + + Perform(adjacency, Sort); + + return Digraph(adjacency); +end; + +InstallMethod(IsomorphismMcAlisterTripleSemigroup, +"for a semigroup", +[IsSemigroup], +function(S) + local cong, grp, map_y, map_yy, map_g, yy, xx, + labels, x, y, iso, anti_act, act, M; + + if not IsEUnitaryInverseSemigroup(S) then + ErrorNoReturn("Semigroups: IsomorphismSemigroup: usage,\n", + "the semigroup is not E-unitary,"); + fi; + + cong := MinimumGroupCongruence(S); + grp := S / cong; + # This is G. + map_yy := SEMIGROUPS.McAlisterTripleSemigroupSemilatticeIsomorphism(S, cong); + yy := Set(Image(map_yy)); + # Construct Y as in Howie. + xx := SEMIGROUPS.McAlisterTripleSemigroupConstructPartialOrder(S, yy, grp); + # Construct X as in Howie. + + # Next we create the digraphs x and y for the McAlister triple semigroup. + x := SEMIGROUPS.McAlisterTripleSemigroupConstructStandardPartialOrder(xx); + # The elements of yy may not be the first elements of xx. + map_y := function(a) + return Position(xx, a); + end; + map_y := MappingByFunction(Domain(yy), Domain(Set([1 .. Size(xx)])), map_y); + + labels := ShallowCopy(yy); + Apply(labels, a -> Position(xx, a)); + y := InducedSubdigraph(x, labels); + SetDigraphVertexLabels(y, labels); + + # The semigroup quotient group is not a group object, so find an isomorphism. + map_g := IsomorphismPermGroup(grp); + map_g := CompositionMapping( + SmallerDegreePermutationRepresentation(Image(map_g)), map_g); + + # Create the action of Image(map_g) on x - this is the action of G on X. + anti_act := SEMIGROUPS.McAlisterTripleSemigroupConstructAction(xx, map_g); + act := function(pt, g) + return(anti_act(pt, g ^ -1)); + end; + + M := McAlisterTripleSemigroup(Range(map_g), x, y, act); + iso := function(s) + local t; + t := s; + return MTSE(M, (t ^ map_yy) ^ map_y, + CongruenceClassOfElement(cong, s) ^ map_g); + end; + return MappingByFunction(S, M, iso); +end); + +InstallMethod(IsomorphismSemigroup, +"for IsMcAlisterTripleSemigroup and a semigroup", +[IsMcAlisterTripleSemigroup, IsSemigroup], +function(filt, S) + return IsomorphismMcAlisterTripleSemigroup(S); +end); + +InstallMethod(IsWholeFamily, "for a McAlister triple semigroup", +[IsMcAlisterTripleSemigroupElementCollection], +function(C) + return Size(Elements(C)[1]![3]) = Size(C); +end); + +InstallMethod(ChooseHashFunction, "for McAlister triple semigroup elements", +[IsMcAlisterTripleSemigroupElement, IsInt], +function(x, hashlen) + local data; + data := [ChooseHashFunction(x[1], hashlen), + ChooseHashFunction(x[2], hashlen), + hashlen]; + return rec(func := SEMIGROUPS.HashFunctionForMcAlisterTripleSemigroupElements, + data := data); +end); +SEMIGROUPS.HashFunctionForMcAlisterTripleSemigroupElements := function(x, data) + return (17 * data[1].func(x[1], data[1].data) + + data[2].func(x[2], data[2].data)) mod data[3]; +end; + +############################################################################### +# F-inverse Semigroups +############################################################################### +# The connected components of the natural partial order will be the +# congruence classes of the minmum group congruence. Thus we can simply +# check that precisely one of the sources of the digraph of the natural +# partial order is in each connected component. +InstallMethod(IsFInverseMonoid, "for a semigroup", +[IsSemigroup], +function(S) + local comp, po; + if not IsInverseMonoid(S) then + return false; + fi; + po := Digraph(NaturalPartialOrder(S)); + for comp in DigraphConnectedComponents(po).comps do + if not Size(Intersection(comp, DigraphSources(po))) = 1 then + return false; + fi; + od; + return true; +end); + +InstallMethod(IsFInverseMonoid, "for a McAlister triple semigroup", +[IsMcAlisterTripleSemigroup], +function(S) + return IsMonoid(S) and IsFInverseSemigroup(S); +end); + +# A McAlister triple semigroup is F-inverse precisely when X, the partial +# order, is a join-semilattice. +InstallMethod(IsFInverseSemigroup, "for a McAlister triple semigroup", +[IsMcAlisterTripleSemigroup], +function(S) + return IsJoinSemilatticeDigraph(McAlisterTripleSemigroupPartialOrder(S)); +end); + +# For an inverse semigroup S we denote \sigma_{e,f} = \sigma \cap eSf x eSf. +# An E-unitary inverse semigroup is said to be an F-inverse semigroup if +# for each pair of idempotents (e,f): each \sigma_{e,f} class has a maximal +# element. It is simpler to find an isomorphism and use the above method. +InstallMethod(IsFInverseSemigroup, "for a semigroup", +[IsSemigroup], +function(S) + if not IsEUnitaryInverseSemigroup(S) then + return false; + fi; + return IsFInverseSemigroup(AsSemigroup(IsMcAlisterTripleSemigroup, S)); +end); + +############################################################################### +# Find E-unitary inverse covers +############################################################################### +# TODO: Replace SEMIGROUPS.DirectProductForCover with a proper implementation +# of direct products for partial perm semigroups. +InstallMethod(EUnitaryInverseCover, +"for an inverse partial perm semigroup", +[IsInverseSemigroup and IsPartialPermCollection], +function(S) + local s, cover_gens, deg, gens, iso, units, G, P; + gens := GeneratorsOfSemigroup(S); + deg := DegreeOfPartialPermSemigroup(S); + units := []; + cover_gens := []; + for s in gens do + Append(units, [SEMIGROUPS.PartialPermExtendToPerm(s, deg)]); + Append(cover_gens, [[s, SEMIGROUPS.PartialPermExtendToPerm(s, deg)]]); + od; + G := Semigroup(units); + iso := SEMIGROUPS.DirectProductForCover(S, G); + Apply(cover_gens, s -> s ^ iso); + P := InverseSemigroup(cover_gens); + return MappingByFunction(P, S, x -> (x ^ InverseGeneralMapping(iso))[1]); +end); + +InstallMethod(EUnitaryInverseCover, +"for an inverse semigroup", +[IsSemigroup], +function(S) + local cov, iso, T; + if not IsInverseSemigroup(S) then + ErrorNoReturn("Semigroups: EUnitaryInverseCover: usage,\n", + "the argument must be an inverse semigroup,"); + fi; + iso := IsomorphismPartialPermSemigroup(S); + T := Range(iso); + cov := EUnitaryInverseCover(T); + return CompositionMapping(InverseGeneralMapping(iso), cov); +end); + +# This method extends a partial perm 'x' to a permutation of degree 'deg'. +SEMIGROUPS.PartialPermExtendToPerm := function(x, deg) + local c, i, dom, image; + image := []; + # Turn all components into cycles. + for c in ComponentsOfPartialPerm(x) do + image[c[1]] := OnPoints(c[1], x); + if Size(c) > 1 then + for i in [1 .. Size(c) - 1] do + image[c[i]] := OnPoints(c[i], x); + od; + image[c[i + 1]] := c[1]; + fi; + od; + dom := [1 .. deg]; + # Map everything else to itself. + for i in dom do + if not IsBound(image[i]) then + image[i] := i; + fi; + od; + return(PartialPerm(dom, image)); +end; + +############################################################################### +# Function used by E-unitary cover. Will become obsolete when Semigroups has +# methods for direct products of partial perms semigroups. +############################################################################### +SEMIGROUPS.DirectProductForCover := function(S, T) + local dom, image, gens_DP, gens_S, gens_T, P, m, n, s, t, x; + gens_S := EmptyPlist(Size(GeneratorsOfSemigroup(S))); + gens_T := EmptyPlist(Size(GeneratorsOfSemigroup(T))); + m := DegreeOfPartialPermSemigroup(S); + n := DegreeOfPartialPermSemigroup(T); + + # Extend the domain of the generators of S and T so they commute. + for s in GeneratorsOfSemigroup(S) do + dom := Concatenation(DomainOfPartialPerm(s), [m + 1 .. m + n]); + image := Concatenation(ImageListOfPartialPerm(s), [m + 1 .. m + n]); + Add(gens_S, PartialPerm(dom, image)); + od; + for t in GeneratorsOfSemigroup(T) do + dom := Concatenation([1 .. m], m + DomainOfPartialPerm(t)); + image := Concatenation([1 .. m], m + ImageListOfPartialPerm(t)); + Add(gens_T, PartialPerm(dom, image)); + od; + + # Create a generating set for S x T. + gens_DP := EmptyPlist(2 * m * n); + for s in gens_S do + for t in gens_T do + Add(gens_DP, s * t * InverseOp(t)); + od; + od; + for s in gens_S do + for t in gens_T do + Add(gens_DP, InverseOp(s) * s * t); + od; + od; + + # Create the direct product + P := InverseSemigroup(gens_DP); + + # Return an isomorphism from Cartesian([S, T]) to the direct product. + return MappingByFunction(Domain(Set(Cartesian([S, T]))), P, x -> + PartialPerm(Concatenation(DomainOfPartialPerm(x[1]), [m + 1 .. m + n]), + Concatenation(ImageListOfPartialPerm(x[1]), [m + 1 .. m + n])) + * PartialPerm(Concatenation([1 .. m], m + DomainOfPartialPerm(x[2])), + Concatenation([1 .. m], m + ImageListOfPartialPerm(x[2])))); +end; + +############################################################################### +# TODO: +# 1) Write hash function that works when group is not a perm group. +# 2) Consider hash function for improvements. +# 3) Write OrderIdeal and FindOrderIrreducibleElements for digraphs package +# (order irreducible elements are the ones which generate the semilattice +# and order ideals relate to checking condition M2 from Howie). +# 4) Improve GeneratorsOfSemigroup method. +# 5) Replace SEMIGROUPS.DirectProductForCover with a proper implementation +# of direct products for partial perm semigroups. +# 6) Line break hints for printing MTSEs and McAlisterTripleSemigroups. +############################################################################### + diff --git a/gap/tools/utils.gi b/gap/tools/utils.gi index 9510e2d7d..2cf016b1e 100644 --- a/gap/tools/utils.gi +++ b/gap/tools/utils.gi @@ -87,6 +87,7 @@ SEMIGROUPS.DocXMLFiles := ["../PackageInfo.g", "semibipart.xml", "semiboolmat.xml", "semicons.xml", + "semieunit.xml", "semiex.xml", "semiffmat.xml", "semigraph.xml", diff --git a/init.g b/init.g index dfba95ab0..36db72bb2 100644 --- a/init.g +++ b/init.g @@ -75,6 +75,7 @@ ReadPackage("semigroups", "gap/semigroups/semicons.gd"); ReadPackage("semigroups", "gap/semigroups/semigraph.gd"); ReadPackage("semigroups", "gap/semigroups/semifp.gd"); ReadPackage("semigroups", "gap/semigroups/semiquo.gd"); +ReadPackage("semigroups", "gap/semigroups/semieunit.gd"); ReadPackage("semigroups", "gap/hash.gd"); diff --git a/read.g b/read.g index 1d044856d..24719b96c 100644 --- a/read.g +++ b/read.g @@ -49,6 +49,7 @@ ReadPackage("semigroups", "gap/semigroups/semigraph.gi"); ReadPackage("semigroups", "gap/semigroups/semiffmat.gi"); ReadPackage("semigroups", "gap/semigroups/grpffmat.gi"); ReadPackage("semigroups", "gap/semigroups/semiquo.gi"); +ReadPackage("semigroups", "gap/semigroups/semieunit.gi"); ReadPackage("semigroups", "gap/ideals/ideals.gi"); ReadPackage("semigroups", "gap/ideals/idealact.gi"); diff --git a/tst/extreme/semieunit.tst b/tst/extreme/semieunit.tst new file mode 100644 index 000000000..76f72f0f1 --- /dev/null +++ b/tst/extreme/semieunit.tst @@ -0,0 +1,50 @@ +############################################################################# +## +#W extreme/semieunit.tst +#Y Copyright (C) 2016 Christopher Russell +## +## Licensing information can be found in the README file of this package. +## +############################################################################# +## +gap> START_TEST("Semigroups package: standard/semieunit.tst"); +gap> LoadPackage("semigroups", false);; +gap> LoadPackage("Digraphs", false);; +gap> LoadPackage("smallsemi", false);; + +# Set info levels and user preferences +gap> SEMIGROUPS.StartTest(); + +#T# McAlisterTriple +gap> inv_semigroups := AllSmallSemigroups([2 .. 7], IsInverseSemigroup, true);; +#I Smallsemi: loading data for semigroup properties. Please be patient. +#I Smallsemi: loading data for semigroups of size 7. +gap> e_unitary_semigroups := Filtered(inv_semigroups, IsEUnitaryInverseSemigroup);; +gap> triples := ShallowCopy(e_unitary_semigroups);; +gap> Apply(triples, a -> AsSemigroup(IsPartialPermSemigroup, a));; +gap> Apply(triples, a -> IsomorphismSemigroup(IsMcAlisterTripleSemigroup, a));; +gap> BruteForceIsoCheck := function(iso) +> local x, y; +> if not IsInjective(iso) or not IsSurjective(iso) then +> return false; +> fi; +> for x in Generators(Source(iso)) do +> for y in Generators(Source(iso)) do +> if x ^ iso * y ^ iso <> (x * y) ^ iso then +> return false; +> fi; +> od; +> od; +> return true; +> end;; +gap> Apply(triples, a -> BruteForceIsoCheck(a));; +gap> false in triples; +false + +#T# SEMIGROUPS_UnbindVariables +gap> Unbind(e_unitary_semigroups); +gap> Unbind(inv_semigroups); +gap> Unbind(triples); + +#E# +gap> STOP_TEST("Semigroups package: extreme/eunittest.tst"); diff --git a/tst/standard/semieunit.tst b/tst/standard/semieunit.tst new file mode 100644 index 000000000..e2321e2e5 --- /dev/null +++ b/tst/standard/semieunit.tst @@ -0,0 +1,336 @@ +############################################################################# +## +#W standard/semieunit.tst +#Y Copyright (C) 2016 Christopher Russell +## +## Licensing information can be found in the README file of this package. +## +############################################################################# +## +gap> START_TEST("Semigroups package: standard/semieunit.tst"); +gap> LoadPackage("semigroups", false);; +gap> LoadPackage("Digraphs", false);; + +# Set info levels and user preferences +gap> SEMIGROUPS.StartTest(); + +#T# McAlisterTripleSemigroup +gap> G := SymmetricGroup([2 .. 5]);; +gap> x := Digraph([[1], [1, 2], [1, 3], [1, 4], [1, 5]]);; +gap> y := Digraph([[1], [1, 2], [1, 3], [1, 4]]);; +gap> M := McAlisterTripleSemigroup(G, x, y, OnPoints); + +gap> IsIsomorphicSemigroup(M, McAlisterTripleSemigroup(G, x, [1, 2, 3, 4], +> OnPoints)); +true +gap> IsIsomorphicSemigroup(M, McAlisterTripleSemigroup(G, x, y)); +true +gap> IsIsomorphicSemigroup(M, McAlisterTripleSemigroup(G, x, [1, 2, 3, 4])); +true +gap> M = McAlisterTripleSemigroup(G, x, [1, 2, 3, 4], OnPoints); +false +gap> M = Semigroup(Elements(M)); +true +gap> M1 := Semigroup(GeneratorsOfSemigroup(M));; +gap> M = M1; +true +gap> M = Semigroup(Elements(M)[2]); +false +gap> M1 := M;; +gap> M = M1; +true +gap> String(M); +"McAlisterTripleSemigroup(SymmetricGroup( [ 2 .. 5 ] ), Digraph( [ [ 1 ], [ 1,\ + 2 ], [ 1, 3 ], [ 1, 4 ], [ 1, 5 ] ] ), [ 1 .. 4 ])" +gap> Print(M, "\n"); +McAlisterTripleSemigroup(SymmetricGroup( [ 2 .. 5 ] ), Digraph( [ [ 1 ], [ 1, \ +2 ], [ 1, 3 ], [ 1, 4 ], [ 1, 5 ] ] ), [ 1 .. 4 ]) + +#T# McAlisterTripleSemigroup with bad inputs +gap> G1 := FreeGroup(1);; +gap> act := function(x, g) return x; end;; +gap> McAlisterTripleSemigroup(G1, Digraph([[1]]), [1], act); +Error, Semigroups: McAlisterTripleSemigroup: usage, +the first argument must be a finite group, +gap> x1 := Digraph([[1], [1], [3], [3], [1, 3, 5]]);; +gap> G1 := AutomorphismGroup(x1);; +gap> McAlisterTripleSemigroup(G1, x1, [1, 2, 5]);; +Error, Semigroups: McAlisterTripleSemigroup: usage, +the second argument must be a partial order digraph, +gap> x1 := Digraph([[1], [1, 2], [3], [3, 4], [1, 3, 5], [1, 3, 5, 6]]);; +gap> McAlisterTripleSemigroup(G, x1, x1);; +Error, Semigroups: McAlisterTripleSemigroup: usage, +the first argument (a group) must act by order automorphisms on the second arg\ +ument (a partial order digraph), +gap> y1 := Digraph([[1], [1, 2], [3], [3, 4], [1, 3, 5], [1, 3, 6]]);; +gap> McAlisterTripleSemigroup(Group(()), x1, y1); +Error, Semigroups: McAlisterTripleSemigroup: usage, +the third argument must be an induced subdigraph of +the second argument with vertex labels corresponding +to the vertices of on which was induced, +gap> G1 := SymmetricGroup([5 .. 11]);; +gap> McAlisterTripleSemigroup(G1, x, y);; +Error, Action not well-defined. See the manual section +``Action on canonical representatives''. +gap> x2 := Digraph([[1], [2], [1, 2, 3], [1, 2, 4]]);; +gap> G1 := AutomorphismGroup(x2);; +gap> McAlisterTripleSemigroup (G1, x2, x2);; +Error, Semigroups: McAlisterTripleSemigroup: usage, +the third argument must be a join-semilattice digraph, +gap> y2 := Digraph([[1]]);; +gap> SetDigraphVertexLabel(y2, 1, 2);; +gap> McAlisterTripleSemigroup(G, x, y2);; +Error, Semigroups: McAlisterTripleSemigroup: usage, +the out-neighbours of each vertex of which is in must contain only ver\ +tices which are in - see the documentation for more detail, +gap> McAlisterTripleSemigroup(TrivialSubgroup(G), x, y, OnPoints);; +Error, Semigroups: McAlisterTripleSemigroup: usage, +every vertex of must be in the orbit of some vertex of which is in \ + - see the documentation for more detail, +gap> y3 := Digraph([[1], [1, 2], [1, 3]]);; +gap> McAlisterTripleSemigroup(Group([(2, 3), (4, 5)]), x, y3, OnPoints); +Error, Semigroups: McAlisterTripleSemigroup: usage, +every vertex of must be in the orbit of some vertex of which is in \ + - see the documentation for more detail, +gap> x3 := Digraph([[1], [2]]);; +gap> McAlisterTripleSemigroup(AutomorphismGroup(x3), x3, y2);; +Error, Semigroups: McAlisterTripleSemigroup: + must fix the vertex of which is the minimal vertex of - see the \ +documentation for more detail, + +#T# IsomorphismSemigroup, AsSemigroup +gap> ps := InverseSemigroup([PartialPerm([2, 3, 4, 5], [1, 3, 5, 4]), +> PartialPerm([2, 3, 4, 5], [1, 4, 5, 3])]);; +gap> Mps := IsomorphismSemigroup(IsMcAlisterTripleSemigroup, ps);; +gap> Image(Mps); +[ (1, ()), (1, (2,3)), (1, (1,2)), (1, (1,2,3)), (1, (1,3,2)), (1, (1,3)), + (2, ()), (2, (2,3)), (2, (1,2,3)), (2, (1,3)), (3, ()), (3, (2,3)), + (3, (1,2)), (3, (1,3,2)) ] +gap> AsSemigroup(IsMcAlisterTripleSemigroup, ps); + +gap> ps := InverseSemigroup([PartialPerm([1, 4, 6, 7], [1, 4, 6, 7]), +> PartialPerm([2, 3, 6, 7], [2, 3, 6, 7]), PartialPerm([6, 7], [6, 7]), +> PartialPerm([2, 3, 5, 6, 7], [2, 3, 5, 6, 7]), +> PartialPerm([1, 4, 6, 7], [2, 3, 7, 6]), +> PartialPerm([2, 3, 6, 7], [1, 4, 7, 6]), PartialPerm([6, 7], [7, 6])]);; +gap> Mps := IsomorphismSemigroup(IsMcAlisterTripleSemigroup, ps);; +gap> Image(Mps); +[ (1, ()), (1, (1,2)), (2, ()), (3, ()), (3, (1,2)), (5, ()), (5, (1,2)) ] +gap> Elements(Range(Mps)); +[ (1, ()), (1, (1,2)), (2, ()), (3, ()), (3, (1,2)), (5, ()), (5, (1,2)) ] +gap> IsWholeFamily(Image(Mps)); +true +gap> AsSemigroup(IsMcAlisterTripleSemigroup, ps); + + +#T# AsSemigroup with bad input +gap> T := Semigroup([PartialPerm([1], [3]), +> PartialPerm([1, 2, 3], [2, 3, 1]), PartialPerm([1, 3], [2, 3])]);; +gap> AsSemigroup(IsMcAlisterTripleSemigroup, T); +Error, Semigroups: IsomorphismSemigroup: usage, +the semigroup is not E-unitary, + +#T# Other McAlisterTripleSemigroup tests +gap> G := SymmetricGroup([2 .. 5]);; +gap> x := Digraph([[1], [1, 2], [1, 3], [1, 4], [1, 5]]); + +gap> y := Digraph([[1], [1, 2], [1, 3], [1, 4]]); + +gap> M := McAlisterTripleSemigroup(G, x, y, OnPoints); + +gap> IsIsomorphicSemigroup(M, McAlisterTripleSemigroup(G, x, x)); +false +gap> IsInverseSemigroup(Semigroup(GeneratorsOfSemigroup(M))); +true +gap> elms := Enumerator(M);; +gap> String(elms[1]); +"MTSE(McAlisterTripleSemigroup(SymmetricGroup( [ 2 .. 5 ] ), Digraph( [ [ 1 ],\ + [ 1, 2 ], [ 1, 3 ], [ 1, 4 ], [ 1, 5 ] ] ), [ 1 .. 4 ]), 1, ())" +gap> OneImmutable(M); +Error, Semigroups: OneImutable (for McAlister triple semigroup): usage, +the argument must be a monoid, +gap> M1 := McAlisterTripleSemigroup(G, x, [1, 2]);; +gap> OneImmutable(M1); +(2, ()) + +#T# McAlister triple semigroup elements +gap> MTSE(M, 4, (2, 4)(3, 5)) * MTSE(M, 4, (2, 5, 3, 4)); +(1, (4,5)) +gap> MTSE(M, 1, (2, 3, 4, 5)) ^ -2; +(1, (2,4)(3,5)) +gap> M = MTSEParent(MTSE(M, 1, (4, 5))); +true +gap> M = McAlisterTripleSemigroupElementParent(MTSE(M, 1, (4, 5))); +true +gap> MTSE(M, 10, (2, 3, 4, 5)); +Error, Semigroups: McAlisterTripleSemigroupElement: usage, +second argument should be a vertex label of the join-semilattice of the McAlis\ +ter triple, +gap> MTSE(M, 1, (5, 6)); +Error, Semigroups: McAlisterTripleSemigroupElement: usage, +third argument must an element of the group of the McAlister triple, +gap> MTSE(M, 3, (2, 4)(3, 5)); +Error, Semigroups: McAlisterTripleSemigroupElement: usage, +the arguments do not specify an element of the McAlister triple semigroup, +gap> MTSE(M, 1, ())[3]; +Error, Semigroups: ELM_LIST (for a McAlisterTripleSemigroupElement): usage, +the index must be at most 2, +gap> M1 := McAlisterTripleSemigroup(G, x, x);; +gap> MTSE(M1, 4, (2, 4)(3, 5)) * MTSE(M, 4, (2, 5, 3, 4)); +Error, Semigroups: * (for an McAlisterTripleSemigroupElement): usage, +the elements must be from the same McAlister triple semigroup, + +#T# IsomorphismSemigroups +gap> x1 := Digraph([[1], [1, 2], [1, 3], [1, 2, 3, 4], [1, 2, 3, 5]]);; +gap> G1 := Group([(4, 5)]);; +gap> x2 := Digraph([[1, 3, 4, 5], [2, 3, 4, 5], [3, 5], [4, 5], [5]]);; +gap> G2 := Group([(1, 2)]);; +gap> M1 := McAlisterTripleSemigroup(G1, x1, [1, 2, 3, 4]);; +gap> M2 := McAlisterTripleSemigroup(G2, x2, [1, 3, 4, 5]);; +gap> IsomorphismSemigroups(M1, M2); +MappingByFunction( , , function( s ) ... end ) +gap> x3 := Digraph([[1], [1, 2], [1, 3], [1, 2, 4], [1, 2, 5], [1, 3, 6], +> [1, 3, 7]]);; +gap> y3 := Digraph([[1], [1, 2], [1, 2, 3], [1, 2, 4]]);; +gap> y4 := Digraph([[1], [1, 2], [1, 2, 3], [1, 2, 4]]);; +gap> SetDigraphVertexLabels(y3, [1, 3, 7, 6]);; +gap> SetDigraphVertexLabels(y4, [1, 2, 4, 5]);; +gap> G3 := Group([(6, 7), (4, 5), (2, 3)(4, 6)(5, 7)]);; +gap> M3 := McAlisterTripleSemigroup(G3, x3, y3);; +gap> M4 := McAlisterTripleSemigroup(G3, x3, y4);; +gap> IsomorphismSemigroups(M3, M4); +MappingByFunction( , , function( s ) ... end ) +gap> IsomorphismSemigroups(M1, M3); +fail +gap> M5 := McAlisterTripleSemigroup(G3, x3, [1, 2, 3, 4, 5]);; +gap> IsomorphismSemigroups(M5, M3); +fail +gap> M6 := McAlisterTripleSemigroup(Group((4, 5)), x1, [1, 2, 3, 4]);; +gap> x4 := Digraph([[1], [1, 2], [1, 3], [1, 2, 3, 4]]);; +gap> M7 := McAlisterTripleSemigroup(Group((5, 6)), x4, x4);; +gap> IsomorphismSemigroups(M6, M7); +fail + +#T# IsomorphicSemigroups with bad input +gap> x1 := Digraph([[1], [1, 2], [1, 3]]);; +gap> G := Group((2, 3));; +gap> M1 := McAlisterTripleSemigroup(G, x1, x1);; +gap> M2 := McAlisterTripleSemigroup(G, x1, [1, 2]);; +gap> IsomorphismSemigroups(M1, M2); +fail +gap> x1 := Digraph([[1], [1, 2], [1, 3]]);; +gap> x2 := Digraph([[1], [1, 2], [1, 3], [1, 4]]);; +gap> M3 := McAlisterTripleSemigroup(Group((2, 3), (2, 3, 4)), x2, x1);; +gap> IsomorphismSemigroups(M1, M3); +fail +gap> M4 := McAlisterTripleSemigroup(Group(()), x1, x1);; +gap> IsomorphismSemigroups(M1, M4); +fail +gap> act := function(x, g) +> return x; +> end;; +gap> M5 := McAlisterTripleSemigroup(G, x1, x1, act);; +gap> IsomorphismSemigroups(M1, M5); +fail + +#T# IsomorphismSemigroups, where RepresentativeAction fails +gap> gr := DigraphFromDigraph6String("+H_A?GC_Q@G~wA?G"); + +gap> G := Group((1, 2, 3)(4, 5, 6), (8, 9)); +Group([ (1,2,3)(4,5,6), (8,9) ]) +gap> S1 := McAlisterTripleSemigroup(G, gr, [1, 4, 5, 7, 8]); + +gap> S2 := McAlisterTripleSemigroup(G, gr, [3, 6, 7, 8, 9]); + +gap> IsomorphismSemigroups(S1, S2); +fail + +#T# IsIsomorphicSemigroup +gap> IsIsomorphicSemigroup(M1, M1); +true +gap> IsIsomorphicSemigroup(M1, M5); +false + +#T# IsFInverseMonoid, IsFInverseSemigroup +gap> S := Semigroup([Transformation([2, 2]), Transformation([2, 1, 2]), +> Transformation([3, 3, 2])]);; +gap> IsFInverseMonoid(S); +false +gap> IsFInverseSemigroup(S); +false +gap> S := InverseMonoid([PartialPermNC([1, 3], [1, 3]), +> PartialPermNC([1, 2], [3, 1]), PartialPermNC([1, 2], [3, 2])]);; +gap> IsFInverseMonoid(S); +false +gap> S := InverseMonoid([PartialPermNC([1], [1]), +> PartialPermNC([1, 2], [1, 2]), PartialPermNC([1, 2, 3], [1, 2, 3])]);; +gap> IsFInverseMonoid(S); +true +gap> IsFInverseSemigroup(S); +true +gap> G := Group((2, 3));; +gap> x := Digraph([[1], [1, 2], [1, 3]]);; +gap> M := McAlisterTripleSemigroup(G, x, x);; +gap> IsFInverseSemigroup(M); +true +gap> IsFInverseMonoid(M); +false +gap> M := McAlisterTripleSemigroup(Group(()), Digraph([[1], [1, 2]]), [1, 2]);; +gap> IsFInverseMonoid(M); +true +gap> IsFInverseSemigroup(M); +true +gap> S := McAlisterTripleSemigroup(Group((4, 5)), +> Digraph([[1], [1, 2], [1, 3], [1, 2, 3, 4], [1, 2, 3, 5]]), [1 .. 4]); + +gap> IsFInverseSemigroup(S); +false + +#T# EUnitaryInverseCover +gap> S := InverseMonoid([PartialPermNC([1, 3], [1, 3]), +> PartialPermNC([1, 2], [3, 1]), PartialPermNC([1, 2], [3, 2])]);; +gap> cov := EUnitaryInverseCover(S);; +gap> IsEUnitaryInverseSemigroup(Source(cov)); +true +gap> S = Range(cov); +true +gap> S := Monoid([Transformation([1, 4, 4, 4]), +> Transformation([1, 2, 4, 4])]);; +gap> cov := EUnitaryInverseCover(S);; +gap> IsEUnitaryInverseSemigroup(Source(cov)); +true +gap> S = Range(cov); +true +gap> S := Semigroup([Bipartition([[1, 3, -1, -2, -3], [2]]), +> Bipartition([[1, 3, -1, -2], [2, -3]]), +> Bipartition([[1, 3], [2], [-1, -2, -3]]), +> Bipartition([[1, -2, -3], [2, 3, -1]])]);; +gap> EUnitaryInverseCover(S); +Error, Semigroups: EUnitaryInverseCover: usage, +the argument must be an inverse semigroup, + +#T# SEMIGROUPS_UnbindVariables +gap> Unbind(A); +gap> Unbind(act); +gap> Unbind(cov); +gap> Unbind(elms); +gap> Unbind(G); +gap> Unbind(M); +gap> Unbind(Mps); +gap> Unbind(ps); +gap> Unbind(S); +gap> Unbind(x); +gap> Unbind(x1); +gap> Unbind(x2); +gap> Unbind(x3); +gap> Unbind(y); +gap> Unbind(y1); +gap> Unbind(y2); +gap> Unbind(y3); + +#E# +gap> STOP_TEST("Semigroups package: standard/eunittest.tst");