Congruence Subgroup
¶
AUTHORS:
- Jordi Quer
- David Loeffler
-
class
sage.modular.arithgroup.congroup_gammaH.
GammaH_class
(level, H, Hlist=None)¶ Bases:
sage.modular.arithgroup.congroup_generic.CongruenceSubgroup
The congruence subgroup
for some subgroup
, which is the subgroup of
consisting of matrices of the form
with
and
.
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
-
coset_reps
()¶ 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
-
dimension_new_cusp_forms
(k=2, p=0)¶ Return the dimension of the space of new (or
-new) weight
cusp forms for this congruence subgroup.
INPUT:
k
- an integer (default: 2), the weight. Not fully implemented for k = 1.p
- integer (default: 0); if nonzero, compute the-new subspace.
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
-
divisor_subgroups
()¶ Given this congruence subgroup
, return all subgroups
for
a divisor of
and such that
is equal to the image of
modulo
.
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]]
-
extend
(M)¶ Return the subgroup of
, for
a multiple of
, obtained by taking the preimage of this group under the reduction map; in other words, the intersection of this group with
.
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
-
gamma0_coset_reps
()¶ 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], [-17 -20] [ 47 57] [ 13 16] [ 41 52] [ 7 9] [-37 -49] [108 127], [108 131], [108 133], [108 137], [108 139], [108 143], [-35 -47] [ 29 40] [ -5 -7] [ 23 33] [-11 -16] [ 53 79] [108 145], [108 149], [108 151], [108 155], [108 157], [108 161] ]
-
generators
(algorithm='farey')¶ Return generators for this congruence subgroup. The result is cached.
INPUT:
algorithm
(string): eitherfarey
(default) ortodd-coxeter
.
If
algorithm
is set to"farey"
, then the generators will be calculated using Farey symbols, which will always return a minimal generating set. Seefarey_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], [-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], [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], [11 5] [-13 -4] [35 16], [-42 -13] ]
-
image_mod_n
()¶ Return the image of this group in
.
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()
-
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]
-
is_even
()¶ 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
-
is_subgroup
(other)¶ 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
-
ncusps
()¶ 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:
- Jordi Quer
-
nirregcusps
()¶ Return the number of irregular cusps for this subgroup.
EXAMPLES:
sage: GammaH(3212, [2045, 2773]).nirregcusps() 720
-
nregcusps
()¶ 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:
- Jordi Quer
-
nu2
()¶ 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:
- Jordi Quer
-
nu3
()¶ 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:
- Jordi Quer
-
reduce_cusp
(c)¶ 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
and
are equivalent modulo
if and only if
or
for some
.
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
-
restrict
(M)¶ Return the subgroup of
, for
a divisor of
, obtained by taking the image of this group under reduction modulo
.
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
-
to_even_subgroup
()¶ Return the smallest even subgroup of
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]
-
-
sage.modular.arithgroup.congroup_gammaH.
GammaH_constructor
(level, H)¶ Return the congruence subgroup
, which is the subgroup of
consisting of matrices of the form
with
and
, for
a specified subgroup of
.
INPUT:
level – an integer
- H – either 0, 1, or a list
- If H is a list, return
, where
is the subgroup of
generated by the elements of the list.
- If H = 0, returns
.
- If H = 1, returns
.
- If H is a list, return
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
-
sage.modular.arithgroup.congroup_gammaH.
is_GammaH
(x)¶ 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
-
sage.modular.arithgroup.congroup_gammaH.
mumu
(N)¶ Return 0 if any cube divides
. Otherwise return
where
is the number of primes that exactly divide
.
This is similar to the Möbius function.
INPUT:
N
- an integer at least 1
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