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