Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
241818 views
1
r"""
2
Generator functions for the Fourier expansion of vector valued Siegel modular forms.
3
4
AUTHORS:
5
6
- Martin Raum (2010 - 05 - 12) 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.paramodularforms.siegelmodularformg2_fourierexpansion import SiegelModularFormG2VVFourierExpansionRing
29
from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ambient import EquivariantMonoidPowerSeriesAmbient_abstract
30
from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_lazyelement import EquivariantMonoidPowerSeries_lazy
31
from psage.modform.paramodularforms.siegelmodularformg2vv_fegenerators_cython import satoh_dz
32
33
#===============================================================================
34
# SiegelModularFormG2SatohBracket
35
#===============================================================================
36
37
def SiegelModularFormG2SatohBracket(f, g, f_weight = None, g_weight = None) :
38
r"""
39
INPUT:
40
41
- `f` -- Fourier expansion of a classical Siegel modular form.
42
43
- `g` -- Fourier expansion of a classical Siegel modular form.
44
45
- ``f_weight`` -- the weight of `f` (default: ``None``).
46
47
- ``g_weight`` -- the weight of `g` (default: ``None``).
48
49
OUTPUT:
50
51
- The Fourier expansion of a vector-valued Siegel modular form.
52
"""
53
if f_weight is None :
54
f_weight = f.weight()
55
if g_weight is None :
56
g_weight = g.weight()
57
58
if not isinstance(f.parent(), EquivariantMonoidPowerSeriesAmbient_abstract) :
59
f = f.fourier_expansion()
60
if not isinstance(g.parent(), EquivariantMonoidPowerSeriesAmbient_abstract) :
61
g = g.fourier_expansion()
62
63
if f.parent() != g.parent() :
64
if f.parent().has_coerce_map_from(g.parent()) :
65
g = f.parent()(g)
66
elif g.parent().has_coerce_map_from(f.parent()) :
67
f = g.parent()(f)
68
else :
69
from sage.categories.pushout import pushout
70
parent = pushout(f.parent(), g.parent())
71
f = parent(f)
72
g = parent(g)
73
74
precision = min(f.precision(), g.precision())
75
76
expansion_ring = SiegelModularFormG2VVFourierExpansionRing(
77
f.parent().coefficient_domain().fraction_field() )
78
coefficients_factory = DelayedFactory_SMFG2_satohbracket(
79
f, g, f_weight, g_weight, expansion_ring.coefficient_domain() )
80
81
return EquivariantMonoidPowerSeries_lazy( expansion_ring, precision,
82
coefficients_factory.getcoeff )
83
84
#===============================================================================
85
# DelayedFactory_SMFG2_satohbracket
86
#===============================================================================
87
88
class DelayedFactory_SMFG2_satohbracket :
89
def __init__( self, f, g, f_weight, g_weight, coefficient_domain ) :
90
self.__f = f
91
self.__g = g
92
self.__f_weight = f_weight
93
self.__g_weight = g_weight
94
self.__coefficient_domain = coefficient_domain
95
96
self.__series = None
97
98
def getcoeff( self, key, **kwds ) :
99
(_, k) = key
100
# for speed we ignore the character
101
if self.__series is None :
102
self.__series = \
103
_satoh_bracket( self.__f, self.__g,
104
self.__f_weight, self.__g_weight )
105
106
return self.__coefficient_domain( self.__series[k] )
107
108
def _satoh_bracket(f, g, f_weight, g_weight) :
109
r"""
110
We suppose that `f` and `g` are either contained in a ring of a scalar
111
valued Siegel modular forms or that they are equivariant monoid
112
power series.
113
`f` and `g` must have the same parent after conversion to fourier
114
expansions.
115
116
OUTPUT:
117
118
- The return value is a Equivariant monoid power series.
119
"""
120
if not f.parent() == g.parent() :
121
raise ValueError, "The fourier expansions of f and g must" + \
122
" have the same parent"
123
124
base_ring = f.parent().coefficient_domain()
125
if len(f.non_zero_components()) != 1 :
126
raise ValueError, "f must have only one non-vanishing character"
127
if len(g.non_zero_components()) != 1 :
128
raise ValueError, "g must have only one non-vanishing character"
129
130
fe_ring = SiegelModularFormG2VVFourierExpansionRing(base_ring)
131
R = fe_ring.coefficient_domain()
132
133
dzf = fe_ring(satoh_dz(f.coefficients(False), R))
134
dzg = fe_ring(satoh_dz(g.coefficients(False), R))
135
136
return (g * dzf) / f_weight - (f * dzg) / g_weight
137
138