How to calculate with Rees factor semigroups?

Issue #33 resolved
Attila Egri-Nagy
created an issue

The question is about code in the GAP library, but the solution may be developed here.

gap> I := SemigroupIdealByGenerators(FullTransformationSemigroup(4), [Transformation([1,2,2,2])]);
<semigroup ideal with 1 generators>
gap> cong := ReesCongruenceOfSemigroupIdeal(I);
<semigroup congruence>
gap> hom := HomomorphismQuotientSemigroup(cong);
MappingByFunction( <full transformation semigroup on 4 pts>, <quotient of Monoid( [ Transformation( [ 2, 3, 4, 1 ] ), Transformation( [ 2, 1 ] ), Transformation( [ 1, 2, 3, 1 ] ) 
 ] ) by SemigroupCongruence( ... )>, function( x ) ... end )
gap> T := Range(hom);
<quotient of Monoid( [ Transformation( [ 2, 3, 4, 1 ] ), Transformation( [ 2, 1 ] ), Transformation( [ 1, 2, 3, 1 ] ) ] ) by SemigroupCongruence( ... )>
gap> IsSemigroup(T);
true

So far so good, but that is how far we can get.

gap> Size(T);
Error, no method found! For debugging hints type ?Recovery from NoMethodFound
Error, no 2nd choice method found for `StabiliserAction' on 1 arguments called from
StabiliserAction( Parent( r ) ) called from
enum!.convert_out( enum, enum!.baseenum[nr] ) called from
enum!.ElementNumber( enum, nr ) called from
pos > Length( enumofenums[i] ) called from
enum!.ElementNumber( enum, nr ) called from
...  at line 78 of *stdin*
you can 'quit;' to quit to outer loop, or
you can 'return;' to continue
brk> 

We can figure out how multiply elements in the quotient, but that also not too menaingful:

gap> u := Image(hom, Transformation([1,1,1,1]));
{Transformation( [ 1, 1, 1, 1 ] )}
gap> t := Image(hom, Transformation([2,1,2,3]));
{Transformation( [ 2, 1, 2, 3 ] )}
gap> u*t;
{Transformation( [ 2, 2, 2, 2 ] )}
gap> t*u;
{Transformation( [ 1, 1, 1, 1 ] )}
gap> S := Semigroup([u,t]);
<semigroup with 2 generators>
gap> Size(S);
Error, no method found! For debugging hints type ?Recovery from NoMethodFound
Error, no 2nd choice method found for `StabiliserAction' on 1 arguments called from
StabiliserAction( Parent( r ) ) called from
enum!.convert_out( enum, enum!.baseenum[nr] ) called from
enum!.ElementNumber( enum, nr ) called from
pos > Length( enumofenums[i] ) called from
enum!.ElementNumber( enum, nr ) called from
...  at line 88 of *stdin*
you can 'quit;' to quit to outer loop, or
you can 'return;' to continue
brk> 

The best thing would be to have a transformation representation or at least multiplication table, a real semigroup somehow.

Comments (7)

  1. James Mitchell repo owner

    This was actually a bug in Semigroups, I have only partially implemented ideals of semigroups there, and this is a consequence of this "partial" implementation. It is now fixed.

  2. Log in to comment