# Congruence arithmetic subgroups of $${\rm SL}_2(\ZZ)$$¶

Sage can compute extensively with the standard congruence subgroups $$\Gamma_0(N)$$, $$\Gamma_1(N)$$, and $$\Gamma_H(N)$$.

AUTHORS:

• William Stein
• David Loeffler (2009, 10) – modifications to work with more general arithmetic subgroups
class sage.modular.arithgroup.congroup_generic.CongruenceSubgroup(*args, **kwds)

One of the “standard” congruence subgroups $$\Gamma_0(N)$$, $$\Gamma_1(N)$$, $$\Gamma(N)$$, or $$\Gamma_H(N)$$ (for some $$H$$).

This class is not intended to be instantiated directly. Derived subclasses must override _contains_sl2, _repr_, and image_mod_n.

image_mod_n()

Raise an error: all derived subclasses should override this function.

EXAMPLES:

sage: sage.modular.arithgroup.congroup_generic.CongruenceSubgroup(5).image_mod_n()
Traceback (most recent call last):
...
NotImplementedError

modular_abelian_variety()

Return the modular abelian variety corresponding to the congruence subgroup self.

EXAMPLES:

sage: Gamma0(11).modular_abelian_variety()
Abelian variety J0(11) of dimension 1
sage: Gamma1(11).modular_abelian_variety()
Abelian variety J1(11) of dimension 1
sage: GammaH(11,).modular_abelian_variety()
Abelian variety JH(11,) of dimension 1

modular_symbols(sign=0, weight=2, base_ring=Rational Field)

Return the space of modular symbols of the specified weight and sign on the congruence subgroup self.

EXAMPLES:

sage: G = Gamma0(23)
sage: G.modular_symbols()
Modular Symbols space of dimension 5 for Gamma_0(23) of weight 2 with sign 0 over Rational Field
sage: G.modular_symbols(weight=4)
Modular Symbols space of dimension 12 for Gamma_0(23) of weight 4 with sign 0 over Rational Field
sage: G.modular_symbols(base_ring=GF(7))
Modular Symbols space of dimension 5 for Gamma_0(23) of weight 2 with sign 0 over Finite Field of size 7
sage: G.modular_symbols(sign=1)
Modular Symbols space of dimension 3 for Gamma_0(23) of weight 2 with sign 1 over Rational Field

class sage.modular.arithgroup.congroup_generic.CongruenceSubgroupBase(level)

Create a congruence subgroup with given level.

EXAMPLES:

sage: Gamma0(500)
Congruence Subgroup Gamma0(500)

is_congruence()

Return True, since this is a congruence subgroup.

EXAMPLES:

sage: Gamma0(7).is_congruence()
True

level()

Return the level of this congruence subgroup.

EXAMPLES:

sage: SL2Z.level()
1
sage: Gamma0(20).level()
20
sage: Gamma1(11).level()
11
sage: GammaH(14, ).level()
14

class sage.modular.arithgroup.congroup_generic.CongruenceSubgroupFromGroup(G)

A congruence subgroup, defined by the data of an integer $$N$$ and a subgroup $$G$$ of the finite group $$SL(2, \ZZ / N\ZZ)$$; the congruence subgroup consists of all the matrices in $$SL(2, \ZZ)$$ whose reduction modulo $$N$$ lies in $$G$$.

This class should not be instantiated directly, but created using the factory function CongruenceSubgroup_constructor(), which accepts much more flexible input, and checks the input to make sure it is valid.

image_mod_n()

Return the subgroup of $$SL(2, \ZZ / N\ZZ)$$ of which this is the preimage, where $$N$$ is the level of self.

EXAMPLES:

sage: G = MatrixGroup([matrix(Zmod(2), 2, [1,1,1,0])])
sage: H = sage.modular.arithgroup.congroup_generic.CongruenceSubgroupFromGroup(G); H.image_mod_n()
Matrix group over Ring of integers modulo 2 with 1 generators (
[1 1]
[1 0]
)
sage: H.image_mod_n() == G
True

index()

Return the index of self in the full modular group. This is equal to the index in $$SL(2, \ZZ / N\ZZ)$$ of the image of this group modulo $$\Gamma(N)$$.

EXAMPLES:

sage: sage.modular.arithgroup.congroup_generic.CongruenceSubgroupFromGroup(MatrixGroup([matrix(Zmod(2), 2, [1,1,1,0])])).index()
2

to_even_subgroup()

Return the smallest even subgroup of $$SL(2, \ZZ)$$ containing self.

EXAMPLES:

sage: G = Gamma(3)
sage: G.to_even_subgroup()
Congruence subgroup of SL(2,Z) of level 3, preimage of:
Matrix group over Ring of integers modulo 3 with 1 generators (
[2 0]
[0 2]
)

sage.modular.arithgroup.congroup_generic.CongruenceSubgroup_constructor(*args)

Attempt to create a congruence subgroup from the given data.

The allowed inputs are as follows:

• A MatrixGroup object. This must be a group of matrices over $$\ZZ / N\ZZ$$ for some $$N$$, with determinant 1, in which case the function will return the group of matrices in $$SL(2, \ZZ)$$ whose reduction mod $$N$$ is in the given group.
• A list of matrices over $$\ZZ / N\ZZ$$ for some $$N$$. The function will then compute the subgroup of $$SL(2, \ZZ)$$ generated by these matrices, and proceed as above.
• An integer $$N$$ and a list of matrices (over any ring coercible to $$\ZZ / N\ZZ$$, e.g. over $$\ZZ$$). The matrices will then be coerced to $$\ZZ / N\ZZ$$.

The function checks that the input G is valid. It then tests to see if $$G$$ is the preimage mod $$N$$ of some group of matrices modulo a proper divisor $$M$$ of $$N$$, in which case it replaces $$G$$ with this group before continuing.

EXAMPLES:

sage: from sage.modular.arithgroup.congroup_generic import CongruenceSubgroup_constructor as CS
sage: CS(2, [[1,1,0,1]])
Congruence subgroup of SL(2,Z) of level 2, preimage of:
Matrix group over Ring of integers modulo 2 with 1 generators (
[1 1]
[0 1]
)
sage: CS([matrix(Zmod(2), 2, [1,1,0,1])])
Congruence subgroup of SL(2,Z) of level 2, preimage of:
Matrix group over Ring of integers modulo 2 with 1 generators (
[1 1]
[0 1]
)
sage: CS(MatrixGroup([matrix(Zmod(2), 2, [1,1,0,1])]))
Congruence subgroup of SL(2,Z) of level 2, preimage of:
Matrix group over Ring of integers modulo 2 with 1 generators (
[1 1]
[0 1]
)
sage: CS(SL(2, 2))
Modular Group SL(2,Z)


Some invalid inputs:

sage: CS(SU(2, 7))
Traceback (most recent call last):
...
TypeError: Ring of definition must be Z / NZ for some N

sage.modular.arithgroup.congroup_generic.is_CongruenceSubgroup(x)

Return True if x is of type CongruenceSubgroup.

Note that this may be False even if $$x$$ really is a congruence subgroup – it tests whether $$x$$ is “obviously” congruence, i.e.~whether it has a congruence subgroup datatype. To test whether or not an arithmetic subgroup of $$SL(2, \ZZ)$$ is congruence, use the is_congruence() method instead.

EXAMPLES:

sage: from sage.modular.arithgroup.congroup_generic import is_CongruenceSubgroup
sage: is_CongruenceSubgroup(SL2Z)
True
sage: is_CongruenceSubgroup(Gamma0(13))
True
sage: is_CongruenceSubgroup(Gamma1(6))
True
sage: is_CongruenceSubgroup(GammaH(11, ))
True
sage: G = ArithmeticSubgroup_Permutation(L = "(1, 2)", R = "(1, 2)"); is_CongruenceSubgroup(G)
False
sage: G.is_congruence()
True
sage: is_CongruenceSubgroup(SymmetricGroup(3))
False