CURVE ELLITTICHE IN PARI/GP

E=ellinit([0,0,0,A,B],p)    oppure     E=ellinit([A,B],p)

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

E=ellinit([0,0,0,367,79],45691)

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. Una  di queste quantita' e' uguale a    -16(4A^3+27B^2),    modulo p,   cioe' un multiplo non nullo del discriminante D=4A^3+27B^2:

?  E=ellinit([0,0,0,367,79],45691)

%1  = [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), 
Vecsmall([3]), [45691, [18722, 30544, [6, 0, 0, 0]]], [0, 0, 0, 0]]
? 
? 
Il comando 
E.disc   restituisce  -16(4A^3+27B^2)  modulo p

? E.disc
%5 = Mod(23574, 45691)

il comando 
lift(E)
risolleva la curva ad una curva a coefficienti interi 
e  le  quantita’ associate alla curva  sono viste come interi.

? lift(E)
%6 = [0, 0, 0, 367, 79, 0, 734, 316, 2384, 28075, 23126, 23574, 40769, 
Vecsmall([3]), [45691, [18722, 30544, [6, 0, 0, 0]]], [0, 0, 0, 0]]

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

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

? ellcard(E)
%8 = 45568

dunque   la   cardinalita'  della curva    Y^2=X^3+367 X+79   su   Z_45691  e'   uguale ad  N=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. 

? E=ellinit([0,0,0,-1,0],5)
%10 = [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), 
Vecsmall([3]), [5, [4, 0, [1, 0, 0, 0]]], [0, 0, 0, 0]]
? 
? 
? E.disc
%17 = Mod(4, 5)

Contiamo quanti punti ha:

? 
? ellcard(E)
%18 = 8

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

? P=[3,0]
%16 = [3, 0]
? ellisoncurve(E,P)
%17 = 0

? Q=[2,1]
%18 = [2, 1]
? ellisoncurve(E,Q)
%19 = 1

? R=[3,2]
%20 = [3, 2]
? ellisoncurve(E,R)
%21 = 1

il punto P non sta sulla curva, i punti Q ed R stanno sulla curva
sommiamo Q ed R

? elladd(E,Q,R)
%22 = [Mod(1, 5), Mod(0, 5)]

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

? lift(elladd(E,Q,R))
%23 = [1, 0]

Calcoliamo i  multipli  2Q, 3Q, 4Q. 
Troviamo che Q ha ordine 4:

? lift(ellpow(E,Q,2))
%24 = [0, 0]
? lift(ellpow(E,Q,3))
%25 = [2, 4]
? lift(ellpow(E,Q,4))
%26 = [0]
 
------------------------------------------------------------------------------------------------------