Click here to load reader

Fattorizzazione primalità

  • View
    175

  • Download
    5

Embed Size (px)

Text of Fattorizzazione primalità

1. Fattorizzare i numeri interi (di Cristiano Armellini, [email protected])Ci sono molti algoritmi efficientiper fattorizzare numeri interi e molti sono i testi dove possibile trovare una completa trattazione sull'argomento, Qui vogliamo proporre deisistemi (in parte abbastanza originali e forse relativamente veloci ma senza nessuna pretesa da parte nostra) per cercare di trovare i fattori di un numero intero con metodi algebrici e facilmente implementabili in un moderno calcolatore. L'idea comunque quella di trovare dei limiti entro cuicercare con maggiori probabilit le soluzioni. Nella ricerca delle soluzioni prendiamo principalmente in esame solo valori interi positivi bench in linea di principio potremmo considerare anche i negativi dal momento che 9 = 3*3 = (-3)*(-3). Facendo girare tutti gli algoritmi in parallelo aumenta la probabilit di trovare soluzioni in tempi rapidi. Ogni algoritmo sar implementato con una applicazione scritta in C/C++ o in PARI/Gp per la gestione dei grandi numeriConsiderazione preliminare (algoritmo 0)Dato un numero p da fattorizzaredi n cifre facile provare che almeno un fattore deve essere dell'ordine dicio deve avere almenoint(n/2) cifre con int(x) la parte la funzione parte intera di x. Questa considerazione parte dal fatto che se un fattore in un problema tipo RSA fosse troppo piccolo sarebbe fin troppo facile individuarlo con metodi banali di ricerca per tentativi.Se p = ab con a, b numeri primi allora entrambi i fattori sono entrambi maggiori di W cio tali per cui a > W, b > W cio S= a+b > W.In questo particolare caso possiamo porre ancheConsiderare W ci particolarmente utile quando trattiamo di grandi dimensioni perch come vedremo meglio con gli altri algoritmi ci pu aiutare a trovare dei limiti per i fattori da ricercare.LISTATO IN C++#include #include #include int main(int argc, char *argv[]){long double x, p;long i = 0;int cifre;cout > cifre;cout p;x = pow(10, int(cifre/2)-1 );do{x = x + 1;i = i + 1;} while(int(p/x) != (p/x));cout q e non q => non p abbiamoSe esiste un intero a 1 < a < p tale che ap != a modulo p allora p non primo Allo stesso modo ricordiamo un altro importante teorema che afferma:per ogni coppia di interi x, y e per ogni p primo => (x+y)p=xp+yp (mod p)La dimostrazione di questo teorema molto semplice si basa sul teorema del binomio (sviluppo)Quindi in modo analogo:Se esiste una coppia di interi x, y | (x+y)p != xp+yp (mod. p) allora p non primo . Possiamo allora tentare di unire i due teoremi per formulare un interessante algoritmo probabilistico che ci dir in modo veloce se un numero un primo o composto.ALGORITMO:Sia dato un p intero dispari e non un quadrato perfettoTramite un generatore di numeri casuali formiamo delle coppie (un certo numero, pi alto pi alta la probabilit di non fallire) di interi casuali x, y con 1 < x < p, 1 < y < pSe troviamo per tutte le coppie x, y (x+y)p = xp+yp (mod. p) e(xp=x mod p, yp=y mod p) allora p probabilmente primo.Altrimenti se esistono x, y | (x+y)p = xp+yp (mod. p)e (xp != x mod p oppure yp != y mod p) allora p non primo.Nota:(x+y)p=xp+yp=x+y=(x+y) mod p ovvero zp=z mod p , conz= x+yUn nuovo test di primalitIl piccolo teorema di Fermat afferma che:se p un numero primoallora per ogni intero acon MCD(a, p)=1 (p non divide a) , allora a^(p-1) = 1 mod p (qui l'= sta per congruo)Il teorema sui residui quadratici afferma cheper ogni numero primo p > 2 e per ogni numero a non divisibile per p (MCD(a, p)=1) si verifica uno dei seguenti fatti:a^((p-1)/2) = 1 oppure a^((p-1)/2)=-1 mod p (qui l'= sta per congruo)Da questi due importantissimi teoremi applicando l'equivalenza logica che p=>q equivale a non q => non pe che un numero intero primo o non primoformuliamo il seguente test di primalit ove assumiamo che N sia un numero dispari e non un quadrato perfetto (in questi casi sarebbe immediato verificarne la primalit anche per numeri con moltissime cifre):N dispari e non un quadrato perfetto (altrimenti N non primo)Se esiste un a intero 2 < a < N tale che MCD(a,N)= 1 ea^(N-1) != 1 mod N e a^((N-1)/2) !=1 mod NANDa^((N-1)/2) !=-1allora N non primoaltrimenti primoOsserviamo che a causa dei pseudo primi di Carmichael i test di primalit proposti se indicano che un numero non primo certamente non un numero primo, mentre se indicano che primo da intendersi come probabilmente primoIl codice seguente scritto in Pyton ed di semplice letturadef mcd(a,b):if b == 0:return aelse:return mcd(b, a%b)def test2primo(N):j = 2;while j < N:if mcd(j, N) == 1:if (j**(N-1)%N != 1%N) and ((j** ((N-1)/2))%N != 1%N) and ((j** ((N-1)/2))%N != -1%N):return 'non primo';j = j+1;return ' primo';

Search related