Finding low-index normal subgroups of finitely presented groups in GAP I'm a new user of GAP looking to use it to find finite-index, normal subgroups of some finitely presented groups. To provide a concrete example, how would I find all the low-index (say index<200) normal subgroups of G, where
F := FreeGroup("a","b");;
G := F / [ F.1^4, F.2^5, (F.1*F.2)^2 ];
In particular, G, like the other groups I'm interested in, is infinite, so I really need a solution that only finds normal subgroups with index less than a cutoff.
In principle, there is an algorithm here that does what I want. So the real question is just about doing so easily in GAP.
 A: What I would do is to look at normal subgroups with solvable and nonsolvable factor group separately. First take the nonsolvable factor groups. There are just a few candidates:
gap> l:=AllSmallGroups(Size,[1..200],IsSolvable,false);;List(l,Size);
[ 60, 120, 120, 120, 168, 180 ]

Then test which ones can be quotients of $G$, and take the respective kernels.
gap> lq:=Concatenation(List(l,x->GQuotients(G,x)));
[ [ a, b ] -> [ (2,5,4,3), (1,2,3,4,5) ] ]
gap> k1:=List(lq,KernelOfMultiplicativeGeneralMapping);
[ Group(<fp, no generators known>) ]

Normal subgroups with solvable factor group must lie above some subgroup in the derived series. Here we find the third derived subgroup of index 160 (that is if the bound is 200 there cannot be a smaller normal subgroup:
gap> d:=DerivedSubgroup(G);;Index(G,d);AbelianInvariants(d);
2
[ 5 ]
gap> d:=DerivedSubgroup(d);;Index(G,d);AbelianInvariants(d);
10
[ 2, 2, 2, 2 ]
gap> d:=DerivedSubgroup(d);;Index(G,d);AbelianInvariants(d);
160
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]

Note that we now have an infinite abelianization. If we were looking for indices $\ge 320$, we would need to enumerate maximal submodules of this Z-module of suitable index, which is a bit more complicated than I can describe here.
Now take the natural homomorphism:
gap> q:=NaturalHomomorphismByNormalSubgroup(G,d);
gap> q:=q*IsomorphismSpecialPcGroup(Image(q));
[ a, b ] -> [ f1*f3*f5, f2*f4*f5*f6 ]

Note: In general, using the solvable quotient algorithm here would be far more effective, but it is harder to adjust it to find everything bounded index, which is the reason for this pedestrian approach.
Now take normal subgroups of the image of $q$ (of suitable index) and take their pre-images:
gap> k2:=Filtered(NormalSubgroups(Image(q)),x->Index(Image(q),x)<=200);;
gap> k2:=List(k2,x->PreImage(q,x));
gap> k:=Concatenation(k1,k2);;List(k,x->Index(G,x));
[ 120, 160, 10, 2, 1 ]

and we find 5 normal subgroups in total of indices 120,160,10,2 and 1.
