Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
241849 views
1
r"""
2
Finite dimensional submodules of a ring or module of graded expansions.
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.expansion_lazy_evaluation import LazyFourierExpansionEvaluation
28
from psage.modform.fourier_expansion_framework.gradedexpansions.expansion_module import ExpansionModule_abstract
29
from psage.modform.fourier_expansion_framework.gradedexpansions.expansion_module import ExpansionModule_generic, ExpansionModule_ambient_pid, \
30
ExpansionModule_submodule_pid, ExpansionModuleVector_generic
31
from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ambient import GradedExpansionAmbient_abstract
32
from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ambient import MonoidPowerSeriesAmbient_abstract
33
from sage.categories.pushout import pushout
34
from sage.interfaces.magma import magma
35
from sage.matrix.constructor import matrix
36
from sage.misc.cachefunc import cached_method
37
from sage.misc.flatten import flatten
38
from sage.misc.latex import latex
39
from sage.misc.misc import mul
40
from sage.misc.misc import union
41
from sage.modules.free_module import FreeModule, FreeModule_generic, \
42
FreeModule_ambient_pid, FreeModule_submodule_pid
43
from sage.modules.free_module import is_FreeModule
44
from sage.modules.free_module_element import FreeModuleElement_generic_dense
45
from sage.modules.free_module_element import vector
46
from sage.rings.arith import random_prime
47
from sage.rings.integer_ring import ZZ
48
from sage.rings.number_field.order import Order as NumberFieldOrder
49
from sage.rings.padics.factory import Qp
50
from sage.rings.principal_ideal_domain import PrincipalIdealDomain
51
from sage.rings.rational_field import QQ
52
from sage.rings.ring import Ring
53
from sage.structure.element import Element
54
from sage.structure.sequence import Sequence
55
56
#===============================================================================
57
# GradedExpansionSubmodule
58
#===============================================================================
59
60
def GradedExpansionSubmodule(arg1, arg2) :
61
r"""
62
A submodule of either a graded ring, module or submodule.
63
64
INPUT (first possibility):
65
- ``arg1`` -- An instance of :class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_ambient.GradedExpansionAmbient_abstract`.
66
- ``arg2`` -- A tuple, list or sequence of elements of ``arg1``.
67
INPUT (second possibility):
68
- ``arg1`` -- An instance of :class:~`.GradedExpansionSubmodule_ambient_pid` or :class:~`.GradedExpansionSubmodule_submodule_pid`.
69
- ``arg2`` -- A tuple, list or sequence of elements of ``arg1``.
70
71
NOTE:
72
The base ring of the graded expansion ambient must be an integral domain.
73
74
OUTPUT:
75
An instance of :class:~`.GradedExpansionSubmodule_abstract`.
76
77
TESTS::
78
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
79
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
80
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module 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: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
85
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
86
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
87
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
88
sage: sm = GradedExpansionSubmodule(ger, [ger.0, ger.1])
89
sage: sm = GradedExpansionSubmodule(ger, (ger.0, ger.1))
90
sage: sm = GradedExpansionSubmodule(ger, Sequence([ger.0, ger.1]))
91
sage: sm2 = GradedExpansionSubmodule(sm, [sm.0])
92
sage: m = FreeModule(QQ, 3)
93
sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))
94
sage: mps = mpsm.base_ring()
95
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)))
96
sage: sm = GradedExpansionSubmodule(ger, [ger.0])
97
"""
98
if isinstance(arg1, GradedExpansionAmbient_abstract) :
99
base_ring = arg1.relations().base_ring()
100
101
if base_ring.is_field() or \
102
isinstance(base_ring, PrincipalIdealDomain) or \
103
isinstance(base_ring, NumberFieldOrder) \
104
and base_ring.is_maximal() and base_ring.class_number() == 1 :
105
return GradedExpansionSubmodule_ambient_pid(arg1, arg2)
106
else :
107
return GradedExpansionSubmodule_generic(arg1, arg2, len(arg2))
108
elif isinstance(arg1, GradedExpansionSubmodule_ambient_pid) \
109
or isinstance(arg1, GradedExpansionSubmodule_submodule_pid) :
110
return GradedExpansionSubmodule_submodule_pid(arg1, arg2)
111
112
raise ValueError( "Cannot construct a new subspace from %s, %s" % (arg1, arg2) )
113
114
#===============================================================================
115
# GradedExpansionSubmodule_abstract
116
#===============================================================================
117
118
class GradedExpansionSubmodule_abstract ( ExpansionModule_abstract ) :
119
r"""
120
Abstract implementation of a finite dimensional module of graded expansions
121
within an ambient.
122
123
SEE:
124
:class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_ambient.GradedExpansion_ambient`.
125
"""
126
127
def __init__(self, graded_ambient, basis, degree, **kwds) :
128
r"""
129
INPUT:
130
- ``graded_ambient`` -- An instance of :class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_ambient.GradedExpansionAmbient_abstract`.
131
- ``basis`` -- A tuple, list or sequence of elements of the graded ambient.
132
- ``degree`` -- An integer; The degree of the module within its ambient module.
133
134
NOTE:
135
The base ring of the graded expansion ambient must be an integral domain.
136
137
TESTS::
138
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
139
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
140
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
141
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
142
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
143
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
144
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
145
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
146
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
147
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
148
sage: sm = GradedExpansionSubmodule_abstract(ger, Sequence([ger.0, ger.1]), 3)
149
sage: sm = GradedExpansionSubmodule_abstract(ger, Sequence([ger.0, ger.1]), 2, no_expansion_init = True)
150
sage: m = FreeModule(QQ, 3)
151
sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))
152
sage: mps = mpsm.base_ring()
153
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)))
154
sage: sm = GradedExpansionSubmodule_abstract(ger, [ger.0], 1)
155
"""
156
self.__graded_ambient = graded_ambient
157
self.__basis_in_graded_ambient = basis
158
159
if not "no_expansion_init" in kwds or not kwds["no_expansion_init"] :
160
if graded_ambient.fourier_expansion_precision().is_infinite() or isinstance(self.__graded_ambient.fourier_ring(), MonoidPowerSeriesAmbient_abstract) :
161
ExpansionModule_abstract.__init__(self, Sequence( map( lambda b: b.fourier_expansion(), basis ),
162
universe = graded_ambient.fourier_ring() ))
163
else :
164
ExpansionModule_abstract.__init__(self, Sequence( map( lambda b: LazyFourierExpansionEvaluation( graded_ambient.fourier_ring(), b,
165
graded_ambient.fourier_expansion_precision() ),
166
basis ),
167
universe = graded_ambient.fourier_ring(), check = False ))
168
169
def graded_ambient(self) :
170
r"""
171
The graded ambientm, namely, the graded ring or module
172
``self`` is a submodule of.
173
174
OUTPUT:
175
An instance of :class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_ambient.GradedExpansionAmbient_abstract`.
176
177
TESTS::
178
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
179
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
180
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
181
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
182
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
183
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
184
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
185
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
186
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
187
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
188
sage: sm = GradedExpansionSubmodule_abstract(ger, Sequence([ger.0, ger.1]), 3)
189
sage: sm.graded_ambient() is ger
190
True
191
"""
192
return self.__graded_ambient
193
194
def _basis_in_graded_ambient(self) :
195
r"""
196
A basis for ``self`` in terms of elements of the graded ambient.
197
198
OUTPUT:
199
A sequence of elements of the graded ambient.
200
201
TESTS::
202
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
203
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
204
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
205
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
206
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
207
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
208
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
209
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
210
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
211
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
212
sage: sm = GradedExpansionSubmodule_abstract(ger, Sequence([ger.0, ger.1]), 3)
213
sage: sm._basis_in_graded_ambient() == Sequence([ger.0, ger.1])
214
True
215
"""
216
return self.__basis_in_graded_ambient
217
218
@cached_method
219
def _reduced_basis_polynomials(self, coerce_to = None) :
220
r"""
221
A list of reduced polynomials associated to the basis of ``self``
222
within the graded ambient. If coerce_to is not None, these elements
223
will first be coerced into ``coerce_to`` and the resulting polynomials
224
will be returned.
225
226
INPUT:
227
- ``coerce_to`` -- A graded ambient or ``None`` (default: ``None``);
228
See the discription above.
229
230
OUTPUT:
231
A Sequence of polynomials.
232
233
TESTS::
234
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
235
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
236
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
237
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
238
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
239
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
240
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
241
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
242
sage: K.<rho> = CyclotomicField(6)
243
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
244
sage: P.<a, b, c> = PolynomialRing(K)
245
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
246
sage: ger2 = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), P.ideal(a - b), DegreeGrading((1,2,3)))
247
sage: sm = GradedExpansionSubmodule_abstract(ger, Sequence([ger.0, ger.1]), 3)
248
sage: sm._reduced_basis_polynomials()
249
[a, b]
250
251
We need to introduce a workaround for coercions as long as graded expansion ambients do not
252
support coercion from one to another. Since the doctests to not allow for class definitions,
253
we hack an instance of an arbitrary Python class.
254
::
255
sage: from htmllib import HTMLParser
256
sage: coerce_workaround = HTMLParser('')
257
sage: setattr(coerce_workaround, '__call__', lambda e : ger2(P(e.polynomial())))
258
sage: setattr(coerce_workaround, 'relations', lambda : ger2.relations())
259
sage: sm._reduced_basis_polynomials(coerce_to = coerce_workaround)[0].parent().base_ring()
260
Cyclotomic Field of order 6 and degree 2
261
"""
262
if coerce_to is None :
263
coerced_basis = self.__basis_in_graded_ambient
264
relations = self.graded_ambient().relations()
265
else :
266
coerced_basis = map(coerce_to, self.__basis_in_graded_ambient)
267
relations = coerce_to.relations()
268
269
return Sequence( [ relations.reduce(b.polynomial())
270
for b in coerced_basis ],
271
universe = relations.ring() )
272
273
@cached_method
274
def _non_zero_monomials(self, coerce_to = None) :
275
r"""
276
A list of monomials which occur in the reduced polynomials
277
associated with the basis of ``self``.
278
279
INPUT:
280
- ``coerce_to`` -- A graded ambient or ``None`` (default: ``None``);
281
Will be forwarded to :meth:~`._reduced_basis_polynomials`.
282
283
OUTPUT:
284
A sequence of monomials.
285
286
SEE::
287
:meth:~`._reduced_basis_polynomials`.
288
289
TESTS::
290
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
291
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
292
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
293
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
294
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
295
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
296
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
297
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
298
sage: K.<rho> = CyclotomicField(6)
299
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
300
sage: P.<a, b, c> = PolynomialRing(K)
301
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
302
sage: ger2 = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), P.ideal(a - b), DegreeGrading((1,2,3)))
303
sage: sm = GradedExpansionSubmodule_abstract(ger, Sequence([ger.0, ger.1]), 3)
304
sage: sm._non_zero_monomials()
305
[a, b]
306
sage: from htmllib import HTMLParser
307
sage: coerce_workaround = HTMLParser('')
308
sage: setattr(coerce_workaround, '__call__', lambda e : ger2(P(e.polynomial())))
309
sage: setattr(coerce_workaround, 'relations', lambda : ger2.relations())
310
sage: sm._non_zero_monomials(coerce_to = coerce_workaround)
311
[b]
312
"""
313
red_basis = self._reduced_basis_polynomials(coerce_to = coerce_to)
314
315
return Sequence( reduce(union, [set(b.monomials()) for b in red_basis], set()),
316
universe = red_basis.universe() )
317
318
@cached_method
319
def _monomial_homomorphism(self, coerce_to = None) :
320
r"""
321
A homomorphism that maps the underlying module to a vector space
322
where each component corresponds to a coefficient of the polynomial
323
associated to elements of ``self`` within the graded ambient or
324
``coerce_to``.
325
326
INPUT:
327
- ``coerce_to`` -- A graded ambient or ``None`` (default: ``None``);
328
Will be forwarded to :meth:~`._reduced_basis_polynomials`.
329
330
OUTPUT:
331
A morphism from ``self`` to a vector space.
332
333
NOTE:
334
The homomorphism is defined over a fraction field of the base ring
335
of the monomials.
336
337
SEE:
338
:meth:~`._non_zero_monomials` and :meth:~`._reduced_basis_polynomials`.
339
340
TESTS::
341
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
342
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
343
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
344
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
345
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
346
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
347
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
348
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
349
sage: K.<rho> = CyclotomicField(6)
350
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
351
sage: P.<a, b, c> = PolynomialRing(K)
352
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
353
sage: ger2 = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), P.ideal(a - b), DegreeGrading((1,2,3)))
354
sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]), 3)
355
sage: sm._monomial_homomorphism()
356
Free module morphism defined by the matrix
357
[1 0]
358
[0 1]
359
Domain: Submodule of Graded expansion ring with generators a, b, c
360
Codomain: Vector space of dimension 2 over Rational Field
361
sage: from htmllib import HTMLParser
362
sage: coerce_workaround = HTMLParser('')
363
sage: setattr(coerce_workaround, '__call__', lambda e : ger2(P(e.polynomial())))
364
sage: setattr(coerce_workaround, 'relations', lambda : ger2.relations())
365
sage: sm._monomial_homomorphism(coerce_to = coerce_workaround)
366
Free module morphism defined by the matrix
367
[1]
368
[1]
369
Domain: Submodule of Graded expansion ring with generators a, b, c
370
Codomain: Vector space of dimension 1 over Cyclotomic Field of order 6 ...
371
"""
372
reduced_basis = self._reduced_basis_polynomials(coerce_to = coerce_to)
373
all_mons = self._non_zero_monomials(coerce_to = coerce_to)
374
375
codomain = FreeModule(all_mons.universe().base_ring().fraction_field(), len(all_mons))
376
basis_images = [ codomain([b.monomial_coefficient(m) for m in all_mons])
377
for b in reduced_basis ]
378
379
return self.hom(basis_images)
380
381
382
def _ambient_element_to_monomial_coefficients_generator(self, x, reduce = False, coerce_basis_to = None) :
383
r"""
384
Given an element `x` of the graded ambient ring or space return a generator
385
corresponding to the image of `x` with respect to the morphism returned
386
by :meth:~`._monomial_homomorphism`.
387
388
INPUT:
389
- `x` -- An element of the graded ambient.
390
- ``reduce`` -- A boolean (default: ``False``); If ``True`` the polynomial
391
attached to `x` will be reduced.
392
- ``coerce_basis_to`` -- A graded ambient or ``None`` (default: ``None``);
393
If not ``None`` the basis of ``self`` and `x` will be
394
coerced before determining the monomials.
395
396
OUTPUT:
397
A generator over elements in the monomials' base ring.
398
399
SEE:
400
:meth:~`._monomial_homomorphism`.
401
402
TESTS::
403
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
404
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
405
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
406
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
407
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
408
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
409
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
410
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
411
sage: K.<rho> = CyclotomicField(6)
412
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
413
sage: P.<a, b, c> = PolynomialRing(K)
414
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
415
sage: ger2 = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), P.ideal(a - b), DegreeGrading((1,2,3)))
416
sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]), 3)
417
sage: list( sm._ambient_element_to_monomial_coefficients_generator(ger.2) )
418
[0, 0]
419
sage: from htmllib import HTMLParser
420
sage: coerce_workaround = HTMLParser('')
421
sage: setattr(coerce_workaround, '__call__', lambda e : ger2(P(e.polynomial())))
422
sage: setattr(coerce_workaround, 'relations', lambda : ger2.relations())
423
sage: list( sm._ambient_element_to_monomial_coefficients_generator(ger.2, coerce_basis_to = coerce_workaround) )
424
[0]
425
sage: list( sm._ambient_element_to_monomial_coefficients_generator(ger.1, reduce = True, coerce_basis_to = coerce_workaround) )
426
[1]
427
"""
428
if not coerce_basis_to is None :
429
x = coerce_basis_to(x)
430
if reduce :
431
x = x._reduce_polynomial()
432
else :
433
x = x.polynomial()
434
435
return ( x.monomial_coefficient(m)
436
for m in self._non_zero_monomials(coerce_to = coerce_basis_to) )
437
438
def coordinates(self, x, in_base_ring = True, force_ambigous = False) :
439
r"""
440
The coordinates in ``self`` of an element either of the following:
441
- The graded ambient,
442
- An element of a submodule,
443
- An expansion in the parent of the basis' expansions.
444
445
INPUT:
446
- `x` -- Either of the types listed above.
447
- ``in_base_ring`` -- A boolean (default: ``True``); If ``True``
448
enforce the result to be definied over the
449
base ring of ``self``.
450
- ``force_ambigous`` -- A boolean (default: ``False``); If ``True``
451
also return the solutions that are not unique.
452
453
OUTPUT:
454
A list of elements in the base ring or and extension of it.
455
456
NOTE:
457
If the Fourier expansion of `x` lakes sufficient precision the
458
expansions associated to ``self`` will be truncated.
459
460
TESTS::
461
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
462
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
463
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
464
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
465
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
466
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
467
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
468
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
469
sage: K.<rho> = CyclotomicField(6)
470
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
471
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
472
sage: ger2 = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(K, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
473
sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))
474
sage: sm2 = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.2]))
475
sage: sm3 = GradedExpansionSubmodule_ambient_pid(ger2, Sequence([ger2.0, ger2.2]))
476
sage: sm.coordinates(ger.2)
477
Traceback (most recent call last):
478
...
479
ArithmeticError: Graded expansion c is not contained in this space.
480
sage: sm.coordinates(sm2.0)
481
[1, 0]
482
sage: sm.coordinates(sm2.1)
483
Traceback (most recent call last):
484
...
485
ArithmeticError: Graded expansion c is not contained in this space.
486
sage: sm.coordinates(sm3.0)
487
Traceback (most recent call last):
488
...
489
ArithmeticError: No coordinates for (1, 0).
490
"""
491
if isinstance(x, Element) :
492
P = x.parent()
493
if P is self :
494
if self.ambient_module() is self :
495
return x.list()
496
else :
497
return list(self.coordinate_vector(x))
498
499
if self.graded_ambient().has_coerce_map_from(P) :
500
if not P is self.graded_ambient() :
501
x = self.graded_ambient()(x)
502
#x = x.polynomial()
503
504
if not set(x._reduce_polynomial().monomials()).issubset(set(self._non_zero_monomials())) :
505
raise ArithmeticError( "%s is not contained in this space." % (x,) )
506
507
mon_matrix = self._monomial_homomorphism().matrix().transpose()
508
x_mon_vector = vector( self.base_ring().fraction_field(),
509
self._ambient_element_to_monomial_coefficients_generator(x, True) )
510
511
512
## TODO: use linbox
513
try :
514
coords = magma(mon_matrix.transpose()).Solution(magma(matrix(x_mon_vector))).sage()
515
coords = coords.row(0)
516
except TypeError, msg :
517
if "Runtime error in 'Solution': No solution exists" in msg :
518
raise ArithmeticError( "%s is not contained in this space." % (x,) )
519
520
try :
521
coords = mon_matrix.solve_right(x_mon_vector)
522
except ValueError :
523
raise ArithmeticError( "%s is not contained in this space." % (x,) )
524
525
try :
526
# we used the base graded_ambient's fraction field, so convert it
527
return [self.base_ring()(c) for c in coords]
528
except TypeError :
529
if in_base_ring :
530
raise ArithmeticError( "%s is not contained in this space." % (x,) )
531
else :
532
return coords.list()
533
534
#! elif self.graded_ambient().has_coerce_map_from(P) :
535
elif P.has_coerce_map_from(self.graded_ambient()) :
536
#x = x.polynomial()
537
538
mon_matrix = self._monomial_homomorphism().matrix().transpose()
539
mon_matrix = matrix(P.base_ring().fraction_field(), mon_matrix)
540
541
x_mon_vector = vector( P.base_ring().fraction_field(),
542
self._ambient_element_to_monomial_coefficients_generator(x, True, P) )
543
544
try :
545
coords = mon_matrix.solve_right(x_mon_vector)
546
except ValueError :
547
raise ArithmeticError( "%s is not contained in the image of this space." % (x,) )
548
549
try :
550
# we used the base graded_ambient's fraction field, so convert it
551
return [self.base_ring()(c) for c in coords]
552
except TypeError :
553
if in_base_ring :
554
raise ArithmeticError( "%s is not contained in the image of this space." % (x,) )
555
else :
556
return coords.list()
557
558
#! elif P.has_coerce_map_from(self.graded_ambient()) :
559
#! if isinstance(x, (tuple, Element)) :
560
561
return ExpansionModule_abstract.coordinates(self, x, in_base_ring, force_ambigous)
562
563
def _graded_expansion_submodule_to_graded_ambient_(self, x) :
564
r"""
565
The element `x` of ``self`` as an element of the graded ambient ring or space.
566
567
INPUT:
568
- `x` -- An element of self.
569
570
OUTPUT:
571
An element of the graded ambient.
572
573
TESTS::
574
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
575
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
576
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
577
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
578
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
579
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
580
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
581
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
582
sage: K.<rho> = CyclotomicField(6)
583
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
584
sage: P.<a, b, c> = PolynomialRing(K)
585
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
586
sage: ger2 = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), P.ideal(a - b), DegreeGrading((1,2,3)))
587
sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))
588
sage: sm._graded_expansion_submodule_to_graded_ambient_(2*sm.0 + 3*sm.1)
589
Graded expansion 2*a + 3*b
590
"""
591
return sum( map(mul, self.coordinates(x), self._basis_in_graded_ambient()) )
592
593
def _repr_(self) :
594
r"""
595
TESTS::
596
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
597
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
598
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
599
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
600
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
601
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
602
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
603
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
604
sage: K.<rho> = CyclotomicField(6)
605
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
606
sage: P.<a, b, c> = PolynomialRing(K)
607
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
608
sage: ger2 = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), P.ideal(a - b), DegreeGrading((1,2,3)))
609
sage: GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))
610
Submodule of Graded expansion ring with generators a, b, c
611
"""
612
return "Submodule of %s" % (self.__graded_ambient,)
613
614
def _latex_(self) :
615
r"""
616
TESTS::
617
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
618
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
619
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
620
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
621
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
622
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
623
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
624
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
625
sage: K.<rho> = CyclotomicField(6)
626
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
627
sage: P.<a, b, c> = PolynomialRing(K)
628
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
629
sage: ger2 = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), P.ideal(a - b), DegreeGrading((1,2,3)))
630
sage: latex( GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1])) )
631
\text{Submodule of }\text{Graded expansion ring with generators }a , b , c
632
"""
633
return r"\text{Submodule of }%s" % (latex(self.__graded_ambient),)
634
635
#===============================================================================
636
# GradedExpansionSubmodule_generic
637
#===============================================================================
638
639
class GradedExpansionSubmodule_generic ( GradedExpansionSubmodule_abstract, ExpansionModule_generic ) :
640
r"""
641
A finite dimensional module of graded expansions within an ambient.
642
643
SEE:
644
:class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_ambient.GradedExpansion_ambient`.
645
"""
646
647
def __init__(self, graded_ambient, basis, degree, **kwds) :
648
r"""
649
INPUT:
650
- ``graded_ambient`` -- An instance of :class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_ambient.GradedExpansionAmbient_abstract`.
651
- ``basis`` -- A tuple, list or sequence of elements of the graded ambient.
652
- ``degree`` -- An integer; The degree of the module within its ambient module.
653
654
NOTE:
655
The base ring of the graded expansion ambient must be an integral domain.
656
657
TESTS::
658
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
659
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
660
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
661
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
662
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
663
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
664
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
665
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
666
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
667
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
668
sage: sm = GradedExpansionSubmodule_generic(ger, Sequence([ger.0, ger.1]), 3)
669
sage: sm = GradedExpansionSubmodule_generic(ger, Sequence([ger.0, ger.1]), 2, _element_class = GradedExpansionSubmoduleVector_generic, no_expansion_init = True)
670
"""
671
if not hasattr(self, '_element_class') :
672
if '_element_class' in kwds :
673
self._element_class = kwds['_element_class']
674
else :
675
self._element_class = GradedExpansionSubmoduleVector_generic
676
677
GradedExpansionSubmodule_abstract.__init__(self, graded_ambient, basis, degree)
678
ExpansionModule_generic.__init__(self, self._abstract_basis(), degree, **kwds)
679
680
def change_ring(self, R):
681
r"""
682
Return the ambient module of graded expansions over `R` with the same basis as ``self``.
683
684
INPUT:
685
- `R` -- A ring.
686
687
OUTPUT:
688
An instance of :class:~`.GradedExpansionSubmodule_generic`.
689
690
TESTS::
691
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
692
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
693
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
694
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
695
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
696
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
697
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
698
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
699
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
700
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
701
sage: sm = GradedExpansionSubmodule_generic(ger, Sequence([ger.0, ger.1]), 3)
702
sage: sm.change_ring(QQ) is sm
703
True
704
sage: sm.change_ring(PolynomialRing(QQ, 'x'))
705
Traceback (most recent call last):
706
...
707
ValueError: Associated expansion of graded ambient not defined over Univariate Polynomial Ring in x over Rational Field.
708
"""
709
if self.base_ring() == R:
710
return self
711
712
raise ValueError( "Associated expansion of graded ambient not defined over %s." % R )
713
714
def basis(self) :
715
r"""
716
A basis of ``self``.
717
718
OUTPUT:
719
A list of elements of ``self``.
720
721
TESTS::
722
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
723
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
724
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
725
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
726
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
727
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
728
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
729
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
730
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
731
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
732
sage: sm = GradedExpansionSubmodule_generic(ger, Sequence([ger.0, ger.1]), 3)
733
sage: sm.basis()
734
Traceback (most recent call last):
735
...
736
NotImplementedError
737
"""
738
raise NotImplementedError
739
740
def hom(self, other) :
741
r"""
742
TESTS::
743
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
744
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
745
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
746
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
747
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
748
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
749
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
750
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
751
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
752
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
753
sage: sm = GradedExpansionSubmodule_generic(ger, Sequence([ger.0, ger.1]), 3)
754
sage: m = FreeModule(QQ, 2)
755
sage: sm.hom([m([1,0]),m([1,1])])
756
Free module morphism defined by the matrix
757
[1 0]
758
[1 1]
759
Domain: Submodule of Graded expansion ring with generators a, b, c
760
Codomain: Vector space of dimension 2 over Rational Field
761
sage: sm.hom(sm)
762
Traceback (most recent call last):
763
...
764
NotImplementedError
765
"""
766
if isinstance(other, GradedExpansionSubmodule_abstract) and \
767
self.graded_ambient() == other.graded_ambient() :
768
raise NotImplementedError
769
else :
770
images = other
771
772
return FreeModule_generic.hom(self, images)
773
774
#===============================================================================
775
# _span
776
# This will be used in GradedExpansionSubmodule_ambient_pid and
777
# GradedExpansionSubmodule_submodule_pid
778
#===============================================================================
779
780
def _span( self, gens, base_ring = None, check = True, already_echelonized = False ) :
781
r"""
782
The submodule of graded expansions spanned by ``gens``.
783
784
INPUT:
785
- ``gens`` -- A list, tuple or sequence of module elements.
786
- ``base_ring`` -- A ring or ``None`` (default: ``None``); If ``None``
787
the base ring of ``self`` will be used.
788
- ``check`` -- A boolean (default: ``True``); If ``True`` check
789
whether the generators are appropriately coerced.
790
- ``already_echelonized`` -- A boolean (default: ``False``); If ``True``
791
the generators are already in echelon form
792
with respect to the ambient's basis.
793
794
OUTPUT:
795
An instance of :class:~`.GradedExpansionSubmodule_submodule_pid`.
796
797
TESTS::
798
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
799
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
800
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
801
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
802
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
803
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
804
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
805
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
806
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
807
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
808
sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))
809
sage: sms = sm.span([sm.0])
810
sage: sms = sm.span([sm.0], base_ring = PolynomialRing(QQ, 'x'))
811
Traceback (most recent call last):
812
...
813
ValueError: Associated expansion of graded ambient not defined over Univariate Polynomial Ring in x over Rational Field.
814
"""
815
if is_FreeModule(gens):
816
gens = gens.gens()
817
if not isinstance(gens, (list, tuple, Sequence)):
818
raise TypeError, "Argument gens (= %s) must be a list, tuple, or sequence."%gens
819
820
if base_ring is None or base_ring == self.base_ring():
821
gens = Sequence(gens, check = check, universe = self.ambient_module())
822
823
return GradedExpansionSubmodule_submodule_pid( self.ambient_module(), gens )
824
else:
825
try:
826
M = self.change_ring(base_ring)
827
except TypeError:
828
raise ValueError, "Argument base_ring (= %s) is not compatible " % (base_ring,) + \
829
"with the base field (= %s)." % (self.base_field(),)
830
try:
831
return M.span(gens)
832
except TypeError:
833
raise ValueError, "Argument gens (= %s) is not compatible " % (gens,) + \
834
"with base_ring (= %s)." % (base_ring,)
835
836
#===============================================================================
837
# GradedExpansionSubmodule_ambient_pid
838
#===============================================================================
839
840
class GradedExpansionSubmodule_ambient_pid ( GradedExpansionSubmodule_abstract, ExpansionModule_ambient_pid ) :
841
"""
842
An ambient module of graded expansions expansions over a principal ideal domain.
843
"""
844
845
def __init__(self, graded_ambient, basis, _element_class = None, **kwds) :
846
r"""
847
INPUT:
848
- ``graded_ambient`` -- An instance of :class:~`fourier_expansion_framework.gradedexpansions.gradedexpansion_ambient.GradedExpansionAmbient_abstract`.
849
- ``basis`` -- A list or sequence of (equivariant) monoid power series.
850
- ``element_class`` -- A type or ``None`` (default: ``None``); The element class
851
attached to ``self``. If ``None`` :class:~`.GradedExpansionSubmoduleVector_generic`
852
will be used.
853
- ``kwds`` -- Will be forwarded to :class:~`fourier_expansion_module.gradedexpansions.expansion_module.ExpansionModule_ambient_pid`
854
and :class:~`.GradedExpansionSubmodule_abstract`.
855
856
TESTS::
857
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
858
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
859
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
860
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
861
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
862
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
863
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
864
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
865
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
866
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
867
sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))
868
sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]), _element_class = GradedExpansionSubmoduleVector_generic, no_expansion_init = True)
869
Traceback (most recent call last):
870
...
871
AttributeError: 'GradedExpansionSubmodule_ambient_pid' object has no attribute '_ExpansionModule_abstract__abstract_basis'
872
"""
873
if not hasattr(self, '_element_class') :
874
if not _element_class is None :
875
self._element_class = _element_class
876
else :
877
self._element_class = GradedExpansionSubmoduleVector_generic
878
879
GradedExpansionSubmodule_abstract.__init__(self, graded_ambient, basis, len(basis), **kwds)
880
ExpansionModule_ambient_pid.__init__(self, self._abstract_basis(), **kwds)
881
882
global _span
883
span = _span
884
885
def change_ring(self, R):
886
r"""
887
Return the ambient module of graded expansions over `R` with the
888
same basis as ``self``.
889
890
INPUT:
891
- `R` -- A ring.
892
893
OUTPUT:
894
An instance of :class:~`.GradedExpansionSubmodule_ambient_pid`.
895
896
TESTS::
897
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
898
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
899
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
900
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
901
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
902
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
903
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
904
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
905
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
906
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
907
sage: sm = GradedExpansionSubmodule_generic(ger, Sequence([ger.0, ger.1]), 3)
908
sage: sm.change_ring(QQ) is sm
909
True
910
sage: sm.change_ring(PolynomialRing(QQ, 'x'))
911
Traceback (most recent call last):
912
...
913
ValueError: Associated expansion of graded ambient not defined over Univariate Polynomial Ring in x over Rational Field.
914
"""
915
if self.base_ring() == R:
916
return self
917
918
raise ValueError( "Associated expansion of graded ambient not defined over %s." % R )
919
920
def hom(self, other) :
921
r"""
922
TESTS::
923
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
924
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
925
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
926
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
927
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
928
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
929
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
930
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
931
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
932
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
933
sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))
934
sage: sm2 = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.2, ger.1]))
935
sage: m = FreeModule(QQ, 2)
936
sage: sm.hom(sm2)
937
Free module morphism defined by the matrix
938
[1 0 0]
939
[0 0 1]
940
Domain: Submodule of Graded expansion ring with generators a, b, c
941
Codomain: Submodule of Graded expansion ring with generators a, b, c
942
sage: sm.hom([m([1,0]),m([1,1])])
943
Free module morphism defined by the matrix
944
[1 0]
945
[1 1]
946
Domain: Submodule of Graded expansion ring with generators a, b, c
947
Codomain: Vector space of dimension 2 over Rational Field
948
"""
949
if isinstance(other, GradedExpansionSubmodule_abstract) and \
950
self.graded_ambient() == other.graded_ambient() :
951
images = [other(b) for b in self._basis_in_graded_ambient()]
952
else :
953
images = other
954
955
return FreeModule_ambient_pid.hom(self, images)
956
957
#===============================================================================
958
# GradedExpansionSubmodule_submodule_pid
959
#===============================================================================
960
961
class GradedExpansionSubmodule_submodule_pid ( GradedExpansionSubmodule_abstract, ExpansionModule_submodule_pid ) :
962
r"""
963
A submodule of another module of graded expansions over a principal ideal domain.
964
"""
965
966
def __init__(self, ambient, gens, element_class = None, **kwds) :
967
r"""
968
INPUT:
969
- ``ambient`` -- An instance of :class:~`.GradedExpansionSubmodule_submodule_pid` :class:~`.GradedExpansionSubmodule_submodule_pid` or .
970
- ``gens`` -- A tuple, list or sequence of elements of ``ambient``.
971
- ``element_class`` -- A type or ``None`` (default: ``None``); The element class
972
attached to ``self``. If ``None`` :class:~`.GradedExpansionSubmoduleVector_generic`
973
will be used.
974
- ``kwds`` -- Will be forwarded to :class:~`fourier_expansion_module.gradedexpansions.expansion_module.ExpansionModule_submodule_pid`
975
and :class:~`.GradedExpansionSubmodule_abstract`.
976
977
TESTS::
978
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
979
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
980
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
981
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
982
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
983
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
984
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
985
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
986
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
987
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
988
sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))
989
sage: sms = GradedExpansionSubmodule_submodule_pid(sm, [sm.0, sm.1])
990
sage: sms = GradedExpansionSubmodule_submodule_pid(sm, [sm.0, sm.1], _element_class = GradedExpansionSubmoduleVector_generic, no_expansion_init = True)
991
"""
992
if not hasattr(self, '_element_class') :
993
if not element_class is None :
994
self._element_class = element_class
995
else :
996
self._element_class = GradedExpansionSubmoduleVector_generic
997
998
GradedExpansionSubmodule_abstract.__init__( self, ambient.graded_ambient(),
999
[ambient.graded_ambient()(g) for g in gens], ambient.dimension(),
1000
**kwds )
1001
ExpansionModule_submodule_pid.__init__(self, ambient, gens, **kwds)
1002
1003
global _span
1004
span = _span
1005
1006
def change_ring(self, R):
1007
r"""
1008
Return the ambient module of graded expansions over `R` with the
1009
same basis as ``self``.
1010
1011
INPUT:
1012
- `R` -- A ring.
1013
1014
OUTPUT:
1015
An instance of :class:~`.GradedExpansionSubmodule_ambient_pid`.
1016
1017
TESTS::
1018
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
1019
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
1020
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
1021
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
1022
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
1023
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
1024
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
1025
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
1026
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
1027
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
1028
sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))
1029
sage: sms = GradedExpansionSubmodule_submodule_pid(sm, [sm.0, sm.1])
1030
sage: sms.change_ring(QQ) is sms
1031
True
1032
sage: sms.change_ring(PolynomialRing(QQ, 'x'))
1033
Traceback (most recent call last):
1034
...
1035
ValueError: Associated expansion of graded ambient not defined over Univariate Polynomial Ring in x over Rational Field.
1036
"""
1037
if self.base_ring() == R:
1038
return self
1039
1040
raise ValueError( "Associated expansion of graded ambient not defined over %s." % R )
1041
1042
def hom(self, other) :
1043
r"""
1044
TESTS::
1045
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
1046
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
1047
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
1048
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
1049
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
1050
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
1051
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
1052
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
1053
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
1054
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
1055
sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))
1056
sage: sms = GradedExpansionSubmodule_submodule_pid(sm, [sm.0, sm.1])
1057
sage: sms2 = GradedExpansionSubmodule_submodule_pid(sm, [sm.0, sm.0 + sm.1])
1058
sage: m = FreeModule(QQ, 2)
1059
sage: sms.hom(sms2)
1060
Free module morphism defined by the matrix
1061
[1 0]
1062
[0 1]
1063
Domain: Submodule of Graded expansion ring with generators a, b, c
1064
Codomain: Submodule of Graded expansion ring with generators a, b, c
1065
sage: sms.hom([m([1,0]),m([1,1])])
1066
Free module morphism defined by the matrix
1067
[1 0]
1068
[1 1]
1069
Domain: Submodule of Graded expansion ring with generators a, b, c
1070
Codomain: Vector space of dimension 2 over Rational Field
1071
"""
1072
if isinstance(other, GradedExpansionSubmodule_abstract) and \
1073
self.graded_ambient() == other.graded_ambient() :
1074
images = [other(b) for b in self._basis_in_graded_ambient()]
1075
else :
1076
images = other
1077
1078
return FreeModule_submodule_pid.hom(self, images)
1079
1080
#===============================================================================
1081
# GradedExpansionSubmoduleVector_generic
1082
#===============================================================================
1083
1084
class GradedExpansionSubmoduleVector_generic ( ExpansionModuleVector_generic ) :
1085
r"""
1086
A generic implementation of an element in a module of graded expansions.
1087
"""
1088
1089
def __copy__(self) :
1090
r"""
1091
Return a copy of ``self``.
1092
1093
OUTPUT:
1094
An instance of :class:~`.GradedExpansionSubmoduleVector_generic`.
1095
1096
TESTS::
1097
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
1098
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
1099
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
1100
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
1101
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
1102
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
1103
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
1104
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
1105
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
1106
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
1107
sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))
1108
sage: h = GradedExpansionSubmoduleVector_generic(sm, [1,0])
1109
sage: copy(h)
1110
(1, 0)
1111
"""
1112
return GradedExpansionSubmoduleVector_generic( self.parent(), self.list(), coerce = False, copy = True )
1113
1114
1115
def polynomial(self) :
1116
r"""
1117
Return the polynomial associated to ``self`` in the graded ambient
1118
of its parent.
1119
1120
OUTPUT:
1121
A polynomial in the polynomial ring attached to the graded ambient.
1122
1123
TESTS::
1124
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
1125
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
1126
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
1127
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
1128
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_grading import DegreeGrading
1129
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_ring import *
1130
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_module import *
1131
sage: from psage.modform.fourier_expansion_framework.gradedexpansions.gradedexpansion_submodule import *
1132
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
1133
sage: ger = GradedExpansionRing_class(None, Sequence([MonoidPowerSeries(mps, {1 : 4, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {1 : 1, 2 : 3}, mps.monoid().filter_all()), MonoidPowerSeries(mps, {2 : 1, 3: 6, 4 : 9}, mps.monoid().filter_all())]), PolynomialRing(QQ, ['a', 'b', 'c']).ideal(0), DegreeGrading((1,2,3)))
1134
sage: sm = GradedExpansionSubmodule_ambient_pid(ger, Sequence([ger.0, ger.1]))
1135
sage: h = GradedExpansionSubmoduleVector_generic(sm, [1,0])
1136
sage: h.polynomial()
1137
a
1138
"""
1139
return sum( self[k]*self.parent()._basis_in_graded_ambient()[k].polynomial()
1140
for k in xrange(self.parent().rank()) )
1141
1142