The GAP package Congruence provides functions to construct several
types of canonical congruence subgroups in SL_2(Z), and also
intersections of a finite number of such subgroups. Furthermore, it
implements the algorithm for generating Farey symbols for congruence
subgroups and using them to produce a system of independent
generators for these subgroups.