Fraction Field Elements¶
AUTHORS:
William Stein (input from David Joyner, David Kohel, and Joe Wetherell)
Sebastian Pancratz (2010-01-06): Rewrite of addition, multiplication and derivative to use Henrici’s algorithms [Hor1972]
- class sage.rings.fraction_field_element.FractionFieldElement[source]¶
Bases:
FieldElement
EXAMPLES:
sage: K = FractionField(PolynomialRing(QQ, 'x')) sage: K Fraction Field of Univariate Polynomial Ring in x over Rational Field sage: loads(K.dumps()) == K True sage: x = K.gen() sage: f = (x^3 + x)/(17 - x^19); f (-x^3 - x)/(x^19 - 17) sage: loads(f.dumps()) == f True
>>> from sage.all import * >>> K = FractionField(PolynomialRing(QQ, 'x')) >>> K Fraction Field of Univariate Polynomial Ring in x over Rational Field >>> loads(K.dumps()) == K True >>> x = K.gen() >>> f = (x**Integer(3) + x)/(Integer(17) - x**Integer(19)); f (-x^3 - x)/(x^19 - 17) >>> loads(f.dumps()) == f True
K = FractionField(PolynomialRing(QQ, 'x')) K loads(K.dumps()) == K x = K.gen() f = (x^3 + x)/(17 - x^19); f loads(f.dumps()) == f
- denominator()[source]¶
Return the denominator of
self
.EXAMPLES:
sage: R.<x,y> = ZZ[] sage: f = x/y + 1; f (x + y)/y sage: f.denominator() y
>>> from sage.all import * >>> R = ZZ['x, y']; (x, y,) = R._first_ngens(2) >>> f = x/y + Integer(1); f (x + y)/y >>> f.denominator() y
R.<x,y> = ZZ[] f = x/y + 1; f f.denominator()
- is_one()[source]¶
Return
True
if this element is equal to one.EXAMPLES:
sage: F = ZZ['x,y'].fraction_field() sage: x,y = F.gens() sage: (x/x).is_one() True sage: (x/y).is_one() False
>>> from sage.all import * >>> F = ZZ['x,y'].fraction_field() >>> x,y = F.gens() >>> (x/x).is_one() True >>> (x/y).is_one() False
F = ZZ['x,y'].fraction_field() x,y = F.gens() (x/x).is_one() (x/y).is_one()
- is_square(root=False)[source]¶
Return whether or not
self
is a perfect square.If the optional argument
root
isTrue
, then also returns a square root (orNone
, if the fraction field element is not square).INPUT:
root
– whether or not to also return a square root (default:False
)
OUTPUT:
boolean; whether or not a square
object (optional); an actual square root if found, and
None
otherwise
EXAMPLES:
sage: R.<t> = QQ[] sage: (1/t).is_square() False sage: (1/t^6).is_square() True sage: ((1+t)^4/t^6).is_square() True sage: (4*(1+t)^4/t^6).is_square() True sage: (2*(1+t)^4/t^6).is_square() False sage: ((1+t)/t^6).is_square() False sage: (4*(1+t)^4/t^6).is_square(root=True) (True, (2*t^2 + 4*t + 2)/t^3) sage: (2*(1+t)^4/t^6).is_square(root=True) (False, None) sage: R.<x> = QQ[] sage: a = 2*(x+1)^2 / (2*(x-1)^2); a (x^2 + 2*x + 1)/(x^2 - 2*x + 1) sage: a.is_square() True sage: (0/x).is_square() True
>>> from sage.all import * >>> R = QQ['t']; (t,) = R._first_ngens(1) >>> (Integer(1)/t).is_square() False >>> (Integer(1)/t**Integer(6)).is_square() True >>> ((Integer(1)+t)**Integer(4)/t**Integer(6)).is_square() True >>> (Integer(4)*(Integer(1)+t)**Integer(4)/t**Integer(6)).is_square() True >>> (Integer(2)*(Integer(1)+t)**Integer(4)/t**Integer(6)).is_square() False >>> ((Integer(1)+t)/t**Integer(6)).is_square() False >>> (Integer(4)*(Integer(1)+t)**Integer(4)/t**Integer(6)).is_square(root=True) (True, (2*t^2 + 4*t + 2)/t^3) >>> (Integer(2)*(Integer(1)+t)**Integer(4)/t**Integer(6)).is_square(root=True) (False, None) >>> R = QQ['x']; (x,) = R._first_ngens(1) >>> a = Integer(2)*(x+Integer(1))**Integer(2) / (Integer(2)*(x-Integer(1))**Integer(2)); a (x^2 + 2*x + 1)/(x^2 - 2*x + 1) >>> a.is_square() True >>> (Integer(0)/x).is_square() True
R.<t> = QQ[] (1/t).is_square() (1/t^6).is_square() ((1+t)^4/t^6).is_square() (4*(1+t)^4/t^6).is_square() (2*(1+t)^4/t^6).is_square() ((1+t)/t^6).is_square() (4*(1+t)^4/t^6).is_square(root=True) (2*(1+t)^4/t^6).is_square(root=True) R.<x> = QQ[] a = 2*(x+1)^2 / (2*(x-1)^2); a a.is_square() (0/x).is_square()
- is_zero()[source]¶
Return
True
if this element is equal to zero.EXAMPLES:
sage: F = ZZ['x,y'].fraction_field() sage: x,y = F.gens() sage: t = F(0)/x sage: t.is_zero() True sage: u = 1/x - 1/x sage: u.is_zero() True sage: u.parent() is F True
>>> from sage.all import * >>> F = ZZ['x,y'].fraction_field() >>> x,y = F.gens() >>> t = F(Integer(0))/x >>> t.is_zero() True >>> u = Integer(1)/x - Integer(1)/x >>> u.is_zero() True >>> u.parent() is F True
F = ZZ['x,y'].fraction_field() x,y = F.gens() t = F(0)/x t.is_zero() u = 1/x - 1/x u.is_zero() u.parent() is F
- nth_root(n)[source]¶
Return a
n
-th root of this element.EXAMPLES:
sage: R = QQ['t'].fraction_field() sage: t = R.gen() sage: p = (t+1)^3 / (t^2+t-1)^3 sage: p.nth_root(3) (t + 1)/(t^2 + t - 1) sage: p = (t+1) / (t-1) sage: p.nth_root(2) Traceback (most recent call last): ... ValueError: not a 2nd power
>>> from sage.all import * >>> R = QQ['t'].fraction_field() >>> t = R.gen() >>> p = (t+Integer(1))**Integer(3) / (t**Integer(2)+t-Integer(1))**Integer(3) >>> p.nth_root(Integer(3)) (t + 1)/(t^2 + t - 1) >>> p = (t+Integer(1)) / (t-Integer(1)) >>> p.nth_root(Integer(2)) Traceback (most recent call last): ... ValueError: not a 2nd power
R = QQ['t'].fraction_field() t = R.gen() p = (t+1)^3 / (t^2+t-1)^3 p.nth_root(3) p = (t+1) / (t-1) p.nth_root(2)
- numerator()[source]¶
Return the numerator of
self
.EXAMPLES:
sage: R.<x,y> = ZZ[] sage: f = x/y + 1; f (x + y)/y sage: f.numerator() x + y
>>> from sage.all import * >>> R = ZZ['x, y']; (x, y,) = R._first_ngens(2) >>> f = x/y + Integer(1); f (x + y)/y >>> f.numerator() x + y
R.<x,y> = ZZ[] f = x/y + 1; f f.numerator()
- reduce()[source]¶
Reduce this fraction.
Divides out the gcd of the numerator and denominator. If the denominator becomes a unit, it becomes 1. Additionally, depending on the base ring, the leading coefficients of the numerator and the denominator may be normalized to 1.
Automatically called for exact rings, but because it may be numerically unstable for inexact rings it must be called manually in that case.
EXAMPLES:
sage: R.<x> = RealField(10)[] # needs sage.rings.real_mpfr sage: f = (x^2+2*x+1)/(x+1); f # needs sage.rings.real_mpfr (x^2 + 2.0*x + 1.0)/(x + 1.0) sage: f.reduce(); f # needs sage.rings.real_mpfr x + 1.0
>>> from sage.all import * >>> R = RealField(Integer(10))['x']; (x,) = R._first_ngens(1)# needs sage.rings.real_mpfr >>> f = (x**Integer(2)+Integer(2)*x+Integer(1))/(x+Integer(1)); f # needs sage.rings.real_mpfr (x^2 + 2.0*x + 1.0)/(x + 1.0) >>> f.reduce(); f # needs sage.rings.real_mpfr x + 1.0
R.<x> = RealField(10)[] # needs sage.rings.real_mpfr f = (x^2+2*x+1)/(x+1); f # needs sage.rings.real_mpfr f.reduce(); f # needs sage.rings.real_mpfr
- specialization(D=None, phi=None)[source]¶
Return the specialization of a fraction element of a polynomial ring.
- subs(in_dict=None, *args, **kwds)[source]¶
Substitute variables in the numerator and denominator of
self
.If a dictionary is passed, the keys are mapped to generators of the parent ring. Otherwise, the arguments are transmitted unchanged to the method
subs
of the numerator and the denominator.EXAMPLES:
sage: x, y = PolynomialRing(ZZ, 2, 'xy').gens() sage: f = x^2 + y + x^2*y^2 + 5 sage: (1/f).subs(x=5) 1/(25*y^2 + y + 30)
>>> from sage.all import * >>> x, y = PolynomialRing(ZZ, Integer(2), 'xy').gens() >>> f = x**Integer(2) + y + x**Integer(2)*y**Integer(2) + Integer(5) >>> (Integer(1)/f).subs(x=Integer(5)) 1/(25*y^2 + y + 30)
x, y = PolynomialRing(ZZ, 2, 'xy').gens() f = x^2 + y + x^2*y^2 + 5 (1/f).subs(x=5)
- valuation(v=None)[source]¶
Return the valuation of
self
, assuming that the numerator and denominator have valuation functions defined on them.EXAMPLES:
sage: x = PolynomialRing(RationalField(),'x').gen() sage: f = (x^3 + x)/(x^2 - 2*x^3) sage: f (-1/2*x^2 - 1/2)/(x^2 - 1/2*x) sage: f.valuation() -1 sage: f.valuation(x^2 + 1) 1
>>> from sage.all import * >>> x = PolynomialRing(RationalField(),'x').gen() >>> f = (x**Integer(3) + x)/(x**Integer(2) - Integer(2)*x**Integer(3)) >>> f (-1/2*x^2 - 1/2)/(x^2 - 1/2*x) >>> f.valuation() -1 >>> f.valuation(x**Integer(2) + Integer(1)) 1
x = PolynomialRing(RationalField(),'x').gen() f = (x^3 + x)/(x^2 - 2*x^3) f f.valuation() f.valuation(x^2 + 1)
- class sage.rings.fraction_field_element.FractionFieldElement_1poly_field[source]¶
Bases:
FractionFieldElement
A fraction field element where the parent is the fraction field of a univariate polynomial ring over a field.
Many of the functions here are included for coherence with number fields.
- is_integral()[source]¶
Return whether this element is actually a polynomial.
EXAMPLES:
sage: R.<t> = QQ[] sage: elt = (t^2 + t - 2) / (t + 2); elt # == (t + 2)*(t - 1)/(t + 2) t - 1 sage: elt.is_integral() True sage: elt = (t^2 - t) / (t+2); elt # == t*(t - 1)/(t + 2) (t^2 - t)/(t + 2) sage: elt.is_integral() False
>>> from sage.all import * >>> R = QQ['t']; (t,) = R._first_ngens(1) >>> elt = (t**Integer(2) + t - Integer(2)) / (t + Integer(2)); elt # == (t + 2)*(t - 1)/(t + 2) t - 1 >>> elt.is_integral() True >>> elt = (t**Integer(2) - t) / (t+Integer(2)); elt # == t*(t - 1)/(t + 2) (t^2 - t)/(t + 2) >>> elt.is_integral() False
R.<t> = QQ[] elt = (t^2 + t - 2) / (t + 2); elt # == (t + 2)*(t - 1)/(t + 2) elt.is_integral() elt = (t^2 - t) / (t+2); elt # == t*(t - 1)/(t + 2) elt.is_integral()
- reduce()[source]¶
Pick a normalized representation of
self
.In particular, for any a == b, after normalization they will have the same numerator and denominator.
EXAMPLES:
For univariate rational functions over a field, we have:
sage: R.<x> = QQ[] sage: (2 + 2*x) / (4*x) # indirect doctest (1/2*x + 1/2)/x
>>> from sage.all import * >>> R = QQ['x']; (x,) = R._first_ngens(1) >>> (Integer(2) + Integer(2)*x) / (Integer(4)*x) # indirect doctest (1/2*x + 1/2)/x
R.<x> = QQ[] (2 + 2*x) / (4*x) # indirect doctest
Compare with:
sage: R.<x> = ZZ[] sage: (2 + 2*x) / (4*x) (x + 1)/(2*x)
>>> from sage.all import * >>> R = ZZ['x']; (x,) = R._first_ngens(1) >>> (Integer(2) + Integer(2)*x) / (Integer(4)*x) (x + 1)/(2*x)
R.<x> = ZZ[] (2 + 2*x) / (4*x)
- support()[source]¶
Return a sorted list of primes dividing either the numerator or denominator of this element.
EXAMPLES:
sage: R.<t> = QQ[] sage: h = (t^14 + 2*t^12 - 4*t^11 - 8*t^9 + 6*t^8 + 12*t^6 - 4*t^5 ....: - 8*t^3 + t^2 + 2)/(t^6 + 6*t^5 + 9*t^4 - 2*t^2 - 12*t - 18) sage: h.support() # needs sage.libs.pari [t - 1, t + 3, t^2 + 2, t^2 + t + 1, t^4 - 2]
>>> from sage.all import * >>> R = QQ['t']; (t,) = R._first_ngens(1) >>> h = (t**Integer(14) + Integer(2)*t**Integer(12) - Integer(4)*t**Integer(11) - Integer(8)*t**Integer(9) + Integer(6)*t**Integer(8) + Integer(12)*t**Integer(6) - Integer(4)*t**Integer(5) ... - Integer(8)*t**Integer(3) + t**Integer(2) + Integer(2))/(t**Integer(6) + Integer(6)*t**Integer(5) + Integer(9)*t**Integer(4) - Integer(2)*t**Integer(2) - Integer(12)*t - Integer(18)) >>> h.support() # needs sage.libs.pari [t - 1, t + 3, t^2 + 2, t^2 + t + 1, t^4 - 2]
R.<t> = QQ[] h = (t^14 + 2*t^12 - 4*t^11 - 8*t^9 + 6*t^8 + 12*t^6 - 4*t^5 - 8*t^3 + t^2 + 2)/(t^6 + 6*t^5 + 9*t^4 - 2*t^2 - 12*t - 18) h.support() # needs sage.libs.pari
- sage.rings.fraction_field_element.is_FractionFieldElement(x)[source]¶
Return whether or not
x
is aFractionFieldElement
.EXAMPLES:
sage: from sage.rings.fraction_field_element import is_FractionFieldElement sage: R.<x> = ZZ[] sage: is_FractionFieldElement(x/2) doctest:warning... DeprecationWarning: The function is_FractionFieldElement is deprecated; use 'isinstance(..., FractionFieldElement)' instead. See https://github.com/sagemath/sage/issues/38128 for details. False sage: is_FractionFieldElement(2/x) True sage: is_FractionFieldElement(1/3) False
>>> from sage.all import * >>> from sage.rings.fraction_field_element import is_FractionFieldElement >>> R = ZZ['x']; (x,) = R._first_ngens(1) >>> is_FractionFieldElement(x/Integer(2)) doctest:warning... DeprecationWarning: The function is_FractionFieldElement is deprecated; use 'isinstance(..., FractionFieldElement)' instead. See https://github.com/sagemath/sage/issues/38128 for details. False >>> is_FractionFieldElement(Integer(2)/x) True >>> is_FractionFieldElement(Integer(1)/Integer(3)) False
from sage.rings.fraction_field_element import is_FractionFieldElement R.<x> = ZZ[] is_FractionFieldElement(x/2) is_FractionFieldElement(2/x) is_FractionFieldElement(1/3)
- sage.rings.fraction_field_element.make_element(parent, numerator, denominator)[source]¶
Used for unpickling
FractionFieldElement
objects (and subclasses).EXAMPLES:
sage: from sage.rings.fraction_field_element import make_element sage: R = ZZ['x,y'] sage: x,y = R.gens() sage: F = R.fraction_field() sage: make_element(F, 1 + x, 1 + y) (x + 1)/(y + 1)
>>> from sage.all import * >>> from sage.rings.fraction_field_element import make_element >>> R = ZZ['x,y'] >>> x,y = R.gens() >>> F = R.fraction_field() >>> make_element(F, Integer(1) + x, Integer(1) + y) (x + 1)/(y + 1)
from sage.rings.fraction_field_element import make_element R = ZZ['x,y'] x,y = R.gens() F = R.fraction_field() make_element(F, 1 + x, 1 + y)
- sage.rings.fraction_field_element.make_element_old(parent, cdict)[source]¶
Used for unpickling old
FractionFieldElement
pickles.EXAMPLES:
sage: from sage.rings.fraction_field_element import make_element_old sage: R.<x,y> = ZZ[] sage: F = R.fraction_field() sage: make_element_old(F, {'_FractionFieldElement__numerator': x + y, ....: '_FractionFieldElement__denominator': x - y}) (x + y)/(x - y)
>>> from sage.all import * >>> from sage.rings.fraction_field_element import make_element_old >>> R = ZZ['x, y']; (x, y,) = R._first_ngens(2) >>> F = R.fraction_field() >>> make_element_old(F, {'_FractionFieldElement__numerator': x + y, ... '_FractionFieldElement__denominator': x - y}) (x + y)/(x - y)
from sage.rings.fraction_field_element import make_element_old R.<x,y> = ZZ[] F = R.fraction_field() make_element_old(F, {'_FractionFieldElement__numerator': x + y, '_FractionFieldElement__denominator': x - y})