Elements lying in extension of rings#
AUTHOR:
Xavier Caruso (2019)
- class sage.rings.ring_extension_element.RingExtensionElement#
Bases:
CommutativeAlgebraElement
Generic class for elements lying in ring extensions.
- additive_order()#
Return the additive order of this element.
EXAMPLES:
sage: K.<a> = GF(5^4).over(GF(5^2)) sage: a.additive_order() 5
- backend(force=False)#
Return the backend of this element.
INPUT:
force
– a boolean (default:False
); ifFalse
, raise an error if the backend is not exposed
EXAMPLES:
sage: F = GF(5^2) sage: K.<z> = GF(5^4).over(F) sage: x = z^10 sage: x (z2 + 2) + (3*z2 + 1)*z sage: y = x.backend() sage: y 4*z4^3 + 2*z4^2 + 4*z4 + 4 sage: y.parent() Finite Field in z4 of size 5^4
- in_base()#
Return this element as an element of the base.
EXAMPLES:
sage: F = GF(5^2) sage: K.<z> = GF(5^4).over(F) sage: x = z^3 + z^2 + z + 4 sage: y = x.in_base() sage: y z2 + 1 sage: y.parent() Finite Field in z2 of size 5^2
When the element is not in the base, an error is raised:
sage: z.in_base() Traceback (most recent call last): ... ValueError: z is not in the base
sage: S.<X> = F[] sage: E = S.over(F) sage: f = E(1) sage: g = f.in_base() sage: g 1 sage: g.parent() Finite Field in z2 of size 5^2
- is_nilpotent()#
Return whether if this element is nilpotent in this ring.
EXAMPLES:
sage: A.<x> = PolynomialRing(QQ) sage: E = A.over(QQ) sage: E(0).is_nilpotent() True sage: E(x).is_nilpotent() False
- is_prime()#
Return whether this element is a prime element in this ring.
EXAMPLES:
sage: A.<x> = PolynomialRing(QQ) sage: E = A.over(QQ) sage: E(x^2+1).is_prime() True sage: E(x^2-1).is_prime() False
- is_square(root=False)#
Return whether this element is a square in this ring.
INPUT:
root
– a boolean (default:False
); ifTrue
, return also a square root
EXAMPLES:
sage: K.<a> = GF(5^3).over() sage: a.is_square() False sage: a.is_square(root=True) (False, None) sage: b = a + 1 sage: b.is_square() True sage: b.is_square(root=True) (True, 2 + 3*a + a^2)
- is_unit()#
Return whether if this element is a unit in this ring.
EXAMPLES:
sage: A.<x> = PolynomialRing(QQ) sage: E = A.over(QQ) sage: E(4).is_unit() True sage: E(x).is_unit() False
- multiplicative_order()#
Return the multiplicite order of this element.
EXAMPLES:
sage: K.<a> = GF(5^4).over(GF(5^2)) sage: a.multiplicative_order() 624
- sqrt(extend=True, all=False, name=None)#
Return a square root or all square roots of this element.
INPUT:
extend
– a boolean (default:True
); if “True”, return a square root in an extension ring, if necessary. Otherwise, raise aValueError
if the root is not in the ringall
– a boolean (default:False
); ifTrue
, return all square roots of this element, instead of just one.name
– Required whenextend=True
andself
is not a square. This will be the name of the generator extension.
Note
The option \(extend=True\) is often not implemented.
EXAMPLES:
sage: K.<a> = GF(5^3).over() sage: b = a + 1 sage: b.sqrt() 2 + 3*a + a^2 sage: b.sqrt(all=True) [2 + 3*a + a^2, 3 + 2*a - a^2]
- class sage.rings.ring_extension_element.RingExtensionFractionFieldElement#
Bases:
RingExtensionElement
A class for elements lying in fraction fields of ring extensions.
- denominator()#
Return the denominator of this element.
EXAMPLES:
sage: R.<x> = ZZ[] sage: A.<a> = ZZ.extension(x^2 - 2) sage: OK = A.over() # over ZZ sage: K = OK.fraction_field() sage: K Fraction Field of Order in Number Field in a with defining polynomial x^2 - 2 over its base sage: x = K(1/a); x a/2 sage: denom = x.denominator(); denom 2
The denominator is an element of the ring which was used to construct the fraction field:
sage: denom.parent() Order in Number Field in a with defining polynomial x^2 - 2 over its base sage: denom.parent() is OK True
- numerator()#
Return the numerator of this element.
EXAMPLES:
sage: x = polygen(ZZ, 'x') sage: A.<a> = ZZ.extension(x^2 - 2) sage: OK = A.over() # over ZZ sage: K = OK.fraction_field() sage: K Fraction Field of Order in Number Field in a with defining polynomial x^2 - 2 over its base sage: x = K(1/a); x a/2 sage: num = x.numerator(); num a
The numerator is an element of the ring which was used to construct the fraction field:
sage: num.parent() Order in Number Field in a with defining polynomial x^2 - 2 over its base sage: num.parent() is OK True
- class sage.rings.ring_extension_element.RingExtensionWithBasisElement#
Bases:
RingExtensionElement
A class for elements lying in finite free extensions.
- charpoly(base=None, var='x')#
Return the characteristic polynomial of this element over
base
.INPUT:
base
– a commutative ring (which might be itself an extension) orNone
EXAMPLES:
sage: F = GF(5) sage: K.<a> = GF(5^3).over(F) sage: L.<b> = GF(5^6).over(K) sage: u = a/(1+b) sage: chi = u.charpoly(K); chi x^2 + (1 + 2*a + 3*a^2)*x + 3 + 2*a^2
We check that the charpoly has coefficients in the base ring:
sage: chi.base_ring() Field in a with defining polynomial x^3 + 3*x + 3 over its base sage: chi.base_ring() is K True
and that it annihilates u:
sage: chi(u) 0
Similarly, one can compute the characteristic polynomial over F:
sage: u.charpoly(F) x^6 + x^4 + 2*x^3 + 3*x + 4
A different variable name can be specified:
sage: u.charpoly(F, var='t') t^6 + t^4 + 2*t^3 + 3*t + 4
If
base
is omitted, it is set to its default which is the base of the extension:sage: u.charpoly() x^2 + (1 + 2*a + 3*a^2)*x + 3 + 2*a^2
Note that
base
must be an explicit base over which the extension has been defined (as listed by the methodbases()
):sage: u.charpoly(GF(5^2)) Traceback (most recent call last): ... ValueError: not (explicitly) defined over Finite Field in z2 of size 5^2
- matrix(base=None)#
Return the matrix of the multiplication by this element (in the basis output by
basis_over()
).INPUT:
base
– a commutative ring (which might be itself an extension) orNone
EXAMPLES:
sage: K.<a> = GF(5^3).over() # over GF(5) sage: L.<b> = GF(5^6).over(K) sage: u = a/(1+b) sage: u (2 + a + 3*a^2) + (3 + 3*a + a^2)*b sage: b*u (3 + 2*a^2) + (2 + 2*a - a^2)*b sage: u.matrix(K) [2 + a + 3*a^2 3 + 3*a + a^2] [ 3 + 2*a^2 2 + 2*a - a^2] sage: u.matrix(GF(5)) [2 1 3 3 3 1] [1 3 1 2 0 3] [2 3 3 1 3 0] [3 0 2 2 2 4] [4 2 0 3 0 2] [0 4 2 4 2 0]
If
base
is omitted, it is set to its default which is the base of the extension:sage: u.matrix() [2 + a + 3*a^2 3 + 3*a + a^2] [ 3 + 2*a^2 2 + 2*a - a^2]
Note that
base
must be an explicit base over which the extension has been defined (as listed by the methodbases()
):sage: u.matrix(GF(5^2)) Traceback (most recent call last): ... ValueError: not (explicitly) defined over Finite Field in z2 of size 5^2
- minpoly(base=None, var='x')#
Return the minimal polynomial of this element over
base
.INPUT:
base
– a commutative ring (which might be itself an extension) orNone
EXAMPLES:
sage: F = GF(5) sage: K.<a> = GF(5^3).over(F) sage: L.<b> = GF(5^6).over(K) sage: u = 1 / (a+b) sage: chi = u.minpoly(K); chi x^2 + (2*a + a^2)*x - 1 + a
We check that the minimal polynomial has coefficients in the base ring:
sage: chi.base_ring() Field in a with defining polynomial x^3 + 3*x + 3 over its base sage: chi.base_ring() is K True
and that it annihilates u:
sage: chi(u) 0
Similarly, one can compute the minimal polynomial over F:
sage: u.minpoly(F) x^6 + 4*x^5 + x^4 + 2*x^2 + 3
A different variable name can be specified:
sage: u.minpoly(F, var='t') t^6 + 4*t^5 + t^4 + 2*t^2 + 3
If
base
is omitted, it is set to its default which is the base of the extension:sage: u.minpoly() x^2 + (2*a + a^2)*x - 1 + a
Note that
base
must be an explicit base over which the extension has been defined (as listed by the methodbases()
):sage: u.minpoly(GF(5^2)) Traceback (most recent call last): ... ValueError: not (explicitly) defined over Finite Field in z2 of size 5^2
- norm(base=None)#
Return the norm of this element over
base
.INPUT:
base
– a commutative ring (which might be itself an extension) orNone
EXAMPLES:
sage: F = GF(5) sage: K.<a> = GF(5^3).over(F) sage: L.<b> = GF(5^6).over(K) sage: u = a/(1+b) sage: nr = u.norm(K); nr 3 + 2*a^2
We check that the norm lives in the base ring:
sage: nr.parent() Field in a with defining polynomial x^3 + 3*x + 3 over its base sage: nr.parent() is K True
Similarly, one can compute the norm over F:
sage: u.norm(F) 4
We check the transitivity of the norm:
sage: u.norm(F) == nr.norm(F) True
If
base
is omitted, it is set to its default which is the base of the extension:sage: u.norm() 3 + 2*a^2
Note that
base
must be an explicit base over which the extension has been defined (as listed by the methodbases()
):sage: u.norm(GF(5^2)) Traceback (most recent call last): ... ValueError: not (explicitly) defined over Finite Field in z2 of size 5^2
- polynomial(base=None, var='x')#
Return a polynomial (in one or more variables) over
base
whose evaluation at the generators of the parent equals this element.INPUT:
base
– a commutative ring (which might be itself an extension) orNone
EXAMPLES:
sage: F.<a> = GF(5^2).over() # over GF(5) sage: K.<b> = GF(5^4).over(F) sage: L.<c> = GF(5^12).over(K) sage: u = 1/(a + b + c); u (2 + (-1 - a)*b) + ((2 + 3*a) + (1 - a)*b)*c + ((-1 - a) - a*b)*c^2 sage: P = u.polynomial(K); P ((-1 - a) - a*b)*x^2 + ((2 + 3*a) + (1 - a)*b)*x + 2 + (-1 - a)*b sage: P.base_ring() is K True sage: P(c) == u True
When the base is \(F\), we obtain a bivariate polynomial:
sage: P = u.polynomial(F); P (-a)*x0^2*x1 + (-1 - a)*x0^2 + (1 - a)*x0*x1 + (2 + 3*a)*x0 + (-1 - a)*x1 + 2
We check that its value at the generators is the element we started with:
sage: L.gens(F) (c, b) sage: P(c, b) == u True
Similarly, when the base is
GF(5)
, we get a trivariate polynomial:sage: P = u.polynomial(GF(5)); P -x0^2*x1*x2 - x0^2*x2 - x0*x1*x2 - x0^2 + x0*x1 - 2*x0*x2 - x1*x2 + 2*x0 - x1 + 2 sage: P(c, b, a) == u True
Different variable names can be specified:
sage: u.polynomial(GF(5), var='y') -y0^2*y1*y2 - y0^2*y2 - y0*y1*y2 - y0^2 + y0*y1 - 2*y0*y2 - y1*y2 + 2*y0 - y1 + 2 sage: u.polynomial(GF(5), var=['x','y','z']) -x^2*y*z - x^2*z - x*y*z - x^2 + x*y - 2*x*z - y*z + 2*x - y + 2
If
base
is omitted, it is set to its default which is the base of the extension:sage: u.polynomial() ((-1 - a) - a*b)*x^2 + ((2 + 3*a) + (1 - a)*b)*x + 2 + (-1 - a)*b
Note that
base
must be an explicit base over which the extension has been defined (as listed by the methodbases()
):sage: u.polynomial(GF(5^3)) Traceback (most recent call last): ... ValueError: not (explicitly) defined over Finite Field in z3 of size 5^3
- trace(base=None)#
Return the trace of this element over
base
.INPUT:
base
– a commutative ring (which might be itself an extension) orNone
EXAMPLES:
sage: F = GF(5) sage: K.<a> = GF(5^3).over(F) sage: L.<b> = GF(5^6).over(K) sage: u = a/(1+b) sage: tr = u.trace(K); tr -1 + 3*a + 2*a^2
We check that the trace lives in the base ring:
sage: tr.parent() Field in a with defining polynomial x^3 + 3*x + 3 over its base sage: tr.parent() is K True
Similarly, one can compute the trace over F:
sage: u.trace(F) 0
We check the transitivity of the trace:
sage: u.trace(F) == tr.trace(F) True
If
base
is omitted, it is set to its default which is the base of the extension:sage: u.trace() -1 + 3*a + 2*a^2
Note that
base
must be an explicit base over which the extension has been defined (as listed by the methodbases()
):sage: u.trace(GF(5^2)) Traceback (most recent call last): ... ValueError: not (explicitly) defined over Finite Field in z2 of size 5^2
- vector(base=None)#
Return the vector of coordinates of this element over
base
(in the basis output by the methodbasis_over()
).INPUT:
base
– a commutative ring (which might be itself an extension) orNone
EXAMPLES:
sage: F = GF(5) sage: K.<a> = GF(5^2).over() # over F sage: L.<b> = GF(5^6).over(K) sage: x = (a+b)^4; x (-1 + a) + (3 + a)*b + (1 - a)*b^2 sage: x.vector(K) # basis is (1, b, b^2) (-1 + a, 3 + a, 1 - a) sage: x.vector(F) # basis is (1, a, b, a*b, b^2, a*b^2) (4, 1, 3, 1, 1, 4)
If
base
is omitted, it is set to its default which is the base of the extension:sage: x.vector() (-1 + a, 3 + a, 1 - a)
Note that
base
must be an explicit base over which the extension has been defined (as listed by the methodbases()
):sage: x.vector(GF(5^3)) Traceback (most recent call last): ... ValueError: not (explicitly) defined over Finite Field in z3 of size 5^3