Multivariate Power Series Rings

Construct a multivariate power series ring (in finitely many variables) over a given (commutative) base ring.

EXAMPLES:

Construct rings and elements:

sage: R.<t,u,v> = PowerSeriesRing(QQ); R
Multivariate Power Series Ring in t, u, v over Rational Field
sage: TestSuite(R).run()
sage: p = -t + 1/2*t^3*u - 1/4*t^4*u + 2/3*v^5 + R.O(6); p
-t + 1/2*t^3*u - 1/4*t^4*u + 2/3*v^5 + O(t, u, v)^6
sage: p in R
True

sage: g = 1 + v + 3*u*t^2 - 2*v^2*t^2; g
1 + v + 3*t^2*u - 2*t^2*v^2
sage: g in R
True
>>> from sage.all import *
>>> R = PowerSeriesRing(QQ, names=('t', 'u', 'v',)); (t, u, v,) = R._first_ngens(3); R
Multivariate Power Series Ring in t, u, v over Rational Field
>>> TestSuite(R).run()
>>> p = -t + Integer(1)/Integer(2)*t**Integer(3)*u - Integer(1)/Integer(4)*t**Integer(4)*u + Integer(2)/Integer(3)*v**Integer(5) + R.O(Integer(6)); p
-t + 1/2*t^3*u - 1/4*t^4*u + 2/3*v^5 + O(t, u, v)^6
>>> p in R
True

>>> g = Integer(1) + v + Integer(3)*u*t**Integer(2) - Integer(2)*v**Integer(2)*t**Integer(2); g
1 + v + 3*t^2*u - 2*t^2*v^2
>>> g in R
True
R.<t,u,v> = PowerSeriesRing(QQ); R
TestSuite(R).run()
p = -t + 1/2*t^3*u - 1/4*t^4*u + 2/3*v^5 + R.O(6); p
p in R
g = 1 + v + 3*u*t^2 - 2*v^2*t^2; g
g in R

Add big O as with single variable power series:

sage: g.add_bigoh(3)
1 + v + O(t, u, v)^3
sage: g = g.O(5); g
1 + v + 3*t^2*u - 2*t^2*v^2 + O(t, u, v)^5
>>> from sage.all import *
>>> g.add_bigoh(Integer(3))
1 + v + O(t, u, v)^3
>>> g = g.O(Integer(5)); g
1 + v + 3*t^2*u - 2*t^2*v^2 + O(t, u, v)^5
g.add_bigoh(3)
g = g.O(5); g

Sage keeps track of total-degree precision:

sage: f = (g-1)^2 - g + 1; f
-v + v^2 - 3*t^2*u + 6*t^2*u*v + 2*t^2*v^2 + O(t, u, v)^5
sage: f in R
True
sage: f.prec()
5
sage: ((g-1-v)^2).prec()
8
>>> from sage.all import *
>>> f = (g-Integer(1))**Integer(2) - g + Integer(1); f
-v + v^2 - 3*t^2*u + 6*t^2*u*v + 2*t^2*v^2 + O(t, u, v)^5
>>> f in R
True
>>> f.prec()
5
>>> ((g-Integer(1)-v)**Integer(2)).prec()
8
f = (g-1)^2 - g + 1; f
f in R
f.prec()
((g-1-v)^2).prec()

Construct multivariate power series rings over various base rings.

sage: M = PowerSeriesRing(QQ, 4, 'k'); M
Multivariate Power Series Ring in k0, k1, k2, k3 over Rational Field
sage: loads(dumps(M)) is M
True
sage: TestSuite(M).run()

sage: H = PowerSeriesRing(PolynomialRing(ZZ, 3, 'z'), 4, 'f'); H
Multivariate Power Series Ring in f0, f1, f2, f3
 over Multivariate Polynomial Ring in z0, z1, z2 over Integer Ring
sage: TestSuite(H).run()
sage: loads(dumps(H)) is H
True

sage: z = H.base_ring().gens()
sage: f = H.gens()
sage: h = 4*z[1]^2 + 2*z[0]*z[2] + z[1]*z[2] + z[2]^2 \
+ (-z[2]^2 - 2*z[0] + z[2])*f[0]*f[2] \
+ (-22*z[0]^2 + 2*z[1]^2 - z[0]*z[2] + z[2]^2 - 1955*z[2])*f[1]*f[2] \
+ (-z[0]*z[1] - 2*z[1]^2)*f[2]*f[3] \
+ (2*z[0]*z[1] + z[1]*z[2] - z[2]^2 - z[1] + 3*z[2])*f[3]^2 \
+ H.O(3)
sage: h in H
True
sage: h
4*z1^2 + 2*z0*z2 + z1*z2 + z2^2 + (-z2^2 - 2*z0 + z2)*f0*f2
+ (-22*z0^2 + 2*z1^2 - z0*z2 + z2^2 - 1955*z2)*f1*f2
+ (-z0*z1 - 2*z1^2)*f2*f3 + (2*z0*z1 + z1*z2 - z2^2 - z1 + 3*z2)*f3^2
+ O(f0, f1, f2, f3)^3
>>> from sage.all import *
>>> M = PowerSeriesRing(QQ, Integer(4), 'k'); M
Multivariate Power Series Ring in k0, k1, k2, k3 over Rational Field
>>> loads(dumps(M)) is M
True
>>> TestSuite(M).run()

>>> H = PowerSeriesRing(PolynomialRing(ZZ, Integer(3), 'z'), Integer(4), 'f'); H
Multivariate Power Series Ring in f0, f1, f2, f3
 over Multivariate Polynomial Ring in z0, z1, z2 over Integer Ring
>>> TestSuite(H).run()
>>> loads(dumps(H)) is H
True

>>> z = H.base_ring().gens()
>>> f = H.gens()
>>> h = Integer(4)*z[Integer(1)]**Integer(2) + Integer(2)*z[Integer(0)]*z[Integer(2)] + z[Integer(1)]*z[Integer(2)] + z[Integer(2)]**Integer(2) \
+ (-z[2]^2 - 2*z[0] + z[2])*f[0]*f[2] \
+ (-22*z[0]^2 + 2*z[1]^2 - z[0]*z[2] + z[2]^2 - 1955*z[2])*f[1]*f[2] \
+ (-z[0]*z[1] - 2*z[1]^2)*f[2]*f[3] \
+ (2*z[0]*z[1] + z[1]*z[2] - z[2]^2 - z[1] + 3*z[2])*f[3]^2 \
+ H.O(3)
>>> h in H
True
>>> h
4*z1^2 + 2*z0*z2 + z1*z2 + z2^2 + (-z2^2 - 2*z0 + z2)*f0*f2
+ (-22*z0^2 + 2*z1^2 - z0*z2 + z2^2 - 1955*z2)*f1*f2
+ (-z0*z1 - 2*z1^2)*f2*f3 + (2*z0*z1 + z1*z2 - z2^2 - z1 + 3*z2)*f3^2
+ O(f0, f1, f2, f3)^3
M = PowerSeriesRing(QQ, 4, 'k'); M
loads(dumps(M)) is M
TestSuite(M).run()
H = PowerSeriesRing(PolynomialRing(ZZ, 3, 'z'), 4, 'f'); H
TestSuite(H).run()
loads(dumps(H)) is H
z = H.base_ring().gens()
f = H.gens()
h = 4*z[1]^2 + 2*z[0]*z[2] + z[1]*z[2] + z[2]^2 \
h in H
h
  • Use angle-bracket notation:

    sage: # needs sage.rings.finite_rings
    sage: S.<x,y> = PowerSeriesRing(GF(65537)); S
    Multivariate Power Series Ring in x, y over Finite Field of size 65537
    sage: s = -30077*x + 9485*x*y - 6260*y^3 + 12870*x^2*y^2 - 20289*y^4 + S.O(5); s
    -30077*x + 9485*x*y - 6260*y^3 + 12870*x^2*y^2 - 20289*y^4 + O(x, y)^5
    sage: s in S
    True
    sage: TestSuite(S).run()
    sage: loads(dumps(S)) is S
    True
    
    >>> from sage.all import *
    >>> # needs sage.rings.finite_rings
    >>> S = PowerSeriesRing(GF(Integer(65537)), names=('x', 'y',)); (x, y,) = S._first_ngens(2); S
    Multivariate Power Series Ring in x, y over Finite Field of size 65537
    >>> s = -Integer(30077)*x + Integer(9485)*x*y - Integer(6260)*y**Integer(3) + Integer(12870)*x**Integer(2)*y**Integer(2) - Integer(20289)*y**Integer(4) + S.O(Integer(5)); s
    -30077*x + 9485*x*y - 6260*y^3 + 12870*x^2*y^2 - 20289*y^4 + O(x, y)^5
    >>> s in S
    True
    >>> TestSuite(S).run()
    >>> loads(dumps(S)) is S
    True
    
    # needs sage.rings.finite_rings
    S.<x,y> = PowerSeriesRing(GF(65537)); S
    s = -30077*x + 9485*x*y - 6260*y^3 + 12870*x^2*y^2 - 20289*y^4 + S.O(5); s
    s in S
    TestSuite(S).run()
    loads(dumps(S)) is S
  • Use double square bracket notation:

    sage: ZZ[['s,t,u']]
    Multivariate Power Series Ring in s, t, u over Integer Ring
    sage: GF(127931)[['x,y']]                                                           # needs sage.rings.finite_rings
    Multivariate Power Series Ring in x, y over Finite Field of size 127931
    
    >>> from sage.all import *
    >>> ZZ[['s,t,u']]
    Multivariate Power Series Ring in s, t, u over Integer Ring
    >>> GF(Integer(127931))[['x,y']]                                                           # needs sage.rings.finite_rings
    Multivariate Power Series Ring in x, y over Finite Field of size 127931
    
    ZZ[['s,t,u']]
    GF(127931)[['x,y']]                                                           # needs sage.rings.finite_rings

Variable ordering determines how series are displayed.

sage: T.<a,b> = PowerSeriesRing(ZZ,order='deglex'); T
Multivariate Power Series Ring in a, b over Integer Ring
sage: TestSuite(T).run()
sage: loads(dumps(T)) is T
True
sage: T.term_order()
Degree lexicographic term order
sage: p = - 2*b^6 + a^5*b^2 + a^7 - b^2 - a*b^3 + T.O(9); p
a^7 + a^5*b^2 - 2*b^6 - a*b^3 - b^2 + O(a, b)^9

sage: U = PowerSeriesRing(ZZ,'a,b',order='negdeglex'); U
Multivariate Power Series Ring in a, b over Integer Ring
sage: U.term_order()
Negative degree lexicographic term order
sage: U(p)
-b^2 - a*b^3 - 2*b^6 + a^7 + a^5*b^2 + O(a, b)^9
>>> from sage.all import *
>>> T = PowerSeriesRing(ZZ,order='deglex', names=('a', 'b',)); (a, b,) = T._first_ngens(2); T
Multivariate Power Series Ring in a, b over Integer Ring
>>> TestSuite(T).run()
>>> loads(dumps(T)) is T
True
>>> T.term_order()
Degree lexicographic term order
>>> p = - Integer(2)*b**Integer(6) + a**Integer(5)*b**Integer(2) + a**Integer(7) - b**Integer(2) - a*b**Integer(3) + T.O(Integer(9)); p
a^7 + a^5*b^2 - 2*b^6 - a*b^3 - b^2 + O(a, b)^9

>>> U = PowerSeriesRing(ZZ,'a,b',order='negdeglex'); U
Multivariate Power Series Ring in a, b over Integer Ring
>>> U.term_order()
Negative degree lexicographic term order
>>> U(p)
-b^2 - a*b^3 - 2*b^6 + a^7 + a^5*b^2 + O(a, b)^9
T.<a,b> = PowerSeriesRing(ZZ,order='deglex'); T
TestSuite(T).run()
loads(dumps(T)) is T
T.term_order()
p = - 2*b^6 + a^5*b^2 + a^7 - b^2 - a*b^3 + T.O(9); p
U = PowerSeriesRing(ZZ,'a,b',order='negdeglex'); U
U.term_order()
U(p)

Change from one base ring to another:

sage: R.<t,u,v> = PowerSeriesRing(QQ); R
Multivariate Power Series Ring in t, u, v over Rational Field
sage: R.base_extend(RR)                                                             # needs sage.rings.real_mpfr
Multivariate Power Series Ring in t, u, v
 over Real Field with 53 bits of precision
sage: R.change_ring(IntegerModRing(10))
Multivariate Power Series Ring in t, u, v
 over Ring of integers modulo 10

sage: S = PowerSeriesRing(GF(65537),2,'x,y'); S                                     # needs sage.rings.finite_rings
Multivariate Power Series Ring in x, y over Finite Field of size 65537
sage: S.change_ring(GF(5))                                                          # needs sage.rings.finite_rings
Multivariate Power Series Ring in x, y over Finite Field of size 5
>>> from sage.all import *
>>> R = PowerSeriesRing(QQ, names=('t', 'u', 'v',)); (t, u, v,) = R._first_ngens(3); R
Multivariate Power Series Ring in t, u, v over Rational Field
>>> R.base_extend(RR)                                                             # needs sage.rings.real_mpfr
Multivariate Power Series Ring in t, u, v
 over Real Field with 53 bits of precision
>>> R.change_ring(IntegerModRing(Integer(10)))
Multivariate Power Series Ring in t, u, v
 over Ring of integers modulo 10

>>> S = PowerSeriesRing(GF(Integer(65537)),Integer(2),'x,y'); S                                     # needs sage.rings.finite_rings
Multivariate Power Series Ring in x, y over Finite Field of size 65537
>>> S.change_ring(GF(Integer(5)))                                                          # needs sage.rings.finite_rings
Multivariate Power Series Ring in x, y over Finite Field of size 5
R.<t,u,v> = PowerSeriesRing(QQ); R
R.base_extend(RR)                                                             # needs sage.rings.real_mpfr
R.change_ring(IntegerModRing(10))
S = PowerSeriesRing(GF(65537),2,'x,y'); S                                     # needs sage.rings.finite_rings
S.change_ring(GF(5))                                                          # needs sage.rings.finite_rings

Coercion from polynomial ring:

sage: R.<t,u,v> = PowerSeriesRing(QQ); R
Multivariate Power Series Ring in t, u, v over Rational Field
sage: A = PolynomialRing(ZZ,3,'t,u,v')
sage: g = A.gens()
sage: a = 2*g[0]*g[2] - 2*g[0] - 2; a
2*t*v - 2*t - 2
sage: R(a)
-2 - 2*t + 2*t*v
sage: R(a).O(4)
-2 - 2*t + 2*t*v + O(t, u, v)^4
sage: a.parent()
Multivariate Polynomial Ring in t, u, v over Integer Ring
sage: a in R
True
>>> from sage.all import *
>>> R = PowerSeriesRing(QQ, names=('t', 'u', 'v',)); (t, u, v,) = R._first_ngens(3); R
Multivariate Power Series Ring in t, u, v over Rational Field
>>> A = PolynomialRing(ZZ,Integer(3),'t,u,v')
>>> g = A.gens()
>>> a = Integer(2)*g[Integer(0)]*g[Integer(2)] - Integer(2)*g[Integer(0)] - Integer(2); a
2*t*v - 2*t - 2
>>> R(a)
-2 - 2*t + 2*t*v
>>> R(a).O(Integer(4))
-2 - 2*t + 2*t*v + O(t, u, v)^4
>>> a.parent()
Multivariate Polynomial Ring in t, u, v over Integer Ring
>>> a in R
True
R.<t,u,v> = PowerSeriesRing(QQ); R
A = PolynomialRing(ZZ,3,'t,u,v')
g = A.gens()
a = 2*g[0]*g[2] - 2*g[0] - 2; a
R(a)
R(a).O(4)
a.parent()
a in R

Coercion from polynomial ring in subset of variables:

sage: R.<t,u,v> = PowerSeriesRing(QQ); R
Multivariate Power Series Ring in t, u, v over Rational Field
sage: A = PolynomialRing(QQ,2,'t,v')
sage: g = A.gens()
sage: a = -2*g[0]*g[1] - 1/27*g[1]^2 + g[0] - 1/2*g[1]; a
-2*t*v - 1/27*v^2 + t - 1/2*v
sage: a in R
True
>>> from sage.all import *
>>> R = PowerSeriesRing(QQ, names=('t', 'u', 'v',)); (t, u, v,) = R._first_ngens(3); R
Multivariate Power Series Ring in t, u, v over Rational Field
>>> A = PolynomialRing(QQ,Integer(2),'t,v')
>>> g = A.gens()
>>> a = -Integer(2)*g[Integer(0)]*g[Integer(1)] - Integer(1)/Integer(27)*g[Integer(1)]**Integer(2) + g[Integer(0)] - Integer(1)/Integer(2)*g[Integer(1)]; a
-2*t*v - 1/27*v^2 + t - 1/2*v
>>> a in R
True
R.<t,u,v> = PowerSeriesRing(QQ); R
A = PolynomialRing(QQ,2,'t,v')
g = A.gens()
a = -2*g[0]*g[1] - 1/27*g[1]^2 + g[0] - 1/2*g[1]; a
a in R

Coercion from symbolic ring:

sage: # needs sage.symbolic
sage: x,y = var('x,y')
sage: S = PowerSeriesRing(GF(11),2,'x,y'); S
Multivariate Power Series Ring in x, y over Finite Field of size 11
sage: type(x)
<class 'sage.symbolic.expression.Expression'>
sage: type(S(x))
<class 'sage.rings.multi_power_series_ring.MPowerSeriesRing_generic_with_category.element_class'>
sage: f = S(2/7 -100*x^2 + 1/3*x*y + y^2).O(3); f
5 - x^2 + 4*x*y + y^2 + O(x, y)^3
sage: f.parent()
Multivariate Power Series Ring in x, y over Finite Field of size 11
sage: f.parent() == S
True
>>> from sage.all import *
>>> # needs sage.symbolic
>>> x,y = var('x,y')
>>> S = PowerSeriesRing(GF(Integer(11)),Integer(2),'x,y'); S
Multivariate Power Series Ring in x, y over Finite Field of size 11
>>> type(x)
<class 'sage.symbolic.expression.Expression'>
>>> type(S(x))
<class 'sage.rings.multi_power_series_ring.MPowerSeriesRing_generic_with_category.element_class'>
>>> f = S(Integer(2)/Integer(7) -Integer(100)*x**Integer(2) + Integer(1)/Integer(3)*x*y + y**Integer(2)).O(Integer(3)); f
5 - x^2 + 4*x*y + y^2 + O(x, y)^3
>>> f.parent()
Multivariate Power Series Ring in x, y over Finite Field of size 11
>>> f.parent() == S
True
# needs sage.symbolic
x,y = var('x,y')
S = PowerSeriesRing(GF(11),2,'x,y'); S
type(x)
type(S(x))
f = S(2/7 -100*x^2 + 1/3*x*y + y^2).O(3); f
f.parent()
f.parent() == S

The implementation of the multivariate power series ring uses a combination of multivariate polynomials and univariate power series. Namely, in order to construct the multivariate power series ring \(R[[x_1, x_2, \cdots, x_n]]\), we consider the univariate power series ring \(S[[T]]\) over the multivariate polynomial ring \(S := R[x_1, x_2, \cdots, x_n]\), and in it we take the subring formed by all power series whose \(i\)-th coefficient has degree \(i\) for all \(i \geq 0\). This subring is isomorphic to \(R[[x_1, x_2, \cdots, x_n]]\). This is how \(R[[x_1, x_2, \cdots, x_n]]\) is implemented in this class. The ring \(S\) is called the foreground polynomial ring, and the ring \(S[[T]]\) is called the background univariate power series ring.

AUTHORS:

  • Niles Johnson (2010-07): initial code

  • Simon King (2012-08, 2013-02): Use category and coercion framework, Issue #13412 and Issue #14084

class sage.rings.multi_power_series_ring.MPowerSeriesRing_generic(base_ring, num_gens, name_list, order='negdeglex', default_prec=10, sparse=False)[source]

Bases: PowerSeriesRing_generic, Nonexact

A multivariate power series ring. This class is implemented as a single variable power series ring in the variable T over a multivariable polynomial ring in the specified generators. Each generator g of the multivariable polynomial ring (called the “foreground ring”) is mapped to g*T in the single variable power series ring (called the “background ring”). The background power series ring is used to do arithmetic and track total-degree precision. The foreground polynomial ring is used to display elements.

For usage and examples, see above, and PowerSeriesRing().

Element[source]

alias of MPowerSeries

O(prec)[source]

Return big oh with precision prec. This function is an alias for bigoh.

EXAMPLES:

sage: T.<a,b> = PowerSeriesRing(ZZ,2); T
Multivariate Power Series Ring in a, b over Integer Ring
sage: T.O(10)
0 + O(a, b)^10
sage: T.bigoh(10)
0 + O(a, b)^10
>>> from sage.all import *
>>> T = PowerSeriesRing(ZZ,Integer(2), names=('a', 'b',)); (a, b,) = T._first_ngens(2); T
Multivariate Power Series Ring in a, b over Integer Ring
>>> T.O(Integer(10))
0 + O(a, b)^10
>>> T.bigoh(Integer(10))
0 + O(a, b)^10
T.<a,b> = PowerSeriesRing(ZZ,2); T
T.O(10)
T.bigoh(10)
bigoh(prec)[source]

Return big oh with precision prec. The function O does the same thing.

EXAMPLES:

sage: T.<a,b> = PowerSeriesRing(ZZ,2); T
Multivariate Power Series Ring in a, b over Integer Ring
sage: T.bigoh(10)
0 + O(a, b)^10
sage: T.O(10)
0 + O(a, b)^10
>>> from sage.all import *
>>> T = PowerSeriesRing(ZZ,Integer(2), names=('a', 'b',)); (a, b,) = T._first_ngens(2); T
Multivariate Power Series Ring in a, b over Integer Ring
>>> T.bigoh(Integer(10))
0 + O(a, b)^10
>>> T.O(Integer(10))
0 + O(a, b)^10
T.<a,b> = PowerSeriesRing(ZZ,2); T
T.bigoh(10)
T.O(10)
change_ring(R)[source]

Return the power series ring over \(R\) in the same variable as self. This function ignores the question of whether the base ring of self is or can extend to the base ring of \(R\); for the latter, use base_extend.

EXAMPLES:

sage: R.<t,u,v> = PowerSeriesRing(QQ); R
Multivariate Power Series Ring in t, u, v over Rational Field
sage: R.base_extend(RR)                                                     # needs sage.rings.real_mpfr
Multivariate Power Series Ring in t, u, v over Real Field with
53 bits of precision
sage: R.change_ring(IntegerModRing(10))
Multivariate Power Series Ring in t, u, v over Ring of integers
modulo 10
sage: R.base_extend(IntegerModRing(10))
Traceback (most recent call last):
...
TypeError: no base extension defined


sage: S = PowerSeriesRing(GF(65537),2,'x,y'); S                             # needs sage.rings.finite_rings
Multivariate Power Series Ring in x, y over Finite Field of size
65537
sage: S.change_ring(GF(5))                                                  # needs sage.rings.finite_rings
Multivariate Power Series Ring in x, y over Finite Field of size 5
>>> from sage.all import *
>>> R = PowerSeriesRing(QQ, names=('t', 'u', 'v',)); (t, u, v,) = R._first_ngens(3); R
Multivariate Power Series Ring in t, u, v over Rational Field
>>> R.base_extend(RR)                                                     # needs sage.rings.real_mpfr
Multivariate Power Series Ring in t, u, v over Real Field with
53 bits of precision
>>> R.change_ring(IntegerModRing(Integer(10)))
Multivariate Power Series Ring in t, u, v over Ring of integers
modulo 10
>>> R.base_extend(IntegerModRing(Integer(10)))
Traceback (most recent call last):
...
TypeError: no base extension defined


>>> S = PowerSeriesRing(GF(Integer(65537)),Integer(2),'x,y'); S                             # needs sage.rings.finite_rings
Multivariate Power Series Ring in x, y over Finite Field of size
65537
>>> S.change_ring(GF(Integer(5)))                                                  # needs sage.rings.finite_rings
Multivariate Power Series Ring in x, y over Finite Field of size 5
R.<t,u,v> = PowerSeriesRing(QQ); R
R.base_extend(RR)                                                     # needs sage.rings.real_mpfr
R.change_ring(IntegerModRing(10))
R.base_extend(IntegerModRing(10))
S = PowerSeriesRing(GF(65537),2,'x,y'); S                             # needs sage.rings.finite_rings
S.change_ring(GF(5))                                                  # needs sage.rings.finite_rings
characteristic()[source]

Return characteristic of base ring, which is characteristic of self.

EXAMPLES:

sage: H = PowerSeriesRing(GF(65537),4,'f'); H                               # needs sage.rings.finite_rings
Multivariate Power Series Ring in f0, f1, f2, f3 over
Finite Field of size 65537
sage: H.characteristic()                                                    # needs sage.rings.finite_rings
65537
>>> from sage.all import *
>>> H = PowerSeriesRing(GF(Integer(65537)),Integer(4),'f'); H                               # needs sage.rings.finite_rings
Multivariate Power Series Ring in f0, f1, f2, f3 over
Finite Field of size 65537
>>> H.characteristic()                                                    # needs sage.rings.finite_rings
65537
H = PowerSeriesRing(GF(65537),4,'f'); H                               # needs sage.rings.finite_rings
H.characteristic()                                                    # needs sage.rings.finite_rings
construction()[source]

Return a functor \(F\) and base ring \(R\) such that F(R) == self.

EXAMPLES:

sage: M = PowerSeriesRing(QQ, 4, 'f'); M
Multivariate Power Series Ring in f0, f1, f2, f3 over Rational Field

sage: (c,R) = M.construction(); (c,R)
(Completion[('f0', 'f1', 'f2', 'f3'), prec=12],
 Multivariate Polynomial Ring in f0, f1, f2, f3 over Rational Field)
sage: c
Completion[('f0', 'f1', 'f2', 'f3'), prec=12]
sage: c(R)
Multivariate Power Series Ring in f0, f1, f2, f3 over Rational Field
sage: c(R) == M
True
>>> from sage.all import *
>>> M = PowerSeriesRing(QQ, Integer(4), 'f'); M
Multivariate Power Series Ring in f0, f1, f2, f3 over Rational Field

>>> (c,R) = M.construction(); (c,R)
(Completion[('f0', 'f1', 'f2', 'f3'), prec=12],
 Multivariate Polynomial Ring in f0, f1, f2, f3 over Rational Field)
>>> c
Completion[('f0', 'f1', 'f2', 'f3'), prec=12]
>>> c(R)
Multivariate Power Series Ring in f0, f1, f2, f3 over Rational Field
>>> c(R) == M
True
M = PowerSeriesRing(QQ, 4, 'f'); M
(c,R) = M.construction(); (c,R)
c
c(R)
c(R) == M
gen(n=0)[source]

Return the \(n\)-th generator of self.

EXAMPLES:

sage: M = PowerSeriesRing(ZZ, 10, 'v')
sage: M.gen(6)
v6
>>> from sage.all import *
>>> M = PowerSeriesRing(ZZ, Integer(10), 'v')
>>> M.gen(Integer(6))
v6
M = PowerSeriesRing(ZZ, 10, 'v')
M.gen(6)
gens()[source]

Return the generators of this ring.

EXAMPLES:

sage: M = PowerSeriesRing(ZZ, 3, 'v')
sage: M.gens()
(v0, v1, v2)
>>> from sage.all import *
>>> M = PowerSeriesRing(ZZ, Integer(3), 'v')
>>> M.gens()
(v0, v1, v2)
M = PowerSeriesRing(ZZ, 3, 'v')
M.gens()
is_dense()[source]

Is self dense? (opposite of sparse)

EXAMPLES:

sage: M = PowerSeriesRing(ZZ, 3, 's,t,u'); M
Multivariate Power Series Ring in s, t, u over Integer Ring
sage: M.is_dense()
True
sage: N = PowerSeriesRing(ZZ, 3, 's,t,u', sparse=True); N
Sparse Multivariate Power Series Ring in s, t, u over Integer Ring
sage: N.is_dense()
False
>>> from sage.all import *
>>> M = PowerSeriesRing(ZZ, Integer(3), 's,t,u'); M
Multivariate Power Series Ring in s, t, u over Integer Ring
>>> M.is_dense()
True
>>> N = PowerSeriesRing(ZZ, Integer(3), 's,t,u', sparse=True); N
Sparse Multivariate Power Series Ring in s, t, u over Integer Ring
>>> N.is_dense()
False
M = PowerSeriesRing(ZZ, 3, 's,t,u'); M
M.is_dense()
N = PowerSeriesRing(ZZ, 3, 's,t,u', sparse=True); N
N.is_dense()
is_integral_domain(proof=False)[source]

Return True if the base ring is an integral domain; otherwise return False.

EXAMPLES:

sage: M = PowerSeriesRing(QQ,4,'v'); M
Multivariate Power Series Ring in v0, v1, v2, v3 over Rational Field
sage: M.is_integral_domain()
True
>>> from sage.all import *
>>> M = PowerSeriesRing(QQ,Integer(4),'v'); M
Multivariate Power Series Ring in v0, v1, v2, v3 over Rational Field
>>> M.is_integral_domain()
True
M = PowerSeriesRing(QQ,4,'v'); M
M.is_integral_domain()
is_noetherian(proof=False)[source]

Power series over a Noetherian ring are Noetherian.

EXAMPLES:

sage: M = PowerSeriesRing(QQ,4,'v'); M
Multivariate Power Series Ring in v0, v1, v2, v3 over Rational Field
sage: M.is_noetherian()
True

sage: W = PowerSeriesRing(InfinitePolynomialRing(ZZ,'a'),2,'x,y')
sage: W.is_noetherian()
False
>>> from sage.all import *
>>> M = PowerSeriesRing(QQ,Integer(4),'v'); M
Multivariate Power Series Ring in v0, v1, v2, v3 over Rational Field
>>> M.is_noetherian()
True

>>> W = PowerSeriesRing(InfinitePolynomialRing(ZZ,'a'),Integer(2),'x,y')
>>> W.is_noetherian()
False
M = PowerSeriesRing(QQ,4,'v'); M
M.is_noetherian()
W = PowerSeriesRing(InfinitePolynomialRing(ZZ,'a'),2,'x,y')
W.is_noetherian()
is_sparse()[source]

Check whether self is sparse.

EXAMPLES:

sage: M = PowerSeriesRing(ZZ, 3, 's,t,u'); M
Multivariate Power Series Ring in s, t, u over Integer Ring
sage: M.is_sparse()
False
sage: N = PowerSeriesRing(ZZ, 3, 's,t,u', sparse=True); N
Sparse Multivariate Power Series Ring in s, t, u over Integer Ring
sage: N.is_sparse()
True
>>> from sage.all import *
>>> M = PowerSeriesRing(ZZ, Integer(3), 's,t,u'); M
Multivariate Power Series Ring in s, t, u over Integer Ring
>>> M.is_sparse()
False
>>> N = PowerSeriesRing(ZZ, Integer(3), 's,t,u', sparse=True); N
Sparse Multivariate Power Series Ring in s, t, u over Integer Ring
>>> N.is_sparse()
True
M = PowerSeriesRing(ZZ, 3, 's,t,u'); M
M.is_sparse()
N = PowerSeriesRing(ZZ, 3, 's,t,u', sparse=True); N
N.is_sparse()
laurent_series_ring()[source]

Laurent series not yet implemented for multivariate power series rings.

ngens()[source]

Return number of generators of self.

EXAMPLES:

sage: M = PowerSeriesRing(ZZ, 10, 'v')
sage: M.ngens()
10
>>> from sage.all import *
>>> M = PowerSeriesRing(ZZ, Integer(10), 'v')
>>> M.ngens()
10
M = PowerSeriesRing(ZZ, 10, 'v')
M.ngens()
prec_ideal()[source]

Return the ideal which determines precision; this is the ideal generated by all of the generators of our background polynomial ring.

EXAMPLES:

sage: A.<s,t,u> = PowerSeriesRing(ZZ)
sage: A.prec_ideal()
Ideal (s, t, u) of
 Multivariate Polynomial Ring in s, t, u over Integer Ring
>>> from sage.all import *
>>> A = PowerSeriesRing(ZZ, names=('s', 't', 'u',)); (s, t, u,) = A._first_ngens(3)
>>> A.prec_ideal()
Ideal (s, t, u) of
 Multivariate Polynomial Ring in s, t, u over Integer Ring
A.<s,t,u> = PowerSeriesRing(ZZ)
A.prec_ideal()
remove_var(*var)[source]

Remove given variable or sequence of variables from self.

EXAMPLES:

sage: A.<s,t,u> = PowerSeriesRing(ZZ)
sage: A.remove_var(t)
Multivariate Power Series Ring in s, u over Integer Ring
sage: A.remove_var(s,t)
Power Series Ring in u over Integer Ring


sage: M = PowerSeriesRing(GF(5),5,'t'); M
Multivariate Power Series Ring in t0, t1, t2, t3, t4
 over Finite Field of size 5
sage: M.remove_var(M.gens()[3])
Multivariate Power Series Ring in t0, t1, t2, t4
 over Finite Field of size 5
>>> from sage.all import *
>>> A = PowerSeriesRing(ZZ, names=('s', 't', 'u',)); (s, t, u,) = A._first_ngens(3)
>>> A.remove_var(t)
Multivariate Power Series Ring in s, u over Integer Ring
>>> A.remove_var(s,t)
Power Series Ring in u over Integer Ring


>>> M = PowerSeriesRing(GF(Integer(5)),Integer(5),'t'); M
Multivariate Power Series Ring in t0, t1, t2, t3, t4
 over Finite Field of size 5
>>> M.remove_var(M.gens()[Integer(3)])
Multivariate Power Series Ring in t0, t1, t2, t4
 over Finite Field of size 5
A.<s,t,u> = PowerSeriesRing(ZZ)
A.remove_var(t)
A.remove_var(s,t)
M = PowerSeriesRing(GF(5),5,'t'); M
M.remove_var(M.gens()[3])

Removing all variables results in the base ring:

sage: M.remove_var(*M.gens())
Finite Field of size 5
>>> from sage.all import *
>>> M.remove_var(*M.gens())
Finite Field of size 5
M.remove_var(*M.gens())
term_order()[source]

Print term ordering of self. Term orderings are implemented by the TermOrder class.

EXAMPLES:

sage: M.<x,y,z> = PowerSeriesRing(ZZ,3)
sage: M.term_order()
Negative degree lexicographic term order
sage: m = y*z^12 - y^6*z^8 - x^7*y^5*z^2 + x*y^2*z + M.O(15); m
x*y^2*z + y*z^12 - x^7*y^5*z^2 - y^6*z^8 + O(x, y, z)^15

sage: N = PowerSeriesRing(ZZ,3,'x,y,z', order='deglex')
sage: N.term_order()
Degree lexicographic term order
sage: N(m)
-x^7*y^5*z^2 - y^6*z^8 + y*z^12 + x*y^2*z + O(x, y, z)^15
>>> from sage.all import *
>>> M = PowerSeriesRing(ZZ,Integer(3), names=('x', 'y', 'z',)); (x, y, z,) = M._first_ngens(3)
>>> M.term_order()
Negative degree lexicographic term order
>>> m = y*z**Integer(12) - y**Integer(6)*z**Integer(8) - x**Integer(7)*y**Integer(5)*z**Integer(2) + x*y**Integer(2)*z + M.O(Integer(15)); m
x*y^2*z + y*z^12 - x^7*y^5*z^2 - y^6*z^8 + O(x, y, z)^15

>>> N = PowerSeriesRing(ZZ,Integer(3),'x,y,z', order='deglex')
>>> N.term_order()
Degree lexicographic term order
>>> N(m)
-x^7*y^5*z^2 - y^6*z^8 + y*z^12 + x*y^2*z + O(x, y, z)^15
M.<x,y,z> = PowerSeriesRing(ZZ,3)
M.term_order()
m = y*z^12 - y^6*z^8 - x^7*y^5*z^2 + x*y^2*z + M.O(15); m
N = PowerSeriesRing(ZZ,3,'x,y,z', order='deglex')
N.term_order()
N(m)
sage.rings.multi_power_series_ring.is_MPowerSeriesRing(x)[source]

Return True if input is a multivariate power series ring.

sage.rings.multi_power_series_ring.unpickle_multi_power_series_ring_v0(base_ring, num_gens, names, order, default_prec, sparse)[source]

Unpickle (deserialize) a multivariate power series ring according to the given inputs.

EXAMPLES:

sage: P.<x,y> = PowerSeriesRing(QQ)
sage: loads(dumps(P)) == P # indirect doctest
True
>>> from sage.all import *
>>> P = PowerSeriesRing(QQ, names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> loads(dumps(P)) == P # indirect doctest
True
P.<x,y> = PowerSeriesRing(QQ)
loads(dumps(P)) == P # indirect doctest