Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagelib
Path: blob/master/sage/modular/hecke/degenmap.py
4077 views
1
"""
2
Degeneracy maps
3
"""
4
5
#*****************************************************************************
6
# Sage: System for Algebra and Geometry Experimentation
7
#
8
# Copyright (C) 2005 William Stein <[email protected]>
9
#
10
# Distributed under the terms of the GNU General Public License (GPL)
11
#
12
# This code is distributed in the hope that it will be useful,
13
# but WITHOUT ANY WARRANTY; without even the implied warranty of
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
# General Public License for more details.
16
#
17
# The full text of the GPL is available at:
18
#
19
# http://www.gnu.org/licenses/
20
#*****************************************************************************
21
22
23
import morphism
24
25
class DegeneracyMap(morphism.HeckeModuleMorphism_matrix):
26
"""
27
A degeneracy map between Hecke modules of different levels.
28
29
EXAMPLES:
30
We construct a number of degeneracy maps::
31
32
sage: M = ModularSymbols(33)
33
sage: d = M.degeneracy_map(11)
34
sage: d
35
Hecke module morphism degeneracy map corresponding to f(q) |--> f(q) defined by the matrix
36
[ 1 0 0]
37
[ 0 0 1]
38
[ 0 0 -1]
39
[ 0 1 -1]
40
[ 0 0 1]
41
[ 0 -1 1]
42
[-1 0 0]
43
[-1 0 0]
44
[-1 0 0]
45
Domain: Modular Symbols space of dimension 9 for Gamma_0(33) of weight ...
46
Codomain: Modular Symbols space of dimension 3 for Gamma_0(11) of weight ...
47
sage: d.t()
48
1
49
sage: d = M.degeneracy_map(11,3)
50
sage: d.t()
51
3
52
53
The parameter d must be a divisor of the quotient of the two levels::
54
55
sage: d = M.degeneracy_map(11,2)
56
Traceback (most recent call last):
57
...
58
ValueError: The level of self (=33) must be a divisor or multiple of level (=11), and t (=2) must be a divisor of the quotient.
59
60
Degeneracy maps can also go from lower level to higher level::
61
62
sage: M.degeneracy_map(66,2)
63
Hecke module morphism degeneracy map corresponding to f(q) |--> f(q^2) defined by the matrix
64
[ 2 0 0 0 0 0 1 0 0 0 1 -1 0 0 0 -1 1 0 0 0 0 0 0 0 -1]
65
[ 0 0 1 -1 0 -1 1 0 -1 2 0 0 0 -1 0 0 -1 1 2 -2 0 0 0 -1 1]
66
[ 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 -1 1 0 0 -1 1 0 0 0]
67
[ 0 0 0 0 0 0 0 0 0 2 -1 0 0 1 0 0 -1 1 0 0 1 0 -1 -1 1]
68
[ 0 -1 0 0 1 0 0 0 0 0 0 1 0 0 1 1 -1 0 0 -1 0 0 0 0 0]
69
[ 0 0 0 0 0 0 0 1 -1 0 0 2 -1 0 0 1 0 0 0 -1 0 -1 1 -1 1]
70
[ 0 0 0 0 1 -1 0 1 -1 0 0 0 0 0 -1 2 0 0 0 0 1 0 1 0 0]
71
[ 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0]
72
[ 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 1 1 1 0 0 0]
73
Domain: Modular Symbols space of dimension 9 for Gamma_0(33) of weight ...
74
Codomain: Modular Symbols space of dimension 25 for Gamma_0(66) of weight ...
75
"""
76
def __init__(self, matrix, domain, codomain, t):
77
r"""
78
Initialise a degeneracy map.
79
80
EXAMPLES::
81
82
sage: D = ModularSymbols(Gamma0(100)).degeneracy_map(2,5); D
83
Hecke module morphism degeneracy map corresponding to f(q) |--> f(q^5) defined by the matrix
84
31 x 1 dense matrix over Rational Field
85
Domain: Modular Symbols space of dimension 31 for Gamma_0(100) of weight ...
86
Codomain: Modular Symbols space of dimension 1 for Gamma_0(2) of weight ...
87
sage: D == loads(dumps(D))
88
True
89
"""
90
self.__t = t
91
H = domain.Hom(codomain)
92
if t == 1:
93
pow = ""
94
else:
95
pow = "^%s"%t
96
name = "degeneracy map corresponding to f(q) |--> f(q%s)"%(pow)
97
morphism.HeckeModuleMorphism_matrix.__init__(self, H, matrix, name)
98
99
def t(self):
100
"""
101
Return the divisor of the quotient of the two levels
102
associated to the degeneracy map.
103
104
EXAMPLES::
105
106
sage: M = ModularSymbols(33)
107
sage: d = M.degeneracy_map(11,3)
108
sage: d.t()
109
3
110
sage: d = M.degeneracy_map(11,1)
111
sage: d.t()
112
1
113
"""
114
return self.__t
115
116