hyperelldisc([x^3,1])
hyperelldisc(x^5+1)
hyperelldisc(3*x^5+7)

hyperellisoncurve([2*x^6+3*x^5+x^4+x^3-x,x^3+1],[1/3,-14/27])
hyperellisoncurve([2*x^6+3*x^5+x^4+x^3-x,x^3+1],[1/3,14/27])

genus(W)=
{
  my([P,Q] = W);
  my(R = 4*P+Q^2); (poldegree(R)+1)\2-1;
}

varchange(W,C)=
{
  my([P,Q] = W, g=genus(W), [e,M,H] = C);
  my(ga=max((poldegree(P)+1)\2,poldegree(Q))-1);
  my([a,c]=M[,1],[b,d]=M[,2]);
  my(U=(c*x+d)^(ga-g));
  P=subst(P,x,(a*x+b)/(c*x+d))*(c*x+d)^(2*ga+2);
  Q=subst(Q,x,(a*x+b)/(c*x+d))*(c*x+d)^(ga+1);
  [(P  -Q*H-H^2)/e^2/U^2, (Q+2*H)/e/U];
}

pointchange(Po,C)=
{
  my([x,y]=Po);
  my(g=genus(W), [e,M,H] = C);
  my([a,c]=M[,1],[b,d]=M[,2]);
  if(c*x+d==0,return([0]));
  my(X=(a*x+b)/(c*x+d));
  my(Y=(e*y+subst(H,'x,x))/(c*x+d)^(g+1));
  [X,Y];
}

W=[subst(polrecip(2176782336*x^6+60466176*x^5+1296*x^2+1),x,81*x+3)-x^6,2*x^3];
[W2,C]= hyperellminimalmodel(W);
P=[241/771,-3207473/458314011];
Q=pointchange(P,C)
hyperellisoncurve(W,Q)
hyperellminimaldisc(W)
W=1593*x^6+6750*x^5+11817*x^4+10952*x^3+5672*x^2+1560*x+180;
hyperellminimalmodel(W)
hyperellminimaldisc(W)
W=[subst(x^6+2*x^5+x^4+2*x^3+6*x^2+4*x+1,x,(9*x+19)/(3*x+27))*(3*x+27)^6-9*x^10,6*x^5];
C=hyperellminimalmodel(W); varchange(W,C[2])==C[1]

test(g,pp=3,u=2,B1=10,B2=B1) =
{
  my(W = pp^u*[random(-B1*x^(2*g+2)),random(-B2*x^(g+1))]);
  if(hyperelldisc(W)==0 || genus(W)!=g,return);
  my(M = matrix(2,2,i,j,random(-B1)), de=matdet(M));
  if(de==0,return);
  my(F=factor(2*pp*abs(de))[,1]);
  my(Wt = varchange(W,[1,M,random(-B*x^(g+1))]));
  my(R = hyperellminimalmodel(W,F));
  if(denominator(content(apply(content,R[1])))>1,error([W,R]));
  my(Rt = hyperellminimalmodel(Wt,F));
  if(denominator(content(apply(content,Rt[1])))>1,error([Wt,Rt]));
  if (varchange(W,R[2])!=R[1],error("basis change",[W]));
  if (varchange(Wt,Rt[2])!=Rt[1],error("basis change",[Wt]));
  my(D1 = hyperelldisc(R[1]));
  my(Dt = hyperelldisc(Rt[1]));
  if(D1 != Dt,error("bad disc:",[W,Wt,R,Rt,D1,Dt]));
}

for(g=1,2, for(u=0,3, for(i=1,200,test(g,3,u,10,10);test(g,3,u,10,1))));
