44
44
x - 1/6*x^3 + 1/120*x^5 - 1/5040*x^7 + 1/362880*x^9 + O(x^10)
45
45
sage: R.<x> = PowerSeriesRing(QQ, default_prec=15)
46
46
sage: sin(x)
47
- x - 1/6*x^3 + 1/120*x^5 - 1/5040*x^7 + 1/362880*x^9 - 1/39916800*x^11 + 1/6227020800*x^13 + O(x^15)
47
+ x - 1/6*x^3 + 1/120*x^5 - 1/5040*x^7 + 1/362880*x^9 - 1/39916800*x^11
48
+ + 1/6227020800*x^13 + O(x^15)
48
49
49
50
An iterated example::
50
51
139
140
from sage .misc .lazy_import import lazy_import
140
141
from sage .rings import (
141
142
integer ,
142
- laurent_series_ring ,
143
- laurent_series_ring_element ,
144
143
power_series_mpoly ,
145
144
power_series_poly ,
146
145
power_series_ring_element ,
153
152
from sage .rings .polynomial .polynomial_ring_constructor import PolynomialRing
154
153
from sage .structure .category_object import normalize_names
155
154
from sage .structure .element import Expression , parent
155
+ from sage .structure .parent import Parent
156
156
from sage .structure .nonexact import Nonexact
157
157
from sage .structure .unique_representation import UniqueRepresentation
158
158
@@ -355,7 +355,7 @@ def PowerSeriesRing(base_ring, name=None, arg2=None, names=None,
355
355
356
356
* :func:`sage.misc.defaults.set_series_precision`
357
357
"""
358
- #multivariate case:
358
+ # multivariate case:
359
359
# examples for first case:
360
360
# PowerSeriesRing(QQ,'x,y,z')
361
361
# PowerSeriesRing(QQ,['x','y','z'])
@@ -364,7 +364,7 @@ def PowerSeriesRing(base_ring, name=None, arg2=None, names=None,
364
364
names = name
365
365
if isinstance (names , (tuple , list )) and len (names ) > 1 or (isinstance (names , str ) and ',' in names ):
366
366
return _multi_variate (base_ring , num_gens = arg2 , names = names ,
367
- order = order , default_prec = default_prec , sparse = sparse )
367
+ order = order , default_prec = default_prec , sparse = sparse )
368
368
# examples for second case:
369
369
# PowerSeriesRing(QQ,3,'t')
370
370
if arg2 is None and num_gens is not None :
@@ -373,7 +373,7 @@ def PowerSeriesRing(base_ring, name=None, arg2=None, names=None,
373
373
if (isinstance (arg2 , str ) and
374
374
isinstance (names , (int , integer .Integer ))):
375
375
return _multi_variate (base_ring , num_gens = names , names = arg2 ,
376
- order = order , default_prec = default_prec , sparse = sparse )
376
+ order = order , default_prec = default_prec , sparse = sparse )
377
377
378
378
# univariate case: the arguments to PowerSeriesRing used to be
379
379
# (base_ring, name=None, default_prec=20, names=None, sparse=False),
@@ -385,11 +385,10 @@ def PowerSeriesRing(base_ring, name=None, arg2=None, names=None,
385
385
elif arg2 is not None :
386
386
default_prec = arg2
387
387
388
- ## too many things (padics, elliptic curves) depend on this behavior,
389
- ## so no warning for now.
390
- ##
388
+ # ## too many things (padics, elliptic curves) depend on this behavior,
389
+ # ## so no warning for now.
391
390
392
- # if isinstance(name, (int,integer.Integer)) or isinstance(arg2,(int,integer.Integer)):
391
+ # if isinstance(name, (int, integer.Integer)) or isinstance(arg2, (int, integer.Integer)):
393
392
# deprecation(issue_number, "This behavior of PowerSeriesRing is being deprecated in favor of constructing multivariate power series rings. (See Github issue #1956.)")
394
393
395
394
# the following is the original, univariate-only code
@@ -427,16 +426,17 @@ def PowerSeriesRing(base_ring, name=None, arg2=None, names=None,
427
426
raise TypeError ("base_ring must be a commutative ring" )
428
427
return R
429
428
429
+
430
430
def _multi_variate (base_ring , num_gens = None , names = None ,
431
- order = 'negdeglex' , default_prec = None , sparse = False ):
431
+ order = 'negdeglex' , default_prec = None , sparse = False ):
432
432
"""
433
433
Construct multivariate power series ring.
434
434
"""
435
435
if names is None :
436
436
raise TypeError ("you must specify a variable name or names" )
437
437
438
438
if num_gens is None :
439
- if isinstance (names ,str ):
439
+ if isinstance (names , str ):
440
440
num_gens = len (names .split (',' ))
441
441
elif isinstance (names , (list , tuple )):
442
442
num_gens = len (names )
@@ -458,6 +458,7 @@ def _multi_variate(base_ring, num_gens=None, names=None,
458
458
def _single_variate ():
459
459
pass
460
460
461
+
461
462
def is_PowerSeriesRing (R ):
462
463
"""
463
464
Return ``True`` if this is a *univariate* power series ring. This is in
@@ -489,7 +490,8 @@ def is_PowerSeriesRing(R):
489
490
else :
490
491
return False
491
492
492
- class PowerSeriesRing_generic (UniqueRepresentation , ring .CommutativeRing , Nonexact ):
493
+
494
+ class PowerSeriesRing_generic (UniqueRepresentation , Parent , Nonexact ):
493
495
"""
494
496
A power series ring.
495
497
"""
@@ -592,9 +594,9 @@ def __init__(self, base_ring, name=None, default_prec=None, sparse=False,
592
594
else :
593
595
raise ValueError ('unknown power series implementation: %r' % implementation )
594
596
595
- ring . CommutativeRing . __init__ (self , base_ring , names = name ,
596
- category = getattr (self , '_default_category' ,
597
- _CommutativeRings ))
597
+ Parent . __init__ (self , base = base_ring , names = name ,
598
+ category = getattr (self , '_default_category' ,
599
+ _CommutativeRings ))
598
600
Nonexact .__init__ (self , default_prec )
599
601
if implementation == 'pari' :
600
602
self .__generator = self .element_class (self , R .gen ().__pari__ ())
@@ -832,7 +834,7 @@ def _element_constructor_(self, f, prec=infinity, check=True):
832
834
elif isinstance (f , LaurentSeries ) and f .parent ().power_series_ring () is self :
833
835
return self (f .power_series (), prec , check = check )
834
836
elif isinstance (f , MagmaElement ) and str (f .Type ()) == 'RngSerPowElt' :
835
- v = sage_eval (f .Eltseq ())
837
+ v = sage_eval (f .Eltseq ()) # could use .sage() ?
836
838
return self (v ) * (self .gen (0 )** f .Valuation ())
837
839
elif isinstance (f , FractionFieldElement ):
838
840
if self .base_ring ().has_coerce_map_from (f .parent ()):
@@ -846,7 +848,8 @@ def _element_constructor_(self, f, prec=infinity, check=True):
846
848
if isinstance (f , SymbolicSeries ):
847
849
if str (f .default_variable ()) == self .variable_name ():
848
850
return self .element_class (self , f .list (),
849
- f .degree (f .default_variable ()), check = check )
851
+ f .degree (f .default_variable ()),
852
+ check = check )
850
853
else :
851
854
raise TypeError ("Can only convert series into ring with same variable name." )
852
855
else :
@@ -1097,6 +1100,18 @@ def gen(self, n=0):
1097
1100
raise IndexError ("generator n>0 not defined" )
1098
1101
return self .__generator
1099
1102
1103
+ def gens (self ) -> tuple :
1104
+ """
1105
+ Return the generators of this ring.
1106
+
1107
+ EXAMPLES::
1108
+
1109
+ sage: R.<t> = PowerSeriesRing(ZZ)
1110
+ sage: R.gens()
1111
+ (t,)
1112
+ """
1113
+ return (self .__generator ,)
1114
+
1100
1115
def uniformizer (self ):
1101
1116
"""
1102
1117
Return a uniformizer of this power series ring if it is
@@ -1357,6 +1372,7 @@ def _get_action_(self, other, op, self_is_left):
1357
1372
return BaseRingFloorDivAction (other , self , is_left = False )
1358
1373
return super ()._get_action_ (other , op , self_is_left )
1359
1374
1375
+
1360
1376
class PowerSeriesRing_over_field (PowerSeriesRing_domain ):
1361
1377
_default_category = CompleteDiscreteValuationRings ()
1362
1378
0 commit comments