Schreier-Sims algorithm

Basic idea
The idea behind solving the order-finding problem for $$G$$ comes from the following descending chain of subgroups:

$$G= G^{(0)} \geq G^{(1)} \geq G^{(2)} \ldots \geq G^{(n-1)} = e$$

where $$G^{(i)} = G \cap Stab_{Sym(n)}{1,2,3,...,i}$$.

By an easy coset counting argument:

$$[G^{(i)}:G^{(i+1)}] \leq n - i$$

Obstacles and overcoming them
We can readily compute a system of coset representatives for $$G^{(i+1)}$$ in $$G^{(i)}$$ by using the breadth-first search.

The problem, however, is: how do we get a generating set for $$G^{(i+1)}$$ starting from a generating set for $$G^{(i)}$$, To solve this problem, we can use Schreier's lemma which provides a constructive approach to obtaining a generating set for the subgroup from a generating set for the whole group and a system of coset representatives (the more general problem is finding a generating set from a membership test).

This still leaves another problem: Each time we go downward on the chain, the size of the generating set may go up by a factor of $$n$$ (because the index of the subgroup is $$O(n)$$). Thus, we need to keep the size of the subset small at every stage. This can be done using a small generating set-finding algorithm, such as the Sims filter or the Jerrum's filter.

Flow of the algorithm
Description of the $$i^{th}$$ step of the algorithm:

Start with: a generating set $$A_i$$ for $$G^{(i)}$$

Do the following:


 * 1) Finding coset representatives: Using a breadth-first search, find a minimal Schreier system of coset representatives for $$G^{(i+1)}$$ in $$G^{(i)}$$
 * 2) Finding the index: From this, obtain $$[G^{(i)}:G^{(i+1)}]$$
 * 3) Finding a generating set: Using the coset representatives and the generating set $$A_i$$, obtain a (possibly larger) generating set for $$G^{(i+1)}$$. This uses Schreier's lemma
 * 4) Filtering the generating set: Apply a filter to trim the size, and call the filtered generating set $$A_{i+1}$$.

Analysis of running time

 * 1) Finding coset representatives: This takes time $$|A_i|n$$ since that is the number of edges in the graph.
 * 2) Finding the index: This comes for free
 * 3) Finding a generating set: This takes time $$|A_i|n^2$$ since $$A_i|n$$ terms need to be computed and the computation of each requires multiplication operations (which take $$O(n)$$ time).
 * 4) Filtering the generating set: This takes time dependent on the choice of filter. A naive analysis on Jerrum's filter reveals that the time taken is $$O(|A_i|n^5)$$ because the new generating set with which we start is itself of size $$|A_i|n$$. Similarly a naive analysis of the Sims filter reveals that the time it takes is $$O(|A_i|n^3)$$.

Now, if we apply the filter right at the start, then at every step, $$|A_i|$$ is polynomially bounded. Thus:

Total time = Time taken to apply filter at the start + $$n \times$$ Time taken at each stage

Thus:


 * In the case of Jerrum's filter: $$n^5|A| + O(n^7)$$
 * In the case of Sims filter: $$n^2|A| + O(n^6)$$