Module: sage.rings.morphism
Homomorphisms of rings
We give a large number of examples of ring homomorphisms.
Natural inclusion
.
sage: H = Hom(ZZ, QQ) sage: phi = H([1]) sage: phi(10) 10 sage: phi(3/1) 3 sage: phi(2/3) Traceback (most recent call last): ... TypeError: 2/3 must be coercible into Integer Ring
There is no homomorphism in the other direction:
sage: H = Hom(QQ, ZZ) sage: H([1]) Traceback (most recent call last): ... TypeError: images do not define a valid homomorphism
Reduction to finite field.
sage: H = Hom(ZZ, GF(9, 'a')) sage: phi = H([1]) sage: phi(5) 2 sage: psi = H([4]) sage: psi(5) 2
Map from single variable polynomial ring.
sage: R, x = PolynomialRing(ZZ, 'x').objgen() sage: phi = R.hom([2], GF(5)) sage: phi Ring morphism: From: Univariate Polynomial Ring in x over Integer Ring To: Finite Field of size 5 Defn: x |--> 2 sage: phi(x + 12) 4
Identity map on the real numbers.
sage: f = RR.hom([RR(1)]); f Ring endomorphism of Real Field with 53 bits of precision Defn: 1.00000000000000 |--> 1.00000000000000 sage: f(2.5) 2.50000000000000 sage: f = RR.hom( [2.0] ) Traceback (most recent call last): ... TypeError: images do not define a valid homomorphism
Homomorphism from one precision of field to another.
From smaller to bigger doesn't make sense:
sage: R200 = RealField(200) sage: f = RR.hom( R200 ) Traceback (most recent call last): ... TypeError: Natural coercion morphism from Real Field with 53 bits of precision to Real Field with 200 bits of precision not defined.
From bigger to small does:
sage: f = RR.hom( RealField(15) ) sage: f(2.5) 2.500 sage: f(RR.pi()) 3.142
Inclusion map from the reals to the complexes:
sage: i = RR.hom([CC(1)]); i Ring morphism: From: Real Field with 53 bits of precision To: Complex Field with 53 bits of precision Defn: 1.00000000000000 |--> 1.00000000000000 sage: i(RR('3.1')) 3.10000000000000
A map from a multivariate polynomial ring to itself:
sage: R.<x,y,z> = PolynomialRing(QQ,3) sage: phi = R.hom([y,z,x^2]); phi Ring endomorphism of Multivariate Polynomial Ring in x, y, z over Rational Field Defn: x |--> y y |--> z z |--> x^2 sage: phi(x+y+z) x^2 + y + z
An endomorphism of a quotient of a multi-variate polynomial ring:
sage: R.<x,y> = PolynomialRing(QQ) sage: S.<a,b> = quo(R, ideal(1 + y^2)) sage: phi = S.hom([a^2, -b]) sage: phi Ring endomorphism of Quotient of Multivariate Polynomial Ring in x, y over Rational Field by the ideal (y^2 + 1) Defn: a |--> a^2 b |--> -b sage: phi(b) -b sage: phi(a^2 + b^2) a^4 - 1
The reduction map from the integers to the integers modulo 8, viewed as a quotient ring:
sage: R = ZZ.quo(8*ZZ) sage: pi = R.cover() sage: pi Ring morphism: From: Integer Ring To: Ring of integers modulo 8 Defn: Natural quotient map sage: pi.domain() Integer Ring sage: pi.codomain() Ring of integers modulo 8 sage: pi(10) 2 sage: pi.lift() Set-theoretic ring morphism: From: Ring of integers modulo 8 To: Integer Ring Defn: Choice of lifting map sage: pi.lift(13) 5
Inclusion of GF(2) into GF(4,'a').
sage: k = GF(2) sage: i = k.hom(GF(4, 'a')) sage: i Ring Coercion morphism: From: Finite Field of size 2 To: Finite Field in a of size 2^2 sage: i(0) 0 sage: a = i(1); a.parent() Finite Field in a of size 2^2
We next compose the inclusion with reduction from the integers to GF(2).
sage: pi = ZZ.hom(k) sage: pi Ring Coercion morphism: From: Integer Ring To: Finite Field of size 2 sage: f = i * pi sage: f Composite morphism: From: Integer Ring To: Finite Field in a of size 2^2 Defn: Ring Coercion morphism: From: Integer Ring To: Finite Field of size 2 then Ring Coercion morphism: From: Finite Field of size 2 To: Finite Field in a of size 2^2 sage: a = f(5); a 1 sage: a.parent() Finite Field in a of size 2^2
Inclusion from
to the 3-adic field.
sage: phi = QQ.hom(Qp(3, print_mode = 'series')) sage: phi Ring Coercion morphism: From: Rational Field To: 3-adic Field with capped relative precision 20 sage: phi.codomain() 3-adic Field with capped relative precision 20 sage: phi(394) 1 + 2*3 + 3^2 + 2*3^3 + 3^4 + 3^5 + O(3^20)
An automorphism of a quotient of a univariate polynomial ring.
sage: R.<x> = PolynomialRing(QQ) sage: S.<sqrt2> = R.quo(x^2-2) sage: sqrt2^2 2 sage: (3+sqrt2)^10 993054*sqrt2 + 1404491 sage: c = S.hom([-sqrt2]) sage: c(1+sqrt2) -sqrt2 + 1
Note that Sage verifies that the morphism is valid:
sage: (1 - sqrt2)^2 -2*sqrt2 + 3 sage: c = S.hom([1-sqrt2]) # this is not valid Traceback (most recent call last): ... TypeError: images do not define a valid homomorphism
Endomorphism of power series ring.
sage: R.<t> = PowerSeriesRing(QQ); R Power Series Ring in t over Rational Field sage: f = R.hom([t^2]); f Ring endomorphism of Power Series Ring in t over Rational Field Defn: t |--> t^2 sage: R.set_default_prec(10) sage: s = 1/(1 + t); s 1 - t + t^2 - t^3 + t^4 - t^5 + t^6 - t^7 + t^8 - t^9 + O(t^10) sage: f(s) 1 - t^2 + t^4 - t^6 + t^8 - t^10 + t^12 - t^14 + t^16 - t^18 + O(t^20)
Frobenious on a power series ring over a finite field.
sage: R.<t> = PowerSeriesRing(GF(5)) sage: f = R.hom([t^5]); f Ring endomorphism of Power Series Ring in t over Finite Field of size 5 Defn: t |--> t^5 sage: a = 2 + t + 3*t^2 + 4*t^3 + O(t^4) sage: b = 1 + t + 2*t^2 + t^3 + O(t^5) sage: f(a) 2 + t^5 + 3*t^10 + 4*t^15 + O(t^20) sage: f(b) 1 + t^5 + 2*t^10 + t^15 + O(t^25) sage: f(a*b) 2 + 3*t^5 + 3*t^10 + t^15 + O(t^20) sage: f(a)*f(b) 2 + 3*t^5 + 3*t^10 + t^15 + O(t^20)
Homomorphism of Laurent series ring.
sage: R.<t> = LaurentSeriesRing(QQ) sage: f = R.hom([t^3 + t]); f Ring endomorphism of Laurent Series Ring in t over Rational Field Defn: t |--> t + t^3 sage: R.set_default_prec(10) sage: s = 2/t^2 + 1/(1 + t); s 2*t^-2 + 1 - t + t^2 - t^3 + t^4 - t^5 + t^6 - t^7 + t^8 - t^9 + O(t^10) sage: f(s) 2*t^-2 - 3 - t + 7*t^2 - 2*t^3 - 5*t^4 - 4*t^5 + 16*t^6 - 9*t^7 + O(t^8) sage: f = R.hom([t^3]); f Ring endomorphism of Laurent Series Ring in t over Rational Field Defn: t |--> t^3 sage: f(s) 2*t^-6 + 1 - t^3 + t^6 - t^9 + t^12 - t^15 + t^18 - t^21 + t^24 - t^27 sage: s = 2/t^2 + 1/(1 + t); s 2*t^-2 + 1 - t + t^2 - t^3 + t^4 - t^5 + t^6 - t^7 + t^8 - t^9 + O(t^10) sage: f(s) 2*t^-6 + 1 - t^3 + t^6 - t^9 + t^12 - t^15 + t^18 - t^21 + t^24 - t^27
Note that the homomorphism must result in a converging Laurent series, so the valuation of the image of the generator must be positive:
sage: R.hom([1/t]) Traceback (most recent call last): ... TypeError: images do not define a valid homomorphism sage: R.hom([1]) Traceback (most recent call last): ... TypeError: images do not define a valid homomorphism
Complex conjugation on cyclotomic fields.
sage: K.<zeta7> = CyclotomicField(7) sage: c = K.hom([1/zeta7]); c Ring endomorphism of Cyclotomic Field of order 7 and degree 6 Defn: zeta7 |--> -zeta7^5 - zeta7^4 - zeta7^3 - zeta7^2 - zeta7 - 1 sage: a = (1+zeta7)^5; a zeta7^5 + 5*zeta7^4 + 10*zeta7^3 + 10*zeta7^2 + 5*zeta7 + 1 sage: c(a) 5*zeta7^5 + 5*zeta7^4 - 4*zeta7^2 - 5*zeta7 - 4 sage: c(zeta7 + 1/zeta7) # this element is obviously fixed by inversion -zeta7^5 - zeta7^4 - zeta7^3 - zeta7^2 - 1 sage: zeta7 + 1/zeta7 -zeta7^5 - zeta7^4 - zeta7^3 - zeta7^2 - 1
Embedding a number field into the reals.
sage: R.<x> = PolynomialRing(QQ) sage: K.<beta> = NumberField(x^3 - 2) sage: alpha = RR(2)^(1/3); alpha 1.25992104989487 sage: i = K.hom([alpha],check=False); i Ring morphism: From: Number Field in beta with defining polynomial x^3 - 2 To: Real Field with 53 bits of precision Defn: beta |--> 1.25992104989487 sage: i(beta) 1.25992104989487 sage: i(beta^3) 2.00000000000000 sage: i(beta^2 + 1) 2.58740105196820
An example from Jim Carlson:
sage: K = QQ # by the way :-) sage: R.<a,b,c,d> = K[]; R Multivariate Polynomial Ring in a, b, c, d over Rational Field sage: S.<u> = K[]; S Univariate Polynomial Ring in u over Rational Field sage: f = R.hom([0,0,0,u], S); f Ring morphism: From: Multivariate Polynomial Ring in a, b, c, d over Rational Field To: Univariate Polynomial Ring in u over Rational Field Defn: a |--> 0 b |--> 0 c |--> 0 d |--> u sage: f(a+b+c+d) u sage: f( (a+b+c+d)^2 ) u^2
TESTS:
sage: H = Hom(ZZ, QQ) sage: H == loads(dumps(H)) True
sage: K.<zeta7> = CyclotomicField(7) sage: c = K.hom([1/zeta7]) sage: c == loads(dumps(c)) True
sage: R.<t> = PowerSeriesRing(GF(5)) sage: f = R.hom([t^5]) sage: f == loads(dumps(f)) True
Module-level Functions
) |
Class: RingHomomorphism
Functions: inverse_image,
is_injective,
is_zero,
lift,
pushforward
) |
Return the inverse image of the ideal
under this ring
homomorphism.
) |
Return True if this is the zero map and False otherwise.
A *ring* homomorphism is considered to be 0 if and only if
it sends the 1 element of the domain to the 0 element of the
codomain. Since rings in SAGE all have a 1 element, the
zero homomorphism is only to a ring of order 1, where 1==0,
e.g., the ring Integers(1)
.
First an example of a map that is obviously nonzero.
sage: h = Hom(ZZ, QQ) sage: f = h.natural_map() sage: f.is_zero() False
Next we make the zero ring as
.
sage: R = Integers(1) sage: R Ring of integers modulo 1 sage: h = Hom(ZZ, R) sage: f = h.natural_map() sage: f.is_zero() True
Finally we check an example in characteristic 2.
sage: h = Hom(ZZ, GF(2)) sage: f = h.natural_map() sage: f.is_zero() False
) |
Return a lifting homomorphism associated to this homomorphism, if it has been defined.
If x is not None, return the value of the lift morphism on x.
) |
Returns the pushforward of the ideal
under this ring
homomorphism.
Special Functions: __init__,
_repr_type,
_set_lift
) |
) |
Class: RingHomomorphism_coercion
Special Functions: __init__,
_repr_type
) |
Class: RingHomomorphism_cover
sage: R.<x,y> = PolynomialRing(QQ, 2) sage: S.<a,b> = R.quo(x^2 + y^2) sage: phi = S.cover(); phi Ring morphism: From: Multivariate Polynomial Ring in x, y over Rational Field To: Quotient of Multivariate Polynomial Ring in x, y over Rational Field by the ideal (x^2 + y^2) Defn: Natural quotient map sage: phi(x+y) a + b
Functions: kernel
Special Functions: __cmp__,
__init__,
_repr_defn
) |
Class: RingHomomorphism_from_quotient
Input:
The domain
is a quotient object
, and
R.cover()
is the ring homomorphism
. The
condition on the elements
im_gens
of
is that they
define a homomorphism
such that each generator of the
kernel of
maps to 0
.
sage: R.<x, y, z> = PolynomialRing(QQ, 3) sage: S.<a, b, c> = R.quo(x^3 + y^3 + z^3) sage: phi = S.hom([b, c, a]); phi Ring endomorphism of Quotient of Multivariate Polynomial Ring in x, y, z over Rational Field by the ideal (x^3 + y^3 + z^3) Defn: a |--> b b |--> c c |--> a sage: phi(a+b+c) a + b + c sage: loads(dumps(phi)) == phi True
Validity of the homomorphism is determined, when possible, and a TypeError is raised if there is no homomorphism sending the generators to the given images.
sage: S.hom([b^2, c^2, a^2]) Traceback (most recent call last): ... TypeError: images do not define a valid homomorphism
Functions: morphism_from_cover
Special Functions: __cmp__,
__init__,
_phi,
_repr_defn
) |
Underlying morphism used to define this quotient map (i.e., morphism from the cover of the domain).
) |
Class: RingHomomorphism_im_gens
Functions: im_gens
Special Functions: __eq__,
__ge__,
__gt__,
__init__,
__le__,
__lt__,
__ne__,
_repr_defn
) |
Class: RingMap
Special Functions: __init__,
_repr_type
) |
Class: RingMap_lift
x.lift()
is an element that naturally coerces to x.lift()
.
sage: R, (x,y) = PolynomialRing(QQ, 2, 'xy').objgens() sage: S.<xbar,ybar> = R.quo( (x^2 + y^2, y) ) sage: S.lift() Set-theoretic ring morphism: From: Quotient of Multivariate Polynomial Ring in x, y over Rational Field by the ideal (x^2 + y^2, y) To: Multivariate Polynomial Ring in x, y over Rational Field Defn: Choice of lifting map sage: S.lift() == 0 False
Special Functions: __cmp__,
__init__,
_repr_defn
) |
See About this document... for information on suggesting changes.