Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
""" Finite field morphisms using Givaro
Special implementation for givaro finite fields of:
- embeddings between finite fields
- frobenius endomorphisms
SEEALSO::
:mod:`sage.rings.finite_rings.hom_finite_field`
AUTHOR:
- Xavier Caruso (2012-06-29) """
############################################################################# # Copyright (C) 2012 Xavier Caruso <xavier.caruso@normalesup.org> # # Distributed under the terms of the GNU General Public License (GPL) # # http://www.gnu.org/licenses/ #****************************************************************************
from .hom_finite_field cimport SectionFiniteFieldHomomorphism_generic from .hom_finite_field cimport FiniteFieldHomomorphism_generic from .hom_finite_field cimport FrobeniusEndomorphism_finite_field
from .hom_prime_finite_field cimport FiniteFieldHomomorphism_prime
from sage.structure.element cimport Element from sage.rings.morphism cimport RingHomomorphism_im_gens
from .element_givaro cimport FiniteField_givaroElement #from element_givaro cimport make_FiniteField_givaroElement
from sage.structure.parent cimport Parent from .element_givaro cimport Cache_givaro
cdef class SectionFiniteFieldHomomorphism_givaro(SectionFiniteFieldHomomorphism_generic): def __init__(self, inverse): """ TESTS::
sage: from sage.rings.finite_rings.hom_finite_field_givaro import FiniteFieldHomomorphism_givaro sage: k.<t> = GF(3^2) sage: K.<T> = GF(3^4) sage: f = FiniteFieldHomomorphism_givaro(Hom(k, K)) sage: g = f.section(); g Section of Ring morphism: From: Finite Field in t of size 3^2 To: Finite Field in T of size 3^4 Defn: t |--> 2*T^3 + 2*T^2 + 1 """ raise TypeError("The given map is not an instance of FiniteFieldHomomorphism_givaro")
# Compute a = gcd(inverse_power, order) # and solve inverse_power*x = a (mod order) cdef unsigned long q cdef long sb, sy
x += order
cpdef Element _call_(self, x): """ TESTS::
sage: from sage.rings.finite_rings.hom_finite_field_givaro import FiniteFieldHomomorphism_givaro sage: k.<t> = GF(3^2) sage: K.<T> = GF(3^4) sage: f = FiniteFieldHomomorphism_givaro(Hom(k, K)) sage: g = f.section() sage: g(f(t+1)) t + 1
sage: g(T) Traceback (most recent call last): ... ValueError: T is not in the image of Ring morphism: From: Finite Field in t of size 3^2 To: Finite Field in T of size 3^4 Defn: t |--> 2*T^3 + 2*T^2 + 1 """ raise TypeError("%s is not in %s" % (x, self.domain())) return make_FiniteField_givaroElement(self._codomain_cache, self._codomain_cache.objectptr.zero) return make_FiniteField_givaroElement(self._codomain_cache, self._codomain_cache.objectptr.one) else:
cdef class FiniteFieldHomomorphism_givaro(FiniteFieldHomomorphism_generic): def __init__(self, parent, im_gens=None, check=False): """ TESTS::
sage: from sage.rings.finite_rings.hom_finite_field_givaro import FiniteFieldHomomorphism_givaro sage: k.<t> = GF(3^2) sage: K.<T> = GF(3^4) sage: f = FiniteFieldHomomorphism_givaro(Hom(k, K)); f Ring morphism: From: Finite Field in t of size 3^2 To: Finite Field in T of size 3^4 Defn: t |--> 2*T^3 + 2*T^2 + 1
sage: k.<t> = GF(3^10) sage: K.<T> = GF(3^20) sage: f = FiniteFieldHomomorphism_givaro(Hom(k, K)); f Traceback (most recent call last): ... TypeError: The codomain is not an instance of FiniteField_givaro """ raise TypeError("The domain is not an instance of FiniteField_givaro")
cpdef Element _call_(self, x): """ TESTS::
sage: from sage.rings.finite_rings.hom_finite_field_givaro import FiniteFieldHomomorphism_givaro sage: k.<t> = GF(3^2) sage: K.<T> = GF(3^4) sage: f = FiniteFieldHomomorphism_givaro(Hom(k, K)) sage: f(t) 2*T^3 + 2*T^2 + 1 """ raise TypeError("%s is not in %s" % (x, self.domain())) return make_FiniteField_givaroElement(self._codomain_cache, self._codomain_cache.objectptr.zero) return make_FiniteField_givaroElement(self._codomain_cache, self._codomain_cache.objectptr.one)
cdef class FrobeniusEndomorphism_givaro(FrobeniusEndomorphism_finite_field): def __init__(self, domain, power=1): """ TESTS::
sage: k.<t> = GF(5^3) sage: Frob = k.frobenius_endomorphism(); Frob Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^3 sage: type(Frob) <type 'sage.rings.finite_rings.hom_finite_field_givaro.FrobeniusEndomorphism_givaro'>
sage: k.<t> = GF(5^20) sage: Frob = k.frobenius_endomorphism(); Frob Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^20 sage: type(Frob) <type 'sage.rings.finite_rings.hom_finite_field.FrobeniusEndomorphism_finite_field'> """ raise TypeError("The domain is not an instance of FiniteField_givaro")
def fixed_field(self): """ Return the fixed field of ``self``.
OUTPUT:
- a tuple `(K, e)`, where `K` is the subfield of the domain consisting of elements fixed by ``self`` and `e` is an embedding of `K` into the domain.
.. NOTE::
The name of the variable used for the subfield (if it is not a prime subfield) is suffixed by ``_fixed``.
EXAMPLES::
sage: k.<t> = GF(5^6) sage: f = k.frobenius_endomorphism(2) sage: kfixed, embed = f.fixed_field() sage: kfixed Finite Field in t_fixed of size 5^2 sage: embed Ring morphism: From: Finite Field in t_fixed of size 5^2 To: Finite Field in t of size 5^6 Defn: t_fixed |--> 4*t^5 + 2*t^4 + 4*t^2 + t
sage: tfixed = kfixed.gen() sage: embed(tfixed) 4*t^5 + 2*t^4 + 4*t^2 + t """ k = FiniteField(self.domain().characteristic()) f = FiniteFieldHomomorphism_prime(Hom(k, self.domain())) else:
# copied from element_givaro.pyx cdef inline FiniteField_givaroElement make_FiniteField_givaroElement(Cache_givaro cache, int x): cdef FiniteField_givaroElement y
else: |