code / alex / psage / psage / modform / fourier_expansion_framework / gradedexpansions / gradedexpansion_element.py
241849 viewsr"""1Elements wrapping a Fourier expansion which partially known relations.23AUTHOR :4-- Martin Raum (2009 - 07 - 27) 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.fourierexpansionwrapper import FourierExpansionWrapper27from itertools import groupby28from sage.algebras.algebra_element import AlgebraElement29from sage.misc.all import prod30from sage.misc.latex import latex31from sage.modules.module_element import ModuleElement32from sage.rings.infinity import infinity33import operator3435#===============================================================================36# GradedExpansion_abstract37#===============================================================================3839class GradedExpansion_abstract ( FourierExpansionWrapper ) :40r"""41An abstract graded expansion.42"""4344def __init__(self, parent, polynomial) :45r"""46INPUT:47- ``parent`` -- An instance of :class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_ambient.GradedExpansionAmbient_abstract`.48- ``polynomial`` -- A polynomial in the polynomial ring underlying the parent.4950TESTS::51sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *52sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *53sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *54sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading55sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *56sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_element import *57sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))58sage: P.<a,b> = QQ[]59sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), P.ideal(0), DegreeGrading((1,2)))60sage: h = GradedExpansion_abstract(ger, P(0))61sage: h = GradedExpansion_abstract(ger, a*b)62"""63self.__polynomial = polynomial6465def polynomial(self) :66r"""67The underlying polynomial.6869OUTPUT:70A polynomial in the polynomial ring underlying the parent.7172NOTE:73This polynomial might change by elements of the parent's74relation ideal.7576TESTS::77sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *78sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *79sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *80sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading81sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *82sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_element import *83sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))84sage: P.<a,b> = QQ[]85sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), P.ideal(0), DegreeGrading((1,2)))86sage: h = GradedExpansion_abstract(ger, a * b)87sage: h.polynomial()88a*b89"""90return self.__polynomial9192def _reduce_polynomial(self, set_polynomial = True) :93r"""94The Groebner reduced underlying polynomial.9596INPUT:97- ``set_polynomial`` -- A boolean (default: ``True``); If ``True``98the underlying polynomial will be set to the99reduced polynomial.100OUTPUT:101A polynomial in the polynomial ring underlying the parent.102103TESTS::104sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *105sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *106sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *107sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading108sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *109sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_element import *110sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))111sage: P.<a,b> = QQ[]112sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), P.ideal(a - b), DegreeGrading((1,2)))113sage: h = GradedExpansion_class(ger, a - b)114sage: h._reduce_polynomial(set_polynomial = False)1150116sage: h.polynomial()117a - b118sage: h._reduce_polynomial()1190120sage: h.polynomial()1210122"""123if set_polynomial :124self.__polynomial = self.parent().relations().reduce(self.__polynomial)125126return self.__polynomial127else :128return self.parent().relations().reduce(self.__polynomial)129130def homogeneous_components(self) :131r"""132Split the underlying polynomial with respect to grading imposed on133the parent.134135OUTPUT:136A dictionary with key the grading values and values the polynomials.137138EXAMPLES::139sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *140sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *141sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *142sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading143sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *144sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_element import *145sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))146sage: P.<a,b> = QQ[]147sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), P.ideal(0), DegreeGrading((1,2)))148sage: h = GradedExpansion_class(ger, a - b)149sage: h.homogeneous_components()150{1: a, 2: -b}151152TESTS::153sage: h = GradedExpansion_class(ger, P(0))154sage: h.homogeneous_components()155{}156"""157if self.__polynomial.is_zero() :158return dict()159160components = dict()161grading = self.parent().grading().index162if self.__polynomial.parent().ngens() == 1 :163normalize = lambda e: (e,)164var = self.__polynomial.parent().gen(0)165monomial = lambda e: var**e166else :167normalize = lambda e: e168vars = self.__polynomial.parent().gens()169monomial = lambda e: prod( map(operator.pow, vars, e) )170171for e in self.__polynomial.exponents() :172ne = normalize(e)173m = monomial(e)174try :175components[grading(ne)] = components[grading(ne)] + m * self.__polynomial[e]176except KeyError :177components[grading(ne)] = m * self.__polynomial[e]178179return components180181def exponents(self) :182r"""183The exponents of the underlying polynomial.184185OUTPUT:186A list of tuples.187188TESTS::189sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *190sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *191sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *192sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading193sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *194sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_element import *195sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))196sage: P.<a,b> = QQ[]197sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), P.ideal(a - b), DegreeGrading((1,2)))198sage: h = GradedExpansion_abstract(ger, a - b)199sage: h.exponents()200[(1, 0), (0, 1)]201sage: P.<a> = QQ[]202sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), P.ideal(0), DegreeGrading((1,)))203sage: h = GradedExpansion_abstract(ger, a)204sage: h.exponents()205[(1,)]206"""207if self.polynomial().parent().ngens() == 1 :208return map(lambda e: (e,), self.polynomial().exponents())209else :210return map(tuple, self.polynomial().exponents())211212def grading_index(self) :213r"""214If ``self`` is homogeneous, return the index of ``self`` with respect to215the grading imposed on the parent. Otherwise, a ``ValueError`` is raised.216217OUTPUT:218A grading value.219220TESTS::221sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *222sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *223sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *224sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading225sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *226sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_element import *227sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))228sage: P.<a,b> = QQ[]229sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), P.ideal(a - b), DegreeGrading((1,2)))230sage: h = GradedExpansion_class(ger, a^2)231sage: h.grading_index()2322233sage: h = GradedExpansion_class(ger, P(0))234sage: h.grading_index()235+Infinity236sage: h = GradedExpansion_class(ger, a - b)237sage: h.grading_index()238Traceback (most recent call last):239...240ValueError: No homogeneous weight.241"""242cps = self.homogeneous_components()243if len(cps) == 0 :244return infinity245elif len(cps) != 1 :246raise ValueError( "No homogeneous weight." )247248return cps.keys()[0]249250def _add_(left, right) :251r"""252TESTS::253sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *254sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *255sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *256sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading257sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *258sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_element import *259sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))260sage: P.<a,b> = QQ[]261sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), P.ideal(a - b), DegreeGrading((1,2)))262sage: h = GradedExpansion_class(ger, a^2)263sage: l = GradedExpansion_class(ger, b)264sage: (h + l).polynomial()265a^2 + b266"""267return left.__class__( left.parent(),268left.polynomial() + right.polynomial() )269270def _lmul_(self, c) :271r"""272TESTS::273sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *274sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *275sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *276sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading277sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *278sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_element import *279sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))280sage: P.<a,b> = QQ[]281sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), P.ideal(a - b), DegreeGrading((1,2)))282sage: h = GradedExpansion_class(ger, a - b)283sage: (h*ger.base_ring()(4)).polynomial()2844*a - 4*b285"""286if self.parent().nbasegens() != 0 :287return self.__class__( self.parent(),288self.polynomial() * c.polynomial() )289else :290return self.__class__( self.parent(),291self.polynomial() * c )292293def _rmul_(self, c) :294r"""295TESTS::296sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *297sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *298sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *299sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading300sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *301sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_element import *302sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))303sage: P.<a,b> = QQ[]304sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), P.ideal(a - b), DegreeGrading((1,2)))305sage: h = GradedExpansion_class(ger, a^2)306sage: (ger.base_ring()(4) * h).polynomial()3074*a^2308"""309if self.parent().nbasegens() != 0 :310return self.__class__( self.parent(),311c.polynomial() * self.polynomial() )312else :313return self.__class__( self.parent(),314c * self.polynomial() )315316def __cmp__(self, other) :317r"""318TESTS::319sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *320sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *321sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *322sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading323sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *324sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_element import *325sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))326sage: P.<a,b> = QQ[]327sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), P.ideal(a - b), DegreeGrading((1,2)))328sage: h = GradedExpansion_class(ger, a^2)329sage: h == GradedExpansion_class(ger, a^2)330True331sage: h == GradedExpansion_class(ger, a - b)332False333sage: h = GradedExpansion_class(ger, P(0))334sage: h == GradedExpansion_class(ger, a - b)335True336sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), P.ideal(0), DegreeGrading((1,2)))337sage: h = GradedExpansion_class(ger, a^2)338sage: h == GradedExpansion_class(ger, a^2)339True340sage: h = GradedExpansion_class(ger, P(0))341sage: h == GradedExpansion_class(ger, a - b)342False343sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), P.ideal(a - b), DegreeGrading((1,2)), all_relations = False)344sage: h = GradedExpansion_class(ger, a^2)345sage: h == GradedExpansion_class(ger, a^2)346False347"""348c = cmp(type(self), type(other))349350if c == 0 :351if self.parent().all_relations_known() :352if self.parent().has_relation_free_generators() :353c = cmp(self.polynomial(), other.polynomial())354else :355c = cmp(self.parent().relations().reduce(self.polynomial() - other.polynomial()), 0)356else :357c = 1358359return c360361#===============================================================================362# GradedExpansion_class363#===============================================================================364365class GradedExpansion_class ( GradedExpansion_abstract, AlgebraElement ) :366r"""367A graded expansion which is element of an algebra.368369SEE:370:class:`fourier_expansion_framework.gradedexpansions.gradedexpansion_ring.GradedExpansionRing_class`.371"""372def __init__(self, parent, polynomial) :373r"""374INPUT:375- ``parent`` -- An instance of :class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_ring.GradedExpansionRing_class`.376- ``polynomial`` -- A polynomial in the polynomial ring underlying the parent.377378TESTS::379sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *380sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *381sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *382sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading383sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *384sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_element import *385sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))386sage: P.<a,b> = QQ[]387sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), P.ideal(a - b), DegreeGrading((1,2)))388sage: h = GradedExpansion_class(ger, a^2)389"""390AlgebraElement.__init__(self, parent)391GradedExpansion_abstract.__init__(self, parent, polynomial)392393def _mul_(left, right) :394r"""395TESTS::396sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *397sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *398sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *399sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading400sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *401sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_element import *402sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))403sage: P.<a,b> = QQ[]404sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), P.ideal(a - b), DegreeGrading((1,2)))405sage: h = GradedExpansion_class(ger, a^2)406sage: (h * h).polynomial()407a^4408"""409return left.__class__( left.parent(),410left.polynomial() * right.polynomial() )411412def __hash__(self) :413r"""414TESTS::415sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *416sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *417sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *418sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading419sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *420sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_element import *421sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))422sage: P.<a,b> = QQ[]423sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), P.ideal(a - b), DegreeGrading((1,2)))424sage: h = GradedExpansion_class(ger, a^2)425sage: hash(h)426-1239234133 # 32-bit42712415370528999851 # 64-bit428"""429return hash(self.polynomial())430431def _repr_(self) :432r"""433TESTS::434sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *435sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *436sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *437sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading438sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *439sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_element import *440sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))441sage: P.<a,b> = QQ[]442sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), P.ideal(a - b), DegreeGrading((1,2)))443sage: GradedExpansion_class(ger, a^2)444Graded expansion a^2445"""446return "Graded expansion %s" % (self.polynomial(),)447448def _latex_(self) :449r"""450TESTS::451sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *452sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *453sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *454sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading455sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *456sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_element import *457sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))458sage: P.<a,b> = QQ[]459sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), P.ideal(a - b), DegreeGrading((1,2)))460sage: latex( GradedExpansion_class(ger, a^2) )461\text{Graded expansion }a^{2}462"""463return r"\text{Graded expansion }%s" % latex(self.polynomial())464465class GradedExpansionVector_class ( GradedExpansion_abstract, ModuleElement ) :466r"""467A graded expansion which is element of a module.468469SEE:470:class:`fourier_expansion_framework.gradedexpansions.gradedexpansion_module.GradedExpansionModule_class`.471"""472473def __init__(self, parent, polynomial) :474r"""475INPUT:476- ``parent`` -- An instance of :class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_module.GradedExpansionModule_class`.477- ``polynomial`` -- A polynomial in the polynomial ring underlying the parent.478479TESTS::480sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *481sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *482sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *483sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading484sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *485sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_element import *486sage: m = FreeModule(QQ, 3)487sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))488sage: mps = mpsm.base_ring()489sage: P.<a,b> = QQ[]490sage: ger = GradedExpansionModule_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mpsm, {1: m([1,1,1]), 2: m([1,3,-3])}, mpsm.monoid().filter(4))]), P.ideal(0), DegreeGrading((1,2)))491sage: h = GradedExpansionVector_class(ger, a)492"""493ModuleElement.__init__(self, parent)494GradedExpansion_abstract.__init__(self, parent, polynomial)495496def __hash__(self) :497r"""498TESTS::499sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *500sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *501sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *502sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading503sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *504sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_element import *505sage: m = FreeModule(QQ, 3)506sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))507sage: mps = mpsm.base_ring()508sage: P.<a,b> = QQ[]509sage: ger = GradedExpansionModule_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mpsm, {1: m([1,1,1]), 2: m([1,3,-3])}, mpsm.monoid().filter(4))]), P.ideal(0), DegreeGrading((1,2)))510sage: h = GradedExpansionVector_class(ger, a)511sage: hash(h)512-1239234136 # 32-bit51312415370528999848 # 64-bit514"""515return hash(self.polynomial())516517def _repr_(self) :518r"""519TESTS::520sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *521sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *522sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *523sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading524sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *525sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_element import *526sage: m = FreeModule(QQ, 3)527sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))528sage: mps = mpsm.base_ring()529sage: P.<a,b> = QQ[]530sage: ger = GradedExpansionModule_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mpsm, {1: m([1,1,1]), 2: m([1,3,-3])}, mpsm.monoid().filter(4))]), P.ideal(0), DegreeGrading((1,2)))531sage: GradedExpansionVector_class(ger, a*b)532Graded expansion vector (a,)533"""534poly = self.polynomial()535536exps = poly.exponents()537if poly.parent().ngens() == 1 :538exps = map(lambda e: (e,), exps)539exps = sorted(map(tuple, exps), reverse = True)540541coefficient_monomials = poly.parent().gens()[:self.parent().nbasegens()]542exps = groupby(exps, lambda e: e[self.parent().nbasegens():])543vector_repr = [poly.parent()(0) for _ in range(self.parent().ngens())]544for v, es in exps :545if v.count(1) != 1 :546continue547548ind = v.index(1)549c = 0550for e in es :551c += poly[e] * prod(map(operator.pow, coefficient_monomials, e[:self.parent().nbasegens()]))552vector_repr[ind] += c553554return "Graded expansion vector %s" % (tuple(vector_repr),)555556def _latex_(self) :557r"""558TESTS::559sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *560sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *561sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *562sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading563sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *564sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_element import *565sage: m = FreeModule(QQ, 3)566sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))567sage: mps = mpsm.base_ring()568sage: P.<a,b> = QQ[]569sage: ger = GradedExpansionModule_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mpsm, {1: m([1,1,1]), 2: m([1,3,-3])}, mpsm.monoid().filter(4))]), P.ideal(0), DegreeGrading((1,2)))570sage: latex( GradedExpansionVector_class(ger, a*b) )571\text{Graded expansion vector }\left(a\right)572"""573poly = self.polynomial()574575exps = poly.exponents()576if poly.parent().ngens() == 1 :577exps = map(lambda e: (e,), exps)578exps = sorted(map(tuple, exps), reverse = True)579580coefficient_monomials = poly.parent().gens()[:self.parent().nbasegens()]581exps = groupby(exps, lambda e: e[self.parent().nbasegens():])582vector_repr = [poly.parent()(0) for _ in range(self.parent().ngens())]583for v, es in exps :584if v.count(1) != 1 :585continue586587ind = v.index(1)588c = 0589for e in es :590c += poly[e] * prod(map(operator.pow, coefficient_monomials, e[:self.parent().nbasegens()]))591vector_repr[ind] += c592593return r"\text{Graded expansion vector }%s" % (latex(tuple(vector_repr)),)594595596597