Elements of Laurent polynomial rings#
- class sage.rings.polynomial.laurent_polynomial.LaurentPolynomial#
Bases:
CommutativeAlgebraElement
Base class for Laurent polynomials.
- change_ring(R)#
Return a copy of this Laurent polynomial, with coefficients in
R
.EXAMPLES:
sage: R.<x> = LaurentPolynomialRing(QQ) sage: a = x^2 + 3*x^3 + 5*x^-1 sage: a.change_ring(GF(3)) 2*x^-1 + x^2
Check that github issue #22277 is fixed:
sage: R.<x, y> = LaurentPolynomialRing(QQ) # needs sage.modules sage: a = 2*x^2 + 3*x^3 + 4*x^-1 # needs sage.modules sage: a.change_ring(GF(3)) # needs sage.modules -x^2 + x^-1
- dict()#
Abstract
dict
method.EXAMPLES:
sage: R.<x> = LaurentPolynomialRing(ZZ) sage: from sage.rings.polynomial.laurent_polynomial import LaurentPolynomial sage: LaurentPolynomial.dict(x) Traceback (most recent call last): ... NotImplementedError
- hamming_weight()#
Return the hamming weight of
self
.The hamming weight is number of non-zero coefficients and also known as the weight or sparsity.
EXAMPLES:
sage: R.<x> = LaurentPolynomialRing(ZZ) sage: f = x^3 - 1 sage: f.hamming_weight() 2
- map_coefficients(f, new_base_ring=None)#
Apply
f
to the coefficients ofself
.If
f
is asage.categories.map.Map
, then the resulting polynomial will be defined over the codomain off
. Otherwise, the resulting polynomial will be over the same ring asself
. Setnew_base_ring
to override this behavior.INPUT:
f
– a callable that will be applied to the coefficients ofself
.new_base_ring
(optional) – if given, the resulting polynomial will be defined over this ring.
EXAMPLES:
sage: # needs sage.rings.finite_rings sage: k.<a> = GF(9) sage: R.<x> = LaurentPolynomialRing(k) sage: f = x*a + a sage: f.map_coefficients(lambda a: a + 1) (a + 1) + (a + 1)*x sage: R.<x,y> = LaurentPolynomialRing(k, 2) sage: f = x*a + 2*x^3*y*a + a sage: f.map_coefficients(lambda a: a + 1) (2*a + 1)*x^3*y + (a + 1)*x + a + 1
Examples with different base ring:
sage: # needs sage.modules sage.rings.finite_rings sage: R.<r> = GF(9); S.<s> = GF(81) sage: h = Hom(R, S)[0]; h Ring morphism: From: Finite Field in r of size 3^2 To: Finite Field in s of size 3^4 Defn: r |--> 2*s^3 + 2*s^2 + 1 sage: T.<X,Y> = LaurentPolynomialRing(R, 2) sage: f = r*X + Y sage: g = f.map_coefficients(h); g (2*s^3 + 2*s^2 + 1)*X + Y sage: g.parent() Multivariate Laurent Polynomial Ring in X, Y over Finite Field in s of size 3^4 sage: h = lambda x: x.trace() sage: g = f.map_coefficients(h); g X - Y sage: g.parent() Multivariate Laurent Polynomial Ring in X, Y over Finite Field in r of size 3^2 sage: g = f.map_coefficients(h, new_base_ring=GF(3)); g X - Y sage: g.parent() Multivariate Laurent Polynomial Ring in X, Y over Finite Field of size 3
- number_of_terms()#
Abstract method for number of terms
EXAMPLES:
sage: R.<x> = LaurentPolynomialRing(ZZ) sage: from sage.rings.polynomial.laurent_polynomial import LaurentPolynomial sage: LaurentPolynomial.number_of_terms(x) Traceback (most recent call last): ... NotImplementedError
- class sage.rings.polynomial.laurent_polynomial.LaurentPolynomial_univariate#
Bases:
LaurentPolynomial
A univariate Laurent polynomial in the form of \(t^n \cdot f\) where \(f\) is a polynomial in \(t\).
INPUT:
parent
– a Laurent polynomial ringf
– a polynomial (or something can be coerced to one)n
– (default: 0) an integer
AUTHORS:
Tom Boothby (2011) copied this class almost verbatim from
laurent_series_ring_element.pyx
, so most of the credit goes to William Stein, David Joyner, and Robert BradshawTravis Scrimshaw (09-2013): Cleaned-up and added a few extra methods
- coefficients()#
Return the nonzero coefficients of
self
.EXAMPLES:
sage: R.<t> = LaurentPolynomialRing(QQ) sage: f = -5/t^(2) + t + t^2 - 10/3*t^3 sage: f.coefficients() [-5, 1, 1, -10/3]
- constant_coefficient()#
Return the coefficient of the constant term of
self
.EXAMPLES:
sage: R.<t> = LaurentPolynomialRing(QQ) sage: f = 3*t^-2 - t^-1 + 3 + t^2 sage: f.constant_coefficient() 3 sage: g = -2*t^-2 + t^-1 + 3*t sage: g.constant_coefficient() 0
- degree()#
Return the degree of
self
.EXAMPLES:
sage: R.<x> = LaurentPolynomialRing(ZZ) sage: g = x^2 - x^4 sage: g.degree() 4 sage: g = -10/x^5 + x^2 - x^7 sage: g.degree() 7
- derivative(*args)#
The formal derivative of this Laurent polynomial, with respect to variables supplied in args.
Multiple variables and iteration counts may be supplied. See documentation for the global
derivative()
function for more details.See also
_derivative()
EXAMPLES:
sage: R.<x> = LaurentPolynomialRing(QQ) sage: g = 1/x^10 - x + x^2 - x^4 sage: g.derivative() -10*x^-11 - 1 + 2*x - 4*x^3 sage: g.derivative(x) -10*x^-11 - 1 + 2*x - 4*x^3
sage: R.<t> = PolynomialRing(ZZ) sage: S.<x> = LaurentPolynomialRing(R) sage: f = 2*t/x + (3*t^2 + 6*t)*x sage: f.derivative() -2*t*x^-2 + (3*t^2 + 6*t) sage: f.derivative(x) -2*t*x^-2 + (3*t^2 + 6*t) sage: f.derivative(t) 2*x^-1 + (6*t + 6)*x
- dict()#
Return a dictionary representing
self
.EXAMPLES:
sage: R.<x,y> = ZZ[] sage: Q.<t> = LaurentPolynomialRing(R) sage: f = (x^3 + y/t^3)^3 + t^2; f y^3*t^-9 + 3*x^3*y^2*t^-6 + 3*x^6*y*t^-3 + x^9 + t^2 sage: f.dict() {-9: y^3, -6: 3*x^3*y^2, -3: 3*x^6*y, 0: x^9, 2: 1}
- exponents()#
Return the exponents appearing in
self
with nonzero coefficients.EXAMPLES:
sage: R.<t> = LaurentPolynomialRing(QQ) sage: f = -5/t^(2) + t + t^2 - 10/3*t^3 sage: f.exponents() [-2, 1, 2, 3]
- factor()#
Return a Laurent monomial (the unit part of the factorization) and a factored polynomial.
EXAMPLES:
sage: R.<t> = LaurentPolynomialRing(ZZ) sage: f = 4*t^-7 + 3*t^3 + 2*t^4 + t^-6 sage: f.factor() # needs sage.libs.pari (t^-7) * (4 + t + 3*t^10 + 2*t^11)
- gcd(right)#
Return the gcd of
self
withright
where the common divisord
makes bothself
andright
into polynomials with the lowest possible degree.EXAMPLES:
sage: R.<t> = LaurentPolynomialRing(QQ) sage: t.gcd(2) 1 sage: gcd(t^-2 + 1, t^-4 + 3*t^-1) t^-4 sage: gcd((t^-2 + t)*(t + t^-1), (t^5 + t^8)*(1 + t^-2)) t^-3 + t^-1 + 1 + t^2
- integral()#
The formal integral of this Laurent series with 0 constant term.
EXAMPLES:
The integral may or may not be defined if the base ring is not a field.
sage: t = LaurentPolynomialRing(ZZ, 't').0 sage: f = 2*t^-3 + 3*t^2 sage: f.integral() -t^-2 + t^3
sage: f = t^3 sage: f.integral() Traceback (most recent call last): ... ArithmeticError: coefficients of integral cannot be coerced into the base ring
The integral of \(1/t\) is \(\log(t)\), which is not given by a Laurent polynomial:
sage: t = LaurentPolynomialRing(ZZ,'t').0 sage: f = -1/t^3 - 31/t sage: f.integral() Traceback (most recent call last): ... ArithmeticError: the integral of is not a Laurent polynomial, since t^-1 has nonzero coefficient
Another example with just one negative coefficient:
sage: A.<t> = LaurentPolynomialRing(QQ) sage: f = -2*t^(-4) sage: f.integral() 2/3*t^-3 sage: f.integral().derivative() == f True
- inverse_of_unit()#
Return the inverse of
self
if a unit.EXAMPLES:
sage: R.<t> = LaurentPolynomialRing(QQ) sage: (t^-2).inverse_of_unit() t^2 sage: (t + 2).inverse_of_unit() Traceback (most recent call last): ... ArithmeticError: element is not a unit
- is_constant()#
Return whether this Laurent polynomial is constant.
EXAMPLES:
sage: R.<x> = LaurentPolynomialRing(QQ) sage: x.is_constant() False sage: R.one().is_constant() True sage: (x^-2).is_constant() False sage: (x^2).is_constant() False sage: (x^-2 + 2).is_constant() False sage: R(0).is_constant() True sage: R(42).is_constant() True sage: x.is_constant() False sage: (1/x).is_constant() False
- is_monomial()#
Return
True
ifself
is a monomial; that is, ifself
is \(x^n\) for some integer \(n\).EXAMPLES:
sage: k.<z> = LaurentPolynomialRing(QQ) sage: z.is_monomial() True sage: k(1).is_monomial() True sage: (z+1).is_monomial() False sage: (z^-2909).is_monomial() True sage: (38*z^-2909).is_monomial() False
- is_square(root=False)#
Return whether this Laurent polynomial is a square.
If
root
is set toTrue
then return a pair made of the boolean answer together withNone
or a square root.EXAMPLES:
sage: R.<t> = LaurentPolynomialRing(QQ) sage: R.one().is_square() True sage: R(2).is_square() False sage: t.is_square() False sage: (t**-2).is_square() True
Usage of the
root
option:sage: p = (1 + t^-1 - 2*t^3) sage: p.is_square(root=True) (False, None) sage: (p**2).is_square(root=True) (True, -t^-1 - 1 + 2*t^3)
The answer is dependent of the base ring:
sage: # needs sage.rings.number_field sage: S.<u> = LaurentPolynomialRing(QQbar) sage: (2 + 4*t + 2*t^2).is_square() False sage: (2 + 4*u + 2*u^2).is_square() True
- is_unit()#
Return
True
if this Laurent polynomial is a unit in this ring.EXAMPLES:
sage: R.<t> = LaurentPolynomialRing(QQ) sage: (2 + t).is_unit() False sage: f = 2*t sage: f.is_unit() True sage: 1/f 1/2*t^-1 sage: R(0).is_unit() False sage: R.<s> = LaurentPolynomialRing(ZZ) sage: g = 2*s sage: g.is_unit() False sage: 1/g 1/2*s^-1
ALGORITHM: A Laurent polynomial is a unit if and only if its “unit part” is a unit.
- is_zero()#
Return
1
ifself
is 0, else return0
.EXAMPLES:
sage: R.<x> = LaurentPolynomialRing(QQ) sage: f = 1/x + x + x^2 + 3*x^4 sage: f.is_zero() 0 sage: z = 0*f sage: z.is_zero() 1
- number_of_terms()#
Return the number of non-zero coefficients of
self
.Also called weight, hamming weight or sparsity.
EXAMPLES:
sage: R.<x> = LaurentPolynomialRing(ZZ) sage: f = x^3 - 1 sage: f.number_of_terms() 2 sage: R(0).number_of_terms() 0 sage: f = (x+1)^100 sage: f.number_of_terms() 101
The method
hamming_weight()
is an alias:sage: f.hamming_weight() 101
- polynomial_construction()#
Return the polynomial and the shift in power used to construct the Laurent polynomial \(t^n u\).
OUTPUT:
A tuple
(u, n)
whereu
is the underlying polynomial andn
is the power of the exponent shift.EXAMPLES:
sage: R.<x> = LaurentPolynomialRing(QQ) sage: f = 1/x + x^2 + 3*x^4 sage: f.polynomial_construction() (3*x^5 + x^3 + 1, -1)
- quo_rem(other)#
Divide
self
byother
and return a quotientq
and a remainderr
such thatself == q * other + r
.EXAMPLES:
sage: R.<t> = LaurentPolynomialRing(QQ) sage: (t^-3 - t^3).quo_rem(t^-1 - t) (t^-2 + 1 + t^2, 0) sage: (t^-2 + 3 + t).quo_rem(t^-4) (t^2 + 3*t^4 + t^5, 0) sage: num = t^-2 + t sage: den = t^-2 + 1 sage: q, r = num.quo_rem(den) sage: num == q * den + r True
- residue()#
Return the residue of
self
.The residue is the coefficient of \(t^-1\).
EXAMPLES:
sage: R.<t> = LaurentPolynomialRing(QQ) sage: f = 3*t^-2 - t^-1 + 3 + t^2 sage: f.residue() -1 sage: g = -2*t^-2 + 4 + 3*t sage: g.residue() 0 sage: f.residue().parent() Rational Field
- shift(k)#
Return this Laurent polynomial multiplied by the power \(t^n\). Does not change this polynomial.
EXAMPLES:
sage: R.<t> = LaurentPolynomialRing(QQ['y']) sage: f = (t+t^-1)^4; f t^-4 + 4*t^-2 + 6 + 4*t^2 + t^4 sage: f.shift(10) t^6 + 4*t^8 + 6*t^10 + 4*t^12 + t^14 sage: f >> 10 t^-14 + 4*t^-12 + 6*t^-10 + 4*t^-8 + t^-6 sage: f << 4 1 + 4*t^2 + 6*t^4 + 4*t^6 + t^8
- truncate(n)#
Return a polynomial with degree at most \(n-1\) whose \(j\)-th coefficients agree with
self
for all \(j < n\).EXAMPLES:
sage: R.<x> = LaurentPolynomialRing(QQ) sage: f = 1/x^12 + x^3 + x^5 + x^9 sage: f.truncate(10) x^-12 + x^3 + x^5 + x^9 sage: f.truncate(5) x^-12 + x^3 sage: f.truncate(-16) 0
- valuation(p=None)#
Return the valuation of
self
.The valuation of a Laurent polynomial \(t^n u\) is \(n\) plus the valuation of \(u\).
EXAMPLES:
sage: R.<x> = LaurentPolynomialRing(ZZ) sage: f = 1/x + x^2 + 3*x^4 sage: g = 1 - x + x^2 - x^4 sage: f.valuation() -1 sage: g.valuation() 0
- variable_name()#
Return the name of variable of
self
as a string.EXAMPLES:
sage: R.<x> = LaurentPolynomialRing(QQ) sage: f = 1/x + x^2 + 3*x^4 sage: f.variable_name() 'x'
- variables()#
Return the tuple of variables occurring in this Laurent polynomial.
EXAMPLES:
sage: R.<x> = LaurentPolynomialRing(QQ) sage: f = 1/x + x^2 + 3*x^4 sage: f.variables() (x,) sage: R.one().variables() ()