Bill Allombert on Wed, 05 Aug 2015 22:53:22 +0200

 new GP function ellisomat

```Dear PARI developers,

I have added a new experimental GP function ellisomat(), to compute the isogeny
matrix of an elliptict curve, but it actually do more.

For example:
? E=ellinit("11a1");
? [L,M] = ellisomat(E); M
%2 = [1,5,5;5,1,25;5,25,1]

(So E is 5-isogenous to two curves E2 and E3 which are 25-isogenous).
Of course E2 and E3 are isomorphic to the curves "11a2" and "11a3" in John
Cremona's table, but the function also work for curves too large to be in the
table.
For example the curve E2 is given by [a4,a6] as follow:
? L[2][1]
%3 = [-23461/3,-28748141/108]
? ellidentify(ellinit(L[2][1]))
%4 = [["11a2",[0,-1,1,-7820,-263580],[]],[1,-1/3,0,1/2]]

Furthermore, let P a 5-torsion point on E:
? P=elltors(E)[3][1]
%3 = [5,5]
The isogeny from E to E2 is give by
? iso2=L[2][2]
%4 = [x^5-127/3*x^4+2177*x^3-91861/3*x^2+171618*x-980197/3,(y+1/2)*x^6+(-63*y-63/2)*x^5+(y+1/2)*x^4+(1977*y+1977/2)*x^3+(7626*y+3813)*x^2+(11654*y+5827)*x+(6682*y+3341),x^2-21*x+80]

and
? ellisogenyapply(iso2,P)
%5 = [0]
So P is in the kernel of the isogeny.
For E3 we get the following model
? L[3][1]
%6 = [-625/3,296875/108]
The isogeny from E to E3 is given by
? iso3=L[3][2]
%7 = [x^5+5/3*x^4+85/3*x^3-935/3*x^2-2245/3*x-3166/3,(y+1/2)*x^6+(3*y+3/2)*x^5+(-54*y-27)*x^4+(613*y+613/2)*x^3+(1752*y+876)*x^2+(8585*y+8585/2)*x+(6451*y+6451/2),x^2+x-29/5]

and

? P3=ellisogenyapply(iso3,P)
%8 = [-25/3,125/2]
is a rational point on E3:
? E3=ellinit(L[3][1]);ellisoncurve(E3,P3)
%9 = 1
? ellorder(E3,P3)
%22 = 5

which is of order 5 as expected.

This is the documentation:

Given an elliptic curve E defined over Q, compute representatives of the
isomorphism classes of elliptic curves isogenous to E.  The function returns a
vector [L,M] where L is a list of couples [E_i, f_i], where E_i is an elliptic
curve and f_i is a rationale isogeny from E to E_i, and M is the matrix such
that M_{i,j} is the degree of the isogeny between E_i and E_j.  Furthermore the
first curve E_1 is isomorphic to E by f_1.

Example

? E = ellinit("14a1");
? [L,M]=ellisomat(E);
? L
? apply(x->x[1],L)
%3 = [[215/48,-5291/864],[-675/16,6831/32],[-8185/48,-742643/864],
? L[2]
%4 = [[-675/16,6831/32],[x^3+3/4*x^2+19/2*x-311/12,
1/2*x^4+(y+1)*x^3+(y-4)*x^2+(-9*y+23)*x+(55*y+55/2),x+1/3]]
? M
%5 = [1,3,3,2,6,6;3,1,9,6,2,18;3,9,1,6,18,2;2,6,6,1,3,3;6,2,18,3,1,9;6,18,2,3,9,1]
? apply(E->ellidentify(ellinit(E[1]))[1][1],L)
%6 = ["14a1","14a4","14a3","14a2","14a6","14a5"]

Cheers,
Bill.

```