Generic Multivariate Polynomials#
AUTHORS:
David Joyner: first version
William Stein: use dict’s instead of lists
Martin Albrecht malb@informatik.uni-bremen.de: some functions added
William Stein (2006-02-11): added better __div__ behavior.
Kiran S. Kedlaya (2006-02-12): added Macaulay2 analogues of some Singular features
William Stein (2006-04-19): added e.g.,
f[1,3]
to get coeff of \(xy^3\); added examples of the newR.x,y = PolynomialRing(QQ,2)
notation.Martin Albrecht: improved singular coercions (restructured class hierarchy) and added ETuples
Robert Bradshaw (2007-08-14): added support for coercion of polynomials in a subset of variables (including multi-level univariate rings)
Joel B. Mohler (2008-03): Refactored interactions with ETuples.
EXAMPLES:
We verify Lagrange’s four squares identity:
sage: R.<a0,a1,a2,a3,b0,b1,b2,b3> = QQbar[]
sage: (a0^2 + a1^2 + a2^2 + a3^2)*(b0^2 + b1^2 + b2^2 + b3^2) == (a0*b0 - a1*b1 - a2*b2 - a3*b3)^2 + (a0*b1 + a1*b0 + a2*b3 - a3*b2)^2 + (a0*b2 - a1*b3 + a2*b0 + a3*b1)^2 + (a0*b3 + a1*b2 - a2*b1 + a3*b0)^2
True
- class sage.rings.polynomial.multi_polynomial_element.MPolynomial_element(parent, x)#
Bases:
MPolynomial
EXAMPLES:
sage: K.<cuberoot2> = NumberField(x^3 - 2) sage: L.<cuberoot3> = K.extension(x^3 - 3) sage: S.<sqrt2> = L.extension(x^2 - 2) sage: S Number Field in sqrt2 with defining polynomial x^2 - 2 over its base field sage: P.<x,y,z> = PolynomialRing(S) # indirect doctest
- change_ring(R)#
Change the base ring of this polynomial to
R
.INPUT:
R
– ring or morphism.
OUTPUT: a new polynomial converted to
R
.EXAMPLES:
sage: R.<x,y> = QQ[] sage: f = x^2 + 5*y sage: f.change_ring(GF(5)) x^2
sage: K.<w> = CyclotomicField(5) sage: R.<x,y> = K[] sage: f = x^2 + w*y sage: f.change_ring(K.embeddings(QQbar)[1]) x^2 + (-0.8090169943749474? + 0.5877852522924731?*I)*y
- element()#
- hamming_weight()#
Return the number of non-zero coefficients of this polynomial.
This is also called weight,
hamming_weight()
or sparsity.EXAMPLES:
sage: R.<x, y> = CC[] sage: f = x^3 - y sage: f.number_of_terms() 2 sage: R(0).number_of_terms() 0 sage: f = (x+y)^100 sage: f.number_of_terms() 101
The method
hamming_weight()
is an alias:sage: f.hamming_weight() 101
- number_of_terms()#
Return the number of non-zero coefficients of this polynomial.
This is also called weight,
hamming_weight()
or sparsity.EXAMPLES:
sage: R.<x, y> = CC[] sage: f = x^3 - y sage: f.number_of_terms() 2 sage: R(0).number_of_terms() 0 sage: f = (x+y)^100 sage: f.number_of_terms() 101
The method
hamming_weight()
is an alias:sage: f.hamming_weight() 101
- class sage.rings.polynomial.multi_polynomial_element.MPolynomial_polydict(parent, x)#
Bases:
Polynomial_singular_repr
,MPolynomial_element
Multivariate polynomials implemented in pure python using polydicts.
- coefficient(degrees)#
Return the coefficient of the variables with the degrees specified in the python dictionary
degrees
. Mathematically, this is the coefficient in the base ring adjoined by the variables of this ring not listed indegrees
. However, the result has the same parent as this polynomial.This function contrasts with the function
monomial_coefficient
which returns the coefficient in the base ring of a monomial.INPUT:
degrees
- Can be any of:a dictionary of degree restrictions
a list of degree restrictions (with None in the unrestricted variables)
a monomial (very fast, but not as flexible)
OUTPUT: element of the parent of self
See also
For coefficients of specific monomials, look at
monomial_coefficient()
.EXAMPLES:
sage: R.<x, y> = QQbar[] sage: f = 2 * x * y sage: c = f.coefficient({x:1,y:1}); c 2 sage: c.parent() Multivariate Polynomial Ring in x, y over Algebraic Field sage: c in PolynomialRing(QQbar, 2, names = ['x','y']) True sage: f = y^2 - x^9 - 7*x + 5*x*y sage: f.coefficient({y:1}) 5*x sage: f.coefficient({y:0}) -x^9 + (-7)*x sage: f.coefficient({x:0,y:0}) 0 sage: f=(1+y+y^2)*(1+x+x^2) sage: f.coefficient({x:0}) y^2 + y + 1 sage: f.coefficient([0,None]) y^2 + y + 1 sage: f.coefficient(x) y^2 + y + 1 sage: # Be aware that this may not be what you think! sage: # The physical appearance of the variable x is deceiving -- particularly if the exponent would be a variable. sage: f.coefficient(x^0) # outputs the full polynomial x^2*y^2 + x^2*y + x*y^2 + x^2 + x*y + y^2 + x + y + 1
sage: R.<x,y> = RR[] sage: f=x*y+5 sage: c=f.coefficient({x:0,y:0}); c 5.00000000000000 sage: parent(c) Multivariate Polynomial Ring in x, y over Real Field with 53 bits of precision
AUTHORS:
Joel B. Mohler (2007-10-31)
- constant_coefficient()#
Return the constant coefficient of this multivariate polynomial.
EXAMPLES:
sage: R.<x,y> = QQbar[] sage: f = 3*x^2 - 2*y + 7*x^2*y^2 + 5 sage: f.constant_coefficient() 5 sage: f = 3*x^2 sage: f.constant_coefficient() 0
- degree(x=None, std_grading=False)#
Return the degree of self in x, where x must be one of the generators for the parent of self.
INPUT:
x
- multivariate polynomial (a generator of the parentof self). If
x
is not specified (or is None), return the total degree, which is the maximum degree of any monomial. Note that a weighted term ordering alters the grading of the generators of the ring; see the tests below. To avoid this behavior, set the optional argumentstd_grading=True
.
OUTPUT: integer
EXAMPLES:
sage: R.<x,y> = RR[] sage: f = y^2 - x^9 - x sage: f.degree(x) 9 sage: f.degree(y) 2 sage: (y^10*x - 7*x^2*y^5 + 5*x^3).degree(x) 3 sage: (y^10*x - 7*x^2*y^5 + 5*x^3).degree(y) 10
Note that total degree takes into account if we are working in a polynomial ring with a weighted term order.
sage: R = PolynomialRing(QQ,'x,y',order=TermOrder('wdeglex',(2,3))) sage: x,y = R.gens() sage: x.degree() 2 sage: y.degree() 3 sage: x.degree(y),x.degree(x),y.degree(x),y.degree(y) (0, 1, 0, 1) sage: f = (x^2*y+x*y^2) sage: f.degree(x) 2 sage: f.degree(y) 2 sage: f.degree() 8 sage: f.degree(std_grading=True) 3
Note that if
x
is not a generator of the parent of self, for example if it is a generator of a polynomial algebra which maps naturally to this one, then it is converted to an element of this algebra. (This fixes the problem reported in trac ticket #17366.)sage: x, y = ZZ['x','y'].gens() sage: GF(3037000453)['x','y'].gen(0).degree(x) 1 sage: x0, y0 = QQ['x','y'].gens() sage: GF(3037000453)['x','y'].gen(0).degree(x0) Traceback (most recent call last): ... TypeError: x must canonically coerce to parent sage: GF(3037000453)['x','y'].gen(0).degree(x^2) Traceback (most recent call last): ... TypeError: x must be one of the generators of the parent
- degrees()#
Returns a tuple (precisely - an
ETuple
) with the degree of each variable in this polynomial. The list of degrees is, of course, ordered by the order of the generators.EXAMPLES:
sage: R.<x,y,z>=PolynomialRing(QQbar) sage: f = 3*x^2 - 2*y + 7*x^2*y^2 + 5 sage: f.degrees() (2, 2, 0) sage: f = x^2+z^2 sage: f.degrees() (2, 0, 2) sage: f.total_degree() # this simply illustrates that total degree is not the sum of the degrees 2 sage: R.<x,y,z,u>=PolynomialRing(QQbar) sage: f=(1-x)*(1+y+z+x^3)^5 sage: f.degrees() (16, 5, 5, 0) sage: R(0).degrees() (0, 0, 0, 0)
- dict()#
Return underlying dictionary with keys the exponents and values the coefficients of this polynomial.
- exponents(as_ETuples=True)#
Return the exponents of the monomials appearing in
self
.INPUT:
as_ETuples
– (default:True
): return the list of exponents as a list of ETuples
OUTPUT:
The list of exponents as a list of ETuples or tuples.
EXAMPLES:
sage: R.<a,b,c> = PolynomialRing(QQbar, 3) sage: f = a^3 + b + 2*b^2 sage: f.exponents() [(3, 0, 0), (0, 2, 0), (0, 1, 0)]
By default the list of exponents is a list of ETuples:
sage: type(f.exponents()[0]) <class 'sage.rings.polynomial.polydict.ETuple'> sage: type(f.exponents(as_ETuples=False)[0]) <... 'tuple'>
- factor(proof=None)#
Compute the irreducible factorization of this polynomial.
INPUT:
proof'' - insist on provably correct results (default: ``True
unless explicitly disabled for the"polynomial"
subsystem withsage.structure.proof.proof.WithProof
.)
- global_height(prec=None)#
Return the (projective) global height of the polynomial.
This returns the absolute logarithmic height of the coefficients thought of as a projective point.
INPUT:
prec
– desired floating point precision (default: default RealField precision).
OUTPUT:
a real number.
EXAMPLES:
sage: R.<x,y> = PolynomialRing(QQbar, 2) sage: f = QQbar(i)*x^2 + 3*x*y sage: f.global_height() 1.09861228866811
Scaling should not change the result:
sage: R.<x, y> = PolynomialRing(QQbar, 2) sage: f = 1/25*x^2 + 25/3*x + 1 + QQbar(sqrt(2))*y^2 sage: f.global_height() 6.43775164973640 sage: g = 100 * f sage: g.global_height() 6.43775164973640
sage: R.<x> = QQ[] sage: K.<k> = NumberField(x^2 + 1) sage: Q.<q,r> = PolynomialRing(K, implementation='generic') sage: f = 12*q sage: f.global_height() 0.000000000000000
sage: R.<x,y> = PolynomialRing(QQ, implementation='generic') sage: f = 1/123*x*y + 12 sage: f.global_height(prec=2) 8.0
sage: R.<x,y> = PolynomialRing(QQ, implementation='generic') sage: f = 0*x*y sage: f.global_height() 0.000000000000000
- integral(var=None)#
Integrates
self
with respect to variablevar
.Note
The integral is always chosen so the constant term is 0.
If
var
is not one of the generators of this ring, integral(var) is called recursively on each coefficient of this polynomial.EXAMPLES:
On polynomials with rational coefficients:
sage: x, y = PolynomialRing(QQ, 'x, y').gens() sage: ex = x*y + x - y sage: it = ex.integral(x); it 1/2*x^2*y + 1/2*x^2 - x*y sage: it.parent() == x.parent() True
On polynomials with coefficients in power series:
sage: R.<t> = PowerSeriesRing(QQbar) sage: S.<x, y> = PolynomialRing(R) sage: f = (t^2 + O(t^3))*x^2*y^3 + (37*t^4 + O(t^5))*x^3 sage: f.parent() Multivariate Polynomial Ring in x, y over Power Series Ring in t over Algebraic Field sage: f.integral(x) # with respect to x (1/3*t^2 + O(t^3))*x^3*y^3 + (37/4*t^4 + O(t^5))*x^4 sage: f.integral(x).parent() Multivariate Polynomial Ring in x, y over Power Series Ring in t over Algebraic Field sage: f.integral(y) # with respect to y (1/4*t^2 + O(t^3))*x^2*y^4 + (37*t^4 + O(t^5))*x^3*y sage: f.integral(t) # with respect to t (recurses into base ring) (1/3*t^3 + O(t^4))*x^2*y^3 + (37/5*t^5 + O(t^6))*x^3
- inverse_of_unit()#
Return the inverse of a unit in a ring.
- is_constant()#
Return
True
ifself
is a constant andFalse
otherwise.EXAMPLES:
sage: R.<x,y> = QQbar[] sage: f = 3*x^2 - 2*y + 7*x^2*y^2 + 5 sage: f.is_constant() False sage: g = 10*x^0 sage: g.is_constant() True
- is_generator()#
Return
True
ifself
is a generator of its parent.EXAMPLES:
sage: R.<x,y>=QQbar[] sage: x.is_generator() True sage: (x+y-y).is_generator() True sage: (x*y).is_generator() False
- is_homogeneous()#
Return True if self is a homogeneous polynomial.
EXAMPLES:
sage: R.<x,y> = QQbar[] sage: (x+y).is_homogeneous() True sage: (x.parent()(0)).is_homogeneous() True sage: (x+y^2).is_homogeneous() False sage: (x^2 + y^2).is_homogeneous() True sage: (x^2 + y^2*x).is_homogeneous() False sage: (x^2*y + y^2*x).is_homogeneous() True
- is_monomial()#
Return
True
ifself
is a monomial, which we define to be a product of generators with coefficient 1.Use
is_term()
to allow the coefficient to not be 1.EXAMPLES:
sage: R.<x,y>=QQbar[] sage: x.is_monomial() True sage: (x+2*y).is_monomial() False sage: (2*x).is_monomial() False sage: (x*y).is_monomial() True
To allow a non-1 leading coefficient, use is_term():
sage: (2*x*y).is_term() True sage: (2*x*y).is_monomial() False
- is_term()#
Return
True
ifself
is a term, which we define to be a product of generators times some coefficient, which need not be 1.Use
is_monomial()
to require that the coefficient be 1.EXAMPLES:
sage: R.<x,y>=QQbar[] sage: x.is_term() True sage: (x+2*y).is_term() False sage: (2*x).is_term() True sage: (7*x^5*y).is_term() True
To require leading coefficient 1, use is_monomial():
sage: (2*x*y).is_monomial() False sage: (2*x*y).is_term() True
- is_univariate()#
Returns True if this multivariate polynomial is univariate and False otherwise.
EXAMPLES:
sage: R.<x,y> = QQbar[] sage: f = 3*x^2 - 2*y + 7*x^2*y^2 + 5 sage: f.is_univariate() False sage: g = f.subs({x:10}); g 700*y^2 + (-2)*y + 305 sage: g.is_univariate() True sage: f = x^0 sage: f.is_univariate() True
- iterator_exp_coeff(as_ETuples=True)#
Iterate over
self
as pairs of ((E)Tuple, coefficient).INPUT:
as_ETuples
– (default:True
) ifTrue
iterate over pairs whose first element is an ETuple, otherwise as a tuples
EXAMPLES:
sage: R.<x,y,z> = PolynomialRing(QQbar, order='lex') sage: f = (x^1*y^5*z^2 + x^2*z + x^4*y^1*z^3) sage: list(f.iterator_exp_coeff()) [((4, 1, 3), 1), ((2, 0, 1), 1), ((1, 5, 2), 1)] sage: R.<x,y,z> = PolynomialRing(QQbar, order='deglex') sage: f = (x^1*y^5*z^2 + x^2*z + x^4*y^1*z^3) sage: list(f.iterator_exp_coeff(as_ETuples=False)) [((4, 1, 3), 1), ((1, 5, 2), 1), ((2, 0, 1), 1)]
- lc()#
Returns the leading coefficient of self i.e., self.coefficient(self.lm())
EXAMPLES:
sage: R.<x,y,z>=QQbar[] sage: f=3*x^2-y^2-x*y sage: f.lc() 3
- lift(I)#
given an ideal I = (f_1,…,f_r) and some g (== self) in I, find s_1,…,s_r such that g = s_1 f_1 + … + s_r f_r
ALGORITHM: Use Singular.
EXAMPLES:
sage: A.<x,y> = PolynomialRing(CC,2,order='degrevlex') sage: I = A.ideal([x^10 + x^9*y^2, y^8 - x^2*y^7 ]) sage: f = x*y^13 + y^12 sage: M = f.lift(I) sage: M [y^7, x^7*y^2 + x^8 + x^5*y^3 + x^6*y + x^3*y^4 + x^4*y^2 + x*y^5 + x^2*y^3 + y^4] sage: sum( map( mul , zip( M, I.gens() ) ) ) == f True
- lm()#
Returns the lead monomial of self with respect to the term order of self.parent().
EXAMPLES:
sage: R.<x,y,z>=PolynomialRing(GF(7),3,order='lex') sage: (x^1*y^2 + y^3*z^4).lm() x*y^2 sage: (x^3*y^2*z^4 + x^3*y^2*z^1).lm() x^3*y^2*z^4
sage: R.<x,y,z>=PolynomialRing(CC,3,order='deglex') sage: (x^1*y^2*z^3 + x^3*y^2*z^0).lm() x*y^2*z^3 sage: (x^1*y^2*z^4 + x^1*y^1*z^5).lm() x*y^2*z^4
sage: R.<x,y,z>=PolynomialRing(QQbar,3,order='degrevlex') sage: (x^1*y^5*z^2 + x^4*y^1*z^3).lm() x*y^5*z^2 sage: (x^4*y^7*z^1 + x^4*y^2*z^3).lm() x^4*y^7*z
- local_height(v, prec=None)#
Return the maximum of the local height of the coefficients of this polynomial.
INPUT:
v
– a prime or prime ideal of the base ring.prec
– desired floating point precision (default: default RealField precision).
OUTPUT:
a real number.
EXAMPLES:
sage: R.<x,y> = PolynomialRing(QQ, implementation='generic') sage: f = 1/1331*x^2 + 1/4000*y sage: f.local_height(1331) 7.19368581839511
sage: R.<x> = QQ[] sage: K.<k> = NumberField(x^2 - 5) sage: T.<t,w> = PolynomialRing(K, implementation='generic') sage: I = K.ideal(3) sage: f = 1/3*t*w + 3 sage: f.local_height(I) 1.09861228866811
sage: R.<x,y> = PolynomialRing(QQ, implementation='generic') sage: f = 1/2*x*y + 2 sage: f.local_height(2, prec=2) 0.75
- local_height_arch(i, prec=None)#
Return the maximum of the local height at the
i
-th infinite place of the coefficients of this polynomial.INPUT:
i
– an integer.prec
– desired floating point precision (default: default RealField precision).
OUTPUT:
a real number.
EXAMPLES:
sage: R.<x,y> = PolynomialRing(QQ, implementation='generic') sage: f = 210*x*y sage: f.local_height_arch(0) 5.34710753071747
sage: R.<x> = QQ[] sage: K.<k> = NumberField(x^2 - 5) sage: T.<t,w> = PolynomialRing(K, implementation='generic') sage: f = 1/2*t*w + 3 sage: f.local_height_arch(1, prec=52) 1.09861228866811
sage: R.<x,y> = PolynomialRing(QQ, implementation='generic') sage: f = 1/2*x*y + 3 sage: f.local_height_arch(0, prec=2) 1.0
- lt()#
Returns the leading term of self i.e., self.lc()*self.lm(). The notion of “leading term” depends on the ordering defined in the parent ring.
EXAMPLES:
sage: R.<x,y,z>=PolynomialRing(QQbar) sage: f=3*x^2-y^2-x*y sage: f.lt() 3*x^2 sage: R.<x,y,z>=PolynomialRing(QQbar,order="invlex") sage: f=3*x^2-y^2-x*y sage: f.lt() -y^2
- monomial_coefficient(mon)#
Return the coefficient in the base ring of the monomial mon in self, where mon must have the same parent as self.
This function contrasts with the function
coefficient
which returns the coefficient of a monomial viewing this polynomial in a polynomial ring over a base ring having fewer variables.INPUT:
mon
- a monomial
OUTPUT: coefficient in base ring
See also
For coefficients in a base ring of fewer variables, look at
coefficient()
.EXAMPLES:
The parent of the return is a member of the base ring.
sage: R.<x,y>=QQbar[]
The parent of the return is a member of the base ring.
sage: f = 2 * x * y sage: c = f.monomial_coefficient(x*y); c 2 sage: c.parent() Algebraic Field
sage: f = y^2 + y^2*x - x^9 - 7*x + 5*x*y sage: f.monomial_coefficient(y^2) 1 sage: f.monomial_coefficient(x*y) 5 sage: f.monomial_coefficient(x^9) -1 sage: f.monomial_coefficient(x^10) 0
sage: var('a') a sage: K.<a> = NumberField(a^2+a+1) sage: P.<x,y> = K[] sage: f=(a*x-1)*((a+1)*y-1); f -x*y + (-a)*x + (-a - 1)*y + 1 sage: f.monomial_coefficient(x) -a
- monomials()#
Returns the list of monomials in self. The returned list is decreasingly ordered by the term ordering of self.parent().
OUTPUT: list of MPolynomials representing Monomials
EXAMPLES:
sage: R.<x,y> = QQbar[] sage: f = 3*x^2 - 2*y + 7*x^2*y^2 + 5 sage: f.monomials() [x^2*y^2, x^2, y, 1]
sage: R.<fx,fy,gx,gy> = QQbar[] sage: F = ((fx*gy - fy*gx)^3) sage: F -fy^3*gx^3 + 3*fx*fy^2*gx^2*gy + (-3)*fx^2*fy*gx*gy^2 + fx^3*gy^3 sage: F.monomials() [fy^3*gx^3, fx*fy^2*gx^2*gy, fx^2*fy*gx*gy^2, fx^3*gy^3] sage: F.coefficients() [-1, 3, -3, 1] sage: sum(map(mul,zip(F.coefficients(),F.monomials()))) == F True
- nvariables()#
Number of variables in this polynomial
EXAMPLES:
sage: R.<x,y> = QQbar[] sage: f = 3*x^2 - 2*y + 7*x^2*y^2 + 5 sage: f.nvariables () 2 sage: g = f.subs({x:10}); g 700*y^2 + (-2)*y + 305 sage: g.nvariables () 1
- quo_rem(right)#
Returns quotient and remainder of self and right.
EXAMPLES:
sage: R.<x,y> = CC[] sage: f = y*x^2 + x + 1 sage: f.quo_rem(x) (x*y + 1.00000000000000, 1.00000000000000) sage: R = QQ['a','b']['x','y','z'] sage: p1 = R('a + (1+2*b)*x*y + (3-a^2)*z') sage: p2 = R('x-1') sage: p1.quo_rem(p2) ((2*b + 1)*y, (2*b + 1)*y + (-a^2 + 3)*z + a) sage: R.<x,y> = Qp(5)[] sage: x.quo_rem(y) Traceback (most recent call last): ... TypeError: no conversion of this ring to a Singular ring defined
ALGORITHM: Use Singular.
- reduce(I)#
Reduce this polynomial by the polynomials in \(I\).
INPUT:
I
- a list of polynomials or an ideal
EXAMPLES:
sage: P.<x,y,z> = QQbar[] sage: f1 = -2 * x^2 + x^3 sage: f2 = -2 * y + x* y sage: f3 = -x^2 + y^2 sage: F = Ideal([f1,f2,f3]) sage: g = x*y - 3*x*y^2 sage: g.reduce(F) (-6)*y^2 + 2*y sage: g.reduce(F.gens()) (-6)*y^2 + 2*y
sage: f = 3*x sage: f.reduce([2*x,y]) 0
sage: k.<w> = CyclotomicField(3) sage: A.<y9,y12,y13,y15> = PolynomialRing(k) sage: J = [ y9 + y12] sage: f = y9 - y12; f.reduce(J) -2*y12 sage: f = y13*y15; f.reduce(J) y13*y15 sage: f = y13*y15 + y9 - y12; f.reduce(J) y13*y15 - 2*y12
Make sure the remainder returns the correct type, fixing trac ticket #13903:
sage: R.<y1,y2>=PolynomialRing(Qp(5),2, order='lex') sage: G=[y1^2 + y2^2, y1*y2 + y2^2, y2^3] sage: type((y2^3).reduce(G)) <class 'sage.rings.polynomial.multi_polynomial_element.MPolynomial_polydict'>
- resultant(other, variable=None)#
Compute the resultant of
self
andother
with respect tovariable
.If a second argument is not provided, the first variable of
self.parent()
is chosen.For inexact rings or rings not available in Singular, this computes the determinant of the Sylvester matrix.
INPUT:
other
– polynomial inself.parent()
variable
– (optional) variable (of type polynomial) inself.parent()
EXAMPLES:
sage: P.<x,y> = PolynomialRing(QQ, 2) sage: a = x + y sage: b = x^3 - y^3 sage: a.resultant(b) -2*y^3 sage: a.resultant(b, y) 2*x^3
- subresultants(other, variable=None)#
Return the nonzero subresultant polynomials of
self
andother
.INPUT:
other
– a polynomial
OUTPUT: a list of polynomials in the same ring as
self
EXAMPLES:
sage: R.<x,y> = QQbar[] sage: p = (y^2 + 6)*(x - 1) - y*(x^2 + 1) sage: q = (x^2 + 6)*(y - 1) - x*(y^2 + 1) sage: p.subresultants(q, y) [2*x^6 + (-22)*x^5 + 102*x^4 + (-274)*x^3 + 488*x^2 + (-552)*x + 288, -x^3 - x^2*y + 6*x^2 + 5*x*y + (-11)*x + (-6)*y + 6] sage: p.subresultants(q, x) [2*y^6 + (-22)*y^5 + 102*y^4 + (-274)*y^3 + 488*y^2 + (-552)*y + 288, x*y^2 + y^3 + (-5)*x*y + (-6)*y^2 + 6*x + 11*y - 6]
- subs(fixed=None, **kw)#
Fixes some given variables in a given multivariate polynomial and returns the changed multivariate polynomials. The polynomial itself is not affected. The variable,value pairs for fixing are to be provided as a dictionary of the form {variable:value}.
This is a special case of evaluating the polynomial with some of the variables constants and the others the original variables.
INPUT:
fixed
- (optional) dictionary of inputs**kw
- named parameters
OUTPUT: new MPolynomial
EXAMPLES:
sage: R.<x,y> = QQbar[] sage: f = x^2 + y + x^2*y^2 + 5 sage: f((5,y)) 25*y^2 + y + 30 sage: f.subs({x:5}) 25*y^2 + y + 30
- total_degree()#
Return the total degree of self, which is the maximum degree of any monomial in self.
EXAMPLES:
sage: R.<x,y,z> = QQbar[] sage: f=2*x*y^3*z^2 sage: f.total_degree() 6 sage: f=4*x^2*y^2*z^3 sage: f.total_degree() 7 sage: f=99*x^6*y^3*z^9 sage: f.total_degree() 18 sage: f=x*y^3*z^6+3*x^2 sage: f.total_degree() 10 sage: f=z^3+8*x^4*y^5*z sage: f.total_degree() 10 sage: f=z^9+10*x^4+y^8*x^2 sage: f.total_degree() 10
- univariate_polynomial(R=None)#
Returns a univariate polynomial associated to this multivariate polynomial.
INPUT:
R
- (default: None) PolynomialRing
If this polynomial is not in at most one variable, then a ValueError exception is raised. This is checked using the is_univariate() method. The new Polynomial is over the same base ring as the given MPolynomial.
EXAMPLES:
sage: R.<x,y> = QQbar[] sage: f = 3*x^2 - 2*y + 7*x^2*y^2 + 5 sage: f.univariate_polynomial() Traceback (most recent call last): ... TypeError: polynomial must involve at most one variable sage: g = f.subs({x:10}); g 700*y^2 + (-2)*y + 305 sage: g.univariate_polynomial () 700*y^2 - 2*y + 305 sage: g.univariate_polynomial(PolynomialRing(QQ,'z')) 700*z^2 - 2*z + 305
- variable(i)#
Returns \(i\)-th variable occurring in this polynomial.
EXAMPLES:
sage: R.<x,y> = QQbar[] sage: f = 3*x^2 - 2*y + 7*x^2*y^2 + 5 sage: f.variable(0) x sage: f.variable(1) y
- variables()#
Returns the tuple of variables occurring in this polynomial.
EXAMPLES:
sage: R.<x,y> = QQbar[] sage: f = 3*x^2 - 2*y + 7*x^2*y^2 + 5 sage: f.variables() (x, y) sage: g = f.subs({x:10}); g 700*y^2 + (-2)*y + 305 sage: g.variables() (y,)
- sage.rings.polynomial.multi_polynomial_element.degree_lowest_rational_function(r, x)#
Return the difference of valuations of r with respect to variable x.
INPUT:
r
– a multivariate rational functionx
– a multivariate polynomial ring generator x
OUTPUT:
integer
– the difference val_x(p) - val_x(q) where r = p/q
Note
This function should be made a method of the FractionFieldElement class.
EXAMPLES:
sage: R1 = PolynomialRing(FiniteField(5), 3, names = ["a","b","c"]) sage: F = FractionField(R1) sage: a,b,c = R1.gens() sage: f = 3*a*b^2*c^3+4*a*b*c sage: g = a^2*b*c^2+2*a^2*b^4*c^7
Consider the quotient \(f/g = \frac{4 + 3 bc^{2}}{ac + 2 ab^{3}c^{6}}\) (note the cancellation).
sage: r = f/g; r (-2*b*c^2 - 1)/(2*a*b^3*c^6 + a*c) sage: degree_lowest_rational_function(r,a) -1 sage: degree_lowest_rational_function(r,b) 0 sage: degree_lowest_rational_function(r,c) -1
- sage.rings.polynomial.multi_polynomial_element.is_MPolynomial(x)#