"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/

On Thu, 25 Nov 2021 at 13:44, David Loeffler <[email protected]> wrote:
>
> PS. Sorry, copy-paste error, I missed out the first line of the example, 
> which was the usual incantation "sage: R.<x> = PolynomialRing(QQ)".
>
> On Thu, 25 Nov 2021 at 13:26, David Loeffler <[email protected]> wrote:
>>
>> 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
>>
>> --
>> 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 [email protected].
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/sage-nt/8ebce2b8-316c-4765-8236-e729f7b67b8dn%40googlegroups.com.
>
> --
> 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 [email protected].
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/sage-nt/CANDN%3Dhyd3TeUXPx5VamBkKSDA96epFfc41Yjphptb9pRwWMfZw%40mail.gmail.com.

-- 
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sage-nt/CAD0p0K6wW%3DJ4Tq5JDM0LpRqcM944uXdVbeiD8yHKdPAkKesMww%40mail.gmail.com.

Reply via email to