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 - 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 
 - is_one()[source]¶
- Return - Trueif 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 
 - is_square(root=False)[source]¶
- Return whether or not - selfis a perfect square.- If the optional argument - rootis- True, then also returns a square root (or- None, 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 - Noneotherwise
 - 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 
 - is_zero()[source]¶
- Return - Trueif 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 
 - 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 
 - 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 
 - 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 
 - 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 - subsof 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) 
 - 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 
 
- 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 
 - 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 - 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) 
 - 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] 
 
- sage.rings.fraction_field_element.is_FractionFieldElement(x)[source]¶
- Return whether or not - xis a- FractionFieldElement.- 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 
- sage.rings.fraction_field_element.make_element(parent, numerator, denominator)[source]¶
- Used for unpickling - FractionFieldElementobjects (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) 
- sage.rings.fraction_field_element.make_element_old(parent, cdict)[source]¶
- Used for unpickling old - FractionFieldElementpickles.- 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)