Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
241852 views
1
r"""
2
Submodules of rings of orthogonal modular forms.
3
4
AUTHOR :
5
-- Martin Raum (2009 - 07 - 30) Initial version
6
"""
7
8
#===============================================================================
9
#
10
# Copyright (C) 2009 Martin Raum
11
#
12
# This program is free software; you can redistribute it and/or
13
# modify it under the terms of the GNU General Public License
14
# as published by the Free Software Foundation; either version 3
15
# of the License, or (at your option) any later version.
16
#
17
# This program is distributed in the hope that it will be useful,
18
# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20
# General Public License for more details.
21
#
22
# You should have received a copy of the GNU General Public License
23
# along with this program; if not, see <http://www.gnu.org/licenses/>.
24
#
25
#===============================================================================
26
27
from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ambient import GradedExpansionAmbient_abstract
28
from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import GradedExpansionSubmodule_ambient_pid, \
29
GradedExpansionSubmodule_submodule_pid, \
30
GradedExpansionSubmodule_abstract, \
31
GradedExpansionSubmoduleVector_generic
32
from sage.misc.cachefunc import cached_method
33
from sage.structure.sequence import Sequence
34
import operator
35
36
#===============================================================================
37
# HeckeInvariantSubmodule_abstract
38
#===============================================================================
39
40
class HeckeInvariantSubmodule_abstract :
41
@cached_method
42
def _hecke_action(self, n) :
43
"""
44
Calculate the action of `T(n)` on the basis.
45
46
INPUT:
47
- `n` -- A Hecke modulus. Probably an integer.
48
49
OUTPUT:
50
A sequence of elements of self.
51
52
TESTS::
53
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_ambient import *
54
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_testtype import *
55
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
56
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_submodule import *
57
sage: ma = ModularFormsModule_withheckeaction( QQ, ModularFormTestType_vectorvalued(), NNFilter(5) )
58
sage: sm = ma.graded_submodule(3)
59
sage: sm._hecke_action(7)
60
[(1)]
61
"""
62
T = self.graded_ambient().type()._hecke_operator_class()(n)
63
64
return Sequence( [ self( T.eval(b.fourier_expansion(), self.graded_ambient()(b).weight()) )
65
for b in self.basis() ],
66
universe = self )
67
68
@cached_method
69
def hecke_homomorphism(self, n) :
70
"""
71
Calculate the matrix corresponding to the action of `T(n)` on the basis.
72
73
INPUT:
74
- `n` -- A Hecke modulus. Probably an integer.
75
76
OUTPUT:
77
A homomorphism from ``self`` to ``self``.
78
79
TESTS::
80
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_ambient import *
81
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_testtype import *
82
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
83
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_submodule import *
84
sage: ma = ModularFormsModule_withheckeaction( QQ, ModularFormTestType_vectorvalued(), NNFilter(5) )
85
sage: sm = ma.graded_submodule(3)
86
sage: sm.hecke_homomorphism(7)
87
Free module morphism defined by the matrix
88
[1]
89
Domain: Submodule of Graded expansion module with generators v1, v2, ...
90
Codomain: Submodule of Graded expansion module with generators v1, v2, ...
91
"""
92
return self.hom(self._hecke_action(n))
93
94
@cached_method
95
def hecke_eigenforms(self, n ) :
96
"""
97
Return a basis of eigenforms with respect to the Hecke operator `T(n)`.
98
99
INPUT:
100
- `n` -- A Hecke modulus. Probably an integer.
101
102
OUTPUT:
103
A list of elements in the graded ambient.
104
105
TESTS::
106
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_ambient import *
107
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_testtype import *
108
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
109
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_submodule import *
110
sage: ma = ModularFormsModule_withheckeaction( QQ, ModularFormTestType_vectorvalued(), NNFilter(5) )
111
sage: sm = ma.graded_submodule(3)
112
sage: sm.hecke_eigenforms(7)
113
[Graded expansion v1]
114
"""
115
hm = self.hecke_homomorphism(n).matrix().transpose()
116
hes = hm.eigenspaces_right()
117
118
efs = []
119
for e in hes :
120
ring_elements = Sequence( [sum(map(operator.mul, self._basis_in_graded_ambient(), b.list()))
121
for b in e[1].basis() ] )
122
123
efs += list(ring_elements)
124
125
return efs
126
127
#===============================================================================
128
# ModularFormsSubmoduleHeckeInvariant
129
#===============================================================================
130
131
def ModularFormsSubmoduleHeckeInvariant(arg1, arg2) :
132
"""
133
INPUT:
134
- ``arg1`` -- A graded ambient or an ambient module.
135
- ``arg2`` -- A list of elements in ``arg1``. The basis.
136
137
OUTPUT:
138
An submodule of modular forms.
139
140
TESTS::
141
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_ambient import *
142
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_testtype import *
143
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
144
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_submodule import *
145
sage: ma = ModularFormsModule_withheckeaction( QQ, ModularFormTestType_vectorvalued(), NNFilter(5) )
146
sage: sm = ma.graded_submodule(6)
147
sage: ssm = ModularFormsSubmoduleHeckeInvariant(sm, [sm.0])
148
"""
149
if isinstance(arg1, GradedExpansionAmbient_abstract) :
150
return ModularFormsSubmodule_heckeinvariant_ambient(arg1, arg2)
151
elif isinstance(arg1, GradedExpansionSubmodule_abstract) :
152
return ModularFormsSubmodule_heckeinvariant_submodule(arg1, arg2)
153
else :
154
raise ValueError( "Cannot construct subspace in %s with basis %s." % (arg1, arg2) )
155
156
return ModularFormsSubmodule_heckeinvariant_ambient
157
158
#===============================================================================
159
# ModularFormsSubmodule_heckeinvariant_ambient
160
#===============================================================================
161
162
class ModularFormsSubmodule_heckeinvariant_ambient (
163
GradedExpansionSubmodule_ambient_pid,
164
HeckeInvariantSubmodule_abstract ) :
165
166
def __init__(self, graded_ambient, basis, **kwds) :
167
"""
168
INPUT:
169
- ``graded_ambient`` -- A graded ambient.
170
- ``basis`` -- A list of elements in the graded ambient.
171
172
TESTS::
173
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_ambient import *
174
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_testtype import *
175
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
176
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_submodule import *
177
sage: ma = ModularFormsModule_withheckeaction( QQ, ModularFormTestType_vectorvalued(), NNFilter(5) )
178
sage: sm = ModularFormsSubmodule_heckeinvariant_ambient(ma, [ma.0])
179
"""
180
if not hasattr(self, '_element_class') :
181
try :
182
_element_class = graded_ambient.type()._space_element_class()
183
except NotImplementedError :
184
_element_class = GradedExpansionSubmoduleVector_generic
185
186
GradedExpansionSubmodule_ambient_pid.__init__(self, graded_ambient, basis,
187
**kwds)
188
189
#===============================================================================
190
# ModularFormsSubmodule_heckeinvariant_submodule
191
#===============================================================================
192
193
class ModularFormsSubmodule_heckeinvariant_submodule (
194
GradedExpansionSubmodule_submodule_pid,
195
HeckeInvariantSubmodule_abstract ) :
196
197
def __init__(self, ambient, basis, **kwds) :
198
"""
199
INPUT:
200
- ``ambient`` -- A submodule of modular forms.
201
- ``basis`` -- A list of elements in the ambient.
202
203
TESTS::
204
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_ambient import *
205
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_testtype import *
206
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
207
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_submodule import *
208
sage: ma = ModularFormsModule_withheckeaction( QQ, ModularFormTestType_vectorvalued(), NNFilter(5) )
209
sage: sm = ModularFormsSubmodule_heckeinvariant_ambient(ma, [ma.0, ma.1])
210
sage: ssm = ModularFormsSubmodule_heckeinvariant_submodule(sm, [sm.1])
211
"""
212
if not hasattr(self, '_element_class') :
213
try :
214
_element_class = ambient.graded_ambient().type()._space_element_class()
215
except NotImplementedError :
216
_element_class = GradedExpansionSubmoduleVector_generic
217
218
self.__integral_basis = None
219
220
GradedExpansionSubmodule_submodule_pid.__init__(self, ambient, basis,
221
**kwds)
222
223
def _set_integral_basis(self, basis) :
224
"""
225
An additional basis, that will not be echelonized.
226
227
INPUT:
228
- ``basis`` -- A list of elements of ``self``. A basis for ``self``.
229
230
OUTPUT:
231
``None``.
232
233
TESTS::
234
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_ambient import *
235
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_testtype import *
236
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
237
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_submodule import *
238
sage: ma = ModularFormsModule_withheckeaction( QQ, ModularFormTestType_vectorvalued(), NNFilter(5) )
239
sage: sm = ModularFormsSubmodule_heckeinvariant_ambient(ma, [ma.0, ma.1])
240
sage: ssm = ModularFormsSubmodule_heckeinvariant_submodule(sm, [sm.1])
241
sage: ssm._set_integral_basis([2 * sm.1])
242
sage: ssm._integral_basis()
243
[(0, 2)]
244
"""
245
self.__integral_basis = basis
246
247
def _integral_basis(self) :
248
"""
249
An additional basis, that will not be echelonized.
250
251
OUTPUT:
252
A list of elements of ``self``.
253
254
TESTS::
255
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_ambient import *
256
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_testtype import *
257
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
258
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_submodule import *
259
sage: ma = ModularFormsModule_withheckeaction( QQ, ModularFormTestType_vectorvalued(), NNFilter(5) )
260
sage: sm = ModularFormsSubmodule_heckeinvariant_ambient(ma, [ma.0, ma.1])
261
sage: ssm = ModularFormsSubmodule_heckeinvariant_submodule(sm, [sm.1])
262
sage: ssm._integral_basis()
263
Traceback (most recent call last):
264
...
265
RuntimeError: Integral basis is not set.
266
"""
267
if self.__integral_basis is None :
268
raise RuntimeError( "Integral basis is not set." )
269
270
return self.__integral_basis
271
272
#===============================================================================
273
# ModularFormsWeightSubmodule
274
#===============================================================================
275
276
def ModularFormsWeightSubmodule(graded_ambient, basis, weight) :
277
"""
278
A submodule of modular forms, that have the same weights.
279
280
INPUT:
281
- ``graded_ambient`` -- A graded ambient.
282
- ``basis`` -- A list of elements in the graded ambient.
283
- ``weight`` -- A grading index. The commen weight of all basis elements.
284
285
OUTPUT:
286
An instance of :class:~`.ModularFormsSubmodule_singleweight_ambient_pid`.
287
288
TESTS::
289
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_ambient import *
290
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_testtype import *
291
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
292
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_submodule import *
293
sage: ma = ModularFormsModule_withheckeaction( QQ, ModularFormTestType_vectorvalued(), NNFilter(5) )
294
sage: sm = ModularFormsWeightSubmodule(ma, [ma.0], 3)
295
"""
296
return ModularFormsSubmodule_singleweight_ambient_pid(graded_ambient, basis, weight)
297
298
#===============================================================================
299
# ModularFormSubmodule_singleweight
300
#===============================================================================
301
302
class ModularFormsSubmodule_singleweight_ambient_pid (
303
GradedExpansionSubmodule_ambient_pid,
304
HeckeInvariantSubmodule_abstract ) :
305
306
def __init__(self, graded_ambient, basis, weight, **kwds) :
307
"""
308
INPUT:
309
- ``graded_ambient`` -- A graded ambient.
310
- ``basis`` -- A list of elements in the graded ambient.
311
- ``weight`` -- A grading index. The commen weight of all basis elements.
312
- ``kwds`` -- Will be forwarded to :class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule.GradedExpansionSubmodule_ambient_pid`.
313
314
TESTS::
315
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_ambient import *
316
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_testtype import *
317
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
318
sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_submodule import *
319
sage: ma = ModularFormsModule_withheckeaction( QQ, ModularFormTestType_vectorvalued(), NNFilter(5) )
320
sage: sm = ModularFormsSubmodule_singleweight_ambient_pid(ma, [ma.0], 3)
321
"""
322
self.__weight = weight
323
if not hasattr(self, '_element_class') :
324
try :
325
_element_class = graded_ambient.type()._space_element_class()
326
except NotImplementedError :
327
_element_class = GradedExpansionSubmoduleVector_generic
328
329
GradedExpansionSubmodule_ambient_pid.__init__(self, graded_ambient, basis,
330
**kwds)
331
332
def weight(self) :
333
return self.__weight
334
335
## TODO: Provide standard implementation of is_cusp_form for vectors
336
## TODO: Provide implementation of homogeneous weight vectors and
337
## make Hecke operators work for this
338
339