Skip to content
This repository has been archived by the owner on Jan 30, 2023. It is now read-only.

Commit

Permalink
fix pickling for Frobenius endomorphisms
Browse files Browse the repository at this point in the history
  • Loading branch information
xcaruso committed Apr 2, 2020
1 parent 6a45805 commit 8f40b0a
Showing 1 changed file with 70 additions and 5 deletions.
75 changes: 70 additions & 5 deletions src/sage/rings/finite_rings/hom_finite_field.pyx
Expand Up @@ -409,6 +409,13 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens):
cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic):
"""
A class implementing Frobenius endomorphisms on finite fields.
TESTS::
sage: k.<a> = GF(7^11)
sage: Frob = k.frobenius_endomorphism(5)
sage: TestSuite(Frob).run()
"""
def __init__(self, domain, n=1):
"""
Expand Down Expand Up @@ -453,11 +460,10 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic):
except TypeError:
raise TypeError("n (=%s) is not an integer" % n)

if domain.is_finite():
self._degree = domain.degree()
self._power = n % self._degree
self._degree_fixed = domain.degree().gcd(self._power)
self._order = self._degree / self._degree_fixed
self._degree = domain.degree()
self._power = n % self._degree
self._degree_fixed = domain.degree().gcd(self._power)
self._order = self._degree / self._degree_fixed
self._q = domain.characteristic() ** self._power
RingHomomorphism.__init__(self, Hom(domain, domain))

Expand Down Expand Up @@ -726,8 +732,67 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic):
return self.power() == 0

def __hash__(self):
r"""
Return a hash of this morphism
EXAMPLES::
sage: k.<t> = GF(5^3)
sage: Frob = k.frobenius_endomorphism()
sage: hash(Frob) # random
383183030479672104
"""
return Morphism.__hash__(self)

cdef dict _extra_slots(self):
r"""
Helper function for copying and pickling
TESTS::
sage: k.<t> = GF(5^3)
sage: Frob = k.frobenius_endomorphism(2)
sage: Frob.__reduce__() # indirect doctest
(<built-in function unpickle_map>,
(<class 'sage.rings.finite_rings.hom_finite_field_givaro.FrobeniusEndomorphism_givaro'>,
Automorphism group of Finite Field in t of size 5^3,
{},
{'_codomain': Finite Field in t of size 5^3,
'_domain': Finite Field in t of size 5^3,
'_is_coercion': False,
'_lift': None,
'_power': 2,
'_repr_type_str': None}))
"""
cdef dict slots
slots = FrobeniusEndomorphism_generic._extra_slots(self)
slots['_power'] = self._power
return slots

cdef _update_slots(self, dict slots):
r"""
Helper function for copying and pickling
TESTS::
sage: k.<t> = GF(5^3)
sage: Frob = k.frobenius_endomorphism(2)
sage: Frob
Frobenius endomorphism t |--> t^(5^2) on Finite Field in t of size 5^3
sage: phi = copy(Frob)
sage: phi
Frobenius endomorphism t |--> t^(5^2) on Finite Field in t of size 5^3
sage: Frob == phi
True
"""
FrobeniusEndomorphism_generic._update_slots(self, slots)
self._power = slots['_power']
domain = self.domain()
self._degree = domain.degree()
self._degree_fixed = domain.degree().gcd(self._power)
self._order = self._degree / self._degree_fixed
self._q = domain.characteristic() ** self._power

from sage.misc.persist import register_unpickle_override
register_unpickle_override('sage.rings.finite_field_morphism', 'FiniteFieldHomomorphism_generic', FiniteFieldHomomorphism_generic)

0 comments on commit 8f40b0a

Please sign in to comment.