code / alex / psage / psage / modform / fourier_expansion_framework / monoidpowerseries / monoidpowerseries_module.py
241852 viewsr"""1Modules of monoid power series and modules of equivariant monoid power series.23AUTHOR :4-- Martin Raum (2010 - 02 - 10) Initial version5"""67#===============================================================================8#9# Copyright (C) 2010 Martin Raum10#11# This program is free software; you can redistribute it and/or12# modify it under the terms of the GNU General Public License13# as published by the Free Software Foundation; either version 314# of the License, or (at your option) any later version.15#16# This program is distributed in the hope that it will be useful,17# but WITHOUT ANY WARRANTY; without even the implied warranty of18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU19# General Public License for more details.20#21# You should have received a copy of the GNU General Public License22# along with this program; if not, see <http://www.gnu.org/licenses/>.23#24#===============================================================================2526from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ambient import MonoidPowerSeriesAmbient_abstract,\27EquivariantMonoidPowerSeriesAmbient_abstract28from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import TrivialRepresentation29from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import MonoidPowerSeriesRing, \30EquivariantMonoidPowerSeriesRing31from sage.modules.module import Module32from sage.rings.integer import Integer33from sage.structure.element import Element3435_monoidpowerseries_module_cache = dict()36_equivariantmonoidpowerseries_module_cache = dict()3738#===============================================================================39# MonoidPowerSeriesModule40#===============================================================================4142def MonoidPowerSeriesModule(A, S) :43r"""44Return the globally unique monoid power series ring with indices45in the filtered monoid `S` and coefficients in `A`.4647INPUT:48- `A` -- A module.49- `S` -- A monoid as implemented in :class:~`fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids.NNMonoid`.5051EXAMPLES::52sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *53sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import MonoidPowerSeriesModule54sage: mps = MonoidPowerSeriesModule(QQ, NNMonoid(False))55sage: mps is MonoidPowerSeriesModule(QQ, NNMonoid(False))56True57"""58global _monoidpowerseries_module_cache59key = (A, S)6061try :62return _monoidpowerseries_module_cache[key]63except KeyError :64P = MonoidPowerSeriesModule_generic(A, S)65_monoidpowerseries_module_cache[key] = P6667return P6869#===============================================================================70# MonoidPowerSeriesModule_generic71#===============================================================================7273class MonoidPowerSeriesModule_generic ( MonoidPowerSeriesAmbient_abstract, Module ) :74r"""75Given some `K` module `A` and a monoid `S` filtered over76a net `\Lambda` construct a module of monoid power series.7778Set `R = B[S]`. Then the projective limit of `R / R_\lambda` for79`\lambda \in \Lambda \rightarrow \infty` considered as a80`K` module is implemented by this class.8182NOTE:83The implementation respects left and right modules.84"""8586def __init__(self, A, S) :87r"""88INPUT:89- `A` -- A module.90- `S` -- A monoid as implemented in :class:~`fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids.NNMonoid`.9192TESTS::93sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *94sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import MonoidPowerSeriesModule_generic95sage: mps = MonoidPowerSeriesModule_generic(FreeModule(QQ,2), NNMonoid(False))96sage: mps = MonoidPowerSeriesModule_generic(FreeModule(ZZ,2), NNMonoid(False))97sage: mps.base_ring()98Ring of monoid power series over NN99sage: (1 / 2) * mps.0100Monoid power series in Module of monoid power series over NN101"""102Module.__init__(self, MonoidPowerSeriesRing(A.base_ring(), S))103MonoidPowerSeriesAmbient_abstract.__init__(self, A, S)104105self.__coeff_gens = \106[ self._element_class(self, dict([(S.zero_element(), a)]),107self.monoid().filter_all() )108for a in A.gens() ]109110def ngens(self) :111r"""112TESTS::113sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *114sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import MonoidPowerSeriesModule_generic115sage: mps = MonoidPowerSeriesModule_generic(FreeModule(QQ,2), NNMonoid(False))116sage: mps.ngens()1172118"""119return len(self.__coeff_gens)120121def gen(self, i = 0) :122r"""123TESTS::124sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *125sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import MonoidPowerSeriesModule_generic126sage: mps = MonoidPowerSeriesModule_generic(FreeModule(QQ,2), NNMonoid(False))127sage: mps.gen()128Monoid power series in Module of monoid power series over NN129"""130return self.gens()[i]131132def gens(self) :133r"""134TESTS::135sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *136sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import MonoidPowerSeriesModule_generic137sage: mps = MonoidPowerSeriesModule_generic(FreeModule(QQ,2), NNMonoid(False))138sage: mps.gens()139[Monoid power series in Module of monoid power series over NN, Monoid power series in Module of monoid power series over NN]140"""141return self.__coeff_gens142143def construction(self) :144r"""145TESTS::146sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *147sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import MonoidPowerSeriesModule_generic148sage: mps = MonoidPowerSeriesModule_generic(FreeModule(QQ,2), NNMonoid(False))149sage: (f, a) = mps.construction()150sage: (f, a)151(MonoidPowerSeriesModuleFunctor, Vector space of dimension 2 over Rational Field)152sage: f(a) == mps153True154"""155from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesModuleFunctor156return MonoidPowerSeriesModuleFunctor(self.base_ring().coefficient_domain(), self.monoid()), self.coefficient_domain()157158def zero_element(self) :159r"""160TESTS::161sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *162sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import MonoidPowerSeriesModule_generic163sage: mps = MonoidPowerSeriesModule_generic(FreeModule(QQ,2), NNMonoid(False))164sage: h = mps.zero_element()165"""166return self(0)167168def _element_constructor_(self, x) :169r"""170TESTS::171sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *172sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import MonoidPowerSeriesModule_generic173sage: mps = MonoidPowerSeriesModule_generic(FreeModule(QQ,2), NNMonoid(False))174sage: h = mps(0) # indirect doctest175sage: h = mps(int(0)) # indirect doctest176"""177if isinstance(x, int) and x == 0 :178return self._element_class( self, dict(),179self.monoid().filter_all() )180if isinstance(x, Element) and x.is_zero() :181P = x.parent()182183if self.base_ring().base_ring().has_coerce_map_from(P) :184return self._element_class( self, dict(),185self.monoid().filter_all() )186187return MonoidPowerSeriesAmbient_abstract._element_constructor_(self, x)188189def _repr_(self) :190r"""191TESTS::192sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *193sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import MonoidPowerSeriesModule_generic194sage: MonoidPowerSeriesModule_generic(FreeModule(QQ,2), NNMonoid(False))195Module of monoid power series over NN196"""197return "Module of monoid power series over " + self.monoid()._repr_()198199def _latex_(self) :200r"""201TESTS::202sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *203sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import MonoidPowerSeriesModule_generic204sage: latex(MonoidPowerSeriesModule_generic(FreeModule(QQ,2), NNMonoid(False)))205\text{Module of monoid power series over }\Bold{N}206"""207return r"\text{Module of monoid power series over }" + self.monoid()._latex_()208209###############################################################################210###############################################################################211###############################################################################212213#===============================================================================214# EquivariantMonoidPowerSeriesModule215#===============================================================================216217def EquivariantMonoidPowerSeriesModule(O, C, R) :218r"""219Return the globally unique module of equivariant monoid power220over the monoid with action `O` with coefficients in the codomain `R`221with a representation and a set of virtual characters `C`.222223INPUT:224- `O` -- A monoid with an action of a group; As implemented in225:class:~`fourier_expansion_framework.monoidpowerseries.NNMonoid`.226- `C` -- A monoid of characters; As implemented in ::class:~`fourier_expansion_framework.monoidpowerseries.CharacterMonoid_class`.227- `R` -- A representation on a module; As implemented228in :class:~`fourier_expansion_framework.monoidpowerseries.TrivialRepresentation`.229230EXAMPLES::231sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *232sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import EquivariantMonoidPowerSeriesModule233sage: emps = EquivariantMonoidPowerSeriesModule(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", FreeModule(QQ, 2)))234sage: emps is EquivariantMonoidPowerSeriesModule(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", FreeModule(QQ, 2)))235True236"""237238## TODO: Implement optional checking of the relation (*)239if O.group() != C.group() :240raise ValueError, "The action on S and the characters must have the same group"241if R.base_ring() != C.codomain() :242if C.codomain().has_coerce_map_from(R.base_ring()) :243K = C.codomain()244R = R.base_extend(K)245elif R.base_ring().has_coerce_map_from(C.codomain()) :246K = R.base_ring()247else :248from sage.categories.pushout import pushout249250try :251K = pushout(C.codomain(), R.base_ring())252R = R.base_extend(K)253except :254raise ValueError, "character codomain and representation base ring have no common extension"255256global _equivariantmonoidpowerseries_module_cache257key = (O, C, R)258259try :260return _equivariantmonoidpowerseries_module_cache[key]261except KeyError :262P = EquivariantMonoidPowerSeriesModule_generic(O, C, R)263_equivariantmonoidpowerseries_module_cache[key] = P264265return P266267#===============================================================================268# EquivariantMonoidPowerSeriesModule_generic269#===============================================================================270271class EquivariantMonoidPowerSeriesModule_generic ( EquivariantMonoidPowerSeriesAmbient_abstract, Module ) :272r"""273Given some module `A`, a monoid `S` filtered over some originated274net `\Lambda` such that all induced submonoids are finite, a group `G`, a275semigroup `C` with a map `c \rightarrow \mathrm{Hom}(G, Aut_K(A))`, a276homomorphism `\phi : G -> Aut(S)` and a homomorphism `\eta : G -> C`, where277`K` is the base ring of `A`.278279Suppose for every `c, c'` in `C`, and `g` in `G`, and `a, a'` in `A` we have280`(c c') (g) (a a') = c(g)(a) c'(g)(a')`.281Set `R = B[C][S]`. Then the projective limit of282`R / R_\lambda` for `\lambda \in \Lambda \rightarrow \infinity` is a283`K`-module.284285The set of generators is the set of generators of the underlying286monoidal power series module and does not take into account the287group action288"""289290def __init__(self, O, C, R) :291r"""292INPUT:293- `O` -- A monoid with an action of a group; As implemented in294:class:~`fourier_expansion_framework.monoidpowerseries.NNMonoid`.295- `C` -- A monoid of characters; As implemented in ::class:~`fourier_expansion_framework.monoidpowerseries.CharacterMonoid_class`.296- `R` -- A representation on a module; As implemented297in :class:~`fourier_expansion_framework.monoidpowerseries.TrivialRepresentation`.298299EXAMPLES::300sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *301sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import EquivariantMonoidPowerSeriesModule_generic302sage: emps = EquivariantMonoidPowerSeriesModule_generic(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", FreeModule(QQ, 2))) # indirect doctest303sage: emps = EquivariantMonoidPowerSeriesModule_generic(NNMonoid(True), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(ZZ, 2))) # indirect doctest304sage: emps.base_ring()305Ring of equivariant monoid power series over NN306sage: (1 / 2) * emps.0307Equivariant monoid power series in Module of equivariant monoid power series over NN308"""309310# If the representation O respects the monoid structure of S311# the base ring should be the associated power series ring.312if O.is_monoid_action() :313Module.__init__(self, EquivariantMonoidPowerSeriesRing(O,C,TrivialRepresentation(R.group(), R.base_ring())))314else :315Module.__init__(self, R.codomain())316EquivariantMonoidPowerSeriesAmbient_abstract.__init__(self, O, C, R)317318self.__coeff_gens = \319[self._element_class( self,320dict([( C.one_element(), dict([(self.monoid().zero_element(), a)]) )]),321self.monoid().filter_all() )322for a in self.coefficient_domain().gens()]323324def ngens(self) :325r"""326TESTS::327sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *328sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import EquivariantMonoidPowerSeriesModule_generic329sage: emps = EquivariantMonoidPowerSeriesModule_generic(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", FreeModule(QQ, 2)))330sage: emps.ngens()3312332"""333return len(self.__coeff_gens)334335def gen(self, i = 0) :336r"""337TESTS::338sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *339sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import EquivariantMonoidPowerSeriesModule_generic340sage: emps = EquivariantMonoidPowerSeriesModule_generic(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", FreeModule(QQ, 2)))341sage: emps.gen()342Equivariant monoid power series in Module of equivariant monoid power series over NN343"""344return self.gens()[i]345346def gens(self) :347r"""348TESTS::349sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *350sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import EquivariantMonoidPowerSeriesModule_generic351sage: emps = EquivariantMonoidPowerSeriesModule_generic(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", FreeModule(QQ, 2)))352sage: emps.gens()353[Equivariant monoid power series in Module of equivariant monoid power series over NN, Equivariant monoid power series in Module of equivariant monoid power series over NN]354"""355return self.__coeff_gens356357def construction(self) :358r"""359TESTS::360sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *361sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import EquivariantMonoidPowerSeriesModule_generic362sage: emps = EquivariantMonoidPowerSeriesModule_generic(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", FreeModule(QQ, 2)))363sage: (f, a) = emps.construction()364sage: (f, a)365(EquivariantMonoidPowerSeriesModuleFunctor, Rational Field)366sage: f(a) == emps367True368"""369from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import EquivariantMonoidPowerSeriesModuleFunctor370371return EquivariantMonoidPowerSeriesModuleFunctor(self.action(), self.characters(), self.representation()), \372self.coefficient_domain().base_ring()373374def zero_element(self) :375r"""376TESTS::377sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *378sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import EquivariantMonoidPowerSeriesModule_generic379sage: emps = EquivariantMonoidPowerSeriesModule_generic(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", FreeModule(QQ, 2)))380sage: h = emps.zero_element()381"""382return self(0)383384def _element_constructor_(self, x) :385r"""386TESTS::387sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *388sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import EquivariantMonoidPowerSeriesModule_generic389sage: emps = EquivariantMonoidPowerSeriesModule_generic(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", FreeModule(QQ, 2)))390sage: h = emps(0) # indirect doctest391sage: h = emps(int(0)) # indirect doctest392"""393if isinstance(x, int) and x == 0 :394return self._element_class( self,395dict( [(self.characters().one_element(), dict())] ),396self.action().filter_all() )397elif isinstance(x, Element) and x.is_zero() :398P = x.parent()399400if self.action().is_monoid_action() and \401self.base_ring().base_ring().has_coerce_map_from(P) or \402not self.action().is_monoid_action() and \403self.base_ring().has_coerce_map_from(P) :404return self._element_class( self,405dict( [(self.characters().one_element(), dict())] ),406self.action().filter_all() )407408return EquivariantMonoidPowerSeriesAmbient_abstract._element_constructor_(self, x)409410def _repr_(self) :411r"""412TESTS::413sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *414sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import EquivariantMonoidPowerSeriesModule_generic415sage: EquivariantMonoidPowerSeriesModule_generic(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", FreeModule(QQ, 2)))416Module of equivariant monoid power series over NN417"""418return "Module of equivariant monoid power series over " + self.monoid()._repr_()419420def _latex_(self) :421r"""422TESTS::423sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *424sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import EquivariantMonoidPowerSeriesModule_generic425sage: latex( EquivariantMonoidPowerSeriesModule_generic(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", FreeModule(QQ, 2))) )426\text{Module of equivariant monoid power series over }\Bold{N}427"""428return r"\text{Module of equivariant monoid power series over }" + self.monoid()._latex_()429430431