Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
241818 views
1
r"""
2
Elements of rings of paramodular forms of degree 2.
3
4
AUTHORS:
5
6
- Martin Raum (2010 - 05 - 06) Initial version.
7
"""
8
9
#===============================================================================
10
#
11
# Copyright (C) 2010 Martin Raum
12
#
13
# This program is free software; you can redistribute it and/or
14
# modify it under the terms of the GNU General Public License
15
# as published by the Free Software Foundation; either version 3
16
# of the License, or (at your option) any later version.
17
#
18
# This program is distributed in the hope that it will be useful,
19
# but WITHOUT ANY WARRANTY; without even the implied warranty of
20
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
# General Public License for more details.
22
#
23
# You should have received a copy of the GNU General Public License
24
# along with this program; if not, see <http://www.gnu.org/licenses/>.
25
#
26
#===============================================================================
27
28
from psage.modform.fourier_expansion_framework.modularforms.modularform_element import ModularForm_generic
29
from psage.modform.paramodularforms.paramodularformd2_fourierexpansion import ParamodularFormD2Filter_trace
30
from psage.modform.paramodularforms.paramodularformd2_fourierexpansion_cython import apply_GL_to_form
31
from sage.functions.other import ceil
32
from sage.modular.modsym.p1list import P1List
33
from sage.rings.all import Integer
34
from sage.rings.complex_field import is_ComplexField
35
from sage.structure.sequence import Sequence
36
37
class ParamodularFormD2_generic :
38
39
def is_cusp_form(self) :
40
raise NotImplementedError
41
42
class ParamodularFormD2_classical ( ParamodularFormD2_generic, ModularForm_generic ) :
43
44
def is_gritsenko_form(self) :
45
raise NotImplementedError
46
47
def atkin_lehner_eigenvalue_numerical(self, (tau1, z, tau2)) :
48
from sage.libs.mpmath import mp
49
from sage.libs.mpmath.mp import exp, pi
50
from sage.libs.mpmath.mp import j as i
51
52
if not Integer(self.__level()).is_prime() :
53
raise ValueError, "The Atkin Lehner involution is only unique if the level is a prime"
54
55
precision = ParamodularFormD2Filter_trace(self.precision())
56
57
s = Sequence([tau1, z, tau2])
58
if not is_ComplexField(s) :
59
mp_precision = 30
60
else :
61
mp_precision = ceil(3.33 * s.universe().precision() )
62
mp.dps = mp_precision
63
64
(tau1, z, tau2) = tuple(s)
65
(tau1p, zp, tau2p) = (self.level()*tau1, self.level()*z, self.level()*tau2)
66
67
(e_tau1, e_z, e_tau2) = (exp(2 * pi * i * tau1), exp(2 * pi * i * z), exp(2 * pi * i * tau2))
68
(e_tau1p, e_zp, e_tau2p) = (exp(2 * pi * i * tau1p), exp(2 * pi * i * zp), exp(2 * pi * i * tau2p))
69
70
self_value = s.universe().zero()
71
trans_value = s.universe().zero()
72
73
for k in precision :
74
(a,b,c) = apply_GL_to_form(self._P1List()(k[1]), k[0])
75
76
self_value = self_value + self[k] * (e_tau1**a * e_z**b * e_tau2**c)
77
trans_value = trans_value + self[k] * (e_tau1p**a * e_zp**b * e_tau2p**c)
78
79
return trans_value / self_value
80
81
def schmidt_t5_eigenvalue_numerical(self, (tau1, z, tau2)) :
82
from sage.libs.mpmath import mp
83
from sage.libs.mpmath.mp import exp, pi
84
from sage.libs.mpmath.mp import j as i
85
86
if not Integer(self.__level()).is_prime() :
87
raise ValueError, "T_5 is only unique if the level is a prime"
88
89
precision = ParamodularFormD2Filter_trace(self.precision())
90
91
s = Sequence([tau1, z, tau2])
92
if not is_ComplexField(s) :
93
mp_precision = 30
94
else :
95
mp_precision = ceil(3.33 * s.universe().precision())
96
mp.dps = mp_precision
97
98
p1list = P1List(self.level())
99
100
## Prepare the operation for d_1(N)
101
## We have to invert the lifts since we will later use apply_GL_to_form
102
d1_matrices = [p1list.lift_to_sl2z(i) for i in xrange(len(p1list))]
103
d1_matrices = map(lambda (a,b,c,d): (d,-b,-c,a), d1_matrices)
104
105
## Prepare the evaluation points corresponding to d_02(N)
106
d2_points = list()
107
for i in xrange(len(p1list())) :
108
(a, b, c, d) = p1list.lift_to_sl2z(i)
109
tau1p = (a * tau1 + b) / (c * tau1 + d)
110
zp = z / (c * tau1 + d)
111
tau2p = tau2 - c * z**2 / (c * tau1 + d)
112
113
(e_tau1p, e_zp, e_tau2p) = (exp(2 * pi * i * tau1p), exp(2 * pi * i * zp), exp(2 * pi * i * tau2p))
114
d2_points.append((e_tau1p, e_zp, e_tau2p))
115
116
(e_tau1, e_z, e_tau2) = (exp(2 * pi * i * tau1), exp(2 * pi * i * z), exp(2 * pi * i * tau2))
117
118
self_value = s.universe().zero()
119
trans_value = s.universe().zero()
120
121
for k in precision :
122
(a,b,c) = apply_GL_to_form(self._P1List()(k[1]), k[0])
123
124
self_value = self_value + self[k] * e_tau1**a * e_z**b * e_tau2**c
125
for m in d1_matrices :
126
(ap, bp, cp) = apply_GL_to_form(m, (a,b,c))
127
128
for (e_tau1p, e_zp, e_tau2p) in d2_points :
129
trans_value = trans_value + self[((ap,bp,cp),0)] * e_tau1p**ap * e_zp**bp * e_tau2p**cp
130
131
return trans_value / self_value
132
133