Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
241818 views
1
r"""
2
Abstract subspaces of Siegel modular forms.
3
4
AUTHORS:
5
6
- Martin Raum (2009 - 08 - ??) Initial version
7
"""
8
9
#===============================================================================
10
#
11
# Copyright (C) 2009 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.gradedexpansions.gradedexpansion_submodule import GradedExpansionSubmoduleVector_generic
29
from psage.modform.fourier_expansion_framework.modularforms.modularform_submodule import ModularFormsSubmodule_singleweight_ambient_pid, \
30
ModularFormsSubmodule_heckeinvariant_submodule
31
from sage.misc.cachefunc import cached_method
32
33
#===============================================================================
34
# DiscrimiantPrecisionSubmodule_abstract
35
#===============================================================================
36
37
class DiscrimiantPrecisionSubmodule_abstract :
38
def _minimal_discriminant_precision(self, minimal_precision = 0, lazy_rank_check = False) :
39
last_precision = None
40
for p in xrange(minimal_precision, self.graded_ambient().precision().discriminant() + 1) :
41
precision = self.graded_ambient().fourier_ring().filter(p)
42
if not precision < last_precision : continue
43
44
if self._check_precision(self, precision, lazy_rank_check) :
45
return precision
46
else :
47
raise ValueError( "This basis is not determined completely by its Fourier expansions." )
48
49
class SiegelModularFormG2WeightSubmodule_class ( ModularFormsSubmodule_singleweight_ambient_pid,
50
DiscrimiantPrecisionSubmodule_abstract ) :
51
@cached_method
52
def maass_space(self) :
53
return SiegelModularFormG2Submodule_maassspace(
54
self, map(self, self.graded_ambient().type(). \
55
_maass_generators( self.weight(),
56
self.graded_ambient().fourier_expansion_precision())) )
57
58
class SiegelModularFormG2Submodule_maassspace (
59
ModularFormsSubmodule_heckeinvariant_submodule, DiscrimiantPrecisionSubmodule_abstract ) :
60
61
def __init__(self, ambient, basis, **kwds) :
62
self.__provided_basis = basis
63
ModularFormsSubmodule_heckeinvariant_submodule.__init__(self, ambient, basis, **kwds)
64
65
def weight(self) :
66
return self.ambient_module().weight()
67
68
def _provided_basis(self) :
69
return self.__provided_basis
70
71
class SiegelModularFormG2SubmoduleVector_generic ( GradedExpansionSubmoduleVector_generic ) :
72
73
def is_cusp_form(self) :
74
r"""
75
Check wheater self is a cusp form or not.
76
"""
77
if self.parent().ring().type().group() != "Sp(2,ZZ)" :
78
raise NotImplementedError
79
80
try :
81
weight = self.parent().weight()
82
except AttributeError :
83
raise TypeError, "Can check cusps only for spaces of homogeneous weight"
84
85
neccessary_precision = weight // 12 + 1 if weight % 12 != 2 \
86
else weight // 12
87
if self.parent().ring().fourier_expansion_precision()._indefinite_content_bound() < neccessary_precision :
88
raise ValueError, "the parents precision doesn't suffice"
89
90
evc = self.fourier_expansion()
91
return all([evc[(0,0,l)] == 0 for l in xrange(neccessary_precision)])
92
93