Congruence subgroup \(\Gamma(N)\)#

class sage.modular.arithgroup.congroup_gamma.Gamma_class(*args, **kwds)[source]#

Bases: CongruenceSubgroup

The principal congruence subgroup \(\Gamma(N)\).

are_equivalent(x, y, trans=False)[source]#

Check if the cusps \(x\) and \(y\) are equivalent under the action of this group.

ALGORITHM: The cusps \(u_1 / v_1\) and \(u_2 / v_2\) are equivalent modulo \(\Gamma(N)\) if and only if \((u_1, v_1) = \pm (u_2, v_2) \bmod N\).

EXAMPLES:

sage: Gamma(7).are_equivalent(Cusp(2/3), Cusp(5/4))
True
>>> from sage.all import *
>>> Gamma(Integer(7)).are_equivalent(Cusp(Integer(2)/Integer(3)), Cusp(Integer(5)/Integer(4)))
True
image_mod_n()[source]#

Return the image of this group modulo \(N\), as a subgroup of \(SL(2, \ZZ / N\ZZ)\). This is just the trivial subgroup.

EXAMPLES:

sage: Gamma(3).image_mod_n()
Matrix group over Ring of integers modulo 3 with 1 generators (
[1 0]
[0 1]
)
>>> from sage.all import *
>>> Gamma(Integer(3)).image_mod_n()
Matrix group over Ring of integers modulo 3 with 1 generators (
[1 0]
[0 1]
)
index()[source]#

Return the index of self in the full modular group. This is given by

\[\begin{split}\prod_{\substack{p \mid N \\ \text{$p$ prime}}}\left(p^{3e}-p^{3e-2}\right).\end{split}\]

EXAMPLES:

sage: [Gamma(n).index() for n in [1..19]]
[1, 6, 24, 48, 120, 144, 336, 384, 648, 720, 1320, 1152, 2184, 2016, 2880, 3072, 4896, 3888, 6840]
sage: Gamma(32041).index()
32893086819240
>>> from sage.all import *
>>> [Gamma(n).index() for n in (ellipsis_range(Integer(1),Ellipsis,Integer(19)))]
[1, 6, 24, 48, 120, 144, 336, 384, 648, 720, 1320, 1152, 2184, 2016, 2880, 3072, 4896, 3888, 6840]
>>> Gamma(Integer(32041)).index()
32893086819240
ncusps()[source]#

Return the number of cusps of this subgroup \(\Gamma(N)\).

EXAMPLES:

sage: [Gamma(n).ncusps() for n in [1..19]]
[1, 3, 4, 6, 12, 12, 24, 24, 36, 36, 60, 48, 84, 72, 96, 96, 144, 108, 180]
sage: Gamma(30030).ncusps()
278691840
sage: Gamma(2^30).ncusps()
432345564227567616
>>> from sage.all import *
>>> [Gamma(n).ncusps() for n in (ellipsis_range(Integer(1),Ellipsis,Integer(19)))]
[1, 3, 4, 6, 12, 12, 24, 24, 36, 36, 60, 48, 84, 72, 96, 96, 144, 108, 180]
>>> Gamma(Integer(30030)).ncusps()
278691840
>>> Gamma(Integer(2)**Integer(30)).ncusps()
432345564227567616
nirregcusps()[source]#

Return the number of irregular cusps of self. For principal congruence subgroups this is always 0.

EXAMPLES:

sage: Gamma(17).nirregcusps()
0
>>> from sage.all import *
>>> Gamma(Integer(17)).nirregcusps()
0
nu3()[source]#

Return the number of elliptic points of order 3 for this arithmetic subgroup. Since this subgroup is \(\Gamma(N)\) for \(N \ge 2\), there are no such points, so we return 0.

EXAMPLES:

sage: Gamma(89).nu3()
0
>>> from sage.all import *
>>> Gamma(Integer(89)).nu3()
0
reduce_cusp(c)[source]#

Calculate the unique reduced representative of the equivalence of the cusp \(c\) modulo this group. The reduced representative of an equivalence class is the unique cusp in the class of the form \(u/v\) with \(u, v \ge 0\) coprime, \(v\) minimal, and \(u\) minimal for that \(v\).

EXAMPLES:

sage: Gamma(5).reduce_cusp(1/5)
Infinity
sage: Gamma(5).reduce_cusp(7/8)
3/2
sage: Gamma(6).reduce_cusp(4/3)
2/3
>>> from sage.all import *
>>> Gamma(Integer(5)).reduce_cusp(Integer(1)/Integer(5))
Infinity
>>> Gamma(Integer(5)).reduce_cusp(Integer(7)/Integer(8))
3/2
>>> Gamma(Integer(6)).reduce_cusp(Integer(4)/Integer(3))
2/3
sage.modular.arithgroup.congroup_gamma.Gamma_constructor(N)[source]#

Return the congruence subgroup \(\Gamma(N)\).

EXAMPLES:

sage: Gamma(5) # indirect doctest
Congruence Subgroup Gamma(5)
sage: G = Gamma(23)
sage: G is Gamma(23)
True
sage: TestSuite(G).run()
>>> from sage.all import *
>>> Gamma(Integer(5)) # indirect doctest
Congruence Subgroup Gamma(5)
>>> G = Gamma(Integer(23))
>>> G is Gamma(Integer(23))
True
>>> TestSuite(G).run()

Test global uniqueness:

sage: G = Gamma(17)
sage: G is loads(dumps(G))
True
sage: G2 = sage.modular.arithgroup.congroup_gamma.Gamma_class(17)
sage: G == G2
True
sage: G is G2
False
>>> from sage.all import *
>>> G = Gamma(Integer(17))
>>> G is loads(dumps(G))
True
>>> G2 = sage.modular.arithgroup.congroup_gamma.Gamma_class(Integer(17))
>>> G == G2
True
>>> G is G2
False
sage.modular.arithgroup.congroup_gamma.is_Gamma(x)[source]#

Return True if x is a congruence subgroup of type Gamma.

EXAMPLES:

sage: from sage.modular.arithgroup.all import Gamma_class
sage: isinstance(Gamma0(13), Gamma_class)
False
sage: isinstance(Gamma(4), Gamma_class)
True
>>> from sage.all import *
>>> from sage.modular.arithgroup.all import Gamma_class
>>> isinstance(Gamma0(Integer(13)), Gamma_class)
False
>>> isinstance(Gamma(Integer(4)), Gamma_class)
True