GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
############################################################################# ## #W FreeGroups.gi FGA package Christian Sievers ## ## Main installation file for the FGA package ## #Y 2003 - 2012 ## ############################################################################# ## #M FreeGroupAutomaton( <G> ) ## ## returns the automaton representing <G>. ## InstallMethod( FreeGroupAutomaton, "for a subgroup of a free group", [ CanComputeWithInverseAutomaton ], function(G) return FGA_FromGroupWithGenerators(G); end ); ############################################################################# ## #M FreeGroupExtendedAutomaton( <G> ) ## ## return the extended automaton representing <G>. InstallMethod( FreeGroupExtendedAutomaton, "for a subgroup of a free group", [ CanComputeWithInverseAutomaton ], function(G) return FGA_FromGroupWithGeneratorsX(G); end ); ############################################################################# ## #M \in( <elm>, <group> ) ## ## tests whether <elm> is in the finitely generated free group <group>. ## InstallMethod( \in, "for a subgroup of a free group", IsElmsColls, [ IsElementOfFreeGroup, CanComputeWithInverseAutomaton ], function( g, G ) return g in FreeGroupAutomaton(G); end ); ############################################################################# ## #M FreeGeneratorsOfGroup( <G> ) ## ## returns a list of free generators of the group <G>. ## This is a minimal generating set, but is also guarantied to ## be N-reduced. ## InstallMethod( FreeGeneratorsOfGroup, "for a subgroup of a free group", [ CanComputeWithInverseAutomaton ], function(G) return List(FGA_GeneratorsLetterRep(FreeGroupAutomaton(G)), l -> AssocWordByLetterRep (ElementsFamily(FamilyObj(G)), l) ); end ); ############################################################################# ## #M GeneratorsOfGroup( <group> ) ## InstallMethod( GeneratorsOfGroup, "for a subgroup of a free group having a FreeGroupAutomaton", [ HasFreeGroupAutomaton ], FreeGeneratorsOfGroup ); ## ## FreeGeneratorsOfGroup are GeneratorsOfGroup ## InstallImmediateMethod( GeneratorsOfGroup, HasFreeGeneratorsOfGroup, 0, FreeGeneratorsOfGroup); ############################################################################# ## #M MinimalGeneratingSet( <group> ) ## ## returns <group>'s FreeGeneratorsOfGroup ## InstallMethod( MinimalGeneratingSet, "for a subgroup of a free group", [ CanComputeWithInverseAutomaton ], FreeGeneratorsOfGroup ); ############################################################################# ## #M SmallGeneratingSet( <group> ) ## ## returns <group>'s FreeGeneratorsOfGroup ## InstallMethod( SmallGeneratingSet, "for a subgroup of a free group", [ CanComputeWithInverseAutomaton ], FreeGeneratorsOfGroup ); ############################################################################# ## #M IsWholeFamily( <group> ) ## InstallMethod( IsWholeFamily, "for a finitely generated free group", [ CanComputeWithInverseAutomaton ], G -> ForAll( FreeGeneratorsOfWholeGroup( G ), gen -> gen in G) ); ############################################################################# ## #M RankOfFreeGroup( <G> ) ## ## returns the rank of a free group. ## InstallMethod( RankOfFreeGroup, "for a subgroup of a free group", [ CanComputeWithInverseAutomaton ], G -> Size(MinimalGeneratingSet(G)) ); InstallMethod( RankOfFreeGroup, "for a whole free group", [ IsFreeGroup and IsWholeFamily ], G -> Size(FreeGeneratorsOfWholeGroup(G)) ); ############################################################################# ## #M Rank( <group> ) ## ## a convenient name for RankOfFreeGroup ## InstallMethod( Rank, "for a subgroup of a free group", [ IsFreeGroup ], RankOfFreeGroup ); ############################################################################# ## #M IsSubset( <group1>, <group2> ) ## InstallMethod( IsSubset, "for subgroups of free groups", IsIdenticalObj, [ CanComputeWithInverseAutomaton, CanComputeWithInverseAutomaton ], function(G,U) local gens; if HasFreeGeneratorsOfGroup(U) then gens := FreeGeneratorsOfGroup(U); else gens := GeneratorsOfGroup(U); fi; return ForAll(gens, u -> u in G); end ); ############################################################################# ## #M \=( <group1>, <group2> ) ## InstallMethod( \=, "for subgroups of free groups", IsIdenticalObj, [ CanComputeWithInverseAutomaton, CanComputeWithInverseAutomaton ], function( G, H ) return IsSubset(G,H) and IsSubset(H,G); end ); ############################################################################# ## #M AsWordLetterRepInFreeGenerators( <g>, <G> ) ## ## returns the unique list <l> representing a word in letter representation ## such that ## <g> = Product( <l>, ## x -> FreeGeneratorsOfGroup(<G>)[AbsInt(x)]^(SignInt(x)), ## One(<G>) ) ## or fail, if <g> is not in <G>. ## InstallMethod( AsWordLetterRepInFreeGenerators, "for an element in a free group", IsElmsColls, [ IsElementOfFreeGroup, CanComputeWithInverseAutomaton ], function( g, G ) return FGA_AsWordLetterRepInFreeGenerators( LetterRepAssocWord(g), FreeGroupAutomaton(G) ); end ); ############################################################################# ## #M AsWordLetterRepInGenerators( <g>, <G> ) ## ## returns a list <l> representing a word in letter representation such that ## <g> = Product( <l>, ## x -> GeneratorsOfGroup(<G>)[AbsInt(x)]^(SignInt(x)), ## One(<G>) ) ## or fail, if <g> is not in <G>. ## InstallMethod( AsWordLetterRepInGenerators, "for an element in a free group", IsElmsColls, [ IsElementOfFreeGroup, CanComputeWithInverseAutomaton and HasGeneratorsOfGroup ], function( g, G ) return FGA_AsWordLetterRepInGenerators( LetterRepAssocWord( g ), FreeGroupExtendedAutomaton( G ) ); end ); ############################################################################# ## #O CyclicallyReducedWord( <g> ) ## ## returns the the cyclically reduced form of <g> ## InstallMethod( CyclicallyReducedWord, "for an element in a free group", [ IsElementOfFreeGroup ], function( g ) local rep, len, i; if IsOne( g ) then return g; fi; rep := LetterRepAssocWord( g ); len := Length( rep ); i := 1; while rep[i] = -rep[len-i+1] do i := i+1; od; return AssocWordByLetterRep( FamilyObj( g ), rep{[i..len-i+1]} ); end ); ############################################################################# ## #E