American Citizen on Sun, 29 Jun 2025 18:38:15 +0200


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

real point to algebraic point


Hello everyone:

I believe I have found a way to find the algebraic point for a given real point on an elliptic curve.

The first function of the gp pari code is courtesy of Karim Belabas and the second function is mine, after I realized using the polynomials from polred() and trying combinations of them using polcompositum to create a 4th degree field would work since all algebraic points on a real elliptic curve have x abcissa in degree 2 and y ordinate in degree 4 (please correct me if I am wrong, but I am talking about elliptic curves in Q)

Here's the script:

nfrecognize(nf, z, j = 1) =
{
  my(M = Mat(apply(conjvec, Mod(nf.zk, nf.pol))));
  \\ N.B. we actually have M = nf[5][1]
  my(L = lindep(concat(nf[5][1][j,], z)));
  my(a = L[#L]);
  M=M;
  if (abs(a) != 1, error("Failed to recognize ", z);return(0),);
  if (a == 1, L = -L);
  nfbasistoalg(nf, L[1..-2]);
}

{real_pt_to_alg(Pt)=
my(X,Y,poly_x,poly_y,red_x,red_y,poly_2,poly_4,P,a,b,K,L,M,sztwo,szfour,algpts);
if(type(Pt)!="t_VEC",return([]););
X=Pt[1];
Y=Pt[2];
poly_x=algdep(X,2);
poly_y=algdep(Y,4);
red_x=polred(poly_x);
red_y=polred(poly_y);
poly_2=Set();
poly_4=Set();
\\ work on reduced polys for x first
for(i=1,#red_x,
 if(poldegree(red_x[i])==2,poly_2=setunion(poly_2,[red_x[i]]));
 if(poldegree(red_x[i])==4,poly_4=setunion(poly_4,[red_x[i]]));
);
\\ work on reduced polys for y next
for(i=1,#red_y,
 if(poldegree(red_y[i])==2,poly_2=setunion(poly_2,[red_y[i]]));
 if(poldegree(red_y[i])==4,poly_4=setunion(poly_4,[red_y[i]]));
);
sztwo=#poly_2;
if(sztwo>1,
 for(i=1,sztwo-1,
  for(j=i+1,sztwo,
    [P,a,b]=polcompositum(poly_2[i],poly_2[j],1)[1];
    if(poldegree(P)==4, poly_4=setunion(poly_4,[P]));
  );
 );
);
szfour=#poly_4;
algpts=Set();
for(root=1,4,
  for(i=1,szfour,
    K=nfinit(poly_4[i]);
    L=nfrecognize(K,X,root);
    M=nfrecognize(K,Y,root);
    if((L!=0)&&(M!=0), algpts=setunion(algpts,[[L,M]]));
  );
);
return(algpts);
}

You are welcome to use this, if you need it. And yes, number fields are fascinating and fun!

Randall