code / alex / psage / psage / modform / fourier_expansion_framework / modularforms / modularform_submodule.py
241852 viewsr"""1Submodules of rings of orthogonal modular forms.23AUTHOR :4-- Martin Raum (2009 - 07 - 30) Initial version5"""67#===============================================================================8#9# Copyright (C) 2009 Martin Raum10#11# This program is free software; you can redistribute it and/or12# modify it under the terms of the GNU General Public License13# as published by the Free Software Foundation; either version 314# of the License, or (at your option) any later version.15#16# This program is distributed in the hope that it will be useful,17# but WITHOUT ANY WARRANTY; without even the implied warranty of18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU19# General Public License for more details.20#21# You should have received a copy of the GNU General Public License22# along with this program; if not, see <http://www.gnu.org/licenses/>.23#24#===============================================================================2526from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ambient import GradedExpansionAmbient_abstract27from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import GradedExpansionSubmodule_ambient_pid, \28GradedExpansionSubmodule_submodule_pid, \29GradedExpansionSubmodule_abstract, \30GradedExpansionSubmoduleVector_generic31from sage.misc.cachefunc import cached_method32from sage.structure.sequence import Sequence33import operator3435#===============================================================================36# HeckeInvariantSubmodule_abstract37#===============================================================================3839class HeckeInvariantSubmodule_abstract :40@cached_method41def _hecke_action(self, n) :42"""43Calculate the action of `T(n)` on the basis.4445INPUT:46- `n` -- A Hecke modulus. Probably an integer.4748OUTPUT:49A sequence of elements of self.5051TESTS::52sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_ambient import *53sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_testtype import *54sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *55sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_submodule import *56sage: ma = ModularFormsModule_withheckeaction( QQ, ModularFormTestType_vectorvalued(), NNFilter(5) )57sage: sm = ma.graded_submodule(3)58sage: sm._hecke_action(7)59[(1)]60"""61T = self.graded_ambient().type()._hecke_operator_class()(n)6263return Sequence( [ self( T.eval(b.fourier_expansion(), self.graded_ambient()(b).weight()) )64for b in self.basis() ],65universe = self )6667@cached_method68def hecke_homomorphism(self, n) :69"""70Calculate the matrix corresponding to the action of `T(n)` on the basis.7172INPUT:73- `n` -- A Hecke modulus. Probably an integer.7475OUTPUT:76A homomorphism from ``self`` to ``self``.7778TESTS::79sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_ambient import *80sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_testtype import *81sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *82sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_submodule import *83sage: ma = ModularFormsModule_withheckeaction( QQ, ModularFormTestType_vectorvalued(), NNFilter(5) )84sage: sm = ma.graded_submodule(3)85sage: sm.hecke_homomorphism(7)86Free module morphism defined by the matrix87[1]88Domain: Submodule of Graded expansion module with generators v1, v2, ...89Codomain: Submodule of Graded expansion module with generators v1, v2, ...90"""91return self.hom(self._hecke_action(n))9293@cached_method94def hecke_eigenforms(self, n ) :95"""96Return a basis of eigenforms with respect to the Hecke operator `T(n)`.9798INPUT:99- `n` -- A Hecke modulus. Probably an integer.100101OUTPUT:102A list of elements in the graded ambient.103104TESTS::105sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_ambient import *106sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_testtype import *107sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *108sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_submodule import *109sage: ma = ModularFormsModule_withheckeaction( QQ, ModularFormTestType_vectorvalued(), NNFilter(5) )110sage: sm = ma.graded_submodule(3)111sage: sm.hecke_eigenforms(7)112[Graded expansion v1]113"""114hm = self.hecke_homomorphism(n).matrix().transpose()115hes = hm.eigenspaces_right()116117efs = []118for e in hes :119ring_elements = Sequence( [sum(map(operator.mul, self._basis_in_graded_ambient(), b.list()))120for b in e[1].basis() ] )121122efs += list(ring_elements)123124return efs125126#===============================================================================127# ModularFormsSubmoduleHeckeInvariant128#===============================================================================129130def ModularFormsSubmoduleHeckeInvariant(arg1, arg2) :131"""132INPUT:133- ``arg1`` -- A graded ambient or an ambient module.134- ``arg2`` -- A list of elements in ``arg1``. The basis.135136OUTPUT:137An submodule of modular forms.138139TESTS::140sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_ambient import *141sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_testtype import *142sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *143sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_submodule import *144sage: ma = ModularFormsModule_withheckeaction( QQ, ModularFormTestType_vectorvalued(), NNFilter(5) )145sage: sm = ma.graded_submodule(6)146sage: ssm = ModularFormsSubmoduleHeckeInvariant(sm, [sm.0])147"""148if isinstance(arg1, GradedExpansionAmbient_abstract) :149return ModularFormsSubmodule_heckeinvariant_ambient(arg1, arg2)150elif isinstance(arg1, GradedExpansionSubmodule_abstract) :151return ModularFormsSubmodule_heckeinvariant_submodule(arg1, arg2)152else :153raise ValueError( "Cannot construct subspace in %s with basis %s." % (arg1, arg2) )154155return ModularFormsSubmodule_heckeinvariant_ambient156157#===============================================================================158# ModularFormsSubmodule_heckeinvariant_ambient159#===============================================================================160161class ModularFormsSubmodule_heckeinvariant_ambient (162GradedExpansionSubmodule_ambient_pid,163HeckeInvariantSubmodule_abstract ) :164165def __init__(self, graded_ambient, basis, **kwds) :166"""167INPUT:168- ``graded_ambient`` -- A graded ambient.169- ``basis`` -- A list of elements in the graded ambient.170171TESTS::172sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_ambient import *173sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_testtype import *174sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *175sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_submodule import *176sage: ma = ModularFormsModule_withheckeaction( QQ, ModularFormTestType_vectorvalued(), NNFilter(5) )177sage: sm = ModularFormsSubmodule_heckeinvariant_ambient(ma, [ma.0])178"""179if not hasattr(self, '_element_class') :180try :181_element_class = graded_ambient.type()._space_element_class()182except NotImplementedError :183_element_class = GradedExpansionSubmoduleVector_generic184185GradedExpansionSubmodule_ambient_pid.__init__(self, graded_ambient, basis,186**kwds)187188#===============================================================================189# ModularFormsSubmodule_heckeinvariant_submodule190#===============================================================================191192class ModularFormsSubmodule_heckeinvariant_submodule (193GradedExpansionSubmodule_submodule_pid,194HeckeInvariantSubmodule_abstract ) :195196def __init__(self, ambient, basis, **kwds) :197"""198INPUT:199- ``ambient`` -- A submodule of modular forms.200- ``basis`` -- A list of elements in the ambient.201202TESTS::203sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_ambient import *204sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_testtype import *205sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *206sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_submodule import *207sage: ma = ModularFormsModule_withheckeaction( QQ, ModularFormTestType_vectorvalued(), NNFilter(5) )208sage: sm = ModularFormsSubmodule_heckeinvariant_ambient(ma, [ma.0, ma.1])209sage: ssm = ModularFormsSubmodule_heckeinvariant_submodule(sm, [sm.1])210"""211if not hasattr(self, '_element_class') :212try :213_element_class = ambient.graded_ambient().type()._space_element_class()214except NotImplementedError :215_element_class = GradedExpansionSubmoduleVector_generic216217self.__integral_basis = None218219GradedExpansionSubmodule_submodule_pid.__init__(self, ambient, basis,220**kwds)221222def _set_integral_basis(self, basis) :223"""224An additional basis, that will not be echelonized.225226INPUT:227- ``basis`` -- A list of elements of ``self``. A basis for ``self``.228229OUTPUT:230``None``.231232TESTS::233sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_ambient import *234sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_testtype import *235sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *236sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_submodule import *237sage: ma = ModularFormsModule_withheckeaction( QQ, ModularFormTestType_vectorvalued(), NNFilter(5) )238sage: sm = ModularFormsSubmodule_heckeinvariant_ambient(ma, [ma.0, ma.1])239sage: ssm = ModularFormsSubmodule_heckeinvariant_submodule(sm, [sm.1])240sage: ssm._set_integral_basis([2 * sm.1])241sage: ssm._integral_basis()242[(0, 2)]243"""244self.__integral_basis = basis245246def _integral_basis(self) :247"""248An additional basis, that will not be echelonized.249250OUTPUT:251A list of elements of ``self``.252253TESTS::254sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_ambient import *255sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_testtype import *256sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *257sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_submodule import *258sage: ma = ModularFormsModule_withheckeaction( QQ, ModularFormTestType_vectorvalued(), NNFilter(5) )259sage: sm = ModularFormsSubmodule_heckeinvariant_ambient(ma, [ma.0, ma.1])260sage: ssm = ModularFormsSubmodule_heckeinvariant_submodule(sm, [sm.1])261sage: ssm._integral_basis()262Traceback (most recent call last):263...264RuntimeError: Integral basis is not set.265"""266if self.__integral_basis is None :267raise RuntimeError( "Integral basis is not set." )268269return self.__integral_basis270271#===============================================================================272# ModularFormsWeightSubmodule273#===============================================================================274275def ModularFormsWeightSubmodule(graded_ambient, basis, weight) :276"""277A submodule of modular forms, that have the same weights.278279INPUT:280- ``graded_ambient`` -- A graded ambient.281- ``basis`` -- A list of elements in the graded ambient.282- ``weight`` -- A grading index. The commen weight of all basis elements.283284OUTPUT:285An instance of :class:~`.ModularFormsSubmodule_singleweight_ambient_pid`.286287TESTS::288sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_ambient import *289sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_testtype import *290sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *291sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_submodule import *292sage: ma = ModularFormsModule_withheckeaction( QQ, ModularFormTestType_vectorvalued(), NNFilter(5) )293sage: sm = ModularFormsWeightSubmodule(ma, [ma.0], 3)294"""295return ModularFormsSubmodule_singleweight_ambient_pid(graded_ambient, basis, weight)296297#===============================================================================298# ModularFormSubmodule_singleweight299#===============================================================================300301class ModularFormsSubmodule_singleweight_ambient_pid (302GradedExpansionSubmodule_ambient_pid,303HeckeInvariantSubmodule_abstract ) :304305def __init__(self, graded_ambient, basis, weight, **kwds) :306"""307INPUT:308- ``graded_ambient`` -- A graded ambient.309- ``basis`` -- A list of elements in the graded ambient.310- ``weight`` -- A grading index. The commen weight of all basis elements.311- ``kwds`` -- Will be forwarded to :class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule.GradedExpansionSubmodule_ambient_pid`.312313TESTS::314sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_ambient import *315sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_testtype import *316sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *317sage: from psage.modform.fourier_expansion_framework.modularforms.modularform_submodule import *318sage: ma = ModularFormsModule_withheckeaction( QQ, ModularFormTestType_vectorvalued(), NNFilter(5) )319sage: sm = ModularFormsSubmodule_singleweight_ambient_pid(ma, [ma.0], 3)320"""321self.__weight = weight322if not hasattr(self, '_element_class') :323try :324_element_class = graded_ambient.type()._space_element_class()325except NotImplementedError :326_element_class = GradedExpansionSubmoduleVector_generic327328GradedExpansionSubmodule_ambient_pid.__init__(self, graded_ambient, basis,329**kwds)330331def weight(self) :332return self.__weight333334## TODO: Provide standard implementation of is_cusp_form for vectors335## TODO: Provide implementation of homogeneous weight vectors and336## make Hecke operators work for this337338339