CURVE ELLITTICHE IN PARI/GP

E=ellinit([0,0,0,A,B]*Mod(1,p),1)

inizializza la curva ellittica E con equazione di Weierstrass  Y^2=X^3+AX+B su Z_p. 
Ad esempio,

p= 45691
E=ellinit([0,0,0,367,79]*Mod(1,p),1)

inizializza la curva ellittica E con equazione di Weierstrass   Y^2=X^3+367 X+79   su   Z_45691  e risponde 
con un array che contiene una serie di quantita' associate alla curva, ognuna nella forma   Mod(???,45691), 
per ricordare che si tratta di una curva su  Z_45691. La penultima di queste quantita' e' uguale a    -16(4A^3+27B^2),    
cioe' un multiplo non nullo del discriminante D=4A^3+27B^2:

(17:54) gp > p= 45691
%2 = 45691
(17:56) gp > E=ellinit([0,0,0,367,79]*Mod(1,p),1)
%3 = [Mod(0, 45691), Mod(0, 45691), Mod(0, 45691), Mod(367, 45691), Mod(79, 45691), Mod(0, 45691), Mod(734, 45691), Mod(316, 45691), Mod(2384, 45691), Mod(28075, 45691), Mod(23126, 45691), Mod(23574, 45691), Mod(40769, 45691)]

p= 45691
E=ellinit([0,0,0,367,79]*Mod(1,p),1)
lift(E)

(18:10) gp > p= 45691
%6 = 45691
(18:15) gp > E=lift(ellinit([0,0,0,367,79]*Mod(1,p),1))
%8 = [0, 0, 0, 367, 79, 0, 734, 316, 2384, 28075, 23126, 23574, 40769]

la curva e'  "risollevata" ad una  curva su Z  e le  quantita' ad essa associate sono  interi.

----------------------------------------------------------------------------------

Se E(Z_p) e' una curva ellittica su Z_p, la cardinalita'  #E(Z_p) si ottiene come

#E(Z_p)=p+1- ellap(E,p)

dove il comando  ellap(E,p)  calcola la quantita' che sottratta a   p+1  da' appunto   la cardinalita' di E(Z_p).
nel caso della curva qui sopra, abbiamo

(18:32) gp > ellap(E,p)
%19 = 124
(18:32) gp > N=p+1-ellap(E,p)
%20 = 45568

dunque   la   cardinalita'  della curva    Y^2=X^3+367 X+79   su   Z_45691  e'   uguale a  45568.

--------------------------------------------------------------------------------------------------------------------

Consideriamo adesso la curva ellittica   Y^2=X^3-X  su  Z_5, 
che ha discriminante D=4A^3+27B^2=1 mod 5.

(22:33) gp > E=ellinit([0,0,0,-1,0]*Mod(1,5),1)
%1 = [Mod(0, 5), Mod(0, 5), Mod(0, 5), Mod(4, 5), Mod(0, 5), Mod(0, 5), Mod(3, 5), Mod(0, 5), Mod(4, 5), Mod(3, 5), 
Mod(0, 5), Mod(4, 5), Mod(3, 5)]
(22:33) gp > E.disc
%2 = Mod(4, 5)

Contiamo quanti punti ha:

(22:04) gp > N=5+1-ellap(E,5)
%4 = 8

Controliamo se i punti P=(3,0), Q=(2,1) ed R=(3,2) appartengono o meno alla curva E

(22:36) gp > P=[3,0]
%3 = [3, 0]
(22:36) gp > ellisoncurve(E,P)
%4 = 0
(22:36) gp > Q=[2,1]
%5 = [2, 1]
(22:36) gp > ellisoncurve(E,Q)
%6 = 1
(22:36) gp > R=[3,2]
%7 = [3, 2]
(22:36) gp > ellisoncurve(E,R)
%8 = 1

sommiamo Q ed R

(22:37) gp > elladd(E,Q,R)
%9 = [Mod(1, 5), Mod(0, 5)]

oppure (per avere le coordinate senza i “moduli”)

(22:38) gp > lift(elladd(E,Q,R))
%10 = [1, 0]

verifichiamo che Q=[2,1] ha ordine 4, calcolando i suoi  multipli Q, 2Q, 3Q, 4Q

(22:40) gp > lift(ellpow(E,Q,1))
%11 = [2, 1]
(22:40) gp > lift(ellpow(E,Q,2))
%12 = [0, 0]
(22:40) gp > lift(ellpow(E,Q,3))
%13 = [2, 4]
(22:40) gp > lift(ellpow(E,Q,4))
%14 = [0]
 
------------------------------------------------------------------------------------------------------