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

Commit

Permalink
Add base_map to finite_field homsets
Browse files Browse the repository at this point in the history
  • Loading branch information
roed314 committed Sep 13, 2019
1 parent 1738aa9 commit d0e0953
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 9 deletions.
12 changes: 9 additions & 3 deletions src/sage/rings/finite_rings/hom_finite_field.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens):
"""
A class implementing embeddings between finite fields.
"""
def __init__(self, parent, im_gens=None, check=True, section_class=None):
def __init__(self, parent, im_gens=None, base_map=None, check=True, section_class=None):
"""
TESTS::
Expand Down Expand Up @@ -228,7 +228,7 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens):
if im_gens is None:
im_gens = domain.modulus().any_root(codomain)
check=False
RingHomomorphism_im_gens.__init__(self, parent, im_gens, check)
RingHomomorphism_im_gens.__init__(self, parent, im_gens, base_map=base_map, check=check)
if section_class is None:
self._section_class = SectionFiniteFieldHomomorphism_generic
else:
Expand Down Expand Up @@ -300,7 +300,11 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens):
sage: f(a*b) == f(a) * f(b)
True
"""
return x.polynomial()(self.im_gens()[0])
f = x.polynomial()
bm = self.base_map()
if bm is not None:
f = f.change_ring(bm)
return f(self.im_gens()[0])


def is_injective(self):
Expand Down Expand Up @@ -370,6 +374,8 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens):
To: Finite Field in T of size 3^21
Defn: t |--> T^20 + 2*T^18 + T^16 + 2*T^13 + T^9 + 2*T^8 + T^7 + T^6 + T^5 + T^3 + 2*T^2 + T
"""
if self.base_map() is not None:
raise NotImplementedError
return self._section_class(self)

def inverse_image(self, b):
Expand Down
6 changes: 3 additions & 3 deletions src/sage/rings/finite_rings/hom_prime_finite_field.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ cdef class FiniteFieldHomomorphism_prime(FiniteFieldHomomorphism_generic):
A class implementing embeddings of prime finite fields into
general finite fields.
"""
def __init__(self, parent, im_gens=None, check=False, section_class=None):
def __init__(self, parent, im_gens=None, base_map=None, check=False, section_class=None):
"""
TESTS::
Expand All @@ -76,8 +76,8 @@ cdef class FiniteFieldHomomorphism_prime(FiniteFieldHomomorphism_generic):
raise TypeError("The domain is not a finite prime field")
if section_class is None:
section_class = SectionFiniteFieldHomomorphism_prime
FiniteFieldHomomorphism_generic.__init__(self, parent, im_gens, check,
section_class)
FiniteFieldHomomorphism_generic.__init__(self, parent, im_gens, base_map=base_map,
check=check, section_class=section_class)

cpdef Element _call_(self, x):
"""
Expand Down
8 changes: 5 additions & 3 deletions src/sage/rings/finite_rings/homset.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class FiniteFieldHomset(RingHomset_generic):
# category = FiniteFields()
# RingHomset_generic.__init__(self, R, S, category)

def __call__(self, im_gens, check=True):
def __call__(self, im_gens, base_map=None, check=True):
"""
Construct the homomorphism defined by ``im_gens``.
Expand Down Expand Up @@ -87,12 +87,14 @@ def __call__(self, im_gens, check=True):
True
"""
if isinstance(im_gens, FiniteFieldHomomorphism_generic):
if base_map is not None:
raise ValueError("Cannot specify base map when providing morphism")
return self._coerce_impl(im_gens)
try:
if self.domain().degree() == 1:
from sage.rings.finite_rings.hom_prime_finite_field import FiniteFieldHomomorphism_prime
return FiniteFieldHomomorphism_prime(self, im_gens, check=check)
return FiniteFieldHomomorphism_generic(self, im_gens, check=check)
return FiniteFieldHomomorphism_prime(self, im_gens, base_map=base_map, check=check)
return FiniteFieldHomomorphism_generic(self, im_gens, base_map=base_map, check=check)
except (NotImplementedError, ValueError):
try:
return self._coerce_impl(im_gens)
Expand Down

0 comments on commit d0e0953

Please sign in to comment.