Path: blob/master/src/sage/rings/finite_rings/hom_prime_finite_field.pyx
8820 views
"""1Special implementation for prime finite field of:23- embeddings of such field into general finite fields45- Frobenius endomorphisms (= identity with our assumptions)67.. SEEALSO::89:mod:`sage.rings.finite_rings.hom_finite_field`1011AUTHOR:1213- Xavier Caruso (2012-06-29)14"""1516#############################################################################17# Copyright (C) 2012 Xavier Caruso <[email protected]>18#19# Distributed under the terms of the GNU General Public License (GPL)20#21# http://www.gnu.org/licenses/22#****************************************************************************232425from sage.rings.integer cimport Integer2627from sage.categories.homset import Hom28from sage.structure.element cimport Element2930from hom_finite_field cimport SectionFiniteFieldHomomorphism_generic31from hom_finite_field cimport FiniteFieldHomomorphism_generic32from hom_finite_field cimport FrobeniusEndomorphism_finite_field3334from sage.rings.finite_rings.finite_field_base import FiniteField, is_FiniteField35from sage.rings.morphism cimport RingHomomorphism_im_gens363738cdef class SectionFiniteFieldHomomorphism_prime(SectionFiniteFieldHomomorphism_generic):39cpdef Element _call_(self, x):40try:41return self._codomain(x)42except TypeError:43raise ValueError("%s is not in the image of %s" % (x, self._inverse))444546cdef class FiniteFieldHomomorphism_prime(FiniteFieldHomomorphism_generic):47"""48A class implementing embeddings of prime finite fields into49general finite fields.50"""51def __init__(self, parent, im_gens=None, check=False, section_class=None):52"""53TESTS::5455sage: from sage.rings.finite_rings.hom_prime_finite_field import FiniteFieldHomomorphism_prime56sage: k = GF(3)57sage: K.<T> = GF(3^4)58sage: f = FiniteFieldHomomorphism_prime(Hom(k, K)); f59Ring morphism:60From: Finite Field of size 361To: Finite Field in T of size 3^462Defn: 1 |--> 16364sage: k.<t> = GF(3^2)65sage: K.<T> = GF(3^4)66sage: f = FiniteFieldHomomorphism_prime(Hom(k, K)); f67Traceback (most recent call last):68...69TypeError: The domain is not a finite prime field70"""71domain = parent.domain()72if not is_FiniteField(domain) or not domain.is_prime_field():73raise TypeError("The domain is not a finite prime field")74if section_class == None:75section_class = SectionFiniteFieldHomomorphism_prime76FiniteFieldHomomorphism_generic.__init__(self, parent, im_gens, check,77section_class)787980cpdef Element _call_(self, x):81"""82TESTS::8384sage: from sage.rings.finite_rings.hom_prime_finite_field import FiniteFieldHomomorphism_prime85sage: k = GF(3)86sage: K.<t> = GF(3^5)87sage: f = FiniteFieldHomomorphism_prime(Hom(k, K))88sage: a = f(4); a89190sage: a.parent()91Finite Field in t of size 3^592"""93return self._codomain(x)949596cdef class FrobeniusEndomorphism_prime(FrobeniusEndomorphism_finite_field):97"""98A class implementing Frobenius endomorphism on prime finite99fields (i.e. identity map :-).100"""101def __init__(self, domain, power=1):102if not is_FiniteField(domain) or not domain.is_prime_field():103raise TypeError("The domain is not a finite prime field")104FrobeniusEndomorphism_finite_field.__init__(self, Hom(domain, domain))105self._order = 1106self._power = 0107108cpdef Element _call_(self, x):109"""110TESTS::111112sage: k = GF(5)113sage: Frob = k.frobenius_endomorphism()114sage: Frob(2)1152116"""117return x118119def _composition(self, right):120"""121Return self o right.122123It is always right, since self is always identity because124the domain is a prime field.125"""126return right127128def __pow__(self, n, modulus):129"""130Return the `n`-th iterate of this endomorphism131(that is the identity since the domain is a prime132field).133"""134return self135136def fixed_field(self):137"""138Return the fixed field of ``self``.139140OUTPUT:141142- a tuple `(K, e)`, where `K` is the subfield of the domain143consisting of elements fixed by ``self`` and `e` is an144embedding of `K` into the domain.145146.. NOTE::147148Since here the domain is a prime field, the subfield149is the same prime field and the embedding is necessarily150the identity map.151152EXAMPLES::153154sage: k.<t> = GF(5)155sage: f = k.frobenius_endomorphism(2); f156Identity endomorphism of Finite Field of size 5157sage: kfixed, embed = f.fixed_field()158159sage: kfixed == k160True161sage: [ embed(x) == x for x in kfixed ]162[True, True, True, True, True]163"""164return self._domain, self._domain.hom(self._domain)165166167