cerca
Informatica Teorica - Complessità circuitale
modifica cronologia stampa login logout

Wiki

UniCrema


Materie per semestre

Materie per anno

Materie per laurea


Help

Uni.IT-ComplessitàCircuitale History

Hide minor edits - Show changes to output

Changed lines 11-12 from:
''f: {0,1}'^2^' -> {0,1}'^m^' ''
to:
''f: {0,1}'^n^' -> {0,1}'^m^' ''
Changed lines 83-85 from:
* '''fan-in''', numero di archi entranti in un dato nodo. Il ''fan-in di un circuito'' è il numero massimo di fan-in calcolato sull'insieme di tutti i nodi;
* '''fan-out''', numero di archi uscenti da un dato nodo. Il ''fan-out di un circuito'' è il numero massimo di fan-out calcolato sull'insieme di tutti i nodi.
to:
* '''fan-in''', numero di archi entranti in un nodo. Il ''fan-in di un circuito'' è il numero massimo di fan-in calcolato sull'insieme dei nodi;
* '''fan-out''', numero di archi uscenti da un nodo. Il ''fan-out di un circuito'' è il numero massimo di fan-out calcolato sull'insieme dei nodi.
Changed lines 92-94 from:
Una '''famiglia di circuiti''' C è una lista infinita di circuiti, (C'_0_', C'_1_', C'_2_', ...), dove C'_n_' ha ''n'' variabili di ingresso. Diciamo che C decide un linguaggio A su {0,1} se, per ogni stringa w, \\
w appartiene ad A se e solo se C'_n_'(w)=1,\\
dove ''n'' in questo caso è la lunghezza di w.
to:
Una '''famiglia di circuiti''' C è una lista infinita di circuiti, (C'_0_', C'_1_', C'_2_', ...), dove C'_n_' ha ''n'' variabili di ingresso. Diciamo che C decide un linguaggio A su {0,1} se, per ogni stringa w, w appartiene ad A se e solo se C'_n_'(w)=1, dove ''n'' in questo caso è la lunghezza di w.
Changed line 97 from:
Per arrivare a definire la size-complexity di un circuito dobbiamo prima introdurre un po' di concetti:
to:
Per arrivare a definire la ''size-complexity'' di un circuito dobbiamo prima introdurre un po' di concetti:
Changed lines 99-100 from:
* due circuiti si dicono equivalenti quando con le stesse variabili in ingresso producono lo stesso valore in uscita per qualsiasi assegnamento passato in ingresso;
* un circuito è di ''dimensione minima'' se non esiste un circuito equivalente con dimensione inferiore. A dirlo è semplice, ma a verificarlo è un guaio;
to:
* due circuiti si dicono equivalenti quando con le stesse variabili in ingresso producono lo stesso valore in uscita per qualsiasi assegnamento sugli ingressi;
* un circuito è di ''dimensione minima'' se non esiste un circuito equivalente con dimensione inferiore. A dirlo è semplice, a verificarlo è un guaio;
Changed line 111 from:
Stesso discorso: arriveremo alla definizione della depth-complexity di un circuito solo dopo aver introdotto alcuni concetti basilari:
to:
Stesso discorso: arriveremo alla definizione della ''depth-complexity'' di un circuito solo dopo aver introdotto alcuni concetti basilari:
Changed lines 124-125 from:
Esiste una relazione tra le complessità circuitali di un linguaggio e la tempo-complessità del linguaggio stesso. Intuitivamente siamo infatti portati a pensare che ogni linguaggio con ridotta complessità nel tempo abbia anche una piccola complessità circuitale. Per chi però non si fidasse del proprio intuito, eccoci servito il Teorema 1:
to:
Esiste una relazione tra la complessità circuitale e la tempo-complessità di un linguaggio. Intuitivamente siamo infatti portati a pensare che ogni linguaggio con ridotta complessità nel tempo abbia anche una piccola complessità circuitale. Per chi però non si fidasse del proprio intuito, eccoci servito il Teorema 1:
Changed line 127 from:
Sia t:N->N una funzione con t(n)>=n. Se A appartiente a TIME(t(n)), allora A ha una complessità circuitale pari a O(t^2^(n)).
to:
Sia t:N->N una funzione con t(n)>=n. Se A appartiente a TIME(t(n)), allora A ha una complessità circuitale pari a O(t'^2^'(n)).
Changed lines 158-160 from:
La [@prima condizione@] è verificata grazie alla dimostrazione del Teorema 1, in cui si mostrava possibile utilizzare una MdT [@n.d.@] per simulare un circuito.

Per [@la seconda condizione@] proveremo a ridurre il problema CIRCUIT-SAT in quello 3SAT in tempo polinomiale. Si parla perciò di una riduzione da un circuito C a una formula Φ, tale che C è soddisfacibile se e solo se Φ lo è.\\
to:
La [@prima condizione@] è verificata grazie alla dimostrazione del Teorema 1, in cui si mostrava possibile l'utilizzo di una MdT [@n.d.@] per simulare un circuito.

Per [@la seconda condizione@] proveremo a ridurre il problema CIRCUIT-SAT a quello 3SAT in tempo polinomiale. Si parla perciò di una riduzione da un circuito C a una formula Φ, tale che C è soddisfacibile se e solo se Φ lo è.\\
Changed line 169 from:
Attach:IT-not1-3SAT.gif
to:
->Attach:IT-not1-3SAT.gif
Changed lines 171-172 from:
Attach:IT-not2-3SAT.gif
to:
->Attach:IT-not2-3SAT.gif
Changed line 175 from:
Attach:IT-and1-3SAT.gif
to:
->Attach:IT-and1-3SAT.gif
Changed lines 177-178 from:
Attach:IT-and2-3SAT.gif
to:
->Attach:IT-and2-3SAT.gif
Changed line 181 from:
Attach:IT-or1-3SAT.gif
to:
->Attach:IT-or1-3SAT.gif
Changed line 183 from:
Attach:IT-or2-3SAT.gif
to:
->Attach:IT-or2-3SAT.gif
Changed lines 17-18 from:
(:cellnr align=center bgcolor=#f2f6f9:)x
(:cell align=center bgcolor=#f2f6f9:)f'_1_'
to:
(:cellnr align=center bgcolor=#d4e1f0:)x
(:cell align=center bgcolor=#d4e1f0:)f'_1_'
Changed lines 43-44 from:
(:cellnr align=center bgcolor=#f2f6f9:)x'_1_'
(:cell align=center bgcolor=#f2f6f9:)x'_2_'
to:
(:cellnr align=center bgcolor=#d4e1f0:)x'_1_'
(:cell align=center bgcolor=#d4e1f0:)x'_2_'
Changed lines 17-21 from:
(:cellnr align=center bgcolor=f2f6f9:)x
(:cell align=center bgcolor=f2f6f9:)f'_1_'
(:cell align=center bgcolor=f2f6f9:)f'_2_'
(:cell align=center bgcolor=f2f6f9:)f'_3_'
(:cell align=center bgcolor=f2f6f9:)f'_4_'
to:
(:cellnr align=center bgcolor=#f2f6f9:)x
(:cell align=center bgcolor=#f2f6f9:)f'_1_'
(:cell align=center bgcolor=#f2f6f9:)f'_2_'
(:cell align=center bgcolor=#f2f6f9:)f'_3_'
(:cell align=center bgcolor=#f2f6f9:)f'_4_'
Changed lines 43-47 from:
(:cellnr align=center bgcolor=f2f6f9:)x'_1_'
(:cell align=center bgcolor=f2f6f9:)x'_2_'
(:cell align=center bgcolor=f2f6f9:)f'_1_'
(:cell align=center bgcolor=f2f6f9:)...
(:cell align=center bgcolor=f2f6f9:)f'_16_'
to:
(:cellnr align=center bgcolor=#f2f6f9:)x'_1_'
(:cell align=center bgcolor=#f2f6f9:)x'_2_'
(:cell align=center bgcolor=#f2f6f9:)f'_1_'
(:cell align=center bgcolor=#f2f6f9:)...
(:cell align=center bgcolor=#f2f6f9:)f'_16_'
Changed line 169 from:
%center%Attach:IT-not1-3SAT.gif
to:
Attach:IT-not1-3SAT.gif
Changed lines 171-172 from:
%center%Attach:IT-not2-3SAT.gif
to:
Attach:IT-not2-3SAT.gif
Changed line 175 from:
%center%Attach:IT-and1-3SAT.gif
to:
Attach:IT-and1-3SAT.gif
Changed lines 177-178 from:
%center%Attach:IT-and2-3SAT.gif
to:
Attach:IT-and2-3SAT.gif
Changed line 181 from:
%center%Attach:IT-or1-3SAT.gif
to:
Attach:IT-or1-3SAT.gif
Changed line 183 from:
%center%Attach:IT-or2-3SAT.gif
to:
Attach:IT-or2-3SAT.gif
Added lines 1-193:
(:title Informatica Teorica - Complessità circuitale :)
[[Torna alla pagina di Informatica Teorica-> Informatica Teorica]]
----

%titolo%''':: Informatica Teorica - Complessità circuitale ::'''

%center% %sottotitolo% Appunti & Dimostrazioni del 26 Maggio

!!Funzioni booleane
Una ''funzione booleana'' ''f'' con ''n'' ingressi ed ''m'' uscite è una funzione che associa ad ogni stringa binaria di lunghezza ''n'' una stringa binaria di lunghezza ''m'', ovvero:\\
''f: {0,1}'^2^' -> {0,1}'^m^' ''

Data una funzione f che appartiene alla classe B'_n_' (con ''n'' numero di variabili), il numero di stringhe che può avere in ingresso è 2'^n^', mentre le diverse funzioni booleane ottenibili sono 2 elevato alla 2'^n^'. \\
Consideriamo ad esempio una B'_1_':

(:table width=40% align=center:)
(:cellnr align=center bgcolor=f2f6f9:)x
(:cell align=center bgcolor=f2f6f9:)f'_1_'
(:cell align=center bgcolor=f2f6f9:)f'_2_'
(:cell align=center bgcolor=f2f6f9:)f'_3_'
(:cell align=center bgcolor=f2f6f9:)f'_4_'
(:cellnr align=center:)0
(:cell align=center:)0
(:cell align=center:)0
(:cell align=center:)1
(:cell align=center:)1
(:cellnr align=center:)1
(:cell align=center:)0
(:cell align=center:)1
(:cell align=center:)0
(:cell align=center:)1
(:tableend:)

Come ci aspettavamo, con una variabile abbiamo 2'^1^'=2 stringhe in ingresso, e 2'^2^'=4 funzioni in uscita. In particolare, per quanto riguarda queste ultime:
* f'_1_' è la funzione costante uguale a 0;
* f'_2_' è la funzione identità;
* f'_3_' è la funzione complemento;
* f'_4_' è la funzione costante uguale a 1.

Consideriamo come secondo esempio una B'_2_', per la quale ci aspetteremo di avere 2'^2^'=4 possibili stringhe in ingresso, e 2'^4^'=16 funzioni in uscita.

(:table width=40% align=center:)
(:cellnr align=center bgcolor=f2f6f9:)x'_1_'
(:cell align=center bgcolor=f2f6f9:)x'_2_'
(:cell align=center bgcolor=f2f6f9:)f'_1_'
(:cell align=center bgcolor=f2f6f9:)...
(:cell align=center bgcolor=f2f6f9:)f'_16_'
(:cellnr align=center:)0
(:cell align=center:)0
(:cell align=center:)0
(:cell align=center:)...
(:cell align=center:)1
(:cellnr align=center:)0
(:cell align=center:)1
(:cell align=center:)0
(:cell align=center:)...
(:cell align=center:)1
(:cellnr align=center:)1
(:cell align=center:)0
(:cell align=center:)0
(:cell align=center:)...
(:cell align=center:)1
(:cellnr align=center:)1
(:cell align=center:)1
(:cell align=center:)0
(:cell align=center:)...
(:cell align=center:)1
(:tableend:)

Per rapidità non sono stati riportati in tabella tutti i valori delle funzioni intermedie, ma è importante sottolineare che ognuna di esse è ottenibile dalla combinazione dei connettivi logici applicati alle due variabili. L'insieme dei connettivi che permettono di esprimere tutte le funzioni booleane di una classe B'_n_' sono chiamati ''base'' per B'_n_', la più utilizzata delle quali è la '''base canonica''', composta dagli operatori AND, OR e NOT.

!!Circuiti booleani
I '''circuiti booleani''' sono un modello di calcolo diverso rispetto a quello delle MdT, e rappresentano la controparte teorica dei circuiti digitali.

>>left bgcolor=#f5f9fc width=auto border='2px solid #cccccc' padding=5px<<
Un '''circuito booleano''' è un grafo diretto e aciclico, i cui nodi sono etichettati. Distinguiamo:
* ''nodi di ingresso'', privi di archi entranti e etichettati con una variabile booleana o una costante (0/1);
* ''nodi operazione'' (o ''porte''), dotati di archi entranti e uscenti, ed etichettati con il simbolo di una funzione booleana di uno o più argomenti (il loro numero dipende da quello degli archi che entrano nel nodo);
* ''nodi di uscita'', privi di archi uscenti e con esattamente un arco entrante, sono etichettati con un diverso simbolo di variabile.
>><<

Altri due concetti importanti sono quelli di:
* '''fan-in''', numero di archi entranti in un dato nodo. Il ''fan-in di un circuito'' è il numero massimo di fan-in calcolato sull'insieme di tutti i nodi;
* '''fan-out''', numero di archi uscenti da un dato nodo. Il ''fan-out di un circuito'' è il numero massimo di fan-out calcolato sull'insieme di tutti i nodi.

Un circuito booleano C con ''n'' nodi di ingresso ed ''m'' nodi di uscita calcola la funzione f:{0,1}'^n^'->{0,1}'^m^' se, per ogni assegnamento di valori alle ''n'' variabili che etichettano i nodi di ingresso, il valore calcolato da C è uguale a f(x'_1_',x'_2_',...,x'_n_').

!!Circuiti e linguaggi
Una volta codificati opportunamente i linguaggi in binario, il nostro obiettivo è quello di usare i circuiti booleani per verificarli. Ma i circuiti hanno un numero fisso di ingressi, mentre i linguaggi possono contenere stringhe di lunghezze diverse, quindi che si fa? Semplice: invece di usare un unico circuito per verificare l'appartenenza a un linguaggio ne useremo un'intera ''famiglia''!

>>left bgcolor=#f5f9fc width=auto border='2px solid #cccccc' padding=5px<<
Una '''famiglia di circuiti''' C è una lista infinita di circuiti, (C'_0_', C'_1_', C'_2_', ...), dove C'_n_' ha ''n'' variabili di ingresso. Diciamo che C decide un linguaggio A su {0,1} se, per ogni stringa w, \\
w appartiene ad A se e solo se C'_n_'(w)=1,\\
dove ''n'' in questo caso è la lunghezza di w.
>><<

!!Complessità di un circuito
!!!Legata alla dimensione
Per arrivare a definire la size-complexity di un circuito dobbiamo prima introdurre un po' di concetti:
* la ''dimensione'' ('''size''') di un circuito è pari al numero di porte che esso contiene;
* due circuiti si dicono equivalenti quando con le stesse variabili in ingresso producono lo stesso valore in uscita per qualsiasi assegnamento passato in ingresso;
* un circuito è di ''dimensione minima'' se non esiste un circuito equivalente con dimensione inferiore. A dirlo è semplice, ma a verificarlo è un guaio;
* una famiglia di circuiti è minimale se ogni circuito della sua lista ha dimensione minima;
* la ''size-complexity'' di una famiglia di circuiti (C'_0_', C'_1_', C'_2_', ...) è la funzione f:N->N dove f(n) è la dimensione di C'_n_'.

Abbiamo tutto quello che ci serve per affermare che:

>>left bgcolor=#f5f9fc width=auto border='2px solid #cccccc' padding=5px<<
La '''size-complexity''' circuitale di un linguaggio è la size-complexity della famiglia minimale di circuiti per quel linguaggio.
>><<

!!!Legata alla profondità
Stesso discorso: arriveremo alla definizione della depth-complexity di un circuito solo dopo aver introdotto alcuni concetti basilari:
* la ''profondità'' ('''depth''') di un circuito è pari alla lunghezza (il numero di fili) del percorso più lungo tra ingresso e uscita;
* un circuito è di ''profondità minima'' se non esiste un circuito equivalente con profondità inferiore;
* una famiglia di circuiti è minimale se ogni circuito della sua lista ha profondità minima;
* la ''depth-complexity'' di una famiglia di circuiti (C'_0_', C'_1_', C'_2_', ...) è la funzione f:N->N dove f(n) è la profondità di C'_n_'.

Abbiamo tutto quello che ci serve per affermare che:

>>left bgcolor=#f5f9fc width=auto border='2px solid #cccccc' padding=5px<<
La '''depth-complexity''' circuitale di un linguaggio è la depth-complexity della famiglia minimale di circuiti per quel linguaggio.
>><<

!!!Teorema 1 - Relazioni tra complessità
Esiste una relazione tra le complessità circuitali di un linguaggio e la tempo-complessità del linguaggio stesso. Intuitivamente siamo infatti portati a pensare che ogni linguaggio con ridotta complessità nel tempo abbia anche una piccola complessità circuitale. Per chi però non si fidasse del proprio intuito, eccoci servito il Teorema 1:

>>left bgcolor=#f5f9fc width=auto border='2px solid #cccccc' padding=5px<<
Sia t:N->N una funzione con t(n)>=n. Se A appartiente a TIME(t(n)), allora A ha una complessità circuitale pari a O(t^2^(n)).
>><<

La dimostrazione non è richiesta, ma è importante ricordare che oltre al teorema in sé prova anche che un circuito booleano può essere simulato da una MdT.

!!Teorema 2 - CIRCUIT-SAT è NP-completo
Così come per le formule booleane, anche i circuiti booleani possono essere o meno soddisfacibili; in particolare, lo sono quando una certa configurazione di valori passati agli ingressi fa sì che l'uscita del circuito sia pari a 1.\\
Il problema CIRCUIT-SAT si occupa di verificare se un circuito è soddisfacibile, o più formalmente:\\
[@CIRCUIT-SAT = {<C> | C è un circuito booleano soddisfacibile}@]

Vediamo ora il teorema:

>>left bgcolor=#f5f9fc width=auto border='2px solid #cccccc' padding=5px<<
CIRCUIT-SAT è NP-completo.
>><<

!!Teorema 3 - 3SAT strikes back!
Ricordiamo che i 3CNF-formula sono formule in forma normale congiuntiva con clausole composte da 3 letterali, e che una 3SAT è una 3CNF-formula soddisfacibile. Il teorema:

>>left bgcolor=#f5f9fc width=auto border='2px solid #cccccc' padding=5px<<
3SAT è NP-completo.
>><<

'''Dimostrazione'''

Che 3SAT fosse NP-completo l'avevamo già dimostrato col teorema di Cook-Levin nel capitolo sulla [[NP-Completezza->IT-NP-Completezza]], ma volete mettere ridimostrarlo con i circuiti booleani?

Come sappiamo, un linguaggio B è NP-completo se soddisfa due condizioni:
* B è in NP;
* ogni A in NP è tempo polinomiale riducibile a B.

La [@prima condizione@] è verificata grazie alla dimostrazione del Teorema 1, in cui si mostrava possibile utilizzare una MdT [@n.d.@] per simulare un circuito.

Per [@la seconda condizione@] proveremo a ridurre il problema CIRCUIT-SAT in quello 3SAT in tempo polinomiale. Si parla perciò di una riduzione da un circuito C a una formula &#934;, tale che C è soddisfacibile se e solo se &#934; lo è.\\
Le variabili di un circuito sono gli ingressi x'_1_',...,x'_l_' e le porte g'_1_',...,g'_m_', che dovranno essere rimappate nelle variabili di &#934; etichettate come w'_1_',...,w'_l+m_'.\\
Passiamo ora a costruire le clausole, che dovranno descrivere i tre operatori logici della forma canonica (AND, OR, NOT). Per semplicità utilizzeremo anche l'operatore implica, per il quale vale la proprietà:\\
[@(P->Q) = (~P v Q)@]

* Operatore '''NOT'''.
->Sia w'_i_' l'ingresso e w'_j_' l'uscita:
%center%Attach:IT-not1-3SAT.gif
->che diventa:
%center%Attach:IT-not2-3SAT.gif

* Operatore '''AND'''.
->Siano w'_i_' e w'_j_' gli ingressi e w'_k_' l'uscita:
%center%Attach:IT-and1-3SAT.gif
->che diventa:
%center%Attach:IT-and2-3SAT.gif

* Operatore '''OR'''.
->Siano w'_i_' e w'_j_' gli ingressi e w'_k_' l'uscita:
%center%Attach:IT-or1-3SAT.gif
->che diventa:
%center%Attach:IT-or2-3SAT.gif

A queste clausole ne aggiungiamo un'altra: (w'_m_'), che rappresenta il nodo di uscita del circuito C.

Quello che resta da fare è riscrivere le clausole in forma 3SAT (tre letterali per clausola). Dato che le uniche clausole a non essere in 3SAT (quelle del NOT e quella di uscita) hanno meno di 3 letterali, basterà semplicemente replicare un letterale quante volte serve per arrivare a 3, e metterlo in OR con gli altri. Ad esempio (w'_m_') diventa:\\
(w'_m_' v w'_m_' v w'_m_')

Ora che sappiamo come convertire variabili e porte logiche di un circuito in una formula 3SAT equivalente, possiamo affermare che se CIRCUIT-SAT è NP-completo (Teorema 2) allora anche 3SAT lo è, perché la riduzione da uno all'altro è tempo polinomiale nella dimensione del circuito iniziale.

----
[[Torna alla pagina di Informatica Teorica-> Informatica Teorica]]