# 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


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


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


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
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()
True

sage: z = H.base_ring().gens()
sage: f = H.gens()
sage: h = 4*z^2 + 2*z*z + z*z + z^2 \
+ (-z^2 - 2*z + z)*f*f \
+ (-22*z^2 + 2*z^2 - z*z + z^2 - 1955*z)*f*f \
+ (-z*z - 2*z^2)*f*f \
+ (2*z*z + z*z - z^2 - z + 3*z)*f^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

• Use angle-bracket notation:

sage: S.<x,y> = PowerSeriesRing(GF(65537)); S                                       # optional - sage.rings.finite_rings
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    # optional - sage.rings.finite_rings
-30077*x + 9485*x*y - 6260*y^3 + 12870*x^2*y^2 - 20289*y^4 + O(x, y)^5
sage: s in S                                                                        # optional - sage.rings.finite_rings
True
sage: TestSuite(S).run()                                                            # optional - sage.rings.finite_rings
sage: loads(dumps(S)) is S                                                          # optional - sage.rings.finite_rings
True

• 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']]                                                           # optional - sage.rings.finite_rings
Multivariate Power Series Ring in x, y over Finite Field of size 127931


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()
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


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)
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                                     # optional - sage.rings.finite_rings
Multivariate Power Series Ring in x, y over Finite Field of size 65537
sage: S.change_ring(GF(5))                                                          # optional - sage.rings.finite_rings
Multivariate Power Series Ring in x, y over Finite Field of size 5


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*g - 2*g - 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


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*g - 1/27*g^2 + g - 1/2*g; a
-2*t*v - 1/27*v^2 + t - 1/2*v
sage: a in R
True


Coercion from symbolic ring:

sage: x,y = var('x,y')                                                              # optional - sage.symbolic
sage: S = PowerSeriesRing(GF(11),2,'x,y'); S                                        # optional - sage.rings.finite_rings
Multivariate Power Series Ring in x, y over Finite Field of size 11
sage: type(x)                                                                       # optional - sage.symbolic
<class 'sage.symbolic.expression.Expression'>
sage: type(S(x))                                                                    # optional - sage.rings.finite_rings sage.symbolic
<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                                   # optional - sage.rings.finite_rings sage.symbolic
5 - x^2 + 4*x*y + y^2 + O(x, y)^3
sage: f.parent()                                                                    # optional - sage.rings.finite_rings sage.symbolic
Multivariate Power Series Ring in x, y over Finite Field of size 11
sage: f.parent() == S                                                               # optional - sage.rings.finite_rings sage.symbolic
True


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:

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

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#

alias of MPowerSeries

O(prec)#

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

bigoh(prec)#

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

change_ring(R)#

Returns 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)
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                             # optional - sage.rings.finite_rings
Multivariate Power Series Ring in x, y over Finite Field of size
65537
sage: S.change_ring(GF(5))                                                  # optional - sage.rings.finite_rings
Multivariate Power Series Ring in x, y over Finite Field of size 5

characteristic()#

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

EXAMPLES:

sage: H = PowerSeriesRing(GF(65537),4,'f'); H                               # optional - sage.rings.finite_rings
Multivariate Power Series Ring in f0, f1, f2, f3 over
Finite Field of size 65537
sage: H.characteristic()                                                    # optional - sage.rings.finite_rings
65537

construction()#

Returns 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

gen(n=0)#

Return the nth generator of self.

EXAMPLES:

sage: M = PowerSeriesRing(ZZ, 10, 'v')
sage: M.gen(6)
v6

is_dense()#

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

is_integral_domain(proof=False)#

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

is_noetherian(proof=False)#

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

is_sparse()#

Is self 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

laurent_series_ring()#

Laurent series not yet implemented for multivariate power series rings

ngens()#

Return number of generators of self.

EXAMPLES:

sage: M = PowerSeriesRing(ZZ, 10, 'v')
sage: M.ngens()
10

prec_ideal()#

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

remove_var(*var)#

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                                   # optional - sage.rings.finite_rings
Multivariate Power Series Ring in t0, t1, t2, t3, t4
over Finite Field of size 5
sage: M.remove_var(M.gens())                                             # optional - sage.rings.finite_rings
Multivariate Power Series Ring in t0, t1, t2, t4
over Finite Field of size 5


Removing all variables results in the base ring:

sage: M.remove_var(*M.gens())                                               # optional - sage.rings.finite_rings
Finite Field of size 5

term_order()#

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

sage.rings.multi_power_series_ring.is_MPowerSeriesRing(x)#

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)#

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