From d7f99d5b5cb375184cd68096636e74a966d44c2b Mon Sep 17 00:00:00 2001 From: ChristopherRussell Date: Tue, 20 Jun 2017 20:31:17 +0100 Subject: [PATCH 1/8] semieunit: implement McAlister triple semigroups --- gap/main/fropin.gi | 3 + gap/semigroups/semieunit.gd | 74 ++++ gap/semigroups/semieunit.gi | 702 ++++++++++++++++++++++++++++++++++++ init.g | 1 + read.g | 1 + 5 files changed, 781 insertions(+) create mode 100644 gap/semigroups/semieunit.gd create mode 100644 gap/semigroups/semieunit.gi 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..046eb18de --- /dev/null +++ b/gap/semigroups/semieunit.gd @@ -0,0 +1,74 @@ +############################################################################# +## +#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); + +DeclareRepresentation("IsMcAlisterTripleSemigroupElementRep", + IsMcAlisterTripleSemigroupElement + and IsPositionalObjectRep, 2); + +DeclareCategoryCollections("IsMcAlisterTripleSemigroupElement"); +DeclareSynonymAttr("IsMcAlisterTripleSemigroup", + IsInverseSemigroup and IsGeneratorsOfInverseSemigroup + and IsMcAlisterTripleSemigroupElementCollection + and IsWholeFamily and IsEnumerableSemigroupRep); +# TODO: Add description. See congpairs.gd +DeclareRepresentation("IsMcAlisterTripleSemigroupDefaultRep", + IsMcAlisterTripleSemigroup and IsAttributeStoringRep, + []); + +InstallTrueMethod(IsGeneratorsOfInverseSemigroup, + IsMcAlisterTripleSemigroupElementCollection); + +# Operations for creating McAlister triple semigroups +DeclareOperation("McAlisterTripleSemigroup", + [IsGroup, IsFunction, IsDigraph, IsDigraph]); +DeclareOperation("McAlisterTripleSemigroup", + [IsGroup, IsFunction, IsDigraph, IsHomogeneousList]); +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); + +# Operations for McAlister triple semigroups +DeclareOperation("IsomorphismMcAlisterTripleSemigroup", [IsSemigroup]); +DeclareOperation("AsMcAlisterTripleSemigroup", [IsSemigroup]); +DeclareOperation("EUnitaryInverseCover", [IsSemigroup]); + +# Operations for creating McAlister triple semigroup elements +DeclareOperation("McAlisterTripleSemigroupElement", + [IsMcAlisterTripleSemigroup, + IsPosInt, IsMultiplicativeElementWithInverse]); +DeclareOperation("MTE", [IsMcAlisterTripleSemigroup, IsPosInt, + IsMultiplicativeElementWithInverse]); + +# Operations for McAlister triple semigroup elements +DeclareOperation("McAlisterTripleSemigroupElementParent", + [IsMcAlisterTripleSemigroupElementRep]); +DeclareOperation("MTEParent", + [IsMcAlisterTripleSemigroupElementRep]); +DeclareOperation("ELM_LIST", [IsMcAlisterTripleSemigroupElementRep, IsPosInt]); + +# F-inverse semigroup property +DeclareOperation("IsFInverseSemigroup", [IsSemigroup]); +DeclareOperation("IsFInverseMonoid", [IsSemigroup]); diff --git a/gap/semigroups/semieunit.gi b/gap/semigroups/semieunit.gi new file mode 100644 index 000000000..099f9aa1c --- /dev/null +++ b/gap/semigroups/semieunit.gi @@ -0,0 +1,702 @@ +############################################################################# +## +#W semieunit.gi +#Y Copyright (C) 2017 Christopher Russell +## +## Licensing information can be found in the README file of this package. +## +############################################################################# +# +# This code is based on the description of McAlister triple semigroups found +# in Fundamentals of Semigroup Theory by John Howie. +# +############################################################################# +# Methods for creating McAlister triple semigroups +############################################################################# +InstallMethod(McAlisterTripleSemigroup, +"for a perm group, action, digraph, and digraph", +[IsGroup, IsFunction, IsDigraph, IsDigraph], +function(G, act, X, Y) + local anti_act, hom, y_edges, out_nbrs, orbs, min, fam, 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 third argument (a partial order ", + "digraph),"); + elif not IsPartialOrderDigraph(X) then + ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: usage,\n", + "the third argument must be a partial order digraph,"); + fi; + + # To check if the edges of y are a subset of the edges of x we need to apply + # the labeling of y's vertices to its edges. + y_edges := List(DigraphEdges(Y), edge -> [DigraphVertexLabels(Y)[edge[1]], + DigraphVertexLabels(Y)[edge[2]]]); + + if not (IsSubset(DigraphVertexLabels(X), DigraphVertexLabels(Y)) and + IsSubset(DigraphEdges(X), y_edges)) then + ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: usage,\n", + "the fourth argument must be a subdigraph of the third ", + "argument,"); + elif not IsJoinSemilatticeDigraph(Y) then + ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: usage,\n", + "the fourth 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 DigraphVertexLabels(X) do + if not x in DigraphVertexLabels(Y) then + for y in DigraphVertexLabels(Y) do + if Intersection(out_nbrs[x], out_nbrs[y]) = out_nbrs[x] then + ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: usage,\n", + "condition M2 is not satisfied - see the ", + "documentation for details,"); + 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", + "condition M3 is not satisfied - see the documentation ", + "for details,"); + fi; + + for x in DigraphVertexLabels(X) do + if not x in Union(orbs) + and not (x in DigraphVertexLabels(Y)) then + ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: \n", + "Condition M3 is not satisfied - see the documentation ", + "for details,"); + fi; + od; + + # Check condition M4 (essentially, check that X is connected.) + min := DigraphSinks(DigraphRemoveLoops(X))[1]; + if ForAny(GeneratorsOfGroup(Image(hom)), g -> min ^ g <> min) then + ErrorNoReturn("Semigroups: McAlisterTriple: usage,\n", + "condition M4 is not satisfied - see the documentation ", + "for details,"); + fi; + + fam := NewFamily("McAlisterTripleSemigroupFamily", + IsMcAlisterTripleSemigroupElement); + + # Create the semigroup itself + M := Objectify(NewType(CollectionsFamily(fam), + IsMcAlisterTripleSemigroup 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, OnPoints, X, Y); +end); + +InstallMethod(McAlisterTripleSemigroup, +"for a perm group, action, digraph, and a homogeneous list", +[IsGroup, IsFunction, IsDigraph, IsHomogeneousList], +function(G, act, X, sub_ver) + return McAlisterTripleSemigroup(G, act, X, InducedSubdigraph(X, sub_ver)); +end); + +InstallMethod(McAlisterTripleSemigroup, +"for a perm group, digraph, and a homogeneous list", +[IsPermGroup, IsDigraph, IsHomogeneousList], +function(G, X, sub_ver) + return McAlisterTripleSemigroup(G, OnPoints, X, + InducedSubdigraph(X, sub_ver)); +end); + +############################################################################# +# Operations for McAlister triple semigroups +############################################################################# +InstallMethod(\=, "for two McAlister triple semigroups", +[IsMcAlisterTripleSemigroup, IsMcAlisterTripleSemigroup], +function(x, y) + local A, G, X, Y, g; + G := McAlisterTripleSemigroupGroup(x); + X := McAlisterTripleSemigroupPartialOrder(x); + Y := McAlisterTripleSemigroupSemilattice(x); + if G = McAlisterTripleSemigroupGroup(y) + and X = McAlisterTripleSemigroupPartialOrder(y) + and Y = McAlisterTripleSemigroupSemilattice(y) then + if ForAll(G, g -> ForAll(DigraphVertices(X), + A -> McAlisterTripleSemigroupAction(x)(A, g) = + McAlisterTripleSemigroupAction(y)(A, g))) then + return true; + fi; + fi; + return false; +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, MTE(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(Y), ")"); +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 iso_g, iso_x; + + if not IsIsomorphicDigraph(McAlisterTripleSemigroupSemilattice(S), + McAlisterTripleSemigroupSemilattice(T)) then + return fail; + fi; + + iso_x := IsomorphismDigraphs(McAlisterTripleSemigroupPartialOrder(S), + McAlisterTripleSemigroupPartialOrder(T)); + + if iso_x = fail then + return fail; + fi; + + iso_g := IsomorphismGroups(McAlisterTripleSemigroupGroup(S), + McAlisterTripleSemigroupGroup(T)); + if iso_g = fail then + return fail; + fi; + + if ForAll(McAlisterTripleSemigroupGroup(S), + g -> ForAll(DigraphVertices(McAlisterTripleSemigroupPartialOrder(S)), + x -> (McAlisterTripleSemigroupAction(S)(x, g)) ^ iso_x + = McAlisterTripleSemigroupAction(T)((x ^ iso_x), (g ^ iso_g)))) then + return MappingByFunction(S, T, s -> MTE(T, s[1] ^ iso_x, s[2] ^ iso_g)); + fi; + + return fail; +end); + +InstallMethod(IsIsomorphicSemigroup, "for two McAlister triple semigroups", +[IsMcAlisterTripleSemigroup and HasGeneratorsOfSemigroup, +IsMcAlisterTripleSemigroup and HasGeneratorsOfSemigroup], +function(S, T) + if IsomorphismSemigroups(S, T) = fail then + return false; + fi; + return true; +end); + +############################################################################# +# Operations 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 input should be a vertex of the join semilattice of", + " the McAlister triple,"); + elif not g in McAlisterTripleSemigroupGroup(S) then + ErrorNoReturn("Semigroups: McAlisterTripleSemigroupElement: usage,\n", + "third input 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(MTE, +"for a McAlister triple semigroup, pos int, and perm", +[IsMcAlisterTripleSemigroup, IsPosInt, IsMultiplicativeElementWithInverse], +function(S, A, g) + return McAlisterTripleSemigroupElement(S, A, g); +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(MTEParent, +"for a McAlister triple semigroup element rep", +[IsMcAlisterTripleSemigroupElementRep], +function(x) + return x![3]; +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("MTE(", String(x![3]), ", ", + String(DigraphVertexLabels( + McAlisterTripleSemigroupSemilattice(x![3]))[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", +[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 MTE(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 MTE(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, +[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: IsomorphismMcAlisterTripleSemigroup: 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(Image(map_g), act, x, y); + iso := function(s) + local t; + t := s; + return MTE(M, (t ^ map_yy) ^ map_y, + CongruenceClassOfElement(cong, s) ^ map_g); + end; + return MappingByFunction(S, M, iso); +end); + +InstallMethod(AsMcAlisterTripleSemigroup, +[IsSemigroup], +function(S) + return Range(IsomorphismMcAlisterTripleSemigroup(S)); +end); + +InstallMethod(IsWholeFamily, "for a McAlister triple semigroup", +[IsMcAlisterTripleSemigroupElementCollection], +function(C) + return Size(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 IsFInverseSemigroup(S) and IsMonoid(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(AsMcAlisterTripleSemigroup(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 MTEs and McAlisterTripleSemigroups. +############################################################################### 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"); From 07a70e19672406a02a1363de290c0feb6e844295 Mon Sep 17 00:00:00 2001 From: ChristopherRussell Date: Tue, 20 Jun 2017 20:31:55 +0100 Subject: [PATCH 2/8] tests: add tests for McAlister triple semigroups --- tst/extreme/semieunit.tst | 50 +++++++ tst/standard/semieunit.tst | 271 +++++++++++++++++++++++++++++++++++++ 2 files changed, 321 insertions(+) create mode 100644 tst/extreme/semieunit.tst create mode 100644 tst/standard/semieunit.tst diff --git a/tst/extreme/semieunit.tst b/tst/extreme/semieunit.tst new file mode 100644 index 000000000..ca46cb073 --- /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 -> IsomorphismMcAlisterTriple(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..d1f4fb6fb --- /dev/null +++ b/tst/standard/semieunit.tst @@ -0,0 +1,271 @@ +############################################################################# +## +#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, OnPoints, x, y); + +gap> M = McAlisterTripleSemigroup(G, OnPoints, x, [1, 2, 3, 4]); +true +gap> M = McAlisterTripleSemigroup(G, x, y); +true +gap> M = McAlisterTripleSemigroup(G, x, [1, 2, 3, 4]); +true +gap> String(M); +"McAlisterTripleSemigroup(SymmetricGroup( [ 2 .. 5 ] ), Digraph( [ [ 1 ], [ 1,\ + 2 ], [ 1, 3 ], [ 1, 4 ], [ 1, 5 ] ] ), Digraph( [ [ 1 ], [ 1, 2 ], [ 1, 3 ], \ +[ 1, 4 ] ] ))" + +#T# McAlisterTripleSemigroup with bad inputs +gap> G1 := FreeGroup(1);; +gap> act := function(x, g) return x; end;; +gap> McAlisterTripleSemigroup(G1, act, Digraph([[1]]), [1]); +Error, Semigroups: McAlisterTripleSemigroup: usage, +the first argument must be a finite group, +gap> y1 := Digraph([[1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6]]);; +gap> McAlisterTripleSemigroup(G, x, y1);; +Error, Semigroups: McAlisterTripleSemigroup: usage, +the fourth argument must be a subdigraph of the third argument, +gap> x1 := Digraph([[1], [1], [3], [3, 4], [1, 3, 5]]);; +gap> McAlisterTripleSemigroup(G, x1, x1);; +Error, Semigroups: McAlisterTripleSemigroup: usage, +the first argument (a group) must act by order automorphisms on the third argu\ +ment (a partial order digraph), +gap> G1 := SymmetricGroup([5 .. 11]);; +gap> McAlisterTripleSemigroup(G1, x, y);; +Error, Action not well-defined. See the manual section +``Action on canonical representatives''. +gap> G1 := AutomorphismGroup(x1);; +gap> McAlisterTripleSemigroup(G1, x1, x1);; +Error, Semigroups: McAlisterTripleSemigroup: usage, +the third argument must be a partial order digraph, +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 fourth 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, +condition M2 is not satisfied - see the documentation for details, +gap> McAlisterTripleSemigroup(TrivialSubgroup(G), OnPoints, x, y);; +Error, Semigroups: McAlisterTripleSemigroup: +Condition M3 is not satisfied - see the documentation for details, +gap> y3 := Digraph([[1], [1, 2], [1, 3]]);; +gap> McAlisterTripleSemigroup(Group([(2, 3), (4, 5)]), OnPoints, x, y3); +Error, Semigroups: McAlisterTripleSemigroup: usage, +condition M3 is not satisfied - see the documentation for details, +gap> x3 := Digraph([[1], [2]]);; +gap> McAlisterTripleSemigroup(AutomorphismGroup(x3), x3, y2);; +Error, Semigroups: McAlisterTriple: usage, +condition M4 is not satisfied - see the documentation for details, + +#T# IsomorphismSemigroup, AsMcAlisterTripleSemigroup +gap> ps := InverseSemigroup([PartialPerm([2, 3, 4, 5], [1, 3, 5, 4]), +> PartialPerm([2, 3, 4, 5], [1, 4, 5, 3])]);; +gap> Mps := IsomorphismMcAlisterTripleSemigroup(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> AsMcAlisterTripleSemigroup(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 := IsomorphismMcAlisterTripleSemigroup(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> AsMcAlisterTripleSemigroup(ps); + + +#T# AsMcAlisterTripleSemigroup with bad input +gap> T := Semigroup([PartialPerm([1], [3]), +> PartialPerm([1, 2, 3], [2, 3, 1]), PartialPerm([1, 3], [2, 3])]);; +gap> AsMcAlisterTripleSemigroup(T); +Error, Semigroups: IsomorphismMcAlisterTripleSemigroup: 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, OnPoints, x, y); + +gap> M = McAlisterTripleSemigroup(AutomorphismGroup(x), x, y); +true +gap> M = McAlisterTripleSemigroup(G, x, x); +false +gap> IsInverseSemigroup(Semigroup(GeneratorsOfSemigroup(M))); +true +gap> elms := Enumerator(M);; +gap> String(elms[1]); +"MTE(McAlisterTripleSemigroup(SymmetricGroup( [ 2 .. 5 ] ), Digraph( [ [ 1 ], \ +[ 1, 2 ], [ 1, 3 ], [ 1, 4 ], [ 1, 5 ] ] ), Digraph( [ [ 1 ], [ 1, 2 ], [ 1, 3\ + ], [ 1, 4 ] ] )), 1, ())" + +#T# McAlister triple semigroup elements +gap> MTE(M, 4, (2, 4)(3, 5)) * MTE(M, 4, (2, 5, 3, 4)); +(1, (4,5)) +gap> MTE(M, 1, (2, 3, 4, 5)) ^ -2; +(1, (2,4)(3,5)) +gap> M = MTEParent(MTE(M, 1, (4, 5))); +true +gap> M = McAlisterTripleSemigroupElementParent(MTE(M, 1, (4, 5))); +true +gap> MTE(M, 10, (2, 3, 4, 5)); +Error, Semigroups: McAlisterTripleSemigroupElement: usage, +second input should be a vertex of the join semilattice of the McAlister tripl\ +e, +gap> MTE(M, 1, (5, 6)); +Error, Semigroups: McAlisterTripleSemigroupElement: usage, +third input must an element of the group of the McAlister triple, +gap> MTE(M, 3, (2, 4)(3, 5)); +Error, Semigroups: McAlisterTripleSemigroupElement: usage, +the arguments do not specify an element of the McAlister triple semigroup, +gap> MTE(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> MTE(M1, 4, (2, 4)(3, 5)) * MTE(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 ) + +#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, act, x1, x1);; +gap> IsomorphismSemigroups(M1, M5); +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 + +#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"); From 78623f39429d806bac869a3d3ccf87687196120a Mon Sep 17 00:00:00 2001 From: ChristopherRussell Date: Tue, 20 Jun 2017 20:33:13 +0100 Subject: [PATCH 3/8] doc: document McAlister triple semigroups and their methods --- doc/semieunit.xml | 292 +++++++++++++++++++++++++++++++++++++++++++++ doc/z-chap15.xml | 118 +++++++++++++++++- gap/tools/utils.gi | 1 + 3 files changed, 410 insertions(+), 1 deletion(-) create mode 100644 doc/semieunit.xml diff --git a/doc/semieunit.xml b/doc/semieunit.xml new file mode 100644 index 000000000..b891e513b --- /dev/null +++ b/doc/semieunit.xml @@ -0,0 +1,292 @@ +############################################################################ +## +#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. + + A McAlister triple semigroup is an E-unitary inverse semigroup + + defined by a partial order, a semilattice and a group which acts by + order automorphisms on the partial order. All E-unitary inverse + semigroups can be represented as a McAlister triple semigroup and all + McAlister triple semigroups define E-unitary inverse semigroups.

+ + We use two objects to + represent the partial order and the semilattice of a McAlister triple. + These will satisfy and , respecitvely.

+ + A rigorous treatment of McAlister triples may be found in Chapter 5 + of . The precise conditions + for a triple in &GAP; are as follows: + + + M1 + + Y is a semilattice which is a subdigraph of X. + + M2 + + For all A in X and for all B in Y: + if A \leq B then A in Y. + + M3 + + For every A in X there exists some B in + Y and g in G such that A is equal to + B acted on by g. + + M4 + + For all g in G we have that the intersection of Y + acted on by g with Y is non-empty. + + + + 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, OnPoints, x, y); + +gap> T := McAlisterTripleSemigroup(A, x, y); + +gap> T = S; +true +gap> GeneratorsOfSemigroup(T); +[ (1, ()), (2, ()), (3, ()), (1, (2,4)(3,5)) ] +gap> AsSemigroup(IsPartialPermSemigroup, T); +]]> + + +<#/GAPDoc> + +<#GAPDoc Label="McAlisterTripleSemigroup"> + + + + + + A McAlister triple semigroup. + + McAlisterTripleSemigroup requires a digraph X satisfying + , a + Y satisfying + , a group + G, and a function act defining an action of G on + X. McAlisterTripleSemigroup also has a three argument + version which assumes that act is . Furthermore there are three and four argument + versions where the homogeneous list sub_ver of vertices of + X replaces Y as an argument. When sub_ver is + provided, a McAlister triple semigroup is created with semilattice + InducedSubdigraph(X, sub_ver).

+ + Finally, the user may use McAlsiterTriple with a single argument, + S, which is an E-unitary inverse semigroup and it will return a + McAlister triple semigroup that is isomorphic to S. + + +<#/GAPDoc> + +<#GAPDoc Label="IsMcAlisterTripleSemigroupElement"> + + + + true or false. + + A McAlister triple semigroup element of the McAlister triple + semigroup M:=McAlisterTripleSemigroup=(G,act,X,Y) is a pair + consisting of a vertex A of the semilattice Y and an + element g of the group G such that + OnPoints(A,g^-1) is in Y. The functions + and + are identicial. + + 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, OnPoints, x, y); + +gap> T := McAlisterTripleSemigroup(A, x, y); + +gap> T = S; +true +gap> a := MTE(S, 1, (2, 4)(3, 5)); +(1, (2,4)(3,5)) +gap> a * a; +(1, ()) +gap> gens := GeneratorsOfSemigroup(S); +[ (1, ()), (2, ()), (3, ()), (1, (2,4)(3,5)) ] +gap> P := AsSemigroup(IsPartialPermSemigroup, S); + +gap> IsomorphismMcAlisterTripleSemigroup(P); +MappingByFunction( , , function( s ) ... end ) +]]> + + + +<#/GAPDoc> + +<#GAPDoc Label="McAlisterTripleSemigroupElement"> + + + + A McAlister triple semigroup element. + + Returns the McAlister triple semigroup element of the McAlister + triple semigroup S which corresponds to the semilattice vertex + A and group element g, if this specifices an element of + S. The functions and are identicial. + + + +<#/GAPDoc> + +<#GAPDoc Label="AsMcAlisterTripleSemigroup"> + + + A McAlister triple semigroup. + + This function can be used to find a McAlister triple semigroup which is + isomorphic to a given semigroup. + + +<#/GAPDoc> + +<#GAPDoc Label="IsomorphismMcAlisterTripleSemigroup"> + + + An isomorphism. + + This function can be used to find an isomorphism from a given semigroup + S to an isomorphic McAlister triple semigroup, provided such an + isomorphism exists. + 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, OnPoints, x, y); + +gap> T := McAlisterTripleSemigroup(A, x, y); + +gap> T = S; +true +gap> a := MTE(S, 1, (2, 4)(3, 5)); +(1, (2,4)(3,5)) +gap> a * a; +(1, ()) +gap> gens := GeneratorsOfSemigroup(S); +[ (1, ()), (2, ()), (3, ()), (1, (2,4)(3,5)) ] +gap> P := AsSemigroup(IsPartialPermSemigroup, S); + +gap> IsomorphismMcAlisterTripleSemigroup(P); +MappingByFunction( , , function( s ) ... end ) +gap> AsMcAlisterTripleSemigroup(P); + + ]]> + + +<#/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 E-unitary inverse semigroup to S. A semigroup + homomorphism is said to be idempotent separating if no two idempotents + are mapped to the same element of in 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 function determines whether a given semigroup is an F-inverse + semigroup. F-inverse semigroup are a class of E-unitary inverse + semigroups. A McAlister triple semigroup + McAlisterTripleSemigroup(G,act,X,Y) is F-inverse precisely when + the partial order digraph X is a join-semilattice digraph. This + function uses to find a + McAlister triple semigroup isomorphic to S then checks if the + McAlister triple semigroup is F-inverse. + + 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, OnPoints, x, y); + +gap> T := McAlisterTripleSemigroup(A, x, y); + +gap> T = S; +true +gap> a := MTE(S, 1, (2, 4)(3, 5)); +(1, (2,4)(3,5)) +gap> a * a; +(1, ()) +gap> gens := GeneratorsOfSemigroup(S); +[ (1, ()), (2, ()), (3, ()), (1, (2,4)(3,5)) ] +gap> P := AsSemigroup(IsPartialPermSemigroup, S); + +gap> IsomorphismMcAlisterTripleSemigroup(P); +MappingByFunction( , , function( s ) ... end ) +gap> AsMcAlisterTripleSemigroup(P); + + ]]> + + +<#/GAPDoc> diff --git a/doc/z-chap15.xml b/doc/z-chap15.xml index 941147f46..bfa69cdad 100644 --- a/doc/z-chap15.xml +++ b/doc/z-chap15.xml @@ -65,5 +65,121 @@ <#Include Label = "IsMonogenicInverseMonoid"> - + + + + +

+ + + McAlister triple semigroups and E-unitary inverse semigroups + + In this section, we describe the functions in &GAP; for McAlister + triple semigroups and their subsemigroups. The importance of these + semigroups lies in the fact that the McAlister triple semigroups are + exactly the E-unitary inverse semigroups.

+ + First we define an E-unitary inverse semigroup. 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 we have that: + + + (i) + + es \in E implies s \in E, + + (ii) + + se \in E implies s \in E. + + + + For inverse semigroups these two conditions are equivalent. We are only + interested in E-unitary inverse semigroups. A + McAlister triple semigroup is, briefly, an E-unitary inverse + semigroup defined by a partial order X, a join semilattice Y + which is a suborder of X and a group which acts on X, on the + right, as an order automorphism. Such a McAlister triple is denoted by + M(G,X,Y) and it is the set of pairs [A,g] in + Y x G such that A acted on by g inverse is in + Y together with multiplication defined as + [A,g]*[B,h]=[Join(A,Bg^-1),hg] where Meet is the natural join + operation of the semilattice and Bg^-1 is B acted on by + g inverse. With this operation, a McAlister triple is a semigroup. In fact + every McAlister triple is an E-unitary inverse semigroup and every E-unitary + inverse semigroup is isomorphic to some McAlister triple semigroup. The + triple [G,X,Y] must also satisfy the following conditions to be a + McAlister triple: + + + M1 + + Y is a semilattice which is a subdigraph of X. + + M2 + + For all A \in X and B \in Y: + if A \leq B then A \in Y. + + M3 + + For every A \in X there exists some B \in + Y and g \in G such that + A=Bg. + + M4 + + For all g \in G we have that the set {yg : y + \in Y} \cap Y is non-empty. + + + + A rigorous treatment of McAlister triples may be found in Chapter 5 of + . The reader should be aware that this GAP + implementation differs from the treatment in Howie in that it uses right + actions. This changes some definitions and the specifics of the GAP + implmentation are detailed in what follows. + + In this GAP implementation, a McAlister triple semigroup is defined by a + quadruple (G, act, X, Y) where: + + + + G is a finite group. + + + X is a digraph, with integer vertex labels, which returns true when + input to IsPartialOrderDigraph + + + Y is a digraph which returns true when input to + IsSemilatticeDigraph. It is also is a subdigraph of X + (possibly with a different labeling). + + + act is a function which is a right action of G on the + vertices of X. That is to say, it is a function which takes as + its first input a vertex of the digraph X, as its second input + an element of G and returns a vertex of X. Being a + right action means that act(x,gh)=act(act(x,g),h) holds for + all x in X and g,h \in G. + Furthermore this action must satisfy + IsSubgroup(AutomorphismGroup(X), + Image(ActionHomomorphism(G, + DigraphVertices(X), act)) + + + + In addition, (G, act, X, Y) satisfy M1-M4 where the action of + G on (the vertices of) X, Y is act. + + <#Include Label = "IsMcAlisterTripleSemigroup"> + <#Include Label = "McAlisterTripleSemigroup"> + <#Include Label = "IsMcAlisterTripleSemigroupElement"> + <#Include Label = "McAlisterTripleSemigroupElement"> + +

+ 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", From 303fb42d8c13f705176b29590801a0e66d33f8cf Mon Sep 17 00:00:00 2001 From: ChristopherRussell Date: Wed, 21 Jun 2017 14:43:42 +0100 Subject: [PATCH 4/8] semieunit: let McAlister semigroups know if they are monoids --- gap/semigroups/semieunit.gd | 2 ++ gap/semigroups/semieunit.gi | 23 ++++++++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/gap/semigroups/semieunit.gd b/gap/semigroups/semieunit.gd index 046eb18de..7226ad142 100644 --- a/gap/semigroups/semieunit.gd +++ b/gap/semigroups/semieunit.gd @@ -49,6 +49,8 @@ DeclareAttribute("McAlisterTripleSemigroupSemilattice", IsMcAlisterTripleSemigroup and IsWholeFamily); DeclareAttribute("McAlisterTripleSemigroupElmList", IsMcAlisterTripleSemigroup and IsWholeFamily); +DeclareAttribute("OneImmutable", + IsMcAlisterTripleSemigroup and IsWholeFamily and IsMonoid); # Operations for McAlister triple semigroups DeclareOperation("IsomorphismMcAlisterTripleSemigroup", [IsSemigroup]); diff --git a/gap/semigroups/semieunit.gi b/gap/semigroups/semieunit.gi index 099f9aa1c..dd0d9201a 100644 --- a/gap/semigroups/semieunit.gi +++ b/gap/semigroups/semieunit.gi @@ -17,7 +17,7 @@ InstallMethod(McAlisterTripleSemigroup, "for a perm group, action, digraph, and digraph", [IsGroup, IsFunction, IsDigraph, IsDigraph], function(G, act, X, Y) - local anti_act, hom, y_edges, out_nbrs, orbs, min, fam, M, x, y; + local anti_act, hom, y_edges, out_nbrs, orbs, min, fam, filt, M, x, y; if not IsFinite(G) then ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: usage,\n", @@ -99,9 +99,14 @@ function(G, act, X, Y) 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), - IsMcAlisterTripleSemigroup and IsAttributeStoringRep + M := Objectify(NewType(CollectionsFamily(fam), filt and IsAttributeStoringRep and IsEUnitaryInverseSemigroup and IsWholeFamily), rec()); @@ -139,7 +144,7 @@ function(G, X, sub_ver) end); ############################################################################# -# Operations for McAlister triple semigroups +# Methods for McAlister triple semigroups ############################################################################# InstallMethod(\=, "for two McAlister triple semigroups", [IsMcAlisterTripleSemigroup, IsMcAlisterTripleSemigroup], @@ -160,6 +165,14 @@ function(x, y) return false; end); +InstallMethod(OneImmutable, "for a McAlister triple semigroup", +[IsMcAlisterTripleSemigroup], +function(S) + local Y; + Y := McAlisterTripleSemigroupSemilattice(S); + return MTE(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], @@ -243,7 +256,7 @@ function(S, T) end); ############################################################################# -# Operations for McAlister triple elements +# Methods for McAlister triple elements ############################################################################# InstallMethod(McAlisterTripleSemigroupElement, "for a McAlister triple semigroup, pos int, and perm", From 7f10aa364cb6be88835374e8e424ce75d3ebaae8 Mon Sep 17 00:00:00 2001 From: ChristopherRussell Date: Mon, 31 Jul 2017 13:44:17 +0100 Subject: [PATCH 5/8] semieunit: changes to doc, method names and argument orders. --- doc/semieunit.xml | 216 ++++++++++++++++++++++-------------- doc/z-chap15.xml | 143 +++++++++++------------- gap/semigroups/semieunit.gd | 11 +- gap/semigroups/semieunit.gi | 57 +++++----- 4 files changed, 226 insertions(+), 201 deletions(-) diff --git a/doc/semieunit.xml b/doc/semieunit.xml index b891e513b..053f494d0 100644 --- a/doc/semieunit.xml +++ b/doc/semieunit.xml @@ -10,48 +10,80 @@ <#GAPDoc Label="IsMcAlisterTripleSemigroup"> - + true or false. - A McAlister triple semigroup is an E-unitary inverse semigroup - - defined by a partial order, a semilattice and a group which acts by - order automorphisms on the partial order. All E-unitary inverse - semigroups can be represented as a McAlister triple semigroup and all - McAlister triple semigroups define E-unitary inverse semigroups.

+ 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. + - We use two objects to - represent the partial order and the semilattice of a McAlister triple. - These will satisfy and , respecitvely.

+ The following will cover the technical information needed to create + McAlister triple semigroups in GAP, the underlying theorey can be read in + the introduction of the section . - A rigorous treatment of McAlister triples may be found in Chapter 5 - of . The precise conditions - for a triple in &GAP; are as follows: + A McAlister triple semigroup is created from a quadruple + (G, act, X, Y) where: - - M1 - - Y is a semilattice which is a subdigraph of X. - - M2 - - For all A in X and for all B in Y: - if A \leq B then A in Y. - - M3 - - For every A in X there exists some B in - Y and g in G such that A is equal to - B acted on by g. - - M4 - - For all g in G we have that the intersection of Y - acted on by g with Y is non-empty. - - + + + G is a finite group. + + + X is a , + with integer vertex labels, which is a partial order digraph. + That latter means that X returns true when input to + . + + + Y is a subdigraph of X, possibly with different vertex + labels, which is a join-semilattice. The latter means that Y + returns true when input to + . + + + act is a function which is a right action of G on the + vertices of X. That is to say, it is a function which takes as + its first input a vertex of the digraph X, as its second input + an element of G and returns a vertex of X. Being a + right action means that act(x,gh)=act(act(x,g),h) holds for + all x 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)). + + + + In addition, (G,X,Y) must be a McAlister triple as described in + , where the action of G + on the vertices of X,Y being act. + + 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). x := Digraph([[1], [1, 2], [1, 2, 3], [1, 4], [1, 4, 5]]); @@ -70,55 +102,65 @@ gap> GeneratorsOfSemigroup(T); [ (1, ()), (2, ()), (3, ()), (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="McAlisterTripleSemigroup"> +<#GAPDoc Label="McAlisterTripleSemigroupPartialOrder"> - - - - - A McAlister triple semigroup. + + A partial order digraph. - McAlisterTripleSemigroup requires a digraph X satisfying - , a - Y satisfying - , a group - G, and a function act defining an action of G on - X. McAlisterTripleSemigroup also has a three argument - version which assumes that act is . Furthermore there are three and four argument - versions where the homogeneous list sub_ver of vertices of - X replaces Y as an argument. When sub_ver is - provided, a McAlister triple semigroup is created with semilattice - InducedSubdigraph(X, sub_ver).

+ Returns the partial order digraph used to create the McAlister triple + semigroup S via . + + +<#/GAPDoc> - Finally, the user may use McAlsiterTriple with a single argument, - S, which is an E-unitary inverse semigroup and it will return a - McAlister triple semigroup that is isomorphic to S. - +<#GAPDoc Label="McAlisterTripleSemigroupSemilattice"> + + + A join semilattice digraph. + + Returns the join semilattice digraph used to create the McAlister triple + semigroup S via . + + +<#/GAPDoc> + +<#GAPDoc Label="McAlisterTripleSemigroupAction"> + + + A group. + + Returns the action used to create the McAlister triple semigroup + S via . + <#/GAPDoc> <#GAPDoc Label="IsMcAlisterTripleSemigroupElement"> - + true or false. - A McAlister triple semigroup element of the McAlister triple - semigroup M:=McAlisterTripleSemigroup=(G,act,X,Y) is a pair - consisting of a vertex A of the semilattice Y and an - element g of the group G such that - OnPoints(A,g^-1) is in Y. The functions - and - are identicial. + Returns true if x has been created by + . The functions IsMTSE + and IsMcAlisterTripleSemigroupElement are synonyms. The + mathematical description of the objects read can be found in the + introduction to . x := Digraph([[1], [1, 2], [1, 2, 3], [1, 4], [1, 4, 5]]); @@ -129,11 +171,7 @@ gap> A := AutomorphismGroup(x); Group([ (2,4)(3,5) ]) gap> S := McAlisterTripleSemigroup(A, OnPoints, x, y); -gap> T := McAlisterTripleSemigroup(A, x, y); - -gap> T = S; -true -gap> a := MTE(S, 1, (2, 4)(3, 5)); +gap> a := MTSE(S, 1, (2, 4)(3, 5)); (1, (2,4)(3,5)) gap> a * a; (1, ()) @@ -141,12 +179,12 @@ gap> gens := GeneratorsOfSemigroup(S); [ (1, ()), (2, ()), (3, ()), (1, (2,4)(3,5)) ] gap> P := AsSemigroup(IsPartialPermSemigroup, S); -gap> IsomorphismMcAlisterTripleSemigroup(P); +gap> iso := IsomorphismMcAlisterTripleSemigroup(P); MappingByFunction( , , function( s ) ... end ) -]]> - +gap> IsIsomorphicSemigroup(Image(iso), S); +true]]> <#/GAPDoc> @@ -154,15 +192,21 @@ MappingByFunction( - + A McAlister triple semigroup element. - Returns the McAlister triple semigroup element of the McAlister + Returns the McAlister triple semigroup element of the McAlister triple semigroup S which corresponds to the semilattice vertex A and group element g, if this specifices an element of - S. The functions and are identicial. + S. For this to specify an element the pair (A,g) must + satisfy the following: + + A acted on by the inverse of g is a vertex of the + semilattice of the McAlister triple S.

+ + The functions MTSE and McAlisterTripleSemigroupElement + are synonyms. <#/GAPDoc> @@ -172,7 +216,7 @@ MappingByFunction( A McAlister triple semigroup. - This function can be used to find a McAlister triple semigroup which is + This function tries to find a McAlister triple semigroup which is isomorphic to a given semigroup. @@ -199,7 +243,7 @@ gap> T := McAlisterTripleSemigroup(A, x, y); gap> T = S; true -gap> a := MTE(S, 1, (2, 4)(3, 5)); +gap> a := MTSE(S, 1, (2, 4)(3, 5)); (1, (2,4)(3,5)) gap> a * a; (1, ()) @@ -272,7 +316,7 @@ gap> T := McAlisterTripleSemigroup(A, x, y); gap> T = S; true -gap> a := MTE(S, 1, (2, 4)(3, 5)); +gap> a := MTSE(S, 1, (2, 4)(3, 5)); (1, (2,4)(3,5)) gap> a * a; (1, ()) diff --git a/doc/z-chap15.xml b/doc/z-chap15.xml index bfa69cdad..0b9dccee6 100644 --- a/doc/z-chap15.xml +++ b/doc/z-chap15.xml @@ -86,97 +86,86 @@ S we have that: - (i) es \in E implies s \in E, - (ii) se \in E implies s \in E. For inverse semigroups these two conditions are equivalent. We are only - interested in E-unitary inverse semigroups. A - McAlister triple semigroup is, briefly, an E-unitary inverse - semigroup defined by a partial order X, a join semilattice Y - which is a suborder of X and a group which acts on X, on the - right, as an order automorphism. Such a McAlister triple is denoted by - M(G,X,Y) and it is the set of pairs [A,g] in - Y x G such that A acted on by g inverse is in - Y together with multiplication defined as - [A,g]*[B,h]=[Join(A,Bg^-1),hg] where Meet is the natural join - operation of the semilattice and Bg^-1 is B acted on by - g inverse. With this operation, a McAlister triple is a semigroup. In fact - every McAlister triple is an E-unitary inverse semigroup and every E-unitary - inverse semigroup is isomorphic to some McAlister triple semigroup. The - triple [G,X,Y] must also satisfy the following conditions to be a - McAlister triple: - - - M1 - - Y is a semilattice which is a subdigraph of X. - - M2 - - For all A \in X and B \in Y: - if A \leq B then A \in Y. - - M3 - - For every A \in X there exists some B \in - Y and g \in G such that - A=Bg. - - M4 - - For all g \in G we have that the set {yg : y - \in Y} \cap Y is non-empty. - - + 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 consisting of: + + + + a partial order X, + + + a join semilattice Y which is a suborder of X, + + + a group G which acts on X, on the right, by order automorphisms. + + + + Furthermore, (G,X,Y) must satisfy the following four properties to + be a McAlister triple: + + + M1 + + Y is a semilattice that is a subdigraph of X. + + M2 + + For all A \in X and for all B \in + Y: if A \leq B, then A \in + Y. + + M3 + + For every A \in X, there exists some B \in + Y and there exists g \in G such that + A = Bg. + + M4 + + 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

+ + (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 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 is not a + unqiue McAlister triple semigroups defined by McAlister triple because + there may be multiple different actions of the group on the partial order. A rigorous treatment of McAlister triples may be found in Chapter 5 of - . The reader should be aware that this GAP - implementation differs from the treatment in Howie in that it uses right - actions. This changes some definitions and the specifics of the GAP - implmentation are detailed in what follows. - - In this GAP implementation, a McAlister triple semigroup is defined by a - quadruple (G, act, X, Y) where: - - - - G is a finite group. - - - X is a digraph, with integer vertex labels, which returns true when - input to IsPartialOrderDigraph - - - Y is a digraph which returns true when input to - IsSemilatticeDigraph. It is also is a subdigraph of X - (possibly with a different labeling). - - - act is a function which is a right action of G on the - vertices of X. That is to say, it is a function which takes as - its first input a vertex of the digraph X, as its second input - an element of G and returns a vertex of X. Being a - right action means that act(x,gh)=act(act(x,g),h) holds for - all x in X and g,h \in G. - Furthermore this action must satisfy - IsSubgroup(AutomorphismGroup(X), - Image(ActionHomomorphism(G, - DigraphVertices(X), act)) - - - - In addition, (G, act, X, Y) satisfy M1-M4 where the action of - G on (the vertices of) X, Y is act. + . This GAP implementation differs from the + treatment in Howie in that it uses right actions. This changes some + definitions and the specifics of the GAP implmentation are detailed in + the section . <#Include Label = "IsMcAlisterTripleSemigroup"> <#Include Label = "McAlisterTripleSemigroup"> + <#Include Label = "McAlisterTripleSemigroupGroup" Arg = "S"/> + <#Include Label = "McAlisterTripleSemigroupPartialOrder" Arg = "S"/> + <#Include Label = "McAlisterTripleSemigroupSemilattice" Arg = "S"/> + <#Include Label = "McAlisterTripleSemigroupAction" Arg = "S"/> <#Include Label = "IsMcAlisterTripleSemigroupElement"> <#Include Label = "McAlisterTripleSemigroupElement"> diff --git a/gap/semigroups/semieunit.gd b/gap/semigroups/semieunit.gd index 7226ad142..df3fd295e 100644 --- a/gap/semigroups/semieunit.gd +++ b/gap/semigroups/semieunit.gd @@ -16,6 +16,7 @@ DeclareRepresentation("IsMcAlisterTripleSemigroupElementRep", and IsPositionalObjectRep, 2); DeclareCategoryCollections("IsMcAlisterTripleSemigroupElement"); +DeclareSynonym("IsMTSE", IsMcAlisterTripleSemigroupElement); DeclareSynonymAttr("IsMcAlisterTripleSemigroup", IsInverseSemigroup and IsGeneratorsOfInverseSemigroup and IsMcAlisterTripleSemigroupElementCollection @@ -30,9 +31,9 @@ InstallTrueMethod(IsGeneratorsOfInverseSemigroup, # Operations for creating McAlister triple semigroups DeclareOperation("McAlisterTripleSemigroup", - [IsGroup, IsFunction, IsDigraph, IsDigraph]); + [IsGroup, IsDigraph, IsDigraph, IsFunction]); DeclareOperation("McAlisterTripleSemigroup", - [IsGroup, IsFunction, IsDigraph, IsHomogeneousList]); + [IsGroup, IsDigraph, IsHomogeneousList, IsFunction]); DeclareOperation("McAlisterTripleSemigroup", [IsPermGroup, IsDigraph, IsDigraph]); DeclareOperation("McAlisterTripleSemigroup", @@ -61,14 +62,12 @@ DeclareOperation("EUnitaryInverseCover", [IsSemigroup]); DeclareOperation("McAlisterTripleSemigroupElement", [IsMcAlisterTripleSemigroup, IsPosInt, IsMultiplicativeElementWithInverse]); -DeclareOperation("MTE", [IsMcAlisterTripleSemigroup, IsPosInt, - IsMultiplicativeElementWithInverse]); +DeclareSynonym("MTSE", McAlisterTripleSemigroupElement); # Operations for McAlister triple semigroup elements DeclareOperation("McAlisterTripleSemigroupElementParent", [IsMcAlisterTripleSemigroupElementRep]); -DeclareOperation("MTEParent", - [IsMcAlisterTripleSemigroupElementRep]); +DeclareSynonym("MTSEParent", McAlisterTripleSemigroupElementParent); DeclareOperation("ELM_LIST", [IsMcAlisterTripleSemigroupElementRep, IsPosInt]); # F-inverse semigroup property diff --git a/gap/semigroups/semieunit.gi b/gap/semigroups/semieunit.gi index dd0d9201a..575844a00 100644 --- a/gap/semigroups/semieunit.gi +++ b/gap/semigroups/semieunit.gi @@ -14,9 +14,9 @@ # Methods for creating McAlister triple semigroups ############################################################################# InstallMethod(McAlisterTripleSemigroup, -"for a perm group, action, digraph, and digraph", -[IsGroup, IsFunction, IsDigraph, IsDigraph], -function(G, act, X, Y) +"for a perm group, digraph, digraph, and action", +[IsGroup, IsDigraph, IsDigraph, IsFunction], +function(G, X, Y, act) local anti_act, hom, y_edges, out_nbrs, orbs, min, fam, filt, M, x, y; if not IsFinite(G) then @@ -33,11 +33,11 @@ function(G, act, X, Y) 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 third argument (a partial order ", + "automorphisms on the second argument (a partial order ", "digraph),"); elif not IsPartialOrderDigraph(X) then ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: usage,\n", - "the third argument must be a partial order digraph,"); + "the second argument must be a partial order digraph,"); fi; # To check if the edges of y are a subset of the edges of x we need to apply @@ -48,11 +48,11 @@ function(G, act, X, Y) if not (IsSubset(DigraphVertexLabels(X), DigraphVertexLabels(Y)) and IsSubset(DigraphEdges(X), y_edges)) then ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: usage,\n", - "the fourth argument must be a subdigraph of the third ", + "the third argument must be a subdigraph of the third ", "argument,"); elif not IsJoinSemilatticeDigraph(Y) then ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: usage,\n", - "the fourth argument must be a join semilattice digraph,"); + "the third argument must be a join semilattice digraph,"); fi; # Check condition M2 (check that Y is an order ideal of X.) @@ -125,22 +125,22 @@ InstallMethod(McAlisterTripleSemigroup, "for a perm group, digraph, and digraph", [IsPermGroup, IsDigraph, IsDigraph], function(G, X, Y) - return McAlisterTripleSemigroup(G, OnPoints, X, Y); + return McAlisterTripleSemigroup(G, X, Y, OnPoints); end); InstallMethod(McAlisterTripleSemigroup, -"for a perm group, action, digraph, and a homogeneous list", -[IsGroup, IsFunction, IsDigraph, IsHomogeneousList], -function(G, act, X, sub_ver) - return McAlisterTripleSemigroup(G, act, X, InducedSubdigraph(X, sub_ver)); +"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 a homogeneous list", +"for a perm group, digraph, and homogeneous list", [IsPermGroup, IsDigraph, IsHomogeneousList], function(G, X, sub_ver) - return McAlisterTripleSemigroup(G, OnPoints, X, - InducedSubdigraph(X, sub_ver)); + return McAlisterTripleSemigroup(G, X, InducedSubdigraph(X, sub_ver), + OnPoints); end); ############################################################################# @@ -170,7 +170,7 @@ InstallMethod(OneImmutable, "for a McAlister triple semigroup", function(S) local Y; Y := McAlisterTripleSemigroupSemilattice(S); - return MTE(S, DigraphSources(DigraphRemoveLoops(Y))[1], ()); + 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 @@ -183,7 +183,7 @@ function(S) for g in McAlisterTripleSemigroupGroup(S) do for A in V do if (McAlisterTripleSemigroupAction(S)(A, Inverse(g)) in V) then - Add(out, MTE(S, A, g)); + Add(out, MTSE(S, A, g)); fi; od; od; @@ -239,7 +239,7 @@ function(S, T) g -> ForAll(DigraphVertices(McAlisterTripleSemigroupPartialOrder(S)), x -> (McAlisterTripleSemigroupAction(S)(x, g)) ^ iso_x = McAlisterTripleSemigroupAction(T)((x ^ iso_x), (g ^ iso_g)))) then - return MappingByFunction(S, T, s -> MTE(T, s[1] ^ iso_x, s[2] ^ iso_g)); + return MappingByFunction(S, T, s -> MTSE(T, s[1] ^ iso_x, s[2] ^ iso_g)); fi; return fail; @@ -279,13 +279,6 @@ function(S, A, g) return Objectify(S!.elementType, [A, g, S]); end); -InstallMethod(MTE, -"for a McAlister triple semigroup, pos int, and perm", -[IsMcAlisterTripleSemigroup, IsPosInt, IsMultiplicativeElementWithInverse], -function(S, A, g) - return McAlisterTripleSemigroupElement(S, A, g); -end); - InstallMethod(ELM_LIST, "for a McAlister triple semigroup element rep and a pos int", [IsMcAlisterTripleSemigroupElementRep, IsPosInt], @@ -297,7 +290,7 @@ function(x, i) ": usage,\n", "the index must be at most 2,"); end); -InstallMethod(MTEParent, +InstallMethod(MTSEParent, "for a McAlister triple semigroup element rep", [IsMcAlisterTripleSemigroupElementRep], function(x) @@ -314,7 +307,7 @@ end); InstallMethod(String, "for a McAlister triple semigroup element rep", [IsMcAlisterTripleSemigroupElementRep], function(x) - return Concatenation("MTE(", String(x![3]), ", ", + return Concatenation("MTSE(", String(x![3]), ", ", String(DigraphVertexLabels( McAlisterTripleSemigroupSemilattice(x![3]))[x[1]]), ", ", String(x[2]), ")"); @@ -348,7 +341,7 @@ function(x, y) "triple semigroup,"); fi; labels := DigraphVertexLabels(McAlisterTripleSemigroupSemilattice(S)); - return MTE(S, DigraphVertexLabel(McAlisterTripleSemigroupPartialOrder(S), + return MTSE(S, DigraphVertexLabel(McAlisterTripleSemigroupPartialOrder(S), PartialOrderDigraphJoinOfVertices( McAlisterTripleSemigroupPartialOrder(S), x[1], McAlisterTripleSemigroupAction(S)(y[1], x[2]))), @@ -364,7 +357,7 @@ end); InstallMethod(InverseOp, "for a McAlister triple semigroup element rep", [IsMcAlisterTripleSemigroupElementRep], function(x) - return MTE(x![3], McAlisterTripleSemigroupAction(x![3])(x[1], Inverse(x[2])), + return MTSE(x![3], McAlisterTripleSemigroupAction(x![3])(x[1], Inverse(x[2])), Inverse(x[2])); end); @@ -504,11 +497,11 @@ function(S) return(anti_act(pt, g ^ -1)); end; - M := McAlisterTripleSemigroup(Image(map_g), act, x, y); + M := McAlisterTripleSemigroup(Image(map_g), x, y, act); iso := function(s) local t; t := s; - return MTE(M, (t ^ map_yy) ^ map_y, + return MTSE(M, (t ^ map_yy) ^ map_y, CongruenceClassOfElement(cong, s) ^ map_g); end; return MappingByFunction(S, M, iso); @@ -711,5 +704,5 @@ end; # 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 MTEs and McAlisterTripleSemigroups. +# 6) Line break hints for printing MTSEs and McAlisterTripleSemigroups. ############################################################################### From cf7b7800f17f0a35728ec3a7bef044538fdca721 Mon Sep 17 00:00:00 2001 From: ChristopherRussell Date: Thu, 3 Aug 2017 13:21:39 +0100 Subject: [PATCH 6/8] semieunit: improvements to doc and to McAlisterTripleSemigroup --- doc/semieunit.xml | 252 ++++++++++++++++-------------------- doc/z-chap15.xml | 73 ++++++----- gap/semigroups/semieunit.gd | 18 +-- gap/semigroups/semieunit.gi | 189 ++++++++++++++------------- tst/extreme/semieunit.tst | 2 +- tst/standard/semieunit.tst | 126 ++++++++++-------- 6 files changed, 324 insertions(+), 336 deletions(-) diff --git a/doc/semieunit.xml b/doc/semieunit.xml index 053f494d0..9fc4db885 100644 --- a/doc/semieunit.xml +++ b/doc/semieunit.xml @@ -24,9 +24,9 @@ <#GAPDoc Label="McAlisterTripleSemigroup"> + Label = "for a group, partial order digraph, join-semilattice digraph, and action"/> + Label = "for a group, partial order digraph, and join-semilattice digraph"/> A McAlister triple semigroup. - The following will cover the technical information needed to create - McAlister triple semigroups in GAP, the underlying theorey can be read in - the introduction of the section . + The following documentation covers the technical information needed to + create McAlister triple semigroups in GAP, the underlying theorey can be + read in the introduction of Section + . +

+ + In this implementation the partial orders X and Y of a + McAlister triple are represented by + objects. The vertices of a directed graph represent the elements of a + partial order while the order relation is defined by A \leq + B if and only if there is an edge from B to A. The + digraph Y should be an induced subdigraph of X and the + of Y must + correspond to the vertices of X it is induced from. This means that: +

+ + 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.

A McAlister triple semigroup is created from a quadruple - (G, act, X, Y) where: + (G, X, Y, act) where: G is a finite group. - X is a , - with integer vertex labels, which is a partial order digraph. - That latter means that X returns true when input to + X is a digraph satisfying . - Y is a subdigraph of X, possibly with different vertex - labels, which is a join-semilattice. The latter means that Y - returns true when input to - . + 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 is a right action of G on the - vertices of X. That is to say, it is a function which takes as - its first input a vertex of the digraph X, as its second input - an element of G and returns a vertex of X. Being a - right action means that act(x,gh)=act(act(x,g),h) holds for - all x 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:

+ 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)). + 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. - In addition, (G,X,Y) must be a McAlister triple as described in - , where the action of G - on the vertices of X,Y being act. - 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). + 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, 2, 3]); +gap> y := InducedSubdigraph(x, [1, 4, 5]); +gap> SetDigraphVertexLabels(y, [1, 4, 5]); gap> A := AutomorphismGroup(x); Group([ (2,4)(3,5) ]) -gap> S := McAlisterTripleSemigroup(A, OnPoints, x, y); +gap> S := McAlisterTripleSemigroup(A, x, y, OnPoints); gap> T := McAlisterTripleSemigroup(A, x, y); gap> T = S; true gap> GeneratorsOfSemigroup(T); -[ (1, ()), (2, ()), (3, ()), (1, (2,4)(3,5)) ] +[ (1, ()), (4, ()), (5, ()), (1, (2,4)(3,5)) ] gap> AsSemigroup(IsPartialPermSemigroup, T); ]]> @@ -131,9 +152,9 @@ gap> AsSemigroup(IsPartialPermSemigroup, T); <#GAPDoc Label="McAlisterTripleSemigroupSemilattice"> - A join semilattice digraph. + A join-semilattice digraph. - Returns the join semilattice digraph used to create the McAlister triple + Returns the join-semilattice digraph used to create the McAlister triple semigroup S via . @@ -159,32 +180,8 @@ gap> AsSemigroup(IsPartialPermSemigroup, T); Returns true if x has been created by . The functions IsMTSE and IsMcAlisterTripleSemigroupElement are synonyms. The - mathematical description of the objects read can be found in the + mathematical description of these objects can be found in the introduction to . - - 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, OnPoints, x, y); - -gap> a := MTSE(S, 1, (2, 4)(3, 5)); -(1, (2,4)(3,5)) -gap> a * a; -(1, ()) -gap> gens := GeneratorsOfSemigroup(S); -[ (1, ()), (2, ()), (3, ()), (1, (2,4)(3,5)) ] -gap> P := AsSemigroup(IsPartialPermSemigroup, S); - -gap> iso := IsomorphismMcAlisterTripleSemigroup(P); -MappingByFunction( , , function( s ) ... end ) -gap> IsIsomorphicSemigroup(Image(iso), S); -true]]> <#/GAPDoc> @@ -196,40 +193,19 @@ true]]> A McAlister triple semigroup element. Returns the McAlister triple semigroup element of the McAlister - triple semigroup S which corresponds to the semilattice vertex - A and group element g, if this specifices an element of - S. For this to specify an element the pair (A,g) must - satisfy the following: + 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 is a vertex of the - semilattice of the McAlister triple S.

- + 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. - - -<#/GAPDoc> - -<#GAPDoc Label="AsMcAlisterTripleSemigroup"> - - - A McAlister triple semigroup. - - This function tries to find a McAlister triple semigroup which is - isomorphic to a given semigroup. - - -<#/GAPDoc> - -<#GAPDoc Label="IsomorphismMcAlisterTripleSemigroup"> - - - An isomorphism. - - This function can be used to find an isomorphism from a given semigroup - S to an isomorphic McAlister triple semigroup, provided such an - isomorphism exists. x := Digraph([[1], [1, 2], [1, 2, 3], [1, 4], [1, 4, 5]]); @@ -237,7 +213,7 @@ gap> y := InducedSubdigraph(x, [1, 2, 3]); gap> A := AutomorphismGroup(x); Group([ (2,4)(3,5) ]) -gap> S := McAlisterTripleSemigroup(A, OnPoints, x, y); +gap> S := McAlisterTripleSemigroup(A, x, y, OnPoints); gap> T := McAlisterTripleSemigroup(A, x, y); @@ -245,42 +221,37 @@ gap> T = S; 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> gens := GeneratorsOfSemigroup(S); -[ (1, ()), (2, ()), (3, ()), (1, (2,4)(3,5)) ] -gap> P := AsSemigroup(IsPartialPermSemigroup, S); - -gap> IsomorphismMcAlisterTripleSemigroup(P); -MappingByFunction( , , function( s ) ... end ) -gap> AsMcAlisterTripleSemigroup(P); - - ]]> +gap> IsMTSE(a * a); +true +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 E-unitary inverse semigroup to S. A semigroup - homomorphism is said to be idempotent separating if no two idempotents - are mapped to the same element of in the image. + 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 in the image. S := InverseSemigroup([PartialPermNC([1, 2], [2, 1]), > PartialPermNC([1], [1])]); - + gap> cov := EUnitaryInverseCover(S); -MappingByFunction( , - - , function( x ) ... end ) +MappingByFunction( , , function( x ) ... end ) gap> IsEUnitaryInverseSemigroup(Source(cov)); true gap> S = Range(cov); @@ -294,43 +265,38 @@ true]]> true or false. - This function determines whether a given semigroup is an F-inverse - semigroup. F-inverse semigroup are a class of E-unitary inverse - semigroups. A McAlister triple semigroup - McAlisterTripleSemigroup(G,act,X,Y) is F-inverse precisely when - the partial order digraph X is a join-semilattice digraph. This - function uses to find a - McAlister triple semigroup isomorphic to S then checks if the - McAlister triple semigroup is F-inverse. - + 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 . 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, OnPoints, x, y); - -gap> T := McAlisterTripleSemigroup(A, x, y); - -gap> T = S; +gap> 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> a := MTSE(S, 1, (2, 4)(3, 5)); -(1, (2,4)(3,5)) -gap> a * a; -(1, ()) -gap> gens := GeneratorsOfSemigroup(S); -[ (1, ()), (2, ()), (3, ()), (1, (2,4)(3,5)) ] -gap> P := AsSemigroup(IsPartialPermSemigroup, S); - -gap> IsomorphismMcAlisterTripleSemigroup(P); -MappingByFunction( , , function( s ) ... end ) -gap> AsMcAlisterTripleSemigroup(P); - - ]]> +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 is a monoid which + satisfies . <#/GAPDoc> diff --git a/doc/z-chap15.xml b/doc/z-chap15.xml index 0b9dccee6..aeee494a8 100644 --- a/doc/z-chap15.xml +++ b/doc/z-chap15.xml @@ -44,6 +44,7 @@ <#Include Label = "SmallerDegreePartialPermRepresentation"> <#Include Label = "VagnerPrestonRepresentation"> <#Include Label = "CharacterTableOfInverseSemigroup"> + <#Include Label = "EUnitaryInverseCover"> @@ -58,6 +59,8 @@ <#Include Label = "IsCliffordSemigroup"> <#Include Label = "IsBrandtSemigroup"> <#Include Label = "IsEUnitaryInverseSemigroup"> + <#Include Label = "IsFInverseSemigroup"> + <#Include Label = "IsFInverseMonoid"> <#Include Label = "IsFactorisableInverseMonoid"> <#Include Label = "IsJoinIrreducible"> <#Include Label = "IsMajorantlyClosed"> @@ -74,16 +77,21 @@ McAlister triple semigroups and E-unitary inverse semigroups - In this section, we describe the functions in &GAP; for McAlister - triple semigroups and their subsemigroups. The importance of these - semigroups lies in the fact that the McAlister triple semigroups are - exactly the E-unitary inverse semigroups.

- - First we define an E-unitary inverse semigroup. 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 we have that: + 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.

+ + 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: @@ -104,10 +112,13 @@ a partial order X, - a join semilattice Y which is a suborder of X, + a subset Y of X, - a group G which acts on X, on the right, by order automorphisms. + 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. @@ -117,24 +128,27 @@ M1 - Y is a semilattice that is a subdigraph of X. + Y is a subset of X which is a join-semilattice together + with the restriction of the order relation of X to Y. M2 - For all A \in X and for all B \in + 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 - For every A \in X, there exists some B \in - Y and there exists g \in G such that - A = Bg. + 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 - For all g \in G, the intersection {yg : y - \in Y} \cap Y is non-empty. + Finally, for all g \in G, the intersection + {yg : y \in Y} \cap Y is non-empty. @@ -150,22 +164,17 @@ operation, M(G,X,Y) is 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 is not a - unqiue McAlister triple semigroups defined by McAlister triple because - there may be multiple different actions of the group on the partial order. - - A rigorous treatment of McAlister triples may be found in Chapter 5 of - . This GAP implementation differs from the - treatment in Howie in that it uses right actions. This changes some - definitions and the specifics of the GAP implmentation are detailed in - the section . + 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. <#Include Label = "IsMcAlisterTripleSemigroup"> <#Include Label = "McAlisterTripleSemigroup"> - <#Include Label = "McAlisterTripleSemigroupGroup" Arg = "S"/> - <#Include Label = "McAlisterTripleSemigroupPartialOrder" Arg = "S"/> - <#Include Label = "McAlisterTripleSemigroupSemilattice" Arg = "S"/> - <#Include Label = "McAlisterTripleSemigroupAction" Arg = "S"/> + <#Include Label = "McAlisterTripleSemigroupGroup"> + <#Include Label = "McAlisterTripleSemigroupPartialOrder"> + <#Include Label = "McAlisterTripleSemigroupSemilattice"> + <#Include Label = "McAlisterTripleSemigroupAction"> <#Include Label = "IsMcAlisterTripleSemigroupElement"> <#Include Label = "McAlisterTripleSemigroupElement"> diff --git a/gap/semigroups/semieunit.gd b/gap/semigroups/semieunit.gd index df3fd295e..f859fa6ea 100644 --- a/gap/semigroups/semieunit.gd +++ b/gap/semigroups/semieunit.gd @@ -53,10 +53,9 @@ DeclareAttribute("McAlisterTripleSemigroupElmList", DeclareAttribute("OneImmutable", IsMcAlisterTripleSemigroup and IsWholeFamily and IsMonoid); -# Operations for McAlister triple semigroups -DeclareOperation("IsomorphismMcAlisterTripleSemigroup", [IsSemigroup]); -DeclareOperation("AsMcAlisterTripleSemigroup", [IsSemigroup]); -DeclareOperation("EUnitaryInverseCover", [IsSemigroup]); +# Operations for relating to McAlister triple semigroups +DeclareAttribute("IsomorphismMcAlisterTripleSemigroup", + IsSemigroup); # Operations for creating McAlister triple semigroup elements DeclareOperation("McAlisterTripleSemigroupElement", @@ -65,11 +64,12 @@ DeclareOperation("McAlisterTripleSemigroupElement", DeclareSynonym("MTSE", McAlisterTripleSemigroupElement); # Operations for McAlister triple semigroup elements -DeclareOperation("McAlisterTripleSemigroupElementParent", - [IsMcAlisterTripleSemigroupElementRep]); +DeclareAttribute("McAlisterTripleSemigroupElementParent", + IsMcAlisterTripleSemigroupElementRep); DeclareSynonym("MTSEParent", McAlisterTripleSemigroupElementParent); DeclareOperation("ELM_LIST", [IsMcAlisterTripleSemigroupElementRep, IsPosInt]); -# F-inverse semigroup property -DeclareOperation("IsFInverseSemigroup", [IsSemigroup]); -DeclareOperation("IsFInverseMonoid", [IsSemigroup]); +# Inverse semigroup methods +DeclareAttribute("EUnitaryInverseCover", IsSemigroup); +DeclareProperty("IsFInverseSemigroup", IsSemigroup); +DeclareProperty("IsFInverseMonoid", IsSemigroup); diff --git a/gap/semigroups/semieunit.gi b/gap/semigroups/semieunit.gi index 575844a00..581fafa74 100644 --- a/gap/semigroups/semieunit.gi +++ b/gap/semigroups/semieunit.gi @@ -6,18 +6,16 @@ ## Licensing information can be found in the README file of this package. ## ############################################################################# -# -# This code is based on the description of McAlister triple semigroups found -# in Fundamentals of Semigroup Theory by John Howie. -# + ############################################################################# # Methods for creating McAlister triple semigroups ############################################################################# + InstallMethod(McAlisterTripleSemigroup, -"for a perm group, digraph, digraph, and action", +"for a group, digraph, digraph, and action", [IsGroup, IsDigraph, IsDigraph, IsFunction], function(G, X, Y, act) - local anti_act, hom, y_edges, out_nbrs, orbs, min, fam, filt, M, x, y; + local anti_act, hom, out_nbrs, orbs, min, fam, filt, M, x, y; if not IsFinite(G) then ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: usage,\n", @@ -40,31 +38,28 @@ function(G, X, Y, act) "the second argument must be a partial order digraph,"); fi; - # To check if the edges of y are a subset of the edges of x we need to apply - # the labeling of y's vertices to its edges. - y_edges := List(DigraphEdges(Y), edge -> [DigraphVertexLabels(Y)[edge[1]], - DigraphVertexLabels(Y)[edge[2]]]); - - if not (IsSubset(DigraphVertexLabels(X), DigraphVertexLabels(Y)) and - IsSubset(DigraphEdges(X), y_edges)) then + # 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 a subdigraph of the third ", - "argument,"); + "the third argument must be an induced subdigraph of\n", + "the second argument with vertex labels corresponding\n", + "to the vertices of which was induced from,"); elif not IsJoinSemilatticeDigraph(Y) then ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: usage,\n", - "the third argument must be a join semilattice digraph,"); + "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 DigraphVertexLabels(X) do + for x in DigraphVertices(X) do if not x in DigraphVertexLabels(Y) then - for y in DigraphVertexLabels(Y) do - if Intersection(out_nbrs[x], out_nbrs[y]) = out_nbrs[x] then + for y in DigraphSources(DigraphRemoveLoops(Y)) do + if x in out_nbrs[DigraphVertexLabel(Y, y)] then ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: usage,\n", - "condition M2 is not satisfied - see the ", - "documentation for details,"); + "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; @@ -72,28 +67,29 @@ function(G, X, Y, act) orbs := Orbits(Image(hom)); - # Check condition M3 (check that G.Y = X .) + # 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", - "condition M3 is not satisfied - see the documentation ", - "for details,"); + "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 DigraphVertexLabels(X) do - if not x in Union(orbs) - and not (x in DigraphVertexLabels(Y)) then - ErrorNoReturn("Semigroups: McAlisterTripleSemigroup: \n", - "Condition M3 is not satisfied - see the documentation ", - "for details,"); + 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 X is connected.) - min := DigraphSinks(DigraphRemoveLoops(X))[1]; + # 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: McAlisterTriple: usage,\n", - "condition M4 is not satisfied - see the documentation ", - "for details,"); + 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", @@ -105,6 +101,7 @@ function(G, X, Y, act) else filt := IsMcAlisterTripleSemigroup; fi; + # Create the semigroup itself M := Objectify(NewType(CollectionsFamily(fam), filt and IsAttributeStoringRep and IsEUnitaryInverseSemigroup and IsWholeFamily), @@ -169,6 +166,10 @@ InstallMethod(OneImmutable, "for a McAlister triple semigroup", [IsMcAlisterTripleSemigroup], function(S) local Y; + if not IsMonoid(S) then + ErrorNoReturn("Semigroups: OneImuutable (for McAlister triple semigroup):", + " usage,\n", "the argument must be a monoid"); + fi; Y := McAlisterTripleSemigroupSemilattice(S); return MTSE(S, DigraphSources(DigraphRemoveLoops(Y))[1], ()); end); @@ -178,16 +179,16 @@ 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; + 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; - SetMcAlisterTripleSemigroupElmList(S, out); + od; + SetMcAlisterTripleSemigroupElmList(S, out); return out; end); @@ -212,47 +213,49 @@ function(S) return Concatenation(""); end); -InstallMethod(IsomorphismSemigroups, "for two McAlister triple semigroups", -[IsMcAlisterTripleSemigroup, IsMcAlisterTripleSemigroup], -function(S, T) - local iso_g, iso_x; - - if not IsIsomorphicDigraph(McAlisterTripleSemigroupSemilattice(S), - McAlisterTripleSemigroupSemilattice(T)) then - return fail; - fi; - - iso_x := IsomorphismDigraphs(McAlisterTripleSemigroupPartialOrder(S), - McAlisterTripleSemigroupPartialOrder(T)); - - if iso_x = fail then - return fail; - fi; - - iso_g := IsomorphismGroups(McAlisterTripleSemigroupGroup(S), - McAlisterTripleSemigroupGroup(T)); - if iso_g = fail then - return fail; - fi; - - if ForAll(McAlisterTripleSemigroupGroup(S), - g -> ForAll(DigraphVertices(McAlisterTripleSemigroupPartialOrder(S)), - x -> (McAlisterTripleSemigroupAction(S)(x, g)) ^ iso_x - = McAlisterTripleSemigroupAction(T)((x ^ iso_x), (g ^ iso_g)))) then - return MappingByFunction(S, T, s -> MTSE(T, s[1] ^ iso_x, s[2] ^ iso_g)); - fi; +# Currently this does not work. iso_x restricted to the semilattice is not +# necesarilly an insomorphism of the two semilattices. If we have an isomorphism +# of the semilattices then not sure how to extend to the full isomorphism. - return fail; -end); +# InstallMethod(IsomorphismSemigroups, "for two McAlister triple semigroups", +# [IsMcAlisterTripleSemigroup, IsMcAlisterTripleSemigroup], +# function(S, T) +# local iso_g, iso_x; +# +# if not IsIsomorphicDigraph(McAlisterTripleSemigroupSemilattice(S), +# McAlisterTripleSemigroupSemilattice(T)) then +# return fail; +# fi; +# +# iso_x := IsomorphismDigraphs(McAlisterTripleSemigroupPartialOrder(S), +# McAlisterTripleSemigroupPartialOrder(T)); +# +# if iso_x = fail then +# return fail; +# fi; +# +# iso_g := IsomorphismGroups(McAlisterTripleSemigroupGroup(S), +# McAlisterTripleSemigroupGroup(T)); +# +# if iso_g = fail then +# return fail; +# fi; +# +# if ForAll(McAlisterTripleSemigroupGroup(S), +# g -> ForAll(DigraphVertices(McAlisterTripleSemigroupPartialOrder(S)), +# x -> (McAlisterTripleSemigroupAction(S)(x, g)) ^ iso_x +# = McAlisterTripleSemigroupAction(T)((x ^ iso_x), (g ^ iso_g)))) then +# return MappingByFunction(S, T, s -> MTSE(T, s[1] ^ iso_x, s[2] ^ iso_g)); +# fi; +# +# return fail; +# end); InstallMethod(IsIsomorphicSemigroup, "for two McAlister triple semigroups", [IsMcAlisterTripleSemigroup and HasGeneratorsOfSemigroup, IsMcAlisterTripleSemigroup and HasGeneratorsOfSemigroup], function(S, T) - if IsomorphismSemigroups(S, T) = fail then - return false; - fi; - return true; + return IsomorphismSemigroups(S, T) <> fail; end); ############################################################################# @@ -264,8 +267,8 @@ InstallMethod(McAlisterTripleSemigroupElement, function(S, A, g) if not A in DigraphVertexLabels(McAlisterTripleSemigroupSemilattice(S)) then ErrorNoReturn("Semigroups: McAlisterTripleSemigroupElement: usage,\n", - "second input should be a vertex of the join semilattice of", - " the McAlister triple,"); + "second input 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 input must an element of the group of the McAlister ", @@ -290,13 +293,6 @@ function(x, i) ": usage,\n", "the index must be at most 2,"); end); -InstallMethod(MTSEParent, -"for a McAlister triple semigroup element rep", -[IsMcAlisterTripleSemigroupElementRep], -function(x) - return x![3]; -end); - InstallMethod(McAlisterTripleSemigroupElementParent, "for a McAlister triple semigroup element rep", [IsMcAlisterTripleSemigroupElementRep], @@ -454,13 +450,14 @@ SEMIGROUPS.McAlisterTripleSemigroupConstructStandardPartialOrder := function(x) 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: IsomorphismMcAlisterTripleSemigroup: usage,\n", + ErrorNoReturn("Semigroups: IsomorphismSemigroup: usage,\n", "the semigroup is not E-unitary,"); fi; @@ -507,10 +504,11 @@ function(S) return MappingByFunction(S, M, iso); end); -InstallMethod(AsMcAlisterTripleSemigroup, -[IsSemigroup], -function(S) - return Range(IsomorphismMcAlisterTripleSemigroup(S)); +InstallMethod(IsomorphismSemigroup, +"for IsMcAlisterTripleSemigroup and a semigroup", +[IsMcAlisterTripleSemigroup, IsSemigroup], +function(filt, S) + return IsomorphismMcAlisterTripleSemigroup(S); end); InstallMethod(IsWholeFamily, "for a McAlister triple semigroup", @@ -560,7 +558,7 @@ end); InstallMethod(IsFInverseMonoid, "for a McAlister triple semigroup", [IsMcAlisterTripleSemigroup], function(S) - return IsFInverseSemigroup(S) and IsMonoid(S); + return IsMonoid(S) and IsFInverseSemigroup(S); end); # A McAlister triple semigroup is F-inverse precisely when X, the partial @@ -581,7 +579,7 @@ function(S) if not IsEUnitaryInverseSemigroup(S) then return false; fi; - return IsFInverseSemigroup(AsMcAlisterTripleSemigroup(S)); + return IsFInverseSemigroup(AsSemigroup(IsMcAlisterTripleSemigroup, S)); end); ############################################################################### @@ -706,3 +704,4 @@ end; # of direct products for partial perm semigroups. # 6) Line break hints for printing MTSEs and McAlisterTripleSemigroups. ############################################################################### + diff --git a/tst/extreme/semieunit.tst b/tst/extreme/semieunit.tst index ca46cb073..76f72f0f1 100644 --- a/tst/extreme/semieunit.tst +++ b/tst/extreme/semieunit.tst @@ -22,7 +22,7 @@ gap> inv_semigroups := AllSmallSemigroups([2 .. 7], IsInverseSemigroup, true);; 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 -> IsomorphismMcAlisterTriple(a));; +gap> Apply(triples, a -> IsomorphismSemigroup(IsMcAlisterTripleSemigroup, a));; gap> BruteForceIsoCheck := function(iso) > local x, y; > if not IsInjective(iso) or not IsSurjective(iso) then diff --git a/tst/standard/semieunit.tst b/tst/standard/semieunit.tst index d1f4fb6fb..a74329736 100644 --- a/tst/standard/semieunit.tst +++ b/tst/standard/semieunit.tst @@ -18,9 +18,9 @@ gap> SEMIGROUPS.StartTest(); 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, OnPoints, x, y); +gap> M := McAlisterTripleSemigroup(G, x, y, OnPoints); -gap> M = McAlisterTripleSemigroup(G, OnPoints, x, [1, 2, 3, 4]); +gap> M = McAlisterTripleSemigroup(G, x, [1, 2, 3, 4], OnPoints); true gap> M = McAlisterTripleSemigroup(G, x, y); true @@ -34,78 +34,85 @@ gap> String(M); #T# McAlisterTripleSemigroup with bad inputs gap> G1 := FreeGroup(1);; gap> act := function(x, g) return x; end;; -gap> McAlisterTripleSemigroup(G1, act, Digraph([[1]]), [1]); +gap> McAlisterTripleSemigroup(G1, Digraph([[1]]), [1], act); Error, Semigroups: McAlisterTripleSemigroup: usage, the first argument must be a finite group, -gap> y1 := Digraph([[1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6]]);; -gap> McAlisterTripleSemigroup(G, x, y1);; +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 fourth argument must be a subdigraph of the third argument, -gap> x1 := Digraph([[1], [1], [3], [3, 4], [1, 3, 5]]);; +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 third argu\ -ment (a partial order digraph), +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 which was induced from, gap> G1 := SymmetricGroup([5 .. 11]);; gap> McAlisterTripleSemigroup(G1, x, y);; Error, Action not well-defined. See the manual section ``Action on canonical representatives''. -gap> G1 := AutomorphismGroup(x1);; -gap> McAlisterTripleSemigroup(G1, x1, x1);; -Error, Semigroups: McAlisterTripleSemigroup: usage, -the third argument must be a partial order digraph, 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 fourth argument must be a join semilattice digraph, +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, -condition M2 is not satisfied - see the documentation for details, -gap> McAlisterTripleSemigroup(TrivialSubgroup(G), OnPoints, x, y);; -Error, Semigroups: McAlisterTripleSemigroup: -Condition M3 is not satisfied - see the documentation for details, +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)]), OnPoints, x, y3); +gap> McAlisterTripleSemigroup(Group([(2, 3), (4, 5)]), x, y3, OnPoints); Error, Semigroups: McAlisterTripleSemigroup: usage, -condition M3 is not satisfied - see the documentation for details, +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: McAlisterTriple: usage, -condition M4 is not satisfied - see the documentation for details, +Error, Semigroups: McAlisterTripleSemigroup: + must fix the vertex of which is the minimal vertex of - see the \ +documentation for more detail, -#T# IsomorphismSemigroup, AsMcAlisterTripleSemigroup +#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 := IsomorphismMcAlisterTripleSemigroup(ps);; +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> AsMcAlisterTripleSemigroup(ps); +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 := IsomorphismMcAlisterTripleSemigroup(ps);; +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> AsMcAlisterTripleSemigroup(ps); +gap> AsSemigroup(IsMcAlisterTripleSemigroup, ps); -#T# AsMcAlisterTripleSemigroup with bad input +#T# AsSemigroup with bad input gap> T := Semigroup([PartialPerm([1], [3]), > PartialPerm([1, 2, 3], [2, 3, 1]), PartialPerm([1, 3], [2, 3])]);; -gap> AsMcAlisterTripleSemigroup(T); -Error, Semigroups: IsomorphismMcAlisterTripleSemigroup: usage, +gap> AsSemigroup(IsMcAlisterTripleSemigroup, T); +Error, Semigroups: IsomorphismSemigroup: usage, the semigroup is not E-unitary, #T# Other McAlisterTripleSemigroup tests @@ -114,7 +121,7 @@ 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, OnPoints, x, y); +gap> M := McAlisterTripleSemigroup(G, x, y, OnPoints); gap> M = McAlisterTripleSemigroup(AutomorphismGroup(x), x, y); true @@ -124,48 +131,55 @@ gap> IsInverseSemigroup(Semigroup(GeneratorsOfSemigroup(M))); true gap> elms := Enumerator(M);; gap> String(elms[1]); -"MTE(McAlisterTripleSemigroup(SymmetricGroup( [ 2 .. 5 ] ), Digraph( [ [ 1 ], \ -[ 1, 2 ], [ 1, 3 ], [ 1, 4 ], [ 1, 5 ] ] ), Digraph( [ [ 1 ], [ 1, 2 ], [ 1, 3\ - ], [ 1, 4 ] ] )), 1, ())" +"MTSE(McAlisterTripleSemigroup(SymmetricGroup( [ 2 .. 5 ] ), Digraph( [ [ 1 ],\ + [ 1, 2 ], [ 1, 3 ], [ 1, 4 ], [ 1, 5 ] ] ), Digraph( [ [ 1 ], [ 1, 2 ], [ 1, \ +3 ], [ 1, 4 ] ] )), 1, ())" +gap> OneImmutable(M); +Error, Semigroups: OneImuutable (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> MTE(M, 4, (2, 4)(3, 5)) * MTE(M, 4, (2, 5, 3, 4)); +gap> MTSE(M, 4, (2, 4)(3, 5)) * MTSE(M, 4, (2, 5, 3, 4)); (1, (4,5)) -gap> MTE(M, 1, (2, 3, 4, 5)) ^ -2; +gap> MTSE(M, 1, (2, 3, 4, 5)) ^ -2; (1, (2,4)(3,5)) -gap> M = MTEParent(MTE(M, 1, (4, 5))); +gap> M = MTSEParent(MTSE(M, 1, (4, 5))); true -gap> M = McAlisterTripleSemigroupElementParent(MTE(M, 1, (4, 5))); +gap> M = McAlisterTripleSemigroupElementParent(MTSE(M, 1, (4, 5))); true -gap> MTE(M, 10, (2, 3, 4, 5)); +gap> MTSE(M, 10, (2, 3, 4, 5)); Error, Semigroups: McAlisterTripleSemigroupElement: usage, -second input should be a vertex of the join semilattice of the McAlister tripl\ -e, -gap> MTE(M, 1, (5, 6)); +second input should be a vertex label of the join-semilattice of the McAlister\ + triple, +gap> MTSE(M, 1, (5, 6)); Error, Semigroups: McAlisterTripleSemigroupElement: usage, third input must an element of the group of the McAlister triple, -gap> MTE(M, 3, (2, 4)(3, 5)); +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> MTE(M, 1, ())[3]; +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> MTE(M1, 4, (2, 4)(3, 5)) * MTE(M, 4, (2, 5, 3, 4)); +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, +# This test is for a function which is not working at the moment #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> 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 ) #T# IsomorphicSemigroups with bad input gap> x1 := Digraph([[1], [1, 2], [1, 3]]);; @@ -185,7 +199,7 @@ fail gap> act := function(x, g) > return x; > end;; -gap> M5 := McAlisterTripleSemigroup(G, act, x1, x1);; +gap> M5 := McAlisterTripleSemigroup(G, x1, x1, act);; gap> IsomorphismSemigroups(M1, M5); fail From 95e1d9f0b81bc542cc7d29f615d90b752ec25a8a Mon Sep 17 00:00:00 2001 From: ChristopherRussell Date: Wed, 16 Aug 2017 16:48:54 +0100 Subject: [PATCH 7/8] semieunit: moved doc location, fix to IsomorphismSemigroups This commit moves the documentation for McAlister triple semigroups to their own chapter - Chapter 12. It also re-implements IsomorphismSemigroups, which previously was not working, and adds more tests for it. --- doc/main.xml | 19 +- doc/semieunit.xml | 99 +++++---- doc/z-chap12.xml | 177 ++++++++-------- doc/z-chap13.xml | 271 +++++------------------- doc/z-chap14.xml | 291 +++++++++++++++++++++++--- doc/z-chap15.xml | 202 ++++-------------- doc/z-chap16.xml | 342 +++++-------------------------- doc/z-chap17.xml | 399 ++++++++++++++++++++++++++---------- doc/z-chap18.xml | 154 ++++++++------ doc/z-chap19.xml | 96 +++++++-- doc/z-chap20.xml | 43 ++-- doc/z-chap21.xml | 31 +++ gap/semigroups/semieunit.gd | 27 ++- gap/semigroups/semieunit.gi | 141 +++++++------ tst/standard/semieunit.tst | 77 +++++-- 15 files changed, 1224 insertions(+), 1145 deletions(-) create mode 100644 doc/z-chap21.xml 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 index 9fc4db885..a74e4e39b 100644 --- a/doc/semieunit.xml +++ b/doc/semieunit.xml @@ -13,7 +13,7 @@ true or false. - This function returns true if S is a McAlister triple semigroup. + 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 . @@ -23,42 +23,39 @@ <#GAPDoc Label="McAlisterTripleSemigroup"> - - - - + A McAlister triple semigroup. The following documentation covers the technical information needed to - create McAlister triple semigroups in GAP, the underlying theorey can be - read in the introduction of Section - . + create McAlister triple semigroups in GAP, the underlying theory can be + read in the introduction to Chapter + .

- In this implementation the partial orders X and Y of a - McAlister triple are represented by - objects. The vertices of a directed graph represent the elements of a - partial order while the order relation is defined by A \leq - B if and only if there is an edge from B to A. The - digraph Y should be an induced subdigraph of X and the - of Y must - correspond to the vertices of X it is induced from. This means that: + 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 + 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.

- + 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, X, Y, act) where: @@ -85,10 +82,10 @@ 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:

+ to return true:

IsSubgroup(AutomorphismGroup(X), Image(ActionHomomorphism(G, - DigraphVertices(X), act)).

+ 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. @@ -110,14 +107,17 @@ gap> x := Digraph([[1], [1, 2], [1, 2, 3], [1, 4], [1, 4, 5]]); gap> y := InducedSubdigraph(x, [1, 4, 5]); -gap> SetDigraphVertexLabels(y, [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> T = S; +gap> S = T; +false +gap> IsIsomorphicSemigroup(S, T); true gap> GeneratorsOfSemigroup(T); [ (1, ()), (4, ()), (5, ()), (1, (2,4)(3,5)) ] @@ -143,8 +143,9 @@ gap> AsSemigroup(IsPartialPermSemigroup, T); A partial order digraph. - Returns the partial order digraph used to create the McAlister triple - semigroup S via . + Returns the used + to create the McAlister triple semigroup S via + . <#/GAPDoc> @@ -154,8 +155,9 @@ gap> AsSemigroup(IsPartialPermSemigroup, T); A join-semilattice digraph. - Returns the join-semilattice digraph used to create the McAlister triple - semigroup S via . + Returns the + used to create the McAlister triple semigroup S via + . <#/GAPDoc> @@ -163,7 +165,7 @@ gap> AsSemigroup(IsPartialPermSemigroup, T); <#GAPDoc Label="McAlisterTripleSemigroupAction"> - A group. + A function. Returns the action used to create the McAlister triple semigroup S via . @@ -173,15 +175,16 @@ gap> AsSemigroup(IsPartialPermSemigroup, T); <#GAPDoc Label="IsMcAlisterTripleSemigroupElement"> - - + + true or false. - 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 . + 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> @@ -217,7 +220,9 @@ gap> S := McAlisterTripleSemigroup(A, x, y, OnPoints); gap> T := McAlisterTripleSemigroup(A, x, y); -gap> T = S; +gap> S = T; +false +gap> IsIsomorphicSemigroup(S, T); true gap> a := MTSE(S, 1, (2, 4)(3, 5)); (1, (2,4)(3,5)) @@ -227,6 +232,8 @@ 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))]]> @@ -243,7 +250,7 @@ gap> a * b; 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 in the image. + if no two idempotents are mapped to the same element of the image. S := InverseSemigroup([PartialPermNC([1, 2], [2, 1]), > PartialPermNC([1], [1])]); @@ -272,7 +279,8 @@ true]]> satisfies . McAlister triple semigroups are a represenation of E-unitary inverse semigroups and - more can be read about them in . + more can be read about them in Chapter + . S := InverseMonoid([PartialPermNC([1, 2], [1, 2]), > PartialPermNC([1, 2, 3], [1, 2, 3]), @@ -295,8 +303,9 @@ true]]> true or false. This function determines whether a given semigroup is an F-inverse - monoid. A semigroup is an F-inverse monoid when it is a monoid which - satisfies . + 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..ba750d26f 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 consist 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 aeee494a8..95cc6444a 100644 --- a/doc/z-chap15.xml +++ b/doc/z-chap15.xml @@ -1,183 +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"> - <#Include Label = "EUnitaryInverseCover"> - -
- - - -
- - Properties of inverse semigroups - + 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"> - <#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"> -

-
- - - 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.

- - 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: - - - - es \in E implies s \in E, - - - se \in E implies s \in E. - - - - 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 consisting 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. - - - - Furthermore, (G,X,Y) must satisfy the following four properties to - be a McAlister triple: - - - 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

- - (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 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. - - <#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-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/semigroups/semieunit.gd b/gap/semigroups/semieunit.gd index f859fa6ea..35a610e49 100644 --- a/gap/semigroups/semieunit.gd +++ b/gap/semigroups/semieunit.gd @@ -11,6 +11,18 @@ 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); @@ -21,7 +33,20 @@ DeclareSynonymAttr("IsMcAlisterTripleSemigroup", IsInverseSemigroup and IsGeneratorsOfInverseSemigroup and IsMcAlisterTripleSemigroupElementCollection and IsWholeFamily and IsEnumerableSemigroupRep); -# TODO: Add description. See congpairs.gd + +# 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, []); diff --git a/gap/semigroups/semieunit.gi b/gap/semigroups/semieunit.gi index 581fafa74..bc4a00c3c 100644 --- a/gap/semigroups/semieunit.gi +++ b/gap/semigroups/semieunit.gi @@ -43,7 +43,7 @@ function(G, X, Y, act) 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 which was induced from,"); + "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,"); @@ -143,32 +143,31 @@ end); ############################################################################# # Methods for McAlister triple semigroups ############################################################################# -InstallMethod(\=, "for two McAlister triple semigroups", -[IsMcAlisterTripleSemigroup, IsMcAlisterTripleSemigroup], -function(x, y) - local A, G, X, Y, g; - G := McAlisterTripleSemigroupGroup(x); - X := McAlisterTripleSemigroupPartialOrder(x); - Y := McAlisterTripleSemigroupSemilattice(x); - if G = McAlisterTripleSemigroupGroup(y) - and X = McAlisterTripleSemigroupPartialOrder(y) - and Y = McAlisterTripleSemigroupSemilattice(y) then - if ForAll(G, g -> ForAll(DigraphVertices(X), - A -> McAlisterTripleSemigroupAction(x)(A, g) = - McAlisterTripleSemigroupAction(y)(A, g))) then - return true; - fi; - fi; - return false; -end); +# 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: OneImuutable (for McAlister triple semigroup):", - " usage,\n", "the argument must be a monoid"); + 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], ()); @@ -213,49 +212,55 @@ function(S) return Concatenation(""); end); -# Currently this does not work. iso_x restricted to the semilattice is not -# necesarilly an insomorphism of the two semilattices. If we have an isomorphism -# of the semilattices then not sure how to extend to the full isomorphism. +InstallMethod(IsomorphismSemigroups, "for two McAlister triple semigroups", +[IsMcAlisterTripleSemigroup, IsMcAlisterTripleSemigroup], +function(S, T) + local YS, YT, XT, iso_g, iso_x, im_YS, rep, A; -# InstallMethod(IsomorphismSemigroups, "for two McAlister triple semigroups", -# [IsMcAlisterTripleSemigroup, IsMcAlisterTripleSemigroup], -# function(S, T) -# local iso_g, iso_x; -# -# if not IsIsomorphicDigraph(McAlisterTripleSemigroupSemilattice(S), -# McAlisterTripleSemigroupSemilattice(T)) then -# return fail; -# fi; -# -# iso_x := IsomorphismDigraphs(McAlisterTripleSemigroupPartialOrder(S), -# McAlisterTripleSemigroupPartialOrder(T)); -# -# if iso_x = fail then -# return fail; -# fi; -# -# iso_g := IsomorphismGroups(McAlisterTripleSemigroupGroup(S), -# McAlisterTripleSemigroupGroup(T)); -# -# if iso_g = fail then -# return fail; -# fi; -# -# if ForAll(McAlisterTripleSemigroupGroup(S), -# g -> ForAll(DigraphVertices(McAlisterTripleSemigroupPartialOrder(S)), -# x -> (McAlisterTripleSemigroupAction(S)(x, g)) ^ iso_x -# = McAlisterTripleSemigroupAction(T)((x ^ iso_x), (g ^ iso_g)))) then -# return MappingByFunction(S, T, s -> MTSE(T, s[1] ^ iso_x, s[2] ^ iso_g)); -# fi; -# -# return fail; -# end); + iso_g := IsomorphismGroups(McAlisterTripleSemigroupGroup(S), + McAlisterTripleSemigroupGroup(T)); -InstallMethod(IsIsomorphicSemigroup, "for two McAlister triple semigroups", -[IsMcAlisterTripleSemigroup and HasGeneratorsOfSemigroup, -IsMcAlisterTripleSemigroup and HasGeneratorsOfSemigroup], -function(S, T) - return IsomorphismSemigroups(S, T) <> fail; + 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); ############################################################################# @@ -267,12 +272,12 @@ InstallMethod(McAlisterTripleSemigroupElement, function(S, A, g) if not A in DigraphVertexLabels(McAlisterTripleSemigroupSemilattice(S)) then ErrorNoReturn("Semigroups: McAlisterTripleSemigroupElement: usage,\n", - "second input should be a vertex label of the ", + "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 input must an element of the group of the McAlister ", - "triple,"); + "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", @@ -318,6 +323,7 @@ function(x) 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 @@ -494,7 +500,7 @@ function(S) return(anti_act(pt, g ^ -1)); end; - M := McAlisterTripleSemigroup(Image(map_g), x, y, act); + M := McAlisterTripleSemigroup(Range(map_g), x, y, act); iso := function(s) local t; t := s; @@ -514,7 +520,7 @@ end); InstallMethod(IsWholeFamily, "for a McAlister triple semigroup", [IsMcAlisterTripleSemigroupElementCollection], function(C) - return Size(C[1]![3]) = Size(C); + return Size(Elements(C)[1]![3]) = Size(C); end); InstallMethod(ChooseHashFunction, "for McAlister triple semigroup elements", @@ -692,6 +698,7 @@ SEMIGROUPS.DirectProductForCover := function(S, T) * 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. diff --git a/tst/standard/semieunit.tst b/tst/standard/semieunit.tst index a74329736..d3647480a 100644 --- a/tst/standard/semieunit.tst +++ b/tst/standard/semieunit.tst @@ -20,11 +20,24 @@ 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> M = McAlisterTripleSemigroup(G, x, y); +gap> M1 := Semigroup(GeneratorsOfSemigroup(M));; +gap> M = M1; true -gap> M = McAlisterTripleSemigroup(G, x, [1, 2, 3, 4]); +gap> M = Semigroup(Elements(M)[2]); +false +gap> M1 := M;; +gap> M = M1; true gap> String(M); "McAlisterTripleSemigroup(SymmetricGroup( [ 2 .. 5 ] ), Digraph( [ [ 1 ], [ 1,\ @@ -52,7 +65,7 @@ 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 which was induced from, +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 @@ -123,9 +136,7 @@ gap> y := Digraph([[1], [1, 2], [1, 3], [1, 4]]); gap> M := McAlisterTripleSemigroup(G, x, y, OnPoints); -gap> M = McAlisterTripleSemigroup(AutomorphismGroup(x), x, y); -true -gap> M = McAlisterTripleSemigroup(G, x, x); +gap> IsIsomorphicSemigroup(M, McAlisterTripleSemigroup(G, x, x)); false gap> IsInverseSemigroup(Semigroup(GeneratorsOfSemigroup(M))); true @@ -135,8 +146,8 @@ gap> String(elms[1]); [ 1, 2 ], [ 1, 3 ], [ 1, 4 ], [ 1, 5 ] ] ), Digraph( [ [ 1 ], [ 1, 2 ], [ 1, \ 3 ], [ 1, 4 ] ] )), 1, ())" gap> OneImmutable(M); -Error, Semigroups: OneImuutable (for McAlister triple semigroup): usage, -the argument must be a monoid +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, ()) @@ -152,11 +163,11 @@ gap> M = McAlisterTripleSemigroupElementParent(MTSE(M, 1, (4, 5))); true gap> MTSE(M, 10, (2, 3, 4, 5)); Error, Semigroups: McAlisterTripleSemigroupElement: usage, -second input should be a vertex label of the join-semilattice of the McAlister\ - triple, +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 input must an element of the group of the McAlister triple, +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, @@ -168,18 +179,40 @@ 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, -# This test is for a function which is not working at the moment #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> 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]]);; From 471f45fa0907fc59b2099a88ca02a8fb17c2df08 Mon Sep 17 00:00:00 2001 From: Wilf Wilson Date: Tue, 29 Aug 2017 16:15:23 +0100 Subject: [PATCH 8/8] semieunit: fix to String for an MTSE --- doc/z-chap12.xml | 2 +- gap/semigroups/semieunit.gi | 15 ++++++++++----- tst/standard/semieunit.tst | 26 ++++++++++++++++++++++---- 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/doc/z-chap12.xml b/doc/z-chap12.xml index ba750d26f..c0cdf458a 100644 --- a/doc/z-chap12.xml +++ b/doc/z-chap12.xml @@ -30,7 +30,7 @@ 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 consist of: + A McAlister triple is a triple (G,X,Y) which consists of: diff --git a/gap/semigroups/semieunit.gi b/gap/semigroups/semieunit.gi index bc4a00c3c..31bb254b0 100644 --- a/gap/semigroups/semieunit.gi +++ b/gap/semigroups/semieunit.gi @@ -199,7 +199,14 @@ function(S) X := McAlisterTripleSemigroupPartialOrder(S); Y := McAlisterTripleSemigroupSemilattice(S); return Concatenation("McAlisterTripleSemigroup(", String(G), ", ", - String(X), ", ", String(Y), ")"); + String(X), ", ", String(DigraphVertexLabels(Y)), ")"); +end); + +InstallMethod(PrintObj, "for a McAlister triple semigroup", +[IsMcAlisterTripleSemigroup], +function(S) + Print(String(S)); + return; end); #TODO Linebreak hints @@ -308,10 +315,8 @@ end); InstallMethod(String, "for a McAlister triple semigroup element rep", [IsMcAlisterTripleSemigroupElementRep], function(x) - return Concatenation("MTSE(", String(x![3]), ", ", - String(DigraphVertexLabels( - McAlisterTripleSemigroupSemilattice(x![3]))[x[1]]), - ", ", String(x[2]), ")"); + return Concatenation("MTSE(", String(x![3]), ", ", String(x![1]), ", ", + String(x![2]), ")"); end); #TODO Linebreak hints diff --git a/tst/standard/semieunit.tst b/tst/standard/semieunit.tst index d3647480a..e2321e2e5 100644 --- a/tst/standard/semieunit.tst +++ b/tst/standard/semieunit.tst @@ -41,8 +41,10 @@ gap> M = M1; true gap> String(M); "McAlisterTripleSemigroup(SymmetricGroup( [ 2 .. 5 ] ), Digraph( [ [ 1 ], [ 1,\ - 2 ], [ 1, 3 ], [ 1, 4 ], [ 1, 5 ] ] ), Digraph( [ [ 1 ], [ 1, 2 ], [ 1, 3 ], \ -[ 1, 4 ] ] ))" + 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);; @@ -143,8 +145,7 @@ true gap> elms := Enumerator(M);; gap> String(elms[1]); "MTSE(McAlisterTripleSemigroup(SymmetricGroup( [ 2 .. 5 ] ), Digraph( [ [ 1 ],\ - [ 1, 2 ], [ 1, 3 ], [ 1, 4 ], [ 1, 5 ] ] ), Digraph( [ [ 1 ], [ 1, 2 ], [ 1, \ -3 ], [ 1, 4 ] ] )), 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, @@ -236,6 +237,18 @@ 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 @@ -271,6 +284,11 @@ 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]),