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