Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
241849 views
1
r"""
2
Modules of elements with Fourier expansion and partially known relations.
3
4
AUTHOR :
5
-- Martin Raum (2009 - 10 - 30) 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 GradedExpansionVector_class
29
from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import GradedExpansionRing_class
30
from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import GradedExpansionSubmodule_abstract
31
from sage.misc.flatten import flatten
32
from sage.misc.latex import latex
33
from sage.modules.module import Module
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
# GradedExpansionModule_class
41
#===============================================================================
42
43
class GradedExpansionModule_class ( GradedExpansionAmbient_abstract, Module ) :
44
r"""
45
A class for a module of vector valued graded expansions
46
over an ambient of graded expansions, that might also be trivial.
47
48
SEE:
49
:class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_ring.GradedExpansionRing_class`.
50
"""
51
52
def __init__ ( self, base_ring_generators, generators, relations,
53
grading, all_relations = True, reduce_before_evaluating = True ) :
54
r"""
55
The degree one part of the monomials that correspond to generators over the
56
base expansion ring will serve as the coordinates of the elements.
57
58
INPUT:
59
- ``base_ring_generators`` -- A list of (equivariant) monoid power series with
60
coefficient domain the base ring of the coefficient
61
domain of the generators or ``None``.
62
- ``generators`` -- A list of (equivariant) monoid power series; The generators
63
of the ambient over the ring generated by the base ring
64
generators.
65
- ``relations`` -- An ideal in a polynomial ring with ``len(base_ring_generators) + len(generators)``
66
variables.
67
- ``grading`` -- A grading deriving from :class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_grading`;
68
A grading for the polynomial ring of the relations.
69
- ``all_relations`` -- A boolean (default: ``True``); If ``True`` the relations given
70
for the polynomial ring are all relations that the Fourier
71
expansion have.
72
- ``reduce_before_evaluating`` -- A boolean (default: ``True``); If ``True`` any monomial
73
will be Groebner reduced before the Fourier expansion
74
is calculated.
75
76
NOTE:
77
The grading must respect the relations of the generators.
78
79
TESTS::
80
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
81
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
82
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
83
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
84
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
85
sage: m = FreeModule(QQ, 3)
86
sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))
87
sage: mps = mpsm.base_ring()
88
sage: 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)))
89
sage: ger.base_ring()
90
Graded expansion ring with generators a
91
"""
92
if not hasattr(self, '_element_class') :
93
self._element_class = GradedExpansionVector_class
94
95
if hasattr(self, "_extended_base_ring") :
96
Module.__init__(self, self._extended_base_ring)
97
elif base_ring_generators is None or len(base_ring_generators) == 0 :
98
Module.__init__(self, relations.base_ring())
99
else :
100
gb = filter( lambda p: all( all(a == 0 for a in list(e)[len(base_ring_generators):])
101
for e in p.exponents() ),
102
relations.groebner_basis() )
103
P = PolynomialRing( relations.base_ring(),
104
list(relations.ring().variable_names())[:len(base_ring_generators)] )
105
base_relations = P.ideal(gb)
106
R = GradedExpansionRing_class(None, base_ring_generators, base_relations,
107
grading.subgrading(xrange(len(base_ring_generators))), all_relations, reduce_before_evaluating)
108
Module.__init__(self, R)
109
110
GradedExpansionAmbient_abstract.__init__(self, base_ring_generators, generators, relations, grading, all_relations, reduce_before_evaluating)
111
112
self._populate_coercion_lists_(
113
convert_list = [self.relations().ring()],
114
convert_method_name = "_graded_expansion_submodule_to_graded_ambient_" )
115
116
def _graded_monoms(self, index) :
117
r"""
118
Return all monoms in the generators that have a given grading index.
119
120
INPUT:
121
- ``index`` -- A grading values.
122
123
OUTPUT:
124
A list of elements of ``self``.
125
126
TESTS::
127
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
128
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
129
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
130
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
131
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
132
sage: m = FreeModule(QQ, 3)
133
sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))
134
sage: mps = mpsm.base_ring()
135
sage: 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)))
136
sage: ger._graded_monoms(2)
137
[Graded expansion vector (0, 1)]
138
sage: ger._graded_monoms(4)
139
[]
140
sage: 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)))
141
sage: ger._graded_monoms(3)
142
[Graded expansion vector (a, 0), Graded expansion vector (0, 1)]
143
"""
144
module_gens = self.grading().basis(index)
145
module_gens = filter(lambda e: sum(e[self.nbasegens():]) == 1, module_gens)
146
module_gens = [ filter( lambda e: e != 1,
147
[ mon**ex if ex > 1 else (mon if ex == 1 else 1)
148
for mon,ex in zip(self.basegens(), g[:self.nbasegens()]) + zip(self.gens(), g[self.nbasegens():]) ] )
149
for g in module_gens ]
150
151
return [ reduce(operator.mul, g) if len(g) > 1 else g[0] for g in module_gens ]
152
153
def _coerce_map_from_(self, other) :
154
"""
155
TESTS::
156
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
157
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
158
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
159
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
160
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
161
sage: m = FreeModule(QQ, 3)
162
sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))
163
sage: mps = mpsm.base_ring()
164
sage: 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)))
165
sage: ger._coerce_map_from_(ZZ)
166
"""
167
if other is self.relations().ring() :
168
from sage.structure.coerce_maps import CallableConvertMap
169
170
return CallableConvertMap(other, self, self._element_constructor_)
171
172
if isinstance(other, GradedExpansionSubmodule_abstract) :
173
if other.graded_ambient() is self \
174
or self.has_coerce_map_from(other.graded_ambient()) :
175
from sage.structure.coerce_maps import CallableConvertMap
176
177
return CallableConvertMap(other, self, other._graded_expansion_submodule_to_graded_ambient_)
178
179
return Module._coerce_map_from_(self, other)
180
181
def _element_constructor_(self, x) :
182
r"""
183
INPUT:
184
- `x` -- A zero integer, an element of the underlying polynomial ring or
185
an element in a submodule of graded expansions.
186
187
OUTPUT:
188
An instance of the element class.
189
190
TESTS::
191
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
192
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
193
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
194
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
195
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
196
sage: m = FreeModule(QQ, 3)
197
sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))
198
sage: mps = mpsm.base_ring()
199
sage: 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)))
200
sage: h = ger(0)
201
"""
202
if isinstance(x, (int, Integer)) and x == 0 :
203
return self._element_class(self, self.relations().ring().zero())
204
205
P = x.parent()
206
if P is self.base_ring() :
207
if x == 0 :
208
return self._element_class(self, self.relations().ring().zero())
209
210
return GradedExpansionAmbient_abstract._element_constructor_(self, x)
211
212
def _repr_(self) :
213
"""
214
TESTS::
215
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
216
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
217
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
218
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
219
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
220
sage: m = FreeModule(QQ, 3)
221
sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))
222
sage: mps = mpsm.base_ring()
223
sage: 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)))
224
sage: ger
225
Graded expansion module with generators b
226
"""
227
return "Graded expansion module with generators " \
228
+ ''.join(map(lambda e: repr(e.polynomial()) + ", ", self.gens()))[:-2]
229
230
def _latex_(self) :
231
r"""
232
TESTS::
233
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
234
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
235
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
236
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
237
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
238
sage: m = FreeModule(QQ, 3)
239
sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))
240
sage: mps = mpsm.base_ring()
241
sage: 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)))
242
sage: latex(ger)
243
\text{Graded expansion module with generators }b
244
"""
245
return r"\text{Graded expansion module with generators }" \
246
+ ''.join(map(lambda e: latex(e.polynomial()) + ", ", self.gens()))[:-2]
247
248