Congruence arithmetic subgroups of \(\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)#

Bases: CongruenceSubgroupFromGroup

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,[3]).modular_abelian_variety()
Abelian variety JH(11,[3]) 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)#

Bases: ArithmeticSubgroup

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, [5]).level()
14
class sage.modular.arithgroup.congroup_generic.CongruenceSubgroupFromGroup(G)#

Bases: CongruenceSubgroupBase

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, [3]))
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