default(parisize,"48M");
X;Y;
eq(E) = Y^2+E.a1*X*Y+E.a3*Y - (X^3 + E.a2*X^2 + E.a4*X + E.a6);
checkiso(E1,E2,iso)=
{
  my(EE1 = eq(E1));
  my([x,y,z]=substvec(iso,['x,'y],Mod([X,Y], EE1)));
  my(z2=sqr(z),z4=sqr(z2),z6=z2*z4);
  lift(y^2+E2.a1*x*y*z+E2.a3*y*z*z2 - (x^3+E2.a2*x^2*z2+E2.a4*x*z4+E2.a6*z^6));
}
checkisov(E,V)=
{
  apply(v->my(E2=ellinit(v[1]));
    checkiso(E,E2,v[2]), V);
}
check(V)=
{
  for(i=1,#V,
    my(E=ellinit([V[i]]));
    my(Et=ellminimalmodel(elltwist(E,ellminimaltwist(E,1))));
    my([L,M]=ellisomat(Et), [L2, M2] = ellisomat(Et,, 1));
    if (M!=M2, error("ellisomat:",i));
    print(V[i],":",M,":",checkisov(Et,L)));
}

check([-2^15,-11^2,-11*131^3,-17^2*101^3/2,-17*373^3*2^-17,-96^3,-7*11^3,-7*137^3*2083^3,-960^3,-5280^3,-640320^3])
check([0,1728,-3375, 8000, 54000, 287496, -12288000, 16581375])
check([9938375/21952, 111284641/50625, -10218313/17576, -25/2]);
ellisomat(ellinit([0,-1,1,-10,-20]))
ellisomat(ellinit([1,0,1,4,-6]),2)
ellisomat(ellinit([1,0,1,4,-6]),3)
chk(E)=
{
  my([L,M]=ellisomat(E));print(M);apply(l->checkiso(E,ellinit(l[1]),l[2]),L);
}
nf=nfinit(phi^2-phi-1);
chk(ellinit([0,1,phi,-47*phi+31,560*phi-803],nf))
chk(ellinit([phi+1,1,phi+1,6*phi-1,13*phi+2],nf))
nf=nfinit(a^2-2);
chk(ellinit([a,-1,0,18,46],nf))
ellisomat(ellinit([-824740032823875,9115932407325507114750],nfinit(y-16581375)),1)[2]

E=ellinit([-1880854563/4225,6682049310818/274625]);
ellisomat(E,,1)[2]
E=ellinit([-1880854563/4225,6682049310818/274625],nfinit(a^2+1));
ellisomat(E,,1)[2]
my(s=7,t=(48*s^2+32)/(s^2-2));E=ellinit(ellfromj(t^3/(t+16)),bnfinit(a^2-2));
ellisomat(E,,1)[2]
E=ellinit([1,a-1,a+1,2510*a-4889,87171*a-107201],nfinit(a^2-a+3));
ellisomat(E,,1)[2]

\\ From Barinder Banwait:
nf=nfinit(w^2-5);
E=ellinit([95673435586560*w - 213932305612800],nf);
ellisomat(E,,1)[2]
E=ellinit([184068066743177379840*w - 411588709724712960000],nf);
ellisomat(E,,1)[2]

E=ellinit([1,0,1,4,-6]);
ellisotree(E)
ellisotree(ellisomat(E,2,1))
ellisotree(ellisomat(E,2))
ellisotree(ellisomat(E,3,1))
ellisotree(ellisomat(E,,1))

\\ ERRORS
ellisomat(ellinit([1,0],nfinit(a^2+1)))
ellisomat(ellinit([-824740032823875,9115932407325507114750],nfinit(x-16581375)))
ellisomat(ellinit([-824740032823875,9115932407325507114750],nfinit(y-16581375)))
