code / alex / psage / psage / modform / fourier_expansion_framework / monoidpowerseries / monoidpowerseries_functor.py
241852 viewsr"""1Functor creating rings or modules 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 sage.categories.commutative_additive_groups import CommutativeAdditiveGroups27from sage.categories.rings import Rings28from sage.categories.modules import Modules29from sage.categories.morphism import Morphism30from sage.categories.pushout import pushout, ConstructionFunctor31from sage.rings.ring import Ring32from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import MonoidPowerSeriesRing3334#===============================================================================35# MonoidPowerSeriesRingFunctor36#===============================================================================3738class MonoidPowerSeriesRingFunctor ( ConstructionFunctor ) :39r"""40Functor mapping a coefficient ring to a monoid power series ring41over a given monoid.42"""4344rank = 94546def __init__(self, S) :47r"""48INPUT:49- `S` -- A monoid as in :class:`~from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids.NNMonoid`5051TESTS::52sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesRingFunctor53sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid54sage: F = MonoidPowerSeriesRingFunctor(NNMonoid(False))55"""56self.__S = S5758ConstructionFunctor.__init__(self, Rings(), Rings())5960def monoid(self) :61r"""62Return the monoid associated to this functor.6364OUTPUT:65A monoid as in :class:`~from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids.NNMonoid`.6667TESTS::68sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesRingFunctor69sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid70sage: F = MonoidPowerSeriesRingFunctor(NNMonoid(False))71sage: F.monoid()72NN73"""74return self.__S7576def __call__(self, A) :77r"""78Apply a ``self`` to a coefficient domain `A`.7980INPUT:81- `A` -- A ring or module. The domain of coefficients for82a ring or module of monoid power series.8384OUTPUT:85An instance of :class:`~from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ambient.MonoidPowerSeriesAmbient_abstract`.86A ring if `A` is a ring, a module if `A` is a module.8788TESTS::89sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesRingFunctor90sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid91sage: F = MonoidPowerSeriesRingFunctor(NNMonoid(False))92sage: mps = F(ZZ)93sage: mps.monoid() == NNMonoid(False)94True95sage: mps.coefficient_domain()96Integer Ring97"""98from monoidpowerseries_ring import MonoidPowerSeriesRing99100return MonoidPowerSeriesRing(A, self.__S)101102def __cmp__(self, other) :103r"""104TESTS::105sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesRingFunctor106sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid107sage: F = MonoidPowerSeriesRingFunctor(NNMonoid(False))108sage: F == MonoidPowerSeriesRingFunctor(NNMonoid(False))109True110"""111c = cmp(type(self), type(other))112113if c == 0 :114c = cmp(self.__S, other.__S)115116return c117118#===============================================================================119# MonoidPowerSeriesModuleFunctor120#===============================================================================121122class MonoidPowerSeriesModuleFunctor ( ConstructionFunctor ) :123r"""124Functor mapping a coefficient module to a monoid power series module125over a given monoid.126"""127128rank = 9129130def __init__(self, B, S) :131r"""132INPUT:133- `B` -- A ring.134- `S` -- A monoid as in :class:`~from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids.NNMonoid`135136TESTS::137sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesModuleFunctor138sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid139sage: F = MonoidPowerSeriesModuleFunctor(ZZ, NNMonoid(False))140"""141self.__S = S142143ConstructionFunctor.__init__(self, Modules(B), CommutativeAdditiveGroups())144145def monoid(self) :146r"""147Return the monoid associated to this functor.148149OUTPUT:150A monoid as in :class:`~from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids.NNMonoid`.151152TESTS::153sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesModuleFunctor154sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid155sage: F = MonoidPowerSeriesModuleFunctor(ZZ, NNMonoid(False))156sage: F.monoid()157NN158"""159return self.__S160161def __call__(self, A) :162r"""163Apply a ``self`` to a coefficient domain `A`.164165INPUT:166- `A` -- A ring or module. The domain of coefficients for167a ring or module of monoid power series.168169OUTPUT:170An instance of :class:`~from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ambient.MonoidPowerSeriesAmbient_abstract`.171A ring if `A` is a ring, a module if `A` is a module.172173TESTS::174sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesModuleFunctor175sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid176sage: F = MonoidPowerSeriesModuleFunctor(ZZ, NNMonoid(False))177sage: mps = F(FreeModule(ZZ, 1))178sage: mps.monoid() == NNMonoid(False)179True180sage: mps.coefficient_domain()181Ambient free module of rank 1 over the principal ideal domain Integer Ring182sage: F(FreeModule(QQ, 3)).coefficient_domain()183Vector space of dimension 3 over Rational Field184"""185from monoidpowerseries_module import MonoidPowerSeriesModule186187return MonoidPowerSeriesModule(A, self.__S)188189def __cmp__(self, other) :190r"""191TESTS::192sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesModuleFunctor193sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid194sage: F = MonoidPowerSeriesModuleFunctor(ZZ, NNMonoid(False))195sage: F == MonoidPowerSeriesModuleFunctor(ZZ, NNMonoid(False))196True197sage: F == MonoidPowerSeriesModuleFunctor(QQ, NNMonoid(False))198False199"""200c = cmp(type(self), type(other))201202if c == 0 :203c = cmp(self.domain().base_ring(), other.domain().base_ring())204if c == 0 :205c = cmp(self.__S, other.__S)206207return c208209#===============================================================================210# EquivariantMonoidPowerSeriesRingFunctor211#===============================================================================212213class EquivariantMonoidPowerSeriesRingFunctor ( ConstructionFunctor ) :214r"""215Functor mapping a coefficient domain to a equivariant monoid power series216ring or module over a given monoid action with character and representation.217The representation will be extended by scalars if the coefficient domain's218base ring is to big.219"""220221rank = 9222223def __init__(self, O, C, R) :224r"""225INPUT:226- `O` -- An action of a group `G` on a monoid as implemented in :class:`~fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basismonoids.NNMonoid`.227- `C` -- A monoid of charcters `G -> K` for a ring `K`. As implemented in :class:`~fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basismonoids.CharacterMonoid_class`.228- `R` -- A representation of `G` on some `K`-algebra or module `A`.229As implemented in :class:`~fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basismonoids.TrivialRepresentation`.230231TESTS::232sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import EquivariantMonoidPowerSeriesRingFunctor233sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid, TrivialRepresentation, TrivialCharacterMonoid234sage: F = EquivariantMonoidPowerSeriesRingFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", ZZ))235"""236if O.group() != C.group() :237raise ValueError( "The action on S and the characters must have the same group" )238if R.base_ring() != C.codomain() :239# if C.codomain().has_coerce_map_from(R.base_ring()) :240# pass241# el242if R.base_ring().has_coerce_map_from(C.codomain()) :243pass244else :245raise ValueError( "character codomain and representation base ring must be coercible" )246if not O.is_monoid_action() :247raise ValueError( "monoid structure must be compatible with group action" )248249self.__O = O250self.__C = C251self.__R = R252253ConstructionFunctor.__init__(self, Rings(), Rings())254255def __call__(self, K) :256r"""257Apply a ``self`` to a coefficient domain `A`.258259INPUT:260- `A` -- A ring or module. The domain of coefficients for261a ring or module of equivariant monoid power series.262263OUTPUT:264An instance of :class:`~from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ambient.EquivariantMonoidPowerSeriesAmbient_abstract`.265A ring if the representation's extension by `A` is a ring, a module if this extension is a module.266267TESTS::268sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import EquivariantMonoidPowerSeriesRingFunctor269sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid, TrivialRepresentation, TrivialCharacterMonoid270sage: F = EquivariantMonoidPowerSeriesRingFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", ZZ))271sage: emps = F(QQ)272sage: emps.action() == NNMonoid()273True274sage: emps.characters()275Character monoid over Trivial monoid276"""277if not self.__R.base_ring().has_coerce_map_from(K) :278R = self.__R.base_extend( pushout(self.__R.base_ring(), K) )279else :280R = self.__R281282from monoidpowerseries_ring import EquivariantMonoidPowerSeriesRing283284return EquivariantMonoidPowerSeriesRing( self.__O, self.__C, R )285286def __cmp__(self, other) :287r"""288TESTS::289sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import EquivariantMonoidPowerSeriesRingFunctor290sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid, TrivialRepresentation, TrivialCharacterMonoid291sage: F = EquivariantMonoidPowerSeriesRingFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", ZZ))292sage: F == EquivariantMonoidPowerSeriesRingFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", ZZ))293True294sage: F == EquivariantMonoidPowerSeriesRingFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(QQ, 3)))295False296"""297c = cmp(type(self), type(other))298if c == 0 :299c = cmp(self.__R, other.__R)300if c == 0 :301c = cmp(self.__O, other.__O)302if c == 0 :303c = cmp(self.__C, other.__C)304305return c306307def expand(self) :308r"""309An equivariant monoid power series can be constructed by first310constructing a monoid power series and then symmetrising it with311respect to the group action.312313OUTPUT:314A list of functors.315316TESTS::317sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import EquivariantMonoidPowerSeriesRingFunctor318sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid, TrivialRepresentation, TrivialCharacterMonoid319sage: F = EquivariantMonoidPowerSeriesRingFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", ZZ))320sage: F.expand()321[MonoidPowerSeriesSymmetrisationRingFunctor, MonoidPowerSeriesRingFunctor]322"""323return [ MonoidPowerSeriesSymmetrisationRingFunctor(self.__O, self.__C, self.__R),324MonoidPowerSeriesRingFunctor(self.__O.monoid()) ]325326def merge(self, other) :327r"""328TESTS::329sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import EquivariantMonoidPowerSeriesRingFunctor330sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid, TrivialRepresentation, TrivialCharacterMonoid331sage: F = EquivariantMonoidPowerSeriesRingFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", ZZ))332sage: G = EquivariantMonoidPowerSeriesRingFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", QQ))333sage: F.merge(G) == G334True335sage: G = EquivariantMonoidPowerSeriesRingFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(ZZ, 3)))336sage: F.merge(G) is None337True338"""339if self == other :340return self341elif type(self) == type(other) and \342self.__O == self.__O and \343self.__C == self.__C :344try :345if self.__R.extends(other.__R) :346return self347elif other.__R.extends(self.__R) :348return other349except AttributeError :350return None351352return None353354#===============================================================================355# EquivariantMonoidPowerSeriesFunctor356#===============================================================================357358class EquivariantMonoidPowerSeriesModuleFunctor ( ConstructionFunctor ) :359r"""360Functor mapping a coefficient domain to a equivariant monoid power series361ring or module over a given monoid action with character and representation.362The representation will be extended by scalars if the coefficient domain's363base ring is to big.364"""365366rank = 9367368def __init__(self, O, C, R) :369r"""370INPUT:371- `O` -- An action of a group `G` on a monoid as implemented in :class:`~fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basismonoids.NNMonoid`.372- `C` -- A monoid of charcters `G -> K` for a ring `K`. As implemented in :class:`~fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basismonoids.CharacterMonoid_class`.373- `R` -- A representation of `G` on some `K`-algebra or module `A`.374As implemented in :class:`~fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basismonoids.TrivialRepresentation`.375376TESTS::377sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import EquivariantMonoidPowerSeriesModuleFunctor378sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid, TrivialRepresentation, TrivialCharacterMonoid379sage: F = EquivariantMonoidPowerSeriesModuleFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", ZZ))380"""381if O.group() != C.group() :382raise ValueError( "The action on S and the characters must have the same group" )383if R.base_ring() != C.codomain() :384# if C.codomain().has_coerce_map_from(R.base_ring()) :385# pass386# el387if R.base_ring().has_coerce_map_from(C.codomain()) :388pass389else :390raise ValueError( "character codomain and representation base ring must be coercible" )391392self.__O = O393self.__C = C394self.__R = R395396ConstructionFunctor.__init__(self, Modules(R.base_ring()), CommutativeAdditiveGroups())397398def __call__(self, K) :399r"""400Apply a ``self`` to a coefficient domain `A`.401402INPUT:403- `A` -- A ring or module. The domain of coefficients for404a ring or module of equivariant monoid power series.405406OUTPUT:407An instance of :class:`~from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ambient.EquivariantMonoidPowerSeriesAmbient_abstract`.408A ring if the representation's extension by `A` is a ring, a module if this extension is a module.409410TESTS::411sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import EquivariantMonoidPowerSeriesModuleFunctor412sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid, TrivialRepresentation, TrivialCharacterMonoid413sage: F = EquivariantMonoidPowerSeriesModuleFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(ZZ, 1)))414sage: emps = F(QQ)415sage: emps.action() == NNMonoid()416True417sage: emps.characters()418Character monoid over Trivial monoid419sage: F = EquivariantMonoidPowerSeriesModuleFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(ZZ, 3)))420sage: emps = F(QQ)421sage: emps.coefficient_domain()422Vector space of dimension 3 over Rational Field423"""424if not self.__R.base_ring().has_coerce_map_from(K) :425R = self.__R.base_extend( pushout(self.__R.base_ring(), K) )426else :427R = self.__R428429from monoidpowerseries_module import EquivariantMonoidPowerSeriesModule430431return EquivariantMonoidPowerSeriesModule( self.__O, self.__C, R )432433def __cmp__(self, other) :434r"""435TESTS::436sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import EquivariantMonoidPowerSeriesModuleFunctor437sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid, TrivialRepresentation, TrivialCharacterMonoid438sage: F = EquivariantMonoidPowerSeriesModuleFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(ZZ, 1)))439sage: F == EquivariantMonoidPowerSeriesModuleFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(ZZ, 1)))440True441sage: F == EquivariantMonoidPowerSeriesModuleFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(QQ, 3)))442False443"""444c = cmp(type(self), type(other))445if c == 0 :446c = cmp(self.__R, other.__R)447if c == 0 :448c = cmp(self.__O, other.__O)449if c == 0 :450c = cmp(self.__C, other.__C)451452return c453454def expand(self) :455r"""456An equivariant monoid power series can be constructed by first457constructing a monoid power series and then symmetrising it with458respect to the group action.459460OUTPUT:461A list of functors.462463TESTS::464sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import EquivariantMonoidPowerSeriesModuleFunctor465sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid, TrivialRepresentation, TrivialCharacterMonoid466sage: F = EquivariantMonoidPowerSeriesModuleFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(ZZ, 1)))467sage: F.expand()468[MonoidPowerSeriesSymmetrisationModuleFunctor, MonoidPowerSeriesModuleFunctor]469"""470return [ MonoidPowerSeriesSymmetrisationModuleFunctor(self.__O, self.__C, self.__R),471MonoidPowerSeriesModuleFunctor(self.domain().base_ring(), self.__O.monoid()) ]472473def merge(self, other) :474r"""475TESTS::476sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import EquivariantMonoidPowerSeriesModuleFunctor477sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid, TrivialRepresentation, TrivialCharacterMonoid478sage: F = EquivariantMonoidPowerSeriesModuleFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(ZZ, 1)))479sage: G = EquivariantMonoidPowerSeriesModuleFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(QQ, 1)))480sage: F.merge(G) == G481True482sage: G = EquivariantMonoidPowerSeriesModuleFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(ZZ, 3)))483sage: F.merge(G) is None484True485"""486if self == other :487return self488elif type(self) == type(other) and \489self.__O == self.__O and \490self.__C == self.__C :491try :492if self.__R.extends(other.__R) :493return self494elif other.__R.extends(self.__R) :495return other496except AttributeError :497return None498499return None500501#===============================================================================502# MonoidPowerSeriesSymmetrisationRingFunctor503#===============================================================================504505class MonoidPowerSeriesSymmetrisationRingFunctor ( ConstructionFunctor) :506r"""507A functor mapping rings or modules of monoid power series508to a the an equivariant power series via symmetrisation.509"""510511rank = 9512513def __init__(self, O, C, R) :514r"""515INPUT:516- `O` -- An action of a group `G` on a monoid as implemented in :class:`~fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basismonoids.NNMonoid`.517- `C` -- A monoid of charcters `G -> K` for a ring `K`. As implemented in :class:`~fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basismonoids.CharacterMonoid_class`.518- `R` -- A representation of `G` on some `K`-algebra or module `A`.519As implemented in :class:`~fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basismonoids.TrivialRepresentation`.520521TESTS::522sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesSymmetrisationRingFunctor523sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid, TrivialRepresentation, TrivialCharacterMonoid524sage: F = MonoidPowerSeriesSymmetrisationRingFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", ZZ))525"""526if O.group() != C.group() :527raise ValueError( "The action on S and the characters must have the same group" )528if R.base_ring() != C.codomain() :529# if C.codomain().has_coerce_map_from(R.base_ring()) :530# pass531# el532if R.base_ring().has_coerce_map_from(C.codomain()) :533pass534else :535raise ValueError( "character codomain and representation base ring must be coercible" )536if not O.is_monoid_action() :537raise ValueError( "monoid structure must be compatible with group action" )538539self.__O = O540self.__C = C541self.__R = R542543ConstructionFunctor.__init__(self, Rings(), Rings())544545def __call__(self, P) :546r"""547Map a monoid power series to a symmetrisation extending the associated representation.548549INPUT:550- `P` -- An instance of :class:`~from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ambient.MonoidPowerSeriesAmbient_abstract`.551552TESTS::553sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesSymmetrisationRingFunctor, MonoidPowerSeriesRingFunctor554sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid, TrivialRepresentation, TrivialCharacterMonoid555sage: mps = MonoidPowerSeriesRingFunctor(NNMonoid(False))(QQ)556sage: F = MonoidPowerSeriesSymmetrisationRingFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", ZZ))557sage: emps = F(mps)558sage: emps.representation() == TrivialRepresentation("1", QQ)559True560sage: mps = MonoidPowerSeriesRingFunctor(NNMonoid(False))(ZZ)561sage: F = MonoidPowerSeriesSymmetrisationRingFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", QQ))562sage: emps = F(mps)563sage: emps.representation() == TrivialRepresentation("1", QQ)564True565"""566if self.__O.monoid() != P.monoid() :567raise ValueError( "Action has to be defined on the monoid associated to P." )568569PR = self.__R.from_module(P.coefficient_domain())570571if not self.__R.base_ring().has_coerce_map_from(PR.base_ring()) :572R = self.__R.base_extend( pushout(self.__R.base_ring(), PR.base_ring()) )573else :574R = self.__R575576from monoidpowerseries_ring import EquivariantMonoidPowerSeriesRing577578return EquivariantMonoidPowerSeriesRing( self.__O, self.__C, R )579580def __cmp__(self, other) :581r"""582TESTS::583sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesSymmetrisationRingFunctor584sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid, TrivialRepresentation, TrivialCharacterMonoid585sage: F = MonoidPowerSeriesSymmetrisationRingFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", ZZ))586sage: F == MonoidPowerSeriesSymmetrisationRingFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", ZZ))587True588sage: F == MonoidPowerSeriesSymmetrisationRingFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", QQ))589False590"""591c = cmp(type(self), type(other))592if c == 0 :593c = cmp(self.__R, other.__R)594if c == 0 :595c = cmp(self.__O, other.__O)596if c == 0 :597c = cmp(self.__C, other.__C)598599return c600601def merge(self, other) :602r"""603TESTS::604sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesSymmetrisationRingFunctor605sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid, TrivialRepresentation, TrivialCharacterMonoid606sage: F = MonoidPowerSeriesSymmetrisationRingFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", ZZ))607sage: G = MonoidPowerSeriesSymmetrisationRingFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", QQ))608sage: F.merge(G) == G609True610sage: G = MonoidPowerSeriesSymmetrisationRingFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(QQ, 3)))611sage: F.merge(G) is None612True613"""614if self == other :615return self616elif type(self) == type(other) and \617self.__O == self.__O :618try :619if self.__C.extends(other.__C) and self.__R.extends(other.__R) :620return self621elif other.__C.extends(self.__C) and other.__R.extends(self.__R) :622return other623except AttributeError :624return None625626return None627628#===============================================================================629# MonoidPowerSeriesSymmetrisationModuleFunctor630#===============================================================================631632class MonoidPowerSeriesSymmetrisationModuleFunctor ( ConstructionFunctor) :633r"""634A functor mapping rings or modules of monoid power series635to a the an equivariant power series via symmetrisation.636"""637638rank = 9639640def __init__(self, O, C, R) :641r"""642INPUT:643- `O` -- An action of a group `G` on a monoid as implemented in :class:`~fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basismonoids.NNMonoid`.644- `C` -- A monoid of charcters `G -> K` for a ring `K`. As implemented in :class:`~fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basismonoids.CharacterMonoid_class`.645- `R` -- A representation of `G` on some `K`-algebra or module `A`.646As implemented in :class:`~fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basismonoids.TrivialRepresentation`.647648TESTS::649sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesSymmetrisationModuleFunctor650sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid, TrivialRepresentation, TrivialCharacterMonoid651sage: F = MonoidPowerSeriesSymmetrisationModuleFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(ZZ, 1)))652"""653if O.group() != C.group() :654raise ValueError, "The action on S and the characters must have the same group"655if R.base_ring() != C.codomain() :656if C.codomain().has_coerce_map_from(R.base_ring()) :657pass658elif R.base_ring().has_coerce_map_from(C.codomain()) :659pass660else :661raise ValueError, "character codomain and representation base ring must be coercible"662663self.__O = O664self.__C = C665self.__R = R666667ConstructionFunctor.__init__(self, CommutativeAdditiveGroups(), CommutativeAdditiveGroups())668669def __call__(self, P) :670r"""671Map a monoid power series to a symmetrisation extending the associated representation.672673INPUT:674- `P` -- An instance of :class:`~from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ambient.MonoidPowerSeriesAmbient_abstract`.675676TESTS::677sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesSymmetrisationModuleFunctor, MonoidPowerSeriesModuleFunctor678sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid, TrivialRepresentation, TrivialCharacterMonoid679sage: mps = MonoidPowerSeriesModuleFunctor(ZZ, NNMonoid(False))(FreeModule(QQ, 1))680sage: F = MonoidPowerSeriesSymmetrisationModuleFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(ZZ, 1)))681sage: emps = F(mps)682sage: emps.representation() == TrivialRepresentation("1", FreeModule(QQ, 1))683True684sage: mps = MonoidPowerSeriesModuleFunctor(ZZ, NNMonoid(False))(FreeModule(ZZ, 1))685sage: F = MonoidPowerSeriesSymmetrisationModuleFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(QQ, 1)))686sage: emps = F(mps)687sage: emps.representation() == TrivialRepresentation("1", FreeModule(QQ, 1))688True689"""690if self.__O.monoid() != P.monoid() :691raise ValueError( "Action has to be defined on the monoid associated to P." )692693PR = self.__R.from_module(P.coefficient_domain())694695if not self.__R.base_ring().has_coerce_map_from(PR.base_ring()) :696R = self.__R.base_extend( pushout(self.__R.base_ring(), PR.base_ring()) )697else :698R = self.__R699700from monoidpowerseries_module import EquivariantMonoidPowerSeriesModule701702return EquivariantMonoidPowerSeriesModule( self.__O, self.__C, R )703704def __cmp__(self, other) :705r"""706TESTS::707sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesSymmetrisationModuleFunctor708sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid, TrivialRepresentation, TrivialCharacterMonoid709sage: F = MonoidPowerSeriesSymmetrisationModuleFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(ZZ, 1)))710sage: F == MonoidPowerSeriesSymmetrisationModuleFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(ZZ, 1)))711True712sage: F == MonoidPowerSeriesSymmetrisationModuleFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(QQ, 1)))713False714"""715c = cmp(type(self), type(other))716if c == 0 :717c = cmp(self.__R, other.__R)718if c == 0 :719c = cmp(self.__O, other.__O)720if c == 0 :721c = cmp(self.__C, other.__C)722723return c724725def merge(self, other) :726r"""727TESTS::728sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesSymmetrisationModuleFunctor729sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid, TrivialRepresentation, TrivialCharacterMonoid730sage: F = MonoidPowerSeriesSymmetrisationModuleFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(ZZ, 1)))731sage: G = MonoidPowerSeriesSymmetrisationModuleFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(QQ, 1)))732sage: F.merge(G) == G733True734sage: G = MonoidPowerSeriesSymmetrisationModuleFunctor(NNMonoid(), TrivialCharacterMonoid("1", ZZ), TrivialRepresentation("1", FreeModule(QQ, 3)))735sage: F.merge(G) is None736True737"""738if self == other :739return self740elif type(self) == type(other) and \741self.__O == self.__O :742try :743if self.__C.extends(other.__C) and self.__R.extends(other.__R) :744return self745elif other.__C.extends(self.__C) and other.__R.extends(self.__R) :746return other747except AttributeError :748return None749750return None751752#===============================================================================753# MonoidPowerSeriesBaseRingInjection754#===============================================================================755756class MonoidPowerSeriesBaseRingInjection ( Morphism ) :757r"""758The injection of the base ring into a (equivariant) monoid power759series ring.760"""761762def __init__(self, domain, codomain) :763r"""764INPUT:765- ``domain`` -- A ring; The base ring.766- ``codomain`` -- A ring; The ring of monoid power series.767768TESTS::769sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesRingFunctor, MonoidPowerSeriesModuleFunctor, MonoidPowerSeriesBaseRingInjection770sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid771sage: mps = MonoidPowerSeriesRingFunctor(NNMonoid(False))(ZZ)772sage: binj = MonoidPowerSeriesBaseRingInjection(ZZ, mps)773sage: mps = MonoidPowerSeriesModuleFunctor(ZZ,NNMonoid(False))(FreeModule(ZZ, 1))774sage: binj = MonoidPowerSeriesBaseRingInjection(ZZ, mps)775776"""777Morphism.__init__(self, domain, codomain)778779self._repr_type_str = "MonoidPowerSeries base injection"780781def _call_(self, x) :782r"""783Coerce an element into the ring of monoid power series.784785INPUT:786- `x` -- An element of a ring; An element of the base ring.787788OUTPUT:789An element of a ring.790791TESTS::792sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesRingFunctor, MonoidPowerSeriesBaseRingInjection793sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid794sage: mps = MonoidPowerSeriesRingFunctor(NNMonoid(False))(ZZ)795sage: binj = MonoidPowerSeriesBaseRingInjection(ZZ, mps)796sage: binj(1)797Monoid power series in Ring of monoid power series over NN798"""799return self.codomain()._element_constructor_(x)800801def _call_with_args(self, x, *args, **kwds):802r"""803TESTS::804sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_functor import MonoidPowerSeriesRingFunctor, MonoidPowerSeriesBaseRingInjection805sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import NNMonoid806sage: mps = MonoidPowerSeriesRingFunctor(NNMonoid(False))(ZZ)807sage: binj = MonoidPowerSeriesBaseRingInjection(ZZ, mps)808sage: binj._call_with_args(1)809Monoid power series in Ring of monoid power series over NN810"""811return self.codomain()._element_constructor_(x, *args, **kwds)812813814