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

1. 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. repo owner

I plan to fully implement ideals in version 2.0 as soon as I can!

3. reporter

Thanks!

Then after all I reported it at the right place. :)

That's good news. Ideals came into the semigroup enumeration business as vital ingredients.

4. repo owner
• changed status to open

After discovering the recent bug in the ideals code, I'm reopening this issue to remind myself to check if it is fixed in the new set up.

5. repo owner

this is fixed in GAP 4.7.3 and the 2.0 branch of Semigroups.