# HG changeset patch
# User John Cremona
# Date 1374837115 3600
# Node ID 77f072e8ef8b032017f1622bd2905570406b87c1
# Parent de0b02bc6b89721b3d585c5f716a883d630bf9ef
Add elliptic curve isogenies for several new small degrees
diff git a/doc/en/reference/plane_curves/index.rst b/doc/en/reference/plane_curves/index.rst
 a/doc/en/reference/plane_curves/index.rst
+++ b/doc/en/reference/plane_curves/index.rst
@@ 31,6 +31,7 @@
sage/schemes/elliptic_curves/kodaira_symbol
sage/schemes/elliptic_curves/weierstrass_morphism
sage/schemes/elliptic_curves/ell_curve_isogeny
+ sage/schemes/elliptic_curves/isogeny_genus_0
sage/schemes/elliptic_curves/ell_wp
sage/schemes/elliptic_curves/period_lattice
sage/schemes/elliptic_curves/formal_group
diff git a/sage/schemes/elliptic_curves/ell_curve_isogeny.py b/sage/schemes/elliptic_curves/ell_curve_isogeny.py
 a/sage/schemes/elliptic_curves/ell_curve_isogeny.py
+++ b/sage/schemes/elliptic_curves/ell_curve_isogeny.py
@@ 40,7 +40,7 @@
.. Warning::
 Only cyclic isogenies are implemented (except for [2]). Some
+ Only cyclic, separable isogenies are implemented (except for [2]). Some
algorithms may need the isogeny to be normalized.
AUTHORS:
@@ 50,10 +50,6 @@
 Chris Wuthrich : 7/09: changes: add check of input, not the full list is needed.
10/09: eliminating some bugs.
 John Cremona and Jenny Cooley: 200907..11: implement `l`isogenies
 for `l` = 2, 3, 5, 7 13 (the genus 0 cases) and also for `l` = 11,
 17, 19, 37, 43, 67 or 163 over `\QQ` (the sporadic cases with only
 finitely many `j`invariants each).
"""
#*****************************************************************************
diff git a/sage/schemes/elliptic_curves/ell_field.py b/sage/schemes/elliptic_curves/ell_field.py
 a/sage/schemes/elliptic_curves/ell_field.py
+++ b/sage/schemes/elliptic_curves/ell_field.py
@@ 835,14 +835,14 @@
"""
return isogeny_codomain_from_kernel(self, kernel, degree=None)
 def isogenies_prime_degree(self, l=None):
+ def isogenies_prime_degree(self, l=None, max_l=31):
"""
 Generic code, valid for all fields, for those l for which the
 modular curve has genus 0.
+ Generic code, valid for all fields, for arbitrary prime `l` not equal to the characteristic.
INPUT:
  ``l``  either None, a prime or a list of primes, from [2,3,5,7,13].
+  ``l``  either None, a prime or a list of primes.
+  ``max_l``  a bound on the primes to be tested (ignored unless `l` is None).
OUTPUT:
@@ 851,7 +851,7 @@
METHOD:
Calls the generic function
 ``isogenies_prime_degree_genus_0()``. This requires that
+ ``isogenies_prime_degree()``. This requires that
certain operations have been implemented over the base field,
such as rootfinding for univariate polynomials.
@@ 860,7 +860,11 @@
sage: F = QQbar
sage: E = EllipticCurve(F, [1,18]); E
Elliptic Curve defined by y^2 = x^3 + x + 18 over Algebraic Field

+ sage: E.isogenies_prime_degree()
+ Traceback (most recent call last):
+ ...
+ NotImplementedError: This code could be implemented for QQbar, but has not been yet.
+
sage: F = CC
sage: E = EllipticCurve(F, [1,18]); E
Elliptic Curve defined by y^2 = x^3 + 1.00000000000000*x + 18.0000000000000 over Complex Field with 53 bits of precision
@@ 873,7 +877,7 @@
sage: E = EllipticCurve(GF(next_prime(1000000)), [7,8])
sage: E.isogenies_prime_degree()
 [Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 970389*x + 794257 over Finite Field of size 1000003, Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 29783*x + 206196 over Finite Field of size 1000003, Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 999960*x + 78 over Finite Field of size 1000003, Isogeny of degree 13 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 878063*x + 845666 over Finite Field of size 1000003, Isogeny of degree 13 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 375648*x + 342776 over Finite Field of size 1000003]
+ [Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 970389*x + 794257 over Finite Field of size 1000003, Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 29783*x + 206196 over Finite Field of size 1000003, Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 999960*x + 78 over Finite Field of size 1000003, Isogeny of degree 13 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 878063*x + 845666 over Finite Field of size 1000003, Isogeny of degree 13 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 375648*x + 342776 over Finite Field of size 1000003, Isogeny of degree 17 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 347438*x + 594729 over Finite Field of size 1000003, Isogeny of degree 17 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 674846*x + 7392 over Finite Field of size 1000003, Isogeny of degree 23 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 390065*x + 605596 over Finite Field of size 1000003]
sage: E.isogenies_prime_degree(2)
[Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 970389*x + 794257 over Finite Field of size 1000003, Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 29783*x + 206196 over Finite Field of size 1000003, Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 999960*x + 78 over Finite Field of size 1000003]
sage: E.isogenies_prime_degree(3)
@@ 892,19 +896,12 @@
Traceback (most recent call last):
...
ValueError: 4 is not prime.
 sage: E.isogenies_prime_degree([2, 29])
 Traceback (most recent call last):
 ...
 NotImplementedError: Over general fields, only isogenies of degree 2, 3, 5, 7 or 13 have been implemented.
sage: E.isogenies_prime_degree(4)
Traceback (most recent call last):
...
ValueError: 4 is not prime.
sage: E.isogenies_prime_degree(11)
 Traceback (most recent call last):
 ...
 NotImplementedError: Over general fields, only isogenies of degree 2, 3, 5, 7 or 13 have been implemented.

+ []
sage: E = EllipticCurve(GF(17),[2,0])
sage: E.isogenies_prime_degree(3)
[]
@@ 917,23 +914,20 @@
sage: E.isogenies_prime_degree(3)
[Isogeny of degree 3 from Elliptic Curve defined by y^2 = x^3 + 2*x + 8 over Finite Field in a of size 13^4 to Elliptic Curve defined by y^2 = x^3 + 9*x + 11 over Finite Field in a of size 13^4]
 sage: E.isogenies_prime_degree([2, 3, 5, 7, 13])
 Traceback (most recent call last):
 ...
 NotImplementedError: 2, 3, 5, 7 and 13isogenies are not yet implemented in characteristic 2 and 3, and when the characteristic is the same as the degree of the isogeny.
 sage: E.isogenies_prime_degree([2, 3, 5, 7])
 [Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 2*x + 8 over Finite Field in a of size 13^4 to Elliptic Curve defined by y^2 = x^3 + 7*x + 4 over Finite Field in a of size 13^4, Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 2*x + 8 over Finite Field in a of size 13^4 to Elliptic Curve defined by y^2 = x^3 + (8*a^3+2*a^2+7*a+5)*x + (12*a^3+3*a^2+4*a+4) over Finite Field in a of size 13^4, Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 2*x + 8 over Finite Field in a of size 13^4 to Elliptic Curve defined by y^2 = x^3 + (5*a^3+11*a^2+6*a+11)*x + (a^3+10*a^2+9*a) over Finite Field in a of size 13^4, Isogeny of degree 3 from Elliptic Curve defined by y^2 = x^3 + 2*x + 8 over Finite Field in a of size 13^4 to Elliptic Curve defined by y^2 = x^3 + 9*x + 11 over Finite Field in a of size 13^4, Isogeny of degree 7 from Elliptic Curve defined by y^2 = x^3 + 2*x + 8 over Finite Field in a of size 13^4 to Elliptic Curve defined by y^2 = x^3 + 3*x + 11 over Finite Field in a of size 13^4, Isogeny of degree 7 from Elliptic Curve defined by y^2 = x^3 + 2*x + 8 over Finite Field in a of size 13^4 to Elliptic Curve defined by y^2 = x^3 + 9*x + 2 over Finite Field in a of size 13^4]
+
+ Example to show that separable isogenies of degree equal to the characteristic are now implemented::
+
+ sage: E.isogenies_prime_degree(13)
+ [Isogeny of degree 13 from Elliptic Curve defined by y^2 = x^3 + 2*x + 8 over Finite Field in a of size 13^4 to Elliptic Curve defined by y^2 = x^3 + 6*x + 5 over Finite Field in a of size 13^4]
Examples over number fields (other than QQ)::
sage: QQroot2. = NumberField(x^22)
 sage: E = EllipticCurve(QQroot2,[1,1])
 sage: E.isogenies_prime_degree(11)
 Traceback (most recent call last):
 ...
 NotImplementedError: Over general fields, only isogenies of degree 2, 3, 5, 7 or 13 have been implemented.
 sage: E.isogenies_prime_degree(5)
 []
+ sage: E = EllipticCurve(QQroot2, j=8000)
+ sage: E.isogenies_prime_degree()
+ [Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + (150528000)*x + (629407744000) over Number Field in e with defining polynomial x^2  2 to Elliptic Curve defined by y^2 = x^3 + (602112000)*x + 5035261952000 over Number Field in e with defining polynomial x^2  2,
+ Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + (150528000)*x + (629407744000) over Number Field in e with defining polynomial x^2  2 to Elliptic Curve defined by y^2 = x^3 + (903168000*e1053696000)*x + (14161674240000*e23288086528000) over Number Field in e with defining polynomial x^2  2,
+ Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + (150528000)*x + (629407744000) over Number Field in e with defining polynomial x^2  2 to Elliptic Curve defined by y^2 = x^3 + (903168000*e1053696000)*x + (14161674240000*e23288086528000) over Number Field in e with defining polynomial x^2  2]
sage: E = EllipticCurve(QQroot2, [1,0,1,4, 6]); E
Elliptic Curve defined by y^2 + x*y + y = x^3 + 4*x + (6) over Number Field in e with defining polynomial x^2  2
@@ 950,23 +944,29 @@
if F == rings.QQbar:
raise NotImplementedError, "This code could be implemented for QQbar, but has not been yet."
 from isogeny_genus_0 import isogenies_prime_degree_genus_0
+ from isogeny_genus_0 import isogenies_prime_degree
if l is None:
 l = [2, 3, 5, 7, 13]
 if l in [2, 3, 5, 7, 13]:
 return isogenies_prime_degree_genus_0(self, l)
+ from sage.rings.all import prime_range
+ l = prime_range(max_l+1)
+
if type(l) != list:
+ try:
+ l = rings.ZZ(l)
+ except TypeError:
+ raise ValueError, "%s is not prime."%l
if l.is_prime():
 raise NotImplementedError, "Over general fields, only isogenies of degree 2, 3, 5, 7 or 13 have been implemented."
+ return isogenies_prime_degree(self, l)
else:
raise ValueError, "%s is not prime."%l
 isogs = []
 i = 0
 while i= (p1)/2

+
a = 2
while not is_semi_primitive(a,p):
a += 1
@@ 1653,6 +1698,12 @@
(list) a list of all isogenies of degree l.
+ .. note::
+
+ This function works for any prime `l`. Normally one should use
+ the function :meth:`isogenies_prime_degree` which uses special
+ functions for certain small primes.
+
EXAMPLES::
sage: from sage.schemes.elliptic_curves.isogeny_genus_0 import isogenies_prime_degree_general
@@ 1673,12 +1724,45 @@
sage: E = EllipticCurve([0, 1, 0, 6288, 211072])
sage: isogenies_prime_degree_general(E, 37) # long time (10s)
[Isogeny of degree 37 from Elliptic Curve defined by y^2 = x^3  x^2  6288*x + 211072 over Rational Field to Elliptic Curve defined by y^2 = x^3  x^2  163137088*x  801950801728 over Rational Field]
+
sage: E = EllipticCurve([3440, 77658])
sage: isogenies_prime_degree_general(E, 43) # long time (16s)
[Isogeny of degree 43 from Elliptic Curve defined by y^2 = x^3  3440*x + 77658 over Rational Field to Elliptic Curve defined by y^2 = x^3  6360560*x  6174354606 over Rational Field]
+
+ Isogenies of degree equal to the characteristic are computed (but
+ only the separable isogeny). In the following example we consider
+ an elliptic curve which is supersingular in characteristic 2
+ only::
+
+ sage: from sage.schemes.elliptic_curves.isogeny_genus_0 import isogenies_prime_degree_general
+ sage: ainvs = (0,1,1,1,1)
+ sage: for l in prime_range(50):
+ ....: E = EllipticCurve(GF(l),ainvs)
+ ....: isogenies_prime_degree_general(E,l)
+ []
+ [Isogeny of degree 3 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 2*x + 2 over Finite Field of size 3 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + x over Finite Field of size 3]
+ [Isogeny of degree 5 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 4*x + 4 over Finite Field of size 5 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 4*x + 4 over Finite Field of size 5]
+ [Isogeny of degree 7 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 6*x + 6 over Finite Field of size 7 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 4 over Finite Field of size 7]
+ [Isogeny of degree 11 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 10*x + 10 over Finite Field of size 11 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + x + 1 over Finite Field of size 11]
+ [Isogeny of degree 13 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 12*x + 12 over Finite Field of size 13 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 12*x + 12 over Finite Field of size 13]
+ [Isogeny of degree 17 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 16*x + 16 over Finite Field of size 17 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 15 over Finite Field of size 17]
+ [Isogeny of degree 19 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 18*x + 18 over Finite Field of size 19 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 3*x + 12 over Finite Field of size 19]
+ [Isogeny of degree 23 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 22*x + 22 over Finite Field of size 23 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 22*x + 22 over Finite Field of size 23]
+ [Isogeny of degree 29 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 28*x + 28 over Finite Field of size 29 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 7*x + 27 over Finite Field of size 29]
+ [Isogeny of degree 31 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 30*x + 30 over Finite Field of size 31 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 15*x + 16 over Finite Field of size 31]
+ [Isogeny of degree 37 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 36*x + 36 over Finite Field of size 37 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 16*x + 17 over Finite Field of size 37]
+ [Isogeny of degree 41 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 40*x + 40 over Finite Field of size 41 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 33*x + 16 over Finite Field of size 41]
+ [Isogeny of degree 43 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 42*x + 42 over Finite Field of size 43 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 36 over Finite Field of size 43]
+ [Isogeny of degree 47 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 46*x + 46 over Finite Field of size 47 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 42*x + 34 over Finite Field of size 47]
+
"""
if not l.is_prime():
 raise ValueError, "l is not prime"
+ raise ValueError("%s is not prime."%l)
+ if l==2:
+ return isogenies_2(E)
+ if l==3:
+ return isogenies_3(E)
+
psi_l = E.division_polynomial(l)
factors = [h for h,e in psi_l.factor() if (l1)/2 % h.degree() == 0]
a = least_semi_primitive(l)
@@ 1702,5 +1786,100 @@
factors.remove(g)
if mult(S[1]) == f:
ker.append(prod(S))
 isogs = [E.isogeny(k) for k in ker]
 return isogs
+ return [E.isogeny(k) for k in ker]
+
+def isogenies_prime_degree(E, l):
+ """
+ Returns a list of ``l`` isogenies with domain ``E``.
+
+ INPUT:
+
+  ``E``  an elliptic curve.
+
+  ``l``  a prime.
+
+ OUTPUT:
+
+ (list) a list of all isogenies of degree `l`. If the
+ characteristic is `l` then only separable isogenies are
+ constructed.
+
+ EXAMPLES::
+
+ sage: from sage.schemes.elliptic_curves.isogeny_genus_0 import isogenies_prime_degree
+ sage: E = EllipticCurve_from_j(GF(2^6,'a')(1))
+ sage: isogenies_prime_degree(E, 7)
+ [Isogeny of degree 7 from Elliptic Curve defined by y^2 + x*y = x^3 + 1 over Finite Field in a of size 2^6 to Elliptic Curve defined by y^2 + x*y = x^3 + x over Finite Field in a of size 2^6]
+ sage: E = EllipticCurve_from_j(GF(3^12,'a')(2))
+ sage: isogenies_prime_degree(E, 17)
+ [Isogeny of degree 17 from Elliptic Curve defined by y^2 = x^3 + 2*x^2 + 2 over Finite Field in a of size 3^12 to Elliptic Curve defined by y^2 = x^3 + 2*x^2 + 2*x over Finite Field in a of size 3^12, Isogeny of degree 17 from Elliptic Curve defined by y^2 = x^3 + 2*x^2 + 2 over Finite Field in a of size 3^12 to Elliptic Curve defined by y^2 = x^3 + 2*x^2 + x + 2 over Finite Field in a of size 3^12]
+ sage: E = EllipticCurve('50a1')
+ sage: isogenies_prime_degree(E, 3)
+ [Isogeny of degree 3 from Elliptic Curve defined by y^2 + x*y + y = x^3  x  2 over Rational Field to Elliptic Curve defined by y^2 + x*y + y = x^3  126*x  552 over Rational Field]
+ sage: isogenies_prime_degree(E, 5)
+ [Isogeny of degree 5 from Elliptic Curve defined by y^2 + x*y + y = x^3  x  2 over Rational Field to Elliptic Curve defined by y^2 + x*y + y = x^3  76*x + 298 over Rational Field]
+ sage: E = EllipticCurve([0, 0, 1, 1862, 30956])
+ sage: isogenies_prime_degree(E, 19)
+ [Isogeny of degree 19 from Elliptic Curve defined by y^2 + y = x^3  1862*x  30956 over Rational Field to Elliptic Curve defined by y^2 + y = x^3  672182*x + 212325489 over Rational Field]
+ sage: E = EllipticCurve([0, 1, 0, 6288, 211072])
+ sage: isogenies_prime_degree(E, 37)
+ [Isogeny of degree 37 from Elliptic Curve defined by y^2 = x^3  x^2  6288*x + 211072 over Rational Field to Elliptic Curve defined by y^2 = x^3  x^2  163137088*x  801950801728 over Rational Field]
+
+
+ Isogenies of degree equal to the characteristic are computed (but
+ only the separable isogeny). In the following example we consider
+ an elliptic curve which is supersingular in characteristic 2
+ only::
+
+ sage: from sage.schemes.elliptic_curves.isogeny_genus_0 import isogenies_prime_degree
+ sage: ainvs = (0,1,1,1,1)
+ sage: for l in prime_range(50):
+ ....: E = EllipticCurve(GF(l),ainvs)
+ ....: isogenies_prime_degree(E,l)
+ []
+ [Isogeny of degree 3 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 2*x + 2 over Finite Field of size 3 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + x over Finite Field of size 3]
+ [Isogeny of degree 5 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 4*x + 4 over Finite Field of size 5 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 4*x + 4 over Finite Field of size 5]
+ [Isogeny of degree 7 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 6*x + 6 over Finite Field of size 7 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 4 over Finite Field of size 7]
+ [Isogeny of degree 11 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 10*x + 10 over Finite Field of size 11 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + x + 1 over Finite Field of size 11]
+ [Isogeny of degree 13 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 12*x + 12 over Finite Field of size 13 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 12*x + 12 over Finite Field of size 13]
+ [Isogeny of degree 17 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 16*x + 16 over Finite Field of size 17 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 15 over Finite Field of size 17]
+ [Isogeny of degree 19 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 18*x + 18 over Finite Field of size 19 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 3*x + 12 over Finite Field of size 19]
+ [Isogeny of degree 23 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 22*x + 22 over Finite Field of size 23 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 22*x + 22 over Finite Field of size 23]
+ [Isogeny of degree 29 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 28*x + 28 over Finite Field of size 29 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 7*x + 27 over Finite Field of size 29]
+ [Isogeny of degree 31 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 30*x + 30 over Finite Field of size 31 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 15*x + 16 over Finite Field of size 31]
+ [Isogeny of degree 37 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 36*x + 36 over Finite Field of size 37 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 16*x + 17 over Finite Field of size 37]
+ [Isogeny of degree 41 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 40*x + 40 over Finite Field of size 41 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 33*x + 16 over Finite Field of size 41]
+ [Isogeny of degree 43 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 42*x + 42 over Finite Field of size 43 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 36 over Finite Field of size 43]
+ [Isogeny of degree 47 from Elliptic Curve defined by y^2 + y = x^3 + x^2 + 46*x + 46 over Finite Field of size 47 to Elliptic Curve defined by y^2 + y = x^3 + x^2 + 42*x + 34 over Finite Field of size 47]
+
+ Note that the computation is faster for degrees equal to one of
+ the genus 0 primes (2, 3, 5, 7, 13) or one of the hyperelliptic
+ primes (11, 17, 19, 23, 29, 31, 41, 47, 59, 71) than when the
+ generic code must be used::
+
+ sage: E = EllipticCurve(GF(101), [3440, 77658])
+ sage: E.isogenies_prime_degree(71) # fast
+ []
+ sage: E.isogenies_prime_degree(73) # not tested (very long time: 32s)
+ []
+
+
+ """
+ if not l.is_prime():
+ raise ValueError("%s is not prime."%l)
+ if l==2:
+ return isogenies_2(E)
+ if l==3:
+ return isogenies_3(E)
+
+ p = E.base_ring().characteristic()
+ if l==p:
+ return isogenies_prime_degree_general(E,l)
+
+ if l in [5,7,13] and not p in [2,3]:
+ return isogenies_prime_degree_genus_0(E,l)
+
+ if l in hyperelliptic_primes and not p in [2,3]:
+ return isogenies_prime_degree_genus_plus_0(E,l)
+
+ return isogenies_prime_degree_general(E,l)