GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
############################################################################# ## #W Index.gi FGA package Christian Sievers ## ## Method installations for index computations in free groups ## #Y 2003 - 2012 ## ############################################################################# ## #M IndexInWholeGroup( <group> ) ## InstallMethod( IndexInWholeGroup, "for a free group", [ CanComputeWithInverseAutomaton ], function(G) if HasIsWholeFamily(G) and IsWholeFamily(G) then return 1; fi; # let the gap lib handle this case: if IsSubgroupOfWholeGroupByQuotientRep(G) then TryNextMethod(); fi; return FGA_Index(FreeGroupAutomaton(G)); end ); ############################################################################# ## #M IndexOp( <group>, <subgroup>, <flag> ) ## ## computes the index of <subgroup> in <group>. ## If <flag> is true, checks whether the subgroup relation really holds ## and returns fail otherwise. ## Some of the checks will even be performed when <flag> is false. ## InstallOtherMethod( IndexOp, "for free groups", IsFamFamX, [ CanComputeWithInverseAutomaton, CanComputeWithInverseAutomaton, IsBool ], function( G, U, check ) local indexG, indexU, index, rankG, gensU, gen, w, genwords; indexG := IndexInWholeGroup( G ); indexU := IndexInWholeGroup( U ); if indexG <> infinity then if check and not IsSubset( G, U ) then return fail; fi; if indexU = infinity then return infinity; else index := indexU / indexG; if IsInt( index ) then return index; else return fail; fi; fi; fi; # one more cheap test: if indexU <> infinity then return fail; fi; # now we must work harder rankG := RankOfFreeGroup( G ); gensU := FreeGeneratorsOfGroup( U ); genwords := []; for gen in gensU do w := AsWordLetterRepInFreeGenerators( gen, G ); if w = fail then return fail; fi; Add( genwords, w ); od; return FGA_Index( FGA_FromGeneratorsLetterRep( genwords, FreeGroup(rankG) ) ); end ); ############################################################################# ## #M IndexOp( <group>, <subgroup> ) ## InstallMethod( IndexOp, "for free groups", IsIdenticalObj, [ CanComputeWithInverseAutomaton, CanComputeWithInverseAutomaton ], function( G, H ) return IndexOp( G, H, true); end ); ############################################################################# ## #M IndexNC( <group>, <subgroup> ) ## InstallMethod( IndexNC, "for free groups", IsIdenticalObj, [ CanComputeWithInverseAutomaton, CanComputeWithInverseAutomaton ], function( G, H ) return IndexOp( G, H, false); end ); ############################################################################# ## #E