Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagelib
Path: blob/master/sage/rings/finite_rings/homset.py
4111 views
1
from sage.rings.homset import RingHomset_generic
2
from sage.rings.morphism import RingHomomorphism_im_gens
3
from sage.rings.integer import Integer
4
from sage.structure.sequence import Sequence
5
6
class FiniteFieldHomset(RingHomset_generic):
7
"""
8
Set of homomorphisms with domain a given finite field.
9
"""
10
def __call__(self, im_gens, check=True):
11
"""
12
EXAMPLES::
13
14
sage: R.<t> = ZZ[]
15
sage: E.<a> = GF(25, modulus = t^2 - 2)
16
sage: F.<b> = GF(625)
17
sage: End(E)
18
Automorphism group of Finite Field in a of size 5^2
19
sage: list(Hom(E, F))
20
[Ring morphism:
21
From: Finite Field in a of size 5^2
22
To: Finite Field in b of size 5^4
23
Defn: a |--> 4*b^3 + 4*b^2 + 4*b,
24
Ring morphism:
25
From: Finite Field in a of size 5^2
26
To: Finite Field in b of size 5^4
27
Defn: a |--> b^3 + b^2 + b]
28
sage: [phi(2*a)^2 for phi in Hom(E, F)]
29
[3, 3]
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
sage: Hom(GF(49, 'c'), GF(7)).list()
37
[]
38
sage: Hom(GF(49, 'c'), GF(81, 'd')).list()
39
[]
40
sage: H = Hom(GF(9, 'a'), GF(81, 'b'))
41
sage: H == loads(dumps(H))
42
True
43
"""
44
if isinstance(im_gens, FiniteFieldHomomorphism_im_gens):
45
return self._coerce_impl(im_gens)
46
try:
47
return FiniteFieldHomomorphism_im_gens(self, im_gens, check=check)
48
except (NotImplementedError, ValueError), err:
49
try:
50
return self._coerce_impl(im_gens)
51
except TypeError:
52
raise TypeError, "images do not define a valid homomorphism"
53
54
def _coerce_impl(self, x):
55
"""
56
Coercion of other morphisms.
57
58
EXAMPLES::
59
60
sage: k.<a> = GF(25)
61
sage: l.<b> = GF(625)
62
sage: H = Hom(k, l)
63
sage: G = loads(dumps(H))
64
sage: H == G
65
True
66
sage: H is G # this should change eventually
67
False
68
sage: G.coerce(list(H)[0]) # indirect doctest
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 |--> 4*b^3 + 4*b^2 + 4*b + 3
73
"""
74
if not isinstance(x, FiniteFieldHomomorphism_im_gens):
75
raise TypeError
76
if x.parent() is self:
77
return x
78
if x.parent() == self:
79
return FiniteFieldHomomorphism_im_gens(self, x.im_gens())
80
raise TypeError
81
82
def _repr_(self):
83
"""
84
EXAMPLES::
85
86
sage: Hom(GF(4, 'a'), GF(16, 'b'))._repr_()
87
'Set of field embeddings from Finite Field in a of size 2^2 to Finite Field in b of size 2^4'
88
sage: Hom(GF(4, 'a'), GF(4, 'c'))._repr_()
89
'Set of field embeddings from Finite Field in a of size 2^2 to Finite Field in c of size 2^2'
90
sage: Hom(GF(4, 'a'), GF(4, 'a'))._repr_()
91
'Automorphism group of Finite Field in a of size 2^2'
92
"""
93
D = self.domain()
94
C = self.codomain()
95
if C == D:
96
return "Automorphism group of %s"%D
97
else:
98
return "Set of field embeddings from %s to %s"%(D, C)
99
100
def is_aut(self):
101
"""
102
EXAMPLES::
103
104
sage: Hom(GF(4, 'a'), GF(16, 'b')).is_aut()
105
False
106
sage: Hom(GF(4, 'a'), GF(4, 'c')).is_aut()
107
False
108
sage: Hom(GF(4, 'a'), GF(4, 'a')).is_aut()
109
True
110
"""
111
return self.domain() == self.codomain()
112
113
def order(self):
114
"""
115
Return the order of this set of field homomorphisms.
116
117
EXAMPLES::
118
119
sage: K.<a> = GF(125)
120
sage: End(K)
121
Automorphism group of Finite Field in a of size 5^3
122
sage: End(K).order()
123
3
124
sage: L.<b> = GF(25)
125
sage: Hom(L, K).order() == Hom(K, L).order() == 0
126
True
127
"""
128
try:
129
return self.__order
130
except AttributeError:
131
pass
132
n = len(self.list())
133
self.__order = n
134
return n
135
136
def list(self):
137
"""
138
Return a list of all the elements in this set of field homomorphisms.
139
140
EXAMPLES::
141
142
sage: K.<a> = GF(25)
143
sage: End(K)
144
Automorphism group of Finite Field in a of size 5^2
145
sage: list(End(K))
146
[Ring endomorphism of Finite Field in a of size 5^2
147
Defn: a |--> 4*a + 1,
148
Ring endomorphism of Finite Field in a of size 5^2
149
Defn: a |--> a]
150
sage: L.<z> = GF(7^6)
151
sage: [g for g in End(L) if (g^3)(z) == z]
152
[Ring endomorphism of Finite Field in z of size 7^6
153
Defn: z |--> 5*z^4 + 5*z^3 + 4*z^2 + 3*z + 1,
154
Ring endomorphism of Finite Field in z of size 7^6
155
Defn: z |--> 3*z^5 + 5*z^4 + 5*z^2 + 2*z + 3,
156
Ring endomorphism of Finite Field in z of size 7^6
157
Defn: z |--> z]
158
159
TESTS:
160
161
Check that Trac #11390 is fixed::
162
163
sage: K = GF(1<<16,'a'); L = GF(1<<32,'b')
164
sage: K.Hom(L)[0]
165
Ring morphism:
166
From: Finite Field in a of size 2^16
167
To: Finite Field in b of size 2^32
168
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
169
"""
170
try:
171
return self.__list
172
except AttributeError:
173
pass
174
D = self.domain()
175
C = self.codomain()
176
if D.characteristic() == C.characteristic() and Integer(D.degree()).divides(Integer(C.degree())):
177
f = D.modulus()
178
g = C['x'](f)
179
r = g.roots()
180
v = [self(D.hom(a, C)) for a, _ in r]
181
v = Sequence(v, immutable=True, cr=True)
182
else:
183
v = Sequence([], immutable=True, cr=False)
184
self.__list = v
185
return v
186
187
def __getitem__(self, n):
188
"""
189
EXAMPLES::
190
191
sage: H = Hom(GF(32, 'a'), GF(1024, 'b'))
192
sage: H[1]
193
Ring morphism:
194
From: Finite Field in a of size 2^5
195
To: Finite Field in b of size 2^10
196
Defn: a |--> b^7 + b^5
197
sage: H[2:4]
198
[
199
Ring morphism:
200
From: Finite Field in a of size 2^5
201
To: Finite Field in b of size 2^10
202
Defn: a |--> b^8 + b^6 + b^2,
203
Ring morphism:
204
From: Finite Field in a of size 2^5
205
To: Finite Field in b of size 2^10
206
Defn: a |--> b^9 + b^7 + b^6 + b^5 + b^4
207
]
208
"""
209
return self.list()[n]
210
211
def index(self, item):
212
"""
213
EXAMPLES::
214
215
sage: K.<z> = GF(1024)
216
sage: g = End(K)[3]
217
sage: End(K).index(g) == 3
218
True
219
"""
220
return self.list().index(item)
221
222
class FiniteFieldHomomorphism_im_gens(RingHomomorphism_im_gens):
223
pass
224
225
from sage.structure.sage_object import register_unpickle_override
226
register_unpickle_override('sage.rings.finite_field_morphism', 'FiniteFieldHomset', FiniteFieldHomset)
227
register_unpickle_override('sage.rings.finite_field_morphism', 'FiniteFieldHomomorphism_im_gens', FiniteFieldHomomorphism_im_gens)
228
229
230