Sei sulla pagina 1di 26

A.

Complessita astratta

1. Assiomi di Blum
Lo studio della complessità tratta dell’ammontare delle risorse che sono necessarie per computare una funzione. Esse
possono essere lo spazio fisico utilizzato, il tempo o qualche misura pesata sul tempo che il processore impiega, o
addirittura il denaro che bisogna spendere. Gli assiomi di Blum sono validi per qualunque misura si scelga, a patto
che sia rigorosa e ben definita.
Nel corso della trattazione, ove non esplicitamente specificato, quando diremo che una funzione è “ricorsiva”,
intenderemo che è “totale e computabile” e, quando diremo che un predicato è “ricorsivo”, intenderemo che è
“totale e decidibile”.

Una funzione binaria parziale C :    è detta misura di complessità 2

(MC) se soddisfa i seguenti assiomi di Blum: C  x, i     x   (AB1) e i

C  x, i   y  è ricorsivo* (AB2).
Per semplicità, scriveremo Ci  x   C  x, i  e penseremo a tale simbolo come la complessità della
computazione di una certa macchina quando al programma di codice i viene assegnato x come
input.

Lemma
Sia Ci  x  il numero di passi che un programma di codice i impiega sull’input x .

C è una MC.
AB1) Banale, per definizione.
AB2) Si ricava dalla computabilità del numero di passi di un programma (cfr. Computabilità).

Lemma
Sia M i  x  il più grande valore assunto da qualunque variabile in un programma di codice
i sull’input x se esso si arresta,  altrimenti.
M è una MC.
AB1) Banale, per definizione
AB2) Per dimostrare la ricorsività di  M  x, i   y  , si analizza la computabilità del seguente
algoritmo:

1. Se si raggiunge una configurazione tale che una qualche variabile (le variabili sono in numero
finito) assume un valore maggiore di y , il predicato è falso;
2. altrimenti, se il programma si arresta con tutte le variabili aventi valori minori o uguali a y , il
predicato è vero;
3. altrimenti, se la stessa configurazione (con tutti i valori delle variabili minori o uguali a y ) si
ripete due volte, il predicato è falso.

(*) Se C  x, i   , considereremo per convenzione falso il predicato, donde la sua totalità


Lemma
Sia Ci  x   i  x  .

C non è una MC.


AB1) È banalmente soddisfatto
AB2) Vi sono casi in cui non è soddisfatto. Per esempio, sia S un insieme RE, ma non ricorsivo.
0 se x  S
Se poniamo i  x    , si ha i  x   0  x  S e quindi il predicato non è
 altrimenti
ricorsivo.

Lemma
Le seguenti asserzioni sono equivalenti:
a) AB2
b) C  x, i   y  è ricorsivo (AB2a)
c) C  x, i   y  è ricorsivo (AB2b)
 
a  b) Si vede subito che Ci  x   y  Ci  x   y    Ci  x   y  1  y  0 . 
b  c) Osserviamo che Ci  x   y   z  y   Ci  x   z  .

c  a) È banale notare che Ci  x   y  Ci  x   y  1 .

Diciamo che una funzione ricorsiva r  x  è un fattore di scala (FS) se essa è


crescente e lim
x 
r  x    (cioè assume valori arbitrariamente grandi).

Diciamo che un predicato P  x vale quasi sempre (QS) se esso vale


x    m1 , m2 ,, mk  , cioè dovunque, eccetto un numero finito di casi.

Teorema
(isomorfismo delle MC)

Siano C una MC e r un FS. Sia data la funzione Di  x   r  Ci  x   .

D è una MC.
AB1) È ovvio, dato che r è ricorsiva e C è una MC.
AB2) Per verificare la ricorsività di  D  x  y ,
i basta trovare il numero t tale che
r  0   r 1    r  t   y  r  t  1 e osservare che Ci  x   t  Di  x   y . Infatti,
Ci  x   t  Di  x   r  Ci  x    r  t   y ed anche t  1  Ci  x   y  r  t  1  r  Ci  x    Di  x  .

Questo teorema indica che tutte le misure di complessità sono legate tra loro alla stregua di Ci e Di .
Teorema
(della connessione ricorsiva)

Siano C e D due MC.


r funzione ricorsiva, tale che r  x, y   r  x, y  1 ,  C  x   r  x, D  x   
i i è QS i e
 D  x   r  x, C  x  è QS i .
i i

Osserviamo che, per l’AB1, Ci  x   i  x    Di  x   .

Dall’AB2a, sappiamo che il predicato  Ci  x   y  Di  x   y  è ricorsivo, per cui la funzione


max  Ci  x  , Di  x   se Ci  x   y  Di  x   y
hi  x, y    lo è anche.
0 altrimenti

Definiamo r  x, y   y  max max h j  x, z  . Essa è ovviamente ricorsiva.


jx z y

Si ha r  x, y  1  ( y  1)  max max h j  x, z   y  max max h j  x, z   r  x, y  .


j  x z  y 1 j x z y

Ora, posto x  i , avremo r  x, Di  x    max max h j  x, z   max h j  x, Di  x    hi  x, Di  x   


j  x z  Di  x  j x


(ricavando hi  x, y  per y  Di  x  )  max  Ci  x  , Di  x    Ci  x  , per cui Ci  x   r  x, Di  x   
vale x  i e quindi è QS.

Dalla simmetria della definizione di h , si ricava analogamente che anche Di  x   r  x, Ci  x    


vale x  i e quindi è QS.

Il teorema precedente ci dà l’autorizzazione, in certi casi, ad affermare che se una proprietà è vera per una certa
misura di complessità, lo sarà per tutte.
2. Gap e Speed-Up

Teorema
(del gap)

Data g :  2   , funzione ricorsiva tale che g  x, y   y y   , sia C una MC.

t funzione ricorsiva, tale che, se xi e Ci  x   g  x, t  x   , allora Ci  x   t  x  .

Supponiamo che g sia una funzione che cresce molto velocemente. Il teorema ci assicura che, se scegliamo t in
maniera opportuna, a partire da un certo valore dell’input assegnato ad un programma, la sua complessità data
rimane “confinata” al di sotto di tale funzione, mentre noi ci aspetteremmo che crescesse come g . Questo è il “gap”
di cui si parla.

Se abbiamo due computer, uno molto più veloce dell’altro, che eseguono lo stesso programma
di codice i con tempo di esecuzione rispettivamente Ci e Di (sono chiaramente MC), e
definiamo g  x, y   r  x, y   y  1 , dove r è data dal teorema di connessione ricorsiva, se x  i
avremo Ci  x   r  x, Di  x    g  x, Di  x   QS. Per cui, se il secondo computer esegue il programma
in tempo di esecuzione Di  x   t  x  , avremo g  x, Di  x    g  x, t  x    Ci  x   g  x, t  x   , che
verifica le ipotesi del teorema del gap, da cui Ci  x   t  x  QS. Quindi, per input sufficientemente
grande, i due computer effettueranno comunque la computazione nello stesso tempo t  x  !

Teorema
(dello speed-up)

Data g :  2   , funzione ricorsiva, sia C una MC.


f funzione ricorsiva, tale che f  x  x e, se i  x   f  x  ,  j  i | j  x  f  x e
g  x, C j  x    Ci  x  .

Il teorema dello speed-up ci dice che per quanto alta sia la complessità con cui una funzione viene computata da un
certo programma, ne esisterà certamente un altro che la computa con complessità minore.

Consideriamo un’altra MC D , e sia r la funzione fornita dal teorema di connessione ricorsiva.


Avremo D j  x   r  x, C j  x   QS. Se poniamo g  r nel teorema precedente, otteniamo
D j  x   Ci  x  QS. Cioè, se con un altro programma otteniamo un miglioramento di un tipo di
complessità, ne peggioriamo un altro tipo. Questo fondamentale risultato è detto speed-vs-size.
B. Classi di Complessita

1. Linguaggi e riconoscimento di stringhe


Dato un alfabeto di simboli A  s0 , s1 ,, sk  , indichiamo con A* l’insieme di tutte le combinazioni
dei simboli di A .

Un insieme L è detto linguaggio su un alfabeto A se L  A* . Un elemento


s  si1 si2  sim  A* è detto stringa. Tale stringa si dice accettata da L se s  L .

Essendo una qualunque stringa si1 , si2 ,, sim codificabile in maniera univoca mediante il numero
naturale 2i0  3i1  5i2    pmim1 , dove pi è l’ i -esimo numero primo, possiamo dire che A* è isomorfo
a  , e scriveremo A*   .

Un linguaggio L  A* si dice ricorsivo (o RE) se  X   ricorsivo (o RE) tale


che L  X .
Di conseguenza, quando un linguaggio è ricorsivo, possiamo sempre decidere quando una
stringa vi appartiene; se è RE, la decidibilità è parziale. Quindi tutte le considerazioni sugli
insiemi numerici possono essere rapportati a quelli di stringhe e viceversa.
Data una funzione computabile f, se enumeriamo i suoi valori consideriamo
L   f  0  , f 1 ,, f  n  ,  A , dove A  0,1, ,9 , avremo che calcolare
*
f è analogo a
verificare che una stringa è accettata da L . Quindi, nella nostra trattazione, considereremo,
piuttosto che la complessità delle funzioni, quella degli algoritmi che decidono se una stringa
appartiene o no a un certo linguaggio ricorsivo. Se quest’ultimo è RE, riterremo la complessità
infinita.
2. Complessità spaziale e temporale

Data una [N]TM [non-]deterministica a k  1 nastri M , con il nastro di


input finito di lunghezza n e quelli di output semi-infiniti, diciamo che
essa è di complessità spaziale S  n  , ovvero che il linguaggio riconosciuto
da M è accettato in spazio S  n  , se il massimo numero di caselle che la
[N]TM occupa su ciascun nastro [per ogni ramo di computazione]
prima di arrestarsi è al più S  n  .
Per semplicità, considereremo sempre S  n   1n   , cioè ogni TM utilizzerà almeno una casella
durante la computazione.

Data una [N]TM a k  1 nastri infiniti M , diciamo che essa è di complessità


temporale T  n  , ovvero che il linguaggio riconosciuto da M è accettato in
tempo T  n  , se il numero totale di spostamenti [per ogni ramo di
computazione] che la testina della [N]TM compie prima dell’arresto su
un input di lunghezza n è al più T  n  .
Per semplicità, considereremo sempre T  n   n n   , cioè ogni TM impiegherà almeno il tempo
di leggere le caselle di input durante la computazione.
Da questo punto in poi, considereremo solo linguaggi ricorsivi, in modo tale da supporre implicitamente che la
[N]TM considerata si arresta sempre.

Indichiamo con DSPACE  S  n   e NSPACE  S  n   la famiglia dei linguaggi accettati


rispettivamente da una TM e da una NTM in spazio S  n  . Indichiamo con DTIME T  n   e
NTIME T  n   la famiglia dei linguaggi accettati rispettivamente da una TM e da una NTM in
tempo T  n  .
3. Riduzione dei nastri e speed-up

Teorema
(sulla compressione dei nastri)

Sia L un linguaggio accettato da una TM con k nastri in spazio S  n  .

L èaccettato da una TM con k nastri in spazio cS  n  c    , cioè


DSPACE  S  n    DSPACE  cS  n   c    .

Senza perdita di generalità, possiamo supporre 0  c  1 (se c  1 , basterà utilizzare la nuova


1
costante c  ).
c

1
 ) Preso r   r  1 , sia A  b , s1 , , sm  il nostro alfabeto.
c
Sia M la TM dell’ipotesi. Consideriamo una porzione di nastro larga r caselle e codifichiamo i
simboli contenuti in uno solo, incorporando nella codifica anche la presenza ed eventuale
posizione della testina. Così avremo una nuova TM M , con m  (r  1)(m  1)r simboli e un
nuovo alfabeto A  s1 , s2 ,, sm  . Gli spostamenti della testina e i cambi di simbolo su M
corrisponderanno a cambi di simbolo su M , solo che adesso verranno occupate al massimo
S n
 cS  n  caselle. Quindi avremo DSPACE  S  n    DSPACE  cS  n   .
r
 ) È banale perché, per la scelta di c , abbiamo cS  n   S  n  , e quindi un linguaggio accettato
con l’utilizzo di meno caselle sarà sicuramente accettato con l’utilizzo di più caselle (fittizie).
Per cui, DSPACE  cS  n    DSPACE  S  n   .

Corollario
Sia L un linguaggio accettato da una NTM con k nastri in spazio S  n  .

L èaccettato da una NTM con k nastri in spazio cS  n  c    , cioè


NSPACE  S  n    NSPACE  cS  n   c    .

Teorema
(sulla riduzione dei nastri per la complessità spaziale)

Data una TM M con k nastri, sia L un linguaggio accettato da M in spazio S  n  .

L è accettato da una TM a nastro singolo in spazio S  n  .


Codifichiamo tutte le disposizioni di k simboli dell’alfabeto A  b , s1 , , sm  di M , più
l’eventuale posizione della testina e prendiamo una nuova TM M a nastro singolo, con il
k
nuovo alfabeto di  2  m  1  simboli. Gli spostamenti della testina e i cambi di simbolo su una
“colonna” di M corrisponderanno a cambi di simbolo su una casella di M , ma non verranno
mai occupate più di S  n  caselle.
A partire da ora, considereremo solo TM a nastro singolo, ove non diversamente specificato.
Data f  n  , definiamo inf f  n   lim inf  f  n  , f  n  1 , e sup f  n   lim sup  f  n  , f  n  1 , .
n  n  n  n 

Teorema
(del linear speed-up)

Dato k  1 e una TM M con k nastri, sia L un linguaggio accettato da M in tempo


T  n
T  n  , con inf .
n  n
L è accettato da una TM con k nastri in tempo cT  n  c    .

Codifichiamo l’alfabeto per la nuova macchina M raggruppando m simboli del vecchio in uno
solo e scegliendo m | cm  16 .
Il passo base è quello di leggere dal nastro di input di M e codificarlo su uno di quelli di
output. Quindi la nuova macchina M userà tali nastri di M scambiati di ruolo. Avremo che
n
occorrono n passi per leggere e per scrivere.
m
In seguito, bisogna considerare il controllo finito, per cui a m transizioni su M ne
corrisponderanno al massimo 8 su M (???). Quindi il tempo preso dalle transizioni sarà al
T n 
massimo 8 e, di conseguenza, il tempo totale T  n  impiegato da M sarà
m
n T n  n T n n T n
n  8 n
1 8 1 n   8  2  (possiamo supporre senza
m m m m m m
n T n   1 T n
perdita di generalità n  1 )  2n   8   2  n  8 .
m m  m m
T  n T n  T n 
Per ipotesi, inf    d  0  nd | n  nd  d , per cui n.
n  n n d
 1  T n  T n 2 1 8
Avremo allora, T  n    2   8  T n    .
 m d m  d md m 
16 1 c m 1 4 1
Per ipotesi cm  16  m    , In conclusione, se scegliamo d     , per
c m 16 4 8 c 8
n  max  nd ,1 , avremo T  n   cT  n  .

Corollario
T  n
Sia inf .
n  n
DTIME T  n    DTIME  cT  n   c    .

Ovviamente, se un linguaggio è riconosciuto da una TM un solo nastro sarà anche riconosciuto


da una a due nastri. Quindi il teorema precedente si potrà applicare a una TM con un qualsiasi
numero di nastri, da cui l’equivalenza generale.
Corollario
T  n
Sia inf .
n  n
NTIME T  n    NTIME  cT  n   c    .

Teorema
(sulla riduzione ad un nastro per la complessità temporale)

Data una TM M con k nastri, sia L un linguaggio accettato da M in tempo T  n  .

L è accettato da una TM a singolo nastro in tempo T 2 n  .

Codifichiamo tutte le disposizioni di k simboli dell’alfabeto A  b , s1 , , sm  di M , più


l’eventuale posizione della testina e prendiamo una nuova TM M a nastro singolo, con il
k
nuovo alfabeto di  2  m  1  simboli. Gli spostamenti della testina e i cambi di simbolo su una
“colonna” di M corrisponderanno a cambi di simbolo su una casella di M , Nel peggiore dei
casi, per ogni transizione su M , vi saranno al più T  n  transizioni su M (questo accade per
esempio quando bisogna cambiare tutti i simboli). Quindi, in totale, vi saranno al più
T  n   T  n   T 2  n  transizioni.

Corollario
Data una NTM M con k nastri, sia L un linguaggio accettato da M in tempo T  n  .

L è accettato da una NTM a singolo nastro in tempo T 2 n  .

Teorema
(sulla riduzione a due nastri per la complessità temporale)

Data una TM M con k nastri, sia L un linguaggio accettato da M in tempo T  n  .

L è accettato da una TM a due nastri in tempo T  n  log T  n  .

Corollario
Data una NTM M con k nastri, sia L un linguaggio accettato da M in tempo T  n  .

L è accettato da una NTM a due nastri in tempo T  n  log T  n  .

I teoremi di compressione, speed-up e riduzione ci dicono che, se vogliamo aumentare la


dimensione dell’input (o delle funzioni computate), non basta avere semplicemente un po più di
spazio o tempo, ma dobbiamo aumentarli di molto più che un fattore costante.
C. Confronto tra complessita

1. Gerarchie di complessità

Teorema
(di incompletezza gerarchica)

Sia f  n  una funzione ricorsiva.

L , linguaggio ricorsivo, tale che vale almeno una delle seguenti asserzioni:
1) L  DSPACE  f  n  

2) L  NSPACE  f  n  

3) L  DTIME  f  n  

4) L  NTIME  f  n  

1) Data la ricorsività della f ,  una TM che la computa e si arresta.

 1 w non è accettato dalla TM M w da esso codificata  


Costruiamo L   w | .
   2 M w occupa più di f  w  caselle sull'input w 

Presa una stringa w , il seguente algoritmo permette di decidere se w  L o no:


1. Assegniamo la stringa come input di una TM;
2. se si ferma avendo occupato meno di f  w  caselle, possiamo rispondere se w  L o no;

3. altrimenti, nel momento in cui si occupano più di f  w  caselle, w  L .

Per la TdC,  M , TM, che decide se w  L . Sia w il suo codice e, per assurdo, sia
L  DSPACE  f  n   . Possiamo dire se w  L ?

Premettiamo che, dato che L è accettato in spazio f  w  , la computazione non utilizza più di
f  w  caselle, per cui la condizione  2 è falsa. Inoltre:

- se w  L , dev’essere vera la 1 ( w  L ), ma ciò è assurdo;


- se w  L , dev’essere falsa la 1 ( w  L ), ma ciò è assurdo.

L’assurdo nasce dall’aver supposto che L  DSPACE  f  n   . Da qui la tesi.

2) 3) 4) La dimostrazione è analoga.

Il teorema ci dice che esistono delle gerarchie delle classi di complessità perché, se un certo
linguaggio è accettato in tempo o spazio f  n  , esiste sicuramente una funzione g  n  per cui
tale linguaggio non è accettato.
Una funzione S  n  è detta space-constructible (SC) se esiste una TM di
complessità spaziale S  n  , che su qualche input di lunghezza n utilizzi
esattamente S  n  caselle.
k
Le funzioni log n , n , 2n e n! sono SC.

Una funzione S  n  è detta fully space-constructible (FSC) se esiste una


TM di complessità spaziale S  n  , che su tutti gli input di lunghezza n
utilizzi esattamente S  n  caselle.
Una funzione FSC è ovviamente anche SC; inoltre qualunque funzione SC tale che S  n   n n   è anche FSC.

Lemma
Data una TM M di complessità spaziale S  n   log 2 n n   , sia L un linguaggio
accettato da M .
M , TM di complessità spaziale S n  che accetta L e si arresta su tutti gli
input.
Duplichiamo M su M . Siano s gli stati di M e t i suoi simboli. Quando L viene accettato,
vengono effettuate al massimo s(n  2) S  n  t S  n transizioni, altrimenti si avrebbe una
ripetizione, e la computazione non si arresterebbe. Aggiungiamo una traccia (insieme di
S n
caselle) che conta le transizioni: se M si arresta, lo farà prima di  4st   s(n  2) S  n  t S  n 
transizioni. Infatti, M imposta un contatore di lunghezza log 2 n in base 4st , e lo incrementa
ogni volta che viene esaminata una nuova casella al di qua della traccia contatore. Così, se M
va in loop avendo utilizzato solo m caselle, allora il contatore lo segnalerà quando avrà
max  m,log 2 n 
raggiunto il valore  4st   s (n  2) S  n  t S  n . Di conseguenza, M si arresterà su tutti gli
input.

Teorema
(sulla distinzione tra gerarchie spaziali)

S1  n 
Siano date le funzioni S1  n  , S 2  n   log 2 n , con S 2  n  FSC , tali che inf 0.
n  S  n 
2

 L  DSPACE  S 2  n   | L  DSPACE  S1  n   .

(???)

Corollario
S1  n 
Siano date le funzioni S1  n  , S 2  n   log 2 n , con S 2  n  soltanto SC , tali che inf 0.
n  S  n 
2

 L  DSPACE  S 2  n   | L  DSPACE  S1  n   .
Una funzione T  n  è detta time-constructible (TMC) se esiste una TM di
complessità temporale T  n  , che su qualche input di lunghezza n impieghi
esattamente tempo T  n  .
Una funzione T  n  è detta fully time-constructible (FTMC) se esiste una
TM di complessità temporale T  n  , che su tutti gli input di lunghezza n
impieghi esattamente tempo T  n  .
Una funzione FTMC è ovviamente anche TMC.

Teorema
(sulla distinzione tra gerarchie temporali)

T1  n  log T1  n 
Siano date le funzioni T1  n  , T2  n  , con T2  n  FTMC , tali che inf  0.
n  T2  n 

 L  DTIME T2  n   | L  DTIME T1  n   .

(???)
2. Relazioni tra gerarchie di complessità

Teorema
(sulle gerarchie di complessità)

Data la MC f  n  , sia L un linguaggio.

Valgono le seguenti asserzioni:


a) L  DTIME  f  n    L  DSPACE  f  n  

b)  L  DSPACE  f  n   f  n   log 2  
n n     c   | L  DTIME c f  n 
c) L  NTIME  f  n     c   | L  DTIME c f  n   
a) Se L  DTIME  f  n   , la TM che accetta L compirà al massimo f  n  transizioni, quindi non
esaminerà più di f  n   1 caselle per ogni nastro. Se compiamo un’opportuna codifica, in
modo che la TM contenga due simboli per casella, le celle utilizzate per ogni nastro saranno al
f  n  1
massimo  f  n  . Di conseguenza L  DSPACE  f  n  
2

b) Sia L  DSPACE  f  n   . Supponendo che venga accettato da una TM M con s stati e t


simboli, abbiamo che il numero delle differenti configurazioni è al più s(n  2) f  n  t f  n . Dato
che f  n   log 2 n n   , sicuramente  c   | n  0 c f  n  s(n  2) f  n  t f  n .

Se costruiamo una nuova TM M con un nastro che conta c f  n  ed un altro che simuli M ,
potremo utilizzare un terzo nastro che opera come segue:
f n
1. Se la simulazione di M non si arresta prima che il contatore raggiunga c , allora L non è
accettato (stiamo ripetendo una configurazione precedente  loop);
2. se la simulazione di M si arresta prima, anche la M si arresta e restituisce lo stesso
risultato.

In tal modo, avremo che L  DTIME c f  n .  


c) Sia L  NTIME  f  n   . Supponendo che venga accettato da una NTM M con s stati, t
simboli e k nastri, abbiamo che il numero delle differenti configurazioni è al più
k k f  n k
s  f  n   1 t . Se prendiamo d  s (t  1)3k , avremo d f  n   s  f  n   1 t k f  n  n  0 .

Una TM M può stabilire se M accetta L o no costruendo una lista di tutte le configurazioni


possibili a partire da quella iniziale. Tale processo viene svolto in tempo al massimo uguale al
quadrato della lunghezza di tale lista. Dato che essa non può essere di lunghezza maggiore di
d   volte la lunghezza di una configurazione, che può essere codificata con 1  k ( f  n   1)
f n

simboli, avremo che il tempo è al massimo c f  n  per qualche costante c   . Ne consegue che

L  DTIME c f  n . 
Teorema
(di Savitch)

Data S  n  FSC e tale che S  n   log 2 n n   , sia L  NSPACE  S  n   .

L  DSPACE S 2  n   .
Sia M una NTM di complessità spaziale S  n  . Per cui,  c   | c S  n è il numero massimo di
configurazioni su un input di lunghezza n . Perciò, se il numero di transizioni supera tale valore,
M non si arresta mai, perché la configurazione verrà ripetuta.
(i )
Con I1  I 2 intenderemo che, partendo dalla configurazione I1 , arriviamo alla configurazione
(i )
I2 in al più 2i transizioni. Per i  0 , possiamo verificare I1  I 2 controllando se
( i 1) ( i 1) (i )
 I  | I1  I   I   I 2 . Così lo spazio necessario per vedere se I1  I 2 è uguale a quello
necessario per registrare la configurazione corrente I  più quello per testare se si può arrivare
da una all’altra in al più 2i1 transizioni. Osserviamo che lo spazio richiesto per quest’ultimo
controllo può essere riutilizzato ogni volta.
Se prendiamo una TM M , con un nastro utilizzato come stack per le chiamate della procedura
di test, possiamo simulare M e verificare se accetta L mediante il seguente algoritmo ( I 0 è la
configurazione iniziale, I f quelle finali):

1. Sia m  log 2 c ;

2. per ogni I f su M di lunghezza al più S  n  :

a. se TEST( I 0 , I f , mS  n  ), ACCETTA;
3. HALT.

4. TEST ( I1 , I 2 , i )
(0)
 
a. Se i  0   I1  I 2  I1  I 2  , ritorna TRUE;
 
b. se i  0 , per ogni configurazione I  di lunghezza al più S  n  :

i. se TEST( I1 , I  , i  1 )  TEST( I  , I 2 , i  1 ), ritorna TRUE;


c. ritorna FALSE.

Dato che I1 , I 2 e I  sono configurazioni con non più di S  n  caselle, possiamo rappresentarle
in spazio S  n  . La simulazione della posizione della testina in binario usa log 2 n  S  n  caselle.
Inoltre il nastro di input è fisso e non abbiamo bisogno di ricopiarlo ad ogni configurazione. Il
parametro i può essere codificato in binario utilizzando non più di mS  n  caselle. Così ogni
stack occupa uno spazio   S  n   e, dato che i decresce, il numero totale di stack utilizzati

sarà   S  n   . Quindi in totale lo spazio utilizzato sarà  S 2  n  . Per il teorema sulla 
compressione dei nastri, possiamo riprogettare M in modo che lo spazio utilizzato sia
esattamente S 2  n  . Di conseguenza, L  DSPACE S 2  n  .  
D. Intrattabilita

1. Classi P e NP

Partendo dalle classi di complessità fondamentali, indichiamo con PSPACE   DSPACE n k   e
k 1

NPSPACE   NSPACE n k   le classi dei linguaggi riconosciuti in spazio polinomiale da una TM e
k 1
 
da una NTM rispettivamente; indichiamo con P   DTIME  n k  e NP   NTIME  n k  le classi dei
k 1 k 1
linguaggi riconosciuti in tempo polinomiale da una TM e da una NTM rispettivamente.
È ovvio che P  NP .
Da ora in poi, ci occuperemo principalmente solo dello studio della complessità temporale.

Un problema P si dice trattabile quando è risolvibile in tempo polinomiale (se lo


è deterministicamente, scriviamo P  P , altrimenti scriviamo P  NP ), altrimenti
è detto intrattabile. Stessa terminologia è adottata per un linguaggio L
riconoscibile in tempo polinomiale ( L  P oppure L  NP ).
Un algoritmo è detto efficiente se ha complessità polinomiale.
Per dimostrare che un problema P2  P , basta trovare un altro problema P1  P e far vedere
quest’ultimo è riducibile al primo. Affinchè la riduzione ci dia tale certezza, essa deve soddisfare
due condizioni:

1. Il tempo impiegato dev’essere polinomiale. Questo perché altrimenti non sapremmo se


l’inefficienza algoritmica deriva dal problema o dalla riduzione.

2. L’input di del problema conosciuto deve poter essere convertito in quello dell’altro in tempo e
spazio polinomiali. Per quanto riguarda il tempo, il motivo è lo stesso di cui sopra; per lo spazio,
la ragione è che potremmo ottenere lo stesso un tempo non polinomiale rispetto al primo input
perché il secondo lo è diventato pure, e quindi non sapere l’origine dell’inefficienza.

Un algoritmo (o una funzione) che, dato un problema (o un linguaggio), lo


converte in un altro e soddisfa le due condizioni precedenti è detto riduzione
[in tempo] polinomiale (PTR).
Per dire che un problema P1 si può ridurre ad un altro P2 mediante una PTR scriveremo P1  P2 .

Un problema P è detto NP-hard (NPH) se P  NP | P  P .


Un problema P è detto NP-completo (NPC) se valgono le seguenti
condizioni: [N] P  NP ; [H] P è NPH.
Si deduce facilmente che, se si trovasse un problema P  P che è anche NPC, allora avremmo
P  NP , ma non è ancora stato trovato ed è molto probabile che non si trovi.
Una formula del calcolo proposizionale è detta [in] CNF (forma normale
congiuntiva) se è la congiunzione di clausole nella forma  A1  A2    An  . È detta
[in] DNF (forma normale disgiuntiva) se è la disgiunzione di clausole nella forma
 A1  A2    An  .
Se ogni clausola ha esattamente k letterali, scriveremo k CNF o k DNF per indicarlo.
Denotiamo con SAT il problema della soddisfacibilità di una formula del calcolo proposizionale
(cioè della complessità di trovare un’interpretazione che la renda vera) e con SATCNF se
consideriamo solo formule CNF.

Per semplificare la notazione, scriveremo le clausole come Ci   A1 , A2 ,, An  e la formula CNF


data dalla loro congiunzione semplicemente come F  C1 , C2 , , Cm .

Lemma
Sia F una formula qualsiasi del calcolo proposizionale.
F si può ridurre in tempo polinomiale ad una formula CNF F equivalente alla
prima.

Teorema
(di Cook)

SAT è NPC.
Su un alfabeto di n variabili booleane, basta che una NTM prenda le 2n interpretazioni
[N] )
possibili e verifichi il valore di verità della formula. Dato che tale verifica può essere compiuta
in tempo polinomiale, si ha SAT  NP .
[H] ) Prendiamo un linguaggio L  NP . Esisterà una NTM M , che, in tempo polinomiale p  n  ,
accetta un input x   x1 , xn   L . Sia s0 , s1,..., sk  l’alfabeto di M e siano q1 ,..., qm gli stati
interni.
Intanto, osserviamo che, partendo da una casella base, la testina potrà fare al massimo p  n 
spostamenti a destra o altrettanti a sinistra. Quindi lo spazio utilizzato da M è al massimo
2 p  n   1 . Inoltre, dato che M non può cambiare più di p  n  stati diversi e scrivere più di
p  n  simboli diversi, abbiamo che m  p  n  e (considerando il simbolo presente sulla casella
di partenza) k  p  n  . Quindi se prendiamo le quadruple q j , sl ,  , q j , dato che  può anche
essere uno dei due simboli speciali di spostamento, troviamo che possono essere al massimo
   
m(k  1)(k  3)m  O m 2 k 2  O p 4  n  (ancora polinomiale).

Per ricavare una formula CNF che sarà ridotta a M , consideriamo le seguenti variabili:
- Q i, j  , i  0 p  n  , j  1 m : vera se, all’istante i , M è nello stato q j

- H i, c , i  0 p  n  ,  p  n   c  p  n  : vera se, all’instante i , la testina è sulla casella c

- S i, c, l  , i  0 p  n  ,  p  n   c  p  n  , l  0 k : vera se all’instante i , nella casella c c’è sl


Le variabili Q, H e S sono rispettivamente  
m   p  n   1  O p 2  n  ,
   
p  n  (2 p  n   1)  O p 2  n  e  k  1  p  n  (2 p  n   1)  O p 3  n  , il tutto ancora polinomiale.

Scriviamo le sub-formule che descrivono M (ove non diversamente specificato, gli indici
i, j , c, l variano come sopra):

- G1  Q i,1,, Q i, m ,Q i, j  , Q i, j  , con j  j : indica che, ad ogni istante, M si trova in
un unico stato

 
- G2  H i,  p  n  , , H i, p  n  ,H i, c  , H i, c con c  c : indica che, ad ogni istante, la
testina è su una sola casella
- G3  S i, c,0 ,, S i, c, k , S i, c, l  , S i, c, l  , con l  l  : indica che, ad ogni istante, nella
casella c è presente un unico simbolo

  
- G4  S 0,  p  n  ,0  ,,S 0, 1,0 ,S 0,0, x1  ,,S 0, n  1, xn , S 0, n,0 ,, S 0, p  n  ,0  , 
Q 0,1 ,H 0,0 : specifica lo stato iniziale
 
- G5  Q  p  n  ,1 : specifica lo stato finale di accettazione

La coerenza delle transizioni specificate dalle quadruple q j , sl ,  , q j viene descritta dall’ultima


sub-formula:
- G6  Q i, j  , H i, c , S i, c, l , Q i  1, j  ,Q i, j  , H i, c , S i, c, l , H i  1, c   ,

Q i, j , H i, c, S i, c, l , S i  1, j, l  , con   0 se   sl , altrimenti   1, l  l (il segno
dipende dallo spostamento a destra o a sinistra)
Si vede facilmente che la complessità di ciascuna sub-formula è polinomiale (anche se con
esponenti diversi), per cui tale anche sarà quella della formula finale G  G1, , G6 .
È evidente che x  L  c’è una computazione accettante per M su x in tempo polinomiale
 c’è un’assegnazione dei valori di verità alle variabili Q , H e S che soddisfa G . Di
conseguenza SATCNF è NPH. Ma dato che, per il lemma precedente, possiamo passare da una
formula qualsiasi ad una CNF in tempo polinomiale, anche SAT è NPH.
D’ora in avanti, quando parleremo di SAT lo considereremo come se fosse SATCNF , vista la sostanziale equivalenza tra i due problemi.

Indichiamo con co  NP la classe dei complementi dei linguaggi riconosciuti in tempo


polinomiale da una NTM .
Dato che la classe P è chiusa rispetto alla complementazione, possiamo dire che P  NP sse
co  NP  NP . A quest’ultimo problema, non sappiamo dare ancora una riposta, sebbene sia
molto probabile che co  NP  NP e quindi anche che P  NP .
2. Problemi NP-completi
Denotiamo con nSAT il problema della soddisfacibilità di una formula n CNF.

Teorema
3SAT è NPC.
Su un alfabeto di n variabili booleane, basta che una NTM prenda le 2n interpretazioni
[N] )
possibili e verifichi il valore di verità della formula. Dato che tale verifica può essere compiuta
in tempo polinomiale, si ha 3SAT  NP .
[H] ) Riduciamo da SAT a 3SAT .
Siano U e C rispettivamente l’insieme delle variabili e la formula CNF per SAT , contenente m
clausole. Costruiamo gli insiemi U  e C  che saranno i rispettivi analoghi per 3SAT nel modo
seguente:
1. Per i  1,, m

 
a. se Ci   X i  , siano U i  Yi , Z i  e Ci   X i , Yi , Zi  , X i , Yi , Z i , X i , Yi , Z i , X i ,Yi , Z i  
b. se Ci   X ,Y  , siano U   Z  e C    X , Y , Z  ,  X , Y , Z 
i i i i i i i i i i i

c. se Ci   X i , Yi , Z i  , siano U i   e Ci  Ci

 
d. se Ci  X i , Yi , Zi ,Wi ,1 ,,Wi ,t , siano U i  Vi ,1 ,,Vi , t     
e Ci  X i ,Yi ,Vi ,1 , Vi ,1 , Zi ,Vi ,2 ,

Vi ,2 ,Wi ,1 ,Vi ,3 ,, Vi ,t 1 ,Wi , t  2 ,Vi , t , Vi , t ,Wi ,t 1 ,Wi , t 
m
2. Siano U   U  U  e C  C,, C
i 1 m
i 1

In tal modo, otteniamo evidentemente una PTR. Per dimostrare che C è soddisfacibile sse C 
lo è, osserviamo che, qualunque valore di verità Vi , j abbia in una clausola di Ci , esso è negato
in quella successiva, e analizziamo i quattro casi dell’algoritmo precedente, facendo vedere,
per ogni i , che Ci è soddisfacibile sse Ci lo è:

a) Banale, perché se Ci è vera, per costruzione, almeno una delle clausole di Ci lo sarà; se è
falsa, lo saranno pure tutte queste ultime
b) Banale, per costruzione come il caso precedente
c) Ovvio, perché non si introduce nulla di nuovo
d) Se tutti i letterali di Ci sono falsi, lo sarà almeno una clausola di Ci perché in ciascuna di
esse ne è presente almeno uno e per l’osservazione; se almeno uno dei letterali di Ci è vero, la
clausola di Ci che lo contiene sarà vera e le altre saranno tutte vere per l’osservazione.
Di conseguenza, 3SAT è NPH.

Corollario
1SAT e 2SAT sono NPC.
1SAT è banale (vale anche per le formule DNF).
Per 2SAT si procede in maniera analoga a 3SAT (vale anche per le formule DNF).
Dato un grafo non direzionato G  V , E  , un sottoinsieme V V si dice vertex
cover per G di dimensione kV se V  k e   vi , v j   E accade che vi  V   v j  V  .

Denotiamo con VC il problema della VERTEX COVER per un grafo G  V , E  , cioè decidere se
esiste una sua cover, non banale (cioè V stesso) e non vuota, di dimensione k  V .

Teorema
VC è NPC.
Sia G  V , E  il grafo di p nodi per cui trovare la vertex cover V  .

Fissato 0  k  V , basta che una NTM prenda ogni V   V , con V   k , e verifichi se è una
[N] )

vertex cover. Dato che tale verifica può essere compiuta in tempo polinomiale e che i
sottografi da vagliare sono O p 2 , si ha VC  NP .  
[H] ) Riduciamo da 3SAT a VC .
Prendiamo una formula F con n variabili e m clausole e costruiamo il grafo G in modo che
abbia 2n vertici, corrispondenti ai letterali possibili, cioè alle variabili e alle loro negazioni; ogni
variabile sarà connessa da un lato alla sua negazione. Poi aggiungiamone altri 3m , connessi “a
triangolo”, ognuno dei quali corrisponde ad una clausola, e scorriamo F , connettendo un
vertice di ogni clausola con il letterale corrispondente.
Tale trasformazione dell’input prende spazio polinomiale (i vertici totali sono 2n  3m e i lati
sono n  6m ) e tempo polinomiale (i passi compiuti scorrendo la formula sono 3m ).
Dimostriamo che esiste una VC per G di dimensione k  n  2m sse F è soddisfacibile:
 ) Sia V '  V una VC per G .
Intanto, dev’essere per forza solo xi  V  o solo xi  V  , perché se fossero entrambi in V  ,
supereremmo n  2m , mentre se non ve ne fosse alcuno, non sarebbe una vertex cover. Per
questo motivo assegnamo a xi il valore vero se xi  V  , falso altrimenti. I restanti 2m vertici
sono due per ogni triangolo: se fossero di più, supereremmo n  2m ; se fossero di meno, non
avremmo una vertex cover. In tal modo, per ogni clausola si ha almeno un letterale vero,
altrimenti non saremmo riusciti a coprire i triangoli. Di conseguenza, F è soddisfacibile.
 ) Sia F soddisfacibile.
Essendoci in ogni coppia  xi , xi  almeno un letterale vero, per costruire la vertex cover,
inserisco intanto i vertici corrispondenti a tali letterali in V  . Poi inseriamo, per ogni clausola,
due vertici del triangolo corrispondente che non sono connessi a tali letterali. In questo modo,
tutti i vertici saranno coperti, per cui V  sarà una vertex cover per G .
Da tutto ciò, ricaviamo che VC è NPH.
Per esempio, data la formula F   x1 , x2 , x3 ,  x2 , x3 , x4  , avremo:

V   x1 , x1 , x2 , x2 , x3 , x3 , x4 , x4 , y11 , y12 , y13 , y21 , y22 , y23 

E   x1 , x1  ,  x2 , x2  ,  x3 , x3  ,  x4 , x4  ,  x1 , y11  ,  x2 , y12  ,  x3 , y13  ,  x2 , y21  ,  x3 , y22  ,  x4 , y23 

Con l’assegnazione dei valori di verità x1  T , x2  T , x3  F , x4  F , la formula è soddisfacibile e sarà


V    x1 , x2 , x3 , x4 , y12 , y13 , y22 , y23  , che è una cover di dimensione 8 per G .
Dato un grafo non direzionato G  V , E  , un sottoinsieme V V si dice
independent set per G se nessuna coppia di nodi di V è connessa da un lato in
E.

Denotiamo con IS il problema dell’INDEPENDENT SET per un grafo G  V , E  , cioè decidere se


esiste un suo independent set di dimensione 1  k  V .

Lemma
Dato un grafo G  V , E  , sia V   V .

V è una vertex cover per G sse V  V  è un independent set per G.

 ) Presi vi , v j  V  V  , per assurdo si abbia  vi , v j   E . Avremmo allora vi , v j  V  , ma


connessi da un lato. Assurdo, perché V  è una vertex cover per G .
) Per assurdo, V non sia una vertex cover per G. Allora
 vi , v j   E | vi , v j  V   vi , v j  V  V  , che è un’independent set. Assurdo, perché sono
connessi da un lato.

Teorema
IS è NPC.
Siano G  V , E  il grafo di n nodi per cui trovare l’independent set V  e 1  k  V .

[N] ) Fissato 1  k  V , basta che una NTM prenda ogni V   V , con V   k , e verifichi se è un
 
independent set. Dato che tale verifica può essere compiuta in tempo O n 2 e che i sottografi
 
2
da vagliare sono O n , si ha IS  NP .

[H] )Per il lemma, chiedersi se esiste una vertex cover per G di dimensione k equivale a
chiedersi se esiste un independent set per lo stesso grafo di dimensione n  k . Dato che la
differenza tra insiemi prende tempo polinomiale, ricaviamo che IS è NPH.
Dato un grafo non direzionato G  V , E  , un sottoinsieme V V si dice k-clique
per G se tutte le coppie di nodi di V  sono connesse da un lato in E.

Denotiamo con CLIQUE il problema del trovare se esiste una clique di dimensione 1  k  V per
un grafo G  V , E  .

Dato un grafo non direzionato G  V , E  , il grafo G  V , E  si dice grafo


complementare di G, dove E  v , v  V  V | v , v   E .
i j i j

Lemma
Dato un grafo G  V , E  , sia V   V .

V è un independent set per G sse V  è una clique per G.

 ) Presi vi , v j  V  , per assurdo si abbia v , v   E .


i j Avremmo allora v , v   E .
i j Assurdo,
perché V ' è un independent set per G .
 ) Per assurdo, V non sia un independent set per G. Allora
vi , v j  V  |  vi , v j   E   vi , v j   E . Assurdo, perché V  è una clique per G .

Teorema
CLIQUE è NPC.
[N] ) Basta che una NTM prenda ogni V   V , con V   k , e verifichi se è una clique. Dato che
 
tale verifica può essere compiuta in tempo O n 2 e che i sottografi da vagliare sono O n 2 , si  
ha CLIQUE  NP .
[H] )
Per il lemma precedente, chiedersi se esiste un independent set per G di dimensione k
equivale a chiedersi se esiste una clique per il suo complementare della stessa dimensione.
Dato che la differenza tra insiemi di coppie prende tempo polinomiale quadratico, ricaviamo
che CLIQUE è NPH.

Lemma
Dato un grafo G  V , E  , sia V   V .

V è una clique per G sse V  V  è una vertex cover per G.


Si ricava direttamente dai due lemmi precedenti.
Dati due insiemi disgiunti M e F della stessa cardinalità, e un insieme P  M  F ,
diciamo 2D-matching la costruzione di un insieme C  P in cui ciascun elemento
degli insiemi di partenza compare una sola volta.
Indichiamo con 2DM il problema del trovare se esiste un 2D-MATCHING per due insiemi M e
F della stessa cardinalità, dato un insieme P  M  F di “preferenze”. Questo è detto anche
“problema dei matrimoni”.

Teorema
2DM  P
È facile verificare tutti gli accoppiamenti in tempo polinomiale in maniera deterministica.

Dati tre insiemi disgiunti W , X ed Y della stessa cardinalità, e un insieme


P  W  X  Y , diciamo 3D-matching la costruzione di un insieme M  P in cui
ciascun elemento degli insiemi di partenza compare una sola volta.
Indichiamo con 3DM il problema del trovare se esiste un 3D-MATCHING per tre insiemi W , X
ed Y della stessa cardinalità, dato un insieme P  W  X  Y di “preferenze”. Questo è detto
anche “problema delle triangoli amorosi”, o “problema dei matrimoni a tre sessi”.

Teorema
3DM è NPC.
[N] )
Basta che una NTM prenda ogni insieme di combinazioni possibile e verifichi il matching
con le “preferenze”. Ciò può essere svolto in tempo polinomiale (cubico??). Di conseguenza
3DM  NP .
Riduciamo da 3SAT a 3DM (la struttura della formula darà l’insieme delle preferenze P ,
[H] )
mentre un’assegnazione dei valori di verità che la soddisfa ne genererà un matching M  P ).
Siano U  u1, u2 , , un  e C  C1 , C2 ,, Cm  rispettivamente l’insieme delle variabili e delle
clausole di una formula F di 3SAT . Per formare P  W  X  Y tale che le triple contenute non
abbiano sovrapposizioni di componenti, costruiamo tre suoi sottoinsiemi che rappresentano
“funzioni” separate di esso.
truth  setting Per ciascuna variabile ui  U , introduciamo l’insieme Ti  Ti  Ti , dove
     
Ti   ui  j , ai  j , bi  j  |1  j  m e Ti ui  j , ai  j  1, bi  j  |1  j  m   ui m, ai 1, bi  m .

Si vede subito che qualsiasi matching comprenderà esattamente m triple tutte da Ti o tutte
da Ti , per ogni i  1,, n (perché altrimenti qualche componente a o b coinciderebbe), e
quindi ciò costringe a scegliere un valore di verità per ui (vero se scegliamo Ti , falso se
scegliamo Ti ).


sat  testing Per ogni clausola c j  C , costruiamo l’insieme S j   ui  j  , s X  j  , sY  j  | ui  C j  
 
  ui  j , s X  j , sY  j  | ui  C j , per cui ogni matching conterrà esattamente una tripla di S j .
Ciò è possibile solo se almeno un letterale in ui  C j (o ui  C j ) non appartiene alle triple in Ti
scelte per il matching, che accade sse il valore di verità stabilito per quest’ultimo soddisfa la
clausola considerata.

garbage  collection Definiamo l’insieme G   ui  j , g X  k , gY k  , ui  j , g X k , gY  k  | 1  i  n,
1  j  m, 1  k  m(n  1) , dove ogni coppia  g X  k  , gY  k  deve essere “attriplata” con il solo
tra ui  j  e ui  j  che non compare in alcuna tripla di M  G . La struttura di G ci assicura che
ci siano m(n  1) coppie  g X  k  , gY  k  che possono essere coperte scegliendo M  G . In tal
modo, ogni qual volta che un sottoinsieme di P  G soddisfa i vincoli imposti dal
truth  setting e dal sat  testing , esso può essere esteso ad un matching per P .
Costruiamo gli insiemi del 3DM :
W  ui  j  , ui  j  | 1  i  n, 1  j  m , X  A  S X  GX , Y  B  SY  GY

A  ai  j  | 1  i  n, 1  j  m B  bi  j  | 1  i  n, 1  j  m
(dove S X  s X  j  | 1  j  m e SY  sY  j  | 1  j  m ),
GX   g X  k  | 1  k  m(n  1) GY   gY  k  | 1  k  m(n  1)
n m
P  Ti   S j  G  W  X  Y (che contiene 2mn  3m  2m 2n(n  1) triple, e quindi può
i 1 j 1

essere costruito in tempo polinomiale a partire da una formula 3 CNF).


Dimostriamo che esiste M , 3DM per P sse F è soddisfacibile:
 ) Si evince immediatamente da come è stato costruito P .
 ) Data un’assegnazione di valori di verità t : U  V , F  che soddisfa F , costruiamo M  P
nel modo seguente:
- per ogni clausola C j  C , sia z j  ui , ui | 1  i  n  C j un letterale tale che t  z j   V (deve
esistere necessariamente, per ipotesi);
- sia G   z, g k , g k  | z W , z  z , 1  j  m, 1  k  m(n  1)  G , (le componenti z
X Y j sono
elementi di W non corrispondenti agli z j scelti);
m
- sia M  
t  ui  V
Ti  
t  ui   F
Ti    z j  j  , s X  j , sY  j   G (si vede subito che M  P )
j 1
 
Si dimostra facilmente che si può comunque scegliere G in modo che M sia un matching.

Dato un insieme finito X , sia C  X  X  X un insieme di triple di X in cui sono presenti tutti
gli elementi di X almeno una volta in una qualsiasi posizione. Denotiamo con X 3C il problema
del trovare se esiste un’EXACT 3-SET COVER per X , con X  3n , cioè se esiste C  C tale
che le componenti di X nelle triple compaiono una volta sola in una qualche posizione.

Teorema
X 3C è NPC.
Osserviamo che X 3C è un caso più generale di 3DM , per cui si verifica facilmente la
condizione [N] e quella [H] , riducendolo da quest’ultimo.
Dato un grafo G  V , E  , con V  v1,, vn  è detto cammino hamiltoniano per G
l’insieme      ,
P  vi1 , vi2 , vi2 , vi3 ,, vin1 , vin  E | 1  is  n, is  it  s  t s, t  1n che corrisponde ad
un percorso passante per tutti i vertici del grafo una sola volta. Se è possibile
aggiungere un lato che ritorna al primo vertice (cioè, se
P   vi , vi  ,  vi , vi  ,,  vi , vi  ,  vi , vi   E | 1  is  n, is  it  s  t s, t  1 n ), l’insieme è detto
1 2 2 3 n1 n n 1

ciclo (o circuito) hamiltoniano.


Se G è indiretto, denotiamo con HC il problema del trovare se esiste un ciclo hamiltoniano per
G . Se il grafo è diretto, indichiamo tale problema con DHC .

Teorema
DHC è NPC.
[N] )
Basta che una NTM prenda tutti i percorsi possibili e verifichi che il cammino passi una sola
volta per ciascun vertice e ritorni a quello di partenza. Tale verifica è ovviamente polinomiale,
per cui HC  NP .
[H] ) Riduciamo da 3SAT a DHC .
Siano F una formula 3 CNF contenente n variabili xi e k clausole C j , e mi il massimo tra le
occorrenze di xi e di xi . Costruiamo il grafo diretto G  H  I , dove H  H1  H 2    H n e
I  I1  I 2    I k . Ogni frammento H i ha un nodo di uscita di collegato al nodo di entrata
ai 1 di H i 1 e H n ritorna su H1 mediante il lato  d n , a1  : in tal modo la macrostruttura di H
rappresenta un ciclo. Oltre ai nodi di entrata e uscita, ogni frammento ha anche due “colonne”
di mi  1 nodi bit e cit . I frammenti I j non sono connessi tra loro direttamente. Nelle figure
seguenti sono rappresentati rispettivamente i frammenti H i , il sottografo H e i frammenti I j .

ai
H1 v j1 vj2 v j3
bi 0 ci 0

bi1 ci1 vj1 vj 2 vj 3


H2

bimi cimi
Hn
di
Per collegare i frammenti H i con quelli I j si procede nel modo seguente: per ogni occorrenza
di xi ( xi ), si connetta il primo nodo disponibile cit ( bit ) con v jp e il nodo vjp con bi , t 1 ( ci , t 1 ),
dove j è l’indice della clausola dove si trova xi ( xi ) e p è l’indice della sua posizione
all’interno di essa. Da notare che vi sono sempre nodi disponibili, in quanto t  mi . Queste
operazioni si possono evidentemente svolgere in tempo polinomiale.
Dimostriamo che F è soddisfacibile sse G ha un circuito hamiltoniano.
 ) Data un’assegnazione di valori di verità t :  x1 ,, xn   V , F  che soddisfa F , costruiamo
per ogni i  1,, n il ciclo nel modo seguente:

- se t  xi   V , aggiungiamo al ciclo i lati  ai , bi 0  e  bi 0 , ci 0  , e passiamo ad esaminare il nodo


ci 0 ; altrimenti annettiamo  ai , ci 0  e  ci 0 , bi 0  , e passiamo ad esaminare il nodo bi 0 ;

- per ogni s  m , all’analisi di cis (o bis ), se il esso è connesso ad un frammento I j non ancora
incluso nel ciclo, allora lo aggiungiamo (per esempio, se includiamo c , v  ,
is jp dobbiamo
aggiungere tutti i lati opportuni a partire da v jp in modo da toccare tutti i vertici una sola volta
e includere  v , b  ); altrimenti, anettiamo al ciclo  c , b  (o b , c  );
jp i , s 1 is i , s 1 is i , s 1 in ogni caso,
includiamo  b , c  (o  c , b  ) e passiamo ad esaminare c
i , s 1 i , s 1 i , s 1 i , s 1 (o b ); i , s 1 i , s 1

   
- all’analisi di cimi (o bimi ), aggiungiamo cimi , di (o bimi , di ) e  di , ai 1  (  d n , a1  , se i  n ).

Si vede subito che il ciclo appena costruito è un circuito hamiltoniano.


 ) Dato un circuito hamiltoniano in G costruito come sopra, vediamo che F è soddisfacibile.
Infatti, se per assurdo non lo fosse, ci sarebbe un’assegnazione di valori di verità
t :  x1 ,, xn   V , F  che falsifica F , per cui esisterebbe almeno una clausola C j falsa. Allora,
per come è stato costruito G , i nodi del frammento I j resterebbero fuori dal ciclo, ma ciò è
assurdo per ipotesi. Quindi F è soddisfacibile.

Teorema
HC è NPC.
[N] ) Si procede come per DHC , da cui HC  NP .
[H] ) Riduciamo da DHC a HC .
Sia G  V , E  un grafo diretto. Costruiamo il grafo indiretto G  V , E   nel modo seguente:

- per ogni nodo v  V , si aggiungano a V  tre nodi v, v, v e ad E  due archi  v, v  ,  v, v  ;

- per ogni arco  v, w   E , si aggiunga ad E  l’arco  v, w  .


Chiaramente, tale costruzione prende tempo polinomiale.
Dimostriamo che esiste un circuito hamiltoniano per G sse esiste anche per G .
 ) Banalmente, se i nodi v1 , v2 ,, vn , v1 formano nell’ordine un circuito hamiltoniano in G ,
anche i nodi v1 , v1, v1, v2 , v2 , v2, , vn , vn , vn , v1 lo formeranno in G .
 ) Viceversa, un circuito hamiltoniano in G deve, per costruzione, essere formato dalla
stessa sequenza di triple vi , vi, vi i o vi, vi, vi i , perché vi ha solo due lati; quindi nel
secondo caso, possiamo invertirlo. Perciò, dato che ad ogni “blocco” in G corrisponde un
nodo in G , anche questo avrà un ciclo hamiltoniano.
Dato un grafo pesato indiretto G , e un valore limite k , denotiamo con TSP (problema del
commesso viaggiatore) il problema del trovare se esiste un ciclo hamiltoniano per G che abbia
come somma dei pesi dei suoi lati un valore minore o uguale a k .

Teorema
TSP è NPC.
[N] )
Basta che una NTM prenda tutti i percorsi possibili, sommando i pesi, e verifichi che il
cammino passi una sola volta per ciascun vertice e ritorni a quello di partenza, e che tale
somma sia non superiore al valore voluto. Tale verifica è ovviamente polinomiale, per cui
TSP  NP .
[H] ) Riduciamo da HC a TSP .
Sia G  V , E  un grafo indiretto. Costruiamo il grafo indiretto G  V , E   assegnando 1 come
peso a tutti i lati, e come valore limite k il numero dei vertici (operazione evidentemente
eseguibile in tempo polinomiale). In questo modo, si evince che G ha un ciclo hamiltoniano
sse in G tale ciclo “pesa” esattamente k .

Dati una matrice A k n  e un vettore b   k , denotiamo con ILP (programmazione lineare intera)
il problema di trovare se esiste un vettore x   n tale che sia soddisfatto il sistema lineare Ax  b .

Teorema
ILP è NPC.
[N] ) (data la difficoltà, omettiamo la dimostrazione di appartenenza a NP )
[H] ) Riduciamo da 3SAT a ILP .
Sia F una formula 3 CNF con n variabili e m clausole. Costruiamo il sistema lineare nel modo
seguente:
- per ogni variabile xi aggiungiamo al sistema le incognite xi e xi , e delle equazioni tali da
 xi  xi  1

 x  xi  1
forzare queste incognite a rappresentare dei valori di verità opposti:  i
 xi  0
 xi  0

- per ogni clausola C j  c j1  c j 2  c j 3 , dove ogni letterale può essere xi o xi , aggiungiamo al


sistema l’equazione c j1  c j 2  c j 3  1 (scrivendo ovviamente la variabile negata o no al posto
delle c jp ), in modo da forzarla a rappresentare il valore di verità di tre letterali disgiunti.
Si vede subito che la trasformazione prende tempo polinomiale e che F è soddisfacibile sse il
sistema creato ammette una soluzione.

Potrebbero piacerti anche