Original Question. I am trying to find all quotients of the braid group $B_5$ on five strands up to order $6!=720$. From previous very slow implementations I found that there are not many. Some results I have at my disposal are the following.
- All cyclic groups $C_n = \mathbb Z/n\mathbb Z$ are quotients of $B_5$ since the abelianization of $B_5$ is isomorphic to the integers $\mathbb Z$. With the same argument we obtain that non-cyclic abelian groups cannot be quotients of $B_5$.
- One can construct an automorphism, namely conjugation by the image of $\delta = \sigma_1 \cdots \sigma_{n-1}$, of order divisible by $n$, yielding that all quotients of $B_5$ must have order divisible by $5$. Applying this to the subgroups $B_3$ and $B_4$ yields that any quotient of $B_5$ must have order divisible by $60$, which drastically (but not drastically enough) decreases the number of groups to check.
- The permutation group $S_5$ is a quotient of $B_5$ by modding out the squares of the generators.
- Implementations showed that a subdirect product $A_5 \rtimes C_4$ and a direct product $C_3 \times S_5$ are also quotients of $B_5$, but I do not know the explicit homomorphism.
What I tried is to use the function AllSmallGroups in GAP, which really does return all groups of the desired order very efficiently (presumably because they are stored in a pre-computed list). I then checked whether the list returned by GQuotients was non-empty, which is apperently quite expensive to compute. Considering I have to check thousands of groups this is a problem.
One approach I might have is to filter out the groups that have normal subgroups such that the quotient is non-cyclic and has order not divisible by $60$. Sadly, the method StructureDescription takes ages to run on groups of the magnitudes of orders I am intersted in, so I cannot really check this efficiently. Thus, to answer my question I guess it would be enough to answer the following.
How can you (more efficiently than using
StructureDescriptionor the like) check whether a group returned byAllSmallGroups(or something similar) satisfies that the orders of all the quotients by its normal subgroups are divisible by $60$?
Update. Alright, I managed to solve it. Here's the result: All non-cyclic quotients of order less than $720$ are either $A_5 \rtimes \mathbb Z/2^k \mathbb Z$ or $C_{2k+1} \times S_5$. What it took was the following (thanks @AlexanderKonovalov):
- Get a list of IDs of
SmallGroups withIdsOfSmallGroups(less demanding on my workspace memory than usingAllSmallGroups). This gave me about $3000$ groups. - Filter out the abelian groups: very easy with the precomputed
IsAbelianattribute. I'm actually not sure how important that was since it only reduced my count from about $3000$ to about $2900$ groups, but still. - Getting the normal subgroups of all those groups with
NormalSubgroupsand checking whether all quotients were either cyclic or had order divisible by $60$. Throwing the rest away left me with $46$ groups. - I then let my computer run for the whole day using
GQuotients. It was able to check a remarkable $25$ groups during this time. - I got a bit annoyed and ran
StructureDescriptionon the group it was currently working at and found that it was working on a group that was somehow a direct product of $\mathbb Z/2\mathbb Z$ with some matrix group (which was previously identified as not a quotient). Since it only took a few seconds to runStructureDescriptionI decided to let it run on all of the remaining groups, and, miraculously, it finished this feat in half a minute or so. - By hand I removed the ones that split as a direct product or a subdirect product the normal subgroup of which I knew was not a quotient, and had to run
GQuotientson a single remaining group, which turned out to be not a quotient.
What occurred to me a little bit too late is that I could have introduced a step 2.5 checking whether the groups in question had a generating set consisting of only two elements. This would have reduced to groups from $2900$ to about $2000$, which would have saved maybe $5$ minutes of computing normal subgroups of stuff. But it turns out that all of the $46$ groups that required me to check by hand would not have been excluded by this step, so this is more of a side note.
This is rather a collection of hints, based on my earlier comments above:
1) Instead of using
AllSmallGroups, you may find enumerating groups one by one more informative and convenient - see the Carpentries-style lesson on GAP, in particular this episode about the search in the Small Groups Library.2) If you are only interested in the orders of all normal subgroups, instead of asking for
StructureDescriptionyou can callNormalSubgroupsand then check their orders. For example,More tips if you are interested only in specific subgroups are in the GAP F.A.Q. It also has a question about
StructureDescription.3) Using
SmallGroupsInformation, you can find out how the groups of the given order are sorted, and which information about their properties is precomputed. That could help to organise a sieving process, when you will have several passes over the list of candidates, increasing the complexity of the checked property.4) If you have a multicore computer, or have access to several computers, you can try to set up a parallel master-worker calculation with the SCSCP package. I have a demo for the particular example of the small groups search here.
5) Another suggestion is that
GQuotientshas a documentedfindalloption - if it is set tofalse, the algorithm will stop once one homomorphism has been found (this can be faster and might be sufficient if not all homomorphisms are needed). Although, as @Levi explained, this does not help in this case since there are only a few groups that actually are quotients.6) Furthermore, representation matters. What are the arguments of
GQuotients- are they fp, pc or permutation groups? fp groups are the slowest. You can useIsomorphismPcGrouporIsomorphismPermGroupto work with isomorphic groups with a faster internal representation - some examples are in this Jupyter notebook.7) It is also recommended to run the latest official distribution of GAP, and have properly installed packages (some of them require compilation). Some packages may speed up certain calculations. In particular, GAP 4.10.0 has some improvements of
GQuotientsperformance by @ahulpke (see this pull request on GitHub).