TEORIA COMPUTAZIONALE DEI NUMERI E
IL PROBLEMA P = NP:
i tempi di calcolo per la fattorizzazione come
sottoproblema di P = NP, in particolare per i numeri
RSA con la congettura forte “ p’ primo minimo = 2n/3
≈ 67% di n = √N”
Gruppo “B. Riemann”
Francesco Di Noto, Michele Nardelli
Abstract
In this paper we show some our ideas and applications in
Computational Number Theory.
Riassunto
In questo lavoro parleremo brevemente della teoria
computazionale dei numeri (una delle tante teorie dei numeri,
insieme alle altre teorie (teoria dei numeri elementare, teoria
analitica dei numeri, teoria dei numeri algebrica, teoria
geometrica dei numeri) la quale (dalla
voce generale di Wikipedia “Teoria dei numeri” è così
definita:
“Infine, la teoria dei numeri computazionale studia Algoritmi
importanti nella teoria dei numeri. Algoritmi efficienti per la
verifica della primalità e la fattorizzazione di interi hanno
importanti applicazioni nella crittografia.”
In particolare , studia anche i tempi di calcolo per risolvere
particolari problemi (circa un migliaio), detti “dell’ago nel
pagliaio”, come per esempio il problema del commesso
viaggiatore” e quello della fattorizzazione veloce.
Dedichiamo questo lavoro a quest’ultimo problema, ed in
particolare alla fattorizzazione dei numeri RSA, usati come
chiave pubblica nella crittografia RSA.
Com’è noto, i numeri RSA sono quelli usati dalla
crittografia RSA, e sono composti in genere da qualche
centinaio di cifre. Più alto è il numero di cifre, più tempo ci
vuole a fattorizzarli in p e q , in modo da rendere più difficile
la violazione della crittografia RSA. Infatti, si prevedono
tempi di calcolo dell’ordine di qualche secolo o millennio. Noi
però abbiamo trovato, studiando i numeri RSA (Breve
statistica sui numeri RSA già fattorizzati , ancora in corso,
Rif.1)), come diminuire tale tempo di calcolo del 67%. Non è
poco, ma non ancora abbastanza per violare la crittografia
RSA ( invece di 100 anni, per esempio, ne basterebbero 100 67 = 33 anni nel caso peggiore, i numeri RSA = prodotti tra
due numeri gemelli)
Ma il sistema proposto è ancora perfettibile, e si potrebbe
arrivare in certi casi anche al 90 o poco più in meno di
quello normalmente previsto.
Vediamo i possibili tempi di calcolo previsti dai matematici in
base al numero di cifre dei numeri RSA.
1) “Problemi, Algoritmi, Tempo e Spazio” Luigi Salemi
pubblicato sul sito
www.gruppoeratoste,e.com”, sezione “Articoli Vari”e che
riportiamo integralmente:
“La Complessità Computazionale (1) è quella branca dell’informatica che studia le
risorse necessarie, in Tempo e Spazio, per la risoluzione di un Problema.
I Problemi sono così riconducibili a differenti Classi di Complessità in funzione del
miglior Algoritmo di cui disponiamo per risolverli.
Una definizione formale coinvolge la Macchina di Turing (2) che possiamo immaginare
come il prototipo teorico di ogni computer, ma non è questo lo scopo di questa
comunicazione che vuole fermarsi ad un livello informale edivulgativo.
Le Classi di Complessità sono una miriade (3) e di tutte si conosce la struttura di
inclusione [L’Algoritmo che funziona per una Classe è utilizzabile per ogni Classe di
minore Complessità e quindi la seconda è inclusa nella prima], quasi mai si sa se tale
inclusione è “stretta” oppure no, ovvero se 2 Classi contigue sono realmente separate
perché c’è almeno un Problema contenuto in una ma non nell’altra.
La ricerca dicotomica quando cerchiamo un nome in un elenco telefonico utilizziamo un
Algoritmo che si potrebbe riassumere così:
a) Apriamo l’elenco a metà e se il nome che leggiamo è inferiore (nel tradizionale
ordinamento alfabetico) a quello che stiamo cercando buttiamo via la parte sinistra
dell’elenco se è maggiore buttiamo via la parte destra b) Rieseguiamo quanto al punto
a) nella parte residua dell’elenco sino a quando troviamo il nome che stiamo cercando
Tale Algoritmo è molto veloce è richiede un numero di Passi pari a log(n) dove n è il
numero degli abbonati [ci si ferma al primo intero n tale che 2n >= numero degli
abbonati]. Si dice allora che opera in un Tempo O(log(n)) e si trova nella Classe di
Complessità “L” che potremmo considerare come “Complessità Logaritmica”
Ordinamento
Perché la ricerca dicotomica funzioni è necessario che l’elenco su cui cerchiamo sia
ordinato, si pone quindi il Problema di trovare opportuni Algoritmi di Ordinamento. C’è
tutta una storia, il primo di tali Algoritmi si chiama Bubble Sort e opera in un tempo
O(n2) dove n è il numero degli elementi da riordinare, poi ne è stato trovato un altro
denominato Heap Sort (4) che opera in un tempo O(n log(n))
e risulta quindi molto più efficiente del precedente. Poi, caso più unico che raro, è stato
possibile provare che Heap Sort è il migliore degli algoritmi possibili per l’ordinamento
e così la ricerca di ulteriori algoritmi che potessero migliorare i tempi di esecuzione è
cessata.
Comunque il tempo di esecuzione di entrambi gli algoritmi è polinomiale [è esprimibile
tramite un polinomio in n di grado k con k prefissato, si indica in generale con O(nk)] e
quindi questo problema è comunque codificato nella classe “P” che potremmo
considerare come “Complessità Polinomiale”.
E’ interessante notare come i 2 algoritmi precedenti pur trovandosi in classi distinte
rispetto al tempo siano entrambi polinomiali rispetto allo spazio e questo fa intravedere
come la complessità rispetto al tempo sia inclusa nella complessità rispetto allo spazio
[un algoritmo che risolve in uno spazio polinomiale risolve in un tempo polinomiale,
mentre del viceversa non c’è certezza e anzi si pensa sia falso]. La classe dei problemi
risolti in spazio polinomiale è la PSPACE, è una classe molto ampia ed include anche
problemi risolvibili in tempo esponenziale [ma verificabili in tempo polinomiale]
Lo Zaino
Questo Problema ha diverse formulazioni [ed un interesse pratico notevole in molti
campi] la più semplice è forse la seguente: dati n oggetti di diverso peso ed uno zaino
in grado di sopportare al più tot chili quali oggetti scegliere per raggiungere, ma non
superare, la capacità dello zaino?
Di fatto non conosciamo al momento nessun algoritmo che sia sostanzialmente
migliore del provare tutte le combinazioni possibili degli oggetti. E questo colloca tale
problema in O(2n) perché tale è la potenza dei sottoinsiemi di un Insieme rendendolo
estremamente complesso dal punto di vista computazionale. Eppure in questo tipo di
problema la verifica di una soluzione (o come spesso si dice di un “certificato”) è
polinomiale [se vi si dice di provare gli m oggetti A1, A2, A3, ..,Am perché questi
raggiungono la capacità dello zaino senza superarla la verifica si fa in tempo O(m)
perché basta sommare i pesi degli m oggetti].
La classe di appartenenza è la “NP” ed è anche denominata “la classe dei problemi
intrattabili”.
Per capire il perché di questa definizione supponiamo di avere scritto un programma in
grado di eseguire un milione di verifiche al secondo, ovvero sarà in grado di trovare in
un solo secondo la soluzione qualora gli oggetti siano 20 [220 ~ 1.000.000]. Quanto
tempo impiegherà lo stesso programma per trovare la soluzione qualora gli oggetti
siano 80? La incredibile risposta è che ci vorranno 33 miliardi di anni e questo vuol dire
2 volte l’età dell’universo.
Più intrattabili di così .. Ciò che scoccia maggiormente e che tanti problemi con grande
interesse pratico [crittografia tradizione, percorsi minimi, ecc.] sono in questa classe.
Al momento la miglior cosa che si possa fare [visto che non sempre disponiamo di
tanto tempo per avere la risposta] è utilizzare algoritmi probabilistici, ovvero algoritmi
che “probabilmente” trovano la miglior soluzione in un tempo polinomiale.
Gli Scacchi
C’è di peggio, per gli scacchi i tempi non solo sono esponenziali nella ricerca della
soluzione, ma lo sono anche nella verifica. (5) Se avete mai provato a trovare la
sequenza delle mosse di un problema del tipo “Il bianco muove è matta in 2 mosse”
sapete di cosa sto parlando. Tali problemi sono nella classe “EXPTIME”.
L’aritmetica non moltiplicativa solo per curiosità: la verifica (6) di un’affermazione sulla
aritmetica dei numeri reali che coinvolga la sola
operazione di addizione e nella classe “EXPSPACE” [necessita di spazi esponenziali]
Si sa che L P NP PSpace ExpTime ExpSpace. Ciò che non si sa e se
l’inclusione e “stretta” oppure no. Le uniche cose che si sanno, al momento, tra quelle
riportate e che L PSpace , P ExpTime e PSpace ExpSpace.
In particolare ciò che maggiormente vorremmo sapere e se P uguale NP [esiste un
algoritmo che ancora non conosciamo che consente di risolvere tutti i problemi di NP in
un tempo polinomiale] oppure P diverso da NP.[almeno un problema della classe NP
mai si potrà risolvere in tempo polinomiale].
P diverso da NP
Questa è la ipotesi più accreditata dagli esperti. E’ notizia di questi giorni che il
ricercatore della HP Vinay Deolalikar ha annunciato di aver trovato tale dimostrazione, il
suo lavoro è al vaglio della comunità scientifica internazionale, ma su questo pesa
fortemente il commento di Terence Tao, uno degli scienziati più rinomati, che ha
sostanzialmente detto: “La strada intrapresa da Deolalikar difficilmente potrà
dimostrare questo risultato”.
P uguale NP
Nel 1971 sembrava fatta. Cook e Levin, separatamente, hanno provato che tutti i
problemi NP sono riconducibili ad un unico problema denominato SAT (7). Risolto con
un Algoritmo polinomiale questo, sarebbero risolti tutti. L’anno dopo Karp ha provato
che altri 21 problemi (8) godevano di questa caratteristica: basta risolverne uno con un
algoritmo polinomiale perché siano automaticamente risolti tutti i problemi della classe
NP. Ad oggi questi problemi “duri” sono oltre 3.000 e basta risolverne uno con un
algoritmo polinomiale perché la classe NP collassi nella classe P.
Penso di aver trovato tale prova per il problema denominato “3Sat” che è uno dei 21
della lista di Karp. Tale dimostrazione è al vaglio di una piccola parte della comunità
scientifica nazione [beh, si fa quel che si può].
P verso NP non decidibile
Non stupirebbe. Fin dal 1931, quando Kurt Gödel ha provato il famoso“Teorema di
Incompletezza” che sancisce l’esistenza di questioni indecidibili in sistemi con potenza
pari o superiore all’aritmetica, ci aspettiamo che da un momento all’altro salti fuori uno
di questi problemi. Inoltre si spiegherebbe perché, nonostante la soluzione sia cercata
da tempo, al momento abbiamo solo ipotesi e nessuna prova conclamata. Gödel
comunque ha a che fare con questa questione molto più di quanto sembri. Nel 1950
scrisse al suo amico von Neumann una lettera privatissima in cui chiedeva notizie sullo
stato di salute e gli augurava una pronta guarigione.
Ma si sa come sono fatti i geni, così tra i saluti e gli abbracci trovo il modo di scrivere
“Non sarei stupito se si riuscisse a provare che P coincide con NP”[libera sintesi di
oltre 20 righe]. Su Gödel è stato detto tanto, non a caso è considerato il miglior logico
del nostro tempo; ma ciò che meglio esprime l’ammirazione verso questo grande
matematico è la seguente frase [di cui non conosco l’autore] “Per trovare un logico a lui
comparabile bisogna risalire ad Aristotele”. Ecco allora che la affermazione su P e NP
deve essere trattata con il dovuto rispetto.
Catania 25 Settembre 2010 Luigi Salemi
Referenze sul Web
1) http://it.wikipedia.org/wiki/Teoria_della_complessit%C3%A0_computazionale
2) http://it.wikipedia.org/wiki/Macchina_di_Turing
3) http://it.wikipedia.org/wiki/Classi_di_complessit%C3%A0_P_e_NP
4) http://it.wikipedia.org/wiki/Heap_sort
5) http://en.wikipedia.org/wiki/EXPTIME
6) http://en.wikipedia.org/wiki/EXPSPACE
7) http://it.wikipedia.org/wiki/Soddisfacibilit%C3%A0_booleana
8) http://it.wikipedia.org/wiki/Richard_Karp
N.d.A.A Il simbolo □ che appare nel lavoro, corrisponde ad
una U girata a destra di 90 gradi e sottolineata, simbolo
algebrico.
E anche, dal sito www.visainformatica.it/ :
Download
Pagina 3SAT by Luigi Salemi
•
•
•
•
•
•
Lo Spirito della
Prova 24.09.10
Dimostrazione
11.09.10
Spirit of the Proof
24.09.10
Proof 13.09.10
Eseguibile15.09.10
Sorgenti Pascal
Source15.09.10
In figura il confronto tra 2 algoritmi che lavorano in tempo O(2n) e O(n9) rispetto al n. delle Variabili ipotizzando che
entrambi siano capaci di esaminare 1.000.000 di casi al secondo. Per motivi evidenti i tempi sono riportati in scala logaritmica
Se siete arrivati qui probabilmente sapete già la differenza tra la classe dei problemi "P" e "NP", se vi siete persi e mi avete
raggiunto per errore vi dico che nella classe P sono contenuti i problemi per i quali si conosce un algoritmo che li risolve in
tempo Polinomiale, mentre nella classe NP sono contenuti i problemi per i quali si conosce solo un algoritmo di risoluzione in
tempo Esponenziale (ma beffardamente l'algoritmo di verifica lavora in tempo Polinomiale). Il grafico chiarisce in modo
immediato quanto grande sia la differenza, in relazione ai tempi, tra le 2 tipologie di algoritmi.
Ciò che il grafico non dice è che i problemi più interessanti (es.: quello del commesso viaggiatore o dei percorsi minimi, quello
dello zaino o sub somma, la scomposizione in fattori primi [su cui si basa quasi tutta la crittografia esistente]) sono nella class
NP. La buona notizia e che ogni tanto un problema da NP si trasferisce in P perché si trova un algoritmo più efficiente che
lavora in tempo Polinomiale, e questo il caso della "verifica di primarità" che nel 2002 si è trasferito in P per merito di 3
matematici indiani Manindra Agrawal, Neeraj Kayal e Nitin Saxena.
Da un bel po' di anni si cerca di provare se le classi P e NP siano effettivamente distinte (ovvero esiste almeno un problema in
NP che mai si potrà trasferire in P) o se viceversa le 2 classi in realtà coincidono, ma noi non siamo stati ancora capaci di
trovare l'algoritmo unificatore, quello per cui ogni problema di NP si possa risolvere in tempo Polinomiale
Leonid Levin e Stephen Cook hanno scoperto separatamente, all'inizio degli anni '70, che tutti i problemi della classe NP si
possono ricondurre ad un unico problema denominato "SAT" in cui occorre risolvere una espressione booleana trovando, se
esiste, una n-upla di valori True/False che soddisfi la espressione. Come dire risolto SAT risolti tutti, peccato che anche SAT
sia un problema della classe NP.
Subito dopo si è visto che SAT si può ricondurre a "3SAT", un problema in cui bisogna trovare, se esiste, la soluzione di una
espressione booleana che è formata dalla congiunzione di Clausole; ogni Clausola essendo composta dalla disgiunzione di
esattamente 3 (da cui il nome 3SAT) Variabili booleane eventualmente negate. Es: (A1 or ~A2 or A3) and (~A1 or ~A3 or A4
and ..
Pensavo di aver trovato un Metodo che risolvesse ogni problema 3SAT in tempo polinomiale, poi mi sono accorto che ero in
errore perché ho trovato un contro esempio.
Pazienza, continuo a lavorarci. Luigi Salemi
Per ulteriori dettagli rimandiamo ai riferimenti finali del
primo lavoro. Ma ora andiamo brevemente al nostro lavoro
(Rif.1)
In tale lavoro, da una breve statistica sui numeri RSA finora
fattorizzati, notiamo che il rapporto q/p massimo è di 2,11,
molto prossimo al rapporto considerato nella nostra
congettura forte, per la quale, se il rapporto q/p = 2, 25, vale
la relazione p ≈ 2n/3, ed essendo la
√2,250 = 1,50, da cui 1/1,50 = 0,6666…. ≈ 67% di n = √N con N
= p*q, cosa che si verifica solo se il rapporto q/p è di 2,25.
Poiché nei numeri RSA considerati il rapporto q/p è sempre
minore di 2,25, ne deriva che 2n/3 da un numero p’ minimo
da cui cominciare a cercare, trascurando il 67% dei numeri
primi più piccoli, e quindi risparmiando il 67% dei tempi di
calcolo previsti per l’ordine di grandezza del numero RSA
da fattorizzare: p reale si trova tra p’ ed
n = 100% di n Trovato in tal modo p, poi è semplice trovare q,
che invece è compreso tra q’ = 3n/2 ed n.
Facciamo un esempio di numero RSA ancora non fattorizzato:
RSA -2048, di 617 cifre (Rif. 2), al quale rimandiamo.
Qui riportiamo tale numero, e p’ minimo inferiore a p reale,
compreso tra p’ ed n, e quindi da cercare solo in questa parte
di n (dal 67% al 100% di n):
RSA – 617:
RSA-2048
=25195908475657893494027183240048398571429282126204032027
777137836043662020707595556264018525880784406918290641249
515082189298559149176184502808489120072844992687392807287
776735971418347270261896375014971824691165077613379859095
700097330459748808428401797429100642458691817195118746121
515172654632282216869987549182422433637259085141865462043
576798423387184774447920739934236584823824281198163815010
674810451660377306056201619676256133844143603833904414952
634432190114657544454178424020924616515723350778707749817
125772467962926386356373289912154831438167899885040445364
023527381951378636564391212010397122822120720357”
p’ minimo previsto:
p’ = 2*158…./3= 105… seguito da altre 306 cifre, per i motivi
spiegati in Rif.2)
E per q’ massimo, invece:
q’ =3* 158…/2 = 237 seguito da 306 cifre compreso tra questo
numero ed n =158 seguito da 306 cifre
Si attende conferma dalla futura fattorizzazione di RSA 2048 tramite i migliori algoritmi di fattorizzazione
attualmente noti, i migliori computer più potenti finora noti
(seconda parte di Rif. 1), o anche i futuri computer quantistici,
e possibilmente magari usando le indicazioni su p’ e q’
suggerite in questo lavoro, anche per dimostrare di poter
risparmiare almeno il 67 % dei tempi di calcolo previsti in
base alla tabella in Pagina 3SAT by Pietro Salemi sopra
riportata, e nel lavoro successivo di Marco Liverani.
Dal lavoro Il più grande problema irrisolto dell’informatica
Un breve percorso intorno al concetto di complessità computazionale
(Rif.3), riportiamo i brani più importanti, per il resto rimandiamo al
Rif.3 il brano concernente i tempi di calcolo riguardanti il problema P
= NP (da pag.10, e con qualche piccola modifica nella simbologia) :
Parleremo di uno dei problemi fondamentali
dell’Informatica che oggi ancora non è stato risolto:
il cosiddetto problema “P = NP”.
È un problema di quelli determinanti: sulle diverse
possibili risposte a questo problema si basano molte
delle teorie e delle applicazioni più avanzate
dell’informatica.
Gli americani, si sa, sono bizzarri, sembra che per
loro tutto sia un grande far west: un’importante
fondazione americana per la ricerca matematica ha
fissato addirittura una “taglia” di 1.000.000$ su questo
problema.
Utilizzare al meglio gli strumenti dell’Informatica
significa anche conoscere e studiare il
comportamento degli algoritmi nella soluzione di
problemi. Parleremo quindi di soluzioni di problemi
con l’ausilio del calcolatore, parleremo di algoritmi
e di come si possa stabilire la “bontà” di un
algoritmo, di come si possano confrontare fra loro
algoritmi differenti per stimarne l’efficienza.
Oggi esistono problemi che, anche con il più potente
dei computer, richiederebbero centinaia di anni per
essere risolti.
Ci chiediamo se prima o poi si riuscirà a trovare per
ogni problema un algoritmo efficiente che possa
risolverlo in tempi ragionevoli, o se questo obiettivo
è impossibile.
Algoritmi
Sono “ricette” che descrivono in passi elementari un
procedimento che ci permette di risolvere un
problema, svolgere un calcolo o portare a termine
un’operazione articolata. Gli algoritmi devono essere
procedure costituite da un numero finito di passi.
Non solo: il procedimento definito da un algoritmo
deve terminare dopo un numero finito di
operazioni.
Un esempio di algoritmo
Problema: stampare i primi 40 multipli di 13
1. assegna il valore 13 alla variabile x
2. assegna il valore 1 alla variabile i
3. stampa il valore della variabile x
4. calcola x + 13 ed assegna il risultato ad x
5. incrementa di 1 la variabile i
6. se i ≤ 40 allora torna al passo 3
7. fermati
È un procedimento composto da 7 passi. Ogni passo
del procedimento presenta
un’istruzione elementare. È facile convincersi che
risolve il problema in un
numero finito di operazioni (quante?).
Allora è un algoritmo!
Un esempio di algoritmo
x = 13, i = 1
stampo x = 13
x = x + 13 = 26, i = i + 1 = 2, i ≤ 40 allora proseguo
stampo x = 26
x = x + 13 = 39, i = i + 1 = 3, i ≤ 40 allora proseguo
stampo x = 39
x = x + 13 = 52, i = i + 1 = 4, i ≤ 40 allora proseguo
stampo x = 52
...
x = x + 13 = 520, i = i + 1 = 40, i ≤ 40 allora
proseguo stampo x = 520
x = x + 13 = 533, i = i + 1 = 41, i ≤ 40 allora mi
fermo
Tutte le “procedure” sono algoritmi?
Ogni volta che definiamo qualcosa è bene assicurarsi
che non si stia definendo nulla di banale...
Consideriamo il seguente problema: Stampare tutti i
numeri interi maggiori di zero.
Soluzione:
1. assegna il valore 1 alla variabile i
2. stampa il valore della variabile i
3. incrementa di 1 il valore della variabile i
4. vai al passo 2
I passi sono solo 4, sono composti da istruzioni
elementari... è vero, ma il procedimento che descrive
non terminerà mai! Dunque non è un algoritmo
Un dubbio...
Forse esistono problemi che non sono risolubili
mediante un algoritmo? È possibile che esistano
problemi talmente difficili che non si possa progettare
un algoritmo in grado di risolverli in un tempo finito,
anche mettendo insieme tutta l’abilità dei migliori
progettisti e dei migliori programmatori del mondo?
Dipende forse dalla potenza del computer che utilizzo
per eseguire l’algoritmo? Il problema precedente
chiedeva di stampare tutti i naturali, ossia un numero
infinito di elementi...forse era proprio la natura del
problema che mal si prestava ad essere risolta con un
algoritmo.
Esistono problemi che pur ammettendo soluzioni
di lunghezza finita, richiedono necessariamente
un tempo infinito per essere risolti?
Misurare l’efficienza
A fronte di un certo problema possono essere proposti
algoritmi differenti per risolverlo: come faccio a
stabilire quale è il migliore?
L’algoritmo migliore è il più efficiente: quello che
riesce a risolvere il problema con il minor utilizzo di
risorse (della macchina) e nel minor tempo
possibile.
Efficienza = Velocità?
Uno stesso algoritmo, eseguito su macchine diverse,
impiega tempi diversi!
Allora l’efficienza di un algoritmo è legata alla potenza
della macchina su cui lo eseguo?
No: una buona misura dell’efficienza deve
prescindere dal calcolatore su cui eseguirò
l’algoritmo, altrimenti invece di misurare l’efficienza
dell’algoritmo misurerei l’efficienza della macchina!
Efficienza = Difficoltà del problema?
Un’istanza di un problema è data dal problema
insieme ai dati del problema stesso. Ad esempio un
problema “astratto” è quello di calcolare la derivata di
un polinomio generico p(n) = xn + a1xn-1 + a2xn-2 + . . . +
an-1x + an mentre un’istanza di questo problema è la
richiesta di calcolare la derivata di un polinomio
specifico p(x) = x3
12x2 + 5. Lo stesso algoritmo,
eseguito su due istanze diverse dello stesso
problema, richiede tempi diversi per giungere alla
soluzione. Allora l’efficienza di un algoritmo è legata
anche alla particolare istanza del problema che sto
considerando?
Efficienza di un algoritmo
L’efficienza di un algoritmo è data dal numero di
operazioni elementari compiute dall’algoritmo,
calcolate in funzione della “dimensione
dell’input”, ossia in funzione del numero di dati che
dovranno essere elaborati. L’efficienza di un
algoritmo non è dunque un numero, ma una
funzione.
Calcolo dell’efficienza: un esempio
Trovare l’elemento minimo in un insieme di n numeri
interi {x1, x2, . . . , xn}
Soluzione:
1. considero inizialmente un elemento a caso (ad esempio
x1, il primo) e lo considero come il “candidato” ad essere il
minimo elemento dell’insieme
2. confronto il candidato con tutti gli altri elementi e ogni
volta che trovo un elemento più piccolo del mio “candidato”
lo scambio con il candidato stesso
3. al termine dei confronti il candidato è sicuramente il
minimo
Complessivamente ho eseguito n confronti:
l’efficienza dell’algoritmo è direttamente proporzionale
alla “dimensione dell’input”
Calcolo dell’efficienza: un altro esempio
Ordinare in ordine crescente un insieme di n numeri
{x1, x2, . . . , xn}
Soluzione:
1. per i = 1, 2, . . . , n ripeti le seguenti operazioni:
2. trova l’elemento minimo nel sottoinsieme {xi, xi+1, ..., xn} e
scambialo con xi per n volte devo trovare il minimo su
insiemi sempre più piccoli: dunque eseguo
n + (n
1) + (n
2) + . . . + 2 + 1 Η n2 operazioni
Confronto dell’efficienza di algoritmi
Possiamo esprimere l’efficienza di un algoritmo
mediante una funzione f(n) della variabile n: esprime il
numero di operazioni compiute dall’algoritmo a
fronte di un’istanza del problema di dimensione n.
D’ora in avanti chiameremo questa misura
dell’efficienza complessità computazionale
dell’algoritmo.
A parità di correttezza della soluzione prodotta a
fronte di una stessa istanza dello stesso problema,
considereremo migliore l’algoritmo con la complessità
computazionale più bassa.
Se A e B sono due algoritmi che risolvono lo stesso
problema e se f(n) e g(n) sono le funzioni che
esprimono la complessità dei due algoritmi, allora A è
migliore di B se, al crescere di n, risulta f(n) ≤ g(n).
Confronto dell’efficienza di algoritmi
f(n) numero di operazioni
n numero di dati in input
…
Come cresce la complessità...!
(Pag.30)
Nel primo problema (minimo su un insieme)
aumentando di un elemento l’insieme in input, si
aumenta di un’operazione il lavoro dell’algoritmo:
f(n) = n
Nel secondo problema (ordinamento di un insieme)
aumentando la cardinalità dell’insieme in input si
aumenta in modo quadratico il lavoro dell’algoritmo:
f(n) = n2
Nel terzo problema (clique su un grafo) aumentando
di un elemento l’insieme in input si raddoppia il lavoro
dell’algoritmo: la crescita è esponenziale: f(n) = 2n
f(n) = 2n f(3) = 8, f(4) = 16, . . . ,
f(20) = 1.048.576, . . . ,
f(100) = 1.267.650.600.228.229.401.496.703.205.376
E a pag.31
Raggruppiamo i problemi (pag.34)
Una delle grandi passioni dei matematici è quella di
“classificare” gli oggetti in base alle loro proprietà.
Definiamo la classe P dei problemi polinomiali
come l’insieme deiproblemi che possono essere
risolti da un algoritmo di complessità polinomiale.
Non è una definizione banale, infatti il problema del
minimo, il problema dell’ordinamento e moltissimi altri
problemi rientrano in questa categoria...
... e abbiamo visto che esistono problemi, come quello
delle clique di un grafo, che non appartengono alla
classe P.
M. Liverani - Il più grande problema dell'Informatica 38
Il più grande problema dell’informatica
(pag.38)
La domanda posta da questo problema a questo
punto è semplice: In altri termini: esiste veramente
qualche problema verificabile in tempo polinomiale
che non possa essere risolto in tempo
polinomiale?
La domanda non è banale e neanche assurda: per i
problemi come il problema clique, di cui sappiamo
verificare la soluzione in tempo polinomiale, fino ad
oggi nessuno è stato in grado di formulare un
algoritmo polinomiale in grado di risolvere il problema.
Ed inoltre nessuno fino ad oggi è stato in grado di
dimostrare che un algoritmo risolutore polinomiale per
quei problemi non esiste
P = NP?
Il più grande problema dell’informatica
(pag.41)
Quindi la domanda “P = NP?” è legittima: esiste un
algoritmo risolutore polinomiale per i problemi che
oggi sono in NP ma non sono in P?
– Se esistesse un algoritmo polinomiale per ogni
problema che è in NP P allora si potrebbe
concludere che P = NP.
– Viceversa basterebbe trovare anche un solo
problema in NP per cui si dimostri l’impossibilità di
costruire un algoritmo risolutore polinomiale per
concludere che P = NP.
Una classe privilegiata di problemi difficili
(pag.42)
Definiamo una classe speciale: la classe NPC dei
problemi NP completi, costituita da quei problemi Q
che sono NP e tali che le istanze di tutti gli altri
problemi NP possono essere trasformate in tempo
polinomiale in istanze di Q
I problemi NPC sono allora il “club” dei problemi più
difficili tra i problemi NP il problema clique fa parte
della classe NPC
M. Liverani - Il più grande problema dell'Informatica 43
La “classificazione” si arricchisce (pag.43)
…
P: problemi risolubili in tempo polinomiale
NP: problemi verificabili in tempo polinomiale
NPC: problemi NP a cui ci si può ricondurre in tempo
polinomiale
Il sugo della storia (pag.44)
Se trovo un algoritmo polinomiale per risolvere un
problema NPC allora posso risolvere in tempo
polinomiale tutti i problemi NP e quindi P = NP
Se dimostro che un solo problema NPC non può
essere risolto in tempo polinomiale, allora questo è
sufficiente per concludere che P = NP
La sfida è ancora aperta! “
Conclusioni
E noi vogliamo partecipare a questa sfida, limitatamente alla
fattorizzazione come sottoproblema di P = NP, con nuovi
spunti e possibili scorciatoie, alcune ancora da approfondire,
e reperibili in questo lavoro e nei Rif. 1 e 2 (ancora non
sufficienti però per impensierire la crittografia RSA, ma non è
questo il nostro scopo, bensì la pura conoscenza matematica),
per risolvere, almeno parzialmente, il problema della
fattorizzazione veloce
Riferimenti
1) “I NUMERI RSA : UNA PICCOLA STATISTICA SUI
RAPPORTI r = q/p E RELATIVE OSSERVAZIONI
2) - Numero RSA - 2048: una previsione sulla stima
approssimativa dei suoi fattori p e q Francesco Di Noto, Michele Nardelli
3) Il più grande problema irrisolto dell’informatica
Un breve percorso intorno al concetto di complessità computazionale
Marco Liverani [email protected] 5 aprile 2005
Sul sito www.mat.uniroma3.it/users/liverani/doc/peano2005_lucidi.pdf