Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagesmc
Path: blob/master/src/sage/rings/finite_rings/hom_prime_finite_field.pyx
8820 views
1
"""
2
Special implementation for prime finite field of:
3
4
- embeddings of such field into general finite fields
5
6
- Frobenius endomorphisms (= identity with our assumptions)
7
8
.. SEEALSO::
9
10
:mod:`sage.rings.finite_rings.hom_finite_field`
11
12
AUTHOR:
13
14
- Xavier Caruso (2012-06-29)
15
"""
16
17
#############################################################################
18
# Copyright (C) 2012 Xavier Caruso <[email protected]>
19
#
20
# Distributed under the terms of the GNU General Public License (GPL)
21
#
22
# http://www.gnu.org/licenses/
23
#****************************************************************************
24
25
26
from sage.rings.integer cimport Integer
27
28
from sage.categories.homset import Hom
29
from sage.structure.element cimport Element
30
31
from hom_finite_field cimport SectionFiniteFieldHomomorphism_generic
32
from hom_finite_field cimport FiniteFieldHomomorphism_generic
33
from hom_finite_field cimport FrobeniusEndomorphism_finite_field
34
35
from sage.rings.finite_rings.finite_field_base import FiniteField, is_FiniteField
36
from sage.rings.morphism cimport RingHomomorphism_im_gens
37
38
39
cdef class SectionFiniteFieldHomomorphism_prime(SectionFiniteFieldHomomorphism_generic):
40
cpdef Element _call_(self, x):
41
try:
42
return self._codomain(x)
43
except TypeError:
44
raise ValueError("%s is not in the image of %s" % (x, self._inverse))
45
46
47
cdef class FiniteFieldHomomorphism_prime(FiniteFieldHomomorphism_generic):
48
"""
49
A class implementing embeddings of prime finite fields into
50
general finite fields.
51
"""
52
def __init__(self, parent, im_gens=None, check=False, section_class=None):
53
"""
54
TESTS::
55
56
sage: from sage.rings.finite_rings.hom_prime_finite_field import FiniteFieldHomomorphism_prime
57
sage: k = GF(3)
58
sage: K.<T> = GF(3^4)
59
sage: f = FiniteFieldHomomorphism_prime(Hom(k, K)); f
60
Ring morphism:
61
From: Finite Field of size 3
62
To: Finite Field in T of size 3^4
63
Defn: 1 |--> 1
64
65
sage: k.<t> = GF(3^2)
66
sage: K.<T> = GF(3^4)
67
sage: f = FiniteFieldHomomorphism_prime(Hom(k, K)); f
68
Traceback (most recent call last):
69
...
70
TypeError: The domain is not a finite prime field
71
"""
72
domain = parent.domain()
73
if not is_FiniteField(domain) or not domain.is_prime_field():
74
raise TypeError("The domain is not a finite prime field")
75
if section_class == None:
76
section_class = SectionFiniteFieldHomomorphism_prime
77
FiniteFieldHomomorphism_generic.__init__(self, parent, im_gens, check,
78
section_class)
79
80
81
cpdef Element _call_(self, x):
82
"""
83
TESTS::
84
85
sage: from sage.rings.finite_rings.hom_prime_finite_field import FiniteFieldHomomorphism_prime
86
sage: k = GF(3)
87
sage: K.<t> = GF(3^5)
88
sage: f = FiniteFieldHomomorphism_prime(Hom(k, K))
89
sage: a = f(4); a
90
1
91
sage: a.parent()
92
Finite Field in t of size 3^5
93
"""
94
return self._codomain(x)
95
96
97
cdef class FrobeniusEndomorphism_prime(FrobeniusEndomorphism_finite_field):
98
"""
99
A class implementing Frobenius endomorphism on prime finite
100
fields (i.e. identity map :-).
101
"""
102
def __init__(self, domain, power=1):
103
if not is_FiniteField(domain) or not domain.is_prime_field():
104
raise TypeError("The domain is not a finite prime field")
105
FrobeniusEndomorphism_finite_field.__init__(self, Hom(domain, domain))
106
self._order = 1
107
self._power = 0
108
109
cpdef Element _call_(self, x):
110
"""
111
TESTS::
112
113
sage: k = GF(5)
114
sage: Frob = k.frobenius_endomorphism()
115
sage: Frob(2)
116
2
117
"""
118
return x
119
120
def _composition(self, right):
121
"""
122
Return self o right.
123
124
It is always right, since self is always identity because
125
the domain is a prime field.
126
"""
127
return right
128
129
def __pow__(self, n, modulus):
130
"""
131
Return the `n`-th iterate of this endomorphism
132
(that is the identity since the domain is a prime
133
field).
134
"""
135
return self
136
137
def fixed_field(self):
138
"""
139
Return the fixed field of ``self``.
140
141
OUTPUT:
142
143
- a tuple `(K, e)`, where `K` is the subfield of the domain
144
consisting of elements fixed by ``self`` and `e` is an
145
embedding of `K` into the domain.
146
147
.. NOTE::
148
149
Since here the domain is a prime field, the subfield
150
is the same prime field and the embedding is necessarily
151
the identity map.
152
153
EXAMPLES::
154
155
sage: k.<t> = GF(5)
156
sage: f = k.frobenius_endomorphism(2); f
157
Identity endomorphism of Finite Field of size 5
158
sage: kfixed, embed = f.fixed_field()
159
160
sage: kfixed == k
161
True
162
sage: [ embed(x) == x for x in kfixed ]
163
[True, True, True, True, True]
164
"""
165
return self._domain, self._domain.hom(self._domain)
166
167