code / alex / psage / psage / modform / fourier_expansion_framework / monoidpowerseries / monoidpowerseries_ring.py
241852 viewsr"""1Rings of monoid power series and rings of equivariant monoid power series.23AUTHOR :4-- Martin Raum (2009 - 07 - 25) 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.monoidpowerseries.monoidpowerseries_ambient import MonoidPowerSeriesAmbient_abstract, \27EquivariantMonoidPowerSeriesAmbient_abstract28from sage.algebras.algebra import Algebra29from sage.rings.all import Integer30from sage.structure.element import Element31from sage.structure.parent import Parent3233#===============================================================================34# MonoidPowerSeriesRing35#===============================================================================3637_monoidpowerseries_ring_cache = dict()3839def MonoidPowerSeriesRing(A, S) :40r"""41Return the globally unique monoid power series ring with indices42over the filtered monoid `S` and coefficients in `A`.4344INPUT:45- `A` -- A ring.46- `S` -- A monoid as implemented in :class:~`fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids.NNMonoid`.4748OUTPUT:49An instance of :class:~`.MonoidPowerSeriesRing_generic`.5051EXAMPLES::52sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *53sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import MonoidPowerSeriesRing54sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))55sage: mps is MonoidPowerSeriesRing(QQ, NNMonoid(False))56True57"""58global _monoidpowerseries_ring_cache59key = (A, S)6061try :62return _monoidpowerseries_ring_cache[key]63except KeyError :64P = MonoidPowerSeriesRing_generic(A, S)65_monoidpowerseries_ring_cache[key] = P6667return P6869#===============================================================================70# MonoidPowerSeriesRing_generic71#===============================================================================7273class MonoidPowerSeriesRing_generic ( MonoidPowerSeriesAmbient_abstract, Algebra ) :74r"""75Given some `K` algebra `A` and a monoid `S` filtered over76a net `\Lambda` construct a ring 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` algebra is implemented by this class.81"""8283def __init__(self, A, S) :84r"""85INPUT:86- `A` -- A ring.87- `S` -- A monoid as implemented in :class:~`fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids.NNMonoid`.8889TESTS::90sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *91sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import MonoidPowerSeriesRing_generic92sage: mps = MonoidPowerSeriesRing_generic(QQ, NNMonoid(False))93sage: mps = MonoidPowerSeriesRing_generic(ZZ, NNMonoid(False))94sage: mps.base_ring()95Integer Ring96sage: (1 / 2) * mps.097Monoid power series in Ring of monoid power series over NN98"""99Algebra.__init__(self, A)100MonoidPowerSeriesAmbient_abstract.__init__(self, A, S)101102self.__monoid_gens = \103[ self._element_class(self, dict([(s, A.one_element())]),104self.monoid().filter_all() )105for s in S.gens() ]106107from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesBaseRingInjection108109self._populate_coercion_lists_(110coerce_list = [MonoidPowerSeriesBaseRingInjection(self.base_ring(), self)] + \111([S] if isinstance(S, Parent) else []) )112113def ngens(self) :114r"""115TESTS::116sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *117sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import MonoidPowerSeriesRing_generic118sage: mps = MonoidPowerSeriesRing_generic(QQ, NNMonoid(False))119sage: mps.ngens()1201121"""122return len(self.__monoid_gens)123124def gen(self, i = 0) :125r"""126TESTS::127sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *128sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import MonoidPowerSeriesRing_generic129sage: mps = MonoidPowerSeriesRing_generic(QQ, NNMonoid(False))130sage: mps.gen().coefficients()131{1: 1}132"""133return self.gens()[i]134135def gens(self) :136r"""137TESTS::138sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *139sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import MonoidPowerSeriesRing_generic140sage: mps = MonoidPowerSeriesRing_generic(QQ, NNMonoid(False))141sage: mps.gens()142[Monoid power series in Ring of monoid power series over NN]143"""144return self.__monoid_gens145146def construction(self) :147r"""148TESTS::149sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *150sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import MonoidPowerSeriesRing_generic151sage: mps = MonoidPowerSeriesRing_generic(QQ, NNMonoid(False))152sage: (f, a) = mps.construction()153sage: (f, a)154(MonoidPowerSeriesRingFunctor, Rational Field)155sage: f(a) == mps156True157"""158from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesRingFunctor159160return MonoidPowerSeriesRingFunctor(self.monoid()), self.coefficient_domain()161162def _element_constructor_(self, x) :163r"""164TESTS::165sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *166sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import MonoidPowerSeriesRing_generic167sage: mps = MonoidPowerSeriesRing_generic(QQ, NNMonoid(False))168sage: h = mps(1) # indirect doctest169sage: h = mps(mps.monoid().zero_element())170sage: h = mps.zero_element()171sage: K.<rho> = CyclotomicField(6)172sage: mps = MonoidPowerSeriesRing_generic(K, NNMonoid(False))173sage: h = mps(rho)174sage: h = mps(1)175"""176if isinstance(x, int) :177x = Integer(x)178179if isinstance(x, Element) :180P = x.parent()181182if P is self.coefficient_domain() :183return self._element_class( self, {self.monoid().zero_element(): x},184self.monoid().filter_all() )185elif self.coefficient_domain().has_coerce_map_from(P) :186return self._element_class( self, {self.monoid().zero_element(): self.coefficient_domain()(x)},187self.monoid().filter_all() )188elif P is self.monoid() :189return self._element_class( self, {x: self.base_ring().one_element},190self.monoid().filter_all() )191192return MonoidPowerSeriesAmbient_abstract._element_constructor_(self, x)193194def _repr_(self) :195r"""196TESTS::197sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *198sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import MonoidPowerSeriesRing_generic199sage: MonoidPowerSeriesRing_generic(QQ, NNMonoid(False))200Ring of monoid power series over NN201"""202return "Ring of monoid power series over " + self.monoid()._repr_()203204def _latex_(self) :205r"""206TESTS::207sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *208sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import MonoidPowerSeriesRing_generic209sage: latex(MonoidPowerSeriesRing_generic(QQ, NNMonoid(False)))210\text{Ring of monoid power series over }\Bold{N}211"""212return r"\text{Ring of monoid power series over }" + self.monoid()._latex_()213214###############################################################################215###############################################################################216###############################################################################217218#===============================================================================219# EquivariantMonoidPowerSeriesRing220#===============================================================================221222_equivariantmonoidpowerseries_ring_cache = dict()223224def EquivariantMonoidPowerSeriesRing(O, C, R) :225r"""226Return the globally unique ring of equivariant monoid power227over the monoid with action `O` with coefficients in the codomain `R`228with a representation and a set of virtual characters `C`.229230INPUT:231- `O` -- A monoid with an action of a group; As implemented in232:class:~`fourier_expansion_framework.monoidpowerseries.NNMonoid`.233- `C` -- A monoid of characters; As implemented in ::class:~`fourier_expansion_framework.monoidpowerseries.CharacterMonoid_class`.234- `R` -- A representation on an algebra; As implemented235in :class:~`fourier_expansion_framework.monoidpowerseries.TrivialRepresentation`.236237EXAMPLES::238sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *239sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import EquivariantMonoidPowerSeriesRing240sage: emps = EquivariantMonoidPowerSeriesRing(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ))241sage: emps is EquivariantMonoidPowerSeriesRing(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ))242True243"""244245## TODO: Implement optional checking of the relations of the characters246if O.group() != C.group() :247raise ValueError, "The action on S and the characters must have the same group"248if R.base_ring() != C.codomain() :249if C.codomain().has_coerce_map_from(R.base_ring()) :250K = C.codomain()251R = R.base_extend(K)252elif R.base_ring().has_coerce_map_from(C.codomain()) :253K = R.base_ring()254else :255from sage.categories.pushout import pushout256257try :258K = pushout(C.codomain(), R.base_ring())259R = R.base_extend(K)260except :261raise ValueError, "character codomain and representation base ring have no common extension"262263global _equivariantmonoidpowerseries_ring_cache264key = (O, C, R)265266try :267return _equivariantmonoidpowerseries_ring_cache[key]268except KeyError :269P = EquivariantMonoidPowerSeriesRing_generic(O, C, R)270_equivariantmonoidpowerseries_ring_cache[key] = P271272return P273274#===============================================================================275# EquivariantMonoidPowerSeriesRing_generic276#===============================================================================277278class EquivariantMonoidPowerSeriesRing_generic ( EquivariantMonoidPowerSeriesAmbient_abstract, Algebra ) :279r"""280Given some ring `A`, a monoid `S` filtered over some originated281net `\Lambda` such that all induced submonoids are finite, a group `G`, a282semigroup `C` with a map `c \rightarrow \mathrm{Hom}(G, Aut_K(A))`, a283homomorphism `\phi : G -> Aut(S)` and a homomorphism `\eta : G -> C`, where284`K` is the base ring of `A`.285286Suppose for every `c, c'` in `C`, and `g` in `G`, and `a, a'` in `A` we have287`(c c') (g) (a a') = c(g)(a) c'(g)(a')`.288Set `R = B[C][S]`. Then the projective limit of289`R / R_\lambda` for `\lambda \in \Lambda \rightarrow \infinity` is a290`K`-algebra.291292The set of generators is the set of generators of the underlying293monoidal power series ring and does not take into account the294group action295"""296297def __init__(self, O, C, R) :298r"""299INPUT:300- `O` -- A monoid with an action of a group; As implemented in301:class:~`fourier_expansion_framework.monoidpowerseries.NNMonoid`.302- `C` -- A monoid of characters; As implemented in ::class:~`fourier_expansion_framework.monoidpowerseries.CharacterMonoid_class`.303- `R` -- A representation on an algebra; As implemented304in :class:~`fourier_expansion_framework.monoidpowerseries.TrivialRepresentation`.305306EXAMPLES::307sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *308sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import EquivariantMonoidPowerSeriesRing_generic309sage: emps = EquivariantMonoidPowerSeriesRing_generic(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ)) # indirect doctest310sage: emps = EquivariantMonoidPowerSeriesRing_generic(NNMonoid(True), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", ZZ)) # indirect doctest311sage: emps.base_ring()312Integer Ring313sage: (1 / 2) * emps.0314Equivariant monoid power series in Ring of equivariant monoid power series over NN315"""316317Algebra.__init__(self, R.base_ring())318EquivariantMonoidPowerSeriesAmbient_abstract.__init__(self, O, C, R)319320self.__monoid_gens = \321[self._element_class(self,322dict([( C.one_element(), dict([(s, self.coefficient_domain().one_element())]) )]),323self.monoid().filter_all() )324for s in self.action().gens()]325self.__character_gens = \326[self._element_class(self,327dict([( c, dict([(self.monoid().zero_element(), self.coefficient_domain().one_element())]) )]),328self.monoid().filter_all() )329for c in C.gens()]330self.__coefficient_gens = \331[self._element_class(self,332dict([( C.one_element(), dict([(self.monoid().zero_element(), g)]))]),333self.monoid().filter_all() )334for g in self.coefficient_domain().gens()]335336from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesBaseRingInjection337338self._populate_coercion_lists_(339coerce_list = [MonoidPowerSeriesBaseRingInjection(R.codomain(), self)] ,340convert_list = ([O.monoid()] if isinstance(O.monoid(), Parent) else []) )341342def ngens(self) :343r"""344TESTS::345sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *346sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import EquivariantMonoidPowerSeriesRing_generic347sage: emps = EquivariantMonoidPowerSeriesRing_generic(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ))348sage: emps.ngens()3493350"""351return len(self.__monoid_gens) + len(self.__character_gens) + len(self.__coefficient_gens)352353def gen(self, i = 0) :354r"""355TESTS::356sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *357sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import EquivariantMonoidPowerSeriesRing_generic358sage: emps = EquivariantMonoidPowerSeriesRing_generic(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ))359sage: emps.gen()360Equivariant monoid power series in Ring of equivariant monoid power series over NN361"""362return self.gens()[i]363364def gens(self) :365r"""366TESTS::367sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *368sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import EquivariantMonoidPowerSeriesRing_generic369sage: emps = EquivariantMonoidPowerSeriesRing_generic(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ))370sage: emps.gens()371[Equivariant monoid power series in Ring of equivariant monoid power series over NN, Equivariant monoid power series in Ring of equivariant monoid power series over NN, Equivariant monoid power series in Ring of equivariant monoid power series over NN]372"""373return self.__monoid_gens + self.__character_gens + self.__coefficient_gens374375def construction(self) :376r"""377TESTS::378sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *379sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import EquivariantMonoidPowerSeriesRing_generic380sage: emps = EquivariantMonoidPowerSeriesRing_generic(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ))381sage: (f, a) = emps.construction()382sage: (f, a)383(EquivariantMonoidPowerSeriesRingFunctor, Rational Field)384sage: f(a) == emps385True386"""387from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import EquivariantMonoidPowerSeriesRingFunctor388389return EquivariantMonoidPowerSeriesRingFunctor(self.action(), self.characters(), self.representation()), \390self.coefficient_domain()391392def _element_constructor_(self, x) :393r"""394TESTS::395sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *396sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import EquivariantMonoidPowerSeriesRing_generic397sage: emps = EquivariantMonoidPowerSeriesRing_generic(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ))398sage: h = emps(1)399sage: h = emps(emps.monoid().zero_element())400sage: h = emps.zero_element()401sage: K.<rho> = CyclotomicField(6)402sage: emps = EquivariantMonoidPowerSeriesRing_generic(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", K))403sage: h = emps(rho)404sage: h = emps(1)405"""406if isinstance(x, int) :407x = Integer(x)408409if isinstance(x, Element) :410P = x.parent()411412if P is self.coefficient_domain() :413return self._element_class( self,414{self.characters().one_element():415{self.monoid().zero_element(): x}},416self.action().filter_all() )417elif self.coefficient_domain().has_coerce_map_from(P) :418return self._element_class( self,419{self.characters().one_element():420{self.monoid().zero_element(): self.coefficient_domain()(x)}},421self.action().filter_all() )422elif P is self.monoid() :423return self._element_class( self,424{self.characters().one_element():425{x: self.base_ring().one_element()}},426self.action().filter_all(),427symmetrise = True )428429return EquivariantMonoidPowerSeriesAmbient_abstract._element_constructor_(self, x)430431def _cmp_(self, other) :432r"""433TESTS::434sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *435sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import MonoidPowerSeriesRing436sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))437sage: mps2 = MonoidPowerSeriesRing(ZZ, NNMonoid(False))438sage: mps == MonoidPowerSeriesRing(QQ, NNMonoid(False))439True440sage: mps == mps2441False442"""443c = cmp(type(self), type(other))444445if c == 0 :446c = cmp(self.base_ring(), other.base_ring())447if c == 0 :448c = cmp(self.monoid(), other.monoid())449450return c451452def _repr_(self) :453r"""454TESTS::455sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *456sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import EquivariantMonoidPowerSeriesRing_generic457sage: EquivariantMonoidPowerSeriesRing_generic(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ))458Ring of equivariant monoid power series over NN459"""460return "Ring of equivariant monoid power series over " + self.monoid()._repr_()461462def _latex_(self) :463r"""464TESTS::465sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *466sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import EquivariantMonoidPowerSeriesRing_generic467sage: latex(EquivariantMonoidPowerSeriesRing_generic(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ)))468\text{Ring of equivariant monoid power series over }\Bold{N}469"""470return r"\text{Ring of equivariant monoid power series over }" + self.monoid()._latex_()471472473