Complessità computazionale degli algoritmi di fattorizzazione In questo articolo valuteremo la complessità computazionale del migliore algoritmi di fattorizzazione possibile (escludendo quelli di tipo quantistico). Il teorema di numeri primi afferma che π(π₯) =1 π₯→+∞ π₯ lnβ‘(π₯) lim ovvero π₯ ππ(π₯) π(π₯)~ Dove π(π₯) è il numero dei primi minori o uguali a x. (per x opportunamente grande). Un formulazione più evoluta dello stesso teorema mostra che π₯ π(π₯)~πΏπ(π₯) = ∫ 0 ππ¦ lnβ‘(π¦) Ove Li(x) è il logaritmo integrale Ora prendiamo in esame il problema della fattorizzazione p = ab con a, b primi e supponiamo a < b. Sappiamo che a deve essere compreso tra 2 e la radice quadrata di p. Il nostro obiettivo è trovare a perché così b è facilmente calcolabile con b = p/a (problemi di tipo RSA). Per fattorizzare un qualunque numero intero di procederà ricorsivamente come per p=ab con a, b primi. Il numero dei numeri primi compresi tra 2 la radice quadrata di p (per p grande) è approssimativamente: π(√π) − 2 2 √π ~ − lnβ‘(2) ππ(√π) lnβ‘(2) (anche se l’ultimo termine possiamo trascurarlo) √π π(√π)~ ππ(√π) Oppure: √π π(√π)~ ∫ 2 ππ¦ lnβ‘(π¦) Grazie all’aiuto del software Mathematica stimiamo i passi necessari (nel caso peggiore) per trovare il fattore più piccolo del numero p = ab con a, b primi molto grandi e a < b. Ci poniamo cioè nella condizione di disporre di un algoritmo che ci fornisce tutti i numeri primi da 2 alla radice quadrata di p (anzi 1 supponiamo di averli già calcolati) e che altro non ci rimane da fare che verificare quali di questi numeri divide p. Ci poniamo nel caso migliore possibile (algoritmo ideale). Con il Mathematica: p:=10^12 Sqrt[p]/Log[Sqrt[p]] N[%] NIntegrate[1/Log[x], {x, 2, Sqrt[p]}] Facendo variare p (numero da fattorizzare) costruiamo la seguente tabella: dimensione (dim) 20 25 30 35 40 P (numero da fattorizzare = ab 10^20 10^25 10^30 10^35 10^40 Steps (caso peggiore) stimati con il teorema dei numeri primi k*10^8 k*10^11 k*10^13 k*10^15 k*10^18 Ove k < 10, k > 1, k diverso per ogni P. È facile provare che gli steps (passi nel caso peggiore del migliore algoritmo possibile) seguono la legge: ππ‘πππ ~πβ‘10 πππ‘( πππ )−2 2 Questa formula ci dà una stima per confrontare tutti gli algoritmi conosciuti e quelli nuovi per capire quanto ancora è possibile migliorare. Nel nostro ragionamento ci siamo posti nel “caso peggiore” perché ovviamente la soluzione potrebbe essere trovata anche in un solo passo o perché p è un quadrata perfetto o magari perché un suo divisore è un numero relativamente piccolo che qualunque calcolatore può facilmente trovare in pochi secondi. Deduciamo che gli steps seguono una legge di tipo esponenziale rispetto alla dimensione del numero da fattorizzare e questo nel peggiore del migliore algoritmo di fattorizzazione possibile di tipo non quantistico m algebrico. Deduciamo che P != NP. 2