code / alex / psage / psage / modform / fourier_expansion_framework / gradedexpansions / gradedexpansion_module.py
241849 viewsr"""1Modules of elements with Fourier expansion and partially known relations.23AUTHOR :4-- Martin Raum (2009 - 10 - 30) Initial version5"""67#===============================================================================8#9# Copyright (C) 2009 Martin Raum10#11# This program is free software; you can redistribute it and/or12# modify it under the terms of the GNU General Public License13# as published by the Free Software Foundation; either version 314# of the License, or (at your option) any later version.15#16# This program is distributed in the hope that it will be useful,17# but WITHOUT ANY WARRANTY; without even the implied warranty of18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU19# General Public License for more details.20#21# You should have received a copy of the GNU General Public License22# along with this program; if not, see <http://www.gnu.org/licenses/>.23#24#===============================================================================2526from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ambient import GradedExpansionAmbient_abstract27from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_element import GradedExpansionVector_class28from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import GradedExpansionRing_class29from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import GradedExpansionSubmodule_abstract30from sage.misc.flatten import flatten31from sage.misc.latex import latex32from sage.modules.module import Module33from sage.rings.all import Integer34from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing35from sage.structure.element import Element36import operator3738#===============================================================================39# GradedExpansionModule_class40#===============================================================================4142class GradedExpansionModule_class ( GradedExpansionAmbient_abstract, Module ) :43r"""44A class for a module of vector valued graded expansions45over an ambient of graded expansions, that might also be trivial.4647SEE:48:class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_ring.GradedExpansionRing_class`.49"""5051def __init__ ( self, base_ring_generators, generators, relations,52grading, all_relations = True, reduce_before_evaluating = True ) :53r"""54The degree one part of the monomials that correspond to generators over the55base expansion ring will serve as the coordinates of the elements.5657INPUT:58- ``base_ring_generators`` -- A list of (equivariant) monoid power series with59coefficient domain the base ring of the coefficient60domain of the generators or ``None``.61- ``generators`` -- A list of (equivariant) monoid power series; The generators62of the ambient over the ring generated by the base ring63generators.64- ``relations`` -- An ideal in a polynomial ring with ``len(base_ring_generators) + len(generators)``65variables.66- ``grading`` -- A grading deriving from :class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_grading`;67A grading for the polynomial ring of the relations.68- ``all_relations`` -- A boolean (default: ``True``); If ``True`` the relations given69for the polynomial ring are all relations that the Fourier70expansion have.71- ``reduce_before_evaluating`` -- A boolean (default: ``True``); If ``True`` any monomial72will be Groebner reduced before the Fourier expansion73is calculated.7475NOTE:76The grading must respect the relations of the generators.7778TESTS::79sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *80sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *81sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *82sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading83sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *84sage: m = FreeModule(QQ, 3)85sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))86sage: mps = mpsm.base_ring()87sage: 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))]), PolynomialRing(QQ, ['a', 'b']).ideal(0), DegreeGrading((1,2)))88sage: ger.base_ring()89Graded expansion ring with generators a90"""91if not hasattr(self, '_element_class') :92self._element_class = GradedExpansionVector_class9394if hasattr(self, "_extended_base_ring") :95Module.__init__(self, self._extended_base_ring)96elif base_ring_generators is None or len(base_ring_generators) == 0 :97Module.__init__(self, relations.base_ring())98else :99gb = filter( lambda p: all( all(a == 0 for a in list(e)[len(base_ring_generators):])100for e in p.exponents() ),101relations.groebner_basis() )102P = PolynomialRing( relations.base_ring(),103list(relations.ring().variable_names())[:len(base_ring_generators)] )104base_relations = P.ideal(gb)105R = GradedExpansionRing_class(None, base_ring_generators, base_relations,106grading.subgrading(xrange(len(base_ring_generators))), all_relations, reduce_before_evaluating)107Module.__init__(self, R)108109GradedExpansionAmbient_abstract.__init__(self, base_ring_generators, generators, relations, grading, all_relations, reduce_before_evaluating)110111self._populate_coercion_lists_(112convert_list = [self.relations().ring()],113convert_method_name = "_graded_expansion_submodule_to_graded_ambient_" )114115def _graded_monoms(self, index) :116r"""117Return all monoms in the generators that have a given grading index.118119INPUT:120- ``index`` -- A grading values.121122OUTPUT:123A list of elements of ``self``.124125TESTS::126sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *127sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *128sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *129sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading130sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *131sage: m = FreeModule(QQ, 3)132sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))133sage: mps = mpsm.base_ring()134sage: 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)))135sage: ger._graded_monoms(2)136[Graded expansion vector (0, 1)]137sage: ger._graded_monoms(4)138[]139sage: ger = GradedExpansionModule_class(Sequence([MonoidPowerSeries(mps, {1 : 2}, mps.monoid().filter(4))]), 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', 'c']).ideal(0), DegreeGrading((1,2,3)))140sage: ger._graded_monoms(3)141[Graded expansion vector (a, 0), Graded expansion vector (0, 1)]142"""143module_gens = self.grading().basis(index)144module_gens = filter(lambda e: sum(e[self.nbasegens():]) == 1, module_gens)145module_gens = [ filter( lambda e: e != 1,146[ mon**ex if ex > 1 else (mon if ex == 1 else 1)147for mon,ex in zip(self.basegens(), g[:self.nbasegens()]) + zip(self.gens(), g[self.nbasegens():]) ] )148for g in module_gens ]149150return [ reduce(operator.mul, g) if len(g) > 1 else g[0] for g in module_gens ]151152def _coerce_map_from_(self, other) :153"""154TESTS::155sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *156sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *157sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *158sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading159sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *160sage: m = FreeModule(QQ, 3)161sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))162sage: mps = mpsm.base_ring()163sage: 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))]), PolynomialRing(QQ, ['a', 'b']).ideal(0), DegreeGrading((1,2)))164sage: ger._coerce_map_from_(ZZ)165"""166if other is self.relations().ring() :167from sage.structure.coerce_maps import CallableConvertMap168169return CallableConvertMap(other, self, self._element_constructor_)170171if isinstance(other, GradedExpansionSubmodule_abstract) :172if other.graded_ambient() is self \173or self.has_coerce_map_from(other.graded_ambient()) :174from sage.structure.coerce_maps import CallableConvertMap175176return CallableConvertMap(other, self, other._graded_expansion_submodule_to_graded_ambient_)177178return Module._coerce_map_from_(self, other)179180def _element_constructor_(self, x) :181r"""182INPUT:183- `x` -- A zero integer, an element of the underlying polynomial ring or184an element in a submodule of graded expansions.185186OUTPUT:187An instance of the element class.188189TESTS::190sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *191sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *192sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *193sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading194sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *195sage: m = FreeModule(QQ, 3)196sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))197sage: mps = mpsm.base_ring()198sage: 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))]), PolynomialRing(QQ, ['a', 'b']).ideal(0), DegreeGrading((1,2)))199sage: h = ger(0)200"""201if isinstance(x, (int, Integer)) and x == 0 :202return self._element_class(self, self.relations().ring().zero())203204P = x.parent()205if P is self.base_ring() :206if x == 0 :207return self._element_class(self, self.relations().ring().zero())208209return GradedExpansionAmbient_abstract._element_constructor_(self, x)210211def _repr_(self) :212"""213TESTS::214sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *215sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *216sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *217sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading218sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *219sage: m = FreeModule(QQ, 3)220sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))221sage: mps = mpsm.base_ring()222sage: 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))]), PolynomialRing(QQ, ['a', 'b']).ideal(0), DegreeGrading((1,2)))223sage: ger224Graded expansion module with generators b225"""226return "Graded expansion module with generators " \227+ ''.join(map(lambda e: repr(e.polynomial()) + ", ", self.gens()))[:-2]228229def _latex_(self) :230r"""231TESTS::232sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *233sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *234sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *235sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading236sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *237sage: m = FreeModule(QQ, 3)238sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))239sage: mps = mpsm.base_ring()240sage: 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))]), PolynomialRing(QQ, ['a', 'b']).ideal(0), DegreeGrading((1,2)))241sage: latex(ger)242\text{Graded expansion module with generators }b243"""244return r"\text{Graded expansion module with generators }" \245+ ''.join(map(lambda e: latex(e.polynomial()) + ", ", self.gens()))[:-2]246247248