American Citizen on Mon, 27 Nov 2023 21:26:20 +0100


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: general educational question on elliptic curve isogenies and moving points around


Bill

Thanks for that sufficient reply. I was not aware that I didn't have to move to the minimal model of the curve.

However past experience has shown me that normal Gaussian reduction (via the ellheightmatrix) doesn't quite work right for the non-minimal curves Mordell-Weil basis set, sometimes Minkowski reduction is necessary to find the smallest MW basis (how we define "smallest" is a story in itself)

So I guess I got into a habit of using the minimal form for the curve.

Randall

On 11/27/23 09:46, Bill Allombert wrote:
On Sun, Nov 26, 2023 at 05:07:18PM -0800, American Citizen wrote:
Bill

What I am expecting as a function operator is something like

map_iso(F,E,pt) = [operate_on_x, operate_on_y] where x=p[1] and y=p[2] using
the f,g,h polynomials from the ellisomat results. derived from the minimal
model maps of the elliptic curves F and E.

I would like to see the operator function f given like a GP-Pari function
say q = f(F,E,p) which outputs point q on F.

The way I worked this was take E (given elliptic curve), find M (minimal
model of E), move points to M, then find N (minimal model of F) and
carefully compare the ellisomat results for both elliptic curves M and N, to
find a match on the E(a4,a6) curves. Once this is found,  I move points on E
to M, then move points from M to N, then move the points from N to F. As you
all know, this has to be carefully done.
There is no need to take minimal models.

You can do this:

\\ find the curve in S isomorphic to F
findisom(S,F)=
{
   foreach(S,s,
     my(urst=ellisisom(ellinit(s[1]),F));
     if(urst,return([s[2],s[3],urst])));
}

\\ return [f,fd], f isogeny from E to F, and fd its dual.
isog(E,F)=
{
   my(S=ellisomat(E)[1]);
   my([f,fd,urst]=findisom(S,F));
   [P->ellchangepoint(ellisogenyapply(f,P),urst),
    P->ellisogenyapply(fd,ellchangepointinv(P,urst))];
}

For example:

? E=ellinit(K[1]);
? F=ellinit(K[2]);
? P=elltors(E).gen[1]
%3 = [-221813002148660,28351785859134866849500]
? [f,fd]=isog(E,F);
? Q=f(P)
%5 = [833820316449280,-7588256062930707186440]
? ellisoncurve(F,Q)
%6 = 1
? ellorder(F,Q)
%7 = 4
? R=fd(Q)
%8 = [990529152804880,-495264576402440]
? R==ellmul(E,P,2)
%9 = 1

Cheers,
Bill.