# Morphisms between extension of rings#

AUTHOR:

• Xavier Caruso (2019)

class sage.rings.ring_extension_morphism.MapFreeModuleToRelativeRing[source]#

Bases: `Map`

Base class of the module isomorphism between a ring extension and a free module over one of its bases.

is_injective()[source]#

Return whether this morphism is injective.

EXAMPLES:

```sage: K = GF(11^6).over(GF(11^3))                                           # needs sage.rings.finite_rings
sage: V, i, j = K.free_module()                                             # needs sage.rings.finite_rings
sage: i.is_injective()                                                      # needs sage.rings.finite_rings
True
```
```>>> from sage.all import *
>>> K = GF(Integer(11)**Integer(6)).over(GF(Integer(11)**Integer(3)))                                           # needs sage.rings.finite_rings
>>> V, i, j = K.free_module()                                             # needs sage.rings.finite_rings
>>> i.is_injective()                                                      # needs sage.rings.finite_rings
True
```
is_surjective()[source]#

Return whether this morphism is surjective.

EXAMPLES:

```sage: K = GF(11^6).over(GF(11^3))                                           # needs sage.rings.finite_rings
sage: V, i, j = K.free_module()                                             # needs sage.rings.finite_rings
sage: i.is_surjective()                                                     # needs sage.rings.finite_rings
True
```
```>>> from sage.all import *
>>> K = GF(Integer(11)**Integer(6)).over(GF(Integer(11)**Integer(3)))                                           # needs sage.rings.finite_rings
>>> V, i, j = K.free_module()                                             # needs sage.rings.finite_rings
>>> i.is_surjective()                                                     # needs sage.rings.finite_rings
True
```
class sage.rings.ring_extension_morphism.MapRelativeRingToFreeModule[source]#

Bases: `Map`

Base class of the module isomorphism between a ring extension and a free module over one of its bases.

is_injective()[source]#

Return whether this morphism is injective.

EXAMPLES:

```sage: K = GF(11^6).over(GF(11^3))                                           # needs sage.rings.finite_rings
sage: V, i, j = K.free_module()                                             # needs sage.rings.finite_rings
sage: j.is_injective()                                                      # needs sage.rings.finite_rings
True
```
```>>> from sage.all import *
>>> K = GF(Integer(11)**Integer(6)).over(GF(Integer(11)**Integer(3)))                                           # needs sage.rings.finite_rings
>>> V, i, j = K.free_module()                                             # needs sage.rings.finite_rings
>>> j.is_injective()                                                      # needs sage.rings.finite_rings
True
```
is_surjective()[source]#

Return whether this morphism is injective.

EXAMPLES:

```sage: K = GF(11^6).over(GF(11^3))                                           # needs sage.rings.finite_rings
sage: V, i, j = K.free_module()                                             # needs sage.rings.finite_rings
sage: j.is_surjective()                                                     # needs sage.rings.finite_rings
True
```
```>>> from sage.all import *
>>> K = GF(Integer(11)**Integer(6)).over(GF(Integer(11)**Integer(3)))                                           # needs sage.rings.finite_rings
>>> V, i, j = K.free_module()                                             # needs sage.rings.finite_rings
>>> j.is_surjective()                                                     # needs sage.rings.finite_rings
True
```
class sage.rings.ring_extension_morphism.RingExtensionBackendIsomorphism[source]#

A class for implementating isomorphisms taking an element of the backend to its ring extension.

class sage.rings.ring_extension_morphism.RingExtensionBackendReverseIsomorphism[source]#

A class for implementating isomorphisms from a ring extension to its backend.

class sage.rings.ring_extension_morphism.RingExtensionHomomorphism[source]#

Bases: `RingMap`

A class for ring homomorphisms between extensions.

base_map()[source]#

Return the base map of this morphism or just `None` if the base map is a coercion map.

EXAMPLES:

```sage: F = GF(5)
sage: K.<a> = GF(5^2).over(F)                                               # needs sage.rings.finite_rings
sage: L.<b> = GF(5^6).over(K)                                               # needs sage.rings.finite_rings
```
```>>> from sage.all import *
>>> F = GF(Integer(5))
>>> K = GF(Integer(5)**Integer(2)).over(F, names=('a',)); (a,) = K._first_ngens(1)# needs sage.rings.finite_rings
>>> L = GF(Integer(5)**Integer(6)).over(K, names=('b',)); (b,) = L._first_ngens(1)# needs sage.rings.finite_rings
```

We define the absolute Frobenius of L:

```sage: FrobL = L.hom([b^5, a^5]); FrobL                                      # needs sage.rings.finite_rings
Ring endomorphism of
Field in b with defining polynomial x^3 + (2 + 2*a)*x - a over its base
Defn: b |--> (-1 + a) + (1 + 2*a)*b + a*b^2
with map on base ring:
a |--> 1 - a
sage: FrobL.base_map()                                                      # needs sage.rings.finite_rings
Ring morphism:
From: Field in a with defining polynomial x^2 + 4*x + 2 over its base
To:   Field in b with defining polynomial x^3 + (2 + 2*a)*x - a over its base
Defn: a |--> 1 - a
```
```>>> from sage.all import *
>>> FrobL = L.hom([b**Integer(5), a**Integer(5)]); FrobL                                      # needs sage.rings.finite_rings
Ring endomorphism of
Field in b with defining polynomial x^3 + (2 + 2*a)*x - a over its base
Defn: b |--> (-1 + a) + (1 + 2*a)*b + a*b^2
with map on base ring:
a |--> 1 - a
>>> FrobL.base_map()                                                      # needs sage.rings.finite_rings
Ring morphism:
From: Field in a with defining polynomial x^2 + 4*x + 2 over its base
To:   Field in b with defining polynomial x^3 + (2 + 2*a)*x - a over its base
Defn: a |--> 1 - a
```

The square of `FrobL` acts trivially on K; in other words, it has a trivial base map:

```sage: phi = FrobL^2; phi                                                    # needs sage.rings.finite_rings
Ring endomorphism of
Field in b with defining polynomial x^3 + (2 + 2*a)*x - a over its base
Defn: b |--> 2 + 2*a*b + (2 - a)*b^2
sage: phi.base_map()                                                        # needs sage.rings.finite_rings
```
```>>> from sage.all import *
>>> phi = FrobL**Integer(2); phi                                                    # needs sage.rings.finite_rings
Ring endomorphism of
Field in b with defining polynomial x^3 + (2 + 2*a)*x - a over its base
Defn: b |--> 2 + 2*a*b + (2 - a)*b^2
>>> phi.base_map()                                                        # needs sage.rings.finite_rings
```
is_identity()[source]#

Return whether this morphism is the identity.

EXAMPLES:

```sage: # needs sage.rings.finite_rings
sage: K.<a> = GF(5^2).over()   # over GF(5)
sage: FrobK = K.hom([a^5])
sage: FrobK.is_identity()
False
sage: (FrobK^2).is_identity()
True
```
```>>> from sage.all import *
>>> # needs sage.rings.finite_rings
>>> K = GF(Integer(5)**Integer(2)).over(names=('a',)); (a,) = K._first_ngens(1)# over GF(5)
>>> FrobK = K.hom([a**Integer(5)])
>>> FrobK.is_identity()
False
>>> (FrobK**Integer(2)).is_identity()
True
```

Coercion maps are not considered as identity morphisms:

```sage: # needs sage.rings.finite_rings
sage: L.<b> = GF(5^6).over(K)
sage: iota = L.defining_morphism(); iota
Ring morphism:
From: Field in a with defining polynomial x^2 + 4*x + 2 over its base
To:   Field in b with defining polynomial x^3 + (2 + 2*a)*x - a over its base
Defn: a |--> a
sage: iota.is_identity()
False
```
```>>> from sage.all import *
>>> # needs sage.rings.finite_rings
>>> L = GF(Integer(5)**Integer(6)).over(K, names=('b',)); (b,) = L._first_ngens(1)
>>> iota = L.defining_morphism(); iota
Ring morphism:
From: Field in a with defining polynomial x^2 + 4*x + 2 over its base
To:   Field in b with defining polynomial x^3 + (2 + 2*a)*x - a over its base
Defn: a |--> a
>>> iota.is_identity()
False
```
is_injective()[source]#

Return whether this morphism is injective.

EXAMPLES:

```sage: # needs sage.rings.finite_rings
sage: K = GF(5^10).over(GF(5^5))
sage: iota = K.defining_morphism(); iota
Ring morphism:
From: Finite Field in z5 of size 5^5
To:   Field in z10 with defining polynomial
x^2 + (2*z5^3 + 2*z5^2 + 4*z5 + 4)*x + z5 over its base
Defn: z5 |--> z5
sage: iota.is_injective()
True

sage: K = GF(7).over(ZZ)
sage: iota = K.defining_morphism(); iota
Ring morphism:
From: Integer Ring
To:   Finite Field of size 7 over its base
Defn: 1 |--> 1
sage: iota.is_injective()
False
```
```>>> from sage.all import *
>>> # needs sage.rings.finite_rings
>>> K = GF(Integer(5)**Integer(10)).over(GF(Integer(5)**Integer(5)))
>>> iota = K.defining_morphism(); iota
Ring morphism:
From: Finite Field in z5 of size 5^5
To:   Field in z10 with defining polynomial
x^2 + (2*z5^3 + 2*z5^2 + 4*z5 + 4)*x + z5 over its base
Defn: z5 |--> z5
>>> iota.is_injective()
True

>>> K = GF(Integer(7)).over(ZZ)
>>> iota = K.defining_morphism(); iota
Ring morphism:
From: Integer Ring
To:   Finite Field of size 7 over its base
Defn: 1 |--> 1
>>> iota.is_injective()
False
```
is_surjective()[source]#

Return whether this morphism is surjective.

EXAMPLES:

```sage: # needs sage.rings.finite_rings
sage: K = GF(5^10).over(GF(5^5))
sage: iota = K.defining_morphism(); iota
Ring morphism:
From: Finite Field in z5 of size 5^5
To:   Field in z10 with defining polynomial
x^2 + (2*z5^3 + 2*z5^2 + 4*z5 + 4)*x + z5 over its base
Defn: z5 |--> z5
sage: iota.is_surjective()
False

sage: K = GF(7).over(ZZ)
sage: iota = K.defining_morphism(); iota
Ring morphism:
From: Integer Ring
To:   Finite Field of size 7 over its base
Defn: 1 |--> 1
sage: iota.is_surjective()
True
```
```>>> from sage.all import *
>>> # needs sage.rings.finite_rings
>>> K = GF(Integer(5)**Integer(10)).over(GF(Integer(5)**Integer(5)))
>>> iota = K.defining_morphism(); iota
Ring morphism:
From: Finite Field in z5 of size 5^5
To:   Field in z10 with defining polynomial
x^2 + (2*z5^3 + 2*z5^2 + 4*z5 + 4)*x + z5 over its base
Defn: z5 |--> z5
>>> iota.is_surjective()
False

>>> K = GF(Integer(7)).over(ZZ)
>>> iota = K.defining_morphism(); iota
Ring morphism:
From: Integer Ring
To:   Finite Field of size 7 over its base
Defn: 1 |--> 1
>>> iota.is_surjective()
True
```