# Puiseux Series Ring Element#

A Puiseux series is a series of the form

$p(x) = \sum_{n=N}^{\infty} a_n (x-a)^{n/e},$

where the integer $$e$$ is called the ramification index of the series and the number $$a$$ is the center. A Puiseux series is essentially a Laurent series but with fractional exponents.

EXAMPLES:

We begin by constructing the ring of Puiseux series in $$x$$ with coefficients in the rationals:

sage: R.<x> = PuiseuxSeriesRing(QQ)

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(QQ, names=('x',)); (x,) = R._first_ngens(1)


This command also defines x as the generator of this ring.

When constructing a Puiseux series, the ramification index is automatically determined from the greatest common divisor of the exponents:

sage: p = x^(1/2); p
x^(1/2)
sage: p.ramification_index()
2
sage: q = x^(1/2) + x**(1/3); q
x^(1/3) + x^(1/2)
sage: q.ramification_index()
6

>>> from sage.all import *
>>> p = x**(Integer(1)/Integer(2)); p
x^(1/2)
>>> p.ramification_index()
2
>>> q = x**(Integer(1)/Integer(2)) + x**(Integer(1)/Integer(3)); q
x^(1/3) + x^(1/2)
>>> q.ramification_index()
6


Other arithmetic can be performed with Puiseux Series:

sage: p + q
x^(1/3) + 2*x^(1/2)
sage: p - q
-x^(1/3)
sage: p * q
x^(5/6) + x
x^(1/6) - x^(1/3) + x^(1/2) - x^(2/3) + x^(5/6) - x + x^(7/6) + O(x^(4/3))

>>> from sage.all import *
>>> p + q
x^(1/3) + 2*x^(1/2)
>>> p - q
-x^(1/3)
>>> p * q
x^(5/6) + x
x^(1/6) - x^(1/3) + x^(1/2) - x^(2/3) + x^(5/6) - x + x^(7/6) + O(x^(4/3))


Mind the base ring. However, the base ring can be changed:

sage: I*q                                                                           # needs sage.rings.number_field
Traceback (most recent call last):
...
TypeError: unsupported operand parent(s) for *:
'Number Field in I with defining polynomial x^2 + 1 with I = 1*I' and
'Puiseux Series Ring in x over Rational Field'
sage: qz = q.change_ring(ZZ); qz
x^(1/3) + x^(1/2)
sage: qz.parent()
Puiseux Series Ring in x over Integer Ring

>>> from sage.all import *
>>> I*q                                                                           # needs sage.rings.number_field
Traceback (most recent call last):
...
TypeError: unsupported operand parent(s) for *:
'Number Field in I with defining polynomial x^2 + 1 with I = 1*I' and
'Puiseux Series Ring in x over Rational Field'
>>> qz = q.change_ring(ZZ); qz
x^(1/3) + x^(1/2)
>>> qz.parent()
Puiseux Series Ring in x over Integer Ring


Other properties of the Puiseux series can be easily obtained:

sage: r = (3*x^(-1/5) + 7*x^(2/5) + (1/2)*x).add_bigoh(6/5); r
3*x^(-1/5) + 7*x^(2/5) + 1/2*x + O(x^(6/5))
sage: r.valuation()
-1/5
sage: r.prec()
6/5
sage: r.precision_absolute()
6/5
sage: r.precision_relative()
7/5
sage: r.exponents()
[-1/5, 2/5, 1]
sage: r.coefficients()
[3, 7, 1/2]

>>> from sage.all import *
>>> r = (Integer(3)*x**(-Integer(1)/Integer(5)) + Integer(7)*x**(Integer(2)/Integer(5)) + (Integer(1)/Integer(2))*x).add_bigoh(Integer(6)/Integer(5)); r
3*x^(-1/5) + 7*x^(2/5) + 1/2*x + O(x^(6/5))
>>> r.valuation()
-1/5
>>> r.prec()
6/5
>>> r.precision_absolute()
6/5
>>> r.precision_relative()
7/5
>>> r.exponents()
[-1/5, 2/5, 1]
>>> r.coefficients()
[3, 7, 1/2]


Finally, Puiseux series are compatible with other objects in Sage. For example, you can perform arithmetic with Laurent series:

sage: L.<x> = LaurentSeriesRing(ZZ)
sage: l = 3*x^(-2) + x^(-1) + 2 + x**3
sage: r + l
3*x^-2 + x^-1 + 3*x^(-1/5) + 2 + 7*x^(2/5) + 1/2*x + O(x^(6/5))

>>> from sage.all import *
>>> L = LaurentSeriesRing(ZZ, names=('x',)); (x,) = L._first_ngens(1)
>>> l = Integer(3)*x**(-Integer(2)) + x**(-Integer(1)) + Integer(2) + x**Integer(3)
>>> r + l
3*x^-2 + x^-1 + 3*x^(-1/5) + 2 + 7*x^(2/5) + 1/2*x + O(x^(6/5))


AUTHORS:

REFERENCES:

class sage.rings.puiseux_series_ring_element.PuiseuxSeries[source]#

Bases: AlgebraElement

A Puiseux series.

$\sum_{n=-N}^\infty a_n x^{n/e}$

It is stored as a Laurent series:

$\sum_{n=-N}^\infty a_n t^n$

where $$t = x^{1/e}$$.

INPUT:

• parent – the parent ring

• f – one of the following types of inputs:

• e – integer (default: 1) the ramification index

EXAMPLES:

sage: R.<x> = PuiseuxSeriesRing(QQ)
sage: p = x^(1/2) + x**3; p
x^(1/2) + x^3
sage: q = x**(1/2) - x**(-1/2)
-x^(-1/2) + x^(1/2) + O(x^(7/2))
sage: r**2
x^-1 - 2 + x + O(x^3)

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(QQ, names=('x',)); (x,) = R._first_ngens(1)
>>> p = x**(Integer(1)/Integer(2)) + x**Integer(3); p
x^(1/2) + x^3
>>> q = x**(Integer(1)/Integer(2)) - x**(-Integer(1)/Integer(2))
-x^(-1/2) + x^(1/2) + O(x^(7/2))
>>> r**Integer(2)
x^-1 - 2 + x + O(x^3)


Return the truncated series at chosen precision prec.

INPUT:

• prec – the precision of the series as a rational number

EXAMPLES:

sage: R.<x> = PuiseuxSeriesRing(QQ)
sage: p = x^(-7/2) + 3 + 5*x^(1/2) - 7*x**3
x^(-7/2) + 3 + 5*x^(1/2) + O(x^2)
x^(-7/2) + O(1)
x^(-7/2) + O(x^-1)

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(QQ, names=('x',)); (x,) = R._first_ngens(1)
>>> p = x**(-Integer(7)/Integer(2)) + Integer(3) + Integer(5)*x**(Integer(1)/Integer(2)) - Integer(7)*x**Integer(3)
x^(-7/2) + 3 + 5*x^(1/2) + O(x^2)
x^(-7/2) + O(1)
x^(-7/2) + O(x^-1)


Note

The precision passed to the method is adapted to the common ramification index:

sage: R.<x> = PuiseuxSeriesRing(ZZ)
sage: p = x**(-1/3) + 2*x**(1/5)
x^(-1/3) + 2*x^(1/5) + O(x^(7/15))

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(ZZ, names=('x',)); (x,) = R._first_ngens(1)
>>> p = x**(-Integer(1)/Integer(3)) + Integer(2)*x**(Integer(1)/Integer(5))
x^(-1/3) + 2*x^(1/5) + O(x^(7/15))

change_ring(R)[source]#

Return self over a the new ring R.

EXAMPLES:

sage: R.<x> = PuiseuxSeriesRing(ZZ)
sage: p = x^(-7/2) + 3 + 5*x^(1/2) - 7*x**3
sage: q = p.change_ring(QQ); q
x^(-7/2) + 3 + 5*x^(1/2) - 7*x^3
sage: q.parent()
Puiseux Series Ring in x over Rational Field

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(ZZ, names=('x',)); (x,) = R._first_ngens(1)
>>> p = x**(-Integer(7)/Integer(2)) + Integer(3) + Integer(5)*x**(Integer(1)/Integer(2)) - Integer(7)*x**Integer(3)
>>> q = p.change_ring(QQ); q
x^(-7/2) + 3 + 5*x^(1/2) - 7*x^3
>>> q.parent()
Puiseux Series Ring in x over Rational Field

coefficients()[source]#

Return the list of coefficients.

EXAMPLES:

sage: R.<x> = PuiseuxSeriesRing(ZZ)
sage: p = x^(3/4) + 2*x^(4/5) + 3* x^(5/6)
sage: p.coefficients()
[1, 2, 3]

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(ZZ, names=('x',)); (x,) = R._first_ngens(1)
>>> p = x**(Integer(3)/Integer(4)) + Integer(2)*x**(Integer(4)/Integer(5)) + Integer(3)* x**(Integer(5)/Integer(6))
>>> p.coefficients()
[1, 2, 3]

common_prec(p)[source]#

Return the minimum precision of $$p$$ and self.

EXAMPLES:

sage: R.<x> = PuiseuxSeriesRing(ZZ)
sage: p = (x**(-1/3) + 2*x**3)**2
x^(-2/3) + 4*x^(8/3) + O(x^5)
x^(-2/3) + 4*x^(8/3) + 4*x^6 + O(x^7)
sage: q5.common_prec(q7)
5
sage: q7.common_prec(q5)
5

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(ZZ, names=('x',)); (x,) = R._first_ngens(1)
>>> p = (x**(-Integer(1)/Integer(3)) + Integer(2)*x**Integer(3))**Integer(2)
x^(-2/3) + 4*x^(8/3) + O(x^5)
x^(-2/3) + 4*x^(8/3) + 4*x^6 + O(x^7)
>>> q5.common_prec(q7)
5
>>> q7.common_prec(q5)
5

degree()[source]#

Return the degree of self.

EXAMPLES:

sage: P.<y> = PolynomialRing(GF(5))
sage: R.<x> = PuiseuxSeriesRing(P)
sage: p = 3*y*x**(-2/3) + 2*y**2*x**(1/5); p
3*y*x^(-2/3) + 2*y^2*x^(1/5)
sage: p.degree()
1/5

>>> from sage.all import *
>>> P = PolynomialRing(GF(Integer(5)), names=('y',)); (y,) = P._first_ngens(1)
>>> R = PuiseuxSeriesRing(P, names=('x',)); (x,) = R._first_ngens(1)
>>> p = Integer(3)*y*x**(-Integer(2)/Integer(3)) + Integer(2)*y**Integer(2)*x**(Integer(1)/Integer(5)); p
3*y*x^(-2/3) + 2*y^2*x^(1/5)
>>> p.degree()
1/5

exponents()[source]#

Return the list of exponents.

EXAMPLES:

sage: R.<x> = PuiseuxSeriesRing(ZZ)
sage: p = x^(3/4) + 2*x^(4/5) + 3* x^(5/6)
sage: p.exponents()
[3/4, 4/5, 5/6]

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(ZZ, names=('x',)); (x,) = R._first_ngens(1)
>>> p = x**(Integer(3)/Integer(4)) + Integer(2)*x**(Integer(4)/Integer(5)) + Integer(3)* x**(Integer(5)/Integer(6))
>>> p.exponents()
[3/4, 4/5, 5/6]

inverse()[source]#

Return the inverse of self.

EXAMPLES:

sage: R.<x> = PuiseuxSeriesRing(QQ)
sage: p = x^(-7/2) + 3 + 5*x^(1/2) - 7*x**3
sage: 1/p
x^(7/2) - 3*x^7 - 5*x^(15/2) + 7*x^10 + 9*x^(21/2) + 30*x^11 +
25*x^(23/2) + O(x^(27/2))

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(QQ, names=('x',)); (x,) = R._first_ngens(1)
>>> p = x**(-Integer(7)/Integer(2)) + Integer(3) + Integer(5)*x**(Integer(1)/Integer(2)) - Integer(7)*x**Integer(3)
>>> Integer(1)/p
x^(7/2) - 3*x^7 - 5*x^(15/2) + 7*x^10 + 9*x^(21/2) + 30*x^11 +
25*x^(23/2) + O(x^(27/2))

is_monomial()[source]#

Return whether self is a monomial.

This is True if and only if self is $$x^p$$ for some rational $$p$$.

EXAMPLES:

sage: R.<x> = PuiseuxSeriesRing(QQ)
sage: p = x^(1/2) + 3/4 * x^(2/3)
sage: p.is_monomial()
False
sage: q = x**(11/13)
sage: q.is_monomial()
True
sage: q = 4*x**(11/13)
sage: q.is_monomial()
False

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(QQ, names=('x',)); (x,) = R._first_ngens(1)
>>> p = x**(Integer(1)/Integer(2)) + Integer(3)/Integer(4) * x**(Integer(2)/Integer(3))
>>> p.is_monomial()
False
>>> q = x**(Integer(11)/Integer(13))
>>> q.is_monomial()
True
>>> q = Integer(4)*x**(Integer(11)/Integer(13))
>>> q.is_monomial()
False

is_unit()[source]#

Return whether self is a unit.

A Puiseux series is a unit if and only if its leading coefficient is.

EXAMPLES:

sage: R.<x> = PuiseuxSeriesRing(ZZ)
sage: p = x^(-7/2) + 3 + 5*x^(1/2) - 7*x**3
sage: p.is_unit()
True
sage: q = 4 * x^(-7/2) + 3 * x**4
sage: q.is_unit()
False

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(ZZ, names=('x',)); (x,) = R._first_ngens(1)
>>> p = x**(-Integer(7)/Integer(2)) + Integer(3) + Integer(5)*x**(Integer(1)/Integer(2)) - Integer(7)*x**Integer(3)
>>> p.is_unit()
True
>>> q = Integer(4) * x**(-Integer(7)/Integer(2)) + Integer(3) * x**Integer(4)
>>> q.is_unit()
False

is_zero()[source]#

Return whether self is zero.

EXAMPLES:

sage: R.<x> = PuiseuxSeriesRing(QQ)
sage: p = x^(1/2) + 3/4 * x^(2/3)
sage: p.is_zero()
False
sage: R.zero().is_zero()
True

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(QQ, names=('x',)); (x,) = R._first_ngens(1)
>>> p = x**(Integer(1)/Integer(2)) + Integer(3)/Integer(4) * x**(Integer(2)/Integer(3))
>>> p.is_zero()
False
>>> R.zero().is_zero()
True

laurent_part()[source]#

Return the underlying Laurent series.

EXAMPLES:

sage: R.<x> = PuiseuxSeriesRing(QQ)
sage: p = x^(1/2) + 3/4 * x^(2/3)
sage: p.laurent_part()
x^3 + 3/4*x^4

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(QQ, names=('x',)); (x,) = R._first_ngens(1)
>>> p = x**(Integer(1)/Integer(2)) + Integer(3)/Integer(4) * x**(Integer(2)/Integer(3))
>>> p.laurent_part()
x^3 + 3/4*x^4

laurent_series()[source]#

If self is a Laurent series, return it as a Laurent series.

EXAMPLES:

sage: R.<x> = PuiseuxSeriesRing(ZZ)
sage: p = x**(1/2) - x**(-1/2)
sage: p.laurent_series()
Traceback (most recent call last):
...
ArithmeticError: self is not a Laurent series
sage: q = p**2
sage: q.laurent_series()
x^-1 - 2 + x

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(ZZ, names=('x',)); (x,) = R._first_ngens(1)
>>> p = x**(Integer(1)/Integer(2)) - x**(-Integer(1)/Integer(2))
>>> p.laurent_series()
Traceback (most recent call last):
...
ArithmeticError: self is not a Laurent series
>>> q = p**Integer(2)
>>> q.laurent_series()
x^-1 - 2 + x

list()[source]#

Return the list of coefficients indexed by the exponents of the the corresponding Laurent series.

EXAMPLES:

sage: R.<x> = PuiseuxSeriesRing(ZZ)
sage: p = x^(3/4) + 2*x^(4/5) + 3* x^(5/6)
sage: p.list()
[1, 0, 0, 2, 0, 3]

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(ZZ, names=('x',)); (x,) = R._first_ngens(1)
>>> p = x**(Integer(3)/Integer(4)) + Integer(2)*x**(Integer(4)/Integer(5)) + Integer(3)* x**(Integer(5)/Integer(6))
>>> p.list()
[1, 0, 0, 2, 0, 3]

power_series()[source]#

If self is a power series, return it as a power series.

EXAMPLES:

sage: # needs sage.rings.number_field
sage: R.<x> = PuiseuxSeriesRing(QQbar)
sage: p = x**(3/2) - QQbar(I)*x**(1/2)
sage: p.power_series()
Traceback (most recent call last):
...
ArithmeticError: self is not a power series
sage: q = p**2
sage: q.power_series()
-x - 2*I*x^2 + x^3

>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> R = PuiseuxSeriesRing(QQbar, names=('x',)); (x,) = R._first_ngens(1)
>>> p = x**(Integer(3)/Integer(2)) - QQbar(I)*x**(Integer(1)/Integer(2))
>>> p.power_series()
Traceback (most recent call last):
...
ArithmeticError: self is not a power series
>>> q = p**Integer(2)
>>> q.power_series()
-x - 2*I*x^2 + x^3

prec()[source]#

Return the precision of self.

EXAMPLES:

sage: R.<x> = PuiseuxSeriesRing(ZZ)
sage: p = (x**(-1/3) + 2*x**3)**2; p
x^(-2/3) + 4*x^(8/3) + 4*x^6
x^(-2/3) + 4*x^(8/3) + O(x^5)
sage: q.prec()
5

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(ZZ, names=('x',)); (x,) = R._first_ngens(1)
>>> p = (x**(-Integer(1)/Integer(3)) + Integer(2)*x**Integer(3))**Integer(2); p
x^(-2/3) + 4*x^(8/3) + 4*x^6
x^(-2/3) + 4*x^(8/3) + O(x^5)
>>> q.prec()
5

precision_absolute()[source]#

Return the precision of self.

EXAMPLES:

sage: R.<x> = PuiseuxSeriesRing(ZZ)
sage: p = (x**(-1/3) + 2*x**3)**2; p
x^(-2/3) + 4*x^(8/3) + 4*x^6
x^(-2/3) + 4*x^(8/3) + O(x^5)
sage: q.prec()
5

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(ZZ, names=('x',)); (x,) = R._first_ngens(1)
>>> p = (x**(-Integer(1)/Integer(3)) + Integer(2)*x**Integer(3))**Integer(2); p
x^(-2/3) + 4*x^(8/3) + 4*x^6
x^(-2/3) + 4*x^(8/3) + O(x^5)
>>> q.prec()
5

precision_relative()[source]#

Return the relative precision of the series.

The relative precision of the Puiseux series is the difference between its absolute precision and its valuation.

EXAMPLES:

sage: R.<x> = PuiseuxSeriesRing(GF(3))
sage: p = (x**(-1/3) + 2*x**3)**2; p
x^(-2/3) + x^(8/3) + x^6
x^(-2/3) + x^(8/3) + x^6 + O(x^7)
sage: q.precision_relative()
23/3

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(GF(Integer(3)), names=('x',)); (x,) = R._first_ngens(1)
>>> p = (x**(-Integer(1)/Integer(3)) + Integer(2)*x**Integer(3))**Integer(2); p
x^(-2/3) + x^(8/3) + x^6
x^(-2/3) + x^(8/3) + x^6 + O(x^7)
>>> q.precision_relative()
23/3

ramification_index()[source]#

Return the ramification index.

EXAMPLES:

sage: R.<x> = PuiseuxSeriesRing(QQ)
sage: p = x^(1/2) + 3/4 * x^(2/3)
sage: p.ramification_index()
6

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(QQ, names=('x',)); (x,) = R._first_ngens(1)
>>> p = x**(Integer(1)/Integer(2)) + Integer(3)/Integer(4) * x**(Integer(2)/Integer(3))
>>> p.ramification_index()
6

shift(r)[source]#

Return this Puiseux series multiplied by $$x^r$$.

EXAMPLES:

sage: P.<y> = LaurentPolynomialRing(ZZ)
sage: R.<x> = PuiseuxSeriesRing(P)
sage: p = y*x**(-1/3) + 2*y^(-2)*x**(1/2); p
y*x^(-1/3) + (2*y^-2)*x^(1/2)
sage: p.shift(3)
y*x^(8/3) + (2*y^-2)*x^(7/2)

>>> from sage.all import *
>>> P = LaurentPolynomialRing(ZZ, names=('y',)); (y,) = P._first_ngens(1)
>>> R = PuiseuxSeriesRing(P, names=('x',)); (x,) = R._first_ngens(1)
>>> p = y*x**(-Integer(1)/Integer(3)) + Integer(2)*y**(-Integer(2))*x**(Integer(1)/Integer(2)); p
y*x^(-1/3) + (2*y^-2)*x^(1/2)
>>> p.shift(Integer(3))
y*x^(8/3) + (2*y^-2)*x^(7/2)

truncate(r)[source]#

Return the Puiseux series of degree $$< r$$.

This is equivalent to self modulo $$x^r$$.

EXAMPLES:

sage: R.<x> = PuiseuxSeriesRing(ZZ)
sage: p = (x**(-1/3) + 2*x**3)**2; p
x^(-2/3) + 4*x^(8/3) + 4*x^6
sage: q = p.truncate(5); q
x^(-2/3) + 4*x^(8/3)
True

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(ZZ, names=('x',)); (x,) = R._first_ngens(1)
>>> p = (x**(-Integer(1)/Integer(3)) + Integer(2)*x**Integer(3))**Integer(2); p
x^(-2/3) + 4*x^(8/3) + 4*x^6
>>> q = p.truncate(Integer(5)); q
x^(-2/3) + 4*x^(8/3)
True

valuation()[source]#

Return the valuation of self.

EXAMPLES:

sage: R.<x> = PuiseuxSeriesRing(QQ)
sage: p = x^(-7/2) + 3 + 5*x^(1/2) - 7*x**3
sage: p.valuation()
-7/2

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(QQ, names=('x',)); (x,) = R._first_ngens(1)
>>> p = x**(-Integer(7)/Integer(2)) + Integer(3) + Integer(5)*x**(Integer(1)/Integer(2)) - Integer(7)*x**Integer(3)
>>> p.valuation()
-7/2

variable()[source]#

Return the variable of self.

EXAMPLES:

sage: R.<x> = PuiseuxSeriesRing(QQ)
sage: p = x^(-7/2) + 3 + 5*x^(1/2) - 7*x**3
sage: p.variable()
'x'

>>> from sage.all import *
>>> R = PuiseuxSeriesRing(QQ, names=('x',)); (x,) = R._first_ngens(1)
>>> p = x**(-Integer(7)/Integer(2)) + Integer(3) + Integer(5)*x**(Integer(1)/Integer(2)) - Integer(7)*x**Integer(3)
>>> p.variable()
'x'