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]

Bases: RingExtensionHomomorphism

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

class sage.rings.ring_extension_morphism.RingExtensionBackendReverseIsomorphism[source]

Bases: RingExtensionHomomorphism

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