Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagelib
Path: blob/master/sage/schemes/elliptic_curves/gal_reps.py
4156 views
1
# -*- coding: utf-8 -*-
2
r"""
3
Galois representations attached to elliptic curves
4
5
Given an elliptic curve `E` over a number field `K`
6
and a rational prime number `p`, the `p^n`-torsion
7
`E[p^n]` points of `E` is a representation of the
8
absolute Galois group `G_K` of `K`. As `n` varies
9
we obtain the Tate module `T_p E` which is a
10
a representation of `G_K` on a free `\ZZ_p`-module
11
of rank `2`. As `p` varies the representations
12
are compatible.
13
14
So far only the case `K =\QQ` is implemented.
15
Currently sage can decide whether the Galois module
16
`E[p]` is reducible, i.e. if `E` admits an isogeny
17
of degree `p`, and whether the image of
18
the representation on `E[p]` is surjective onto
19
`\text{Aut}(E[p]) = GL_2(\mathbb{F}_p)`.
20
21
The following are the most useful functions for the class ``GaloisRepresentation``.
22
23
For the reducibility:
24
25
- ``is_reducible(p)``
26
- ``is_irreducible(p)``
27
- ``reducible_primes()``
28
29
For the image:
30
31
- ``is_surjective(p)``
32
- ``non_surjective()``
33
- ``image_type(p)``
34
35
For the classification of the representation
36
37
- ``is_semistable(p)``
38
- ``is_unramified(p, ell)``
39
- ``is_crystalline(p)``
40
41
EXAMPLES::
42
43
sage: E = EllipticCurve('196a1')
44
sage: rho = E.galois_representation()
45
sage: rho.is_irreducible(7)
46
True
47
sage: rho.is_reducible(3)
48
True
49
sage: rho.is_irreducible(2)
50
True
51
sage: rho.is_surjective(2)
52
False
53
sage: rho.is_surjective(3)
54
False
55
sage: rho.is_surjective(5)
56
True
57
sage: rho.reducible_primes()
58
[3]
59
sage: rho.non_surjective()
60
[2, 3]
61
sage: rho.image_type(2)
62
'The image is cyclic of order 3.'
63
sage: rho.image_type(3)
64
'The image is contained in a Borel subgroup as there is a 3-isogeny.'
65
sage: rho.image_type(5)
66
'The image is all of GL_2(F_5).'
67
68
For semi-stable curve it is known that the representation is
69
surjective if and only if it is irreducible::
70
71
sage: E = EllipticCurve('11a1')
72
sage: rho = E.galois_representation()
73
sage: rho.non_surjective()
74
[5]
75
sage: rho.reducible_primes()
76
[5]
77
78
79
For cm curves it is not true that there are only finitely many primes for which the
80
Galois representation mod p is surjective onto `GL_2(\mathbb{F}_p)`::
81
82
sage: E = EllipticCurve('27a1')
83
sage: rho = E.galois_representation()
84
sage: rho.non_surjective()
85
[0]
86
sage: rho.reducible_primes()
87
[3]
88
sage: E.has_cm()
89
True
90
sage: rho.image_type(11)
91
'The image is contained in the normalizer of a non-split Cartan group. (cm)'
92
93
REFERENCES:
94
95
.. [Se1] Jean-Pierre Serre,
96
Propriétés galoisiennes des points d'ordre fini
97
des courbes elliptiques.
98
Invent. Math. 15 (1972), no. 4, 259--331.
99
.. [Se2] Jean-Pierre Serre,
100
Sur les représentations modulaires de degré
101
2 de `\text{Gal}(\bar\QQ/\QQ)`.
102
Duke Math. J. 54 (1987), no. 1, 179--230.
103
.. [Co] Alina Carmen Cojocaru,
104
On the surjectivity of the Galois representations
105
associated to non-CM elliptic curves.
106
With an appendix by Ernst Kani.
107
Canad. Math. Bull. 48 (2005), no. 1, 16--31.
108
109
110
AUTHORS:
111
112
- chris wuthrich (02/10) - moved from ell_rational_field.py.
113
114
"""
115
116
######################################################################
117
# Copyright (C) 2010 William Stein <[email protected]>
118
#
119
# Distributed under the terms of the GNU General Public License (GPL)
120
#
121
# This code is distributed in the hope that it will be useful,
122
# but WITHOUT ANY WARRANTY; without even the implied warranty of
123
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
124
# General Public License for more details.
125
#
126
# The full text of the GPL is available at:
127
#
128
# http://www.gnu.org/licenses/
129
######################################################################
130
131
from sage.structure.sage_object import SageObject
132
import sage.rings.arith as arith
133
import sage.misc.misc as misc
134
import sage.rings.all as rings
135
from sage.rings.all import RealField, GF
136
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
137
138
from math import sqrt
139
from sage.libs.pari.all import pari
140
141
def _ex_set(p):
142
"""
143
Gives the set of the only values of trace^2/det
144
that appear in a exceptional subgroup in PGL_2(F_p)
145
146
EXAMPLES::
147
148
sage: from sage.schemes.elliptic_curves.gal_reps import _ex_set
149
sage: for p in prime_range(3,30): print p, _ex_set(p)
150
3 [0, 1, 2, 1]
151
5 [0, 1, 2, 4]
152
7 [0, 1, 2, 4]
153
11 [0, 1, 2, 4, 9, 5]
154
13 [0, 1, 2, 4]
155
17 [0, 1, 2, 4]
156
19 [0, 1, 2, 4, 16, 6]
157
23 [0, 1, 2, 4]
158
29 [0, 1, 2, 4, 25, 7]
159
"""
160
k = GF(p)
161
res = [ k(0), k(1), k(2), k(4) ]
162
R = k['X']
163
f = R([1,-3,1]) #(X**2 - 3*X+1)
164
ro = f.roots()
165
for a in ro:
166
if a[0] not in res:
167
res.append(a[0])
168
return res
169
170
# these two function could be moved to a better place later
171
172
def _splitting_field(f):
173
"""
174
Given a polynomial over `\QQ`, this returns the splitting field (as an absolute field over `\QQ`.
175
176
EXAMPLES::
177
178
sage: from sage.schemes.elliptic_curves.gal_reps import _splitting_field
179
sage: R.<X> = QQ[]
180
sage: f = X^2 + 1
181
sage: _splitting_field(f)
182
Number Field in b with defining polynomial X^2 + 1
183
sage: f = (X^6-1)*(X^4+1)
184
sage: _splitting_field(f)
185
Number Field in b with defining polynomial x^8 + 4*x^7 + 10*x^6 + 16*x^5 + 21*x^4 + 20*x^3 + 4*x^2 - 4*x + 1
186
sage: f = X^3 - 4*X^2 - 160*X - 1264
187
sage: _splitting_field(f)
188
Number Field in b with defining polynomial x^6 - 992*x^4 + 246016*x^2 + 41229056
189
190
sage: f3 = 4*X^3 - 4*X^2 - 40*X - 79
191
sage: _splitting_field(f3)
192
Number Field in b with defining polynomial x^6 - 992*x^4 + 246016*x^2 + 41229056
193
194
sage: f3 = 4*X^3 - 4*X^2 - 40*X - 79
195
sage: _splitting_field(f3/4)
196
Number Field in b with defining polynomial x^6 - 992*x^4 + 246016*x^2 + 41229056
197
198
"""
199
from sage.rings.all import QQ
200
from sage.misc.flatten import flatten
201
# make an integral monic polynomial out of it
202
d = f.denominator()
203
f = d*f
204
R = PolynomialRing(QQ,'X')
205
f = R(f)
206
X = R.gens()[0]
207
an = f.leading_coefficient()
208
f = an**(f.degree() - 1) * f(X/an)
209
if an != 1:
210
misc.verbose("polynomial changed to %s"%f,3)
211
212
fs = [ff[0] for ff in f.factor() if ff[0].degree() > 1 ]
213
while fs != []:
214
K = fs[0].root_field('a')
215
R = PolynomialRing(K,'X')
216
fs = [R(f) for f in fs]
217
K = K.absolute_field('b')
218
inc = K.structure()[1]
219
misc.verbose("degree of the field is now %s"%K.degree(), 2)
220
R = PolynomialRing(K,'X')
221
fs = [R([inc(u) for u in g.coeffs()]) for g in fs]
222
fs = [[ff[0] for ff in g.factor() if ff[0].degree() > 1] for g in fs]
223
fs = flatten(fs)
224
return K
225
226
def _division_field(E,p):
227
"""
228
Given an elliptic curve and a prime `p`, this constructs the field `\QQ(E[p])`.
229
230
Note this takes a LONG time when p is large or when the representation is surjective.
231
232
EXAMPLES::
233
234
sage: from sage.schemes.elliptic_curves.gal_reps import _division_field
235
sage: E = EllipticCurve('14a1')
236
sage: _division_field(E,2)
237
Number Field in b with defining polynomial X^2 + 5*X + 92
238
sage: _division_field(E,3)
239
Number Field in b with defining polynomial X^2 + 6*X + 117
240
241
sage: E = EllipticCurve('11a1')
242
sage: K = _division_field(E,5); K
243
Number Field in b with defining polynomial x^4 + 5*x^3 + 275*x^2 + 5125*x + 63125
244
sage: E.base_extend(K).torsion_subgroup()
245
Torsion Subgroup isomorphic to Z/5 + Z/5 associated to the Elliptic Curve defined by y^2 + y = x^3 + (-1)*x^2 + (-10)*x + (-20) over Number Field in b with defining polynomial x^4 + 5*x^3 + 275*x^2 + 5125*x + 63125
246
247
sage: E = EllipticCurve('27a1')
248
sage: _division_field(E,3)
249
Number Field in b with defining polynomial X^2 + 9*X + 81
250
sage: _division_field(E,2)
251
Number Field in b with defining polynomial x^6 + 5038848
252
sage: E = EllipticCurve('27a1')
253
sage: L = _division_field(E,5); L # long time (4s on sage.math, 2011)
254
Number Field in b with defining polynomial x^48 + 24*x^47 - 2634*x^46 - 64906*x^45 + 2726775*x^44 + 70841232*x^43 + 224413842693*x^42 + 4701700599732*x^41 - 3592508072137596/5*x^40 - 15012293781179144*x^39 + 968283011174870355*x^38 + 20267256109653557724*x^37 + 12067484020318191883430*x^36 + 1074616923704149785005406/5*x^35 - 36733858365780941833244052*x^34 - 645743028366047451133249842*x^33 + 220969510763490262549458235143/5*x^32 + 3821508904338000023273602548048/5*x^31 - 116959091827892505647463476639056/5*x^30 - 410999736248972608356551138775366*x^29 - 14893829970063945547808915701339152/5*x^28 - 65364599206437988881942239704947194/5*x^27 + 67673426654602996794997806980859832818/5*x^26 + 881882930983056033772717698410508954006/5*x^25 - 222881687343119655077359346112642829420824/25*x^24 - 2895120823335191010101881263518064564214338/25*x^23 + 45001727573606034388747893503112487075055856/25*x^22 + 123791333776720160716501836669886842723129232/5*x^21 + 33784656476525285313173627304265791556761499182/25*x^20 + 315309937263412002519549766396743184287341740362/25*x^19 - 29809326189907478934703273836943134749630766073937/25*x^18 - 277139669604549129326940625213109992460300794466472/25*x^17 + 48267417458901196371693187503590931071511693353624403/125*x^16 + 417747951937480880271176634423393038757023573062901214/125*x^15 + 2007263826796309855277267487981686566625095650300775449/125*x^14 + 6629329384200142639862088631838847849519261327732912678/125*x^13 - 7890086815228540044028318696011082482007739165946890467526/125*x^12 - 47407282438244289856698339380010252170030182743016263979758/125*x^11 + 3298070588288796211686670268348031992948626610010905491413867/125*x^10 + 16925026780847521477088033404397720576309067225732939278573654/125*x^9 - 12606276975554600131707859641843171596158942063398834295739121081/3125*x^8 - 52976903401697668325123474606327892765221094244312074003749191524/3125*x^7 - 1938266538684772533113390852600216820719603074035866039130578333001/3125*x^6 - 5627590284654484129751875434157935192705922694236805197727447225544/3125*x^5 + 285380988605606088041604497638523394233117370690633546039125252974974/625*x^4 + 2863126544037648956156470697472798773649141080128520101958284622979502/3125*x^3 - 292971118345690446877843351574720458113286307337430973163488739432371577/3125*x^2 - 294403610592013769220290971977947932182340270515731034223504446414069348/3125*x + 128890191901531504726282929609520479109501654595823184011440588325811602871/15625
255
sage: L.absolute_degree() # long time
256
48
257
258
Even _division_field(E,7) works within a few minutes
259
"""
260
misc.verbose("trying to build the extension by adjoining the %s-torsion poitns"%p,2)
261
f = E.division_polynomial(p)
262
K = _splitting_field(f)
263
EK = E.base_extend(K)
264
if len(EK._p_primary_torsion_basis(p,1)) < 2:
265
misc.verbose("the y-coordinate need to be adjoined, too",2)
266
R = PolynomialRing(K,'Y')
267
Y = R.gens()[0]
268
for xxm in R(f).roots():
269
xx = xxm[0]
270
g = Y**2 + (EK.a1() * xx + EK.a3() ) * Y - xx**3 - EK.a2()*xx**2 - EK.a4()*xx - EK.a6()
271
if g.roots() == []:
272
K = g.root_field('a').absolute_field('b')
273
break
274
return K
275
276
277
class GaloisRepresentation(SageObject):
278
r"""
279
The compatible family of Galois representation
280
attached to an elliptic curve over a number field.
281
282
Given an elliptic curve `E` over a number field `K`
283
and a rational prime number `p`, the `p^n`-torsion
284
`E[p^n]` points of `E` is a representation of the
285
absolute Galois group `G_K` of `K`. As `n` varies
286
we obtain the Tate module `T_p E` which is a
287
a representation of `G_K` on a free `\ZZ_p`-module
288
of rank `2`. As `p` varies the representations
289
are compatible.
290
291
EXAMPLES::
292
293
sage: rho = EllipticCurve('11a1').galois_representation()
294
sage: rho
295
Compatible family of Galois representations associated to the Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational Field
296
297
"""
298
299
def __init__(self, E):
300
r"""
301
302
see ``GaloisRepresentation`` for documentation
303
304
EXAMPLES::
305
306
sage: rho = EllipticCurve('11a1').galois_representation()
307
sage: loads(rho.dumps()) == rho
308
True
309
310
"""
311
self.__image_type = {}
312
self.E = E
313
314
def __repr__(self):
315
r"""
316
string representation of the class
317
318
EXAMPLES::
319
320
sage: rho = EllipticCurve([0,1]).galois_representation()
321
sage: rho
322
Compatible family of Galois representations associated to the Elliptic Curve defined by y^2 = x^3 + 1 over Rational Field
323
324
"""
325
return "Compatible family of Galois representations associated to the " + repr(self.E)
326
327
def __eq__(self,other):
328
r"""
329
Compares two Galois representations.
330
We define tho compatible families of representations
331
attached to elliptic curves to be isomorphic if the curves are equal
332
333
EXAMPLES::
334
335
sage: rho = EllipticCurve('11a1').galois_representation()
336
sage: rho2 = EllipticCurve('11a2').galois_representation()
337
sage: rho == rho
338
True
339
sage: rho == rho2
340
False
341
sage: rho == 34
342
False
343
344
"""
345
# if rho_E = rho_E' then the L-functions agree,
346
# so E and E' are isogenous
347
# except for p=2
348
# the mod p representations will be different
349
# for p dividing the degree of the isogeny
350
# anyway, there should not be a _compatible_
351
# isomorphism between rho and rho' unless E
352
# is isomorphic to E'
353
# Note that rho can not depend on the Weierstrass model
354
if not type(self) == type(other):
355
return False
356
return self.E.is_isomorphic(other.E)
357
358
359
def elliptic_curve(self):
360
r"""
361
The elliptic curve associated to this representation.
362
363
EXAMPLES::
364
365
sage: E = EllipticCurve('11a1')
366
sage: rho = E.galois_representation()
367
sage: rho.elliptic_curve() == E
368
True
369
370
"""
371
return self.E
372
373
#####################################################################
374
# reducibility
375
#####################################################################
376
377
def is_reducible(self, p):
378
r"""
379
Return True if the mod-p representation is
380
reducible. This is equivalent to the existence of an
381
isogeny of degree `p` from the elliptic curve.
382
383
INPUT:
384
385
- ``p`` - a prime number
386
387
OUTPUT:
388
389
- a boolean
390
391
.. note::
392
393
The answer is cached.
394
395
EXAMPLES::
396
397
sage: rho = EllipticCurve('121a').galois_representation()
398
sage: rho.is_reducible(7)
399
False
400
sage: rho.is_reducible(11)
401
True
402
sage: EllipticCurve('11a').galois_representation().is_reducible(5)
403
True
404
sage: rho = EllipticCurve('11a2').galois_representation()
405
sage: rho.is_reducible(5)
406
True
407
sage: EllipticCurve('11a2').torsion_order()
408
1
409
410
"""
411
try:
412
return self.__is_reducible[p]
413
except AttributeError:
414
self.__is_reducible = {}
415
except KeyError:
416
pass
417
418
if not arith.is_prime(p):
419
raise ValueError, 'p (=%s) must be prime'%p
420
# we do is_surjective first, since this is
421
# much easier than computing isogeny_class
422
t = self.is_surjective(p)
423
if t == True:
424
self.__is_reducible[p] = False
425
return False # definitely not reducible
426
isogeny_matrix = self.E.isogeny_class()[ 1 ]
427
v = isogeny_matrix.row(0) # first row
428
for a in v:
429
if a != 0 and a % p == 0:
430
self.__is_reducible[p] = True
431
return True
432
self.__is_reducible[p] = False
433
return False
434
435
def is_irreducible(self, p):
436
r"""
437
Return True if the mod p representation is irreducible.
438
439
INPUT:
440
441
- ``p`` - a prime number
442
443
OUTPUT:
444
445
- a boolean
446
447
EXAMPLES::
448
449
sage: rho = EllipticCurve('37b').galois_representation()
450
sage: rho.is_irreducible(2)
451
True
452
sage: rho.is_irreducible(3)
453
False
454
sage: rho.is_reducible(2)
455
False
456
sage: rho.is_reducible(3)
457
True
458
"""
459
return not self.is_reducible(p)
460
461
def reducible_primes(self):
462
r"""
463
Returns a list of the primes `p` such that the mod
464
`p` representation is reducible. For
465
all other primes the representation is irreducible.
466
467
EXAMPLES::
468
469
sage: rho = EllipticCurve('225a').galois_representation()
470
sage: rho.reducible_primes()
471
[3]
472
"""
473
try:
474
return self.__reducible_primes
475
except AttributeError:
476
pass
477
C, I = self.E.isogeny_class(algorithm='sage')
478
X = set(I.list())
479
R = [p for p in X if arith.is_prime(p)]
480
self.__reducible_primes = R
481
return R
482
483
#####################################################################
484
# image
485
#####################################################################
486
487
def is_surjective(self, p, A=1000):
488
r"""
489
Return True if the mod-p representation is
490
surjective onto `Aut(E[p]) = GL_2(\mathbb{F}_p)`.
491
492
False if it is not, or None if we were unable to
493
determine whether it is or not.
494
495
INPUT:
496
497
- ``p`` - int (a prime number)
498
499
- ``A`` - int (a bound on the number of a_p to use)
500
501
OUTPUT:
502
503
- boolean. True if the mod-p representation is surjective
504
and False if (probably) not
505
506
.. note::
507
508
The answer is cached.
509
510
EXAMPLES::
511
512
sage: rho = EllipticCurve('37b').galois_representation()
513
sage: rho.is_surjective(2)
514
True
515
sage: rho.is_surjective(3)
516
False
517
518
::
519
520
sage: rho = EllipticCurve('121a1').galois_representation()
521
sage: rho.non_surjective()
522
[11]
523
sage: rho.is_surjective(5)
524
True
525
sage: rho.is_surjective(11)
526
False
527
sage: rho = EllipticCurve('121d1').galois_representation()
528
sage: rho.is_surjective(5)
529
False
530
sage: rho.is_surjective(11)
531
True
532
533
REMARKS:
534
535
1. If `p \geq 5` then the mod-p representation is
536
surjective if and only if the p-adic representation is
537
surjective. When `p = 2, 3` there are
538
counterexamples. See a paper of Elkies for more
539
details when `p=3`.
540
541
2. When `p = 2, 3` this function always gives the correct result
542
and it does not depend on ``A``, since it explicitly determines the
543
`p`-division polynomial.
544
545
"""
546
if not arith.is_prime(p):
547
raise TypeError, "p (=%s) must be prime."%p
548
A = int(A)
549
key = (p, A)
550
try:
551
return self.__is_surjective[key]
552
except KeyError:
553
pass
554
except AttributeError:
555
self.__is_surjective = {}
556
557
ans = self._is_surjective(p, A)
558
self.__is_surjective[key] = ans
559
return ans
560
561
562
def _is_surjective(self, p, A):
563
r"""
564
helper function for ``is_surjective``
565
566
EXAMPLES::
567
568
sage: rho = EllipticCurve('37b').galois_representation()
569
sage: rho._is_surjective(7,100)
570
True
571
572
TEST for trac #8451::
573
574
sage: E = EllipticCurve('648a1')
575
sage: rho = E.galois_representation()
576
sage: rho._is_surjective(5,1000)
577
False
578
579
"""
580
T = self.E.torsion_subgroup().order()
581
if T % p == 0 and p != 2 :
582
# we could probably determine the group structure directly
583
self.__image_type[p] = "The image is meta-cyclic inside a Borel subgroup as there is a %s-torsion point on the curve."%p
584
return False
585
586
if p == 2:
587
# E is isomorphic to [0,b2,0,8*b4,16*b6]
588
b2,b4,b6,b8=self.E.b_invariants()
589
R = rings.PolynomialRing(self.E.base_ring(), 'x')
590
x = R.gen()
591
f = x**3 + b2*x**2 + 8*b4*x + 16*b6
592
if not f.is_irreducible():
593
if len(f.roots()) > 2:
594
self.__image_type[p] = "The image is trivial as all 2-torsion points are rational."
595
else:
596
self.__image_type[p] = "The image is cyclic of order 2 as there is exactly one rational 2-torsion point."
597
return False #, '2-torsion'
598
if arith.is_square(f.discriminant()):
599
self.__image_type[p] = "The image is cyclic of order 3."
600
return False #, "A3"
601
self.__image_type[p] = "The image is all of GL_2(F_2), i.e. a symmetric group of order 6."
602
return True #, None
603
604
if p == 3:
605
# Algorithm: Let f be the 3-division polynomial, which is
606
# a polynomial of degree 4. Then I claim that this
607
# polynomial has Galois group S_4 if and only if the
608
# representation rhobar_{E,3} is surjective. If the group
609
# is S_4, then S_4 is a quotient of the image of
610
# rhobar_{E,3}. Since S_4 has order 24 and GL_2(F_3)
611
# has order 48, the only possibility we have to consider
612
# is that the image of rhobar is isomorphic to S_4.
613
# But this is not the case because S_4 is not a subgroup
614
# of GL_2(F_3). If it were, it would be normal, since
615
# it would have index 2. But there is a *unique* normal
616
# subgroup of GL_2(F_3) of index 2, namely SL_2(F_3),
617
# and SL_2(F_3) is not isomorphic to S_4 (S_4 has a normal
618
# subgroup of index 2 and SL_2(F_3) does not.)
619
# (What's a simple way to see that SL_2(F_3) is the
620
# unique index-2 normal subgroup? I didn't see an obvious
621
# reason, so just used the NormalSubgroups command in MAGMA
622
# and it output exactly one of index 2.)
623
624
#sage: G = SymmetricGroup(4)
625
#sage: [H.group_id() for H in G.conjugacy_classes_subgroups()]
626
#[[1, 1], [2, 1], [2, 1], [3, 1], [4, 2], [4, 2], [4, 1], [6, 1], [8, 3], [12, 3], [24, 12]]
627
#sage: G = GL(2,GF(3)).as_matrix_group().as_permutation_group()
628
#sage: [H.group_id() for H in G.conjugacy_classes_subgroups()]
629
#[[1, 1], [2, 1], [2, 1], [3, 1], [4, 2], [4, 1], [6, 2], [6, 1], [6, 1], [8, 4], [8, 1], [8, 3], [12, 4], [16, 8], [24, 3], [48, 29]]
630
631
# Here's Noam Elkies proof for the other direction:
632
633
#> Let E be an elliptic curve over Q. Is the mod-3
634
#> representation E[3] surjective if and only if the
635
#> (degree 4) division polynomial has Galois group S_4? I
636
#> can see why the group being S_4 implies the
637
#> representation is surjective, but the converse is not
638
#> clear to me.
639
# I would have thought that this is the easier part: to
640
# say that E[3] is surjective is to say the 3-torsion
641
# field Q(E[3]) has Galois group GL_2(Z/3) over Q. Let
642
# E[3]+ be the subfield fixed by the element -1 of
643
# GL_2(Z/3). Then E[3] has Galois group PGL_2(Z/3), which
644
# is identified with S_4 by its action on the four
645
# 3-element subgroups of E[3]. Each such subgroup is in
646
# turn determined by the x-coordinate shared by its two
647
# nonzero points. So, if E[3] is surjective then any
648
# permutation of those x-coordinates is realized by some
649
# element of Gal(E[3]+/Q). Thus the Galois group of the
650
# division polynomial (whose roots are those
651
# x-coordinates) maps surjectively to S_4, which means it
652
# equals S_4.
653
654
f = self.E.division_polynomial(3)
655
if not f.is_irreducible():
656
return False #, "reducible_3-divpoly"
657
n = pari(f).polgalois()[0]
658
if n == 24:
659
self.__image_type[p] = "The image is all of GL_2(F_3)."
660
return True #, None
661
else:
662
return False #, "3-divpoly_galgroup_order_%s"%n
663
664
if self.E.has_cm():
665
return False #, "CM"
666
667
Np = self.E.conductor() * p
668
signs = []
669
# there was a bug in the original implementation,
670
# this follows not Proposition 19 in Serre.
671
# counter-examples were 324b1 and 324d1, 648a1 and 648c1 for p=5
672
exclude_exceptional_image = False
673
ex_setp = _ex_set(p)
674
ell = 4
675
k = GF(p)
676
677
while ell < A:
678
ell = arith.next_prime(ell)
679
if Np % ell != 0:
680
a_ell = self.E.ap(ell)
681
if a_ell % p != 0:
682
if not exclude_exceptional_image:
683
u = k(a_ell)**2 * k(ell)**(-1)
684
if u not in ex_setp:
685
exclude_exceptional_image = True
686
s = arith.kronecker(a_ell**2 - 4*ell, p)
687
if s != 0 and s not in signs:
688
signs.append(s)
689
if len(signs) == 2 and exclude_exceptional_image:
690
self.__image_type[p] = "The image is all of GL_2(F_%s)."%p
691
return True #,None
692
693
return False #, signs
694
695
def non_surjective(self, A=1000):
696
r"""
697
Returns a list of primes p such that the mod-p representation
698
*might* not be surjective (this list
699
usually contains 2, because of shortcomings of the algorithm). If `p`
700
is not in the returned list, then the mod-p representation
701
is provably surjective.
702
703
By a theorem of Serre, there are only finitely
704
many primes in this list, except when the curve has
705
complex multiplication.
706
707
If the curve has CM, we simply return the
708
sequence [0] and do no further computation.
709
710
INPUT:
711
712
- ``A`` - an integer
713
714
OUTPUT:
715
716
- ``list`` - if curve has CM, returns [0].
717
Otherwise, returns a list of primes where mod-p representation is
718
very likely not surjective. At any prime not in this list, the
719
representation is definitely surjective.
720
721
EXAMPLES::
722
723
sage: E = EllipticCurve([0, 0, 1, -38, 90]) # 361A
724
sage: E.galois_representation().non_surjective() # CM curve
725
[0]
726
727
::
728
729
sage: E = EllipticCurve([0, -1, 1, 0, 0]) # X_1(11)
730
sage: E.galois_representation().non_surjective()
731
[5]
732
733
sage: E = EllipticCurve([0, 0, 1, -1, 0]) # 37A
734
sage: E.galois_representation().non_surjective()
735
[]
736
737
sage: E = EllipticCurve([0,-1,1,-2,-1]) # 141C
738
sage: E.galois_representation().non_surjective()
739
[13]
740
741
::
742
743
sage: E = EllipticCurve([1,-1,1,-9965,385220]) # 9999a1
744
sage: rho = E.galois_representation()
745
sage: rho.non_surjective()
746
[2]
747
748
sage: E = EllipticCurve('324b1')
749
sage: rho = E.galois_representation()
750
sage: rho.non_surjective()
751
[3, 5]
752
753
ALGORITHM:
754
We first find an upper bound `B` on the possible primes. If `E`
755
is semi-stable, we can take `B=11` by a result of Mazur. There is
756
a bound by Serre in the case that the `j`-invariant is not integral
757
in terms of the minimal prime of good reduction. Finally
758
there is an unconditional bound by Cojocaru, but which depends
759
on the conductor of `E`.
760
For the prime below that bound we call ``is_surjective``.
761
762
"""
763
if self.E.has_cm():
764
misc.verbose("cm curve")
765
return [0]
766
N = self.E.conductor()
767
if self.E.is_semistable():
768
# Mazur's bound
769
C = 11
770
misc.verbose("semistable -- so bound is 11")
771
elif not self.E.j_invariant().is_integral():
772
# prop 24 in Serre
773
vs = self.E.j_invariant().denominator().prime_factors()
774
C1 = arith.gcd([-arith.valuation(self.E.j_invariant(),v) for v in vs])
775
p0 = 2
776
while self.E.has_bad_reduction(p0):
777
p0 = arith.next_prime(p0+1)
778
C2 = (sqrt(p0)+1)**8
779
C = max(C1,C2)
780
misc.verbose("j is not integral -- Serre's bound is %s"%C)
781
C3 = 1 + 4*sqrt(6)*int(N)/3 * sqrt(misc.mul([1+1.0/int(p) for p,_ in arith.factor(N)]))
782
C = min(C,C3)
783
misc.verbose("conductor = %s, and bound is %s"%(N,C))
784
else:
785
# Cojocaru's bound (depends on the conductor)
786
C = 1 + 4*sqrt(6)*int(N)/3 * sqrt(misc.mul([1+1.0/int(p) for p,_ in arith.factor(N)]))
787
misc.verbose("conductor = %s, and bound is %s"%(N,C))
788
B = []
789
p = 2
790
while p <= C:
791
t = self.is_surjective(p, A=A)
792
misc.verbose("(%s,%s)"%(p,t))
793
if not t:
794
B.append(p)
795
p = arith.next_prime(p)
796
return B
797
798
def image_type(self, p):
799
r"""
800
Returns a string describing the image of the
801
mod-p representation.
802
The result is provably correct, but only indicates what sort of an image we have. If one wishes to determine the exact group one needs to work a bit harder. The probabilistic method of image_classes or Sutherland's galrep package can give a very good guess what the image should be.
803
804
INPUT:
805
806
- ``p`` a prime number
807
808
OUTPUT:
809
810
- a string.
811
812
EXAMPLES ::
813
814
sage: E = EllipticCurve('14a1')
815
sage: rho = E.galois_representation()
816
sage: rho.image_type(5)
817
'The image is all of GL_2(F_5).'
818
819
sage: E = EllipticCurve('11a1')
820
sage: rho = E.galois_representation()
821
sage: rho.image_type(5)
822
'The image is meta-cyclic inside a Borel subgroup as there is a 5-torsion point on the curve.'
823
824
sage: EllipticCurve('27a1').galois_representation().image_type(5)
825
'The image is contained in the normalizer of a non-split Cartan group. (cm)'
826
sage: EllipticCurve('30a1').galois_representation().image_type(5)
827
'The image is all of GL_2(F_5).'
828
sage: EllipticCurve("324b1").galois_representation().image_type(5)
829
'The image in PGL_2(F_5) is the exceptional group S_4.'
830
831
sage: E = EllipticCurve([0,0,0,-56,4848])
832
sage: rho = E.galois_representation()
833
sage: rho.image_type(5)
834
'The image is contained in the normalizer of a split Cartan group.'
835
836
sage: EllipticCurve('49a1').galois_representation().image_type(7)
837
'The image is contained in a Borel subgroup as there is a 7-isogeny.'
838
839
sage: EllipticCurve('121c1').galois_representation().image_type(11)
840
'The image is contained in a Borel subgroup as there is a 11-isogeny.'
841
sage: EllipticCurve('121d1').galois_representation().image_type(11)
842
'The image is all of GL_2(F_11).'
843
sage: EllipticCurve('441f1').galois_representation().image_type(13)
844
'The image is contained in a Borel subgroup as there is a 13-isogeny.'
845
846
sage: EllipticCurve([1,-1,1,-5,2]).galois_representation().image_type(5)
847
'The image is contained in the normalizer of a non-split Cartan group.'
848
sage: EllipticCurve([0,0,1,-25650,1570826]).galois_representation().image_type(5)
849
'The image is contained in the normalizer of a split Cartan group.'
850
sage: EllipticCurve([1,-1,1,-2680,-50053]).galois_representation().image_type(7) # the dots (...) in the output fix #11937 (installed 'Kash' may give additional output); long time (26s on sage.math, 2012)
851
'The image is a... group of order 18.'
852
sage: EllipticCurve([1,-1,0,-107,-379]).galois_representation().image_type(7) # the dots (...) in the output fix #11937 (installed 'Kash' may give additional output); long time (5s on sage.math, 2012)
853
'The image is a... group of order 36.'
854
sage: EllipticCurve([0,0,1,2580,549326]).galois_representation().image_type(7)
855
'The image is contained in the normalizer of a split Cartan group.'
856
857
For `p=2`::
858
859
sage: E = EllipticCurve('11a1')
860
sage: rho = E.galois_representation()
861
sage: rho.image_type(2)
862
'The image is all of GL_2(F_2), i.e. a symmetric group of order 6.'
863
864
sage: rho = EllipticCurve('14a1').galois_representation()
865
sage: rho.image_type(2)
866
'The image is cyclic of order 2 as there is exactly one rational 2-torsion point.'
867
868
sage: rho = EllipticCurve('15a1').galois_representation()
869
sage: rho.image_type(2)
870
'The image is trivial as all 2-torsion points are rational.'
871
872
sage: rho = EllipticCurve('196a1').galois_representation()
873
sage: rho.image_type(2)
874
'The image is cyclic of order 3.'
875
876
`p=3`::
877
878
sage: rho = EllipticCurve('33a1').galois_representation()
879
sage: rho.image_type(3)
880
'The image is all of GL_2(F_3).'
881
882
sage: rho = EllipticCurve('30a1').galois_representation()
883
sage: rho.image_type(3)
884
'The image is meta-cyclic inside a Borel subgroup as there is a 3-torsion point on the curve.'
885
886
sage: rho = EllipticCurve('50b1').galois_representation()
887
sage: rho.image_type(3)
888
'The image is contained in a Borel subgroup as there is a 3-isogeny.'
889
890
sage: rho = EllipticCurve('3840h1').galois_representation()
891
sage: rho.image_type(3)
892
'The image is contained in a dihedral group of order 8.'
893
894
sage: rho = EllipticCurve('32a1').galois_representation()
895
sage: rho.image_type(3)
896
'The image is a semi-dihedral group of order 16, gap.SmallGroup([16,8]).'
897
898
899
ALGORITHM: Mainly based on Serre's paper.
900
"""
901
if not arith.is_prime(p):
902
raise TypeError, "p (=%s) must be prime."%p
903
try:
904
return self.__image_type[p]
905
except KeyError:
906
pass
907
except AttributeError:
908
self.__image_type = {}
909
910
911
# we eliminate step by step possibilities.
912
# checks if the image is all of GL_2, while doing so, it may detect certain other classes already
913
# see _is_surjective. It will have set __image_type
914
915
ans = self._is_surjective(p, A=1000)
916
try:
917
return self.__image_type[p]
918
except KeyError:
919
pass
920
921
# check if the rep is reducible
922
923
if self.is_reducible(p):
924
self.__image_type[p] = "The image is contained in a Borel subgroup as there is a %s-isogeny."%p
925
return self.__image_type[p]
926
927
# if we are then the image of rho is not surjective and not contained in a Borel subgroup
928
# there are three cases left:
929
# it could be in a normalizer of a split Cartan,
930
# normalizer of a non-split Cartan,
931
# or the image in PGL_2 is one of the three exceptional groups A_4 S_4 A_5
932
933
non_split_str = "The image is contained in the normalizer of a non-split Cartan group."
934
split_str = "The image is contained in the normalizer of a split Cartan group."
935
s4_str = "The image in PGL_2(F_%s) is the exceptional group S_4."%p
936
a4_str = "The image in PGL_2(F_%s) is the exceptional group A_4."%p
937
a5_str = "The image in PGL_2(F_%s) is the exceptional group A_5."%p
938
939
# we first treat p=3 and 5 seperately. p=2 has already been done.
940
941
if p == 3:
942
# this implies that the image of rhobar in PGL_2 = S_4
943
# determines completely the image of rho
944
f = self.E.division_polynomial(3)
945
if not f.is_irreducible():
946
# must be a product of two polynomials of degree 2
947
self.__image_type[p] = "The image is contained in a dihedral group of order 8."
948
return self.__image_type[p]
949
n = pari(f).polgalois()[0]
950
# the following is due to a simple classification of all subgroups of GL_2(F_3)
951
if n == 2:
952
self.__image_type[p] = "The image is a cyclic group of order 4."
953
elif n == 4:
954
for ell in prime_range(5,1000):
955
if ell % 3 == 2 and self.E.ap(ell) % 3 != 0:
956
# there is an element of order 8 in the image
957
self.__image_type[p] = "The image is a cyclic group of order 8."
958
return self.__image_type[p]
959
self.__image_type[p] = "The image is a group of order 8, most likely a quaternion group."
960
elif n == 6:
961
self.__image_type[p] = "The image is a dihedral group of order 12."
962
elif n == 8:
963
self.__image_type[p] = "The image is a semi-dihedral group of order 16, gap.SmallGroup([16,8])."
964
elif n == 12:
965
self.__image_type[p] = "The image is SL_2(F_3)."
966
else:
967
raise RuntimeError, "Bug in image_type for p = 3."
968
return self.__image_type[p]
969
970
# we also eliminate cm curves
971
972
if self.E.has_cm():
973
if self.E.is_good(p) and self.E.is_ordinary(p):
974
self.__image_type[p] = split_str + " (cm)"
975
return self.__image_type[p]
976
if self.E.is_supersingular(p):
977
self.__image_type[p] = non_split_str + " (cm)"
978
return self.__image_type[p]
979
else:
980
# if the reduction is bad (additive nec.) then
981
# the image is in a Borel subgroup and we should have found this before
982
raise NotImplementedError, "image_type is not implemented for cm-curves at bad prime."
983
984
# now to p=5 where a lot of non-standard thing happen
985
# we run through primes if we hit an element of order 6 in PGL_2, we know that it is the normaliser of a NON-split Cartan
986
# if we find both an element of order 3 and one of order 4, we know that we have a S_4 in PGL_2
987
988
if p == 5:
989
# we filter here a few cases and leave the rest to the computation of the galois group later
990
ell = 1
991
k = GF(p)
992
Np = self.E.conductor()*p
993
has_an_el_order_4 = False
994
has_an_el_order_3 = False
995
while ell < 10000:
996
ell = arith.next_prime(ell)
997
if Np % ell != 0:
998
a_ell = self.E.ap(ell)
999
u = k(a_ell)**2 * k(ell)**(-1)
1000
if u == 3:
1001
misc.verbose("found an element of order 6",2)
1002
# found an element of order 6:
1003
self.__image_type[p] = non_split_str
1004
return self.__image_type[p]
1005
1006
if u == 2 and not has_an_el_order_4:
1007
# found an element of order 4
1008
misc.verbose("found an element of order 4",2)
1009
has_an_el_order_4 = True
1010
if has_an_el_order_3:
1011
self.__image_type[p] = s4_str
1012
return self.__image_type[p]
1013
1014
if u == 1 and not has_an_el_order_3:
1015
# found an element of order 3
1016
misc.verbose("found an element of order 3",2)
1017
has_an_el_order_3 = True
1018
if has_an_el_order_4:
1019
self.__image_type[p] = s4_str
1020
return self.__image_type[p]
1021
1022
misc.verbose("p=5 and we could not determine the image, yet", 2)
1023
# we have not yet determined the image, there are only the following possible subgroups of PGL_2
1024
# (unless we were unlucky and none of the elements of order 6 showed up above, for instance)
1025
# A_4 of order 12 with elements of order 2 and 3
1026
# D_4 of order 8 with elements of order 2 and 4 (normalizer of the SPLIT)
1027
# Z/2 x Z/2 of order 4 with elements of order 2 (in the normalizer of the SPLIT)
1028
# S_3 of order 6 with elements of order 2 and 3 (inside the normalizer of the NON-split)
1029
1030
# we compute the splitting field of the 5-division polynomial. Its degree is equal to the above order or the double of it.
1031
# That allows us to determine almost all cases.
1032
1033
f = self.E.division_polynomial(5)
1034
K = _splitting_field(f)
1035
#EK = self.E.base_extend(K)
1036
#d = K.degree()
1037
#if len(EK._p_primary_torsion_basis(5,1)) < 2:
1038
# d *= 2
1039
# d is the order of the image in GL_2
1040
1041
if K.degree() in [4,8,16]:
1042
self.__image_type[p] = split_str
1043
return self.__image_type[p]
1044
if K.degree() == 24:
1045
self.__image_type[p] = a4_str
1046
return self.__image_type[p]
1047
if K.degree() == 6:
1048
self.__image_type[p] = nonsplit_str
1049
return self.__image_type[p]
1050
1051
if K.degree() == 12:
1052
# PGL - image could be a S_3 in the normalizer of the split or A4
1053
self.__image_type[p] = "The image is of order %s. Probably contained in the normalizer of the split Cartan g."
1054
return self.__image_type[p]
1055
1056
1057
## now E has no cm, is not semi-stable,
1058
## p > 5,
1059
## rho_p it is (most probably) not surjective , it is not contained in a Borel subgroup.
1060
# trying to detect that the image is not exceptional in PGL_2
1061
# this uses Serre 2.6.iii and Prop 19
1062
# the existence of certain classes in the image rules out certain cases.
1063
# we run over the small prime until we are left with only one case
1064
# for p = 5 this could never distinguish any from an exceptional S_4 ot A_4,
1065
# that is why the case 5 is treated a part before
1066
1067
else:
1068
ex_setp = _ex_set(p)
1069
ell = 1
1070
k = GF(p)
1071
Np = self.E.conductor()*p
1072
could_be_exc = 1
1073
could_be_split = 1
1074
could_be_non_split = 1
1075
# loops over primes as long as we still have two options left
1076
while ell < 10000 and (could_be_exc + could_be_split + could_be_non_split > 1):
1077
ell = arith.next_prime(ell)
1078
if Np % ell != 0:
1079
a_ell = self.E.ap(ell)
1080
u = k(a_ell)**2 * k(ell)**(-1)
1081
if (u not in ex_setp) and could_be_exc == 1:
1082
# it can not be in the exceptional
1083
misc.verbose("the image cannot be exceptional, found u=%s"%u,2)
1084
could_be_exc = 0
1085
if a_ell != 0 and arith.kronecker(a_ell**2 - 4*ell,p) == 1 and could_be_non_split == 1:
1086
# it can not be in the noramlizer of the non-split Cartan
1087
misc.verbose("the image cannot be non-split, found u=%s"%u,2)
1088
could_be_non_split = 0
1089
if a_ell != 0 and arith.kronecker(a_ell**2 - 4*ell,p) == -1 and could_be_split == 1:
1090
# it can not be in the noramlizer of the split Cartan
1091
misc.verbose("the image cannot be split, found u=%s"%u,2)
1092
could_be_split = 0
1093
1094
assert could_be_exc + could_be_split + could_be_non_split > 0, "bug in image_type."
1095
1096
if could_be_exc + could_be_split + could_be_non_split == 1:
1097
# it is only one of the three cases:
1098
if could_be_split == 1 :
1099
self.__image_type[p] = split_str
1100
return self.__image_type[p]
1101
if could_be_non_split == 1 :
1102
self.__image_type[p] = nonsplit_str
1103
return self.__image_type[p]
1104
if could_be_exc == 1:
1105
# here we can distinguish further
1106
could_be_a4 = 1
1107
could_be_s4 = 1
1108
could_be_a5 = 1
1109
if p % 5 != 1 and p % 5 != 4 :
1110
could_be_a5 = 0
1111
el5 = [ex_setp[-1],ex_setp[-2]] # elements of order 5
1112
# loops over primes as long as we still have two options left
1113
while ell < 10000 and (could_be_s4 + could_be_a4 + could_be_a5 > 1):
1114
ell = arith.next_prime(ell)
1115
if Np % ell != 0:
1116
a_ell = self.E.ap(ell)
1117
u = k(a_ell)**2 * k(ell)**(-1)
1118
if u == 2:
1119
# it can not be A4 not A5 as they have no elements of order 4
1120
could_be_a4 = 0
1121
could_be_a5 = 0
1122
if u in el5 :
1123
# it can not be A4 or S4 as they have no elements of order 5
1124
could_be_a4 = 0
1125
could_be_s4 = 0
1126
1127
assert (could_be_s4 + could_be_a4 + could_be_a5 > 0), "bug in image_type."
1128
1129
if could_be_s4 + could_be_a4 + could_be_a5 == 1:
1130
if could_be_s4 == 1:
1131
self.__image_type[p] = s4_str
1132
return self.__image_type[p]
1133
if could_be_a4 == 1:
1134
self.__image_type[p] = a4_str
1135
return self.__image_type[p]
1136
if could_be_a5 == 1:
1137
self.__image_type[p] = a5_str
1138
return self.__image_type[p]
1139
1140
else:
1141
self.__image_type[p] = "The image in PGL_2(F_%s) is an exceptional group A_4, S_4 or A_5, but we could not determine which one."%p
1142
return self.__image_type[p]
1143
1144
# is all fails, we probably have a fairly small group and we can try to detect it using the galois_group
1145
1146
if p <= 13:
1147
K = _division_field(self.E,p)
1148
d = K.absolute_degree()
1149
1150
misc.verbose("field of degree %s. try to compute galois group"%(d),2)
1151
try:
1152
G = K.galois_group()
1153
except:
1154
self.__image_type[p] = "The image is a group of order %s."%d
1155
return self.__image_type[p]
1156
1157
else:
1158
if G.is_abelian():
1159
ab = ""
1160
else:
1161
ab = "non-"
1162
self.__image_type[p] = "The image is a " + ab + "abelian group of order %s."%G.order()
1163
return self.__image_type[p]
1164
1165
## everything failed :
1166
1167
self.__image_type[p] = "The image could not be determined. Sorry."
1168
return self.__image_type[p]
1169
1170
1171
1172
1173
def image_classes(self,p,bound=10000):
1174
r"""
1175
This function returns, given the representation `\rho`
1176
a list of `p` values that add up to 1, representing the
1177
frequency of the conjugacy classes of the projective image
1178
of `\rho` in `PGL_2(\mathbb{F}_p)`.
1179
1180
Let `M` be a matrix in `GL_2(\mathbb{F}_p)`, then define
1181
`u(M) = \text{tr}(M)^2/\det(M)`, which only depends on the
1182
conjugacy class of `M` in `PGL_2(\mathbb{F}_p)`. So this defines
1183
a map `u: PGL_2(\mathbb{F}_p) \to \mathbb{F}_p`, which is almost
1184
a bijection (the elements of order `p` and the identity
1185
map to `4` and both classes of elements of order 2 map to 0).
1186
1187
This function returns the frequency with which the values of
1188
`u` appeared among the images of the Frobenius elements at `\ell`
1189
for good primes `\ell\neq p` below a the given ``bound``.
1190
1191
INPUT:
1192
1193
- a prime ``p``
1194
- a natural number ``bound`` (optional, default=10000)
1195
1196
OUTPUT:
1197
1198
- a list of `p` real numbers in the interval `[0,1]` adding up to 1
1199
1200
EXAMPLES::
1201
1202
sage: E = EllipticCurve('14a1')
1203
sage: rho = E.galois_representation()
1204
sage: rho.image_classes(5)
1205
[0.2095, 0.1516, 0.2445, 0.1728, 0.2217]
1206
1207
sage: E = EllipticCurve('11a1')
1208
sage: rho = E.galois_representation()
1209
sage: rho.image_classes(5)
1210
[0.2467, 0.0000, 0.5049, 0.0000, 0.2484]
1211
1212
::
1213
1214
sage: EllipticCurve('27a1').galois_representation().image_classes(5)
1215
[0.5839, 0.1645, 0.0000, 0.1702, 0.08143]
1216
sage: EllipticCurve('30a1').galois_representation().image_classes(5)
1217
[0.1956, 0.1801, 0.2543, 0.1728, 0.1972]
1218
sage: EllipticCurve('32a1').galois_representation().image_classes(5)
1219
[0.6319, 0.0000, 0.2492, 0.0000, 0.1189]
1220
sage: EllipticCurve('900a1').galois_representation().image_classes(5)
1221
[0.5852, 0.1679, 0.0000, 0.1687, 0.07824]
1222
sage: EllipticCurve('441a1').galois_representation().image_classes(5)
1223
[0.5860, 0.1646, 0.0000, 0.1679, 0.08150]
1224
sage: EllipticCurve('648a1').galois_representation().image_classes(5)
1225
[0.3945, 0.3293, 0.2388, 0.0000, 0.03749]
1226
1227
::
1228
1229
sage: EllipticCurve('784h1').galois_representation().image_classes(7)
1230
[0.5049, 0.0000, 0.0000, 0.0000, 0.4951, 0.0000, 0.0000]
1231
sage: EllipticCurve('49a1').galois_representation().image_classes(7)
1232
[0.5045, 0.0000, 0.0000, 0.0000, 0.4955, 0.0000, 0.0000]
1233
1234
sage: EllipticCurve('121c1').galois_representation().image_classes(11)
1235
[0.1001, 0.0000, 0.0000, 0.0000, 0.1017, 0.1953, 0.1993, 0.0000, 0.0000, 0.2010, 0.2026]
1236
sage: EllipticCurve('121d1').galois_representation().image_classes(11)
1237
[0.08869, 0.07974, 0.08706, 0.08137, 0.1001, 0.09439, 0.09764, 0.08218, 0.08625, 0.1017, 0.1009]
1238
1239
sage: EllipticCurve('441f1').galois_representation().image_classes(13)
1240
[0.08232, 0.1663, 0.1663, 0.1663, 0.08232, 0.0000, 0.1549, 0.0000, 0.0000, 0.0000, 0.0000, 0.1817, 0.0000]
1241
1242
REMARKS:
1243
1244
Conjugacy classes of subgroups of `PGL_2(\mathbb{F}_5)`
1245
1246
For the case `p=5`, the order of an element determines almost the value of `u`:
1247
1248
+-------+---+---+---+---+--------+
1249
|`u` | 0 | 1 | 2 | 3 | 4 |
1250
+-------+---+---+---+---+--------+
1251
|orders | 2 | 3 | 4 | 6 | 1 or 5 |
1252
+-------+---+---+---+---+--------+
1253
1254
Here we give here the full table of all conjugacy classes of subgroups with the values
1255
that ``image_classes`` should give (as ``bound`` tends to `\infty`). Comparing with the output
1256
of the above examples, it is now easy to guess what the image is.
1257
1258
+---------+-----+------------------------------------------+
1259
|subgroup |order| frequencies of values of `u` |
1260
+=========+=====+==========================================+
1261
| trivial | 1 | [0.0000, 0.0000, 0.0000, 0.0000, 1.000] |
1262
+---------+-----+------------------------------------------+
1263
| cyclic | 2 | [0.5000, 0.0000, 0.0000, 0.0000, 0.5000] |
1264
+---------+-----+------------------------------------------+
1265
| cyclic | 2 | [0.5000, 0.0000, 0.0000, 0.0000, 0.5000]|
1266
+---------+-----+------------------------------------------+
1267
| cyclic | 3 | [0.0000, 0.6667, 0.0000, 0.0000, 0.3333]|
1268
+---------+-----+------------------------------------------+
1269
| Klein | 4 | [0.7500, 0.0000, 0.0000, 0.0000, 0.2500]|
1270
+---------+-----+------------------------------------------+
1271
| cyclic | 4 | [0.2500, 0.0000, 0.5000, 0.0000, 0.2500]|
1272
+---------+-----+------------------------------------------+
1273
| Klein | 4 | [0.7500, 0.0000, 0.0000, 0.0000, 0.2500]|
1274
+---------+-----+------------------------------------------+
1275
| cyclic | 5 | [0.0000, 0.0000, 0.0000, 0.0000, 1.000]|
1276
+---------+-----+------------------------------------------+
1277
| cyclic | 6 | [0.1667, 0.3333, 0.0000, 0.3333, 0.1667]|
1278
+---------+-----+------------------------------------------+
1279
| `S_3` | 6 | [0.5000, 0.3333, 0.0000, 0.0000, 0.1667]|
1280
+---------+-----+------------------------------------------+
1281
| `S_3` | 6 | [0.5000, 0.3333, 0.0000, 0.0000, 0.1667] |
1282
+---------+-----+------------------------------------------+
1283
| `D_4` | 8 | [0.6250, 0.0000, 0.2500, 0.0000, 0.1250]|
1284
+---------+-----+------------------------------------------+
1285
| `D_5` | 10 | [0.5000, 0.0000, 0.0000, 0.0000, 0.5000]|
1286
+---------+-----+------------------------------------------+
1287
| `A_4` | 12 | [0.2500, 0.6667, 0.0000, 0.0000, 0.08333]|
1288
+---------+-----+------------------------------------------+
1289
| `D_6` | 12 | [0.5833, 0.1667, 0.0000, 0.1667, 0.08333]|
1290
+---------+-----+------------------------------------------+
1291
| Borel | 20 | [0.2500, 0.0000, 0.5000, 0.0000, 0.2500]|
1292
+---------+-----+------------------------------------------+
1293
| `S_4` | 24 | [0.3750, 0.3333, 0.2500, 0.0000, 0.04167]|
1294
+---------+-----+------------------------------------------+
1295
| `PSL_2` | 60 | [0.2500, 0.3333, 0.0000, 0.0000, 0.4167]|
1296
+---------+-----+------------------------------------------+
1297
| `PGL_2` | 120| [0.2083, 0.1667, 0.2500, 0.1667, 0.2083] |
1298
+---------+-----+------------------------------------------+
1299
"""
1300
res = [0 for i in range(p)]
1301
co = 0
1302
ell = 1
1303
while ell <= bound:
1304
ell = arith.next_prime(ell)
1305
if ell != p and self.E.is_good(ell):
1306
d = (self.E.ap(ell)**2 * ell.inverse_mod(p)) % p
1307
res[d] += 1
1308
co += 1
1309
# print res
1310
Rt = RealField(16)
1311
res = [Rt(x)/Rt(co) for x in res]
1312
return res
1313
1314
#####################################################################
1315
# classification of ell and p-adic reps
1316
#####################################################################
1317
1318
# ell-adic reps
1319
1320
def is_unramified(self,p,ell):
1321
r"""
1322
Returns true if the Galois representation to `GL_2(\ZZ_p)` is unramified at `\ell`, i.e.
1323
if the inertia group at a place above `\ell` in `\text{Gal}(\bar\QQ/\QQ)` has trivial image in
1324
`GL_2(\ZZ_p)`.
1325
1326
For a Galois representation attached to an elliptic curve `E`, this returns True if `\ell\neq p`
1327
and `E` has good reduction at `\ell`.
1328
1329
INPUT:
1330
1331
- ``p`` a prime
1332
- ``ell`` another prime
1333
1334
OUTPUT:
1335
1336
- Boolean
1337
1338
EXAMPLES::
1339
1340
sage: rho = EllipticCurve('20a3').galois_representation()
1341
sage: rho.is_unramified(5,7)
1342
True
1343
sage: rho.is_unramified(5,5)
1344
False
1345
sage: rho.is_unramified(7,5)
1346
False
1347
1348
This says that the 5-adic representation is unramified at 7, but the 7-adic representation is ramified at 5.
1349
"""
1350
if not arith.is_prime(p):
1351
raise ValueError, 'p (=%s) must be prime'%p
1352
if not arith.is_prime(ell):
1353
raise ValueError, 'ell (=%s) must be prime'%ell
1354
return (ell != p) and self.E.has_good_reduction(ell)
1355
1356
def is_unipotent(self,p,ell):
1357
r"""
1358
Returns true if the Galois representation to `GL_2(\ZZ_p)` is unipotent at `\ell\neq p`, i.e.
1359
if the inertia group at a place above `\ell` in `\text{Gal}(\bar\QQ/\QQ)` maps into a Borel subgroup.
1360
1361
For a Galois representation attached to an elliptic curve `E`, this returns True if
1362
`E` has semi-stable reduction at `\ell`.
1363
1364
INPUT:
1365
1366
- ``p`` a prime
1367
- ``ell`` a different prime
1368
1369
OUTPUT:
1370
1371
- Boolean
1372
1373
EXAMPLES::
1374
1375
sage: rho = EllipticCurve('120a1').galois_representation()
1376
sage: rho.is_unipotent(2,5)
1377
True
1378
sage: rho.is_unipotent(5,2)
1379
False
1380
sage: rho.is_unipotent(5,7)
1381
True
1382
sage: rho.is_unipotent(5,3)
1383
True
1384
sage: rho.is_unipotent(5,5)
1385
Traceback (most recent call last):
1386
...
1387
ValueError: unipotent is not defined for l = p, use semistable instead.
1388
"""
1389
if not arith.is_prime(p):
1390
raise ValueError, 'p (=%s) must be prime'%p
1391
if not arith.is_prime(ell):
1392
raise ValueError, 'ell (=%s) must be prime'%ell
1393
if ell == p:
1394
raise ValueError, "unipotent is not defined for l = p, use semistable instead."
1395
return not self.E.has_additive_reduction(ell)
1396
1397
def is_quasi_unipotent(self,p,ell):
1398
r"""
1399
Returns true if the Galois representation to `GL_2(\ZZ_p)` is quasi-unipotent at `\ell\neq p`, i.e. if there is a fintie extension `K/\QQ` such that the inertia group at a place above `\ell` in `\text{Gal}(\bar\QQ/K)` maps into a Borel subgroup.
1400
1401
For a Galois representation attached to an elliptic curve `E`, this returns always True.
1402
1403
INPUT:
1404
1405
- ``p`` a prime
1406
- ``ell`` a different prime
1407
1408
OUTPUT:
1409
1410
- Boolean
1411
1412
EXAMPLES::
1413
1414
sage: rho = EllipticCurve('11a3').galois_representation()
1415
sage: rho.is_quasi_unipotent(11,13)
1416
True
1417
"""
1418
if not arith.is_prime(p):
1419
raise ValueError, 'p (=%s) must be prime'%p
1420
if not arith.is_prime(ell):
1421
raise ValueError, 'ell (=%s) must be prime'%ell
1422
if ell == p:
1423
raise ValueError, "quasi unipotent is not defined for l = p, use semistable instead."
1424
return True
1425
1426
# p-adic reps
1427
1428
def is_ordinary(self,p):
1429
r"""
1430
Returns true if the `p`-adic Galois representation to `GL_2(\ZZ_p)` is ordinary, i.e.
1431
if the image of the decomposition group in `\text{Gal}(\bar\QQ/\QQ)` above he prime `p` maps into
1432
a Borel subgroup.
1433
1434
For an elliptic curve `E`, this is to ask whether `E` is ordinary at `p`, i.e. good ordinary or multiplicative.
1435
1436
INPUT:
1437
1438
- ``p`` a prime
1439
1440
OUTPUT:
1441
1442
- a Boolean
1443
1444
EXAMPLES::
1445
1446
sage: rho = EllipticCurve('11a3').galois_representation()
1447
sage: rho.is_ordinary(11)
1448
True
1449
sage: rho.is_ordinary(5)
1450
True
1451
sage: rho.is_ordinary(19)
1452
False
1453
"""
1454
if not arith.is_prime(p):
1455
raise ValueError, 'p (=%s) must be prime'%p
1456
if self.E.has_additive_reduction(p):
1457
raise NotImplementedError, 'is_ordinary is only implemented for semi-stable representations'
1458
return self.E.has_multiplicative_reduction(p) or (self.E.has_good_reduction(p) and self.E.ap(p) % p != 0)
1459
1460
def is_crystalline(self,p):
1461
r"""
1462
Returns true is the `p`-adic Galois representation to `GL_2(\ZZ_p)` is crystalline.
1463
1464
For an elliptic curve `E`, this is to ask whether `E` has good reduction at `p`.
1465
1466
INPUT:
1467
1468
- ``p`` a prime
1469
1470
OUTPUT:
1471
1472
- a Boolean
1473
1474
EXAMPLES::
1475
1476
sage: rho = EllipticCurve('64a1').galois_representation()
1477
sage: rho.is_crystalline(5)
1478
True
1479
sage: rho.is_crystalline(2)
1480
False
1481
"""
1482
if not arith.is_prime(p):
1483
raise ValueError, 'p (=%s) must be prime'%p
1484
return self.E.has_good_reduction(p)
1485
1486
def is_potentially_crystalline(self,p):
1487
r"""
1488
Returns true is the `p`-adic Galois representation to `GL_2(\ZZ_p)` is potentially crystalline, i.e.
1489
if there is a finite extension `K/\QQ_p` such that the `p`-adic representation becomes crystalline.
1490
1491
For an elliptic curve `E`, this is to ask whether `E` has potentially good reduction at `p`.
1492
1493
INPUT:
1494
1495
- ``p`` a prime
1496
1497
OUTPUT:
1498
1499
- a Boolean
1500
1501
EXAMPLES::
1502
1503
sage: rho = EllipticCurve('37b1').galois_representation()
1504
sage: rho.is_potentially_crystalline(37)
1505
False
1506
sage: rho.is_potentially_crystalline(7)
1507
True
1508
"""
1509
if not arith.is_prime(p):
1510
raise ValueError, 'p (=%s) must be prime'%p
1511
return self.E.j_invariant().valuation(p) >= 0
1512
1513
1514
def is_semistable(self,p):
1515
r"""
1516
Returns true if the `p`-adic Galois representation to `GL_2(\ZZ_p)` is semistable.
1517
1518
For an elliptic curve `E`, this is to ask whether `E` has semistable reduction at `p`.
1519
1520
INPUT:
1521
1522
- ``p`` a prime
1523
1524
OUTPUT:
1525
1526
- a Boolean
1527
1528
EXAMPLES::
1529
1530
sage: rho = EllipticCurve('20a3').galois_representation()
1531
sage: rho.is_semistable(2)
1532
False
1533
sage: rho.is_semistable(3)
1534
True
1535
sage: rho.is_semistable(5)
1536
True
1537
"""
1538
if not arith.is_prime(p):
1539
raise ValueError, 'p (=%s) must be prime'%p
1540
return not self.E.has_additive_reduction(p)
1541
1542
def is_potentially_semistable(self,p):
1543
r"""
1544
Returns true if the `p`-adic Galois representation to `GL_2(\ZZ_p)` is potentially semistable.
1545
1546
For an elliptic curve `E`, this returns True always
1547
1548
INPUT:
1549
1550
- ``p`` a prime
1551
1552
OUTPUT:
1553
1554
- a Boolean
1555
1556
EXAMPLES::
1557
1558
sage: rho = EllipticCurve('27a2').galois_representation()
1559
sage: rho.is_potentially_semistable(3)
1560
True
1561
"""
1562
if not arith.is_prime(p):
1563
raise ValueError, 'p (=%s) must be prime'%p
1564
return True
1565
1566