AUTHORS:
Bases: sage.modular.arithgroup.congroup_generic.CongruenceSubgroup
The congruence subgroup \(\Gamma_H(N)\) for some subgroup \(H \trianglelefteq (\ZZ / N\ZZ)^\times\), which is the subgroup of \({\rm SL}_2(\ZZ)\) consisting of matrices of the form \(\begin{pmatrix} a & b \\ c & d \end{pmatrix}\) with \(N \mid c\) and \(a, b \in H\).
TESTS:
We test calculation of various invariants of the group:
sage: GammaH(33,[2]).projective_index()
96
sage: GammaH(33,[2]).genus()
5
sage: GammaH(7,[2]).genus()
0
sage: GammaH(23, [1..22]).genus()
2
sage: Gamma0(23).genus()
2
sage: GammaH(23, [1]).genus()
12
sage: Gamma1(23).genus()
12
We calculate the dimensions of some modular forms spaces:
sage: GammaH(33,[2]).dimension_cusp_forms(2)
5
sage: GammaH(33,[2]).dimension_cusp_forms(3)
0
sage: GammaH(33,[2,5]).dimension_cusp_forms(2)
3
sage: GammaH(32079, [21676]).dimension_cusp_forms(20)
180266112
We can sometimes show that there are no weight 1 cusp forms:
sage: GammaH(20, [9]).dimension_cusp_forms(1)
0
Return a set of coset representatives for self \ SL2Z.
EXAMPLES:
sage: list(Gamma1(3).coset_reps())
[
[1 0] [-1 -2] [ 0 -1] [-2 1] [1 0] [-3 -2] [ 0 -1] [-2 -3]
[0 1], [ 3 5], [ 1 0], [ 5 -3], [1 1], [ 8 5], [ 1 2], [ 5 7]
]
sage: len(list(Gamma1(31).coset_reps())) == 31**2 - 1
True
Return the dimension of the space of new (or \(p\)-new) weight \(k\) cusp forms for this congruence subgroup.
INPUT:
OUTPUT: Integer
EXAMPLES:
sage: GammaH(33,[2]).dimension_new_cusp_forms()
3
sage: Gamma1(4*25).dimension_new_cusp_forms(2, p=5)
225
sage: Gamma1(33).dimension_new_cusp_forms(2)
19
sage: Gamma1(33).dimension_new_cusp_forms(2,p=11)
21
Given this congruence subgroup \(\Gamma_H(N)\), return all subgroups \(\Gamma_G(M)\) for \(M\) a divisor of \(N\) and such that \(G\) is equal to the image of \(H\) modulo \(M\).
EXAMPLES:
sage: G = GammaH(33,[2]); G
Congruence Subgroup Gamma_H(33) with H generated by [2]
sage: G._list_of_elements_in_H()
[1, 2, 4, 8, 16, 17, 25, 29, 31, 32]
sage: G.divisor_subgroups()
[Modular Group SL(2,Z),
Congruence Subgroup Gamma0(3),
Congruence Subgroup Gamma0(11),
Congruence Subgroup Gamma_H(33) with H generated by [2]]
Return the subgroup of \(\Gamma_0(M)\), for \(M\) a multiple of \(N\), obtained by taking the preimage of this group under the reduction map; in other words, the intersection of this group with \(\Gamma_0(M)\).
EXAMPLES:
sage: G = GammaH(33, [2])
sage: G.extend(99)
Congruence Subgroup Gamma_H(99) with H generated by [2, 35, 68]
sage: G.extend(11)
Traceback (most recent call last):
...
ValueError: M (=11) must be a multiple of the level (33) of self
Return a set of coset representatives for self \ Gamma0(N), where N is the level of self.
EXAMPLE:
sage: GammaH(108, [1,-1]).gamma0_coset_reps()
[
[1 0] [-43 -45] [ 31 33] [-49 -54] [ 25 28] [-19 -22]
[0 1], [108 113], [108 115], [108 119], [108 121], [108 125],
<BLANKLINE>
[-17 -20] [ 47 57] [ 13 16] [ 41 52] [ 7 9] [-37 -49]
[108 127], [108 131], [108 133], [108 137], [108 139], [108 143],
<BLANKLINE>
[-35 -47] [ 29 40] [ -5 -7] [ 23 33] [-11 -16] [ 53 79]
[108 145], [108 149], [108 151], [108 155], [108 157], [108 161]
]
Return generators for this congruence subgroup. The result is cached.
INPUT:
If algorithm is set to "farey", then the generators will be calculated using Farey symbols, which will always return a minimal generating set. See farey_symbol for more information.
If algorithm is set to "todd-coxeter", a simpler algorithm based on Todd-Coxeter enumeration will be used. This tends to return far larger sets of generators.
EXAMPLE:
sage: GammaH(7, [2]).generators()
[
[1 1] [ 2 -1] [ 4 -3]
[0 1], [ 7 -3], [ 7 -5]
]
sage: GammaH(7, [2]).generators(algorithm="todd-coxeter")
[
[1 1] [-90 29] [ 15 4] [-10 -3] [ 1 -1] [1 0] [1 1] [-3 -1]
[0 1], [301 -97], [-49 -13], [ 7 2], [ 0 1], [7 1], [0 1], [ 7 2],
<BLANKLINE>
[-13 4] [-5 -1] [-5 -2] [-10 3] [ 1 0] [ 9 -1] [-20 7]
[ 42 -13], [21 4], [28 11], [ 63 -19], [-7 1], [28 -3], [-63 22],
<BLANKLINE>
[1 0] [-3 -1] [ 15 -4] [ 2 -1] [ 22 -7] [-5 1] [ 8 -3]
[7 1], [ 7 2], [ 49 -13], [ 7 -3], [ 63 -20], [14 -3], [-21 8],
<BLANKLINE>
[11 5] [-13 -4]
[35 16], [-42 -13]
]
Return the image of this group in \(SL(2, \ZZ / N\ZZ)\).
EXAMPLE:
sage: Gamma0(3).image_mod_n()
Matrix group over Ring of integers modulo 3 with 2 generators (
[2 0] [1 1]
[0 2], [0 1]
)
TEST:
sage: for n in [2..20]:
... for g in Gamma0(n).gamma_h_subgroups():
... G = g.image_mod_n()
... assert G.order() == Gamma(n).index() / g.index()
Return the index of self in SL2Z.
EXAMPLE:
sage: [G.index() for G in Gamma0(40).gamma_h_subgroups()]
[72, 144, 144, 144, 144, 288, 288, 288, 288, 144, 288, 288, 576, 576, 144, 288, 288, 576, 576, 144, 288, 288, 576, 576, 288, 576, 1152]
Return True precisely if this subgroup contains the matrix -1.
EXAMPLES:
sage: GammaH(10, [3]).is_even()
True
sage: GammaH(14, [1]).is_even()
False
Return True if self is a subgroup of right, and False otherwise.
EXAMPLES:
sage: GammaH(24,[7]).is_subgroup(SL2Z)
True
sage: GammaH(24,[7]).is_subgroup(Gamma0(8))
True
sage: GammaH(24, []).is_subgroup(GammaH(24, [7]))
True
sage: GammaH(24, []).is_subgroup(Gamma1(24))
True
sage: GammaH(24, [17]).is_subgroup(GammaH(24, [7]))
False
sage: GammaH(1371, [169]).is_subgroup(GammaH(457, [169]))
True
Return the number of orbits of cusps (regular or otherwise) for this subgroup.
EXAMPLE:
sage: GammaH(33,[2]).ncusps()
8
sage: GammaH(32079, [21676]).ncusps()
28800
AUTHORS:
Return the number of irregular cusps for this subgroup.
EXAMPLES:
sage: GammaH(3212, [2045, 2773]).nirregcusps()
720
Return the number of orbits of regular cusps for this subgroup. A cusp is regular if we may find a parabolic element generating the stabiliser of that cusp whose eigenvalues are both +1 rather than -1. If G contains -1, all cusps are regular.
EXAMPLES:
sage: GammaH(20, [17]).nregcusps()
4
sage: GammaH(20, [17]).nirregcusps()
2
sage: GammaH(3212, [2045, 2773]).nregcusps()
1440
sage: GammaH(3212, [2045, 2773]).nirregcusps()
720
AUTHOR:
Return the number of orbits of elliptic points of order 2 for this group.
EXAMPLE:
sage: [H.nu2() for n in [1..10] for H in Gamma0(n).gamma_h_subgroups()]
[1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0]
sage: GammaH(33,[2]).nu2()
0
sage: GammaH(5,[2]).nu2()
2
AUTHORS:
Return the number of orbits of elliptic points of order 3 for this group.
EXAMPLE:
sage: [H.nu3() for n in [1..10] for H in Gamma0(n).gamma_h_subgroups()]
[1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
sage: GammaH(33,[2]).nu3()
0
sage: GammaH(7,[2]).nu3()
2
AUTHORS:
Compute a minimal representative for the given cusp c. Returns a cusp c’ which is equivalent to the given cusp, and is in lowest terms with minimal positive denominator, and minimal positive numerator for that denominator.
Two cusps \(u_1/v_1\) and \(u_2/v_2\) are equivalent modulo \(\Gamma_H(N)\) if and only if
or
for some \(h \in H\).
EXAMPLES:
sage: GammaH(6,[5]).reduce_cusp(5/3)
1/3
sage: GammaH(12,[5]).reduce_cusp(Cusp(8,9))
1/3
sage: GammaH(12,[5]).reduce_cusp(5/12)
Infinity
sage: GammaH(12,[]).reduce_cusp(Cusp(5,12))
5/12
sage: GammaH(21,[5]).reduce_cusp(Cusp(-9/14))
1/7
sage: Gamma1(5).reduce_cusp(oo)
Infinity
sage: Gamma1(5).reduce_cusp(0)
0
Return the subgroup of \(\Gamma_0(M)\), for \(M\) a divisor of \(N\), obtained by taking the image of this group under reduction modulo \(N\).
EXAMPLES:
sage: G = GammaH(33,[2])
sage: G.restrict(11)
Congruence Subgroup Gamma0(11)
sage: G.restrict(1)
Modular Group SL(2,Z)
sage: G.restrict(15)
Traceback (most recent call last):
...
ValueError: M (=15) must be a divisor of the level (33) of self
Return the smallest even subgroup of \(SL(2, \ZZ)\) containing self.
EXAMPLE:
sage: GammaH(11, [4]).to_even_subgroup()
Congruence Subgroup Gamma0(11)
sage: Gamma1(11).to_even_subgroup()
Congruence Subgroup Gamma_H(11) with H generated by [10]
Return the congruence subgroup \(\Gamma_H(N)\), which is the subgroup of \(SL_2(\ZZ)\) consisting of matrices of the form \(\begin{pmatrix} a & b \\ c & d \end{pmatrix}\) with \(N | c\) and \(a, b \in H\), for \(H\) a specified subgroup of \((\ZZ/N\ZZ)^\times\).
INPUT:
level – an integer
EXAMPLES:
sage: GammaH(11,0) # indirect doctest
Congruence Subgroup Gamma0(11)
sage: GammaH(11,1)
Congruence Subgroup Gamma1(11)
sage: GammaH(11,[10])
Congruence Subgroup Gamma_H(11) with H generated by [10]
sage: GammaH(11,[10,1])
Congruence Subgroup Gamma_H(11) with H generated by [10]
sage: GammaH(14,[10])
Traceback (most recent call last):
...
ArithmeticError: The generators [10] must be units modulo 14
Return True if x is a congruence subgroup of type GammaH.
EXAMPLES:
sage: from sage.modular.arithgroup.all import is_GammaH
sage: is_GammaH(GammaH(13, [2]))
True
sage: is_GammaH(Gamma0(6))
True
sage: is_GammaH(Gamma1(6))
True
sage: is_GammaH(sage.modular.arithgroup.congroup_generic.CongruenceSubgroup(5))
False
Return 0 if any cube divides \(N\). Otherwise return \((-2)^v\) where \(v\) is the number of primes that exactly divide \(N\).
This is similar to the Moebius function.
INPUT:
OUTPUT: Integer
EXAMPLES:
sage: from sage.modular.arithgroup.congroup_gammaH import mumu
sage: mumu(27)
0
sage: mumu(6*25)
4
sage: mumu(7*9*25)
-2
sage: mumu(9*25)
1