Finding isogeny between two elliptic curves

Skip to first unread message

David Loeffler

Nov 25, 2021, 8:26:54 AM11/25/21
to sage-nt
If I have two elliptic curves over a number field, then Sage seems to know how to test if they are isogenous, and find the minimal degree of an isogeny between them; but is there any way of computing the actual isogeny?

Here's an example (the Q-curve 45.1-a1 over Q(sqrt(5)) and its Galois conjugate):

sage: K.<a> = NumberField(R([-1, -1, 1]))
sage: E = EllipticCurve([K([0,1]),K([1,1]),K([1,0]),K([-7739,-4364]),K([-296465,-255406])])
sage: si = K.Hom(K).list()[-1]
sage: E2 = E.base_extend(si)
sage: E.is_isogenous(E2)
sage: E.isogeny_degree(E2)

There is a method "E.isogeny(...)" but it wants an explicit kernel. The docstring says that the kernel will be computed automatically if I specify "kernel=None", but that seems to result in an error:

sage: E.isogeny(kernel=None, codomain=E2, degree=4)
ValueError: The two curves are not linked by a cyclic normalized isogeny of degree 4

I'm not sure what "normalized" means here, but there is definitely a cyclic degree 4 isogeny from E to E2. What do I need to do to persuade Sage to find it?

Regards, David

David Loeffler

Nov 25, 2021, 8:44:48 AM11/25/21
to sage-nt
PS. Sorry, copy-paste error, I missed out the first line of the example, which was the usual incantation "sage: R.<x> = PolynomialRing(QQ)".

You received this message because you are subscribed to the Google Groups "sage-nt" group.
To unsubscribe from this group and stop receiving emails from it, send an email to
To view this discussion on the web visit

John Cremona

Nov 25, 2021, 9:17:19 AM11/25/21
to sage-nt
"Normalised" means that the pull-back of the standard differential on
E2 equals that of E1, and not just a nonzero multiple. It's a concept
used mostly over finite fields, not over number fields where one
chooses instead to make the models nicest, e.g. minimal.

You are right that this should be easier. If you look at what
E1.is_isogenous(E2) actually does in the end, it computes the full
isogeny class of E1 and checks that E2 is in it (up to isomorphism).
Getting the isogeny when it is not of prime degree is tricky since in
computing the isogeny class we only compute isogenies of prime degree
and iterate, so isogenies of composite degree are only there

Someone has been working on isogenies recently, allowing for more
general ones, but I am not sure what additional functionality it will

If you do this:

sage: C = E.isogeny_class()
sage: [E3.is_isomorphic(E2) for E3 in C]
[False, False, False, False, False, False, False, False, False, True]
sage: C.matrix()
[ 1 2 4 8 32 8 16 32 16 4]
[ 2 1 2 4 16 4 8 16 8 2]
[ 4 2 1 2 8 2 4 8 4 4]
[ 8 4 2 1 16 4 8 16 8 8]
[32 16 8 16 1 4 2 4 8 32]
[ 8 4 2 4 4 1 2 4 2 8]
[16 8 4 8 2 2 1 2 4 16]
[32 16 8 16 4 4 2 1 8 32]
[16 8 4 8 8 2 4 8 1 16]
[ 4 2 4 8 32 8 16 32 16 1]

you see that your E2 is the list in the list and the degree is indeed
4, and that there is a chain of 2-isogenies from E to E2 via the
second curve in the list, and we could get hold of that curve and
bothe the 2-isogenies, but not (currently, as far as I know) the
4-isogeny itself, at least not automatically. If you ask me nicely I
could probably get it for you by working out the kernel polynomial....
as some factor of

sage: E.division_polynomial(4).factor()
(8) * (x - 175*a - 67) * (x - 323/4*a - 35/4) * (x + 27/2*a + 99/2) *
(x^2 + (82*a + 10)*x + 3783*a - 1030) * (x^4 + (164*a + 20)*x^3 +
(22698*a - 6180)*x^2 + (1083136*a - 301700)*x + 18036372*a - 3131750)

presumably the quadratic factor times one of the linears. Using the
middle one of the linears gives the 2-division polynomial, so that is
not it, and using either of the others gives a NotImplmentedError.

It certainly should work to do

sage: E.isogeny(codomain=E2, degree=4, kernel=None)

but that construction was implemented ages ago by someone who thought
that only normalised isogenies were of interest. Replacing E2 by a
suitably scaled model would work if one could work out what the
scaling factor should be. I tried 2,1/2,4, 1/4, 8, 1/8 and then gave
up as one should be able to work it out. For example,

sage: E.isogeny(codomain=E2.change_weierstrass_model(1/2), degree=4,

So I tried

sage: embs = K.embeddings(CC)
sage: (E.period_lattice(embs[0]).complex_area() /

hoping to see a simple rational number, but was disappointed. Perhaps
you can get the factor this way?


PS This isogeny class is in the LMFDB: see
> To view this discussion on the web visit

chris wuthrich

Nov 26, 2021, 4:14:14 AM11/26/21
to sage-nt

To add to John's answer. Even over Q, the issue appears

sage: E = EllipticCurve("11a1")
sage: A = EllipticCurve("11a2")
sage: A.isogeny(None,codomain=E,degree=5)

fails, but

sage: phi = E.isogeny(None,codomain=A,degree=5)
sage: phi.dual()
Isogeny of degree 5 from Elliptic Curve defined by y^2 + y = x^3 - x^2 - 7820*x - 263580 over Rational Field to Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational Field

Instead of "normalized" I would have called it "étale" there as these are the isogenies that extend to an étale map on the Néron model. (So I do think they are interesting over number fields too :) )
Now over Q when the degree is prime, one or the other is normalized and so you can always construct the isogeny in this way. It doesn't work between your curves linked with a 4-isogeny, but maybe with an intermediate step it could.

The implementation of isogenies is still very incomplete. A lot of code is there but it could be simplified and improved a lot. A shame that I am busy with many other things. Sorry.


David Loeffler

Nov 26, 2021, 8:02:00 AM11/26/21
to sage-nt
So it seems accessible to get Sage to find a chain of prime-degree isogenies, going from E1 to E2 via some intermediate curves (presumably using "isogenies_prime_degree"). That's sufficient for my application (indeed possibly better than a single composite isogeny, since the degrees of the polynomials will be much smaller this way). 

Thanks, John and Chris!

Best wishes, David

You received this message because you are subscribed to a topic in the Google Groups "sage-nt" group.
To unsubscribe from this topic, visit
To unsubscribe from this group and all its topics, send an email to
To view this discussion on the web visit
Reply all
Reply to author
0 new messages