Introduzione
Supponiamo che due individui vogliano comunicarsi qualcosa. Uno dei due (il mittente)
invierà quindi un messaggio all’altro (il destinatario). Può succedere però che il messag-
gio, prima di arrivare al destinatario, subisca delle modifiche, che possono essere dovute,
ad esempio, a rumori che alterano alcune parti del messaggio. Talvolta, durante la tra-
smissione, il messaggio può diventare incomprensibile o semplicemente sbagliato per chi
lo riceve. Se il destinatario riceve stinaci, probabilmente egli riconoscerà l’errore e sup-
porrà che la parola inviata fosse invece spinaci. Se, però, la parola inviata è casa, ma
il destinatario riceve caso, per lui sarà difficile capire che in realtà la parola inviata era
un’altra. Un modo per risolvere questo problema consiste nell’inviare lo stesso messaggio
ripetuto più volte: invece di inviare casa, il mittente invierà casacasacasa, per cui, se il
destinatario riceverà casocasacasa, per lui sarà facile rilevare e correggere correttamente
l’errore. Dal punto di vista computazionale, però, questi messaggi richiedono troppa
memoria.
Esistono altri metodi più efficaci per inviare messaggi facilmente correggibili anche se
alterati, quali la creazione di "vocabolari" contenenti parole aventi una distanza sufficien-
temente elevata l’una dall’altra. Se viene ricevuta una parola che non sta nel vocabolario,
allora essa viene corretta con la parola del vocabolario più "vicina" a quella ricevuta (nel
senso che verrà chiarito in seguito). Il vocabolario viene chiamato codice correttore. La
teoria dei codici correttori si occupa proprio dello studio di metodi per codificare mes-
saggi in modo che sia semplice per il ricevente individuare e correggere eventuali errori
di trasmissione.
Lo scopo principale di questa tesi è quello di costruire codici correttori con buone ca-
ratteristiche per quanto riguarda l’espressività (vogliamo che il numero di parole conte-
nute nel dizionario sia elevato), il costo computazionale (le parole devono essere corte)
e l’individuazione e la correzione di errori (richiediamo che la distanza tra le parole sia
sufficientemente grande). Codici che rispettano queste caratteristiche sono detti codici
correttori asintoticamente buoni.
È possibile legare la Teoria dei Codici e l’Algebra Lineare tramite una matrice, detta
matrice di controllo del codice.
Informalmente, un grafo è un insieme di punti, che rappresentano degli enti, uniti da
linee (dirette o non orientate), che rappresentano le relazioni che intercorrono tra gli enti.
Supponiamo, ad esempio, che gli enti siano computer e che due computer siano in re-
lazione se sono connessi tra loro. Se richiediamo che i computer siano ben connessi tra
loro, ovvero che togliendo alcune connessioni una parte dei computer non risulti isolata,
ma che allo stesso tempo non ci siano troppe connessioni, allora stiamo richiedendo che
il tasso di espansione del grafo sia elevato. Una famiglia di grafi espansori è, infatti, una
famiglia di grafi, che richiede che siano verificate due proprietà parzialmente in conflitto:
il grafo deve essere ben connesso, ma non deve avere troppi lati (relazioni).
È possibile legare la Teoria dei Grafi all’Algebra Lineare, tramite la matrice di adiacenza
di un grafo.
Usando la matrice di controllo di un codice e la matrice di adiacenza di un grafo è
possibile legare la Teoria dei Codici e la Teoria dei Grafi, passando per l’Algebra Lineare.
Inoltre, tramite una costruzione opportuna, possiamo unire le proprietà in conflitto di
5
6 INDICE
un grafo a quelle di un codice correttore: un grafo con un buon tasso di espansione ci
darà un codice correttore asintoticamente buono.
Vedremo due differenti costruzioni di codici correttori asintoticamente buoni. La pri-
ma costruzione utilizza il legame tra i due campi, usando la matrice di adiacenza di certi
grafi come matrice di controllo del codice. La seconda costruzione utilizza una famiglia
di grafi espansori e un piccolo codice per costruire un codice più grande per ogni grafo
nella famiglia. Questa seconda costruzione è stata recentemente utilizzata da Gilles Zé-
mor per costruire codici correttori asintoticamente buoni a partire da grafi espansori di
Ramanujan, usando una piccola variante dell’algoritmo di decodifica.
La tesi sarà divisa in quattro capitoli.
• Capitolo 1
Nella prima parte del primo capitolo vedremo le definizioni principali inerenti la
TeoriadeiGrafi. Inizieremodandoledefinizionidigrafidiretti, grafinondiretti, or-
dine e taglia di un grafo, adiacenza tra vertici, incidenza tra lati e vertici, adiacenza
tra lati, loop, grafi semplici e grafi finiti e infiniti. Successivamente, introdurremo
alcuni concetti riguardanti le caratteristiche di un grafo, come i cammini presenti
in esso, la connessione, il grado dei suoi vertici, i sottografi indotti, gli insiemi di
vertici adiacenti a un dato vertice o a un dato insieme di vertici e il contorno dei
lati. Vedremo poi alcune particolari classi di grafi: i grafi completi, i grafi bipartiti
e i grafi bipartiti completi.
Nella seconda parte del capitolo vedremo come la Teoria dei Grafi e l’Algebra Li-
neare sono legate, introducendo il concetto di matrice di adiacenza di un grafo.
Daremo la definizione di spettro di un grafo, vedremo alcuni risultati riguardanti
gli autovalori della matrice di adiacenza e proveremo il lemma expander mixing.
Vedremo poi alcune altre matrici che possono essere associate a un grafo, come
quella del gradiente, della divergenza e del laplaciano.
• Capitolo 2
Il secondo capitolo riguarda un’importante classe di grafi: quella dei grafi espansori.
Daremodapprimaladefinzioneditassodiespansioneedifamigliadigrafiespansori.
Successivamente, daremo alcune stime sul tasso di espansione.
Infine, vedremo alcuni esempi di grafi espansori, tra cui i grafi di Margulis-Gabber-
Gali, i grafi espansori costruiti tramite il prodotto zig-zag e i grafi di Ramanujan.
• Capitolo 3
Nel terzo capitolo, vedremo inizialmente alcuni concetti di base sulla teoria dei
codici, come le assunzioni di base su un canale, le definizioni di codice, di distanza
di Hamming, di distanza minima, di rapporto di informazione e di rapporto di
separazione, per arrivare alla definizione di famiglia di codici asintoticamente buoni
ed efficienti.
Vedremo poi i codici lineari e le definizioni di peso di una parola e di matrice di
controllo, la quale unisce la Teoria dei Codici all’Algebra Lineare.
Infine, dimostreremo alcune stime utili sui codici.
• Capitolo 4
Nell’ultimo capitolo, vedremo la costruzione esplicita di codici correttori asintoti-
camente buoni a partire da grafi espansori.
Vedremo una prima costruzione, che fa uso di grafi espansori bipartiti sinistri-
regolari.
Presenteremo poi una seconda costruzione che utilizza grafi espansori regolari, sof-
fermandoci su un caso particolare: la costruzione di codici correttori asintotica-
mente buoni ed efficienti a partire da grafi di Ramanujan, studiata recentemente
da Gilles Zémor.
Capitolo 1
Teoria dei grafi
Lo scopo di questo capitolo è quello di fare una breve introduzione alla teoria dei grafi,
dandone le principali definizioni, e analizzare la relazione che intercorre tra la teoria dei
grafi e l’algebra lineare.
1.1 Introduzione alla teoria dei grafi
Vediamooraalcuniconcettirealtiviallateoriadeigrafi,chesarannoutilipercomprendere
il discorso sviluppato nei capitoli successivi.
1.1.1 Concetti di base
Definizione1.1. UngrafoGèunacoppiaordinata (V (G),E(G))checonsisteininsiemi
disgiunti di nodi (o vertici) V (G)6=∅ e lati E(G) formati da coppie di vertici. Se tali
coppie sono ordinate, si dice che i lati sono direzionati e si parla di digrafo (o grafo
orientato); altrimenti si parla di grafo non diretto (o grafo non orientato).
Definizione 1.2. La cardinalità dell’insieme dei vertici di un grafo G è detta ordine;
la cardinalità dell’insieme dei lati è detta taglia.
Definizione 1.3. Dati due vertici u, v, se e ={u,v} è un lato di G, cioè e∈E(G), si
dice che il lato e ={u,v} congiunge i vertici u e v. I vertici u e v sono detti vertici
adiacenti e u ed e sono detti incidenti, così come v ed e. Inoltre se e
1
ed e
2
sono lati
distinti di G incidenti un vertice comune, e
1
ed e
2
sono detti lati adiacenti. In seguito
denoteremo un lato{u,v} con uv.
Definizione 1.4. Un loop è un lato del tipo uu.
Definizione 1.5. Un multigrafo è un grafo in cui più lati sono associati alla stessa
coppia di vertici. Tali lati sono detti lati multipli.
Definizione 1.6. Un grafo semplice è un grafo che non ammette loop e lati multipli.
Definizione 1.7. Un grafo si dice infinito se la sua taglia oppure il suo ordine sono
infiniti. Altrimenti il grafo si dice finito.
D’ora in poi, se non specificato diversemente, lavoreremo con grafi finiti e semplici.
1.1.2 Caratteristiche di un grafo
Definizione 1.8. Siano u
0
e u
n
due vertici non necessariamente distinti di un grafo G.
Unu
0
u
n
cammino inG è una successione finita di verticiu
0
,u
1
,...,u
n
tali cheu
i
edu
i+1
sono adiacenti, per ogni i = 0, 1,...,n− 1. I lati u
i
u
i+1
, per ogni i = 0,...,n− 1, sono
detti lati del cammino.
7