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