Bill Allombert on Mon, 27 Nov 2023 18:46:34 +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


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.