diff --git a/src/sage/rings/finite_rings/hom_finite_field.pyx b/src/sage/rings/finite_rings/hom_finite_field.pyx index c816958a81d..bb216a813ea 100644 --- a/src/sage/rings/finite_rings/hom_finite_field.pyx +++ b/src/sage/rings/finite_rings/hom_finite_field.pyx @@ -184,6 +184,15 @@ cdef class SectionFiniteFieldHomomorphism_generic(Section): cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): """ A class implementing embeddings between finite fields. + + TESTS:: + + sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic + sage: k. = GF(3^7) + sage: K. = GF(3^21) + sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)) + sage: TestSuite(f).run() + """ def __init__(self, parent, im_gens=None, base_map=None, check=True, section_class=None): """ @@ -403,8 +412,68 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): return self.section()(b) def __hash__(self): + r""" + Return a hash of this morphism + + TESTS:: + + sage: k. = GF(5^3) + sage: Frob = k.frobenius_endomorphism() + sage: embed = Frob.fixed_field()[1] + sage: hash(embed) # random + -2441354824160407762 + """ return Morphism.__hash__(self) + cdef dict _extra_slots(self): + r""" + Helper function for copying and pickling + + TESTS:: + + sage: k. = GF(5^3) + sage: Frob = k.frobenius_endomorphism() + sage: embed = Frob.fixed_field()[1] + sage: embed.__reduce__() # indirect doctest + (, + (, + Set of field embeddings from Finite Field of size 5 to Finite Field in t of size 5^3, + {}, + {'__im_gens': [1], + '_base_map': None, + '_codomain': Finite Field in t of size 5^3, + '_domain': Finite Field of size 5, + '_is_coercion': False, + '_lift': None, + '_repr_type_str': None, + '_section_class': })) + """ + cdef dict slots + slots = RingHomomorphism_im_gens._extra_slots(self) + slots['_section_class'] = self._section_class + return slots + + cdef _update_slots(self, dict slots): + r""" + Helper function for copying and pickling + + TESTS:: + + sage: k. = GF(5^3) + sage: Frob = k.frobenius_endomorphism() + sage: embed = Frob.fixed_field()[1] + sage: f = loads(dumps(embed)) + sage: f == embed + True + sage: f.section() + Section of Ring morphism: + From: Finite Field of size 5 + To: Finite Field in t of size 5^3 + Defn: 1 |--> 1 + """ + RingHomomorphism_im_gens._update_slots(self, slots) + self._section_class = slots['_section_class'] + cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): """