/* * de3x4m2y2m1.asir * * calculate birational map between y^2=6x^4-2 and y^2=x^3+48x */ /* load sp*/ load("sp"); /* A=sqrt(1785) */ A=newalg(x^2-6); B=-A; C=6*x^4-2-y^2; E=x^3+48*x-y^2; E2=x^3-12*x-y^2; X=-2*A*y+2*6*x^2; Y=4*6*x*y-4*6*A*x^3; /* \phi */ def phi(X,Y) { A=newalg(x^2-6); U=simpalg(-2*A*Y+2*6*X^2); V=simpalg(4*6*X*Y-4*6*A*X^3); return [U,V]; } U=-v/(2*A*u); V=(v^2-2*u^3)/(4*A*u^2); /* \phi^{-1} */ def phiinv(U,V) { A=newalg(x^2-6); X=simpalg(-V/(2*A*U)); Y=simpalg((V^2-2*U^3)/(4*A*U^2)); return [X,Y]; } /* (1,2) */ X0=subst(X,x,1,y,2); Y0=subst(-Y,x,1,y,2); L=simpalg((Y-Y0)/(X-X0)); N=simpalg((Y0*X-Y*X0)/(X-X0)); def p1(X) { return coef(algptorat(simpalg(X)),1,algv(0)); } def p0(X) { return coef(algptorat(simpalg(X)),0,algv(0)); } def cj(X) { return -p1(X)*alg(0)+p0(X); } def ry2(X) { /* X : polynomial of x,y return replace(X,y^2,6*x^4-2); */ D = deg(X,y); for(I=0; I <= D; I++){ if(irem(I,2) == 0){ /*I is even*/ S += coef(X,I,y)*(6*x^4-2)^idiv(I,2); } else { /*I is odd*/ S += coef(X,I,y)*(6*x^4-2)^idiv(I,2)*y; } } return simpalg(S); } def ry2list(L) { /* L=[[C,E],[F1,E1],[F2,E2], ... ,[Fn,En]] */ D = length(L); S = L[0][0]; for(I=1; I < D; I++){ S *= ry2(L[I][0])^L[I][1]; } return S; } XX=simpalg(L^2-X-X0); YY=simpalg(-L*XX-N); XX1=nm(XX); XX2=dn(XX); XXd=simpalg(XX2*cj(XX2)); XXdd=ry2list(fctr(XXd)); XXn=simpalg(XX1*cj(XX2)); XXn1=ry2(p1(XXn)); XXn1f=fctr(XXn1); XXn0=ry2list(fctr(p0(XXn))); YY1=nm(YY); YY2=dn(YY); YYd=simpalg(YY2*cj(YY2)); YYdd=ry2list(fctr(YYd)); YYn=simpalg(YY1*cj(YY2)); YYn1=ry2(p1(YYn)); YYn1f=fctr(YYn1); YYn0=ry2list(fctr(p0(YYn))); XXX=red(XXn0/XXdd); YYY=red(YYn0/YYdd); XXXnf=fctr(nm(XXX)); XXXdf=fctr(dn(XXX)); YYYnf=fctr(nm(YYY)); YYYdf=fctr(dn(YYY)); /* \psi^{-1} */ def rv2(X) { /* X : polynomial of u,v return replace(X,v^2,u^3+4*12*u); */ D = deg(X,v); for(I=0; I <= D; I++){ if(irem(I,2) == 0){ /*I is even*/ S += coef(X,I,v)*(u^3+4*12*u)^idiv(I,2); } else { /*I is odd*/ S += coef(X,I,v)*(u^3+4*12*u)^idiv(I,2)*v; } } return simpalg(S); } def rv2list(L) { /* L=[[C,E],[F1,E1],[F2,E2], ... ,[Fn,En]] */ D = length(L); S = L[0][0]; for(I=1; I < D; I++){ S *= rv2(L[I][0])^L[I][1]; } return S; } X1=u; Y1=v; X2=X0; Y2=-Y0; L2=simpalg((Y1-Y2)/(X1-X2)); N2=simpalg((Y2*X1-Y1*X2)/(X1-X2)); X3=simpalg(L2^2-X1-X2); Y3=simpalg(-L2*X3-N2); UU=simpalg(-Y3/(2*A*X3)); VV=simpalg((Y3^2-2*X3^3)/(4*A*X3^2)); X31=nm(UU); X32=dn(UU); X3d=simpalg(X32*cj(X32)); X3dd=rv2list(fctr(X3d)); X3n=simpalg(X31*cj(X32)); X3n1=rv2(p1(X3n)); X3n1f=fctr(X3n1); X3n0=rv2list(fctr(p0(X3n))); Y31=nm(VV); Y32=dn(VV); Y3d=simpalg(Y32*cj(Y32)); Y3dd=rv2list(fctr(Y3d)); Y3n=simpalg(Y31*cj(Y32)); Y3n1=p1(Y3n); Y31f=fctr(Y3n1); Y3n0=rv2list(fctr(p0(Y3n))); XX3=red(X3n0/X3dd); YY3=red(Y3n0/Y3dd); XX3nf=fctr(nm(XX3)); XX3df=fctr(dn(XX3)); YY3nf=fctr(nm(YY3)); YY3df=fctr(dn(YY3));