code / alex / psage / psage / modform / fourier_expansion_framework / gradedexpansions / gradedexpansion_submodule.py
241849 viewsr"""1Finite dimensional submodules of a ring or module of graded expansions.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.expansion_lazy_evaluation import LazyFourierExpansionEvaluation27from psage.modform.fourier_expansion_framework.gradedexpansions.expansion_module import ExpansionModule_abstract28from psage.modform.fourier_expansion_framework.gradedexpansions.expansion_module import ExpansionModule_generic, ExpansionModule_ambient_pid, \29ExpansionModule_submodule_pid, ExpansionModuleVector_generic30from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ambient import GradedExpansionAmbient_abstract31from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ambient import MonoidPowerSeriesAmbient_abstract32from sage.categories.pushout import pushout33from sage.interfaces.magma import magma34from sage.matrix.constructor import matrix35from sage.misc.cachefunc import cached_method36from sage.misc.flatten import flatten37from sage.misc.latex import latex38from sage.misc.misc import mul39from sage.misc.misc import union40from sage.modules.free_module import FreeModule, FreeModule_generic, \41FreeModule_ambient_pid, FreeModule_submodule_pid42from sage.modules.free_module import is_FreeModule43from sage.modules.free_module_element import FreeModuleElement_generic_dense44from sage.modules.free_module_element import vector45from sage.rings.arith import random_prime46from sage.rings.integer_ring import ZZ47from sage.rings.number_field.order import Order as NumberFieldOrder48from sage.rings.padics.factory import Qp49from sage.rings.principal_ideal_domain import PrincipalIdealDomain50from sage.rings.rational_field import QQ51from sage.rings.ring import Ring52from sage.structure.element import Element53from sage.structure.sequence import Sequence5455#===============================================================================56# GradedExpansionSubmodule57#===============================================================================5859def GradedExpansionSubmodule(arg1, arg2) :60r"""61A submodule of either a graded ring, module or submodule.6263INPUT (first possibility):64- ``arg1`` -- An instance of :class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_ambient.GradedExpansionAmbient_abstract`.65- ``arg2`` -- A tuple, list or sequence of elements of ``arg1``.66INPUT (second possibility):67- ``arg1`` -- An instance of :class:~`.GradedExpansionSubmodule_ambient_pid` or :class:~`.GradedExpansionSubmodule_submodule_pid`.68- ``arg2`` -- A tuple, list or sequence of elements of ``arg1``.6970NOTE:71The base ring of the graded expansion ambient must be an integral domain.7273OUTPUT:74An instance of :class:~`.GradedExpansionSubmodule_abstract`.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_module import *80sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *81sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading82sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *83sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *84sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *85sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))86sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))87sage: sm = GradedExpansionSubmodule(ger, [ger.0, ger.1])88sage: sm = GradedExpansionSubmodule(ger, (ger.0, ger.1))89sage: sm = GradedExpansionSubmodule(ger, Sequence([ger.0, ger.1]))90sage: sm2 = GradedExpansionSubmodule(sm, [sm.0])91sage: m = FreeModule(QQ, 3)92sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))93sage: mps = mpsm.base_ring()94sage: ger = GradedExpansionModule_class(None, Sequence([MonoidPowerSeries(mpsm, {1 : m([1,2,3]), 2 : m([3,-3,2])}, mpsm.monoid().filter(4)), MonoidPowerSeries(mpsm, {1 : m([2,-1,-1]), 2 : m([1,0,0])}, mpsm.monoid().filter(4))]), PolynomialRing(ZZ, ['a', 'b']).ideal(0), DegreeGrading((1,2)))95sage: sm = GradedExpansionSubmodule(ger, [ger.0])96"""97if isinstance(arg1, GradedExpansionAmbient_abstract) :98base_ring = arg1.relations().base_ring()99100if base_ring.is_field() or \101isinstance(base_ring, PrincipalIdealDomain) or \102isinstance(base_ring, NumberFieldOrder) \103and base_ring.is_maximal() and base_ring.class_number() == 1 :104return GradedExpansionSubmodule_ambient_pid(arg1, arg2)105else :106return GradedExpansionSubmodule_generic(arg1, arg2, len(arg2))107elif isinstance(arg1, GradedExpansionSubmodule_ambient_pid) \108or isinstance(arg1, GradedExpansionSubmodule_submodule_pid) :109return GradedExpansionSubmodule_submodule_pid(arg1, arg2)110111raise ValueError( "Cannot construct a new subspace from %s, %s" % (arg1, arg2) )112113#===============================================================================114# GradedExpansionSubmodule_abstract115#===============================================================================116117class GradedExpansionSubmodule_abstract ( ExpansionModule_abstract ) :118r"""119Abstract implementation of a finite dimensional module of graded expansions120within an ambient.121122SEE:123:class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_ambient.GradedExpansion_ambient`.124"""125126def __init__(self, graded_ambient, basis, degree, **kwds) :127r"""128INPUT:129- ``graded_ambient`` -- An instance of :class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_ambient.GradedExpansionAmbient_abstract`.130- ``basis`` -- A tuple, list or sequence of elements of the graded ambient.131- ``degree`` -- An integer; The degree of the module within its ambient module.132133NOTE:134The base ring of the graded expansion ambient must be an integral domain.135136TESTS::137sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *138sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *139sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *140sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *141sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading142sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *143sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *144sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *145sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))146sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))147sage: sm = GradedExpansionSubmodule_abstract(ger, Sequence([ger.0, ger.1]), 3)148sage: sm = GradedExpansionSubmodule_abstract(ger, Sequence([ger.0, ger.1]), 2, no_expansion_init = True)149sage: m = FreeModule(QQ, 3)150sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))151sage: mps = mpsm.base_ring()152sage: ger = GradedExpansionModule_class(None, Sequence([MonoidPowerSeries(mpsm, {1 : m([1,2,3]), 2 : m([3,-3,2])}, mpsm.monoid().filter(4)), MonoidPowerSeries(mpsm, {1 : m([2,-1,-1]), 2 : m([1,0,0])}, mpsm.monoid().filter(4))]), PolynomialRing(ZZ, ['a', 'b']).ideal(0), DegreeGrading((1,2)))153sage: sm = GradedExpansionSubmodule_abstract(ger, [ger.0], 1)154"""155self.__graded_ambient = graded_ambient156self.__basis_in_graded_ambient = basis157158if not "no_expansion_init" in kwds or not kwds["no_expansion_init"] :159if graded_ambient.fourier_expansion_precision().is_infinite() or isinstance(self.__graded_ambient.fourier_ring(), MonoidPowerSeriesAmbient_abstract) :160ExpansionModule_abstract.__init__(self, Sequence( map( lambda b: b.fourier_expansion(), basis ),161universe = graded_ambient.fourier_ring() ))162else :163ExpansionModule_abstract.__init__(self, Sequence( map( lambda b: LazyFourierExpansionEvaluation( graded_ambient.fourier_ring(), b,164graded_ambient.fourier_expansion_precision() ),165basis ),166universe = graded_ambient.fourier_ring(), check = False ))167168def graded_ambient(self) :169r"""170The graded ambientm, namely, the graded ring or module171``self`` is a submodule of.172173OUTPUT:174An instance of :class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_ambient.GradedExpansionAmbient_abstract`.175176TESTS::177sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *178sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *179sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *180sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *181sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading182sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *183sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *184sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *185sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))186sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))187sage: sm = GradedExpansionSubmodule_abstract(ger, Sequence([ger.0, ger.1]), 3)188sage: sm.graded_ambient() is ger189True190"""191return self.__graded_ambient192193def _basis_in_graded_ambient(self) :194r"""195A basis for ``self`` in terms of elements of the graded ambient.196197OUTPUT:198A sequence of elements of the graded ambient.199200TESTS::201sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *202sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *203sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *204sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *205sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading206sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *207sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *208sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *209sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))210sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))211sage: sm = GradedExpansionSubmodule_abstract(ger, Sequence([ger.0, ger.1]), 3)212sage: sm._basis_in_graded_ambient() == Sequence([ger.0, ger.1])213True214"""215return self.__basis_in_graded_ambient216217@cached_method218def _reduced_basis_polynomials(self, coerce_to = None) :219r"""220A list of reduced polynomials associated to the basis of ``self``221within the graded ambient. If coerce_to is not None, these elements222will first be coerced into ``coerce_to`` and the resulting polynomials223will be returned.224225INPUT:226- ``coerce_to`` -- A graded ambient or ``None`` (default: ``None``);227See the discription above.228229OUTPUT:230A Sequence of polynomials.231232TESTS::233sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *234sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *235sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *236sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *237sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading238sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *239sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *240sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *241sage: K.<rho> = CyclotomicField(6)242sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))243sage: P.<a, b, c> = PolynomialRing(K)244sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))245sage: ger2 = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), P.ideal(a - b), DegreeGrading((1,2,3)))246sage: sm = GradedExpansionSubmodule_abstract(ger, Sequence([ger.0, ger.1]), 3)247sage: sm._reduced_basis_polynomials()248[a, b]249250We need to introduce a workaround for coercions as long as graded expansion ambients do not251support coercion from one to another. Since the doctests to not allow for class definitions,252we hack an instance of an arbitrary Python class.253::254sage: from htmllib import HTMLParser255sage: coerce_workaround = HTMLParser('')256sage: setattr(coerce_workaround, '__call__', lambda e : ger2(P(e.polynomial())))257sage: setattr(coerce_workaround, 'relations', lambda : ger2.relations())258sage: sm._reduced_basis_polynomials(coerce_to = coerce_workaround)[0].parent().base_ring()259Cyclotomic Field of order 6 and degree 2260"""261if coerce_to is None :262coerced_basis = self.__basis_in_graded_ambient263relations = self.graded_ambient().relations()264else :265coerced_basis = map(coerce_to, self.__basis_in_graded_ambient)266relations = coerce_to.relations()267268return Sequence( [ relations.reduce(b.polynomial())269for b in coerced_basis ],270universe = relations.ring() )271272@cached_method273def _non_zero_monomials(self, coerce_to = None) :274r"""275A list of monomials which occur in the reduced polynomials276associated with the basis of ``self``.277278INPUT:279- ``coerce_to`` -- A graded ambient or ``None`` (default: ``None``);280Will be forwarded to :meth:~`._reduced_basis_polynomials`.281282OUTPUT:283A sequence of monomials.284285SEE::286:meth:~`._reduced_basis_polynomials`.287288TESTS::289sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *290sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *291sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *292sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *293sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading294sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *295sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *296sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *297sage: K.<rho> = CyclotomicField(6)298sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))299sage: P.<a, b, c> = PolynomialRing(K)300sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))301sage: ger2 = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), P.ideal(a - b), DegreeGrading((1,2,3)))302sage: sm = GradedExpansionSubmodule_abstract(ger, Sequence([ger.0, ger.1]), 3)303sage: sm._non_zero_monomials()304[a, b]305sage: from htmllib import HTMLParser306sage: coerce_workaround = HTMLParser('')307sage: setattr(coerce_workaround, '__call__', lambda e : ger2(P(e.polynomial())))308sage: setattr(coerce_workaround, 'relations', lambda : ger2.relations())309sage: sm._non_zero_monomials(coerce_to = coerce_workaround)310[b]311"""312red_basis = self._reduced_basis_polynomials(coerce_to = coerce_to)313314return Sequence( reduce(union, [set(b.monomials()) for b in red_basis], set()),315universe = red_basis.universe() )316317@cached_method318def _monomial_homomorphism(self, coerce_to = None) :319r"""320A homomorphism that maps the underlying module to a vector space321where each component corresponds to a coefficient of the polynomial322associated to elements of ``self`` within the graded ambient or323``coerce_to``.324325INPUT:326- ``coerce_to`` -- A graded ambient or ``None`` (default: ``None``);327Will be forwarded to :meth:~`._reduced_basis_polynomials`.328329OUTPUT:330A morphism from ``self`` to a vector space.331332NOTE:333The homomorphism is defined over a fraction field of the base ring334of the monomials.335336SEE:337:meth:~`._non_zero_monomials` and :meth:~`._reduced_basis_polynomials`.338339TESTS::340sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *341sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *342sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *343sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *344sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading345sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *346sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *347sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *348sage: K.<rho> = CyclotomicField(6)349sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))350sage: P.<a, b, c> = PolynomialRing(K)351sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))352sage: ger2 = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), P.ideal(a - b), DegreeGrading((1,2,3)))353sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]), 3)354sage: sm._monomial_homomorphism()355Free module morphism defined by the matrix356[1 0]357[0 1]358Domain: Submodule of Graded expansion ring with generators a, b, c359Codomain: Vector space of dimension 2 over Rational Field360sage: from htmllib import HTMLParser361sage: coerce_workaround = HTMLParser('')362sage: setattr(coerce_workaround, '__call__', lambda e : ger2(P(e.polynomial())))363sage: setattr(coerce_workaround, 'relations', lambda : ger2.relations())364sage: sm._monomial_homomorphism(coerce_to = coerce_workaround)365Free module morphism defined by the matrix366[1]367[1]368Domain: Submodule of Graded expansion ring with generators a, b, c369Codomain: Vector space of dimension 1 over Cyclotomic Field of order 6 ...370"""371reduced_basis = self._reduced_basis_polynomials(coerce_to = coerce_to)372all_mons = self._non_zero_monomials(coerce_to = coerce_to)373374codomain = FreeModule(all_mons.universe().base_ring().fraction_field(), len(all_mons))375basis_images = [ codomain([b.monomial_coefficient(m) for m in all_mons])376for b in reduced_basis ]377378return self.hom(basis_images)379380381def _ambient_element_to_monomial_coefficients_generator(self, x, reduce = False, coerce_basis_to = None) :382r"""383Given an element `x` of the graded ambient ring or space return a generator384corresponding to the image of `x` with respect to the morphism returned385by :meth:~`._monomial_homomorphism`.386387INPUT:388- `x` -- An element of the graded ambient.389- ``reduce`` -- A boolean (default: ``False``); If ``True`` the polynomial390attached to `x` will be reduced.391- ``coerce_basis_to`` -- A graded ambient or ``None`` (default: ``None``);392If not ``None`` the basis of ``self`` and `x` will be393coerced before determining the monomials.394395OUTPUT:396A generator over elements in the monomials' base ring.397398SEE:399:meth:~`._monomial_homomorphism`.400401TESTS::402sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *403sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *404sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *405sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *406sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading407sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *408sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *409sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *410sage: K.<rho> = CyclotomicField(6)411sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))412sage: P.<a, b, c> = PolynomialRing(K)413sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))414sage: ger2 = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), P.ideal(a - b), DegreeGrading((1,2,3)))415sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]), 3)416sage: list( sm._ambient_element_to_monomial_coefficients_generator(ger.2) )417[0, 0]418sage: from htmllib import HTMLParser419sage: coerce_workaround = HTMLParser('')420sage: setattr(coerce_workaround, '__call__', lambda e : ger2(P(e.polynomial())))421sage: setattr(coerce_workaround, 'relations', lambda : ger2.relations())422sage: list( sm._ambient_element_to_monomial_coefficients_generator(ger.2, coerce_basis_to = coerce_workaround) )423[0]424sage: list( sm._ambient_element_to_monomial_coefficients_generator(ger.1, reduce = True, coerce_basis_to = coerce_workaround) )425[1]426"""427if not coerce_basis_to is None :428x = coerce_basis_to(x)429if reduce :430x = x._reduce_polynomial()431else :432x = x.polynomial()433434return ( x.monomial_coefficient(m)435for m in self._non_zero_monomials(coerce_to = coerce_basis_to) )436437def coordinates(self, x, in_base_ring = True, force_ambigous = False) :438r"""439The coordinates in ``self`` of an element either of the following:440- The graded ambient,441- An element of a submodule,442- An expansion in the parent of the basis' expansions.443444INPUT:445- `x` -- Either of the types listed above.446- ``in_base_ring`` -- A boolean (default: ``True``); If ``True``447enforce the result to be definied over the448base ring of ``self``.449- ``force_ambigous`` -- A boolean (default: ``False``); If ``True``450also return the solutions that are not unique.451452OUTPUT:453A list of elements in the base ring or and extension of it.454455NOTE:456If the Fourier expansion of `x` lakes sufficient precision the457expansions associated to ``self`` will be truncated.458459TESTS::460sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *461sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *462sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *463sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *464sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading465sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *466sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *467sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *468sage: K.<rho> = CyclotomicField(6)469sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))470sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))471sage: ger2 = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(K, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))472sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))473sage: sm2 = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.2]))474sage: sm3 = GradedExpansionSubmodule_ambient_pid(ger2, Sequence([ger2.0, ger2.2]))475sage: sm.coordinates(ger.2)476Traceback (most recent call last):477...478ArithmeticError: Graded expansion c is not contained in this space.479sage: sm.coordinates(sm2.0)480[1, 0]481sage: sm.coordinates(sm2.1)482Traceback (most recent call last):483...484ArithmeticError: Graded expansion c is not contained in this space.485sage: sm.coordinates(sm3.0)486Traceback (most recent call last):487...488ArithmeticError: No coordinates for (1, 0).489"""490if isinstance(x, Element) :491P = x.parent()492if P is self :493if self.ambient_module() is self :494return x.list()495else :496return list(self.coordinate_vector(x))497498if self.graded_ambient().has_coerce_map_from(P) :499if not P is self.graded_ambient() :500x = self.graded_ambient()(x)501#x = x.polynomial()502503if not set(x._reduce_polynomial().monomials()).issubset(set(self._non_zero_monomials())) :504raise ArithmeticError( "%s is not contained in this space." % (x,) )505506mon_matrix = self._monomial_homomorphism().matrix().transpose()507x_mon_vector = vector( self.base_ring().fraction_field(),508self._ambient_element_to_monomial_coefficients_generator(x, True) )509510511## TODO: use linbox512try :513coords = magma(mon_matrix.transpose()).Solution(magma(matrix(x_mon_vector))).sage()514coords = coords.row(0)515except TypeError, msg :516if "Runtime error in 'Solution': No solution exists" in msg :517raise ArithmeticError( "%s is not contained in this space." % (x,) )518519try :520coords = mon_matrix.solve_right(x_mon_vector)521except ValueError :522raise ArithmeticError( "%s is not contained in this space." % (x,) )523524try :525# we used the base graded_ambient's fraction field, so convert it526return [self.base_ring()(c) for c in coords]527except TypeError :528if in_base_ring :529raise ArithmeticError( "%s is not contained in this space." % (x,) )530else :531return coords.list()532533#! elif self.graded_ambient().has_coerce_map_from(P) :534elif P.has_coerce_map_from(self.graded_ambient()) :535#x = x.polynomial()536537mon_matrix = self._monomial_homomorphism().matrix().transpose()538mon_matrix = matrix(P.base_ring().fraction_field(), mon_matrix)539540x_mon_vector = vector( P.base_ring().fraction_field(),541self._ambient_element_to_monomial_coefficients_generator(x, True, P) )542543try :544coords = mon_matrix.solve_right(x_mon_vector)545except ValueError :546raise ArithmeticError( "%s is not contained in the image of this space." % (x,) )547548try :549# we used the base graded_ambient's fraction field, so convert it550return [self.base_ring()(c) for c in coords]551except TypeError :552if in_base_ring :553raise ArithmeticError( "%s is not contained in the image of this space." % (x,) )554else :555return coords.list()556557#! elif P.has_coerce_map_from(self.graded_ambient()) :558#! if isinstance(x, (tuple, Element)) :559560return ExpansionModule_abstract.coordinates(self, x, in_base_ring, force_ambigous)561562def _graded_expansion_submodule_to_graded_ambient_(self, x) :563r"""564The element `x` of ``self`` as an element of the graded ambient ring or space.565566INPUT:567- `x` -- An element of self.568569OUTPUT:570An element of the graded ambient.571572TESTS::573sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *574sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *575sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *576sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *577sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading578sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *579sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *580sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *581sage: K.<rho> = CyclotomicField(6)582sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))583sage: P.<a, b, c> = PolynomialRing(K)584sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))585sage: ger2 = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), P.ideal(a - b), DegreeGrading((1,2,3)))586sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))587sage: sm._graded_expansion_submodule_to_graded_ambient_(2*sm.0 + 3*sm.1)588Graded expansion 2*a + 3*b589"""590return sum( map(mul, self.coordinates(x), self._basis_in_graded_ambient()) )591592def _repr_(self) :593r"""594TESTS::595sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *596sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *597sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *598sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *599sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading600sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *601sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *602sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *603sage: K.<rho> = CyclotomicField(6)604sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))605sage: P.<a, b, c> = PolynomialRing(K)606sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))607sage: ger2 = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), P.ideal(a - b), DegreeGrading((1,2,3)))608sage: GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))609Submodule of Graded expansion ring with generators a, b, c610"""611return "Submodule of %s" % (self.__graded_ambient,)612613def _latex_(self) :614r"""615TESTS::616sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *617sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *618sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *619sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *620sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading621sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *622sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *623sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *624sage: K.<rho> = CyclotomicField(6)625sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))626sage: P.<a, b, c> = PolynomialRing(K)627sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))628sage: ger2 = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), P.ideal(a - b), DegreeGrading((1,2,3)))629sage: latex( GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1])) )630\text{Submodule of }\text{Graded expansion ring with generators }a , b , c631"""632return r"\text{Submodule of }%s" % (latex(self.__graded_ambient),)633634#===============================================================================635# GradedExpansionSubmodule_generic636#===============================================================================637638class GradedExpansionSubmodule_generic ( GradedExpansionSubmodule_abstract, ExpansionModule_generic ) :639r"""640A finite dimensional module of graded expansions within an ambient.641642SEE:643:class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_ambient.GradedExpansion_ambient`.644"""645646def __init__(self, graded_ambient, basis, degree, **kwds) :647r"""648INPUT:649- ``graded_ambient`` -- An instance of :class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_ambient.GradedExpansionAmbient_abstract`.650- ``basis`` -- A tuple, list or sequence of elements of the graded ambient.651- ``degree`` -- An integer; The degree of the module within its ambient module.652653NOTE:654The base ring of the graded expansion ambient must be an integral domain.655656TESTS::657sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *658sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *659sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *660sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *661sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading662sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *663sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *664sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *665sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))666sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))667sage: sm = GradedExpansionSubmodule_generic(ger, Sequence([ger.0, ger.1]), 3)668sage: sm = GradedExpansionSubmodule_generic(ger, Sequence([ger.0, ger.1]), 2, _element_class = GradedExpansionSubmoduleVector_generic, no_expansion_init = True)669"""670if not hasattr(self, '_element_class') :671if '_element_class' in kwds :672self._element_class = kwds['_element_class']673else :674self._element_class = GradedExpansionSubmoduleVector_generic675676GradedExpansionSubmodule_abstract.__init__(self, graded_ambient, basis, degree)677ExpansionModule_generic.__init__(self, self._abstract_basis(), degree, **kwds)678679def change_ring(self, R):680r"""681Return the ambient module of graded expansions over `R` with the same basis as ``self``.682683INPUT:684- `R` -- A ring.685686OUTPUT:687An instance of :class:~`.GradedExpansionSubmodule_generic`.688689TESTS::690sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *691sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *692sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *693sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *694sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading695sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *696sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *697sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *698sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))699sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))700sage: sm = GradedExpansionSubmodule_generic(ger, Sequence([ger.0, ger.1]), 3)701sage: sm.change_ring(QQ) is sm702True703sage: sm.change_ring(PolynomialRing(QQ, 'x'))704Traceback (most recent call last):705...706ValueError: Associated expansion of graded ambient not defined over Univariate Polynomial Ring in x over Rational Field.707"""708if self.base_ring() == R:709return self710711raise ValueError( "Associated expansion of graded ambient not defined over %s." % R )712713def basis(self) :714r"""715A basis of ``self``.716717OUTPUT:718A list of elements of ``self``.719720TESTS::721sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *722sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *723sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *724sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *725sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading726sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *727sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *728sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *729sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))730sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))731sage: sm = GradedExpansionSubmodule_generic(ger, Sequence([ger.0, ger.1]), 3)732sage: sm.basis()733Traceback (most recent call last):734...735NotImplementedError736"""737raise NotImplementedError738739def hom(self, other) :740r"""741TESTS::742sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *743sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *744sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *745sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *746sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading747sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *748sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *749sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *750sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))751sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))752sage: sm = GradedExpansionSubmodule_generic(ger, Sequence([ger.0, ger.1]), 3)753sage: m = FreeModule(QQ, 2)754sage: sm.hom([m([1,0]),m([1,1])])755Free module morphism defined by the matrix756[1 0]757[1 1]758Domain: Submodule of Graded expansion ring with generators a, b, c759Codomain: Vector space of dimension 2 over Rational Field760sage: sm.hom(sm)761Traceback (most recent call last):762...763NotImplementedError764"""765if isinstance(other, GradedExpansionSubmodule_abstract) and \766self.graded_ambient() == other.graded_ambient() :767raise NotImplementedError768else :769images = other770771return FreeModule_generic.hom(self, images)772773#===============================================================================774# _span775# This will be used in GradedExpansionSubmodule_ambient_pid and776# GradedExpansionSubmodule_submodule_pid777#===============================================================================778779def _span( self, gens, base_ring = None, check = True, already_echelonized = False ) :780r"""781The submodule of graded expansions spanned by ``gens``.782783INPUT:784- ``gens`` -- A list, tuple or sequence of module elements.785- ``base_ring`` -- A ring or ``None`` (default: ``None``); If ``None``786the base ring of ``self`` will be used.787- ``check`` -- A boolean (default: ``True``); If ``True`` check788whether the generators are appropriately coerced.789- ``already_echelonized`` -- A boolean (default: ``False``); If ``True``790the generators are already in echelon form791with respect to the ambient's basis.792793OUTPUT:794An instance of :class:~`.GradedExpansionSubmodule_submodule_pid`.795796TESTS::797sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *798sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *799sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *800sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *801sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading802sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *803sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *804sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *805sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))806sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))807sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))808sage: sms = sm.span([sm.0])809sage: sms = sm.span([sm.0], base_ring = PolynomialRing(QQ, 'x'))810Traceback (most recent call last):811...812ValueError: Associated expansion of graded ambient not defined over Univariate Polynomial Ring in x over Rational Field.813"""814if is_FreeModule(gens):815gens = gens.gens()816if not isinstance(gens, (list, tuple, Sequence)):817raise TypeError, "Argument gens (= %s) must be a list, tuple, or sequence."%gens818819if base_ring is None or base_ring == self.base_ring():820gens = Sequence(gens, check = check, universe = self.ambient_module())821822return GradedExpansionSubmodule_submodule_pid( self.ambient_module(), gens )823else:824try:825M = self.change_ring(base_ring)826except TypeError:827raise ValueError, "Argument base_ring (= %s) is not compatible " % (base_ring,) + \828"with the base field (= %s)." % (self.base_field(),)829try:830return M.span(gens)831except TypeError:832raise ValueError, "Argument gens (= %s) is not compatible " % (gens,) + \833"with base_ring (= %s)." % (base_ring,)834835#===============================================================================836# GradedExpansionSubmodule_ambient_pid837#===============================================================================838839class GradedExpansionSubmodule_ambient_pid ( GradedExpansionSubmodule_abstract, ExpansionModule_ambient_pid ) :840"""841An ambient module of graded expansions expansions over a principal ideal domain.842"""843844def __init__(self, graded_ambient, basis, _element_class = None, **kwds) :845r"""846INPUT:847- ``graded_ambient`` -- An instance of :class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_ambient.GradedExpansionAmbient_abstract`.848- ``basis`` -- A list or sequence of (equivariant) monoid power series.849- ``element_class`` -- A type or ``None`` (default: ``None``); The element class850attached to ``self``. If ``None`` :class:~`.GradedExpansionSubmoduleVector_generic`851will be used.852- ``kwds`` -- Will be forwarded to :class:~`fourier_expansion_module.gradedexpansions.expansion_module.ExpansionModule_ambient_pid`853and :class:~`.GradedExpansionSubmodule_abstract`.854855TESTS::856sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *857sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *858sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *859sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *860sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading861sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *862sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *863sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *864sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))865sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))866sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))867sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]), _element_class = GradedExpansionSubmoduleVector_generic, no_expansion_init = True)868Traceback (most recent call last):869...870AttributeError: 'GradedExpansionSubmodule_ambient_pid' object has no attribute '_ExpansionModule_abstract__abstract_basis'871"""872if not hasattr(self, '_element_class') :873if not _element_class is None :874self._element_class = _element_class875else :876self._element_class = GradedExpansionSubmoduleVector_generic877878GradedExpansionSubmodule_abstract.__init__(self, graded_ambient, basis, len(basis), **kwds)879ExpansionModule_ambient_pid.__init__(self, self._abstract_basis(), **kwds)880881global _span882span = _span883884def change_ring(self, R):885r"""886Return the ambient module of graded expansions over `R` with the887same basis as ``self``.888889INPUT:890- `R` -- A ring.891892OUTPUT:893An instance of :class:~`.GradedExpansionSubmodule_ambient_pid`.894895TESTS::896sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *897sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *898sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *899sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *900sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading901sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *902sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *903sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *904sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))905sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))906sage: sm = GradedExpansionSubmodule_generic(ger, Sequence([ger.0, ger.1]), 3)907sage: sm.change_ring(QQ) is sm908True909sage: sm.change_ring(PolynomialRing(QQ, 'x'))910Traceback (most recent call last):911...912ValueError: Associated expansion of graded ambient not defined over Univariate Polynomial Ring in x over Rational Field.913"""914if self.base_ring() == R:915return self916917raise ValueError( "Associated expansion of graded ambient not defined over %s." % R )918919def hom(self, other) :920r"""921TESTS::922sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *923sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *924sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *925sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *926sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading927sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *928sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *929sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *930sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))931sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))932sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))933sage: sm2 = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.2, ger.1]))934sage: m = FreeModule(QQ, 2)935sage: sm.hom(sm2)936Free module morphism defined by the matrix937[1 0 0]938[0 0 1]939Domain: Submodule of Graded expansion ring with generators a, b, c940Codomain: Submodule of Graded expansion ring with generators a, b, c941sage: sm.hom([m([1,0]),m([1,1])])942Free module morphism defined by the matrix943[1 0]944[1 1]945Domain: Submodule of Graded expansion ring with generators a, b, c946Codomain: Vector space of dimension 2 over Rational Field947"""948if isinstance(other, GradedExpansionSubmodule_abstract) and \949self.graded_ambient() == other.graded_ambient() :950images = [other(b) for b in self._basis_in_graded_ambient()]951else :952images = other953954return FreeModule_ambient_pid.hom(self, images)955956#===============================================================================957# GradedExpansionSubmodule_submodule_pid958#===============================================================================959960class GradedExpansionSubmodule_submodule_pid ( GradedExpansionSubmodule_abstract, ExpansionModule_submodule_pid ) :961r"""962A submodule of another module of graded expansions over a principal ideal domain.963"""964965def __init__(self, ambient, gens, element_class = None, **kwds) :966r"""967INPUT:968- ``ambient`` -- An instance of :class:~`.GradedExpansionSubmodule_submodule_pid` :class:~`.GradedExpansionSubmodule_submodule_pid` or .969- ``gens`` -- A tuple, list or sequence of elements of ``ambient``.970- ``element_class`` -- A type or ``None`` (default: ``None``); The element class971attached to ``self``. If ``None`` :class:~`.GradedExpansionSubmoduleVector_generic`972will be used.973- ``kwds`` -- Will be forwarded to :class:~`fourier_expansion_module.gradedexpansions.expansion_module.ExpansionModule_submodule_pid`974and :class:~`.GradedExpansionSubmodule_abstract`.975976TESTS::977sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *978sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *979sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *980sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *981sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading982sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *983sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *984sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *985sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))986sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))987sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))988sage: sms = GradedExpansionSubmodule_submodule_pid(sm, [sm.0, sm.1])989sage: sms = GradedExpansionSubmodule_submodule_pid(sm, [sm.0, sm.1], _element_class = GradedExpansionSubmoduleVector_generic, no_expansion_init = True)990"""991if not hasattr(self, '_element_class') :992if not element_class is None :993self._element_class = element_class994else :995self._element_class = GradedExpansionSubmoduleVector_generic996997GradedExpansionSubmodule_abstract.__init__( self, ambient.graded_ambient(),998[ambient.graded_ambient()(g) for g in gens], ambient.dimension(),999**kwds )1000ExpansionModule_submodule_pid.__init__(self, ambient, gens, **kwds)10011002global _span1003span = _span10041005def change_ring(self, R):1006r"""1007Return the ambient module of graded expansions over `R` with the1008same basis as ``self``.10091010INPUT:1011- `R` -- A ring.10121013OUTPUT:1014An instance of :class:~`.GradedExpansionSubmodule_ambient_pid`.10151016TESTS::1017sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *1018sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *1019sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *1020sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *1021sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading1022sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *1023sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *1024sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *1025sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))1026sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))1027sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))1028sage: sms = GradedExpansionSubmodule_submodule_pid(sm, [sm.0, sm.1])1029sage: sms.change_ring(QQ) is sms1030True1031sage: sms.change_ring(PolynomialRing(QQ, 'x'))1032Traceback (most recent call last):1033...1034ValueError: Associated expansion of graded ambient not defined over Univariate Polynomial Ring in x over Rational Field.1035"""1036if self.base_ring() == R:1037return self10381039raise ValueError( "Associated expansion of graded ambient not defined over %s." % R )10401041def hom(self, other) :1042r"""1043TESTS::1044sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *1045sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *1046sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *1047sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *1048sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading1049sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *1050sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *1051sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *1052sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))1053sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))1054sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))1055sage: sms = GradedExpansionSubmodule_submodule_pid(sm, [sm.0, sm.1])1056sage: sms2 = GradedExpansionSubmodule_submodule_pid(sm, [sm.0, sm.0 + sm.1])1057sage: m = FreeModule(QQ, 2)1058sage: sms.hom(sms2)1059Free module morphism defined by the matrix1060[1 0]1061[0 1]1062Domain: Submodule of Graded expansion ring with generators a, b, c1063Codomain: Submodule of Graded expansion ring with generators a, b, c1064sage: sms.hom([m([1,0]),m([1,1])])1065Free module morphism defined by the matrix1066[1 0]1067[1 1]1068Domain: Submodule of Graded expansion ring with generators a, b, c1069Codomain: Vector space of dimension 2 over Rational Field1070"""1071if isinstance(other, GradedExpansionSubmodule_abstract) and \1072self.graded_ambient() == other.graded_ambient() :1073images = [other(b) for b in self._basis_in_graded_ambient()]1074else :1075images = other10761077return FreeModule_submodule_pid.hom(self, images)10781079#===============================================================================1080# GradedExpansionSubmoduleVector_generic1081#===============================================================================10821083class GradedExpansionSubmoduleVector_generic ( ExpansionModuleVector_generic ) :1084r"""1085A generic implementation of an element in a module of graded expansions.1086"""10871088def __copy__(self) :1089r"""1090Return a copy of ``self``.10911092OUTPUT:1093An instance of :class:~`.GradedExpansionSubmoduleVector_generic`.10941095TESTS::1096sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *1097sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *1098sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *1099sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *1100sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading1101sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *1102sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *1103sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *1104sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))1105sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))1106sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))1107sage: h = GradedExpansionSubmoduleVector_generic(sm, [1,0])1108sage: copy(h)1109(1, 0)1110"""1111return GradedExpansionSubmoduleVector_generic( self.parent(), self.list(), coerce = False, copy = True )111211131114def polynomial(self) :1115r"""1116Return the polynomial associated to ``self`` in the graded ambient1117of its parent.11181119OUTPUT:1120A polynomial in the polynomial ring attached to the graded ambient.11211122TESTS::1123sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *1124sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *1125sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *1126sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *1127sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading1128sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *1129sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *1130sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *1131sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))1132sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))1133sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))1134sage: h = GradedExpansionSubmoduleVector_generic(sm, [1,0])1135sage: h.polynomial()1136a1137"""1138return sum( self[k]*self.parent()._basis_in_graded_ambient()[k].polynomial()1139for k in xrange(self.parent().rank()) )114011411142