Galois representations attached to elliptic curves¶
Given an elliptic curve
over
and a rational prime number
, the
-torsion
points of
is a representation of the
absolute Galois group
of
. As
varies
we obtain the Tate module
which is a
a representation of
on a free
-module
of rank
. As
varies the representations
are compatible.
Currently sage can decide whether the Galois module
is reducible, i.e., if
admits an isogeny
of degree
, and whether the image of
the representation on
is surjective onto
.
The following are the most useful functions for the class GaloisRepresentation.
For the reducibility:
is_reducible(p)is_irreducible(p)reducible_primes()
For the image:
is_surjective(p)non_surjective()image_type(p)
For the classification of the representation
is_semistable(p)is_unramified(p, ell)is_crystalline(p)
EXAMPLES:
sage: E = EllipticCurve('196a1')
sage: rho = E.galois_representation()
sage: rho.is_irreducible(7)
True
sage: rho.is_reducible(3)
True
sage: rho.is_irreducible(2)
True
sage: rho.is_surjective(2)
False
sage: rho.is_surjective(3)
False
sage: rho.is_surjective(5)
True
sage: rho.reducible_primes()
[3]
sage: rho.non_surjective()
[2, 3]
sage: rho.image_type(2)
'The image is cyclic of order 3.'
sage: rho.image_type(3)
'The image is contained in a Borel subgroup as there is a 3-isogeny.'
sage: rho.image_type(5)
'The image is all of GL_2(F_5).'
For semi-stable curve it is known that the representation is surjective if and only if it is irreducible:
sage: E = EllipticCurve('11a1')
sage: rho = E.galois_representation()
sage: rho.non_surjective()
[5]
sage: rho.reducible_primes()
[5]
For cm curves it is not true that there are only finitely many primes for which the
Galois representation mod p is surjective onto
:
sage: E = EllipticCurve('27a1')
sage: rho = E.galois_representation()
sage: rho.non_surjective()
[0]
sage: rho.reducible_primes()
[3]
sage: E.has_cm()
True
sage: rho.image_type(11)
'The image is contained in the normalizer of a non-split Cartan group. (cm)'
REFERENCES:
| [Se1] | Jean-Pierre Serre, Propriétés galoisiennes des points d’ordre fini des courbes elliptiques. Invent. Math. 15 (1972), no. 4, 259–331. |
| [Se2] | Jean-Pierre Serre,
Sur les représentations modulaires de degré
2 de .
Duke Math. J. 54 (1987), no. 1, 179–230. |
| [Co] | Alina Carmen Cojocaru, On the surjectivity of the Galois representations associated to non-CM elliptic curves. With an appendix by Ernst Kani. Canad. Math. Bull. 48 (2005), no. 1, 16–31. |
AUTHORS:
- chris wuthrich (02/10) - moved from ell_rational_field.py.
-
class
sage.schemes.elliptic_curves.gal_reps.GaloisRepresentation(E)¶ Bases:
sage.structure.sage_object.SageObjectThe compatible family of Galois representation attached to an elliptic curve over the rational numbers.
Given an elliptic curve
over
and a rational
prime number
, the
-torsion
points of
is a representation of the absolute Galois group.
As
varies we obtain the Tate module
which is
a representation of the absolute Galois group on a free
-module of rank
. As
varies the
representations are compatible.EXAMPLES:
sage: rho = EllipticCurve('11a1').galois_representation() sage: rho 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
-
elliptic_curve()¶ The elliptic curve associated to this representation.
EXAMPLES:
sage: E = EllipticCurve('11a1') sage: rho = E.galois_representation() sage: rho.elliptic_curve() == E True
-
image_classes(p, bound=10000)¶ This function returns, given the representation
a list of
values that add up to 1, representing the
frequency of the conjugacy classes of the projective image
of
in
.Let
be a matrix in
, then define
, which only depends on the
conjugacy class of
in
. Hence this defines
a map
, which is almost
a bijection between conjugacy classes of the source
and
(the elements of order
and the identity
map to
and both classes of elements of order 2 map to 0).This function returns the frequency with which the values of
appeared among the images of the Frobenius elements
for good primes
below a
given bound.INPUT:
- a prime
p - a natural number
bound(optional, default=10000)
OUTPUT:
- a list of
real numbers in the interval
adding up to 1
EXAMPLES:
sage: E = EllipticCurve('14a1') sage: rho = E.galois_representation() sage: rho.image_classes(5) [0.2095, 0.1516, 0.2445, 0.1728, 0.2217] sage: E = EllipticCurve('11a1') sage: rho = E.galois_representation() sage: rho.image_classes(5) [0.2467, 0.0000, 0.5049, 0.0000, 0.2484]
sage: EllipticCurve('27a1').galois_representation().image_classes(5) [0.5839, 0.1645, 0.0000, 0.1702, 0.08143] sage: EllipticCurve('30a1').galois_representation().image_classes(5) [0.1956, 0.1801, 0.2543, 0.1728, 0.1972] sage: EllipticCurve('32a1').galois_representation().image_classes(5) [0.6319, 0.0000, 0.2492, 0.0000, 0.1189] sage: EllipticCurve('900a1').galois_representation().image_classes(5) [0.5852, 0.1679, 0.0000, 0.1687, 0.07824] sage: EllipticCurve('441a1').galois_representation().image_classes(5) [0.5860, 0.1646, 0.0000, 0.1679, 0.08150] sage: EllipticCurve('648a1').galois_representation().image_classes(5) [0.3945, 0.3293, 0.2388, 0.0000, 0.03749]
sage: EllipticCurve('784h1').galois_representation().image_classes(7) [0.5049, 0.0000, 0.0000, 0.0000, 0.4951, 0.0000, 0.0000] sage: EllipticCurve('49a1').galois_representation().image_classes(7) [0.5045, 0.0000, 0.0000, 0.0000, 0.4955, 0.0000, 0.0000] sage: EllipticCurve('121c1').galois_representation().image_classes(11) [0.1001, 0.0000, 0.0000, 0.0000, 0.1017, 0.1953, 0.1993, 0.0000, 0.0000, 0.2010, 0.2026] sage: EllipticCurve('121d1').galois_representation().image_classes(11) [0.08869, 0.07974, 0.08706, 0.08137, 0.1001, 0.09439, 0.09764, 0.08218, 0.08625, 0.1017, 0.1009] sage: EllipticCurve('441f1').galois_representation().image_classes(13) [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]
REMARKS:
Conjugacy classes of subgroups of

For the case
, the order of an element determines almost the value of
:
0 1 2 3 4 orders 2 3 4 6 1 or 5 Here we give here the full table of all conjugacy classes of subgroups with the values that
image_classesshould give (asboundtends to
). Comparing with the output
of the above examples, it is now easy to guess what the image is.subgroup order frequencies of values of 
trivial 1 [0.0000, 0.0000, 0.0000, 0.0000, 1.000] cyclic 2 [0.5000, 0.0000, 0.0000, 0.0000, 0.5000] cyclic 2 [0.5000, 0.0000, 0.0000, 0.0000, 0.5000] cyclic 3 [0.0000, 0.6667, 0.0000, 0.0000, 0.3333] Klein 4 [0.7500, 0.0000, 0.0000, 0.0000, 0.2500] cyclic 4 [0.2500, 0.0000, 0.5000, 0.0000, 0.2500] Klein 4 [0.7500, 0.0000, 0.0000, 0.0000, 0.2500] cyclic 5 [0.0000, 0.0000, 0.0000, 0.0000, 1.000] cyclic 6 [0.1667, 0.3333, 0.0000, 0.3333, 0.1667] 
6 [0.5000, 0.3333, 0.0000, 0.0000, 0.1667] 
6 [0.5000, 0.3333, 0.0000, 0.0000, 0.1667] 
8 [0.6250, 0.0000, 0.2500, 0.0000, 0.1250] 
10 [0.5000, 0.0000, 0.0000, 0.0000, 0.5000] 
12 [0.2500, 0.6667, 0.0000, 0.0000, 0.08333] 
12 [0.5833, 0.1667, 0.0000, 0.1667, 0.08333] Borel 20 [0.2500, 0.0000, 0.5000, 0.0000, 0.2500] 
24 [0.3750, 0.3333, 0.2500, 0.0000, 0.04167] 
60 [0.2500, 0.3333, 0.0000, 0.0000, 0.4167] 
120 [0.2083, 0.1667, 0.2500, 0.1667, 0.2083] - a prime
-
image_type(p)¶ Returns a string describing the image of the mod-p representation. 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.
INPUT:
pa prime number
OUTPUT:
- a string.
EXAMPLES
sage: E = EllipticCurve('14a1') sage: rho = E.galois_representation() sage: rho.image_type(5) 'The image is all of GL_2(F_5).' sage: E = EllipticCurve('11a1') sage: rho = E.galois_representation() sage: rho.image_type(5) 'The image is meta-cyclic inside a Borel subgroup as there is a 5-torsion point on the curve.' sage: EllipticCurve('27a1').galois_representation().image_type(5) 'The image is contained in the normalizer of a non-split Cartan group. (cm)' sage: EllipticCurve('30a1').galois_representation().image_type(5) 'The image is all of GL_2(F_5).' sage: EllipticCurve("324b1").galois_representation().image_type(5) 'The image in PGL_2(F_5) is the exceptional group S_4.' sage: E = EllipticCurve([0,0,0,-56,4848]) sage: rho = E.galois_representation() sage: rho.image_type(5) 'The image is contained in the normalizer of a split Cartan group.' sage: EllipticCurve('49a1').galois_representation().image_type(7) 'The image is contained in a Borel subgroup as there is a 7-isogeny.' sage: EllipticCurve('121c1').galois_representation().image_type(11) 'The image is contained in a Borel subgroup as there is a 11-isogeny.' sage: EllipticCurve('121d1').galois_representation().image_type(11) 'The image is all of GL_2(F_11).' sage: EllipticCurve('441f1').galois_representation().image_type(13) 'The image is contained in a Borel subgroup as there is a 13-isogeny.' sage: EllipticCurve([1,-1,1,-5,2]).galois_representation().image_type(5) 'The image is contained in the normalizer of a non-split Cartan group.' sage: EllipticCurve([0,0,1,-25650,1570826]).galois_representation().image_type(5) 'The image is contained in the normalizer of a split Cartan group.' 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) 'The image is a... group of order 18.' 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) 'The image is a... group of order 36.' sage: EllipticCurve([0,0,1,2580,549326]).galois_representation().image_type(7) 'The image is contained in the normalizer of a split Cartan group.'
Test trac ticket #14577:
sage: EllipticCurve([0, 1, 0, -4788, 109188]).galois_representation().image_type(13) 'The image in PGL_2(F_13) is the exceptional group S_4.'
Test trac ticket #14752:
sage: EllipticCurve([0, 0, 0, -1129345880,-86028258620304]).galois_representation().image_type(11) 'The image is contained in the normalizer of a non-split Cartan group.'
For
:sage: E = EllipticCurve('11a1') sage: rho = E.galois_representation() sage: rho.image_type(2) 'The image is all of GL_2(F_2), i.e. a symmetric group of order 6.' sage: rho = EllipticCurve('14a1').galois_representation() sage: rho.image_type(2) 'The image is cyclic of order 2 as there is exactly one rational 2-torsion point.' sage: rho = EllipticCurve('15a1').galois_representation() sage: rho.image_type(2) 'The image is trivial as all 2-torsion points are rational.' sage: rho = EllipticCurve('196a1').galois_representation() sage: rho.image_type(2) 'The image is cyclic of order 3.'
:sage: rho = EllipticCurve('33a1').galois_representation() sage: rho.image_type(3) 'The image is all of GL_2(F_3).' sage: rho = EllipticCurve('30a1').galois_representation() sage: rho.image_type(3) 'The image is meta-cyclic inside a Borel subgroup as there is a 3-torsion point on the curve.' sage: rho = EllipticCurve('50b1').galois_representation() sage: rho.image_type(3) 'The image is contained in a Borel subgroup as there is a 3-isogeny.' sage: rho = EllipticCurve('3840h1').galois_representation() sage: rho.image_type(3) 'The image is contained in a dihedral group of order 8.' sage: rho = EllipticCurve('32a1').galois_representation() sage: rho.image_type(3) 'The image is a semi-dihedral group of order 16, gap.SmallGroup([16,8]).'
ALGORITHM: Mainly based on Serre’s paper.
-
is_crystalline(p)¶ Returns true is the
-adic Galois representation to
is crystalline.For an elliptic curve
, this is to ask whether
has good reduction at
.INPUT:
pa prime
OUTPUT:
- a Boolean
EXAMPLES:
sage: rho = EllipticCurve('64a1').galois_representation() sage: rho.is_crystalline(5) True sage: rho.is_crystalline(2) False
-
is_irreducible(p)¶ Return True if the mod p representation is irreducible.
INPUT:
p- a prime number
OUTPUT:
- a boolean
EXAMPLES:
sage: rho = EllipticCurve('37b').galois_representation() sage: rho.is_irreducible(2) True sage: rho.is_irreducible(3) False sage: rho.is_reducible(2) False sage: rho.is_reducible(3) True
-
is_ordinary(p)¶ Returns true if the
-adic Galois representation to
is ordinary, i.e.
if the image of the decomposition group in
above he prime
maps into
a Borel subgroup.For an elliptic curve
, this is to ask whether
is ordinary at
, i.e. good ordinary or multiplicative.INPUT:
pa prime
OUTPUT:
- a Boolean
EXAMPLES:
sage: rho = EllipticCurve('11a3').galois_representation() sage: rho.is_ordinary(11) True sage: rho.is_ordinary(5) True sage: rho.is_ordinary(19) False
-
is_potentially_crystalline(p)¶ Returns true is the
-adic Galois representation to
is potentially crystalline, i.e.
if there is a finite extension
such that the
-adic representation becomes crystalline.For an elliptic curve
, this is to ask whether
has potentially good reduction at
.INPUT:
pa prime
OUTPUT:
- a Boolean
EXAMPLES:
sage: rho = EllipticCurve('37b1').galois_representation() sage: rho.is_potentially_crystalline(37) False sage: rho.is_potentially_crystalline(7) True
-
is_potentially_semistable(p)¶ Returns true if the
-adic Galois representation to
is potentially semistable.For an elliptic curve
, this returns True alwaysINPUT:
pa prime
OUTPUT:
- a Boolean
EXAMPLES:
sage: rho = EllipticCurve('27a2').galois_representation() sage: rho.is_potentially_semistable(3) True
-
is_quasi_unipotent(p, ell)¶ Returns true if the Galois representation to
is quasi-unipotent at
, i.e. if there is a fintie extension
such that the inertia group at a place above
in
maps into a Borel subgroup.For a Galois representation attached to an elliptic curve
, this returns always True.INPUT:
pa primeella different prime
OUTPUT:
- Boolean
EXAMPLES:
sage: rho = EllipticCurve('11a3').galois_representation() sage: rho.is_quasi_unipotent(11,13) True
-
is_reducible(p)¶ Return True if the mod-p representation is reducible. This is equivalent to the existence of an isogeny defined over
of degree
from the
elliptic curve.INPUT:
p- a prime number
OUTPUT:
- a boolean
The answer is cached.
EXAMPLES:
sage: rho = EllipticCurve('121a').galois_representation() sage: rho.is_reducible(7) False sage: rho.is_reducible(11) True sage: EllipticCurve('11a').galois_representation().is_reducible(5) True sage: rho = EllipticCurve('11a2').galois_representation() sage: rho.is_reducible(5) True sage: EllipticCurve('11a2').torsion_order() 1
-
is_semistable(p)¶ Returns true if the
-adic Galois representation to
is semistable.For an elliptic curve
, this is to ask whether
has semistable reduction at
.INPUT:
pa prime
OUTPUT:
- a Boolean
EXAMPLES:
sage: rho = EllipticCurve('20a3').galois_representation() sage: rho.is_semistable(2) False sage: rho.is_semistable(3) True sage: rho.is_semistable(5) True
-
is_surjective(p, A=1000)¶ Return True if the mod-p representation is surjective onto
.False if it is not, or None if we were unable to determine whether it is or not.
INPUT:
p- int (a prime number)A- int (a bound on the number of a_p to use)
OUTPUT:
- boolean. True if the mod-p representation is surjective and False if not.
The answer is cached.
EXAMPLES:
sage: rho = EllipticCurve('37b').galois_representation() sage: rho.is_surjective(2) True sage: rho.is_surjective(3) False
sage: rho = EllipticCurve('121a1').galois_representation() sage: rho.non_surjective() [11] sage: rho.is_surjective(5) True sage: rho.is_surjective(11) False sage: rho = EllipticCurve('121d1').galois_representation() sage: rho.is_surjective(5) False sage: rho.is_surjective(11) True
Here is a case, in which the algorithm does not return an answer:
sage: rho = EllipticCurve([0,0,1,2580,549326]).galois_representation() sage: rho.is_surjective(7)
In these cases, one can use image_type to get more information about the image:
sage: rho.image_type(7) 'The image is contained in the normalizer of a split Cartan group.'
REMARKS:
- If
then the mod-p representation is
surjective if and only if the p-adic representation is
surjective. When
there are
counterexamples. See papers of Dokchitsers and Elkies
for more details. - For the primes
and 3, this will always answer either
True or False. For larger primes it might give None.
-
is_unipotent(p, ell)¶ Returns true if the Galois representation to
is unipotent at
, i.e.
if the inertia group at a place above
in
maps into a Borel subgroup.For a Galois representation attached to an elliptic curve
, this returns True if
has semi-stable reduction at
.INPUT:
pa primeella different prime
OUTPUT:
- Boolean
EXAMPLES:
sage: rho = EllipticCurve('120a1').galois_representation() sage: rho.is_unipotent(2,5) True sage: rho.is_unipotent(5,2) False sage: rho.is_unipotent(5,7) True sage: rho.is_unipotent(5,3) True sage: rho.is_unipotent(5,5) Traceback (most recent call last): ... ValueError: unipotent is not defined for l = p, use semistable instead.
-
is_unramified(p, ell)¶ Returns true if the Galois representation to
is unramified at
, i.e.
if the inertia group at a place above
in
has trivial image in
.For a Galois representation attached to an elliptic curve
, this returns True if
and
has good reduction at
.INPUT:
pa primeellanother prime
OUTPUT:
- Boolean
EXAMPLES:
sage: rho = EllipticCurve('20a3').galois_representation() sage: rho.is_unramified(5,7) True sage: rho.is_unramified(5,5) False sage: rho.is_unramified(7,5) False
This says that the 5-adic representation is unramified at 7, but the 7-adic representation is ramified at 5.
-
non_surjective(A=1000)¶ Returns a list of primes p such that the mod-p representation might not be surjective. If
is not in the returned list,
then the mod-p representation is provably surjective.By a theorem of Serre, there are only finitely many primes in this list, except when the curve has complex multiplication.
If the curve has CM, we simply return the sequence [0] and do no further computation.
INPUT:
A- an integer (default 1000). By increasing this parameter the resulting set might get smaller.
OUTPUT:
list- if the curve has CM, returns [0]. Otherwise, returns a list of primes where mod-p representation is very likely not surjective. At any prime not in this list, the representation is definitely surjective.
EXAMPLES:
sage: E = EllipticCurve([0, 0, 1, -38, 90]) # 361A sage: E.galois_representation().non_surjective() # CM curve [0]
sage: E = EllipticCurve([0, -1, 1, 0, 0]) # X_1(11) sage: E.galois_representation().non_surjective() [5] sage: E = EllipticCurve([0, 0, 1, -1, 0]) # 37A sage: E.galois_representation().non_surjective() [] sage: E = EllipticCurve([0,-1,1,-2,-1]) # 141C sage: E.galois_representation().non_surjective() [13]
sage: E = EllipticCurve([1,-1,1,-9965,385220]) # 9999a1 sage: rho = E.galois_representation() sage: rho.non_surjective() [2] sage: E = EllipticCurve('324b1') sage: rho = E.galois_representation() sage: rho.non_surjective() [3, 5]
ALGORITHM: We first find an upper bound
on the possible primes. If
is semi-stable, we can take
by a result of Mazur. There is
a bound by Serre in the case that the
-invariant is not integral
in terms of the smallest prime of good reduction. Finally
there is an unconditional bound by Cojocaru, but which depends
on the conductor of
.
For the prime below that bound we call is_surjective.
-
reducible_primes()¶ Returns a list of the primes
such that the mod-
representation is reducible. For all other primes the
representation is irreducible.EXAMPLES:
sage: rho = EllipticCurve('225a').galois_representation() sage: rho.reducible_primes() [3]
-
