30 views

Skip to first unread message

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)

True

sage: E.isogeny_degree(E2)

4

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

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 sage-nt+u...@googlegroups.com.

To view this discussion on the web visit https://groups.google.com/d/msgid/sage-nt/8ebce2b8-316c-4765-8236-e729f7b67b8dn%40googlegroups.com.

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

implicitly.

Someone has been working on isogenies recently, allowing for more

general ones, but I am not sure what additional functionality it will

provide.

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.

Sorry!

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,

kernel=None)

So I tried

sage: embs = K.embeddings(CC)

sage: (E.period_lattice(embs[0]).complex_area() /

E2.period_lattice(embs[0]).complex_area())

6.85410196624968

hoping to see a simple rational number, but was disappointed. Perhaps

you can get the factor this way?

John

PS This isogeny class is in the LMFDB: see

http://www.lmfdb.org/EllipticCurve/2.2.5.1/45.1/a/

> To view this discussion on the web visit https://groups.google.com/d/msgid/sage-nt/CANDN%3Dhyd3TeUXPx5VamBkKSDA96epFfc41Yjphptb9pRwWMfZw%40mail.gmail.com.

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

implicitly.

Someone has been working on isogenies recently, allowing for more

general ones, but I am not sure what additional functionality it will

provide.

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.

Sorry!

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,

kernel=None)

So I tried

sage: embs = K.embeddings(CC)

sage: (E.period_lattice(embs[0]).complex_area() /

E2.period_lattice(embs[0]).complex_area())

6.85410196624968

hoping to see a simple rational number, but was disappointed. Perhaps

you can get the factor this way?

John

PS This isogeny class is in the LMFDB: see

http://www.lmfdb.org/EllipticCurve/2.2.5.1/45.1/a/

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

works.

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.

Chris

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 https://groups.google.com/d/topic/sage-nt/hy4-Q4bD2gM/unsubscribe.

To unsubscribe from this group and all its topics, send an email to sage-nt+u...@googlegroups.com.

To view this discussion on the web visit https://groups.google.com/d/msgid/sage-nt/2671bcec-4b56-43e5-88c5-a67f451b1e90n%40googlegroups.com.

Reply all

Reply to author

Forward

0 new messages

Search

Clear search

Close search

Google apps

Main menu