Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagesmc
Path: blob/master/src/sage/rings/finite_rings/homset.py
8820 views
1
"""
2
Homset for Finite Fields
3
4
This is the set of all field homomorphisms between two finite fields.
5
6
EXAMPLES::
7
8
sage: R.<t> = ZZ[]
9
sage: E.<a> = GF(25, modulus = t^2 - 2)
10
sage: F.<b> = GF(625)
11
sage: H = Hom(E, F)
12
sage: f = H([4*b^3 + 4*b^2 + 4*b]); f
13
Ring morphism:
14
From: Finite Field in a of size 5^2
15
To: Finite Field in b of size 5^4
16
Defn: a |--> 4*b^3 + 4*b^2 + 4*b
17
sage: f(2)
18
2
19
sage: f(a)
20
4*b^3 + 4*b^2 + 4*b
21
sage: len(H)
22
2
23
sage: [phi(2*a)^2 for phi in Hom(E, F)]
24
[3, 3]
25
26
We can also create endomorphisms::
27
28
sage: End(E)
29
Automorphism group of Finite Field in a of size 5^2
30
sage: End(GF(7))[0]
31
Ring endomorphism of Finite Field of size 7
32
Defn: 1 |--> 1
33
sage: H = Hom(GF(7), GF(49, 'c'))
34
sage: H[0](2)
35
2
36
"""
37
38
from sage.rings.homset import RingHomset_generic
39
from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic
40
from sage.rings.integer import Integer
41
from sage.structure.sequence import Sequence
42
43
class FiniteFieldHomset(RingHomset_generic):
44
"""
45
Set of homomorphisms with domain a given finite field.
46
"""
47
# def __init__(self, R, S, category=None):
48
# if category is None:
49
# from sage.categories.finite_fields import FiniteFields
50
# category = FiniteFields()
51
# RingHomset_generic.__init__(self, R, S, category)
52
53
def __call__(self, im_gens, check=True):
54
"""
55
Construct the homomorphism defined by ``im_gens``.
56
57
EXAMPLES::
58
59
sage: R.<t> = ZZ[]
60
sage: E.<a> = GF(25, modulus = t^2 - 2)
61
sage: F.<b> = GF(625)
62
sage: End(E)
63
Automorphism group of Finite Field in a of size 5^2
64
sage: list(Hom(E, F))
65
[Ring morphism:
66
From: Finite Field in a of size 5^2
67
To: Finite Field in b of size 5^4
68
Defn: a |--> 4*b^3 + 4*b^2 + 4*b,
69
Ring morphism:
70
From: Finite Field in a of size 5^2
71
To: Finite Field in b of size 5^4
72
Defn: a |--> b^3 + b^2 + b]
73
sage: [phi(2*a)^2 for phi in Hom(E, F)]
74
[3, 3]
75
sage: End(GF(7))[0]
76
Ring endomorphism of Finite Field of size 7
77
Defn: 1 |--> 1
78
sage: H = Hom(GF(7), GF(49, 'c'))
79
sage: H[0](2)
80
2
81
sage: Hom(GF(49, 'c'), GF(7)).list()
82
[]
83
sage: Hom(GF(49, 'c'), GF(81, 'd')).list()
84
[]
85
sage: H = Hom(GF(9, 'a'), GF(81, 'b'))
86
sage: H == loads(dumps(H))
87
True
88
"""
89
if isinstance(im_gens, FiniteFieldHomomorphism_generic):
90
return self._coerce_impl(im_gens)
91
try:
92
return FiniteFieldHomomorphism_generic(self, im_gens, check=check)
93
except (NotImplementedError, ValueError), err:
94
try:
95
return self._coerce_impl(im_gens)
96
except TypeError:
97
raise TypeError, "images do not define a valid homomorphism"
98
99
def _coerce_impl(self, x):
100
"""
101
Coercion of other morphisms.
102
103
EXAMPLES::
104
105
sage: k.<a> = GF(25)
106
sage: l.<b> = GF(625)
107
sage: H = Hom(k, l)
108
sage: G = loads(dumps(H))
109
sage: H == G
110
True
111
sage: H is G # this should change eventually
112
False
113
sage: G.coerce(list(H)[0]) # indirect doctest
114
Ring morphism:
115
From: Finite Field in a of size 5^2
116
To: Finite Field in b of size 5^4
117
Defn: a |--> 4*b^3 + 4*b^2 + 4*b + 3
118
"""
119
if not isinstance(x, FiniteFieldHomomorphism_generic):
120
raise TypeError
121
if x.parent() is self:
122
return x
123
if x.parent() == self:
124
return FiniteFieldHomomorphism_generic(self, x.im_gens())
125
raise TypeError
126
127
def _repr_(self):
128
"""
129
Return a string represention of ``self``.
130
131
EXAMPLES::
132
133
sage: Hom(GF(4, 'a'), GF(16, 'b'))._repr_()
134
'Set of field embeddings from Finite Field in a of size 2^2 to Finite Field in b of size 2^4'
135
sage: Hom(GF(4, 'a'), GF(4, 'c'))._repr_()
136
'Set of field embeddings from Finite Field in a of size 2^2 to Finite Field in c of size 2^2'
137
sage: Hom(GF(4, 'a'), GF(4, 'a'))._repr_()
138
'Automorphism group of Finite Field in a of size 2^2'
139
"""
140
D = self.domain()
141
C = self.codomain()
142
if C == D:
143
return "Automorphism group of %s"%D
144
else:
145
return "Set of field embeddings from %s to %s"%(D, C)
146
147
def is_aut(self):
148
"""
149
Check if ``self`` is an automorphism
150
151
EXAMPLES::
152
153
sage: Hom(GF(4, 'a'), GF(16, 'b')).is_aut()
154
False
155
sage: Hom(GF(4, 'a'), GF(4, 'c')).is_aut()
156
False
157
sage: Hom(GF(4, 'a'), GF(4, 'a')).is_aut()
158
True
159
"""
160
return self.domain() == self.codomain()
161
162
def order(self):
163
"""
164
Return the order of this set of field homomorphisms.
165
166
EXAMPLES::
167
168
sage: K.<a> = GF(125)
169
sage: End(K)
170
Automorphism group of Finite Field in a of size 5^3
171
sage: End(K).order()
172
3
173
sage: L.<b> = GF(25)
174
sage: Hom(L, K).order() == Hom(K, L).order() == 0
175
True
176
"""
177
try:
178
return self.__order
179
except AttributeError:
180
pass
181
n = len(self.list())
182
self.__order = n
183
return n
184
185
def list(self):
186
"""
187
Return a list of all the elements in this set of field homomorphisms.
188
189
EXAMPLES::
190
191
sage: K.<a> = GF(25)
192
sage: End(K)
193
Automorphism group of Finite Field in a of size 5^2
194
sage: list(End(K))
195
[Ring endomorphism of Finite Field in a of size 5^2
196
Defn: a |--> 4*a + 1,
197
Ring endomorphism of Finite Field in a of size 5^2
198
Defn: a |--> a]
199
sage: L.<z> = GF(7^6)
200
sage: [g for g in End(L) if (g^3)(z) == z]
201
[Ring endomorphism of Finite Field in z of size 7^6
202
Defn: z |--> 5*z^4 + 5*z^3 + 4*z^2 + 3*z + 1,
203
Ring endomorphism of Finite Field in z of size 7^6
204
Defn: z |--> 3*z^5 + 5*z^4 + 5*z^2 + 2*z + 3,
205
Ring endomorphism of Finite Field in z of size 7^6
206
Defn: z |--> z]
207
208
TESTS:
209
210
Check that :trac:`11390` is fixed::
211
212
sage: K = GF(1<<16,'a'); L = GF(1<<32,'b')
213
sage: K.Hom(L)[0]
214
Ring morphism:
215
From: Finite Field in a of size 2^16
216
To: Finite Field in b of size 2^32
217
Defn: a |--> b^29 + b^27 + b^26 + b^23 + b^21 + b^19 + b^18 + b^16 + b^14 + b^13 + b^11 + b^10 + b^9 + b^8 + b^7 + b^6 + b^5 + b^2 + b
218
"""
219
try:
220
return self.__list
221
except AttributeError:
222
pass
223
D = self.domain()
224
C = self.codomain()
225
if D.characteristic() == C.characteristic() and Integer(D.degree()).divides(Integer(C.degree())):
226
f = D.modulus()
227
g = C['x'](f)
228
r = g.roots()
229
v = [self(D.hom(a, C)) for a, _ in r]
230
v = Sequence(v, immutable=True, cr=True)
231
else:
232
v = Sequence([], immutable=True, cr=False)
233
self.__list = v
234
return v
235
236
def __getitem__(self, n):
237
"""
238
EXAMPLES::
239
240
sage: H = Hom(GF(32, 'a'), GF(1024, 'b'))
241
sage: H[1]
242
Ring morphism:
243
From: Finite Field in a of size 2^5
244
To: Finite Field in b of size 2^10
245
Defn: a |--> b^7 + b^5
246
sage: H[2:4]
247
[
248
Ring morphism:
249
From: Finite Field in a of size 2^5
250
To: Finite Field in b of size 2^10
251
Defn: a |--> b^8 + b^6 + b^2,
252
Ring morphism:
253
From: Finite Field in a of size 2^5
254
To: Finite Field in b of size 2^10
255
Defn: a |--> b^9 + b^7 + b^6 + b^5 + b^4
256
]
257
"""
258
return self.list()[n]
259
260
def index(self, item):
261
"""
262
Return the index of ``self``.
263
264
EXAMPLES::
265
266
sage: K.<z> = GF(1024)
267
sage: g = End(K)[3]
268
sage: End(K).index(g) == 3
269
True
270
"""
271
return self.list().index(item)
272
273
def _an_element_(self):
274
"""
275
Return an element of ``self``.
276
277
TESTS::
278
279
sage: Hom(GF(3^3, 'a'), GF(3^6, 'b')).an_element()
280
Ring morphism:
281
From: Finite Field in a of size 3^3
282
To: Finite Field in b of size 3^6
283
Defn: a |--> 2*b^5 + 2*b^4
284
285
sage: Hom(GF(3^3, 'a'), GF(3^2, 'c')).an_element()
286
Traceback (most recent call last):
287
...
288
EmptySetError: no homomorphisms from Finite Field in a of size 3^3 to Finite Field in c of size 3^2
289
290
.. TODO::
291
292
Use a more sophisticated algorithm; see also :trac:`8751`.
293
294
"""
295
K = self.domain()
296
L = self.codomain()
297
if K.degree() == 1:
298
return L.coerce_map_from(K)
299
elif not K.degree().divides(L.degree()):
300
from sage.categories.sets_cat import EmptySetError
301
raise EmptySetError('no homomorphisms from %s to %s' % (K, L))
302
return K.hom([K.modulus().any_root(L)])
303
304
305
from sage.structure.sage_object import register_unpickle_override
306
register_unpickle_override('sage.rings.finite_field_morphism', 'FiniteFieldHomset', FiniteFieldHomset)
307
308