| Bill Allombert on Sat, 02 Mar 2024 18:03:30 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: a hopeful request |
On Fri, Mar 01, 2024 at 04:56:23PM -0800, American Citizen wrote: > To all: > > I have been looking for this for a long time. > > Suppose I have an elliptic curve in Weierstrass format [a1,a2,a3,a4,a6] and > a two-covering or quartic a*x^4 + b*x^3 + c*x^2 + d*x + e and they share the > same invariants, the I invariant and the J invariant. > > Is it possible to develop the forward and inverse maps for points on either > the elliptic curve mapping to the quartic two-cover, or the points on the > two-cover mapping back to the elliptic curve? > > I would like to obtain the forward and inverse maps for points on either the > elliptic curve -> quartic or quartic -> elliptic curve Please find the following GP script with a function quartic_to_ellmap(Q) that given a quartic y^2=q(x), returns [E,f,g] where E is an elliptic curve, f a map from q to E and g a (one-to-many) map from E to q. There is a test. Cheers, Bill.
quartic_IJ(g)=
{
my([a,b,c,d,e]=Vec(g));
my(ae = a*e, bd = b*d, c2 = c^2, d2=d^2, b2 = b^2);
my(iI = 12*ae - 3*bd + c2);
my(iJ = (72*ae + 9*bd - 2*c2)*c - 27*a*d2 - 27*b2*e);
[iI,iJ];
}
IJ_to_ell(V)= ellinit(-27*V);
quartic_to_ell(g)=IJ_to_ell(quartic_IJ(g));
quartic_disc(g)=
{
my([iI,iJ]=quartic_IJ(g));
4*iI^3-iJ^2
}
quartic_hessian(g)=
{
my([A,B,C,D,E]=Vec(g));
Pol([(3*B^2 - 8*A*C), (4*B*C - 24*A*D), (4*C^2 - 6*B*D - 48*A*E), (4*C*D - 24*B*E), 3*D^2 - 8*C*E]);
}
quartic_bracket(g1,g2)=
{
my(h1=quartic_hessian(g1),h2=quartic_hessian(g2));
g1*subst(h2,x,y)-subst(g2,x,y)*h1;
}
quartic_isom(g1, g2)=
{
my(b = quartic_bracket(g1,g2));
my(S=select(f->poldegree(f)==1,factor(b)[,1]));
if (#S==0, return(0));
my([a,b,c,d]=concat([Vecrev(simplify(x),2)|x<-Vecrev(S[1],2)]));
[-c,-a;d,b];
}
quartic_to_g4g6(g)=
{
my([a,b,c,d,e]=Vec(g));
my(g4 = (3*b^2 - 8*a*c)*X^4 + 4*(b*c - 6*a*d)*X^3*Y + 2*(2*c^2 - 24*a*e - 3*b*d)*X^2*Y^2 + 4*(c*d - 6*b*e)*X*Y^3 + (3*d^2 - 8*c*e)*Y^4);
my(g6 = (b^3 + 8*a^2*d - 4*a*b*c)*X^6 + 2*(16*a^2*e + 2*a*b*d - 4*a*c^2 + b^2*c)*X^5*Y + 5*(8*a*b*e + b^2*d - 4*a*c*d)*X^4*Y^2 + 20*(b^2*e - a*d^2)*X^3*Y^3 - 5*(8*a*d*e + b*d^2 - 4*b*c*e)*X^2*Y^4 - 2*(16*a*e^2 + 2*b*d*e - 4*c^2*e + c*d^2)*X*Y^5 - (d^3 + 8*b*e^2 - 4*c*d*e)*Y^6);
[g4,g6];
}
elltocover(Q,F,P)=
{
my(S,T,A);
S = simplify((F[1]-P[1]*Q)%('y^2-Q));
T = simplify(F[2]%('y^2-Q));
A = apply(x->[x,if(1,my(R=subst(T-P[2]*'y*Q,'X,x));-polcoeff(R,0)/polcoeff(R,1))],nfroots(,S));
if (poldegree(S)<4, my(R=T-P[2]*'y*Q, Y = -pollead(polcoeff(R,0))/pollead(polcoeff(R,1)));
A=concat(A,[[1,Y,0]]));
A;
}
quartic_to_ellmap(q)=
{
my(E=quartic_to_ell(q),[g4,g6]=quartic_to_g4g6(q));
my(p =substvec(g4,[X,Y],[1,0]), r = substvec(g6,[X,Y],[1,0]));
my(f=P->
if(#P==2,[3*substvec(g4,[X,Y],[P[1],1])/(2*P[2])^2, 27*substvec(g6,[X,Y],[P[1],1])/(2*P[2])^3],
#P==3,[3*p/(2*P[2])^2, 27*r/(2*P[2])^3]));
my(Q=subst(q,variable(q),X),F=subst([3*g4/4,27*g6/8],Y,1));
my(g=P->elltocover(Q,F,P));
[E,f,g]
}
test()=
{
[E,f,g]=quartic_to_ellmap(-33*x^4+85*x^3+198*x^2-85*x-33);
P=f([-186067/136146,22644340289/2059525924]);
if(!ellisoncurve(E,P),error("f not correct"));
[hyperellisoncurve(-33*x^4+85*x^3+198*x^2-85*x-33,Q)|Q<-g(P)]
}