Il numero dei numeri primi compresi tra 2 la radice

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