\\ Implémentation des diviseurs sur une courbe elliptique \\ Un diviseur D = \sum n_i [P_i] sur E est représenté \\ par le vecteur [[n_1,P_1], [n_2,P_2], ..., [n_r,P_r]]. degre(D)= { sum(i=1,#D,D[i][1]); } somme(e,D)= { my(S,P); S=[0]; for(i=1,#D, P=ellpow(e,D[i][2],D[i][1]); S=elladd(e,S,P)); S; } position(D,P)= { for(i=1,#D, if(D[i][2]==P,return(i))); return(0); } \\ Fonction simplifie(D) : \\ Renvoie un vecteur où les points \\ P_i sont deux à deux distincts simplifie(D)= { my(newD,i0,finalD); newD=[]; for(i=1,#D, i0=position(newD,D[i][2]); if(i0,newD[i0][1]+=D[i][1], newD=concat(newD,[D[i]]))); finalD=[]; for(i=1,#newD, if(newD[i][1]!=0,finalD=concat(finalD,[newD[i]]))); finalD; } \\ Étant donnée une courbe elliptique E \\ et un point P sur E, renvoie une fonction f_P \\ telle que div(f_P) = 2[P] - [2P] - [0]. \\ Sont renvoyées deux fonctions rationnelles F et G \\ (en la variable v, par défaut v='x) telles que \\ f_P = F(x)+G(x)*y fP(e,P,v='x)= { my(x='x,u='u,eq,X,F,G); if(P==[0],return(1)); eq=x^2+e.a1*u*x+e.a3*x-u^3-e.a2*u^2-e.a4*u-e.a6; \\ We work modulo the equation of the curve E. \\ The strange coordinate names (u,x) are to ensure \\ that the y-coordinate has highest priority X=1/(ellsub(e,[u,x],P)[1]-P[1]); X=lift(Mod(X,eq)); F=subst(polcoeff(X,0),u,v); G=subst(polcoeff(X,1),u,v); return([F,G]); } \\ Étant donnée une courbe elliptique E \\ et deux points P et Q sur E, renvoie une fonction f_{P,Q} \\ telle que div(f_{P,Q}) = [P] + [Q] - [P+Q] - [0]. \\ Sont renvoyées deux fonctions rationnelles F et G \\ (en la variable v, par défaut v='x) telles que \\ f_{P,Q} = F(x)+G(x)*y fPQ(e,P,Q,v='x)= { my(xPQ); if(P==[0] || Q==[0],return([1,0])); if(P==Q,return(fP(e,P,v))); if(P[1]==Q[1],return([v-P[1],0])); xPQ=elladd(e,P,Q)[1]; return([((Q[2]-P[2])*v+Q[1]*P[2]-P[1]*Q[2])/(v-xPQ), (P[1]-Q[1])/(v-xPQ)]); } \\ Étant donnée une courbe elliptique E, \\ un point P sur E et un entier n>0, \\ renvoie une fonction f_{P,n} \\ telle que div(f_{P,n}) = n[P] - [nP] - (n-1)[0]. \\ Sont renvoyées deux fonctions rationnelles F et G \\ (en la variable v, par défaut v='x) telles que \\ f_{P,n} = F(x)+G(x)*y fPn(e,P,n,v='x)= { my(m,x='x,u='u,eq,FP,FPn,FPQ,h,F,G); if(n==1 || P==[0],return([1,0])); if(n==-1,return([1/(v-P[1]),0])); if(n==2,return(fP(e,P,v))); eq=x^2+e.a1*u*x+e.a3*x-u^3-e.a2*u^2-e.a4*u-e.a6; if(n>0, m=n\2; FP=fP(e,P,u); FPn=fPn(e,ellpow(e,P,2),m,u); h=Mod(FP[1]+FP[2]*x,eq)^m*Mod(FPn[1]+FPn[2]*x,eq); if((n%2)==0, F=subst(polcoeff(lift(h),0),u,v); G=subst(polcoeff(lift(h),1),u,v); return([F,G]), FPQ=fPQ(e,P,ellpow(e,P,n-1),u); h=h*Mod(FPQ[1]+FPQ[2]*x,eq); F=subst(polcoeff(lift(h),0),u,v); G=subst(polcoeff(lift(h),1),u,v); return([F,G])), FPn=fPn(e,P,-n,u); FPQ=fPQ(e,ellpow(e,P,n),ellpow(e,P,-n),u); h=1/(Mod(FPn[1]+FPn[2]*x,eq)*Mod(FPQ[1]+FPQ[2]*x,eq)); F=subst(polcoeff(lift(h),0),u,v); G=subst(polcoeff(lift(h),1),u,v); return([F,G])); } \\ Étant donné un diviseur D sur E, teste si D est principal \\ et si oui, renvoie une fonction f telle que D = div(f). \\ Sont renvoyées deux fonctions rationnelles F et G \\ (en la variable v, par défaut v='x) telles que f = F(x)+G(x)*y. \\ check est un argument optionnel : si check = 1 (défaut), alors \\ la fonction teste d'abord si le diviseur est principal ; sinon \\ la principalité ou non du diviseur est obtenue seulement \\ à la fin du calcul. isprincipal(e,D,v='x,check=1)= { my(D0,newD,x='x,u='u,eq,h,FPn,FPQ,R,F,G); D0=simplifie(D); if(D0==[],return([1,0])); if(degre(D0),return(0)); if(check, if(somme(e,D0)!=[0],return(0))); eq=x^2+e.a1*u*x+e.a3*x-u^3-e.a2*u^2-e.a4*u-e.a6; h=Mod(1,eq); newD=[]; for(i=1,#D0, FPn=fPn(e,D0[i][2],D0[i][1],u); h*=FPn[1]+FPn[2]*x; newD=concat(newD,[ellpow(e,D0[i][2],D0[i][1])])); R=newD[1]; for(i=2,#newD, FPQ=fPQ(e,R,newD[i],u); h*=FPQ[1]+FPQ[2]*x; R=elladd(e,R,newD[i])); if(!check, if(R!=[0],return(0))); F=subst(polcoeff(lift(h),0),u,v); G=subst(polcoeff(lift(h),1),u,v); return([F,G]); } \\ EXEMPLE e=ellinit("11a3"); \\ Courbe elliptique de conducteur 11 P=[0,0]; \\ Point d'ordre 5 D=[[2,P],[3,ellpow(e,P,2)],[-1,ellpow(e,P,3)],[-4,[0]]] \\ D = 2[P] + 3[2P] - [3P] - 4[0] isprincipal(e,D) \\ -> [-x^3/(x - 1), (-2*x + 1)/(x - 1)] \\ -> D = div(f) avec f = -x^3/(x - 1) + y*(-2*x + 1)/(x - 1)