Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
241849 views
1
r"""
2
Rings of elements with Fourier expansion and partially known relations.
3
4
AUTHOR :
5
-- Martin Raum (2009 - 07 - 27) Initial version
6
"""
7
8
#===============================================================================
9
#
10
# Copyright (C) 2009 Martin Raum
11
#
12
# This program is free software; you can redistribute it and/or
13
# modify it under the terms of the GNU General Public License
14
# as published by the Free Software Foundation; either version 3
15
# of the License, or (at your option) any later version.
16
#
17
# This program is distributed in the hope that it will be useful,
18
# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20
# General Public License for more details.
21
#
22
# You should have received a copy of the GNU General Public License
23
# along with this program; if not, see <http://www.gnu.org/licenses/>.
24
#
25
#===============================================================================
26
27
from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ambient import GradedExpansionAmbient_abstract
28
from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_element import GradedExpansion_class
29
from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_functor import GradedExpansionBaseringInjection
30
from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import GradedExpansionSubmodule_abstract
31
from sage.algebras.algebra import Algebra
32
from sage.misc.flatten import flatten
33
from sage.misc.latex import latex
34
from sage.rings.all import Integer
35
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
36
from sage.structure.element import Element
37
import operator
38
39
#===============================================================================
40
# GradedExpansionRing_class
41
#===============================================================================
42
43
class GradedExpansionRing_class ( GradedExpansionAmbient_abstract, Algebra ) :
44
r"""
45
A class for a ring of graded expansions over an ambient of graded expansions,
46
that might also be trivial.
47
That is, a polynomial ring with relations and a mapping to an (equivariant)
48
monoid power series.
49
"""
50
51
def __init__ ( self, base_ring_generators, generators,
52
relations, grading, all_relations = True, reduce_before_evaluating = True) :
53
r"""
54
The degree one part of the monomials that correspond to generators over the
55
base expansion ring will serve as the coordinates of the elements.
56
57
INPUT:
58
- ``base_ring_generators`` -- A list of (equivariant) monoid power series with
59
coefficient domain the base ring of the coefficient
60
domain of the generators or ``None``.
61
- ``generators`` -- A list of (equivariant) monoid power series; The generators
62
of the ambient over the ring generated by the base ring
63
generators.
64
- ``relations`` -- An ideal in a polynomial ring with ``len(base_ring_generators) + len(generators)``
65
variables.
66
- ``grading`` -- A grading deriving from :class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_grading`;
67
A grading for the polynomial ring of the relations.
68
- ``all_relations`` -- A boolean (default: ``True``); If ``True`` the relations given
69
for the polynomial ring are all relations that the Fourier
70
expansion have.
71
- ``reduce_before_evaluating`` -- A boolean (default: ``True``); If ``True`` any monomial
72
will be Groebner reduced before the Fourier expansion
73
is calculated.
74
75
NOTE:
76
The grading must respect the relations of the generators.
77
78
TESTS::
79
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
80
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
81
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
82
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
83
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
84
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
85
sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), PolynomialRing(QQ, ['a', 'b']).ideal(0), DegreeGrading((1,2)))
86
sage: ger.base_ring()
87
Graded expansion ring with generators a
88
"""
89
if not hasattr(self, '_element_class') :
90
self._element_class = GradedExpansion_class
91
92
if hasattr(self, "_extended_base_ring") :
93
Algebra.__init__(self, self._extended_base_ring)
94
elif base_ring_generators is None or len(base_ring_generators) == 0 :
95
Algebra.__init__(self, relations.base_ring())
96
else :
97
gb = filter( lambda p: all( all(a == 0 for a in list(e)[len(base_ring_generators):])
98
for e in p.exponents() ),
99
relations.groebner_basis() )
100
P = PolynomialRing( relations.base_ring(),
101
list(relations.ring().variable_names())[:len(base_ring_generators)] )
102
base_relations = P.ideal(gb)
103
R = GradedExpansionRing_class(None, base_ring_generators, base_relations,
104
grading.subgrading(xrange(len(base_ring_generators))), all_relations, reduce_before_evaluating)
105
Algebra.__init__(self, R)
106
107
GradedExpansionAmbient_abstract.__init__(self, base_ring_generators, generators, relations, grading, all_relations, reduce_before_evaluating)
108
109
self._populate_coercion_lists_(
110
coerce_list = [GradedExpansionBaseringInjection(self.base_ring(), self)],
111
# This is deactivated since it leads to errors in the coercion system for Sage 4.8
112
# TODO: Find out why
113
# convert_list = [self.relations().ring()],
114
convert_list = [],
115
convert_method_name = "_graded_expansion_submodule_to_graded_ambient_" )
116
117
def _graded_monoms(self, index) :
118
r"""
119
Return all monoms in the generators that have a given grading index.
120
121
INPUT:
122
- ``index`` -- A grading values.
123
124
OUTPUT:
125
A list of elements of ``self``.
126
127
TESTS::
128
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
129
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
130
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
131
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
132
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
133
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
134
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter(4)), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter(4))]), PolynomialRing(ZZ, ['a', 'b']).ideal(0), DegreeGrading((1,2)))
135
sage: ger._graded_monoms(3)
136
[Graded expansion a^3, Graded expansion a*b]
137
sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1 : 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter(4)), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter(4))]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
138
sage: ger._graded_monoms(3)
139
[Graded expansion a^3, Graded expansion a*b, Graded expansion c]
140
"""
141
module_gens = self.grading().basis(index)
142
module_gens = [ filter( lambda e: e != 1,
143
[ mon**ex if ex > 0 else 1
144
for mon,ex in zip(self.basegens(), g[:self.nbasegens()]) + zip(self.gens(), g[self.nbasegens():]) ] )
145
for g in module_gens ]
146
147
return [ self(reduce(operator.mul, g)) if len(g) > 1 else g[0] for g in module_gens ]
148
149
def _coerce_map_from_(self, other) :
150
r"""
151
TESTS::
152
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
153
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
154
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
155
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
156
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
157
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
158
sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), PolynomialRing(QQ, ['a', 'b']).ideal(0), DegreeGrading((1,2)))
159
sage: ger._coerce_map_from_(ZZ)
160
"""
161
if other is self.relations().ring() :
162
from sage.structure.coerce_maps import CallableConvertMap
163
164
return CallableConvertMap(other, self, self._element_constructor_)
165
166
if isinstance(other, GradedExpansionSubmodule_abstract) :
167
if other.graded_ambient() is self \
168
or self.has_coerce_map_from(other.graded_ambient()) :
169
from sage.structure.coerce_maps import CallableConvertMap
170
171
return CallableConvertMap(other, self, other._graded_expansion_submodule_to_graded_ambient_)
172
173
return Algebra._coerce_map_from_(self, other)
174
175
def _element_constructor_(self, x) :
176
r"""
177
INPUT:
178
- `x` -- An integer, an element of the underlying polynomial ring or
179
an element in a submodule of graded expansions.
180
181
OUTPUT:
182
An instance of the element class.
183
184
TESTS::
185
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
186
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
187
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
188
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
189
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
190
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
191
sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), PolynomialRing(QQ, ['a', 'b']).ideal(0), DegreeGrading((1,2)))
192
sage: h = ger(1)
193
"""
194
if isinstance(x, (int, Integer)) :
195
return self._element_class(self, self.relations().ring()(x))
196
197
P = x.parent()
198
if P is self.relations().ring() :
199
return self._element_class(self, x)
200
elif self.relations().ring().has_coerce_map_from(P) :
201
return self._element_class(self, self.relations().ring()(x))
202
elif P is self.base_ring() and isinstance( self.base_ring(), GradedExpansionAmbient_abstract ) :
203
return self._element_class(self, self.relations().ring()(x.polynomial()))
204
205
return GradedExpansionAmbient_abstract._element_constructor_(self, x)
206
207
def _repr_(self) :
208
r"""
209
TESTS::
210
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
211
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
212
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
213
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
214
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
215
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
216
sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), PolynomialRing(QQ, ['a', 'b']).ideal(0), DegreeGrading((1,2)))
217
sage: ger
218
Graded expansion ring with generators b
219
"""
220
return "Graded expansion ring with generators "\
221
+ ''.join(map(lambda e: repr(e.polynomial()) + ", ", self.gens()))[:-2]
222
223
def _latex_(self) :
224
r"""
225
TESTS::
226
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
227
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
228
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
229
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
230
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
231
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
232
sage: ger = GradedExpansionRing_class(Sequence([MonoidPowerSeries(mps, {1: 1}, mps.monoid().filter(4))]), Sequence([MonoidPowerSeries(mps, {1: 1, 2: 3}, mps.monoid().filter(4))]), PolynomialRing(QQ, ['a', 'b']).ideal(0), DegreeGrading((1,2)))
233
sage: latex(ger)
234
\text{Graded expansion ring with generators }b
235
"""
236
return r"\text{Graded expansion ring with generators }"\
237
+ ''.join(map(lambda e: latex(e.polynomial()) + ", ", self.gens()))[:-2]
238
239