code / alex / psage / psage / modform / fourier_expansion_framework / gradedexpansions / expansion_lazy_evaluation.py
241849 views"""1Lazy monoid power series which wrap graded expansions.23AUTHOR :4-- Martin Raum (2010 - 05 - 23) Initial version5"""67#===============================================================================8#9# Copyright (C) 2010 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.monoidpowerseries.monoidpowerseries_lazyelement import EquivariantMonoidPowerSeries_lazy2728def LazyFourierExpansionEvaluation(parent, element, precision) :29"""30Create an lazy equivaraint monoid power series which evaluates a31graded expansion.3233INPUT:34- ``parent`` -- A ring or module of equivariant monoid power series.35- ``element`` -- A graded expansion element.36- ``precision`` -- A filter for the parent's action.3738OUTPUT:39An instance of :class:~`fourier_expansion_framework.monoidpowerseries.monoidpowerseries_lazyelement.EquivariantMonoidPowerSeries_abstract_lazy`.4041TESTS::42sage: from psage.modform.fourier_expansion_framework.gradedexpansions import *43sage: from psage.modform.fourier_expansion_framework.monoidpowerseries import *44sage: from psage.modform.fourier_expansion_framework.gradedexpansions.expansion_lazy_evaluation import LazyFourierExpansionEvaluation45sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *46sage: emps = EquivariantMonoidPowerSeriesRing(NNMonoid(True), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", ZZ))47sage: em = ExpansionModule(Sequence([emps.one_element(), emps.one_element(), emps.one_element()]))48sage: h = LazyFourierExpansionEvaluation(emps, em([1,2,3]), emps.action().filter(3))49sage: h.coefficients()50{0: 6, 1: 0, 2: 0}51"""52if precision.is_infinite() :53raise ValueError( "Lazy evaluation of infinite expansions is not possible")5455delayed_coeffs = DelayedEvaluation_fourier_expansion(parent, element)5657return EquivariantMonoidPowerSeries_lazy(parent, precision, delayed_coeffs.getcoeff)585960class DelayedEvaluation_fourier_expansion :61"""62Helper class which evaluates the a graded expansion on and returns its63coefficients.64"""6566def __init__(self, parent, element) :67"""68INPUT:69- ``parent`` -- A ring or module of equivariant monoid power series.70- ``element`` -- A graded expansion element.7172TESTS::73sage: from psage.modform.fourier_expansion_framework.gradedexpansions import *74sage: from psage.modform.fourier_expansion_framework.monoidpowerseries import *75sage: from psage.modform.fourier_expansion_framework.gradedexpansions.expansion_lazy_evaluation import DelayedEvaluation_fourier_expansion76sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *77sage: emps = EquivariantMonoidPowerSeriesRing(NNMonoid(True), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", ZZ))78sage: em = ExpansionModule(Sequence([emps.one_element(), emps.one_element(), emps.one_element()]))79sage: de = DelayedEvaluation_fourier_expansion(emps, em([1,2,5]))80"""81self.__parent = parent82self.__element = element8384def getcoeff(self, key) :85"""86Return a coefficient of the Fourier expansion of a graded expansion.8788INPUT:89- ``key`` -- A pair ``(ch, k)`` of a character and a monoid element.9091OUTPUT:92An element of the parents coefficient domain.9394TESTS::95sage: from psage.modform.fourier_expansion_framework.gradedexpansions import *96sage: from psage.modform.fourier_expansion_framework.monoidpowerseries import *97sage: from psage.modform.fourier_expansion_framework.gradedexpansions.expansion_lazy_evaluation import DelayedEvaluation_fourier_expansion98sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *99sage: emps = EquivariantMonoidPowerSeriesRing(NNMonoid(True), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", ZZ))100sage: em = ExpansionModule(Sequence([emps.one_element(), emps.one_element(), emps.one_element()]))101sage: de = DelayedEvaluation_fourier_expansion(emps, em([1,2,-2]))102sage: (de.getcoeff(0), de.getcoeff(1))103(1, 0)104"""105try :106return self.__fourier_expansion[key]107except AttributeError :108self.__fourier_expansion = self.__element.fourier_expansion()109if self.__fourier_expansion.parent().coefficient_domain() != self.__parent.coefficient_domain() :110self.__fourier_expansion = self.__parent(self.__fourier_expansion)111112return self.__fourier_expansion[key]113114115