GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
############################################################################# ## #W ReprAct.gi FGA package Christian Sievers ## ## Methods for computing RepresentativeAction ## #Y 2003 - 2016 ## InstallOtherMethod( RepresentativeActionOp, "for conjugation of elements in a free group", IsCollsElmsElmsX, [ IsFreeGroup, IsElementOfFreeGroup, IsElementOfFreeGroup, IsFunction ], function(F, d, e, act) local wd, we, le, ld, id, ie, wecr, w, pos, pos2, conj; if act <> OnPoints then TryNextMethod(); fi; if IsOne(d) and IsOne(e) then return One(F); fi; if IsOne(d) or IsOne(e) then return fail; fi; wd := LetterRepAssocWord(d); ld := Length(wd); id := 1; while wd[id] = -wd[ld-id+1] do id := id+1; od; we := LetterRepAssocWord(e); le := Length(we); ie := 1; while we[ie] = -we[le-ie+1] do ie := ie+1; od; if ld-2*id <> le-2*ie then return fail; fi; w := wd{[id..ld-id+1]}; # wd cyclically reduced w := Concatenation(w,w); # ... and doubled wecr := we{[ie..le-ie+1]}; # we cyclically reduced pos := PositionSublist(w,wecr); if pos=fail then return fail; fi; conj := AssocWordByLetterRep(FamilyObj(d), wd{[1..id+pos-2]}) * AssocWordByLetterRep(FamilyObj(d), we{[le-ie+2..le]}); if conj in F then return conj; fi; pos2 := PositionSublist(w, wecr, pos); if pos2=fail then pos2 := pos+ld-2*ie+2; fi; return FindPowLetterRep(F, wd{[1..id+pos-2]},w{[pos..pos2-1]}, we{[le-ie+2..le]}); end ); InstallMethod( FindPowLetterRep, [ CanComputeWithInverseAutomaton, IsList, IsList, IsList ], function(f, wi, wp, wt) local init, initstate, final, finalstate, state, n, fam; state := FGA_initial(FreeGroupAutomaton(f)); init := FGA_TmpState(state, wi); initstate := init.state; final := FGA_TmpState(state, -Reversed(wt)); finalstate := final.state; state := initstate; n := 0; repeat state := FGA_deltas(state, wp); n := n+1; until state=fail or IsIdenticalObj(state, initstate) or IsIdenticalObj(state, finalstate); if state = fail then state := initstate; n := 0; wp := -Reversed(wp); repeat state := FGA_deltas(state, wp); n := n+1; until state=fail or IsIdenticalObj(state, finalstate); fi; final.undo(); init.undo(); if IsIdenticalObj(state, finalstate) then fam := ElementsFamily(FamilyObj(f)); return AssocWordByLetterRep(fam, wi) * AssocWordByLetterRep(fam, wp)^n * AssocWordByLetterRep(fam, wt); else return fail; fi; end ); InstallOtherMethod( RepresentativeActionOp, "for subgroups of a free group", IsFamFamFamX, [ CanComputeWithInverseAutomaton, CanComputeWithInverseAutomaton, CanComputeWithInverseAutomaton, IsFunction ],1, function(F, G, H, act) local AG, AH, AF, rdG, rdH, statesH, redgens, i, AN, tmp, conj; if act <> OnPoints then TryNextMethod(); fi; if RankOfFreeGroup(G) <> RankOfFreeGroup(H) then return fail; fi; AG := FreeGroupAutomaton(G); rdG := FGA_reducedPos(AG); AH := FreeGroupAutomaton(H); rdH := FGA_reducedPos( AH ); statesH := FGA_States(AH); if Size(statesH)-rdH <> Size(FGA_States(AG))-rdG then return fail; fi; redgens := List( List(FreeGeneratorsOfGroup(G), LetterRepAssocWord), w -> w{[rdG .. Length(w)-rdG+1]} ); for i in [rdH .. Size(statesH)] do if ForAll(redgens, w -> FGA_Check(statesH[i], w)) then # We now know that G is a subgroup of a conjugate of H. # More ugly low level computation could check for equality. # Instead we postpone the check to a time where we can work # at a higher level. # So if the result is fail, we get it a little slower. AN := FreeGroupAutomaton( NormalizerInWholeGroup( G ) ); tmp := FGA_TmpState( AN!.initial, Concatenation( FGA_States( AG )[ rdG ].repr, -Reversed(FGA_repr(statesH[i])) )); AF := FreeGroupAutomaton( F ); conj := FGA_FindRepInIntersection( AF, AF!.terminal, AN, tmp.state ); tmp.undo(); if conj = fail then return fail; fi; conj := AssocWordByLetterRep( ElementsFamily(FamilyObj(F)), conj ); # Now check if we really have a conjugating element: if IsSubset( G, List( FreeGeneratorsOfGroup(H), h -> h^(conj^-1) )) then return conj; else return fail; fi; fi; od; return fail; end ); ############################################################################# ## #E