Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
241852 views
1
r"""
2
Monoid power series and equivariant monoid power series.
3
4
AUTHOR :
5
-- Martin Raum (2009 - 07 - 25) 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 copy import copy
28
from sage.algebras.algebra_element import AlgebraElement
29
from sage.misc.latex import latex
30
from sage.misc.misc import union
31
from sage.modules.module import Module
32
from sage.modules.module_element import ModuleElement
33
from sage.rings.ring import Ring
34
35
#===============================================================================
36
# MonoidPowerSeries
37
#===============================================================================
38
39
def MonoidPowerSeries( parent, coefficients, precision, cleanup_coefficients = False) :
40
r"""
41
Create a monoid power series within a given parent.
42
43
INPUT:
44
- ``parent`` -- A ring or module of monoid power series.
45
- ``coefficients`` -- A dictionary with keys in the parent's monoid and values
46
in the parent coefficient domain.
47
- ``precision`` -- A filter for the parent's monoid.
48
- ``cleanup_coefficients`` -- A boolean (default: ``False``); If ``True`` zero
49
coefficients will be erased from the dictionary.
50
51
OUTPUT:
52
An instance of :class:~`.MonoidPowerSeries_abstract`.
53
54
EXAMPLES::
55
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
56
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
57
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
58
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
59
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
60
sage: h = MonoidPowerSeries(mps, {1 : 1}, mps.monoid().filter(3))
61
62
TESTS::
63
sage: h = MonoidPowerSeries(mps, {1 : 1}, mps.monoid().zero_filter(), True)
64
sage: h = MonoidPowerSeries(mps, {1 : 4, 0 : 3}, mps.monoid().filter_all())
65
sage: mps = MonoidPowerSeriesModule(FreeModule(QQ, 2), NNMonoid(False))
66
sage: h = MonoidPowerSeries(mps, {1 : 1}, mps.monoid().filter(3))
67
"""
68
if isinstance(parent, Module) :
69
return MonoidPowerSeries_moduleelement(parent, coefficients, precision, cleanup_coefficients)
70
if isinstance(parent, Ring) :
71
return MonoidPowerSeries_algebraelement(parent, coefficients, precision, cleanup_coefficients)
72
73
raise TypeError, "Unexpected type of parent"
74
75
#===============================================================================
76
# MonoidPowerSeries_abstract
77
#===============================================================================
78
79
class MonoidPowerSeries_abstract :
80
r"""
81
An element of the monoid power series ring or module up to
82
given precision.
83
"""
84
85
def __init__(self, parent, precision) :
86
r"""
87
INPUT:
88
- ``parent`` -- An instance of :class:~`fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ambient.MonoidPowerSeriesAmbient_abstract`.
89
- ``precision`` -- A filter associated to the parent's monoid.
90
91
TESTS::
92
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
93
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
94
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
95
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
96
sage: h = MonoidPowerSeries_abstract(mps, mps.monoid().zero_filter())
97
"""
98
self.__precision = parent.monoid().filter(precision)
99
100
def precision(self) :
101
r"""
102
The series' precision.
103
104
OUTPUT:
105
A filter for the parent's monoid.
106
107
TESTS::
108
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
109
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
110
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
111
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
112
sage: MonoidPowerSeries_abstract(mps, mps.monoid().zero_filter()).precision() == mps.monoid().zero_filter()
113
True
114
"""
115
return self.__precision
116
117
def _set_precision(self, precision) :
118
r"""
119
Set the series' precision.
120
121
INPUT:
122
- ``precision`` -- A filter for the parent's monoid or a an object that can be converted
123
to a filter.
124
125
TESTS::
126
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
127
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
128
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
129
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
130
sage: h = copy(mps.one_element())
131
sage: h._set_precision(mps.monoid().filter(2))
132
sage: h.precision() == mps.monoid().filter(2)
133
True
134
sage: h._set_precision(3)
135
sage: h.precision() == mps.monoid().filter(3)
136
True
137
"""
138
self.__precision = self.parent().monoid().filter(precision)
139
140
def _bounding_precision(self) :
141
r"""
142
If ``self.precision()`` is an infinite filter, return a filter
143
which contains all non zero coefficients of this series. Otherwise,
144
return ``self.precision()``
145
146
OUTPUT:
147
A filter for the parent's monoid.
148
149
TESTS::
150
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
151
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
152
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
153
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
154
sage: h = MonoidPowerSeries(mps, dict(), mps.monoid().filter(2))
155
sage: h._bounding_precision() == mps.monoid().filter(2)
156
True
157
sage: h = MonoidPowerSeries(mps, dict(), mps.monoid().filter_all())
158
sage: h._bounding_precision() == mps.monoid().zero_filter()
159
True
160
"""
161
if not self.precision().is_infinite() :
162
return self.precision()
163
164
return self.parent().monoid().minimal_composition_filter( self.coefficients().keys(),
165
[self.parent().monoid().zero_element()] )
166
167
def coefficients(self) :
168
r"""
169
The coefficients of ``self``.
170
171
OUTPUT:
172
A dictionary with keys the elements of the parent's monoid and values in the
173
parent's coefficient domain.
174
175
TESTS::
176
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
177
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
178
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
179
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
180
sage: MonoidPowerSeries_abstract(mps, mps.monoid().filter_all()).coefficients()
181
Traceback (most recent call last):
182
...
183
NotImplementedError
184
"""
185
raise NotImplementedError
186
187
def _truncate_in_place(self, precision) :
188
r"""
189
Truncate ``self`` modifying the coefficient dictionary directly.
190
191
INPUT:
192
- ``precision`` -- A filter for the parent's monoid or a an object that can be converted
193
to a filter.
194
195
OUTPUT:
196
``None``
197
198
TESTS::
199
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
200
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
201
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
202
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
203
sage: MonoidPowerSeries_abstract(mps, mps.monoid().filter_all())._truncate_in_place(mps.monoid().zero_filter())
204
Traceback (most recent call last):
205
...
206
NotImplementedError
207
"""
208
raise NotImplementedError
209
210
def truncate(self, precision) :
211
r"""
212
Truncate a copy of ``self``.
213
214
INPUT:
215
- ``precision`` -- A filter for the parent's monoid or a an object that can be converted
216
to a filter.
217
218
OUTPUT:
219
An instance of :class:~`.MonoidPowerSeries_abstract_nonlazy`.
220
221
TESTS::
222
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
223
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
224
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
225
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
226
sage: MonoidPowerSeries_abstract(mps, mps.monoid().filter_all()).truncate(mps.monoid().zero_filter())
227
Traceback (most recent call last):
228
...
229
NotImplementedError
230
"""
231
raise NotImplementedError
232
233
def _add_(left, right) :
234
r"""
235
TESTS::
236
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
237
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
238
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
239
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
240
sage: mps.one_element() == mps.one_element() + MonoidPowerSeries(mps, dict(), mps.monoid().filter_all())
241
True
242
"""
243
prec = min(left.__precision, right.__precision)
244
lcoeffs = left.coefficients()
245
rcoeffs = right.coefficients()
246
247
lkeys = set(lcoeffs)
248
rkeys = set(rcoeffs)
249
250
d = dict()
251
for k in lkeys - rkeys :
252
d[k] = lcoeffs[k]
253
for k in rkeys - lkeys :
254
d[k] = rcoeffs[k]
255
for k in lkeys.intersection(rkeys) :
256
d[k] = lcoeffs[k] + rcoeffs[k]
257
258
return MonoidPowerSeries(left.parent(), d, prec)
259
260
def _mul_(left, right, switch_factors = False) :
261
r"""
262
NOTE:
263
This function has to accept algebra and module elements and will
264
also compute the action of the base ring (which might be a monoid power series)
265
on a module.
266
267
TESTS::
268
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
269
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
270
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
271
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
272
sage: mps.one_element() * mps.one_element() == mps.one_element()
273
True
274
"""
275
mul_fc = left.parent()._multiply_function()
276
277
if not switch_factors :
278
lcoeffs = left.coefficients()
279
rcoeffs = right.coefficients()
280
else :
281
lcoeffs = right.coefficients()
282
rcoeffs = left.coefficients()
283
284
prec = min(left.precision(), right.precision())
285
if prec.is_infinite() :
286
if len(lcoeffs) == 0 or len(rcoeffs) == 0:
287
return MonoidPowerSeries(left.parent(), dict(), prec)
288
iter_prec = left.parent().monoid(). \
289
minimal_composition_filter(set(lcoeffs), set(rcoeffs))
290
else :
291
iter_prec = prec
292
293
d = dict()
294
for k in iter_prec :
295
v = mul_fc( k, lcoeffs, rcoeffs,
296
left.parent().coefficient_domain().zero_element() )
297
if not v.is_zero() :
298
d[k] = v
299
300
return MonoidPowerSeries(left.parent(), d, prec)
301
302
def _lmul_(self, c) :
303
r"""
304
TESTS::
305
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
306
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
307
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
308
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
309
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
310
sage: (mps.one_element() * 2) * 3 == mps.one_element() * 6
311
True
312
sage: m = FreeModule(QQ, 3)
313
sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))
314
sage: h = MonoidPowerSeries(mps, {1 : 1, 3 : 2}, mps.monoid().filter(4))
315
sage: hv = MonoidPowerSeries(mpsm, {1 : m([1,0,0]), 2 : m([0,1,0])}, mps.monoid().filter(4))
316
sage: hh = hv * h
317
"""
318
if c.is_zero() :
319
return MonoidPowerSeries(self.parent(), dict(), None)
320
321
if isinstance(c, MonoidPowerSeries_abstract) and not isinstance(self, AlgebraElement) :
322
coeffs = c.coefficients()
323
if len(coeffs) == 1 and self.parent().monoid().zero_element() in coeffs :
324
c = coeffs[self.parent().monoid().zero_element()]
325
d = dict((k, c*v) for (k,v) in self.coefficients().iteritems())
326
327
return MonoidPowerSeries(self.parent(), d, self.precision())
328
329
return self._mul_(c, False)
330
else :
331
d = dict((k, c*v) for (k,v) in self.coefficients().iteritems())
332
333
return MonoidPowerSeries(self.parent(), d, self.precision())
334
335
def _rmul_(self, c) :
336
r"""
337
TESTS::
338
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
339
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
340
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
341
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
342
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
343
sage: 3 * (2 * mps.one_element()) == 6 * mps.one_element()
344
True
345
sage: m = FreeModule(QQ, 3)
346
sage: mpsm = MonoidPowerSeriesModule(m, NNMonoid(False))
347
sage: h = MonoidPowerSeries(mps, {1 : 1, 3 : 2}, mps.monoid().filter(4))
348
sage: hv = MonoidPowerSeries(mpsm, {1 : m([1,0,0]), 2 : m([0,1,0])}, mps.monoid().filter(4))
349
sage: hh = h * hv
350
"""
351
352
if c.is_zero() :
353
return MonoidPowerSeries(self.parent(), dict(), None)
354
355
if isinstance(c, MonoidPowerSeries_abstract) and not isinstance(self, AlgebraElement) :
356
coeffs = c.coefficients()
357
if len(coeffs) == 1 and self.parent().monoid().zero_element() in coeffs :
358
c = coeffs[self.parent().monoid().zero_element()]
359
d = dict((k, v*c) for (k,v) in self.coefficients().iteritems())
360
361
return MonoidPowerSeries(self.parent(), d, self.precision())
362
363
return self._mul_(c, True)
364
else :
365
d = dict((k, v*c) for (k,v) in self.coefficients().iteritems())
366
367
return MonoidPowerSeries(self.parent(), d, self.precision())
368
369
def __contains__(self, k) :
370
r"""
371
Check whether `k` is below the series' precision.
372
373
INPUT:
374
- `k` -- An element of the parent's monoid.
375
376
OUTPUT:
377
A boolean.
378
379
TESTS::
380
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
381
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
382
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
383
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
384
sage: 2 in mps.one_element()
385
True
386
sage: 1 in mps.one_element().truncate(mps.monoid().zero_filter())
387
False
388
"""
389
return k in self.precision()
390
391
def __getitem__(self, s) :
392
r"""
393
Return the `k`-th coefficient if it below the series' precision.
394
395
INPUT:
396
- `k` -- An element of the parent's monoid.
397
398
OUTPUT:
399
An element of the parent's coefficient domain.
400
401
TESTS::
402
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
403
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
404
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
405
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
406
sage: MonoidPowerSeries_abstract(mps, mps.monoid().filter_all())[0]
407
Traceback (most recent call last):
408
...
409
NotImplementedError
410
"""
411
raise NotImplementedError
412
413
def __cmp__(self, other) :
414
r"""
415
TESTS::
416
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
417
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
418
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
419
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
420
sage: mps.one_element() == mps.one_element()
421
True
422
sage: mps.one_element() == mps.zero_element()
423
False
424
"""
425
426
c = cmp(self.precision(), other.precision())
427
if c != 0 : return c
428
429
self_coeffs = self.coefficients()
430
other_coeffs = other.coefficients()
431
self_keys = set(self_coeffs)
432
other_keys = set(other_coeffs)
433
434
for k in self_keys - other_keys :
435
if not self_coeffs[k].is_zero() :
436
return -1
437
for k in other_keys - self_keys :
438
if not other_coeffs[k].is_zero() :
439
return -1
440
for k in self_keys.intersection(other_keys) :
441
if self_coeffs[k] != other_coeffs[k] :
442
return -1
443
444
return 0
445
446
def _repr_(self) :
447
r"""
448
TESTS::
449
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
450
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
451
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
452
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
453
sage: mps.one_element() # indirect doctest
454
Monoid power series in Ring of monoid power series over NN
455
"""
456
return "Monoid power series in %s" % self.parent()
457
458
def _latex_(self) :
459
r"""
460
TESTS::
461
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
462
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
463
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
464
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
465
sage: latex(mps.one_element()) # indirect doctest
466
\text{Monoid power series in } \text{Ring of monoid power series over }\Bold{N}
467
"""
468
return r"\text{Monoid power series in }" + latex(self.parent())
469
470
#===============================================================================
471
# MonoidPowerSeries_abstract_nonlazy
472
#===============================================================================
473
474
class MonoidPowerSeries_abstract_nonlazy (MonoidPowerSeries_abstract) :
475
r"""
476
A abstract implementation of monoid power series that store their coefficients.
477
"""
478
479
def __init__(self, parent, coefficients, precision, cleanup_coefficients) :
480
r"""
481
INPUT:
482
- ``parent`` -- An instance of :class:~`fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ambient.MonoidPowerSeriesAmbient_abstract`.
483
- ``coefficients`` -- A dictionary with keys in the parent's monoid and values
484
in the parent coefficient domain.
485
- ``precision`` -- A filter associated to the parent's monoid.
486
- ``cleanup_coefficients`` -- A boolean; If ``True`` zero coefficients will be
487
erased from the dictionary.
488
489
TESTS::
490
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
491
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
492
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
493
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
494
sage: h = MonoidPowerSeries_abstract_nonlazy(mps, dict(), mps.monoid().zero_filter(), False)
495
"""
496
MonoidPowerSeries_abstract.__init__(self, parent, precision)
497
498
if cleanup_coefficients and len(coefficients) != 0 :
499
coefficients = self._cleanup_coefficients( coefficients, in_place = True )
500
501
self.__coefficients = coefficients
502
503
def coefficients(self) :
504
r"""
505
The coefficients of ``self``.
506
507
OUTPUT:
508
A dictionary with keys the elements of the parent's monoid and values in the
509
parent's coefficient domain.
510
511
NOTE:
512
Some keys may be invalid. To get an exact result
513
call ``_cleanup_coefficients(in_place = True)`` before.
514
515
TESTS::
516
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
517
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
518
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
519
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
520
sage: mps.one_element().coefficients()
521
{0: 1}
522
"""
523
return self.__coefficients
524
525
def _cleanup_coefficients(self, coefficients = None, in_place = True) :
526
r"""
527
Remove zero entries and entries not below ``self.precision()`` from a coefficient dictionary.
528
529
INPUT:
530
- ``coefficients`` -- ``None`` or a dictionary (default: ``None``); If ``None`` the
531
coefficient dictionary assigned to ``self`` will be cleaned.
532
- ``in_place`` -- A boolean (default: ``True``); If ``False`` a copy of the coefficient
533
dictionary will me cleaned and returned.
534
535
OUTPUT:
536
A dictionary with keys the elements of the parent's monoid and values in the
537
parent's coefficient domain.
538
539
TESTS::
540
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
541
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
542
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
543
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
544
sage: mps.one_element()._cleanup_coefficients()
545
{0: 1}
546
sage: d = {1 : 1}
547
sage: tmp = MonoidPowerSeries(mps, dict(), mps.monoid().zero_filter())._cleanup_coefficients(d)
548
sage: d
549
{}
550
sage: mps.zero_element()._cleanup_coefficients({1 : 0}, False)
551
{}
552
sage: h = copy(mps.one_element())
553
sage: h._set_precision(mps.monoid().zero_filter())
554
sage: h._cleanup_coefficients(in_place = False)
555
{}
556
"""
557
if coefficients is None :
558
coefficients = self.__coefficients
559
560
if in_place :
561
for s in coefficients.keys() :
562
if not s in self.precision() or coefficients[s].is_zero() :
563
del coefficients[s]
564
else :
565
ncoefficients = dict()
566
567
for s in coefficients :
568
if not s in self.precision() : continue
569
570
v = coefficients[s]
571
if v.is_zero() : continue
572
573
ncoefficients[s] = v
574
575
if in_place :
576
return coefficients
577
else :
578
return ncoefficients
579
580
def _truncate_in_place(self, precision) :
581
r"""
582
Truncate ``self`` modifying the coefficient dictionary directly.
583
584
INPUT:
585
- ``precision`` -- A filter for the parent's monoid or a an object that can be converted
586
to a filter.
587
588
OUTPUT:
589
``None``
590
591
TESTS::
592
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
593
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
594
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
595
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
596
sage: h = copy(mps.one_element())
597
sage: h._truncate_in_place(mps.monoid().zero_filter())
598
sage: h.coefficients()
599
{}
600
sage: h = copy(mps.one_element())
601
sage: h._truncate_in_place(0)
602
sage: h.coefficients()
603
{}
604
"""
605
precision = self.parent().monoid().filter(precision)
606
nprec = min(self.precision(), precision)
607
608
if nprec != self.precision() :
609
coefficients = self.__coefficients
610
for k in coefficients.keys() :
611
if not k in nprec :
612
del coefficients[k]
613
614
self._set_precision(nprec)
615
616
def truncate(self, precision) :
617
r"""
618
Truncate a copy of ``self``.
619
620
INPUT:
621
- ``precision`` -- A filter for the parent's monoid or a an object that can be converted
622
to a filter.
623
624
OUTPUT:
625
An instance of :class:~`.MonoidPowerSeries_abstract_nonlazy`.
626
627
TESTS::
628
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
629
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
630
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
631
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
632
sage: mps.one_element().truncate(mps.monoid().zero_filter()).coefficients()
633
{}
634
sage: mps.one_element().truncate(0).coefficients()
635
{}
636
"""
637
precision = self.parent().monoid().filter(precision)
638
nprec = min(self.precision(), precision)
639
640
ncoefficients = copy(self.__coefficients)
641
return MonoidPowerSeries( self.parent(), ncoefficients, nprec, cleanup_coefficients = True )
642
643
def __getitem__(self, s) :
644
r"""
645
Return the `k`-th coefficient if it below the series' precision.
646
647
INPUT:
648
- `k` -- An element of the parent's monoid.
649
650
OUTPUT:
651
An element of the parent's coefficient domain.
652
653
TESTS::
654
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
655
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
656
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
657
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
658
sage: MonoidPowerSeries_abstract_nonlazy(mps, { 0 : 10, 1 : 1 }, mps.monoid().filter_all(), False)[0]
659
10
660
"""
661
try :
662
return self.coefficients()[s]
663
except KeyError :
664
return self.parent().coefficient_domain().zero_element()
665
666
#===============================================================================
667
# MonoidPowerSeries_moduleelement
668
#===============================================================================
669
670
class MonoidPowerSeries_moduleelement ( MonoidPowerSeries_abstract_nonlazy, ModuleElement ) :
671
r"""
672
An element of a module of monoid power series.
673
"""
674
675
def __init__(self, parent, coefficients, precision, cleanup_coefficients) :
676
r"""
677
INPUT:
678
- ``parent`` -- An instance of :class:~`fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ambient.MonoidPowerSeriesAmbient_abstract`.
679
- ``coefficients`` -- A dictionary with keys in the parent's monoid and values
680
in the parent coefficient domain.
681
- ``precision`` -- A filter associated to the parent's monoid.
682
- ``cleanup_coefficients`` -- A boolean; If ``True`` zero coefficients will be
683
erased from the dictionary.
684
685
TESTS::
686
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
687
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
688
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
689
sage: mps = MonoidPowerSeriesModule(FreeModule(QQ, 2), NNMonoid(False))
690
sage: h = MonoidPowerSeries_moduleelement(mps, dict(), mps.monoid().zero_filter(), False)
691
"""
692
ModuleElement.__init__(self, parent)
693
MonoidPowerSeries_abstract_nonlazy.__init__(self, parent, coefficients, precision, cleanup_coefficients)
694
695
#===============================================================================
696
# MonoidPowerSeries_algebraelement
697
#===============================================================================
698
699
class MonoidPowerSeries_algebraelement ( MonoidPowerSeries_abstract_nonlazy, AlgebraElement ) :
700
r"""
701
An element of a algebra of monoid power series.
702
"""
703
704
def __init__(self, parent, coefficients, precision, cleanup_coefficients) :
705
r"""
706
INPUT:
707
- ``parent`` -- An instance of :class:~`fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ambient.MonoidPowerSeriesAmbient_abstract`.
708
- ``coefficients`` -- A dictionary with keys in the parent's monoid and values
709
in the parent coefficient domain.
710
- ``precision`` -- A filter associated to the parent's monoid.
711
- ``cleanup_coefficients`` -- A boolean; If ``True`` zero coefficients will be
712
erased from the dictionary.
713
714
TESTS::
715
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
716
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
717
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
718
sage: mps = MonoidPowerSeriesRing(QQ, NNMonoid(False))
719
sage: h = MonoidPowerSeries_algebraelement(mps, dict(), mps.monoid().zero_filter(), False)
720
"""
721
AlgebraElement.__init__(self, parent)
722
MonoidPowerSeries_abstract_nonlazy.__init__(self, parent, coefficients, precision, cleanup_coefficients)
723
724
#===============================================================================
725
# EquivariantMonoidPowerSeries
726
#===============================================================================
727
728
def EquivariantMonoidPowerSeries( parent, coefficients, precision, symmetrise = False,
729
cleanup_coefficients = False) :
730
r"""
731
Create an equivariant monoid power series within a given parent.
732
733
INPUT:
734
- ``parent`` -- A ring or module of equivariant monoid power series.
735
- ``coefficients`` -- A dictionary with keys in the parent's monoid and values
736
in the parent coefficient domain.
737
- ``precision`` -- A filter for the parent's action.
738
- ``symmetrise`` -- A boolean (default: ``False``); If ``True`` every enty in
739
``coefficients`` will contribute to its whole orbit.
740
- ``cleanup_coefficients`` -- A boolean (default: ``False``); If ``True`` zero
741
coefficients will be erased from the dictionary.
742
743
OUTPUT:
744
An instance of :class:~`.EquivariantMonoidPowerSeries_abstract`.
745
746
EXAMPLES::
747
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
748
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
749
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
750
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
751
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
752
sage: h = EquivariantMonoidPowerSeries(emps, {emps.characters().one_element() : {1 : 1}}, emps.action().filter(3))
753
754
TESTS::
755
sage: h = EquivariantMonoidPowerSeries(emps, {emps.characters().one_element() : {1 : 1}}, emps.action().zero_filter(), True)
756
sage: h = EquivariantMonoidPowerSeries(emps, {emps.characters().one_element() : {1 : 4, 0 : 3}}, emps.action().filter_all())
757
sage: h = EquivariantMonoidPowerSeries(emps, {emps.characters().one_element() : {1 : 4, 0 : 3}}, emps.action().filter_all(), symmetrise = True)
758
sage: emps = EquivariantMonoidPowerSeriesModule( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", FreeModule(QQ, 2)) )
759
sage: h = EquivariantMonoidPowerSeries(emps, {emps.characters().one_element() : {1 : 1}}, emps.action().filter(3))
760
"""
761
if isinstance(parent, Module) :
762
return EquivariantMonoidPowerSeries_moduleelement( parent, coefficients, precision, symmetrise,
763
cleanup_coefficients )
764
if isinstance(parent, Ring) :
765
return EquivariantMonoidPowerSeries_algebraelement( parent, coefficients, precision, symmetrise,
766
cleanup_coefficients )
767
768
raise TypeError, "Unexpected type of parent"
769
770
#===============================================================================
771
# EquivariantMonoidPowerSeries_abstract
772
#===============================================================================
773
774
class EquivariantMonoidPowerSeries_abstract :
775
r"""
776
An abstract element of an equivariant monoid power series ring up to
777
given precision.
778
"""
779
780
def __init__( self, parent, precision ) :
781
r"""
782
INPUT:
783
- ``parent`` -- A ring or module of equivariant monoid power series.
784
- ``precision`` -- A filter for the parent's action.
785
786
TESTS::
787
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
788
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
789
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
790
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
791
sage: h = EquivariantMonoidPowerSeries_abstract(emps, emps.action().zero_filter()) # indirect doctest
792
"""
793
self.__precision = parent.action().filter(precision)
794
795
def precision(self) :
796
r"""
797
The series' precision.
798
799
OUTPUT:
800
A filter for the parent's action.
801
802
TESTS::
803
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
804
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
805
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
806
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
807
sage: EquivariantMonoidPowerSeries_abstract(emps, emps.action().filter(3)).precision() == emps.action().filter(3)
808
True
809
"""
810
return self.__precision
811
812
def _set_precision(self, precision) :
813
r"""
814
Set the series' precision.
815
816
INPUT:
817
- ``precision`` -- A filter for the parent's action.
818
819
TESTS::
820
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
821
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
822
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
823
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
824
sage: e = copy(emps.one_element())
825
sage: e._set_precision(emps.action().filter(3))
826
sage: e.precision() == emps.action().filter(3)
827
True
828
sage: e._set_precision(2)
829
sage: e.precision() == emps.action().filter(2)
830
True
831
"""
832
self.__precision = self.parent().action().filter(precision)
833
834
def non_zero_components(self) :
835
r"""
836
Return all those characters which are not guaranteed to have only
837
vanishing coefficients associated to.
838
839
OUTPUT:
840
A list of elements of the character monoid.
841
842
NOTE:
843
The components associated to characters this function returns can vanish.
844
For exact results use ``_cleanup_coefficients(in_place = True)`` before.
845
846
EXAMPLES::
847
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
848
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
849
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
850
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
851
sage: e = EquivariantMonoidPowerSeries(emps, dict(), emps.monoid().zero_filter())
852
sage: e.non_zero_components()
853
[]
854
sage: emps.one_element().non_zero_components()
855
[1]
856
"""
857
return list(self.parent().characters())
858
859
def _bounding_precision(self) :
860
r"""
861
If ``self.precision()`` is an infinite filter, return a filter
862
which contains all non zero coefficients of this series. Otherwise,
863
return ``self.precision()``
864
865
OUTPUT:
866
A filter for the parent's action.
867
868
TESTS::
869
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
870
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
871
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
872
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
873
sage: e = EquivariantMonoidPowerSeries(emps, dict(), emps.action().filter(2))
874
sage: e._bounding_precision() == emps.action().filter(2)
875
True
876
sage: e = EquivariantMonoidPowerSeries(emps, dict(), emps.action().filter_all())
877
sage: e._bounding_precision() == emps.action().zero_filter()
878
True
879
"""
880
if not self.precision().is_infinite() :
881
return self.precision()
882
883
coeffs = self.coefficients(True)
884
m = self.parent().action().zero_filter()
885
for c in self.non_zero_components() :
886
m = max(m, self.parent().action().minimal_composition_filter( coeffs[c].keys(),
887
[self.parent().action().zero_element()] ))
888
return m
889
890
def coefficients(self, force_characters = False) :
891
r"""
892
The coefficients of ``self``.
893
894
INPUT:
895
- ``force_characters`` -- A boolean (default: ``False``); If ``True`` the
896
the dictionary returned will have characters as keys
897
in any cases.
898
899
OUTPUT:
900
Either of the following two:
901
- A dictionary with keys the elements of the parent's monoid and values in the
902
parent's coefficient domain.
903
- A dictionary with keys the parent's characters and values the a dictionary as follows. This
904
dictionary has keys the elements of the parent's monoid and values in the parent's
905
coefficient domain.
906
907
EXAMPLES::
908
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
909
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
910
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
911
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
912
sage: EquivariantMonoidPowerSeries_abstract(emps, emps.action().zero_filter()).coefficients()
913
Traceback (most recent call last):
914
...
915
NotImplementedError
916
"""
917
raise NotImplementedError
918
919
def _truncate_in_place(self, precision) :
920
r"""
921
Truncate ``self`` modifying the coefficient dictionary directly.
922
923
INPUT:
924
- ``precision`` -- A filter for the parent's monoid or a an object that can be converted
925
to a filter.
926
927
OUTPUT:
928
``None``
929
930
TESTS::
931
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
932
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
933
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
934
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
935
sage: e = emps.one_element()
936
sage: EquivariantMonoidPowerSeries_abstract(emps, emps.action().filter_all())._truncate_in_place(emps.monoid().zero_filter())
937
Traceback (most recent call last):
938
...
939
NotImplementedError
940
"""
941
raise NotImplementedError
942
943
def truncate(self, precision) :
944
r"""
945
Truncate a copy of ``self``.
946
947
INPUT:
948
- ``precision`` -- A filter for the parent's monoid or a an object that can be converted
949
to a filter.
950
951
OUTPUT:
952
An instance of :class:~`.EquivariantMonoidPowerSeries_abstract`.
953
954
TESTS::
955
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
956
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
957
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
958
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
959
sage: EquivariantMonoidPowerSeries_abstract(emps, emps.action().filter_all()).truncate(emps.action().zero_filter())
960
Traceback (most recent call last):
961
...
962
NotImplementedError
963
"""
964
raise NotImplementedError
965
966
def _add_(left, right) :
967
r"""
968
TESTS::
969
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
970
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
971
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
972
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
973
sage: e = EquivariantMonoidPowerSeries(emps, {emps.characters().one_element() : { 1 : 1 }}, emps.action().filter_all())
974
sage: (e + e)[1]
975
2
976
"""
977
prec = min(left.precision(), right.precision())
978
979
left_coefficients = left.coefficients(True)
980
right_coefficients = right.coefficients(True)
981
982
left_characters = set(left_coefficients)
983
right_characters = set(right_coefficients)
984
coefficients = dict()
985
986
for ch in left_characters - right_characters :
987
coefficients[ch] = copy(left_coefficients[ch])
988
for ch in right_characters - left_characters :
989
coefficients[ch] = copy(right_coefficients[ch])
990
991
for ch in left_characters.intersection(right_characters) :
992
lcoeffs = left_coefficients[ch]
993
rcoeffs = right_coefficients[ch]
994
995
lcoeff_keys = set(lcoeffs)
996
rcoeff_keys = set(rcoeffs)
997
998
nd = dict()
999
for k in lcoeff_keys - rcoeff_keys :
1000
nd[k] = lcoeffs[k]
1001
for k in rcoeff_keys - lcoeff_keys :
1002
nd[k] = rcoeffs[k]
1003
for k in lcoeff_keys.intersection(rcoeff_keys) :
1004
nd[k] = lcoeffs[k] + rcoeffs[k]
1005
1006
coefficients[ch] = nd
1007
1008
return EquivariantMonoidPowerSeries(left.parent(),
1009
coefficients, prec)
1010
1011
def _mul_(left, right, switch_factors = False) :
1012
r"""
1013
TESTS::
1014
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
1015
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
1016
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
1017
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
1018
sage: e = EquivariantMonoidPowerSeries(emps, {emps.characters().one_element() : { 1 : 1 }}, emps.action().filter_all())
1019
sage: (e * e)[2]
1020
1
1021
"""
1022
mul_fc = left.parent()._multiply_function()
1023
coefficient_domain = left.parent().coefficient_domain()
1024
1025
prec = min(left.precision(), right.precision())
1026
if not switch_factors :
1027
left_coefficients = left.coefficients(True)
1028
right_coefficients = right.coefficients(True)
1029
else :
1030
right_coefficients = left.coefficients(True)
1031
left_coefficients = right.coefficients(True)
1032
1033
if prec.is_infinite() :
1034
left_keys = reduce(union, (set(left_coefficients[c]) for c in left_coefficients), set())
1035
right_keys = reduce(union, (set(right_coefficients[c]) for c in right_coefficients), set())
1036
1037
if len(left_keys) == 0 or len(right_keys) == 0:
1038
return EquivariantMonoidPowerSeries(left.parent(), dict(), prec)
1039
iter_prec = left.parent().action(). \
1040
minimal_composition_filter(left_keys, right_keys)
1041
else :
1042
iter_prec = prec
1043
1044
coefficients = dict()
1045
for c1 in left_coefficients :
1046
lcoeffs = left_coefficients[c1]
1047
if len(lcoeffs) == 0 : continue
1048
1049
for c2 in right_coefficients :
1050
rcoeffs = right_coefficients[c2]
1051
if len(rcoeffs) == 0 : continue
1052
1053
try :
1054
d = coefficients[c1 * c2]
1055
except KeyError :
1056
d = dict()
1057
coefficients[c1 * c2] = d
1058
1059
for k in iter_prec :
1060
v = mul_fc( k, lcoeffs, rcoeffs, c1, c2, coefficient_domain(0) )
1061
1062
if not v.is_zero() :
1063
try :
1064
d[k] += v
1065
if d[k].is_zero() :
1066
del d[k]
1067
except KeyError :
1068
d[k] = v
1069
1070
return EquivariantMonoidPowerSeries( left.parent(), coefficients, prec )
1071
1072
def _lmul_(self, c) :
1073
r"""
1074
TESTS::
1075
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
1076
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
1077
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
1078
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
1079
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
1080
sage: (emps.one_element() * 2) * 3 == emps.one_element() * 6
1081
True
1082
sage: m = FreeModule(QQ, 3)
1083
sage: empsm = EquivariantMonoidPowerSeriesModule(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", m))
1084
sage: h = EquivariantMonoidPowerSeries(emps, {emps.characters().one_element(): {1: 1, 3: 2}}, emps.action().filter_all())
1085
sage: hv = EquivariantMonoidPowerSeries(empsm, {empsm.characters().one_element(): {1: m([1,0,0]), 2: m([0,0,1])}}, empsm.action().filter_all())
1086
sage: hh = hv * h
1087
"""
1088
if c.is_zero() :
1089
return EquivariantMonoidPowerSeries(self.parent(), dict(), self.parent().monoid().filter_all())
1090
1091
if isinstance(c, EquivariantMonoidPowerSeries_abstract) and not isinstance(self, AlgebraElement) :
1092
nzc = c.non_zero_components()
1093
if len(nzc) == 1 :
1094
coeffs = c.coefficients(True)[nzc[0]]
1095
1096
if len(coeffs) == 1 and self.parent().action().zero_element() in coeffs :
1097
c = coeffs[self.parent().action().zero_element()]
1098
1099
self_coefficients = self.coefficients(True)
1100
coefficients = dict()
1101
for ch in self_coefficients :
1102
coefficients[ch] = dict((k, c*v) for (k,v) in self_coefficients[ch].iteritems())
1103
1104
return EquivariantMonoidPowerSeries(self.parent(),
1105
coefficients, self.precision())
1106
1107
return self._mul_(c, False)
1108
else :
1109
self_coefficients = self.coefficients(True)
1110
coefficients = dict()
1111
for ch in self_coefficients :
1112
coefficients[ch] = dict((k, c*v) for (k,v) in self_coefficients[ch].iteritems())
1113
1114
return EquivariantMonoidPowerSeries(self.parent(),
1115
coefficients, self.precision())
1116
1117
def _rmul_(self, c) :
1118
r"""
1119
TESTS::
1120
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
1121
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
1122
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
1123
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
1124
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
1125
sage: 3 * (2 * emps.one_element()) == 6 * emps.one_element()
1126
True
1127
sage: m = FreeModule(QQ, 3)
1128
sage: empsm = EquivariantMonoidPowerSeriesModule(NNMonoid(True), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", m))
1129
sage: h = EquivariantMonoidPowerSeries(emps, {emps.characters().one_element(): {1: 1, 3: 2}}, emps.action().filter_all())
1130
sage: hv = EquivariantMonoidPowerSeries(empsm, {empsm.characters().one_element(): {1: m([1,0,0]), 2: m([0,0,1])}}, empsm.action().filter_all())
1131
sage: hh = h * hv
1132
"""
1133
if c.is_zero() :
1134
return EquivariantMonoidPowerSeries(self.parent(), dict(), self.parent().monoid().filter_all())
1135
1136
if isinstance(c, EquivariantMonoidPowerSeries_abstract) and not isinstance(self, AlgebraElement) :
1137
nzc = c.non_zero_components()
1138
if len(nzc) == 1 :
1139
coeffs = c.coefficients(True)[nzc[0]]
1140
1141
if len(coeffs) == 1 and self.parent().action().zero_element() in coeffs :
1142
c = coeffs[self.parent().action().zero_element()]
1143
1144
self_coefficients = self.coefficients(True)
1145
coefficients = dict()
1146
for ch in self_coefficients :
1147
coefficients[ch] = dict((k, v*c) for (k,v) in self_coefficients[ch].iteritems())
1148
1149
return EquivariantMonoidPowerSeries(self.parent(),
1150
coefficients, self.precision())
1151
1152
return self._mul_(c, True)
1153
else :
1154
self_coefficients = self.coefficients(True)
1155
coefficients = dict()
1156
for ch in self_coefficients :
1157
coefficients[ch] = dict((k, v*c) for (k,v) in self_coefficients[ch].iteritems())
1158
1159
return EquivariantMonoidPowerSeries(self.parent(),
1160
coefficients, self.precision())
1161
1162
def __contains__(self, k) :
1163
r"""
1164
Check whether an index or a pair of character and index
1165
is containted in the precision.
1166
1167
EXAMPLES:
1168
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
1169
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
1170
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
1171
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
1172
sage: e = EquivariantMonoidPowerSeries(emps, {emps.characters().one_element() : {1 : 1, 2 : 1}}, emps.action().filter(3))
1173
sage: 3 in e
1174
False
1175
sage: 2 in e
1176
True
1177
sage: (emps.characters().one_element(),2) in e
1178
True
1179
"""
1180
try :
1181
(ch, k) = k
1182
if k not in self.parent().monoid() :
1183
k = (ch, k)
1184
except TypeError :
1185
pass
1186
1187
return k in self.precision()
1188
1189
def __getitem__(self, k) :
1190
r"""
1191
Return the `k`-th coefficient if it below the series' precision. If no character is contained
1192
in the key ``self`` must have only one nonvanishing component.
1193
1194
INPUT:
1195
- `k` -- A pair of an element of the parent's character monoid and
1196
and element of the parent's monoid or an element of the parent's monoid.
1197
1198
OUTPUT:
1199
An element of the parent's coefficient domain.
1200
1201
TESTS::
1202
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
1203
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
1204
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
1205
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
1206
sage: EquivariantMonoidPowerSeries_abstract(emps, emps.action().filter_all())[(emps.characters().one_element(), 0)]
1207
Traceback (most recent call last):
1208
...
1209
NotImplementedError
1210
"""
1211
raise NotImplementedError
1212
1213
def __cmp__(self, other) :
1214
r"""
1215
TESTS::
1216
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
1217
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
1218
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
1219
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
1220
sage: e = EquivariantMonoidPowerSeries(emps, {emps.characters().one_element() : { 1 : 1 }}, emps.action().zero_filter())
1221
sage: e == EquivariantMonoidPowerSeries(emps, {emps.characters().one_element() : { 1 : 1 }}, emps.action().zero_filter())
1222
True
1223
sage: e == 2 * e
1224
False
1225
sage: e == EquivariantMonoidPowerSeries(emps, {}, emps.action().zero_filter())
1226
False
1227
"""
1228
c = cmp(self.precision(), other.precision())
1229
if c != 0 : return c
1230
1231
self_coefficients = self.coefficients(True)
1232
other_coefficients = other.coefficients(True)
1233
for ch in set(self_coefficients) - set(other_coefficients) :
1234
d = self_coefficients[ch]
1235
for k in d:
1236
if not d[k] == 0 :
1237
return -1
1238
for ch in set(other_coefficients) - set(self_coefficients) :
1239
d = other_coefficients[ch]
1240
for k in d:
1241
if not d[k] == 0 :
1242
return -1
1243
1244
for ch in set(self_coefficients).intersection(set(other_coefficients)) :
1245
s = self_coefficients[ch]
1246
o = other_coefficients[ch]
1247
self_keys = set(s)
1248
other_keys = set(o)
1249
1250
for k in self_keys - other_keys :
1251
if not s[k] == 0 :
1252
return -1
1253
for k in other_keys - self_keys :
1254
if not o[k] == 0 :
1255
return -1
1256
1257
for k in self_keys.intersection(other_keys) :
1258
if s[k] != o[k] :
1259
return -1
1260
1261
return 0
1262
1263
def _repr_(self) :
1264
r"""
1265
TESTS::
1266
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
1267
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
1268
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
1269
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
1270
sage: EquivariantMonoidPowerSeries(emps, {emps.characters().one_element() : { 1 : 1 }}, emps.action().zero_filter())
1271
Equivariant monoid power series in Ring of equivariant monoid power series over NN
1272
"""
1273
return "Equivariant monoid power series in %s" % (self.parent(),)
1274
1275
def _latex_(self) :
1276
r"""
1277
EXAMPLES:
1278
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
1279
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
1280
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
1281
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
1282
sage: latex( EquivariantMonoidPowerSeries(emps, {emps.characters().one_element() : { 1 : 1 }}, emps.action().zero_filter()) )
1283
\text{Equivariant monoid power series in }\text{Ring of equivariant monoid power series over }\Bold{N}
1284
"""
1285
return r"\text{Equivariant monoid power series in }%s" % latex(self.parent())
1286
1287
#===============================================================================
1288
# EquivariantMonoidPowerSeries_abstract_nonlazy
1289
#===============================================================================
1290
1291
class EquivariantMonoidPowerSeries_abstract_nonlazy ( EquivariantMonoidPowerSeries_abstract ) :
1292
r"""
1293
A abstract implementation of equiavariant monoid power series that store their coefficients.
1294
"""
1295
1296
def __init__( self, parent, coefficients, precision, symmetrise,
1297
cleanup_coefficients ) :
1298
r"""
1299
INPUT:
1300
- ``parent`` -- A ring or module of equivariant monoid power series.
1301
- ``coefficients`` -- A dictionary with keys in the parent's monoid and values
1302
in the parent coefficient domain.
1303
- ``precision`` -- A filter for the parent's action.
1304
- ``symmetrise`` -- A boolean (default: ``False``); If ``True`` every enty in
1305
``coefficients`` will contribute to its whole orbit.
1306
- ``cleanup_coefficients`` -- A boolean (default: ``False``); If ``True`` zero
1307
coefficients will be erased from the dictionary.
1308
1309
TESTS::
1310
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
1311
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
1312
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
1313
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
1314
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
1315
sage: h = EquivariantMonoidPowerSeries_abstract_nonlazy(emps, {emps.characters().one_element() : {1 : 1}}, emps.action().filter(3), False, False)
1316
sage: h = EquivariantMonoidPowerSeries_abstract_nonlazy(emps, {emps.characters().one_element() : {1 : 1}}, emps.action().zero_filter(), False, True)
1317
sage: h = EquivariantMonoidPowerSeries_abstract_nonlazy(emps, {emps.characters().one_element() : {1 : 4, 0 : 3}}, emps.action().filter_all(), False, False,)
1318
sage: h = EquivariantMonoidPowerSeries_abstract_nonlazy(emps, {emps.characters().one_element() : {1 : 4, 0 : 3}}, emps.action().filter_all(), True, False)
1319
sage: emps = EquivariantMonoidPowerSeriesModule( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", FreeModule(QQ, 2)) )
1320
sage: h = EquivariantMonoidPowerSeries_abstract_nonlazy(emps, {emps.characters().one_element() : {1 : 1}}, emps.action().filter(3), False, False)
1321
"""
1322
EquivariantMonoidPowerSeries_abstract.__init__(self, parent, precision)
1323
1324
if cleanup_coefficients and len(coefficients) != 0 :
1325
ncoefficients = self._cleanup_coefficients( coefficients,
1326
in_place = True )
1327
else :
1328
ncoefficients = coefficients
1329
1330
if symmetrise :
1331
## for symmetrisation we are guaranteed that
1332
## the representation acts trivially on all coefficients
1333
reduction = parent._reduction_function()
1334
character_eval = parent._character_eval_function()
1335
1336
self.__coefficients = dict()
1337
1338
for ch in ncoefficients :
1339
d = ncoefficients[ch]
1340
nd = dict()
1341
self.__coefficients[ch] = nd
1342
1343
for s in d :
1344
rs, g = reduction(s)
1345
try :
1346
nd[rs] += character_eval(g, ch) * d[s]
1347
except KeyError :
1348
nd[rs] = character_eval(g, ch) * d[s]
1349
else :
1350
self.__coefficients = ncoefficients
1351
1352
def non_zero_components(self) :
1353
r"""
1354
Return all those characters which are not guaranteed to have only
1355
vanishing coefficients associated to.
1356
1357
OUTPUT:
1358
A list of elements of the character monoid.
1359
1360
NOTE:
1361
The components associated to characters this function returns can vanish.
1362
For exact results use ``_cleanup_coefficients(in_place = True)`` before.
1363
1364
EXAMPLES::
1365
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
1366
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
1367
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
1368
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
1369
sage: e = EquivariantMonoidPowerSeries_abstract_nonlazy(emps, {emps.characters().one_element() : {1 : 0}}, emps.action().zero_filter(), False, False)
1370
sage: e.non_zero_components()
1371
[1]
1372
sage: e._cleanup_coefficients(in_place = True)
1373
{}
1374
sage: e.non_zero_components()
1375
[]
1376
"""
1377
return self.__coefficients.keys()
1378
1379
def coefficients(self, force_characters = False) :
1380
r"""
1381
The coefficients of ``self``.
1382
1383
INPUT:
1384
- ``force_characters`` -- A boolean (default: ``False``); If ``True`` the
1385
the dictionary returned will have characters as keys
1386
in any cases.
1387
1388
OUTPUT:
1389
Either of the following two:
1390
- A dictionary with keys the elements of the parent's monoid and values in the
1391
parent's coefficient domain.
1392
- A dictionary with keys the parent's characters and values the a dictionary as follows. This
1393
dictionary has keys the elements of the parent's monoid and values in the parent's
1394
coefficient domain.
1395
1396
NOTE:
1397
Some keys may be invalid. To get an exact result
1398
call ``_cleanup_coefficients(in_place = True)`` before.
1399
1400
EXAMPLES::
1401
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
1402
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
1403
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
1404
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
1405
sage: EquivariantMonoidPowerSeries_abstract_nonlazy(emps, {emps.characters().one_element() : {1 : 1}}, emps.action().zero_filter(), False, False).coefficients()
1406
{1: 1}
1407
sage: EquivariantMonoidPowerSeries_abstract_nonlazy(emps, {emps.characters().one_element() : {1 : 1}}, emps.action().zero_filter(), False, False).coefficients(True)
1408
{1: {1: 1}}
1409
"""
1410
if len(self.__coefficients) == 0 :
1411
return dict()
1412
elif not force_characters and len(self.__coefficients) == 1 :
1413
return self.__coefficients.values()[0]
1414
else :
1415
return self.__coefficients
1416
1417
def _cleanup_coefficients(self, coefficients = None, in_place = True) :
1418
r"""
1419
Remove zero entries and entries not below ``self.precision()`` from a coefficient dictionary.
1420
1421
INPUT:
1422
- ``coefficients`` -- ``None`` or a dictionary (default: ``None``); If ``None`` the
1423
coefficient dictionary assigned to ``self`` will be cleaned.
1424
- ``in_place`` -- A boolean (default: ``True``); If ``False`` a copy of the coefficient
1425
dictionary will me cleaned and returned.
1426
1427
OUTPUT:
1428
A dictionary with keys the parent's characters and values the a dictionary as follows. This
1429
dictionary has keys the elements of the parent's monoid and values in the parent's
1430
coefficient domain.
1431
1432
TESTS::
1433
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
1434
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
1435
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
1436
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
1437
sage: emps.one_element()._cleanup_coefficients()
1438
{1: {0: 1}}
1439
sage: d = {emps.characters().one_element() : {1 : 1}}
1440
sage: tmp = EquivariantMonoidPowerSeries(emps, dict(), emps.action().zero_filter())._cleanup_coefficients(d)
1441
sage: d
1442
{}
1443
sage: emps.zero_element()._cleanup_coefficients({emps.characters().one_element() : {1 : 0}}, False)
1444
{}
1445
sage: h = copy(emps.one_element())
1446
sage: h._set_precision(emps.action().zero_filter())
1447
sage: h._cleanup_coefficients(in_place = False)
1448
{}
1449
"""
1450
if coefficients is None :
1451
coefficients = self.__coefficients
1452
1453
if not in_place :
1454
ncoefficients = dict()
1455
1456
for ch in coefficients.keys() :
1457
d = coefficients[ch]
1458
1459
if in_place :
1460
for s in d.keys() :
1461
if not s in self.precision() or d[s].is_zero() :
1462
del d[s]
1463
1464
if len(d) == 0 :
1465
del coefficients[ch]
1466
else :
1467
nd = dict()
1468
1469
for s in d :
1470
if not s in self.precision() : continue
1471
1472
v = d[s]
1473
if v.is_zero() : continue
1474
1475
nd[s] = v
1476
1477
if len(nd) != 0 :
1478
ncoefficients[ch] = nd
1479
1480
if in_place :
1481
return coefficients
1482
else :
1483
return ncoefficients
1484
1485
def _truncate_in_place(self, precision) :
1486
r"""
1487
Truncate ``self`` modifying the coefficient dictionary directly.
1488
1489
INPUT:
1490
- ``precision`` -- A filter for the parent's monoid or a an object that can be converted
1491
to a filter.
1492
1493
OUTPUT:
1494
``None``
1495
1496
TESTS::
1497
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
1498
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
1499
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
1500
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
1501
sage: e = copy(emps.one_element())
1502
sage: e._truncate_in_place(emps.monoid().zero_filter())
1503
sage: e.coefficients()
1504
{}
1505
sage: e = EquivariantMonoidPowerSeries(emps, {emps.characters().one_element() : {1 : 1, 2 : 0}}, emps.action().filter(3))
1506
sage: e._truncate_in_place(2)
1507
sage: 2 in e.coefficients()
1508
False
1509
"""
1510
precision = self.parent().action().filter(precision)
1511
nprec = min(self.precision(), precision)
1512
1513
if nprec != self.precision() :
1514
for c in self.__coefficients :
1515
d = self.__coefficients[c]
1516
for k in d.keys() :
1517
if not k in nprec :
1518
del d[k]
1519
1520
self._set_precision(nprec)
1521
1522
def truncate(self, precision) :
1523
r"""
1524
Truncate a copy of ``self``.
1525
1526
INPUT:
1527
- ``precision`` -- A filter for the parent's monoid or a an object that can be converted
1528
to a filter.
1529
1530
OUTPUT:
1531
An instance of :class:~`.EquivariantMonoidPowerSeries_abstract`.
1532
1533
TESTS::
1534
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
1535
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
1536
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
1537
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
1538
sage: emps.one_element().truncate(emps.monoid().zero_filter()).coefficients()
1539
{}
1540
sage: e = EquivariantMonoidPowerSeries(emps, {emps.characters().one_element() : {1 : 1, 2 : 0}}, emps.action().filter(3))
1541
sage: 2 in e.truncate(2)
1542
False
1543
"""
1544
precision = self.parent().action().filter(precision)
1545
nprec = min(self.precision(), precision)
1546
1547
ncoefficients = dict( (ch, copy(self.__coefficients[ch]))
1548
for ch in self.__coefficients )
1549
return EquivariantMonoidPowerSeries( self.parent(),
1550
ncoefficients, nprec, cleanup_coefficients = True )
1551
1552
def __getitem__(self, k) :
1553
r"""
1554
Return the `k`-th coefficient if it below the series' precision. If no character is contained
1555
in the key ``self`` must have only one nonvanishing component.
1556
1557
INPUT:
1558
- `k` -- A pair of an element of the parent's character monoid and
1559
and element of the parent's monoid or an element of the parent's monoid.
1560
1561
OUTPUT:
1562
An element of the parent's coefficient domain.
1563
1564
TESTS::
1565
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
1566
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
1567
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
1568
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
1569
sage: EquivariantMonoidPowerSeries(emps, {emps.characters().one_element() : { 0 : 10, 1 : 1 }}, emps.action().filter_all())[(emps.characters().one_element(), 0)]
1570
10
1571
sage: EquivariantMonoidPowerSeries(emps, {emps.characters().one_element() : { 0 : 10, 1 : 1 }}, emps.action().filter_all())[1]
1572
1
1573
"""
1574
try :
1575
if not isinstance(k, tuple) :
1576
raise ValueError
1577
1578
(ch, k) = k
1579
if k not in self.parent().monoid() :
1580
s = (ch, k)
1581
ch = None
1582
else :
1583
s = k
1584
except ValueError :
1585
s = k
1586
ch = None
1587
1588
try :
1589
if not ch.parent() == self.parent().characters() :
1590
ch = None
1591
except AttributeError :
1592
ch = None
1593
1594
if ch is None :
1595
ns = self.non_zero_components()
1596
if len(ns) == 0 :
1597
return 0
1598
elif len(ns) == 1 :
1599
ch = ns[0]
1600
else :
1601
raise ValueError, "you must specify a character"
1602
1603
if not s in self.precision() :
1604
raise ValueError, "%s out of bound" % (s,)
1605
1606
try :
1607
return self.__coefficients[ch][s]
1608
except KeyError :
1609
(rs, g) = self.parent()._reduction_function()(s)
1610
1611
try :
1612
return self.parent()._character_eval_function()(g, ch) \
1613
* self.parent()._apply_function()(g, self.__coefficients[ch][rs])
1614
except KeyError :
1615
return self.parent().coefficient_domain().zero_element()
1616
1617
#===============================================================================
1618
# EquivariantMonoidPowerSeries_moduleelement
1619
#===============================================================================
1620
1621
class EquivariantMonoidPowerSeries_moduleelement ( EquivariantMonoidPowerSeries_abstract_nonlazy, ModuleElement ) :
1622
r"""
1623
An element of a module of equivariant monoid power series.
1624
"""
1625
1626
def __init__(self, parent, coefficients, precision, symmetrise,
1627
cleanup_coefficients ) :
1628
r"""
1629
INPUT:
1630
- ``parent`` -- A ring or module of equivariant monoid power series.
1631
- ``coefficients`` -- A dictionary with keys in the parent's monoid and values
1632
in the parent coefficient domain.
1633
- ``precision`` -- A filter for the parent's action.
1634
- ``symmetrise`` -- A boolean (default: ``False``); If ``True`` every enty in
1635
``coefficients`` will contribute to its whole orbit.
1636
- ``cleanup_coefficients`` -- A boolean (default: ``False``); If ``True`` zero
1637
coefficients will be erased from the dictionary.
1638
1639
TESTS::
1640
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
1641
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_module import *
1642
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
1643
sage: emps = EquivariantMonoidPowerSeriesModule( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", FreeModule(QQ, 2)) )
1644
sage: h = EquivariantMonoidPowerSeries_moduleelement(emps, dict(), emps.action().zero_filter(), False, False)
1645
"""
1646
ModuleElement.__init__(self, parent)
1647
EquivariantMonoidPowerSeries_abstract_nonlazy.__init__(self, parent, coefficients, precision, symmetrise,
1648
cleanup_coefficients)
1649
1650
#===============================================================================
1651
# EquivariantMonoidPowerSeries_algebraelement
1652
#===============================================================================
1653
1654
class EquivariantMonoidPowerSeries_algebraelement ( EquivariantMonoidPowerSeries_abstract_nonlazy, AlgebraElement ) :
1655
r"""
1656
An element of an algebra of equivariant monoid power series.
1657
"""
1658
1659
def __init__(self, parent, coefficients, precision, symmetrise,
1660
cleanup_coefficients ) :
1661
r"""
1662
INPUT:
1663
- ``parent`` -- A ring or module of equivariant monoid power series.
1664
- ``coefficients`` -- A dictionary with keys in the parent's monoid and values
1665
in the parent coefficient domain.
1666
- ``precision`` -- A filter for the parent's action.
1667
- ``symmetrise`` -- A boolean (default: ``False``); If ``True`` every enty in
1668
``coefficients`` will contribute to its whole orbit.
1669
- ``cleanup_coefficients`` -- A boolean (default: ``False``); If ``True`` zero
1670
coefficients will be erased from the dictionary.
1671
1672
TESTS::
1673
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_element import *
1674
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_ring import *
1675
sage: from psage.modform.fourier_expansion_framework.monoidpowerseries.monoidpowerseries_basicmonoids import *
1676
sage: emps = EquivariantMonoidPowerSeriesRing( NNMonoid(), TrivialCharacterMonoid("1", QQ), TrivialRepresentation("1", QQ) )
1677
sage: h = EquivariantMonoidPowerSeries_algebraelement(emps, dict(), emps.action().zero_filter(), False, False)
1678
"""
1679
AlgebraElement.__init__(self, parent)
1680
EquivariantMonoidPowerSeries_abstract_nonlazy.__init__(self, parent, coefficients, precision, symmetrise,
1681
cleanup_coefficients)
1682
1683