Complessit computazionale Problemi P e NP Problemi NP

Complessità computazionale Problemi P e NP Problemi NP Completi Crittografia Asimmetrica

Complessità computazionale Un problema spesso può essere risolto utilizzando algoritmi diversi. Come scegliere il “migliore”? La bontà o efficienza di un algoritmo si misura in base alla quantità minima di risorse sufficienti per il calcolo: • Il tempo richiesto per eseguire le azioni elementari • Lo spazio necessario per memorizzare e manipolare i dati. La risorsa di maggior interesse è il tempo.

Complessità computazionale Non è significativo misurare il tempo di calcolo di un algoritmo in base al numero di secondi richiesti per l’esecuzione su un elaboratore di un programma che lo descriva Infatti, tale tempo dipende da diverse cose, in particolare dalla velocità dell’elaboratore. Una buona misura dell’efficienza di un algoritmo deve prescindere dal calcolatore utilizzato. Occorre una misura “astratta” che tenga conto del “metodo di risoluzione” con cui l’algoritmo effettua la computazione

Complessità computazionale La complessità dei problemi da risolvere dipende dalla dimensione dei dati in ingresso Il tempo di calcolo si può quindi esprimere come: Il numero complessivo di operazioni elementari in funzione della dimensione n dei dati in ingresso (istanza)

Complessità computazionale Le operazioni elementari sono quelle: üaritmetiche ülogiche üdi confronto üdi assegnamento Solitamente, il numero di operazioni considerate è valutato nel caso peggiore, ossia nel caso di dati in ingresso più sfavorevoli tra tutti quelli di dimensione n

Complessità computazionale Facciamo un esempio: Proviamo a stimare il numero di operazioni elementari che facciamo moltiplicando due numeri di n cifre, con la classica moltiplicazione in colonna. Otteniamo un numero di operazioni che cresce in modo quadratico con n (proporzionale a n 2)

Complessità computazionale Importante: La complessità (=numero di operazioni), così definita, è una proprietà dell’algoritmo che risolve il problema, non del problema in sé. L’algoritmo per il calcolo del MCD attraverso la fattorizzazione in numeri primi, ha una complessità molto elevata (i. e. è poco efficiente), mentre esiste un algoritmo con una complessità molto più bassa (i. e. è più efficiente).

Complessità computazionale Un esempio “grande” di moltiplicazione 1. 634. 733. 645. 809. 253. 848. 443. 133. 883. 865. 090. 859. 841. 783. 670. 0 33. 092. 312. 181. 110. 842. 389. 333. 100. 104. 508. 151. 212. 118. 167. 511. 579 X 1. 900. 871. 281. 664. 822. 113. 126. 851. 573. 935. 413. 975. 471. 896. 789. 968. 515. 493. 666. 638. 539. 088. 027. 103. 802. 104. 498. 957. 19 1. 261. 465. 571 = ? La risposta è: 3. 107. 418. 240. 490. 043. 721. 350. 750. 035. 888. 567. 930. 037. 346. 022. 8 42. 727. 545. 720. 161. 948. 823. 206. 440. 518. 081. 504. 556. 346. 829. 671. 723. 286. 782. 437. 916. 272. 838. 033. 415. 471. 073. 108. 501. 919. 548. 52 9. 007. 337. 724. 822. 783. 525. 742. 386. 454. 014. 691. 736. 602. 477. 652. 3 46. 609 Richiede meno di un secondo di tempo di calcolo!

Complessità computazionale Un esempio grande di fattorizzazione ? X ? = 3. 107. 418. 240. 490. 043. 721. 350. 750. 035. 888. 567. 930. 037. 346. 022. 842. 727. 545. 720. 161. 948. 823. 206. 440. 518. 081. 504. 556. 34 6. 829. 671. 723. 286. 782. 437. 916. 272. 838. 033. 415. 471. 073. 108. 501. 9 19. 548. 529. 007. 337. 724. 822. 783. 525. 742. 386. 454. 014. 691. 736. 602. 477. 652. 346. 609 La risposta è: 1. 634. 733. 645. 809. 253. 848. 443. 133. 883. 865. 090. 859. 841. 783. 670. 0 33. 092. 312. 181. 110. 842. 389. 333. 100. 104. 508. 151. 212. 118. 167. 511. 579 X 1. 900. 871. 281. 664. 822. 113. 126. 851. 573. 935. 413. 975. 471. 896. 789. 968. 515. 493. 666. 638. 539. 088. 027. 103. 802. 104. 498. 957. 19 1. 261. 465. 571 Richiede una decina di anni di tempo di calcolo!

Complessità computazionale ! Non ancora fattorizzato: 740375634795617128280467960974295731425931888892312890 849362326389727650340282662768919964196251178439958943 305021275853701189680982867331732731089309005525051168 77063299072396380786710086096962537934650563796359 Numero di 212 cifre: RSA-704 Erano stati offerti (nel 1991) 30. 000 $, ma la gara è stata chiusa nel 2007 e nessuno ha vinto il premio!

Complessità computazionale Per avere una definizione formale di operazione elementare si ricorre alla macchina deterministica di Turing, cioè un modello di calcolo costituito da un insieme di stati, un nastro suddiviso in celle, un alfabeto finito di valori scrivibili in ogni cella e una testina di lettura posizionata su una di queste. L’insieme degli stati contiene uno stato particolare, chiamato stato iniziale e un sottoinsieme di stati detti finali. Ogni cella contiene un solo simbolo estratto da un alfabeto fissato. Il funzionamento della macchina è determinato da un controllo centrale che consente di eseguire una sequenza di mosse a partire da una configurazione iniziale.

Complessità computazionale In questa configurazione lo stato corrente è quello iniziale, una stringa di input (istanza) è collocata nelle prime celle del nastro e la testina legge il primo simbolo; tutte le altre celle contengono un simbolo speciale chiameremo blanck. Quindi ogni mossa è univocamente determinata dallo stato nel quale la macchina si trova e dal simbolo letto dalla testina. Eseguendo una mossa la macchina può entrare in un nuovo stato, stampare un nuovo simbolo nella cella su cui è posizionata la testina di lettura e, infine, spostare quest’ultima di una posizione a destra oppure a sinistra. Se la sequenza di mosse eseguite è finita diciamo che la macchina si arresta sull’ouput considerato e diciamo che tale ouput è accettato se lo stato raggiunto nell’ultima configurazione è finale.

Problemi P Definizione 1 (Classe P). Un problema A appartiene alla classe P se esiste un algoritmo di soluzione la cui complessità è polinomiale nelle dimensioni dell'input. Più sinteticamente, un problema si dice in P se può essere risolto in tempo polinomiale. Un problema appartenente alla classe P si dirà polinomiale. (A soluzione “Veloce”)

Problemi P La moltiplicazione di due numeri, la divisione con resto, il calcolo del MCD, sono esempi di problemi di classe P.

Macchine non deterministiche Introduciamo un modello di calcolo non deterministico. In “parole povere” possiamo dire che una macchina non deterministica `e un modello di calcolo che può compiere una o più scelte durante ogni computazione. Di conseguenza il suo funzionamento su un dato input non è più determinato da un’unica computazione ma da un insieme di computazioni distinte, una per ogni possibile sequenza di scelte compiute.

Macchine non deterministiche Quindi se siamo “fortunati” otteniamo la soluzione del problema cercato, altrimenti no. (A meno di non considerare una macchina “quantistica” che può avere contemporaneamnte diversi stati possibili “in parallelo”…). Il tempo di calcolo di una macchina non deterministica `e definito dalla più lunga computazione della macchina sull’input considerato.

Problemi NP Definizione 2 (Classe NP). La classe NP è la classe dei problemi risolubili da una macchina non deterministica che funziona in tempo polinomiale. Alternativamente: Un problema A appartiene alla classe NP se, data un'istanza di tale problema, è possibile fornire un “certificato” dal quale si possa vericare in tempo polinomiale se tale istanza è verificata. Più sinteticamente, un problema si dice in NP se una possibile soluzione è vericabile in tempo polinomiale.

Problemi NP Un problema appartenente alla classe NP si dirà “Polinomiale Non deterministico”. (A “Certificazione veloce”). La classe NP, chiaramente contiene la classe P, ma per essere sicuri che un problema NP non sia P, occorre garantire che non esista nessun algoritmo polinomiale risolvente il problema.

Problemi NP

Problemi NP • P “tempo Polinomiale” Problemi risolubili velocemente • NP “tempo Non deterministico Polinomiale” Problemi verificabili velocemente

Problemi NP Vediamo qualche esempio di problema NP, che a tutt’oggi e ritenuto non-P. Innanzitutto il problema della fattorizzazione di un numero in fattori primi.

Problemi NP Il problema della soddisfacibilità per formule booleane. (SAT) Data come istanza una formula booleana esiste una assegnamento di valori 0 e 1 alle variabili che la rende vera ?

Problemi NP KNAPSACK (ESATTO) Data, come istanza, una successione finita di numeri interi (anche alcuni uguali) (francobolli) ed un ulteriore numero intero K (affrancatura) è possibile selezionare alcuni dei numeri dati affinché la loro somma sia esattamente K?

Problemi NP

Problemi NP

Problemi NP

Problemi NP

Riduzione polinomiale Consideriamo due problemi A e B. Diciamo che A è polinomialmente riducibile in B se esistono funzioni, calcolabili in tempo polinomiale da una macchina deterministica, tale da trasformare ogni istanza di A in una di B, e la corrispondente “risposta” all’istanza di B in una all’istanza originale di A. La relazione “polinomialmente riducibile” è banalmente transitiva.

Riduzione polinomiale Se A è polinomialmente riducibile in B allora B è in qualche modo più “complesso” di A, nel senso che se B è polinomiale, anche A lo è, ma non vale il viceversa. Se A è polinomialmente riducibile in B e contemoraneamente B è polinomialmente riducibile in A, i due problemi hanno la medesima complessità polinomiale (sono equivalenti)

Problemi NP-completi Definizione: (Problema NP-completo). Un problema A si dice NP-completo se: • A NP • Preso un qualunque problema B NP, B si riduce polinomialmente ad A.

Problemi NP-completi I problemi NP completi sono quindi i “più complessi” della classe NP. Se si dimostrasse che un problema NP completo è polinomiale, allora automaticamente P=NP (!).

Problemi NP-completi Teorema fondamentale (di Cook): Il problema della soddisfacibilità per formule booleane. (SAT) è NP –completo. A questo punto per dimostrare che un problema A NP è NP completo basta dimostrare che SAT (od una altro problema NP completo) è polinomialmente riducibile ad A.

Problemi NP-completi Esempi di NP completi: ü SAT ü CLIQUE ü KNAPSACK E il problema della fattorizzazione in numeri primi? Non si sa!.

Chiavi asimmetriche In un cifrario a chiave simmetrica le due chiavi di cifratura e di decriptazione o sono identiche, o sono ricavabili facilmente l’una dall’altra. Conoscere una di esse quindi implica la (quasi) immediata conoscenza dell’altra. Con i cifrari a chiave asimmetrica invece, è possibile rendere nota una delle due chiavi senza, in sostanza, rendere nota la seconda.

Chiavi asimmetriche La costruzione di chiavi asimmetriche si basa su problemi NP, non-P (esempio: la fattorizzazione). La possibilità di certificazione veloce, unita alla “non velocità” di risoluzione del problema crea la necessaria Asimmetria tra il problema e il suo inverso.

Chiavi asimmetriche Infatti se la risoluzione del problema, per un istanza sufficientemente lunga, è possibile solo in via teorica, ma non per via pratica, è possibile partire da una soluzione S per creare “velocemente” un’istanza per cui I per la quale S è affermativa (è una soluzione corretta). Da I non si potrà però ritrovare S senza conoscerla a priori.

Chiavi asimmetriche In un cifrario a chiave asimmetrica si genera in modo casuale una chiave privata (“forte”) costituita da una Soluzione S del problema NP, e poi da essa una chiave pubblica (“debole”) che è costituita dall’istanza I. Dalla chiave pubblica non si può risalire a quella privata!!

Chiavi asimmetriche Nei sistemi di comunicazione criptata (come quelli utilizzati per le comunicazioni sicure via internet) la chiave privata è quella per decriptare (ed è posseduta solo dal destinatario), quella pubblica è quella per criptare (che viene comunicata liberamente).

Chiavi asimmetriche Nei sistemi di certificazione “non in presenza” dell’ identità di una persona (firma digitale), la chiave privata è quella per criptare (assegnata da un ente certificatore ad una persona, previa identificazione), quella pubblica è quella per decriptare (resa disponibile a chiunque da parte dell’ente certificatore).

Chiavi asimmetriche Per garantire l’identità di una persona, il soggetto che deve identificarsi non farà altro che criptare con al sua chiave privata un testo in chiaro. A questo punto chiunque può sincerarsi della reale identità del “criptatore” decifrando, tramite la chiave pubbilca, il testo criptato e verificandone l’esattezza.

- Slides: 41