Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
241818 views
1
r"""
2
The Hecke action on vector valued Siegel modular forms of genus 2.
3
4
AUTHORS:
5
6
- Martin Raum (2010 - 05 - 12) Initial version, based on classical case.
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.paramodularforms.siegelmodularformg2_fourierexpansion import SiegelModularFormG2VVRepresentation
29
from sage.misc.cachefunc import cached_method
30
from sage.misc.latex import latex
31
from sage.modular.modsym.p1list import P1List
32
from sage.rings.integer import Integer
33
from sage.structure.sage_object import SageObject
34
from psage.modform.paramodularforms import siegelmodularformg2_misc_cython
35
36
_siegelmodularformg2_heckeoperator_cache = dict()
37
38
#===============================================================================
39
# SiegelModularFormG2FourierExpansionHeckeAction
40
#===============================================================================
41
42
def SiegelModularFormG2VVFourierExpansionHeckeAction( n ) :
43
global _siegelmodularformg2_heckeoperator_cache
44
45
try :
46
return _siegelmodularformg2_heckeoperator_cache[n]
47
except KeyError :
48
A = SiegelModularFormG2VVFourierExpansionHeckeAction_class(n)
49
_siegelmodularformg2_heckeoperator_cache[n] = A
50
51
return A
52
53
#===============================================================================
54
# SiegelModularFormG2FourierExpansionHeckeAction_class
55
#===============================================================================
56
57
class SiegelModularFormG2VVFourierExpansionHeckeAction_class (SageObject):
58
r"""
59
Implements a Hecke operator acting on Siegel modular.
60
"""
61
62
def __init__(self, n):
63
self.__l = n
64
65
self.__l_divisors = siegelmodularformg2_misc_cython.divisor_dict(n + 1)
66
67
def eval(self, expansion, weight = None) :
68
"""
69
INPUT:
70
71
- ``weight`` -- A pair ``(sym_weight, det_weight)``.
72
"""
73
74
if weight is None :
75
try :
76
(sym_weight, det_weight) = expansion.weight()
77
except AttributeError :
78
raise ValueError, "weight must be defined for the Hecke action"
79
else :
80
(sym_weight, det_weight) = weight
81
82
precision = expansion.precision()
83
if precision.is_infinite() :
84
precision = expansion._bounding_precision()
85
else :
86
precision = precision._hecke_operator(self.__l)
87
characters = expansion.non_zero_components()
88
89
hecke_expansion = dict()
90
if isinstance(expansion.parent().representation(), SiegelModularFormG2VVRepresentation) :
91
for ch in characters :
92
hecke_expansion[ch] = dict( (k, self.hecke_coeff_polynomial(expansion, ch, k, sym_weight, det_weight)) for k in precision )
93
else :
94
raise TypeError, "Unknown representation type"
95
96
result = expansion.parent()._element_constructor_(hecke_expansion)
97
result._set_precision(expansion.precision()._hecke_operator(self.__l))
98
99
return result
100
101
def hecke_coeff_polynomial(self, expansion, ch, (a,b,c), j, k) :
102
r"""
103
Computes the coefficient indexed by $(a,b,c)$ of $T(\ell) (F)$
104
"""
105
character_eval = expansion.parent()._character_eval_function()
106
x = expansion.parent().coefficient_domain().gen(0)
107
y = expansion.parent().coefficient_domain().gen(1)
108
109
ell = self.__l
110
coeff = 0
111
for t1 in self.__l_divisors[ell]:
112
for t2 in self.__l_divisors[t1]:
113
for V in self.get_representatives(t1/t2):
114
aprime, bprime, cprime = self.change_variables(V,(a,b,c))
115
if aprime % t1 == 0 and bprime % t2 == 0 and cprime % t2 == 0:
116
try:
117
coeff = coeff + character_eval(V, ch) * t1**(k-2)*t2**(k-1) * \
118
expansion[( ch, ((ell*aprime) //t1**2,
119
(ell*bprime) //t1//t2,
120
(ell*cprime) //t2**2) )] ( ell//t1 * V[0] * x + ell//t1 * V[1] * y,
121
ell//t2 * V[2] * x + ell//t2 * V[3] * y )
122
except KeyError, msg:
123
raise ValueError, '%s' %(expansion,msg)
124
return coeff
125
126
@cached_method
127
def get_representatives( self, t) :
128
r"""
129
A helper function used in hecke_coeff that computes the right
130
coset representatives of $\Gamma^0(t)\SL(2,Z)$ where
131
$\Gamma^0(t)$ is the subgroup of $SL(2,Z)$ where the upper right hand
132
corner is divisible by $t$.
133
134
NOTE
135
We use the bijection $\Gamma^0(t)\SL(2,Z) \rightarrow P^1(\Z/t\Z)$
136
given by $A \mapsto [1:0]A$.
137
"""
138
if t == 1 : return [(1,0,0,1)]
139
140
rep_list = []
141
142
for x,y in P1List(t):
143
## we calculate a pair c,d satisfying a minimality condition
144
## to make later multiplications cheaper
145
(_, d, c) = Integer(x)._xgcd(Integer(y), minimal=True)
146
rep_list.append((x,y,-c,d))
147
148
return rep_list
149
150
@staticmethod
151
def change_variables((a,b,c,d), (n,r,m)):
152
r"""
153
A helper function used in hecke_coeff that computes the
154
quadratic form [nprime,rprime,mprime] given by $Q((x,y) V)$
155
where $Q=[n,r,m]$ and $V$ is a 2 by 2 matrix given by (a,b,c,d)
156
"""
157
return ( n*a**2 + r*a*b + m*b**2, 2*(n*a*c + m*b*d) + r*(a*d + c*b), \
158
n*c**2 + r*c*d + m*d**2 )
159
160
def _repr_(self) :
161
return '%s-th Hecke operator for vector valued Siegel modular forms' % self.__l
162
163
def _latex_(self) :
164
return latex(self.__n) + '-th Hecke operator for vector valued Siegel modular forms'
165
166