Un nuovo test di primalità Il piccolo teorema di Fermat afferma che: se p è un numero primo allora per ogni intero a con 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 che per 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 p e che un numero intero è primo o non è primo formuliamo 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 e a^(N-1) != 1 mod N e a^((N-1)/2) !=1 mod N AND a^((N-1)/2) !=-1 ■ allora N non è primo altrimenti è primo Il codice seguente è scritto in Pyton ed è di semplice lettura def mcd(a,b): if b == 0: return a else: 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** ((N1)/2))%N != -1%N): return 'non è primo'; j = j+1; return 'è primo';