Galois representations attached to elliptic curves#
Given an elliptic curve \(E\) over \(\QQ\) and a rational prime number \(p\), the \(p^n\)-torsion \(E[p^n]\) points of \(E\) is a representation of the absolute Galois group \(G_{\QQ}\) of \(\QQ\). As \(n\) varies we obtain the Tate module \(T_p E\) which is a a representation of \(G_\QQ\) on a free \(\ZZ_p\)-module of rank \(2\). As \(p\) varies the representations are compatible.
Currently sage can decide whether the Galois module \(E[p]\) is reducible, i.e., if \(E\) admits an isogeny of degree \(p\), and whether the image of the representation on \(E[p]\) is surjective onto \(\text{Aut}(E[p]) = GL_2(\GF{p})\).
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 \(GL_2(\GF{p})\):
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:
AUTHORS:
chris wuthrich (02/10): moved from ell_rational_field.py.
- class sage.schemes.elliptic_curves.gal_reps.GaloisRepresentation(E)#
Bases:
SageObject
The compatible family of Galois representation attached to an elliptic curve over the rational numbers.
Given an elliptic curve \(E\) over \(\QQ\) and a rational prime number \(p\), the \(p^n\)-torsion \(E[p^n]\) points of \(E\) is a representation of the absolute Galois group. As \(n\) varies we obtain the Tate module \(T_p E\) which is a representation of the absolute Galois group on a free \(\ZZ_p\)-module of rank \(2\). As \(p\) 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 \(\rho\) a list of \(p\) values that add up to 1, representing the frequency of the conjugacy classes of the projective image of \(\rho\) in \(PGL_2(\GF{p})\).
Let \(M\) be a matrix in \(GL_2(\GF{p})\), then define \(u(M) = \text{tr}(M)^2/\det(M)\), which only depends on the conjugacy class of \(M\) in \(PGL_2(\GF{p})\). Hence this defines a map \(u: PGL_2(\GF{p}) \to \GF{p}\), which is almost a bijection between conjugacy classes of the source and \(\GF{p}\) (the elements of order \(p\) and the identity map to \(4\) and both classes of elements of order 2 map to 0).
This function returns the frequency with which the values of \(u\) appeared among the images of the Frobenius elements \(a_{\ell}`at `\ell\) for good primes \(\ell\neq p\) below a given
bound
.INPUT:
a prime
p
a natural number
bound
(optional, default=10000)
OUTPUT:
a list of \(p\) real numbers in the interval \([0,1]\) 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 \(PGL_2(\GF{5})\)
For the case \(p=5\), the order of an element determines almost the value of \(u\):
\(u\)
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_classes
should give (asbound
tends to \(\infty\)). Comparing with the output of the above examples, it is now easy to guess what the image is.subgroup
order
frequencies of values of \(u\)
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]
\(S_3\)
6
[0.5000, 0.3333, 0.0000, 0.0000, 0.1667]
\(S_3\)
6
[0.5000, 0.3333, 0.0000, 0.0000, 0.1667]
\(D_4\)
8
[0.6250, 0.0000, 0.2500, 0.0000, 0.1250]
\(D_5\)
10
[0.5000, 0.0000, 0.0000, 0.0000, 0.5000]
\(A_4\)
12
[0.2500, 0.6667, 0.0000, 0.0000, 0.08333]
\(D_6\)
12
[0.5833, 0.1667, 0.0000, 0.1667, 0.08333]
Borel
20
[0.2500, 0.0000, 0.5000, 0.0000, 0.2500]
\(S_4\)
24
[0.3750, 0.3333, 0.2500, 0.0000, 0.04167]
\(PSL_2\)
60
[0.2500, 0.3333, 0.0000, 0.0000, 0.4167]
\(PGL_2\)
120
[0.2083, 0.1667, 0.2500, 0.1667, 0.2083]
- image_type(p)#
Return 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:
p
a 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 \(p=2\):
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.'
\(p=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)#
Return true is the \(p\)-adic Galois representation to \(GL_2(\ZZ_p)\) is crystalline.
For an elliptic curve \(E\), this is to ask whether \(E\) has good reduction at \(p\).
INPUT:
p
a 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)#
Return true if the \(p\)-adic Galois representation to \(GL_2(\ZZ_p)\) is ordinary, i.e. if the image of the decomposition group in \(\text{Gal}(\bar\QQ/\QQ)\) above he prime \(p\) maps into a Borel subgroup.
For an elliptic curve \(E\), this is to ask whether \(E\) is ordinary at \(p\), i.e. good ordinary or multiplicative.
INPUT:
p
a 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)#
Return true is the \(p\)-adic Galois representation to \(GL_2(\ZZ_p)\) is potentially crystalline, i.e. if there is a finite extension \(K/\QQ_p\) such that the \(p\)-adic representation becomes crystalline.
For an elliptic curve \(E\), this is to ask whether \(E\) has potentially good reduction at \(p\).
INPUT:
p
a 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)#
Return true if the \(p\)-adic Galois representation to \(GL_2(\ZZ_p)\) is potentially semistable.
For an elliptic curve \(E\), this returns True always
INPUT:
p
a prime
OUTPUT:
a Boolean
EXAMPLES:
sage: rho = EllipticCurve('27a2').galois_representation() sage: rho.is_potentially_semistable(3) True
- is_quasi_unipotent(p, ell)#
Return true if the Galois representation to \(GL_2(\ZZ_p)\) is quasi-unipotent at \(\ell\neq p\), i.e. if there is a finite extension \(K/\QQ\) such that the inertia group at a place above \(\ell\) in \(\text{Gal}(\bar\QQ/K)\) maps into a Borel subgroup.
For a Galois representation attached to an elliptic curve \(E\), this returns always True.
INPUT:
p
a primeell
a 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 \(\QQ\) of degree \(p\) 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)#
Return true if the \(p\)-adic Galois representation to \(GL_2(\ZZ_p)\) is semistable.
For an elliptic curve \(E\), this is to ask whether \(E\) has semistable reduction at \(p\).
INPUT:
p
a 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 \(Aut(E[p]) = GL_2(\GF{p})\).
False if it is not, or None if we were unable to determine whether it is or not.
INPUT:
p
(integer) – a prime numberA
(integer) – 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 \(p \geq 5\) then the mod-p representation is surjective if and only if the p-adic representation is surjective. When \(p = 2, 3\) there are counterexamples. See papers of Dokchitsers and Elkies for more details.
For the primes \(p=2\) and 3, this will always answer either True or False. For larger primes it might give None.
- is_unipotent(p, ell)#
Return true if the Galois representation to \(GL_2(\ZZ_p)\) is unipotent at \(\ell\neq p\), i.e. if the inertia group at a place above \(\ell\) in \(\text{Gal}(\bar\QQ/\QQ)\) maps into a Borel subgroup.
For a Galois representation attached to an elliptic curve \(E\), this returns True if \(E\) has semi-stable reduction at \(\ell\).
INPUT:
p
a primeell
a 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)#
Return true if the Galois representation to \(GL_2(\ZZ_p)\) is unramified at \(\ell\), i.e. if the inertia group at a place above \(\ell\) in \(\text{Gal}(\bar\QQ/\QQ)\) has trivial image in \(GL_2(\ZZ_p)\).
For a Galois representation attached to an elliptic curve \(E\), this returns True if \(\ell\neq p\) and \(E\) has good reduction at \(\ell\).
INPUT:
p
a primeell
another 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)#
Return a list of primes p such that the mod-p representation might not be surjective. If \(p\) 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 \(B\) on the possible primes. If \(E\) is semi-stable, we can take \(B=11\) by a result of Mazur. There is a bound by Serre in the case that the \(j\)-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 \(E\). For the prime below that bound we call
is_surjective
.
- reducible_primes()#
Return a list of the primes \(p\) such that the mod-\(p\) representation is reducible. For all other primes the representation is irreducible.
EXAMPLES:
sage: rho = EllipticCurve('225a').galois_representation() sage: rho.reducible_primes() [3]