Decomposition of some Completely Regular Semigroups into Strong Semilattices of Semigroups#731
Decomposition of some Completely Regular Semigroups into Strong Semilattices of Semigroups#731tomcontileslie wants to merge 6 commits intosemigroups:mainfrom
Conversation
cfcfe48 to
4301f23
Compare
4301f23 to
79d230f
Compare
gap/attributes/properties.gd
Outdated
| InstallTrueMethod(IsSurjectiveSemigroup, IsIdempotentGenerated); | ||
|
|
||
| DeclareProperty("IsOrthogroup", IsSemigroup); | ||
| DeclareSynonym("IsOrthoGroup", IsOrthogroup); |
There was a problem hiding this comment.
| DeclareSynonym("IsOrthoGroup", IsOrthogroup); | |
| DeclareSynonymAttr("IsOrthoGroup", IsOrthogroup); |
| D := DigraphReflexiveTransitiveReduction(Digraph(NaturalPartialOrder(A))); | ||
| # currently wrong way round | ||
| D := DigraphReverse(D); | ||
| N := OutNeighbours(D); |
There was a problem hiding this comment.
You can directly get this via
| N := OutNeighbours(D); | |
| N := ReverseNaturalPartialOrder(A); |
(although I don't think that necessarily (or at all?) contains x in N[x] for each x - if those are actually necessary, you will still want to add them or modify your code below to acts as if they are there).
There was a problem hiding this comment.
Thanks @wilfwilson, unfortunately I get a "no method found" error when running ReverseNaturalPartialOrder on some inputs - for example:
gap> S := Semigroup(Transformation([1, 2, 4, 5, 6, 3, 7, 8]), Transformation([3, 3, 4, 5, 6, 2, 7, 8]), Transformation([1, 2, 5, 3, 6, 8, 4, 4]));
<transformation semigroup of degree 8 with 3 generators>
gap> IsCliffordSemigroup(S);
true
gap> A := Semigroup(Idempotents(S));
<transformation monoid of degree 8 with 3 generators>
gap> NaturalPartialOrder(A);
[ [ 2, 3, 4 ], [ 4 ], [ 4 ], [ ] ]
gap> ReverseNaturalPartialOrder(A);
Error, no method found! For debugging hints type ?Recovery from NoMethodFound
Error, no 2nd choice method found for `ReverseNaturalPartialOrder' on 1 arguments at /Applications/GAP/lib/methsel2.g:250 called from
<function "HANDLE_METHOD_NOT_FOUND">( <arguments> )
called from read-eval loop at *stdin*:18
type 'quit;' to quit to outer loop
Although you are correct that we don't need x in N[x] since the homomorphisms in this case are the identity, and the strong semilattice constructor is clever enough to fill that in upon creation.
There was a problem hiding this comment.
Also, I'm realising that taking the reflexive transitive reduction of D is redundant, since the SSS constructor effectively reverts this, so I'll remove that part
| for j in N[i] do | ||
| map := function(elm) | ||
| return idemp * elm; | ||
| end; | ||
| Add(H[i], MappingByFunction(L[j], L[i], map)); | ||
| od; |
There was a problem hiding this comment.
It seems like there is no need to keep re-creating the function map inside the for loop.
| for j in N[i] do | |
| map := function(elm) | |
| return idemp * elm; | |
| end; | |
| Add(H[i], MappingByFunction(L[j], L[i], map)); | |
| od; | |
| map := elm -> idemp * elm; | |
| for j in N[i] do | |
| Add(H[i], MappingByFunction(L[j], L[i], map)); | |
| od; | |
| # Add(H[i], MappingByFunction(L[i], L[i], map)); # Add this if you do actually need `i` to be in `N[i]` |
May 2021 update: this PR has only ticked one of four boxes, but it works on Clifford semigroups. Implementing IsomorphismSemigroup for other types of completely regular semigroups can be done in a different PR.
This PR introduces methods for decomposing certain completely regular semigroups into strong semilattices, as suggested in Issue #671. The aim is introduce
IsomorphismSemigroupmethods from the following types of semigroups:to SSS objects.