Questo programma
illustra l'algoritmo delle curve ellittiche a CARTE SCOPERTE:
noi  forniamo un intero di cui conosciamo il fattore primo piu' piccolo p.
Possiamo vedere che l'algoritmo ha successo  quando la curva ellittica di dato un ciclo, ridotta  modulo p, ha ordine b1-smooth oppure prodotto di un intero b1-smooth per uno (UNO SOLO) dei primi in [b1,b2]. 

INPUT: 
n intero della forma p*q, con p,q primi, dove q>>p
p fattore piu' piccolo
b1=primo bound
b2 ~ 60*b1=secondo bound
N=numero massimo di cicli 

OUTPUT
-  il primo piu' grande, minore di b2
- il numero della curva e la fattorizzazione completa di #E(Z_p),  se  il fattore massimo  #E(Z_p)  e' minore di b2
- il numero della curva e il fattore piu' grosso di #E(Z_p)  altrimenti.    
- scrive 1, quando inizia  la fase 1 del ciclo;
- scrive 2, quando passa alla fase 2 del ciclo, dopo che la fase 1 ha fallito.
- scrive ., quando anche la fase 2 e' stata completata senza successo.

p=nextprime(10^15);\
q=nextprime(10^80);\
n=p*q;\
b1=10000;\
N=75;\
ecm(n,p,b1,N)

p=nextprime(10^15);\
q=nextprime(10^50);\
n=p*q;\
b1=11000;\
N=100;\
ecm(n,p,b1,N)

ecm(n,p,b1,N)=m=1;for(q=2,b1,if(isprime(q),\
t=1;while(t<b1,m=m*q;t=t*q),));\
q=nextprime(b1);mm=truncate(60*b1/log(60*b1));\
aa=vector(mm);dmax=2;\
for(k=1,mm, q1=nextprime(q+1);dd=q1-q;q=q1;\
     if(dd>dmax,dmax=dd,);aa[k]=dd);\
print("massimo primo < b2= ",q1);\
bb=matrix(dmax/2,2);\
for(j=1,N,\
x=random(n);y=random(n);\
b=y^2-x^3-x; e=ellinit([0,0,0,1,b],1);\
ff=factor(p+1-ellap(e,p));\
ll=length(mattranspose(ff));\
r=ff[ll,1];\
if(r<q1,print1(j,": ",ff,","),print1(j,": ",ff[ll,1],","));\
e= ellinit([0,0,0,1,b]*Mod(1,n),1);\
print1(" 1");\
p0=[Mod(x,n),Mod(y,n)];\
p0=ellpow(e,p0,m);\
print1(", 2");\
q=nextprime(b1);p2=ellpow(e,p0,q);\
pp=elladd(e,p0,p0);p3=pp;\
for(k=1,dmax/2,bb[k,1]=p3[1];bb[k,2]=p3[2];p3=elladd(e,p3,pp));\
q1=q;\
for(k=1,mm,kk=aa[k]/2; q1=q1+aa[k];\
p2=elladd(e,p2,[bb[kk,1],bb[kk,2]]);\
);\
print("."))