UNIVERSITÀ DI CATANIA
FACOLTÀ DI INGEGNERIA
APPUNTI DI TEORIA DEI CODICI
Autori:
L. Cauchi
V. La Terra
R. Grasso
F. Gullo
c
Coperto da diritti di °copyright
Ho letto questi appunti scritti da Lucia Cauchi, Rosario Grasso, Valeria La Terra e
Francesco Gullo, studenti che hanno seguito il mio corso di “Teoria dei Codici” negli anni
accademici 2005 – 2006, 2006 – 2007 e 2008 – 2009. Lucia, Rosario e Valeria hanno
contribuito alla stesura dei primi sei capitoli, mentre Francesco ha scritto il settimo.
Ho deciso di inserirli nella mia pagina web perchè rispecchiano pienamente le mie lezioni
e sono sicuro che essi riusciranno ad essere un ulteriore aiuto didattico agli studenti che
hanno seguito e seguiranno il corso di “Teoria dei Codici”.
Ringrazio Lucia Cauchi, Rosario Grasso, Valeria La Terra e Francesco Gullo, per la loro disponibilità a condividere liberamente il loro spontaneo lavoro, coperto da diritti di
“copyright” legali e informatici, con tutti i loro colleghi e con il docente.
Mi corre l’obbligo di ringraziare il Professore Dean Hoffman che mi ha permesso, nel 1997,
di seguire presso l’Università di Auburn (USA) il suo corso di “Coding Theory”.
Faccio inoltre presente che tali appunti nella parte riguardante la Teoria dei Codici trovano
principale fonte bibliografica nel testo “Coding Theory and Cryptography” scritto da D.
Hankerson, D. Hoffman, D.Leonard, C. Lindner, C. Rodger, K. Phelps, J. Wall.
Lorenzo Milazzo
Indice
1 Cenni di Teoria dell’Informazione
1
1.1
I primi concetti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.2
Schema di codifica . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.3
Codici univocamente decifrabile e istantanei . . . . . . . . . . . . . .
4
1.4
Codici ottimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4.1
1.5
Algoritmo di Huffman . . . . . . . . . . . . . . . . . . . . . . 15
La funzione entropia . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.5.1
Proprietà della funzione entropia . . . . . . . . . . . . . . . . 24
2 I Primi concetti
27
2.1
Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.2
Probabilità e distanza
2.3
Peso ed errore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.4
Prime tecniche di codifica . . . . . . . . . . . . . . . . . . . . . . . . 37
2.5
Individuazione di errore . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.6
Correzione di errore . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
. . . . . . . . . . . . . . . . . . . . . . . . . . 30
3 Codici lineari
47
3.1
Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.2
Prodotto scalare in K n . . . . . . . . . . . . . . . . . . . . . . . . . . 49
i
INDICE
3.3
Matrice generatrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.4
Matrice di parità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.4.1
Algoritmo di generazione di H . . . . . . . . . . . . . . . . . . 55
3.5
Coset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
3.6
Sindrome . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
4 Codici perfetti
75
4.1
Cardinalità di un codice C . . . . . . . . . . . . . . . . . . . . . . . . 75
4.2
Codici MDS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
4.3
Codici estesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
4.4
Codici perfetti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
4.4.1
Codice di Hamming . . . . . . . . . . . . . . . . . . . . . . . . 91
4.4.2
Codice di Golay esteso . . . . . . . . . . . . . . . . . . . . . . 94
5 Codici ciclici
104
5.1
Polinomi su K . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
5.2
Parole di C e polinomi . . . . . . . . . . . . . . . . . . . . . . . . . . 107
5.3
Codici ciclici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
5.4
Codice ciclico e polinomi di K n−1 . . . . . . . . . . . . . . . . . . . . 112
5.5
Matrice generatrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
5.6
Sindrome e matrice di parità . . . . . . . . . . . . . . . . . . . . . . . 120
6 Campi finiti e codici 2 - BCH
123
6.1
Polinomio primitivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
6.2
Campi finiti di Galois . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
6.3
Polinomio minimo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
6.4
Codici di Hamming . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
6.5
Codici 2-BCH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
ii
INDICE
6.6
Schema di codifica per codici 2-BCH . . . . . . . . . . . . . . . . . . 141
7 Codici Reed Solomon
144
7.1
Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
7.2
Codici Reed Solomon . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
7.3
Correzione di un codice RS(2r , δ) . . . . . . . . . . . . . . . . . . . . 153
iii
Capitolo 1
Cenni di Teoria dell’Informazione
1.1
I primi concetti
Si definisce S0 sorgente di un codice una coppia S0 = (S, P ) dove S = {s1 , s2 , · · · ,
sn } è un insieme finito di eventi che, come vedremo in seguito, si associano alle parole
di un codice, e P = {p(s1 ), p(s2 ), ...., p(sn )} è una distribuzione di probabilità sugli
P
eventi di S, dove p(si ) = pi , con 0 ≤ pi ≤ 1 e i pi = 1.
Si definisce alfabeto di un codice l’insieme finito di caratteri A = {a1 , a2 , · · · , ar },
nel caso in cui il numero di simboli in A è r (cioè |A| = r) si dice che l’alfabeto
genera un codice r-ario, in questi appunti (soprattutto dal capitolo 2) saranno per
lo più trattati casi in cui alfabeto è costituito da solo due caratteri e in particolare
l’alfabeto A = {0, 1}, tali codici sono detti binari.
Una sequenza di caratteri u = ai1 , ai2 , ...., ain è detta stringa e in essa possono
esistere caratteri ripetuti. Il numero di caratteri presenti in una stringa u è detto
lunghezza della stringa ed essa è rappresentata dalla simbologia l(u).
Indichiamo con A∗ l’insieme di tutte le possibili stringhe che si possono formare con
i caratteri dell’alfabeto (indipendentemente dalla lunghezza). Se una stringa non ha
caratteri si dice che essa è la stringa nulla.
1
1.2 Schema di codifica
Si definisce codice C = {c1 , c2 , · · · , cn } un particolare sottoinsieme finito di A∗ , cioè
C ⊂ A∗ , gli elementi ci di C sono detti parole del codice. È possibile avere codici
con parole che hanno lunghezza differente oppure codici le cui parole hanno tutte la
stessa lunghezza, in tal caso il codice è detto a blocchi.
1.2
Schema di codifica
Se S0 = (S, P ) è una sorgente di un codice, si definisce schema di codifica per S0 la
coppia ordinata (C, f ), dove f : S → C è un’applicazione iniettiva detta funzione
di assegnazione. Tale funzione definisce una corrispondenza uno a uno tra gli
elementi di S con le parole del codice C.
Si definisce lunghezza media lc di un codice C la quantità:
lc =
n
X
pi l(f (si )),
(1.1)
i=1
dove l(f (si )) è la lunghezza della parola del codice f (si ) che corrisponde all’evento
si di probabilità pi , tale probabilità assume il valore della probabilità legata alla
parola f (si ). Un codice C1 si dice più efficiente del codice C2 se lC1 < lC2 .
Vediamo adesso di capire quando si usano codici a blocchi o codici a lunghezza
variabile e in tal caso cerchiamo di stabilire un criterio di assegnazione che permetta
di definire una funzione di assegnazione “più conveniente”.
Esempio 1
2
Dato l’insieme S = {a, b, c, d} con P definita nel seguente modo: p(a) =
, p(b) =
17
2
9
4
, p(c) =
e p(d) =
. Sia C1 = {0, 11, 10, 100} il codice a lunghezza variabile e
17
17
17
l’applicazione f1 : S → C1 così definita: f1 (a) = 11, f1 (b) = 0, f1 (c) = 100 e f1 (d) = 10.
La lunghezza media di tale codice è:
2
1.2 Schema di codifica
¯l1 =
n
X
pi l(f (si )) = 2 ·
i=1
2
2
9
4
41
+1·
+3·
+2·
= .
17
17
17
17
17
(1.2)
Si consideri adesso un secondo codice C2 = {00, 10, 11, 01010} e l’applicazione f2 : S → C2
così definita: f2 (a) = 01010, f2 (b) = 00, f2 (c) = 10 e f2 (d) = 11. Analogamente a quanto
fatto per C1 calcoliamo la sua lunghezza media:
¯l2 =
n
X
i=1
pi l(f (si )) = 5 ·
2
2
9
4
40
+2·
+2·
+2·
= .
17
17
17
17
17
(1.3)
Si vede facilmente che il codice C2 è più efficiente del codice C1 .
L’esempio 1 mostra la particolarità che il codice C2 che contiene la parola più lunga
ha una lunghezza media minore, ciò è dovuto al fatto che in tale codice la funzione
di assegnazione associa la parola più lunga del codice alla probabilità minore.
Dall’esempio precedente si evince inoltre che quando si ha una conoscenza più dettagliata del sistema mediante la distribuzione di probabilità P , allora è conveniente
usare un codice a lunghezza variabile. L’esempio che segue mostra maggiormente
quando detto e in modo più generale.
Esempio 2
Sia un codice non a blocchi definito dalla sorgente S = {s1 , s2 , s3 , s4 , s5 } e p(s1 ) = 1 − ²
e p({s2 , s3 , s4 , s5 }) = ². Se si utilizza un codice a blocchi binario con due caratteri non si
riescono a rappresentare tutti gli eventi di S perchè esso può contenere al massimo 4 parole
(22 = 4), quindi è necessario utilizzare un codice a blocchi di 3 caratteri che permette di
rappresentare fino a 8 parole (23 = 8). È evidente che un codice a blocchi di lunghezza
tre ha sempre lunghezza media tre e ciò è indipendente dalla distribuzione P. Se invece
è utilizzato un codice a lunghezza variabile definito dalla seguente funzione di codifica:
f (s1 ) = 0 e f (s2 ) = 111, f (s3 ) = 101, f (s4 ) = 001, f (s5 ) = 110 si ha che la lunghezza
media di tale codice è:
lc =
Pn
i=1 pi l(f (si ))
= 1 · p(s1 ) + 3 · p(s2 ) + 3 · p(s3 ) + 3 · p(s4 ) + 3 · p(s5 ) =
3
1.3 Codici univocamente decifrabile e istantanei
1 · p(s1 ) + 3 · (p(s2 ) + p(s3 ) + p(s4 ) + p(s5 ))
lc = (1 − ²) + 3 · ² = 1 + 2 · ² < 3,
(1.4)
essendo ² < 1.
L’esempio 2 mostra chiaramente che quando non si ha una distribuzione P uniforme è più conveniente usare un codice a lunghezza variabile perchè permette di
realizzare un codice più efficiente, se invece P definisce una distribuzione uniforme
allora in questo caso conviene utilizzare un codice a blocchi e sfruttare la teoria dei
codici che verrà presentata nei capitoli seguenti che permette migliori possibilità di
individuazione e correzione di errore.
1.3
Codici univocamente decifrabile e istantanei
Prima di affrontare le problematiche inerenti alla correzione degli errori che possono
accadere in una trasmissione di un codice in questa sessione si affronterà il problema
della lettura di una stringa costituita dalle parole di un codice C.
Consideriamo ad esempio il codice C = {0, 01, 001}, ci si accorge subito che la stringa
001 letta da sinistra verso destra può essere interpretata in due modi differenti: essa
può contenere l’unica parola del codice 001 oppure la sequenza delle due parole 0
e 01. L’esempio precedente mostra un’ambiguità che può essere risolta definendo
dei codici particolari che permettono la lettura delle stringhe in maniera unica. È
evidente che un codice a blocchi di lunghezza n non presenta tali problematiche in
quanto la lettura di ogni singola parola viene effettuata con intervalli di n caratteri.
Se un codice C è a lunghezza variabile si dice che esso è univocamente decifrabile
se, date le due parole c1 , c2 , ...., ck e d1 , d2 , ...., df , allora si ha che c1 , c2 , ....., ck =
d1 , d2 , ....., df se e solo se k = f e cl = dl per 1 ≤ l ≤ k.
4
1.3 Codici univocamente decifrabile e istantanei
Da tale proprietà segue che un codice univocamente decifrabile è un codice che
consente una lettura di una sua stringa da sinistra a destra senza generare ambiguità.
Esempio 3
Il C = {1, 10, 100} è un codice decifrabile perchè qualunque stringa formata dalle sue parole
è sempre leggibile in quanto il carattere “1” individua l’inizio di ogni singola parola. Nella
seguente stringa u = 1/10/100/1/1/1/1 si è posto il simbolo “/” per evidenziare meglio
l’inizio di ogni parola contenuta in essa.
Un’altra proprietà legata alla lettura delle stringhe di un codice C è quella legata
alla necessità di riconoscere le parole del codice appena esse sono state ricevute, se
un codice C ha questa proprietà esso è detto codice istantaneo.
Esempio 4
Il codice C = {1, 01, 001} è un codice decifrabile e istantaneo, perchè al termine di ogni
parola viene posto il carattere 1 che garantisce il termine di ogni singola parola, tale codice
viene chiamato “comma code”. Il codice decifrabile descritto nell’esempio 3 invece non ha
le caratteristiche di essere istantaneo, infatti se ad esempio si è ricevuta la parola 10, non
possiamo dire subito se siamo in presenza della parola 10 o se quello che abbiamo ricevuto
è solo una parte della parola 100 ciò si può affermare solo alla ricezione del carattere
successivo.
Tutti i codici che sono istantanei sono chiaramente decifrabili, ma non è detto
che un codice decifrabile sia istantaneo, ciò si deduce dalle considerazioni fatte
nell’esempio 4.
NB: Tutti i codici a blocchi sono decifrabili e istantanei.
I codici istantanei godono della proprietà del prefisso.
Proprietà 1 (del prefisso) In un codice istantaneo C nessuna parola è prefisso (è
posta all’inizio) di un’altra parola del codice, vale anche il viceversa.
5
2
1.3 Codici univocamente decifrabile e istantanei
La dimostrazione della proprietà 1 è immediata ed essa è importante in quanto
caratterizza i codici istantanei.
Per i codici istantanei si ha il seguente teorema di Kraft.
Teorema 1 (di Kraft) Se C è un codice r-ario istantaneo costituito da n parole di
lunghezza li , con 1 ≤ i ≤ n, allora deve essere verificata la disuguaglianza di Kraft:
n
X
1
≤ 1.
r li
i=1
(1.5)
Se esistono n interi positivi l1 , l2 ,..., ln e r che verificano la disuguaglianza di Kraft,
allora esiste un codice istantaneo con n parole di lunghezza l1 , l2 , ...., ln .
Dim.
Dimostriamo la prima parte del teorema.
Sia C un codice costituito dalle parole {c1 , c2 , ...., cn } aventi rispettivamente lunghezza l1 , l2 , ...., ln . Sia L = max {l1 , l2 , ...., ln }, consideriamo la parola ci di lunghezza
li dove ci = x1 x2 .....xli , costruiamo una stringa di lunghezza L,
ui = x1 x2 .....xli yli +1 yli +2 .....yL ,
dove i primi li caratteri sono la parola ci mentre gli ultimi L − li caratteri yj con
li + 1 ≤ j ≤ L sono caratteri scelti tra gli r caratteri dell’alfabeto del codice C
senza restrizioni e con la possibilità di essere ripetuti. Il numero totale di differenti
stringhe di tipo ui è rL−li (ciò perchè i primi li caratteri in ui rimangono sempre
invariati), inoltre si ha che tutte le stringhe ui formate non possono essere parole
del codice C in quanto esso è istantaneo e gode della proprietà del prefisso.
Ripetiamo tale procedura su ogni singola parola ci del codice per 1 ≤ i ≤ n, per
ognuna di esse si formano rL−li stringhe differenti tutte di lunghezza L. Sommando
su i si ottiene:
6
1.3 Codici univocamente decifrabile e istantanei
n
X
r
L−li
=
i=1
n
X
rL
i=1
r li
(1.6)
La quantità espressa dalla (1.6) esprime il numero totale di stringhe ui che si ottiene
da ogni singola parola del codice ci con 1 ≤ i ≤ n ed esse sono tutte distinte e di
lunghezza L. Il valore rL esprime il numero totale di stringhe differenti di lunghezza
L che si possono formare con un alfabeto r-ario, ne segue che valgono le seguenti
disuguaglianze.
n
X
rL
i=1
rli
= rL
n
n
X
X
1
1
L
≤
r
⇒
≤ 1.
li
li
r
r
i=1
i=1
(1.7)
La (1.7) verifica la disuguaglianza di Kraft e la prima parte del teorema è provata.
Dimostriamo la seconda parte del teorema.
Determiniamo un algoritmo che permette di determinare un codice istantaneo che
abbia n parole rispettivamente di lunghezza l1 , l2 ,..., ln . Se α1 è il numero delle
parole del nostro codice istantaneo C di lunghezza 1, allora è necessario che α1 <
r; se α2 è il numero di parole di lunghezza 2 di C, allora tale valore deve essere
minore del numero totale di parole distinte di lunghezza 2 che si possono formare
con un alfabeto di r simboli, inoltre poichè C è un codice istantaneo per esso vale
la proprietà del prefisso ed è quindi necessario eliminare tutte le parole di lunghezza
2 che hanno come prefisso le parole del codice di lunghezza 1, cioè deve valere la
seguente diseguaglianza:
α2 < r2 − α1 r.
Analogamente se α3 è il numero di parole del codice C con lunghezza 3 allora deve
valere la seguente disuguaglianza:
α3 < r3 − α1 r2 − α2 r.
7
(1.8)
1.3 Codici univocamente decifrabile e istantanei
Dove il primo termine del secondo membro della (1.8) rappresenta il numero totale
di parole distinte di lunghezza 3 che si possono formare con un alfabeto di r simboli
a cui bisogna sottrarre le parole di lunghezza 3 che hanno come prefisso le parole del
codice di lunghezza 2 (secondo termine del secondo membro nella disuguaglianza
(1.8)) e le parole di lunghezza 3 che hanno come prefisso le parole del codice di
lunghezza 1 (terzo termine del secondo membro nella disuguaglianza (1.8)).
Se m è la massima lunghezza del codice C ( N.B. possono esistere lunghezze uguali
cioè li = lj ) e consideriamo tutti i possibili αi per 1 ≤ i ≤ m, il codice istantaneo
esiste se ognuna delle seguenti disuguaglianze è vera.
α1 < r
α1 r + α2 < r2
α1 r2 + α2 r + α3 < r3
(1.9)
.
.
α1 rm−1 + α2 rm−2 + ..... + αm ≤ rm
Vediamo cosa accade, ad esempio, se la terza disuguaglianza α1 r2 + α2 r + α3 < r3
è vera. Tutti i suoi termini sono positivi, quindi si ha che vale anche la seguente
disuguaglianza α1 r2 + α2 r < r3 ; è possibile dividere ambo i membri di quest’ultima
disuguaglianza per r, si ottiene α1 r + α2 < r2 , cioè anche la seconda disuguaglianza
delle (1.9) è vera, seguendo un analogo procedimento è facile verificare che anche la
prima disuguaglianza delle (1.9) è vera.
Sfruttando la metodologia usata nel precedente caso particolare si può affermare che
se una delle disuguaglianze della (1.9) è vera allora sono vere tutte le disuguaglianze
che la precedono. Osserviamo l’ultima disuguaglianza delle (1.9), se dividiamo ambo
i membri per rm si ha:
8
1.3 Codici univocamente decifrabile e istantanei
α1 α2
αm
+ 2 + ..... + m ≤ 1,
r
r
r
cioè
m
X
αi
i=1
n
X
1
=
≤ 1.
i
r
r li
i=1
Tale disuguaglianza è la disuguaglianza di Kraft ed è vera per le ipotesi del teorema,
quindi sono vere tutte le disuguaglianze che la precedono nella (1.9) e il teorema è
2
provato.
È importante notare che la seconda parte della dimostrazione del teorema precedente
afferma che se un codice verifica la disuguaglianza di Kraft non è detto che esso sia
istantaneo (vedi dall’esempio 6), ma afferma che se è verificata la disuguaglianza
di Kraft per i parametri l1 , l2 , ..., ln e r, allora è possibile costruire un codice
istantaneo r-ario con parole di lunghezza l1 , l2 , ...., ln mediante l’algoritmo presentato
dalla dimostrazione del teorema di Kraft.
Esempio 5
Consideriamo un codice 3-ario definito dall’alfabeto A = {0, 1, 2} si vuole vedere se esiste
un codice istantaneo con le seguenti lunghezze di parola: l1 = l2 = 1, l3 = 2, l4 = l5 = 4,
l6 = 5.
Come prima cosa verifichiamo se vale la disuguaglianza di Kraft:
2
1
0
2
1
196
+ 2+ 3+ 4+ 5 =
≤1
3 3
3
3
3
243
(1.10)
La disuguaglianza è verificata, cerchiamo un codice istantaneo che verifica le lunghezze
l1 = l2 = 1, l3 = 2, l4 = l5 = 4, l6 = 5 seguendo l’algoritmo definito nella seconda parte
della dimostrazione del teorema di Kraft, le parole di lunghezza 1 sono c1 = 0, c2 = 1, la
9
1.3 Codici univocamente decifrabile e istantanei
parola di lunghezza 2 è c3 = 20, le parole di lunghezza 4 sono c4 = 2100, c5 = 2101, la
parola di lunghezza 5 è c6 = 21100. Il codice C = {0, 1, 20, 2100, 2101, 21100} è istantaneo
perchè verifica la proprietà del prefisso.
Esempio 6
Il codice C = {0, 11, 100, 110} verifica la diseguaglianza di Kraft infatti si ha che:
1
1
2
+
+
= 1,
2 22 23
ma tale codice non è istantaneo perchè non verifica la proprietà del prefisso.
Un codice istantaneo è anche decifrabile e dal teorema di Kraft è immediato ottenere
il seguente teorema.
Teorema 2 Se esistono n interi positivi l1 , l2 ,..., ln e r che verificano la disuguaglianza di Kraft, allora esiste un codice decifrabile con n parole di lunghezza l1 ,
l2 , ...., ln .
2
Resta da capire se per ogni codice decifrabile vale la disuguaglianza di Kraft, cioè se
la prima parte del teorema di Kraft vale anche per i codici decifrabili. La risposta a
tale quesito viene data dal seguente teorema di McMillan .
Teorema 3 (di McMillan) Se C = {c1 , c2 , ....., cn } è un codice decifrabile, allora
vale la disuguaglianza di Kraft:
n
X
1
≤ 1.
li
r
i=1
(1.11)
Dim.
Consideriamo α1 , α2 ,..., αm il numero di parole del codice rispettivamente di lunghezza 1, 2,..., m. È facile verificare che il primo membro della disuguaglianza di
Kraft può scriversi anche nel seguente modo:
10
1.3 Codici univocamente decifrabile e istantanei
n
m
X
X
1
αj
=
.
l
i
r
rj
i=1
j=1
(1.12)
Eleviamo le due sommatorie ad un valore u, intero positivo:
Ã
n
X
1
r li
i=1
!u
=
à m
!u
X αj
j=1
rj
=
³α
α2
α m ´u
+ 2 + ··· + m .
r
r
r
1
(1.13)
Per maggiore chiarezza l’ultimo membro della (1.13) può essere scritto come il
prodotto di u sommatorie che rappresentano lo stesso termine:
³α
1
r
+
³α
α2
αm ´ ³ α1 α2
αm ´
α2
αm ´
1
+
·
·
·
+
·
+
+
·
·
·
+
·
·
·
+
+
·
·
·
+
.
r2
rm
r
r2
rm
r
r2
rm
(1.14)
Lo svolgimento di tale prodotto può essere svolto ed espresso come la somma dei
seguenti prodotti
X
i1 ,i2 ,··· ,iu
αi1 αi2 · · · αiu
.
ri1 +i2 +···+iu
(1.15)
La sommatoria della (1.15) è estesa su tutti gli i1 , i2 , · · · , iu con la limitazione
1 ≤ ij ≤ m con 1 ≤ j ≤ u. Posto k = i1 + i2 + ....iu la (1.15) può anche
essere scritta nel seguente modo
u·m
X
X
k=u i1 +i2 +....+iu
αi1 αi2 · · · αiu
,
k
r
=k
(1.16)
Nella (1.16) il valore minimo che può assumere k è u e il massimo è um e tale valore
all’interno della seconda sommatoria rimane sempre costante, quindi
u·m
X
1
rk
k=u
X
αi1 αi2 · · · αiu .
i1 +i2 +···+iu =k
Consideriamo adesso la quantità:
11
(1.17)
1.3 Codici univocamente decifrabile e istantanei
Nk =
X
αi1 αi2 · · · αiu .
(1.18)
i1 +i2 +···+iu =k
Le quantità αi1 , αi2 ,..., αiu rappresentano tutte le possibili parole di lunghezza k
formate nel seguente modo: i primi i1 caratteri individuano una parola del codice di
lunghezza i1 , i successivi i2 caratteri individuano una parola del codice di lunghezza
i2 fino ad arrivare agli ultimi iu che a loro volta sono una parola del codice di
lunghezza iu .
Figura 1.1:
Stringhe della stessa lunghezza k, ma con sequenze di parole differenti e di
differente lunghezza.
Tutte queste stringhe essendo il codice decifrabile, quindi univocamente leggibile,
sono tutte distinte tra di loro come si evince dalla (fig1.1), ricordiamo che se si ha
un alfabeto r-ario il numero di tutte le possibili parole distinte di lunghezza k è rk ,
da cui segue che
Nk =
X
αi1 αi2 · · · αiu ≤ rk .
(1.19)
i1 +i2 +···+iu =k
Quindi la (1.17) può essere scritta nel seguente modo:
u·m
X
1
rk
k=u
X
i1 +i2 +....+iu
u·m
u·m
X
1 k X
αi1 αi1 ......αiu ≤
r =
1 = u · m − u ≤ u · m. (1.20)
rk
=k
k=u
k=u
In definitiva:
12
1.4 Codici ottimi
à n
!u
X 1
≤u·m
r li
i=1
Elevando primo e secondo membro per
(1.21)
1
si ha:
u
n
X
1
1
1
≤ (u) u (m) u
l
i
r
i=1
(1.22)
Per la scelta arbitraria di u si vede facilmente che per u → ∞ vale la disuguaglianza
di Kraft e il teorema è dimostrato.
1.4
2
Codici ottimi
Data una sorgente S0 consideriamo la famiglia C costituita da tutti i codici istantanei
che si possono associare a S0 , chiaramente ad ogni codice di C è associata una sua
lunghezza media, consideriamo la lunghezza media minima ¯lmin tra tutti i codici
istantanei Cist associati a S0 , cioè
©
ª
¯lmin = min ¯lC | ∀ Cist ∈ C .
ist
(1.23)
Si definisce codice ottimo C un codice Cist istantaneo che ha lunghezza media ¯lCist
uguale a ¯lmin .
I codici ottimi godono delle seguenti tre proprietà.
Proprietà 2 Se C è un codice ottimo associato alla sorgente S0 = (S, P ) e c1 ,
c2 ,...., cn sono le sue parole rispettivamente di lunghezza l1 , l2 ,...., ln allora si ha
che se pi > pj deve essere li ≤ lj ( cioè alla probabilità maggiore si associa la parola
di lunghezza minore)
13
1.4 Codici ottimi
Dim.
Supponiamo per assurdo che esiste un codice ottimo C per cui si ha che pi > pj e
li > lj . Costruiamo un codice C 0 ottenuto da C in cui alla parola ci è associata la
probabilità pj e alla parola cj è associata la probabilità pi mentre le altre parole ck
sono legate alla stessa probabilità pk del codice C. Calcoliamo le lunghezze medie
rispettivamente dei codici C e C 0 e consideriamo la loro differenza.
l¯C =
n
X
pk lk + pi li + pj lj ;
(1.24)
pk lk + pi lj + pj li ;
(1.25)
k=16=i6=j
lC¯ 0 =
n
X
k=16=i6=j
lC¯ 0 − l¯C = pi lj + pj li − pi li − pj lj .
(1.26)
Dopo facili calcoli si ottiene.
lC¯ 0 − l¯C = pi (lj − li ) − pj (lj − li ) = (pi − pj ) (lj − li )
(1.27)
Ricordando che li > lj , (lj − li < 0) e pi > pj (pi − pj > 0) ne segue che lC¯ 0 − l¯C < 0
cioè lC¯ 0 < l¯C . Si è quindi determinato un codice C 0 che è istantaneo, ma ha lunghezza
media minore della lunghezza media del codice ottimo C e ciò è assurdo.
2
Proprietà 3 Sia C un codice ottimo e sia lm la maggiore lunghezza tra le lunghezze
delle parole del codice, allora esistono almeno due parole di lunghezza lm .
Dim.
Supponiamo per assurdo che esiste un codice ottimo C con una sola parola di
lunghezza lm . Calcoliamo la sua lunghezza media
l¯C =
m−1
X
Pk lk + Pm lm
k=1
14
(1.28)
1.4 Codici ottimi
Consideriamo l’unica parola cm ∈ C di lunghezza lm e consideriamo il codice C 0
ottenuto da C modificando soltanto cm mediante l’eliminazione dell’ultimo carattere.
Il codice C 0 è un codice istantaneo perchè gode della proprietà del prefisso e la sua
lunghezza media è:
lC¯ 0 =
m−1
X
pk lk + pm (lm − 1) .
(1.29)
k=1
È evidente che lC¯ 0 < l¯C . Si è determinato ancora una volta un codice istantaneo con
lunghezza media minore della lunghezza media del codice ottimo C e ciò è assurdo.
2
Proprietà 4 Sia C un codice ottimo e cm una parola di lunghezza massima lm ,
allora esiste un’altra parola ck di eguale lunghezza lm tale che i primi lm − 1 caratteri
di cm e ck sono uguali.
Dim.
Per la proprietà precedente in un codice ottimo C esistano almeno due parole di
lunghezza massima lm . Supponiamo per assurdo che non esistono due parole di
lunghezza lm i cui primi lm − 1 caratteri sono uguali. Se consideriamo una di tali
parole e cancelliamo il suo ultimo carattere otteniamo un nuovo codice istantaneo
C 0 che gode della proprietà del prefisso (nessuna sua parola è prefisso di un’altra) e
la sua lunghezza media è minore della lunghezza media del codice ottimo C.
1.4.1
2
Algoritmo di Huffman
In questa sessione è presentato l’ Algoritmo di Huffman che consente di individuare un codice ottimo data una distribuzione di probabilità P . Tale algoritmo è
valido per codici r-ari, ma qui sarà presentata la procedura che riguarda solo i codici
binari.
15
1.4 Codici ottimi
Algoritmo di Huffman
1. Si ordina la distribuzione di probabilità P 0 = {P10 , P20 , · · · , Pn0 } in modo tale
che le probabiltà hanno un ordine decrescente secondo gli indici, cioè Pi0 ≤ Pj0
con i > j.
0
2. Le due probabilità di valore inferiore, cioè Pn0 e Pn−1
si sommano, si ottie0
0∗
= Pn0 + Pn−1
. Si considera la distribuzione di probabilità
ne il valore Pn−1
©
ª
1
P 1 = P11 , P21 , · · · , Pn−1
in cui sono presenti tutte le probabilità di P 0 con
0
0∗
esclusione dei valori Pn0 e Pn−1
al posto dei quali si è inserito il valore Pn−1
.
La distribuzione di probabilità P 1 è anch’essa ordinata in ordine decrescente
0∗
secondo gli indici e si ha che Pi1 = Pn−1
per qualche i con 1 ≤ i ≤ n − 1.
3. Si ripete il passo precedente per altri n − 2 passi. In ogni singolo passo j si
j−1∗
determina una probabilità Pn−j
data dalla somma delle due probabilità di
valore minore.
4. Si ottiene la distribuzione di probabilità P n−2 costituita da soli due valori.
5. Si associano alle probabilità di P n−2 le parole 1 e 0 (la scelta è arbitraria),
quindi alla distribuzione di probabilità P n−2 è associato il codice Cn−2 .
6. Una delle probabilità di P n−2 è del tipo Pin−2 = P2n−3∗ = P2n−3 + P3n−3 con
j−1∗
i = 1, 2 (cioè del tipo Pn−j
con j = n − 2), se ad essa nel passo precedente
è stato associato il carattere k ∈ {0, 1}, allora nella distribuzione P n−3 alle
probabilità P2n−3 e P3n−3 si associano le parole k1 e k0 (la scelta è arbitraria)
e per essa si ottiene il codice Cn−3 .
7. Si ripete il procedimento precedente sino ad arrivare ad una assegnazione
di parole alla distribuzione P 0 . Tali parole associate alle probabilità di P 0
definiscono un codice ottimo binario C0 e l’algoritmo è concluso.
16
1.4 Codici ottimi
Per maggiore chiarezza segue l’esempio 7 che permette di esplicitare tutti i passi
definiti nell’algoritmo precedente.
Esempio 7
Sia data la distribuzione di probabilità P 0 = {0.35, 0.20, 0.20, 0.15, 0.10}, le due probabilità
di valore minore sono 0.10 e 0.15, la loro somma è 0.25∗ , si ottiene nuova distribuzione
di probabilità P 1 = {0.35, 0.25∗ , 0.20, 0.20}. Seguendo lo stesso procedimento si sommano
0.20 e 0.20 si ottiene la distribuzione di probabilità P 2 = {0.40∗ , 0.35, 0.25} e in seguito si
sommano i valori0.35 e 0.25 si ottiene P 3 = {0.60∗ , 0.40}.
Definiamo adesso una codifica binaria seguendo i passi 5, 6 e 7 partendo dalla distribuzione
P 3 fino ad arrivare alla distribuzione P 0 . I passi dell’algoritmo sono ben riassunti dalla
tabella seguente.
0.35
01
0.35
01
0.40*
1
0.60*
0
0.20
11
0.25*
00
0.35
01
0.40
1
0.20
10
0.20
10
0.25
00
0.15
001
0.20
11
0.10
000
Tab.1
Il codice ottimo legato alla distribuzione di probabilità P 0 è C = {01, 11, 10, 001, 000}.
È necessario adesso provare che il codice ottenuto dall’algoritmo di Huffmann è un
codice ottimo, ciò è ottenuto dal teorema seguente.
Teorema 4 Se Ci è un codice ottimo ottenuto dall’algoritmo di Huffman, allora
anche Ci−1 è un codice ottimo. L’algoritmo di Huffmann genera un codice ottimo.
17
1.4 Codici ottimi
Dim.
All’ultima distribuzione di probabilità che si ottiene eseguendo l’algoritmo di Huffman è associato il codice Cn−2 = {0, 1} che è senz’altro ottimo, quindi se in generale
si prova che l’algoritmo di Huffmann genera dal codice Ci ottimo il codice Ci−1
anch’esso ottimo, allora si è provato il teorema.
©
ª
Consideriamo il codice ottimo Ci = c1 , c2 , ...., c?m−1 , sia L = l(cm−1 ). Applichiamo
l’algoritmo di Huffman al codice Ci si ottiene il codice Ci−1 = {c1 , c2 , ....., cm−1 0, cm−1 1}
e calcoliamo le lunghezze medie dei codici Ci e Ci−1 :
¯li =
m−2
X
pk lk + (pm−1 + pm ) L;
(1.30)
k=1
¯li−1 =
m−2
X
pk lk + pm−1 (L + 1) + pm (L + 1) .
(1.31)
k=1
Ricordiamo che nel codice Ci−1 le ultime due parole hanno lunghezza L + 1. Sottraendo membro a membro la (1.30) dalla (1.31) si ha:
¯li−1 − ¯li = pm−1 + pm
⇒
¯li−1 = ¯li + pm−1 + pm .
(1.32)
Supponiamo per assurdo che Ci−1 non sia un codice ottimo e quindi esiste un codice
0
0
ottimo Ci−1
, associato alla distribuzione di probabilità di Ci−1 , tale che ¯li−1
< ¯li−1 .
0
Se Ci−1
è ottimo, per le proprietà 2, 3 e 4, esisteranno due parole di lunghezza
massima ed aventi i primi lm − 1 caratteri uguali e associate alle probabilità pm e
ª
©
0
= c01 , c02 , ...., c0m−1 0, c0m−1 1 . Applicando l’algoritmo di Huffman in
pm−1 , cioè Ci−1
ª
©
0?
senso opposto si determina un nuovo codice Ci0 = c01 , c02 , ...., cm−1
. Anche per i due
0
codici Ci0 e Ci−1
vale la relazione:
¯l0 = ¯l0 + pm−1 + pm .
i
i−1
18
(1.33)
1.5 La funzione entropia
0
Poichè si è supposto che Ci−1
è ottimo mentre per assurdo Ci−1 non lo è allora deve
valere la seguente disuguaglianza:
¯l0 < ¯li−1
i−1
(1.34)
Se ciò è vero confrontando le equazioni (1.32) e (1.33) si ha che vale la seguente
disuguaglianza.
¯l0 < ¯li
i
(1.35)
Ciò implica che Ci non è ottimo, questo è assurdo e il teorema è provato.
1.5
2
La funzione entropia
Nell’esempio 1 si è vista l’importanza della conoscenza della distribuzione delle
probabilità, da qui nasce l’esigenza di determinare una funzione che permetta di
“misurare” la conoscenza del sistema mediante la conoscenza della sua distribuzione
di probabilità. Tale funzione H è la funzione entropia che è differente dalla grandezza fisica usata in termodinamica. Essa nasce dagli studi relativi alla conoscenza
di “informazioni” di un sistema fatti da Shannon nel 1948.
Consideriamo la variabile random X a cui associamo gli eventi X = {x1 , x2 , ..., xq }.
A ciascuno degli eventi xi è possibile associare una distribuzione di probabilità P =
{p1 , p2 , ..., pq }.
La funzione entropia deve soddisfare le seguenti tre proprietà:
1. Se tutte le probabilità di P sono uguali cioè pi =
1
allora H è una funzione
q
crescente, cioè se q < q 0 allora si ha:
µ
H
1 1
1
, , ...,
q q
q
¶
µ
<H
19
1
1 1
, 0 , ..., 0
0
q q
q
¶
1.5 La funzione entropia
.
Nella realtà questa proprietà esprime che maggiore è il numero di eventi q
maggiore è l’incertezza legata agli eventi.
2. H è una funzione continua cioè a piccole variazioni di probabilità corrispondono
piccole variazioni di H.
3. Vale il principio che un esperimento può essere scomposto in una successione
di esperimenti successivi.
Esempio 7
Diamo per quest’ultima proprietà un esempio di un esperimento che è rappresentato gra1 1 1
ficamente nella seguente figura. Esso ha una distribuzione di probabilità P = { , , } e
2 3 6
1 1
0
può essere scomposto nella successione dei due esperimenti di probabilità P = { , } e
2 2
2 1
P 00 = { , }.
3 3
Tale scomposizione può essere rappresentata mediante la funzione entropia nel seguente
modo:
µ
H
1 1 1
, ,
2 3 6
¶
µ
=H
1 1
,
2 2
20
¶
1
+ H
2
µ
2 1
,
3 3
¶
.
1.5 La funzione entropia
Teorema 5 La sola funzione che verifica le tre proprietà 1, 2 e 3 è:
H(p1 , p2 , · · · , pq ) = −c
q
X
pi logb pi
(b > 1)
(1.36)
i=1
con c costante positiva.
Dim.
Poniamo
µ
H
1
1
,··· ,
q
q
¶
= f (q).
(1.37)
Supponiamo di avere sm eventi legati ad una determinata variabile random. Poichè
deve valere la terza proprietà, sm può essere scomposto in m sequenze di s eventi,
cioè:
f (sm ) = mf (s).
(1.38)
Fissati t e n interi positivi è sempre possibile determinare un m tale che:
2m ≤ tn < 2m+1 .
(1.39)
Passando ai logaritmi in base b e sfruttando le loro proprietà si ha:
logb 2m ≤ logb tn < logb 2m+1 ,
(1.40)
m logb 2 ≤ n logb t < (m + 1) logb 2.
(1.41)
Dividendo per n logb 2
2◦
z }| {
m logb t m + 1
≤
<
.
n
|n{z } logb 2
1◦
21
(1.42)
1.5 La funzione entropia
Poichè f (q), per le proprietà 1 e 2, è una funzione continua e crescente si ha che
applicandola alle disuguaglianze della (1.39) esse continuano a sussistere, cioè:
f (2m ) ≤ f (tn ) < f (2m+1 ),
(1.43)
dividendo per nf (2):
2◦
z }| {
m f (t) m + 1
≤
<
.
n
|n{z } f (2)
(1.44)
1◦
◦
Moltiplicando la 1 disuguaglianza della (1.44) per −1 si ottiene:
−
f (t)
m
≤− .
f (2)
n
(1.45)
Sommando la (1.45) con la 2◦ disuguaglianza della (1.42) si ha:
logb t
f (t)
1
−
< .
logb 2 f (2)
n
(1.46)
Allo stesso modo, moltiplicando la 2◦ disuguaglianza della (1.44) per −1 si ottiene:
−
f (t)
m 1
>− − .
f (2)
n
n
(1.47)
Sommando la (1.47) con la 1◦ disuguaglianza della (1.42) si ha:
logb t
f (t)
1
−
>− ,
logb 2 f (2)
n
(1.48)
¯
¯
¯ logb t
¯ 1
1
logb t
f (t)
1
f
(t)
¯<
− <
−
< ⇒ ¯¯
−
n
logb 2 f (2)
n
logb 2 f (2) ¯ n
(1.49)
da cui si ricava:
e per n → ∞ si ha:
¯
¯
¯ logb t
f (t) ¯¯
logb t
f (t)
log t
¯
lim ¯
−
=0⇒
=
⇒ f (t) = f (2) b = c logb t.
¯
n→∞ logb 2
f (2)
logb 2
f (2)
logb 2
(1.50)
Consideriamo adesso una distribuzione di probabilità con probabilità razionali:
ki
pi = P
j
kj
con ki
intero ∀i e
X
i
22
k
Pi
j
kj
=1
(1.51)
1.5 La funzione entropia
Scomponiamo l’esperimento in una successione di due eventi mediante le distribuzioni di probabilità rappresentate nella figura seguente.
È possibile allora scrivere:
µ
¶
1
1
1
H P , P ,··· , P
= H (p1 , p2 , ..., pm ) + p1 c logb k1 + p2 c logb k2 + · · ·
ki
ki
ki
P
+ pm c logb km = H (p1 , p2 , ..., pm ) + c pi logb ki .
Dopo semplici calcoli si ha:
µ
¶
P
1
1
1
H (p1 , p2 , ..., pm ) = H P , P , ..., P
− c i pi logb ki =
i ki
i ki
i ki
X
P ki
P
P
P
−c
pi logb ki =
c logb i ki − c i pi logb ki = c logb j kj · i P
j kj
i
X
X
X
X
X
ki
c
pi logb
kj − c
pi logb ki = −c
pi logb P
= −c
pi log pi .
k
j
i
i
j
i
i
i
La condizione necessaria del teorema è provata.
P
Il viceversa se Hb (p1 , p2 , · · · , pm ) = −c m
i=1 pi logb pi allora si ha che le proprietà
sono tutte verificate e il teorema è provato.
2
Dal teorema precedente si ha che per un sistema che ha una distribuzione di probabilità P = {p1 , p2 , · · · , pm } la funzione entropia è definita come la quantità:
Hb (p1 , p2 , · · · , pm ) = −
m
X
i=1
23
pi logb pi .
1.5 La funzione entropia
Dove la costante c è stata normalizzata a 1. Se il valore di b in H è 2 allora l’entropia
prende il nome di entropia binaria.
1.5.1
Proprietà della funzione entropia
Siano X e Y due variabili random e sia p(xi , yj ) la probabilità congiunta delle due
variabili, allora l’entropia congiunta a X e Y è definita come:
H(X, Y ) =
X
p(xi , yj ) log
i,j
1
.
p(xi , yj )
(1.52)
Enunciamo il seguente lemma omettendo la dimostrazione.
Lemma 1 Sia {p1 , p2 , · · · , pm } una distribuzione di probabilità e sia {q1 , q2 , ..., qm }
P
qi ≤ 1, allora si ha che:
una sequenza di numeri reali con 0 ≤ qi ≤ 1 e
X
pi log
X
1
1
≤
pi log
pi
qi
(1.53)
Consideriamo adesso una sequenza di teoremi che permettono di evidenziare alcune
proprietà della funzione entropia.
Teorema 6 Se X è una variabile aleatoria si ha che:
0 ≤ H(X) ≤ log q
(1.54)
Dim.
Chiaramente H(X) ≥ 0. Per definizione di entropia si può scrivere:
H(X) =
q
X
i=1
q
q
X
1
1 X
pi log ≤
pi log 1 =
pi log q
pi
q
i=1
i=1
(1.55)
da cui:
H(X) ≤ log q
(1.56)
2
24
1.5 La funzione entropia
Teorema 7 Siano X e Y due variabili random, allora si ha:
H(X, Y ) ≤ H(X) + H(Y )
(1.57)
Dim.
Se consideriamo la distribuzione di probabilità congiunta ad X e Y e sommo solo
secondo l’indice legato a una variabile random (cioè si varia i lasciando fissato j e
viceversa) si ha:
X
p(xi , yj ) = p(xi ),
(1.58)
p(xi , yj ) = p(yj ).
(1.59)
j
X
i
quindi:
X
1
1
+
p(yj ) log
=
p(x
)
p(y
)
i
j
i
j
X
P
1
1
= i,j p(xi , yj ) log
+
p(xi , yj ) log
=
p(xi )
p(yj )
i,j
X
P
1
1
= i,j p(xi , yj ) log
≥
p(xi , yj ) log
= H(X, Y ).
p(xi )p(yj )
p(x
,
y
)
i
j
i,j
H(X) + H(Y ) =
X
p(xi ) log
Il teorema è provato.
2
Siano X e Y due variabili random e p(yj |xi ) la distribuzione di probabilità dell’evento
Y condizionato dall’evento X, definiamo l’entropia condizionata nel seguente
modo:
H(X|Y ) =
X
p(yj )p(xi |yj ) log
i,j
X
1
=
p(yj )H(X|yj )
p(xi |yj )
j
(1.60)
Teorema 8 Se X e Y sono due variabili random, allora:
H(X|Y ) = H(X, Y ) − H(Y ).
25
(1.61)
1.5 La funzione entropia
Dim.
Dalla precedente definizione abbiamo:
H(X|Y ) =
X
p(yj )p(xi |yj ) log
i,j
1
.
p(xi |yj )
(1.62)
Ricordando che:
p(xi |yj ) =
p(xi , yj )
.
p(yj )
(1.63)
possiamo scrivere:
X
X
p(yj )
1
H(X|Y ) =
p(xi , yj ) log
=
p(xi , yj ) log
−
p(xi , yj )
p(xi , yj )
i,j
i,j
X
X
1
1
p(xi , yj ) log
= H(X, Y ) −
p(yj ) log
= H(X, Y ) − H(Y ).
p(y
)
p(y
)
j
j
i,j
j
Il teorema è provato.
2
Consideriamo l’insieme dei possibili segnali che si presentano in ingresso ad un ricevitore E = {a1 , ....., am }, supponiamo di avere associata ad esso una distribuzione
di probabilità p(ai ) con 1 ≤ i ≤ m. Possiamo allora scrivere l’entropia in ingresso
come:
H(E) = −
X
p(ai ) log p(ai ) =
i
X
p(ai ) log
i
1
p(ai )
(1.64)
Siano U = {u1 , ..., um } l’insieme dei segnali prodotti dalla sorgente in trasmissione,
possiamo definire informazione la quantità:
I(E, U ) = H(E) − H(E|U ).
(1.65)
Da essa è possibile definire capacità del canale come la quantità
C = maxE I(E, U ).
(1.66)
Essa è legata alla determinazione di una distribuzione di probabilità E tale che
rende massima I(E, U ).
26
Capitolo 2
I Primi concetti
2.1
Introduzione
In questo capitolo vengono presentati i primi concetti legati alla teoria dei codici. Le
prime domande che si pongono sono legate alle motivazioni dell’origine della teoria
dei codici e alla sua utilità.
Quando un sistema trasmissivo invia delle informazioni ad un sistema ricevente,
possiamo pensare ad una comunicazione telefonica o trasmissioni via etere o anche
trasmissioni che provengono dall’esterno del nostro pianeta inviate da sonde, astronavi o shuttle, nella realtà fisica del nostro universo può accadere che tali trasmissioni
vengano distorte e il segnale trasmesso ne risulti alterato nella sua ricezione.
Il sistema su cui vengono inviate le informazioni viene chiamato canale. Esso può
essere individuato dal mezzo trasmissivo su cui vengono inviate informazioni in una
normale comunicazione telefonica o un in invio dati tra due sistemi informatici collegati, il canale può anche essere costituito dallo spazio in cui si propagano onde
elettromagnetiche che trasportano informazioni. In ogni canale esiste sempre la presenza di rumore che compromette la trasmissione. Tale rumore si può legare a
27
2.1 Introduzione
interferenze elettromagnetiche (disturbi radio, attività solare, ecc.), competizioni di
trasmissione, fattori di disturbo random, e tanti altri fattori, ognuno legato al tipo
di trasmissione che si sta effettuando.
Un altro tipo di applicazione della teoria dei codici si ha quando si leggono informazioni su un “supporto”, in questo caso il rumore può essere legato alla non perfetta
condizione del supporto (ad esmpio sporcizia, presenza di graffi in CD o DVD o
invecchiamento del supporto) o a difficoltà del sistema di lettura.
Per motivazioni legate al sistema hardware l’informazione viaggia in sequenza di
informazioni binarie e quindi essa viaggia mediante codici binari. In questi appunti
a partire da questo capitolo saranno trattati codici a blocchi.
La motivazione per cui nella maggior parte dei casi si usano codici a blocchi sta nel
fatto che l’esperienza fisica e quindi la rigorosa osservazione sperimentale, associa
ai sistemi trasmissivi una distribuzione di probabilià costante. In particolare come
detto precedentemente l’alfabeto usato è del tipo A = {0, 1} e ogni suo carattere è
chiamato bit. Ad ogni singolo bit, come rappresentato nella figura 2.1, può essere
associata una probabilità p che esprime la probabilità che esso venga ricevuto correttamente, chiaramente la probabilità che un bit non sia trasmesso correttamente
è 1 − p.
La probabilità p è chiaramente legata al sistema trasmissivo ed essa prende il nome
di efficienza del canale, negli attuali sistemi trasmissivi essa supera il valore 0.97
cioè può assumere valori molto alti, ma è evidente che in un numero di bits molto
alto la probabilità che l’informazione venga inficiata da errore non è trascurabile.
Un codice C1 , con efficienza p1 , si dice più efficiente del codice C2 , di efficienza p2 ,
se si ha che p1 > p2 .
Varie sono state nel tempo le tecniche di controllo e/o correzione di errore, alcune
delle quali molto semplici come, ad esempio, l’aggiunta di un bit ad ogni parola di
un codice in modo tale che tutte le sue parole contengano un numero pari di bits
28
2.1 Introduzione
0
0
P
P
P
1
-1
-1
1
P
Figura 2.1: Efficienza di canale
di valore “1”. Il codice C = {111, 011, 001, 100, 110, 010} con l’aggiunta del bit di
parità diventa C 0 = {1111, 0110, 0011, 1001, 1100, 0101}, si vede facilmente che se
si riceve la parola 0010 avendo un numero di bits di valore “1” dispari non è una
parola del codice.
Un’altra tecnica di controllo e correzione di errore, detta di ridondanza, è quella
di trasmettere più volte la stessa parola e, in ricezione, di controllare se anche la
sequenza di ricezione ha sempre la stessa ripetizione, se ciò non avviene allora si
effettua la correzione scegliendo nella sequenza la parola del codice che è stata ripetuta più volte. Questa tecnica contrariamente alla precedente oltre ad individuare
l’errore permette anche di correggerlo, inoltre maggiore è il numero di ripetizioni di
una stessa parola in una sequenza, maggiore è la probabilità che la correzione sia
esatta. Esiste però un importante inconveniente in tale tecnica, essa infatti non permette un numero elevato di ripetizioni dato che maggiore è il loro numero, minore
è la velocità di trasmissione di informazione.
29
2.2 Probabilità e distanza
2.2
Probabilità e distanza
Il problema della correzione delle parole del codice è essenzialmente legato al concetto
di probabilità. La probabilità che la parola v, avente lunghezza n e appartenente
al codice a blocchi C di efficienza p, sia trasmessa correttamente è pn . Supponiamo
adesso di trasmettere la parola v ∈ C, ma di ricevere la parola w ∈
/ C, come risolvere
il problema della correzione di w?
È necessario definire una funzione che determini la probabilità che la parola v ∈ C
sia trasmessa e la parola w ∈
/ C sia ricevuta. In generale tale funzione può essere
definita, indipendentemente dal concetto di parola inviata e ricevuta, nel seguente
modo:
φ : K n × K n → [0, 1],
dove K n esprime l’insieme di tutte le possibili parole di lunghezza n i cui caratteri
appartengono all’insieme K = {0, 1}, K rappresenta quindi l’alfabeto del codice.
Se Φ (v, w) è la probabilità che la parola v ∈ C è stata inviata e w ricevuta, allora
si ha:
Φ (v, w) = pn−d (1 − p)d ,
(2.1)
dove d è il numero di bits differenti tra le parole v e w, n è la lunghezza delle parole
del codice C, n − d rappresenta il numero di bits trasmessi correttamente, d i bits
trasmessi in maniera errata e 1 − p è la probabilità che un singolo bit giunga in
maniera errata. La quantità d è chiamata distanza tra le parole v e w e si indica
con la simbologia d (v, w). Chiaramente non è difficile provare che tra due parole di
lunghezza n vale la seguente uguaglianza d (v, w) = d (w, v).
30
2.2 Probabilità e distanza
Esempio 1
Sia C un codice a blocchi di lunghezza 5. Per ogni parola v ∈ C la probabilità che v sia
ricevuta correttamente (cioè w = v) è:
Φ(v, v) = p5
Se invece la parola inviata è v = 10011 e quella ricevuta è w = 11001, allora la distanza
tra v e w è 2 e si ha che:
Φ(v, w) = p3 (1 − p)2
Individuiamo adesso una tecnica che permette di determinare la correzione di un
errore in ricezione. Supponiamo di aver ricevuto la parola w e che essa non appartiene al codice C. Tale tecnica di correzione di errore è basata sull’individuazione
della parola v 0 ∈ C tale che ad essa è associata la probabilità massima rispetto alla
parola ricevuta w mediante la funzione Φ cioè:
Φ (v 0 , w)max = max {Φ (v, w) : v ∈ C} .
(2.2)
Quindi se si riceve una parola w non appartenente al codice a blocchi C si individua
la parola del codice v 0 tale che la funzione Φ è massima al variare di v in C, fissata
w. Tale parola v 0 si sostituisce a w.
È possibile che in tale tecnica si abbia un insieme di parole del codice che hanno
tutte la stessa probabilità massima, in tal caso si genera un’ambiguità, in seguito
vedremo come affrontare tale evenienza.
Consideriamo adesso un risultato che permette di associare il concetto di probabilità
definito dalla funzione Φ al concetto di distanza tra due parole.
31
2.2 Probabilità e distanza
1
< p < 1 e siano v1 e
2
v2 due parole del codice C. Se d1 è la distanza tra v1 e la parola ricevuta w e d2 è
Teorema 9 Sia C un codice a blocchi di lunghezza n, con
la distanza tra v2 e w, allora si ha che:
Φ(v1 , w) < Φ(v2 , w)
(2.3)
se e solo se d1 > d2 , vale anche il viceversa.
Dim.
La disuguaglianza
Φ(v1 , w) < Φ(v2 , w)
vale se e solo se:
pn−d1 (1 − p)d1 < pn−d2 (1 − p)d2 ;
pn−d1 (1 − p)d1
pn−d2 (1 − p)d2
< 1;
pn−d1 −n+d2 (1 − p)d1 −d2 < 1;
pd2 −d1 (1 − p)−(d2 −d1 ) < 1;
µ
Poichè per le ipotesi
p
1−p
¶d2 −d1
< 1.
1
< p < 1 si ha che p > 1 − p ovvero:
2
p
> 1,
1−p
32
(2.4)
2.2 Probabilità e distanza
allora la (2.4) è vera se e solo se l’esponente è negativo cioè se:
d2 − d1 < 0
⇒
d2 < d1 ,
(2.5)
e il teorema è provato.
2
Il teorema precedente assume una rilevanza fondamentale in quanto permette di
abbandonare il concetto di probabilità e di sostituirlo con il concetto di distanza tra
due parole.
La tecnica di correzione di errore esposta precedentemente adesso cambia nel seguente modo: se si riceve una parola w non appartenente al codice C si individua la
parola v 0 ∈ C che ha distanza minima da w e si sostituisce a w, ciò equivale al fatto
che la funzione Φ(v, w), fissata w, assume valore massimo per v 0 ∈ C. L’esempio
seguente chiarisce meglio tale tecnica.
Esempio 2
Sia il codice C = {01101, 01001, 10100, 10101} e supponiamo di ricevere la parola w =
00110 non appartenente al codice C. Esaminiamo la tabella seguente.
C
w
distanza
c1
01101
00110
3
c2
01001
00110
4
c3
10100
00110
2
c4
10101
00110
3
Tab.1
La parola del codice che ha distanza minima da w è c3 = 10100, tale parola è quella che
corregge w ed è quella che tra tutte le parole del codice C ha la massima probabilità di
essere stata inviata in trasmissione.
33
2.3 Peso ed errore
2.3
Peso ed errore
Si è precedentemente detto che l’alfabeto dei codici a blocchi è K = {0, 1}, ma tale
insieme di caratteri è anche un insieme numerico e su di esso possono essere definite
due operazioni algebriche binarie, una di somma e l’altra di prodotto definite dalla
tabella seguente.
Somma
Prodotto
0+0=0
0·0=0
1+0=1
1·0=0
1+0=1
0·1=0
1+1=0
1·1=1
Tab.2
Le due operazioni di somma e prodotto danno all’insieme K le proprietà di campo.
L’insieme K n , come precedentemente detto, è l’insieme di tutte le possibili differenti
parole binarie di lunghezza n, tale insieme è finito ed ha cardinalità uguale a 2n ,
perchè ogni singola componente di una parola di K n può assumere valori “0” o “1”.
L’insieme K n può anche assumere la struttura di spazio vettoriale se si interpretano
le sue parole come vettori e su di esse si definiscono le operazioni di somma vettoriale
e di prodotto esterno tra gli elementi di K e K n mediante i concetti di spazio
vettoriale introdotti nei corsi base di algebra lineare. La somma tra le componenti
corrispondenti di due parole è data dall’operazione di somma definita su K. Un
esempio di somma tra le due parole (101) e (111) è: (101) + (111) = (010).
È importante notare che la somma di due parole uguali è uguale alla parola che
possiede in tutte le sue componenti bits di valore “0”, tale parola è detta nulla e si
34
2.3 Peso ed errore
indica con il simbolo 0, cioè ∀v ∈ K n si ha che v + v = 0. Tale proprietà permette
di capire che la parola opposta di una qualunque parola v ∈ K n è la parola stessa.
Si ha inoltre che vale la seguente proprietà.
Proprietà 5 Se v + w = 0, allora si ha che v = w.
2
Si è preferito evidenziare tale proprietà perchè molto spesso chi comincia a studiare
questi argomenti commette l’errore di scrivere v = −w, ciò è sbagliato!!!
Infatti se vale l’eguaglianza v + w = 0, allora vale anche v + w + w = w che è
equivalente a v + 0 = w ed infine si ha v = w.
Diamo adesso l’importante nozione di errore per un codice C a blocchi. Supponiamo
che è stata inviata la parola v ∈ C e si sia ricevuta la differente parola w, allora si
definisce errore tra v e w la parola u così definita:
u = v + w.
(2.6)
Il concetto di errore legato alle parole v e w può per certi versi sembrare “strano”,
infatti nella sua definizione si capisce facilmente che per determinare u non solo è
necessaria la parola w conosciuta in ricezione, ma anche la parola trasmessa. Questo
non deve sorprendere se si pensa che, come vedremo nel capitolo 3 e nei successivi,
la teoria dei codici in correzione di errore ha come obiettivo principale quello di
individuare, mediante tecniche matematiche, la parola u indipendentemente dalla
conoscenza di v. Se si riesce in tale obiettivo, dopo aver verificato che w ∈
/ C, per
determinare v basta sommare le parole w + u e si ottiene la parola inviata.
Se v ∈ K n , allora si definisce peso di v il numero di bits che hanno valore “1” in v.
Tale valore si esprime secondo la simbologia wt(v). Ad esempio il peso della parola
v = 011001 ∈ K 6 è uguale a tre, cioè wt (011001) = 3.
35
2.3 Peso ed errore
Esiste una relazione tra il peso e la distanza dell’errore. Infatti date due parole
distinte v e w, la loro distanza d(v, w) rappresenta il numero di bits tra loro differenti.
La somma u = v + w individua la parola u, diversa dalla parola nulla, che ha la
caratteristica di possedere bits di valore “1” nelle componenti in cui v e w sono tra
loro differenti, ciò comporta che la parola u ha peso uguale alla distanza tra v e w
cioè:
d(v, w) = wt(u).
(2.7)
Se d è la distanza tra le parole v e w, allora l’equazione (2.1) si può anche scrivere
nel seguente modo:
Φ (v, w) = pn−d (1 − p)d = pn−wt(u) (1 − p)wt(u) .
(2.8)
Esempio 3
Siano v = 011001 e w = 111101 parole di K 6 , si ha che u = v + w = 100100 allora segue
che: d(v, w) = wt(v + w) = 2.
Di seguito sono enunciate una serie di proprietà legate ai concetti di distanza e di
peso.
Proprietà 6 Date due parole v e w di K n allora valgono le seguenti quattro proprietà.
1. d(v, u) + d(u, w) ≥ d(v, w);
2. wt(v + w) ≤ wt(v) + wt(w);
36
2.4 Prime tecniche di codifica
3. wt(av) = a · wt(v)
con
4. d(av, aw) = a · d(v, w)
a ∈ K;
con
a ∈ K.
2
La prima disuguaglianza delle precedenti è la disuguaglianza triangolare.
Diamo adesso un’altra importante definizione. Si definisce distanza o distanza di
Hamming di un codice binario C l’intero dc così definito:
dc = min {d(v 0 , v 00 ), v 0 , v 00 ∈ C} = min {wt(v 0 + v 00 ), v 0 , v 00 ∈ C} .
(2.9)
Tale parametro, se non vi è alcuna ambiguità legata al codice C, si denoterà con
la semplice simbologia d. La distanza d è uno dei tre parametri che, in seguito,
caratterizza un codice a blocchi.
2.4
Prime tecniche di codifica
La tecnica di decodifica che è presentata in questa sessione è basata sulla ricerca tra
tutte parole del codice C della parola che, in termini di distanza, è la più vicina alla
parola che è stata ricevuta e che non appartiene al codice.
Tale tecnica prende il nome di MLD dall’inglese “Maximum Likelihood Decoding”
cioè massima probabiltà di decodifica.
Il seguente esempio mostra in maniera pratica l’utilizzo di tale tecnica su un codice
estremamente banale, ma utile a scopi didattici.
37
2.4 Prime tecniche di codifica
Esempio 4
Sia il codice di lunghezza 3, C = {000, 111}. Consideriamo tutte le differenti parole di K 3 ,
esse sono 23 e K 3 = {000, 001, 010, 011, 100, 101, 110, 111}.
Parola ri-
Errore
Errore
cevuta
000 + w
111 + w
Decodifica
000
000∗
111
000
001
001∗
110
000
010
010∗
101
000
011
011
100∗
111
100
100∗
011
000
101
101
010∗
111
110
110
001∗
111
111
111
000∗
111
Tab.3
La prima colonna della tabella precedente rappresenta tutte le possibili parole di lunghezza
tre che possono essere ricevute, cioè w, la seconda e terza colonna rappresentano la somma
della singola parola del codice C e la parola w cioè tali colonne rappresentano gli errori 000+
w e 111 + w. L’ultima colonna individua la parola di C che “correggerà” w. Supponiamo
che la parola 001 è ricevuta, nella terza riga della tabella si considerano gli errori 001 e
110, tra essi si determina la parola del codice che sommata a 001 ha errore di peso minore,
cioè 000 corrispondente all’errore 001. Nella tabella gli errori di peso minore su ogni riga
vengono evidenziati mediante asterisco.
Nell’esempio 4 è importante notare che che la scelta della parola di peso minore è
dovuta al fatto che d(v, w) = wt(v +w) e a quanto affermato dal teorema 9, date due
38
2.4 Prime tecniche di codifica
parole del codice C v1 e v2 se si ha che d(v1 , w) = wt(v1 +w) < d(v2 , w) = wt(v2 +w)
allora la parola v1 ha maggiori probabilità di essere stata inviata rispetto alla parola
v2 .
Il codice dell’esempio 4, come già detto, è estremamente semplice ed inoltre per
ogni parola ricevuta non possiede alcuna ambiguità, cioè su ogni parola ricevuta w
è sempre possibile fare una correzione. In codici più complessi può accadere che per
una parola ricevuta si determina un insieme di errori dello stesso peso in tal caso la
tecnica MLD si scinde in due strategie di correzione.
• CMLD (complete MLD): Ricevuta w ∈
/ C, se vi sono più parole del codice con
lo stesso errore minimo, allora tra tali parole se ne sceglie una arbitrariamente
o mediante tecniche ponderate.
• IMLD(incomplete MLD): Ricevuta w ∈
/ C, se vi sono più parole del codice
con lo stesso errore minimo, allora si richiede la ritrasmissione del messaggio.
La ritrasmissione del messaggio può essere anche chiesta quando si riceve una
parola w “troppo” distante da tutte le parole del codice, il“troppo” è legato al
tipo di strategia che si vuole adottare in correzione.
39
2.4 Prime tecniche di codifica
Esempio 4
Parola ri-
Errore
Errore
Errore
cevuta
0000 + w
1010 + w
0111 + w
Decodifica
0000
0000∗
1010
0111
0000
1000
1000
0010
1111
− − −−
0100
0100∗
1110
0011
0000
0010
0010
1000
0101
− − −−
0001
0001∗
1011
0110
0000
1100
1100
0110
1011
− − −−
1010
1010
0000∗
1101
1010
1001
1001
0011
1110
− − −−
0110
0110
1100
0001∗
0111
0101
0101
1111
0010∗
0111
0011
0011
1001
0100∗
0111
1110
1110
0100∗
1001
1010
1101
1101
0111
1010∗
0111
1011
1011
0001∗
1100
1010
0111
0111
1101
0000∗
0111
1111
1111
0101
1000
0111
Tab.4
La tabella 4 è legata al codice di lunghezza 4 C = {0000, 1010, 0111} e mostra che nelle
righe 2a , 4a , 6a e 8a la tecnica IMLD chiede sempre la ritrasmissione.
40
2.5 Individuazione di errore
2.5
Individuazione di errore
Un codice C individua un errore u se e solo se v + u ∈
/ C ∀v ∈ C.
Esempio 5
Consideriamo il seguente codice C = {001, 101, 110}, vediamo se esso individua l’errore
u = 010. Per far ciò sommiamo tale errore ad ogni parola del codice e verifichiamo che
tale parola non appartiene a C.
001 + 010 = 011 ∈
/C
101 + 010 = 111 ∈
/C
110 + 010 = 100 ∈
/C
Il codice C individua l’errore u = 010.
Consideriamo adesso l’errore u0 = 100.
001 + 100 = 101 ∈ C
101 + 100 = 001 ∈ C
110 + 100 = 010 ∈
/C
Il codice C quindi individua l’errore u ma non individua l’errore u0 .
Il risultato seguente individua un insieme di errori che possono essere individuati da
un codice C.
Teorema 10 Sia C codice a blocchi di lunghezza n e distanza d, allora C individua
tutti gli errori diversi dalla parola nulla e con peso minore o uguale a d − 1. Esiste
almeno un errore di peso d che non può essere individuato da C.
41
2.6 Correzione di errore
Dim.
Consideriamo un errore u 6= 0 il cui peso è wt(u) ≤ d − 1 con d 6= 1, ∀ v ∈ C si ha
che:
d(v, v + u) = wt(v + v + u) = wt(u) ≤ d − 1
(2.10)
Poichè C ha distanza d segue che prese due generiche parole v 0 ∈ C e v 00 ∈ C allora
d(v 0 , v 00 ) ≥ d, quindi se v ∈ C e vale la (2.10) allora si ha che v + u ∈
/ C. Vista
l’arbitrarietà della scelta di v la prima parte del teorema è provata.
Se d è la distanza del codice allora esistono almeno due parole c0 ∈ C e c00 ∈ C
tale che d(c0 , c00 ) = d. Sia u = c0 + c00 è evidente che wt(u) = d e c00 = u + c0 ∈ C.
Si è trovato un errore u con peso d che non viene individuato da C e il teorema è
provato.
2
Se d è la distanza di un codice C, allora C si dirà d - 1 error-detecting.
Esempio 6
Il codice C = {000, 111} ha distanza d = 3 ed è 2-error-detecting.
Esempio 7
Il codice C = {001, 101, 110} ha distanza d = 1. Poichè d − 1 = 0 non troveremo errori.
2.6
Correzione di errore
In questa sessione è caratterizzato un particolare errore legato al codice C che oltre
ad essere individuato permette una correzione della parola ricevuta.
Si dice che un codice C corregge un errore u se e solo se, comunque si fissi w ∈ C
e w 6= v, vale la disuguaglianza:
d(w, v + u) > d(v, v + u)
42
(2.11)
2.6 Correzione di errore
Esempio 8
Sia dato il codice C = {000, 111} e l’errore u = 010. Supponiamo che la parola inviata sia
v = 000. In questo caso u + v = (010) + (000) = 010, pertanto:
d(000, u + v) = d(000, 010) = wt(010) = 1
d(111, u + v) = d(111, 010) = wt(101) = 2.
Consideriamo adesso che la parola inviata è v = 111, in questo caso u+v = (010)+(111) =
101, pertanto:
d(000, u + v) = d(000, 101) = wt(101) = 2
d(111, u + v) = d(111, 101) = wt(010) = 1.
In entrambi i casi, se si effettuano le tecniche di codifica usate nella sessione 2.4 si vede
che C corregge u = 010 in modo “efficace” sia nell’ipotesi che sia inviata la parola 000 che
la parola 111 ed inoltre verifica la (2.11). Consideriamo adesso l’errore u = 110.
Per v = 000 si ha:
d(000, u + v) = d(000, 110) = wt(110) = 2
d(111, v + u) = d(111, 110) = wt(001) = 1.
In questo caso C non corregge l’errore u = 110 perchè la parola che ha distanza minore
non è quella inviata.
Dato x ∈ R, indichiamo con bxc il massimo intero minore o uguale a x. Ad esempio:
¹ º
¹ º
5
1
= 2; b3c = 3;
= 0.
2
2
Anche per questo tipo di errori cerchiamo di individuare gli errori che sono corretti
da un codice C.
43
2.6 Correzione di errore
Teorema 11 Sia C un codice di lunghezza n e distanza d. Allora esso corregge tutti
¹
º
d−1
gli errori di peso minore o uguale a
. Esiste almeno un errore di peso pari
2
¹
º
d−1
a 1+
che C non corregge.
2
Dim.
º
d−1
e due arbitrarie parole v e w in C con
Sia u un errore con peso wt(u) ≤
2
v 6= w, supposto di trasmettere v. Si vuole dimostrare che:
¹
d(v, v + u) < d(w, v + u).
(2.12)
Per la disuguaglianza triangolare si ha che:
d(w, v + u) + d(v + u, v) ≥ d(w, v) ≥ d.
(2.13)
Per le ipotesi si ha anche che:
d(v + u, v) = wt(v + u + v) = wt(u) ≤
d−1
,
2
(2.14)
quindi,
d ≥ 2wt(u) + 1.
(2.15)
d(w, v + u) + wt(v + u + v) ≥ d(w, v) ≥ d ≥ 2wt(u) + 1
(2.16)
d(w, v + u) + wt(u) ≥ 2wt(u) + 1
(2.17)
d(w, v + u) ≥ wt(u) + 1 = d(v + u, v) + 1
(2.18)
Dalla (2.13) si ha:
Dalla scelta arbitraria di v e w si ha che:
44
2.6 Correzione di errore
d(w, v + u) > d(v, v + u).
(2.19)
La prima parte del teorema è provata.
Poichè la distanza di C è d allora esistono almeno due parole v e w appartenenti a
C tali che:
d(v, w) = d
(2.20)
º
(d − 1)
Consideriamo la parola v + w ed in essa cambiamo un numero d − 1 −
2
bits di valore “1” in “0”; chiamiamo u la parola che si ottiene dopo aver cambiato
¹
tali bits. Il peso di tale parola sarà:
½
¹
d−1
d− d−1−
2
º¾
¹
º
d−1
=
+ 1.
2
Consideriamo adesso d(v, v + u) e d(w, v + u):
¹
º
d−1
d(v, v + u) = wt(u) =
+1
2
½
¹
º¾
d−1
d(w, v + u) = wt(w + v + u) = d(v + w, u) = d − 1 +
2
(2.21)
(2.22)
Se la distanza d è dispari, allora si può scrivere come d = 2t + 1 e si ha che:
d(v, v + u) = 1 +
2t
=1+t
2
(2.23)
e
d(w, v + u) = 2t + 1 − (1 + t) = t
(2.24)
d(v, v + u) > d(w, v + u)
(2.25)
Pertanto:
in contraddizione con la (2.19).
45
2.6 Correzione di errore
Se la distanza d è pari essa può scriversi come d = 2t. In tal caso:
¹
º
¹
º
1
2t − 1
d(v, v + u) = 1 +
=1+ t−
=1+t−1=t
2
2
(2.26)
d(w, v + u) = 2t − t = t
(2.27)
d(v, v + u) = d(w, v + u)
(2.28)
e
Pertanto:
anch’essa in contraddizione con la (2.19), quindi il codice C non corregge l’errore u
e il teorema è completamente provato.
2
¹
º
d−1
Se d è la distanza di un codice C, allora C si dirà
-correttore, ad esempio
2
un codice di distanza sette è un codice 3-correttore.
46
Capitolo 3
Codici lineari
3.1
Introduzione
In questa sessione è presentato un tipo di codice che permette l’applicazione di molti
concetti incontrati nei corsi base di algebra lineare.
Un codice binario a blocchi C si definisce lineare se la somma di due parole v e w,
appartenenti a C è ancora una parola di C, cioè:
∀v, w ∈ C
⇒
v + w ∈ C.
Se K n è un insieme di parole di lunghezza n che ha le proprietà di spazio vettoriale
sul campo K = {0, 1} mediante le operazioni di somma e prodotto definite nel
capitolo precedente, allora un codice lineare C può intendersi come un sottospazio
di K n , infatti la sua definizione implica la chiusura delle operazioni di somma e
prodotto esterno in C.
In un codice lineare molti parametri definiti nel capitolo precedente possono essere
calcolati mediante degli algoritmi più semplici rispetto a quelli che si basano sulle
definizioni. Nel teorema seguente si vede come è possibile calcolare la distanza di un
47
3.1 Introduzione
codice senza effettuare il confronto diretto tra tutte le distinte coppie delle parole
del codice.
Teorema 12 La distanza di un codice lineare C è la più piccola distanza tra tutte
le parole del codice, di peso maggiore di zero, e la parola nulla.
Dim.
Consideriamo la quantità t = min {d(0, c), c ∈ C}. Supponiamo per assurdo che la
distanza del codice d < t, allora esistono almeno due parole v 0 e v 00 appartenenti a
C per cui si ha:
d(v 0 , v 00 ) = d.
Consideriamo la parola c = v 0 + v 00 , essa apparterrà a C ed inoltre wt(c) = d > 0,
quindi:
wt(c) = d(0, c) = d.
Ciò vuol dire che:
d ∈ {d(0, c), c ∈ C}
⇒
d ≥ t.
Si è determinato un assurdo in quanto t è il minimo di tale insieme e contemporaneamente si ha che d < t.
2
Esempio 1
C = {000, 111, 011, 100}, le distanze tra tutte le parole di C con peso maggiore di zero
dalla parola 000 sono d(111, 000) = 3, d(011, 000) = 2, d(100, 000) = 1 quindi la distanza
del codice è d = 1.
48
3.2 Prodotto scalare in K n
3.2
Prodotto scalare in K n
In K n è possibile introdurre il prodotto scalare canonico definito nei corsi di algebra
lineare. Se v e w sono due parole di K n , si intende come loro prodotto scalare la
somma dei prodotti delle componenti corrispondenti, ad esempio se v = (111) e
w = (010) si ha che v · w = (111) · (010) = 0 + 1 + 0 = 1. Se il prodotto scalare di
due parole è zero allora le due parole si dicono ortogonali, ad esempio se v = (111)
e w = (101) allora v · w = 1 + 0 + 1 = 0 e tali parole sono ortogonali.
Si definisce C ⊥ (C ortogonale) l’insieme delle parole:
C ⊥ = {v ∈ K n : v · w = 0 ∀w ∈ C} ,
cioè l’insieme delle parole di K n che sono ortogonali ad ogni parola di C. Tale
insieme è anch’esso un codice lineare, infatti se c0 e c00 sono due arbitrarie parole
di C ⊥ e v è una generica parola di C, allora si ha che essa è ortogonale alla parola
somma c0 + c00 , cioè:
(c0 + c00 ) · v = c0 · v + c00 · v = 0,
ciò vuol dire che prese due parole arbitrarie di C ⊥ allora la loro somma appartiene
a C ⊥ e C-ortogonale è un codice lineare.
Un insieme di parole di C, B = {c1 , c2 , · · · , ck }, è un insieme di generatori di C se
per qualunque v ∈ C è possibile scrivere:
v = a1 c1 + a2 c2 + ... + ak ck .
È evidente che se l’equazione vettoriale
a1 c1 + a2 c2 + ... + ak ck = 0,
49
3.3 Matrice generatrice
è vera se e solo se ai = 0, per 1 ≤ i ≤ k, allora gli elementi di B sono detti
linearmente indipendenti ed essi formano una base di C. Il valore k, cioè il numero
di elementi in B è detto essere la dimensione di C. Essa insieme ai parametri n
(lunghezza), d (distanza) caratterizza un codice C.
In algebra lineare vale il seguente risultato, che in questi appunti è soltanto enunciato.
Teorema 13 Sia C un codice lineare di lunghezza n e dimensione k, allora si ha:
dimC + dimC ⊥ = n
(3.1)
2
Maggiori approfondimenti degli argomenti trattati in questa sessione possono facilmente essere trovati in qualunque testo di algebra lineare.
3.3
Matrice generatrice
Sia C un codice lineare e B = {c1 , c2 , ..., ck } un insieme di sue parole che costituiscono
una sua base. Costruiamo la matrice G, posizionando per riga tutti gli elementi di
B.


c
 1 


 c2 




.
G =
.






 . 


ck
50
(3.2)
3.3 Matrice generatrice
La matrice (3.2) è detta matrice generatrice, essa si può ottenere anche da una
matrice le cui righe sono costituite da parole del codice che formano un insieme di
generatori di C mediante operazioni elementari.
La riduzione di matrici mediante sequenza di operazioni elementari si rimanda ai corsi algebra lineare, qui invece sono presentate due particolari riduzioni che conducono
alla matrice generatrice di un codice lineare.
Sia A una matrice (k × n) su K, un elemento “1” di A si dice 1-leading se esso è un
elemento speciale (tutti gli elementi al di sotto sono “0”) e nella riga in cui si trova
tutti gli elementi alla sua sinistra assumono valore “0”. Una colonna della matrice
A si definisce colonna leading se essa contiene un 1-leading e tutti gli altri suoi
elementi sono “0”.
Esempio 2
Nella matrice A i caratteri “1” sottosegnati sono degli 1-leading, in particolare, nella seconda riga l’ 1-leading non ha nessun zero a sinistra in quanto primo elemento della riga,
ma rientra nella sua definizione perchè appartiene all’ultima riga di A.
La matrice B contiene due colonne leading corrispondenti ai caratteri “1” sottosegnati.


A=

00011000

 0 1 0 



B=
 0 0 1 .


1 0 1
;
10011111
Una matrice A è ridotta parzialmente (REF) se tutte le sue righe nulle sono
poste al fondo di A e ogni riga non nulla ha un 1-leading che ha alla sua destra tutti
gli 1-leadings delle righe sottostanti. Se una matrice non è ridotta parzialmente,
allora essa può essere ridotta mediante le operazioni elementari:
1. Ri ⇒ Rj ;
51
3.3 Matrice generatrice
2. Ri ⇒ Ri + Rj .
Esempio 3
La matrice A è una matrice ridotta parzialmente.

 0 1

 0 0

A =
 0 0


0 0

1 1 0 

1 0 0 

.
0 0 0 


0 0 0
Esempio 4
La matrice B non è una matrice ridotta parzialmente, consideriamo le sue righe come
generatori di un codice lineare C di lunghezza n = 4.


 1 0 1 1 



B =
 1 0 1 0 .


1 1 0 1
Riduciamo B mediante una sequenza di operazioni elementari.
{R2 ⇒ R2 + R1
R3 ⇒ R3 + R1 }.

B0

 1 0 1 1 


.
=
0
0
0
1




0 1 1 0
52
3.3 Matrice generatrice
{R2 ⇔ R3 } ;


 1 0 1 1 



B 00 = 
 0 1 1 0 .


0 0 0 1
La matrice B 00 è ridotta parzialmente e le sue tre righe non nulle in cui compaiono gli
1- leading sono linearmente indipendenti quindi si è ottenuta una matrice generatrice del
codice C le cui righe formano una base di C.
Una matrice A si dice ridotta totalmente(RREF) se essa è ridotta parzialmente
e ogni suo 1-leading si trova in una leading colonna.
Esempio 5
La precedente matrice B 00 può essere ridotta totalmente mediante la seguente operazione
elementare.
{R1 ⇒ R1 + R3 } ;

B 000

 1 0 1 0 



=
 0 1 1 0 .


0 0 0 1
B 000 è una matrice ridotta totalmente ed essa è anche una matrice generatrice.
53
3.4 Matrice di parità
Se un codice C ha dimensione k, allora si ha che la sua cardinalità è | C | = 2k . La
cardinalità di C è quindi pari al numero totale delle differenti parole di lunghezza k. Ciò
è dovuto al fatto che se una base di C è B = {c1 , c2 , · · · , ck }, allora ogni parola c di C si
può esprimere mediante un’unica combinazione lineare degli elementi di B, cioè,
v = a1 c1 + a2 c2 + · · · + ak ck ;
(3.3)
ci sono al più 2k distinte possibili combinazioni lineari del tipo (3.3).
Sia G una matrice generatrice di un codice C di lunghezza n e dimensione k, allora essa
sarà una matrice k × n.
Una generica parola v di C si può ottenere dal seguente prodotto riga per colonna:


 c1 


 c2 


v = u · G = (a1 , a2 , · · · , ak ) · 
;
 . 




ck
dove u = (a1 , a2 , · · · , ak ) è una parola su K di lunghezza k (dimensione di C). La parola
v di C adesso può essere individuata mediante la parola di lunghezza k (a1 , a2 , · · · , ak )G
rispetto alla matrice G.
3.4
Matrice di parità
Se C è un codice lineare, come precedentemente detto, anche il suo codice duale C ⊥ è un
codice lineare. In questa sessione si determina la matrice generatrice del codice duale di
un codice lineare C, in particolare si chiama matrice di parità la trasposta della matrice
generatrice del codice duale.
54
3.4 Matrice di parità
3.4.1
Algoritmo di generazione di H
La matrice di parità è indicata con il simbolo H ed essa è individuata dal codice lineare
C, di parametri (n, k, d), mediante il seguente algoritmo.
Algoritmo
1. Sia S è un insieme di generatori del codice C e A la matrice ottenuta ponendo per
riga tutti gli elementi di S.
2. Si riduce totalmente la matrice A, si ottiene la matrice:

A0 = 

G
,
0
dove G è una matrice generatrice di C, k × n e 0 le righe nulle ottenute dopo la
riduzione totale di A.
3. Sia X la matrice k × (n − k) ottenuta dalla matrice G eliminando tutte le colonne
in cui sono presenti dei 1-leading.
4. Si costruisce la matrice H (n × (n − k)) nel modo seguente:
• Nelle righe di H corrispondenti alle colonne 1-leading di G, si posizionano, in
sequenza, le righe di X. Le righe posizionate sono k.
• Nelle rimanenti n−k righe di H si posizionano in sequenza le righe della matrice
identità I(n−k) .
5. Fine.
2
Teorema 14 La matrice di parità determinata dall’algoritmo precedente è la trasposta
della matrice generatrice del codice duale corrispondente al codice lineare C di parametri
(n, k, d).
55
3.4 Matrice di parità
Dim.
La matrice H è una matrice (n × (n − k)). Per provare il teorema basta mostrare che
il prodotto riga per colonna tra le matrici G e H è uguale ad una matrice nulla del tipo
(k × (n − k)). Senza ledere la generalità della dimostrazione a meno di una permutazione
delle colonne di G e delle righe di H si ha che è possibile scrivere G0 = [Ik , X] e H 0 =


X

. Il prodotto riga per colonna delle due matrici è:
I(n−k)
h
G0 · H 0 =
i
Ik X



X
 = X + X = 0;
(3.4)
In−k
ciò prova il teorema e la correttezza dell’algoritmo, inoltre si ha che:
H T = GC ⊥ .
2
Esempio 6
Sia un codice C generato dalle parole S = {11101, 10110, 01011, 11010}, determiniamo per
C la matrice generatrice e la matrice di parità. Riduciamo totalmente la matrice:

AV I
{R2 ⇒ R2 + R1

 1 1 1

 1 0 1

=
 0 1 0


1 1 0
R4 ⇒ R4 + R1 } ;
56
0 1 

1 0 

;
1 1 


1 0
3.4 Matrice di parità

AV
 1 1

 0 1

=
 0 1


0 0

1 0 1 

0 1 1 

;
0 1 1 


1 1 1
{R3 ⇒ R3 + R2 } ;


AIV
 1 1 1

 0 1 0

=
 0 0 0


0 0 1
0 1 

1 1 

;
0 0 


1 1
{R3 ⇔ R4 } ;

AIII

 1 1 1

 0 1 0

=
 0 0 1


0 0 0
{R1 ⇒ R1 + R2 } ;
57
0 1 

1 1 

;
1 1 


0 0
3.4 Matrice di parità

AII
 1 0

 0 1

=
 0 0


0 0

1 1 0 

0 1 1 

;
1 1 1 


0 0 0
{R1 ⇒ R1 + R3 } ;


AI
 1 0 0

 0 1 0

=
 0 0 1


0 0 0
0 1 

1 1 

.
1 1 


0 0
La matrice AI è totalmente ridotta e da essa si ricava la matrice G in cui sono presenti 3
colonne leading e quindi C ha dimensione k = 3.


 1 0 0 0 1

G =
 0 1 0 1 1

0 0 1 1 1


.


Da G eliminando le 3 leading colonne si ottiene la matrice X.
58
3.4 Matrice di parità


 0 1 



X =
 1 1 .


1 1
Consideriamo adesso la matrice identità In−k = I2 , posizioniamo le righe di X nelle righe
corrispondenti alle posizioni delle 1-leading colonne di G cioè nella 1a , 2a e 3a riga e nelle
rimanenti 4◦ e 5◦ riga poniamo le righe di I2 . Si ottiene la matrice la matrice di parità H.


0 1




 1 1 





H =
 1 1 .




 1 0 


0 1
Per ottenere la matrice generatrice del codice duale basta fare la trasposta di H, ovvero:

HT
=

0 1 1 1 0
1 1 1 0 1
59
=
h
i
XT
In−k
.
3.4 Matrice di parità
Esempio 7
Consideriamo un codice di lunghezza 8 generato dall’insieme di parole S = {(11111111),
(11110000), (11001100), (10101010)} Determiniamo la matrice generatrice G e la matrice
di parità H.
Riduciamo totalmente la matrice:

AV I
{R2 ⇒ R1 + R2
 1 1

 1 1

=
 1 1


1 0
R3 ⇒ R3 + R1

1 1 1 1 1 1 

1 1 0 0 0 0 

;
0 0 1 1 0 0 


1 0 1 0 1 0
R4 ⇒ R4 + R1 } ;


AV
 1 1 1

 0 0 0

=
 0 0 1


0 1 0
1 1 1 1 1 

0 1 1 1 1 

;
1 0 0 1 1 


1 0 1 0 1
{R2 ⇔ R4 } ;

AIV
 1 1

 0 1

=
 0 0


0 0

1 1 1 1 1 1 

0 1 0 1 0 1 

;
1 1 0 0 1 1 


0 0 1 1 1 1
60
3.4 Matrice di parità
{R1 ⇒ R1 + R2 } ;

AIII
 1 0

 0 1

=
 0 0


0 0

1 0 1 0 1 0 

0 1 0 1 0 1 

;
1 1 0 0 1 1 


0 0 1 1 1 1
{R1 ⇒ R1 + R3 } ;


AII
 1 0 0

 0 1 0

=
 0 0 1


0 0 0
1 1 0 0 1 

1 0 1 0 1 

;
1 0 0 1 1 


0 1 1 1 1
{R1 ⇒ R1 + R4 } ;

AI

 1 0 0

 0 1 0

=
 0 0 1


0 0 0
1 0 1 1 0 

1 0 1 0 1 

.
1 0 0 1 1 


0 1 1 1 1
61
3.4 Matrice di parità
La matrice AI è totalmente ridotta. Da essa si determina la matrice G.


 1 0 0

 0 1 0

=

G
 0 0 1


0 0 0
1 0 1 1 0 

1 0 1 0 1 

.
1 0 0 1 1 


0 1 1 1 1
Costruiamo la matrice X eliminando le 4 colonne leading. La dimensione di C è k = 4.

 1 1

 1 1

=

X
 1 0


0 1

1 0 

0 1 

.
1 1 


1 1
Consideriamo la matrice identità In−k = I4 e aggiungiamo i suoi elementi nella righe
corrispondenti alle colonne di G non eliminate.
62
3.4 Matrice di parità












H =










1 1 1 0
1 1 0 1
1 0 1 1
1 0 0 0
0 1 1 1
0 1 0 0
0 0 1 0










.










0 0 0 1
La matrice generatrice del codice duale di C è H T le cui n − k = 4 righe formano una base
per C ⊥ .
Nella dimostrazione del teorema 14 tramite una permutazione delle colonne si trasforma
la matrice generatrice ridotta totalmente in una matrice del tipo G0 = [I, X]. Ci si pone
la domanda se per un qualunque codice C, di parametri (n, k, d), è sempre possibile determinare una matrice del tipo G0 senza effettuare permutazioni delle sue colonne. Esistono
codici che non possono avere matrici generatrici poste nella forma assunta dalla matrice
G0 , tale affermazione è giustificata dall’esempio seguente.
Esempio 8
Sia il codice lineare C avente base B = {001, 100}. Tutte le sue possibili matrici generatrici
sono:

G=

1 0 0
0 0 1

; G0 = 

1 0 1

; G00 = 
0 0 1

1 0 1
1 0 0
63

; G000 = 

0 0 1
1 0 1
;
3.4 Matrice di parità

GIV = 

1 0 0
.
1 0 1
Nessuna di tale matrice ha la forma G = [I, X].
Se un codice C, di dimensione k, possiede una matrice generatrice che assume la forma
h
i
G = Ik X allora esso si chamerà sistematico e una sua qualunque parola v si può
esprimere nel modo seguente:
h
v =u·
i
h
=
I X
i
u uX
(3.5)
.
I primi k bits di v, (cioè u), sono chiamati bits di ricezione , gli ultimi n − k bits (cioè
(uX)) bits di parità o di controllo.
I codici che non sono sistematici possono essere riconducibili a codici sistematici mediante
una o più permutazioni delle colonne di una delle matrici G. Ad esempio:

G=


1 0 0

⇒
G=
0 0 1

1 0 0
.
0 1 0
Il codice sistematico ottenuto è detto equivalente al codice che lo ha generato in quanto
esso mantiene la stessa dimensione, distanza e lunghezza.
64
3.4 Matrice di parità
La matrice di parità di un codice lineare C permette di “controllare” se una parola w
ricevuta è una parola del codice utilizzato, infatti se w ∈ C essa non può appartenere a
C ⊥.
Teorema 15 Condizione necessaria e sufficiente affinchè w ∈ C è che w · H = 0.
Dim.
Se c1 , c2 , · · · , cn−k sono parole che individuano una base di C ⊥ e t ci è la parola trasposta
di ci , per 1 ≤ i ≤ n − k, allora la matrice H si può scrivere nel seguente modo:
h
H =
i
tc ,
1
tc ,
2
··· ,
tc
n−k
.
Se w ∈ C poichè w · ci = 0 per qualunque ci con 1 ≤ i ≤ n − k, allora si ha:
w · H = 0,
e il teorema è provato.
2
Un’altro importante risultato che lega la distanza con le righe della matrice di parità è
dato dal seguente teorema.
Teorema 16 Sia C un codice lineare e H la sua matrice di parità. Allora C ha distanza d
se e solo se, comunque si considerino d − 1 righe di H, esse sono linearmente indipendenti
ed esistono almeno d righe di H linearmente dipendenti.
Dim.
Sia d la distanza del codice lineare C, ciò vuol dire che esiste una parola v ∈ C tale che
wt(v) = d. Inoltre si ha v · H = 0 si ha quindi che le d righe di H corrispondenti alle
65
3.5 Coset
posizioni delle componenti di v in cui sono presenti bits di valore “1” sono linearmente
dipendenti.
Consideriamo adesso un’arbitraria parola w con wt(w) ≤ d−1 (con peso minore di d) allora
si ha che w · H 6= 0 perchè w ∈
/ C, ne segue quindi che comunque si scelgono d − 1 righe
di H esse saranno sempre linearmente indipendenti e il teorema è provato. Il viceversa è
2
banalmente dimostrabile.
3.5
Coset
In questa sessione è presentato un sottoinsieme di K n che si lega al concetto presente in
algebra di “laterale” o “coset” (termine inglese). Il laterale nella seguente trattazione è
presentato come strumento di teoria dei codici.
Se C ⊂ K n è un codice lineare di lunghezza n e u una qualunque parola di K n che può
anche non appartenere a C, allora si definisce coset di C, determinato da u, l’insieme:
C + u = {v + u ∈ K n
∀v ∈ C} .
Tale insieme contiene lo stesso numero di parole del codice cioè 2k , in particolare se u è
una parola di C chiaramente si ha che C + u = C, in caso contrario esso sarà diverso da C,
ma non sarà un sottospazio di K n in quanto è evidente che non contiene la parola nulla.
Esempio 9
Sia il codice C = (000, 111) ⊂ K 3 e u = 101, l’insieme coset sarà C + u = {101, 010} Se
consideriamo u0 = 111: C + u0 = {111, 000}.
Si nota che per u0 ∈ C si ha: C+u0 = C. Sia u00 = 010 si ha che C+u00 = {010, 101} = C+u,
da ciò segue che ad ogni parola di K 3 non sempre corrispondono cosets differenti.
66
3.5 Coset
Il seguente teorema mostrerà le principali proprietà dei cosets legati ad un codice lineare
C.
Teorema 17 Sia C un codice lineare di parametri (n, k, d) e siano u e v due parole di
K n , allora valgono le seguenti otto proprietà:
1. Se u è nel coset C + v, allora C + u = C + v.
2. La parola u ∈ C + u.
3. Se u + v ∈ C allora u e v appartengono allo stesso coset.
4. Se u + v ∈
/ C, allora u e v appartengono a coset differenti.
5. Ogni parola di K n è contenuta in uno ed un solo coset.
6. Tutti i coset hanno la stessa cardinalità: |C + u| = |C|. Da ciò la cardinalità di un
coset è 2k .
7. Se C ha dimensione k ci sono esattamente 2n−k coset diversi di C, e ogni coset
contiene esattamente 2k parole.
8. C è un coset.
Dim.
Dimostriamo in sequenza le proprietà del teorema.
1. Se u ∈ C + v deve esistere una w ∈ C tale che u = w + v. Sia t ∈ C + v, allora esiste
un t0 ∈ C tale che t = t0 + v ed inoltre t = t0 + w + u. Poichè il codice è lineare si
ha che t0 + w ∈ C, segue che t ∈ C + u. Data l’arbitrarietà di t si ha che qualunque
parola di C + u essa appartiene anche a C + v e si ha che C + v ⊇ C + u.
Sia p una generica parola appartenente a C +u, allora esiste un p0 tale che p = p0 +u,
con p0 ∈ C, inoltre p = p0 + w + v, ma p0 + w ∈ C, essendo p0 e w parole del codice,
ne segue che p ∈ C + v e C + u ⊇ C + v, deve quindi essere C + u = C + v.
67
3.5 Coset
2. La dimostrazione è immediata perchè la parola nulla appartiene a C.
3. Se u + v ∈ C allora esiste una w ∈ C tale che w = u + v, ma poichè u = w + v, allora
si ha che u ∈ C + v e per la prima proprietà del teorema si ha che C + u = C + v.
4. Supponiamo per assurdo che u e v appartengono allo stesso coset C +w, ciò comporta
che esiste una parola t0 ∈ C tale che u = t0 + w e esiste una parola t00 ∈ C tale che
v = t00 + w, sommando si ha u + v = t0 + t00 + w + w = t0 + t00 , ma C è lineare, quindi
t0 + t00 ∈ C e conseguentemente u + v ∈ C il che è assurdo.
5. Supponiamo per assurdo che esiste una parola w che appartiene a due cosets C + u
e C + v con C + u 6= C + v. Ciò comporta che w ∈ C + u e per la prima proprietà
w ∈ C + u = C + w, ma anche w ∈ C + v = C + w da ciò C + u = C + v il che è
assurdo.
Tale proprietà mostra che cosets distinti sono disgiunti.
6. La dimostrazione è immediata.
7. Le parole totali di K n sono 2n mentre le parole di C sono 2k . Da ciò il numero di
2n
coset sarà k = 2n−k .
2
8. La dimostrazione è immediata.
2
Esempio 10
Sia dato un codice C = {0000, 1011, 0101, 1110}. Una sua matrice generatrice è

G =

1 0 1 1
.
0 1 0 1
Il codice C è individuato dai parametri (4, 2, 2), quindi il numero di coset è 2n−k = 4 e
sono:
68
3.5 Coset

 0 0

 1 0

C=
 0 1


1 1

0 0 

1 1 

.
0 1 


1 0
Per determinare il secondo coset consideriamo la parola u1 = 1000 in K 4 non appartenente
a C e aggiungiamo tale parola ogni parola di C.

 1 0

 0 0

u1 + C = 1000 + C = 
 1 1


0 1

0 0 

1 1 

.
0 1 


1 0
Consideriamo adesso un’altra parola, u2 = 0100, non appartenente a C o a C + u1 . Il terzo
coset sarà:

 0 1 0

 1 1 1

u2 + C = 0100 + C = 
 0 0 0


1 0 1

0 

1 

.
1 


0
Ripetendo lo stesso procedimento con la parola u3 = 0010, il quarto coset sarà:
69
3.5 Coset

 0 0

 1 0

u3 + C = 0010 + C = 
 0 1


1 1

1 0 

0 1 

.
1 1 


0 0
Dei quattro coset, l’unico che rappresenta un codice lineare è chiaramente il primo, essendo
C stesso.
Adesso sfruttando le proprietà dei cosets cerchiamo di individuare una tecnica utile alla
correzione di errori.
Consideriamo un codice lineare C e assumiamo che v sia la parola inviata e w la parola
ricevuta, l’errore associato è u = v + w, tale equazione è equivalente a u + w = v ∈ C. Per
la proprietà 3 del teorema 17 si ha che l’errore u e la parola ricevuta w appartengono a
uno stesso coset di C.
Poichè gli errori di minor peso sono quelli che hanno maggiore probabilità di verificarsi,
vediamo adesso come la tecnica MLD può essere utilizzata per un codice lineare C di cui
conosciamo i suoi coset.
Ricevuta la parola w, se w · H = 0 allora la parola ricevuta appartiene al codice. Se
w · H 6= 0 allora ad essa è legato un errore che appartiene allo stesso coset cui appartiene
w. Tra tutte le parole appartenente al coset C + w si sceglie la parola u di peso minore,
cioè la più probabile, tale parola prende il nome di coset leader.
Sommando u a w si ottiene la parola v = w + u, essa è la parola che ha la maggiore
probabilità di essere stata inviata.
Esempio 11
I coset leaders corrispondenti ad ogni singolo coset dell’esempio 10 sono:
70
3.6 Sindrome
1. il coset leader di C è 0000;
2. il coset leader di C + u1 è 1000;
3. il coset leader di C + u2 è 0100;
4. il coset leader di C + u3 è 0010.
Se w = 1101 è la parola ricevuta si verifica facilmente che w ∈ C + u1 = C + 1000 e
tale coset ha coset leader la parola (1000). La correzione della parola w è v = w + u =
1101 + 1000 = 0101.
Può accadere che in un coset vi sono più parole con uguale peso minimo, in tal caso si può
adoperare la tecnica CMLD in cui si effettua una scelta tra le parole di peso minore e si
definisce un coset leader o la tecnica IMLD dove se w appartiene a un coset dove vi sono
più di una parola di minore peso allora si richiede la ritrasmissione.
È importante sottolineare che per la prima volta si è riusciti a determinare l’errore u
soltanto tramite la conoscenza della parola trasmessa w e tramite esso si può effettuare la
correzione.
Il procedimento di correzione appena descritto, nel caso in cui il numero degli elementi di
un codice C è elevato, può comportare notevoli problemi di immagazzinamento dati.
3.6
Sindrome
Proprio per ovviare ai problemi di immagazzinamento dati legati alla tecnica di correzione di errore precedentemente illustrata in questa sessione viene introdotto il concetto di
sindrome di una parola di K n .
Sia w ∈ K n , si definisce sindrome di w la parola s = w · H di K n−k .
71
3.6 Sindrome
Esempio 12
Consideriamo il codice presentato nell’esempio 10 e sia la parola w = 1101. La matrice H
di C è:


1
1




 0 1 


H=
.
 1 0 




0 1
La sindrome di w è:


 1 1 


 0 1 


s = w · H = 1101 
 = 11.
 1 0 




0 1
Quindi essendo s = w · H 6= 0 per il teorema 15 si ha che w ∈
/ C e w ∈ C + 1000.
Consideriamo una qualunque parola w0 del coset C+1000 è facile notare che la sua sindrome
sarà sempre la stessa cioè:


1
1




 0 1 


s = w0 · H = w0 
 = 11.
 1 0 




0 1
72
3.6 Sindrome
Il teorema seguente spiega i risultati ottenuti nell’ultima parte dell’esempio 12.
Teorema 18 Sia C un codice lineare di parametri (n, k, d). Siano u e w due parole di K n
e H la sua matrice di parità, allora valgono le seguenti proprietà:
1. w · H = 0 se e solo se w ∈ C.
2. u · H = w · H se e solo se w e u appartengono allo stesso coset.
3. Se u è l’errore di una parola ricevuta w allora u · H è la somma delle righe di H che
corrispondono alla posizione dei bits alterati in trasmissione.
Dim.
1. La proprieta è vera per il teorema 15.
2. Dalla relazione:
w · H = u · H,
si ha:
w · H + u · H = 0,
e quindi:
(w + u) · H = 0 ⇔ w + u ∈ C,
quindi w e u appartengono allo stesso coset.
3. Se u = w + v è l’errore legato a w allora è evidente che u · H individua le righe di H
in cui è avvenuto un cambiamento di carattere nei bits corrispondenti della parola
inviata.
2
73
3.6 Sindrome
Dato che parole dello stesso coset hanno la stessa sindrome, mentre parole di coset differenti hanno sindromi differenti, allora è possibile identificare un coset con la sua sindrome
corrispondente e a tale sindrome si può associare il coset leader corrispondente. Tale corrispondenza tra sindrome e coset leader permette di individuare una tabella, detta SDA (
Standard Decoding Array).
Se C è un codice lineare di lunghezza n e dimensione k, allora 2n−k parole di lunghezza
n − k saranno ognuna la sindrome di ogni singolo coset.
Nell’esempio seguente vedremo una tabella SDA in cui il coset leader di ogni singolo coset
viene posto come prima componente di ogni singola riga, mentre la sindrome corrispondente
è posta come seconda componente della riga. Nel caso in cui più parole hanno stesso minor
peso all’interno di un coset, allora, in tale esempio, è utilizzata la tecnica CMLD.
Esempio 13
Coset leaders
Sindrome u·H
0000
00
1000
11
0100
01
0010
10
Riferendoci all’esempio 10 in cui abbiamo calcolato i coset del codice: C = {0000, 1011,
0101, 1110} si è costruita la tabella SDA.
Se w = 0101 allora w ·H = 00 che è la sindrome di 0000. Da ciò v = w +u = 0101+0000 =
0101. Se w = 1100 allora w · H = 10 che è la sindrome di 0010. Da ciò v = w + u =
1100 + 0010 = 1110.
74
Capitolo 4
Codici perfetti
4.1
Cardinalità di un codice C
In questa sessione sono presentate le relazioni esistenti tra i parametri che caratterizzano un
codice C, cioè lunghezza, distanza e dimensione, e il numero di parole presenti nel codice.
Inoltre sono presentati particolari codici che in seguito assumeranno notevole importanza.
Facciamo prima alcune considerazioni legate alla distanza tra parole differenti di K n e la
distanza d di un codice C.
Sia v una parola di K n , consideriamo il numero di differenti t-uple (t < n) di bits distinte
prese all’interno di v. Tramite il calcolo combinatorio si ha che tale numero di t-uple è
uguale a:



n
t
=
n!
n(n − 1) · · · (n − t + 1)
=
.
t!(n − t)!
t!
(4.1)
Ci si pone la seguente domanda: qual’è il numero di parole di K n che hanno distanza 1 da
v?
75
4.1 Cardinalità di un codice C
Il problema si può anche porre nel seguente modo: determinare il numero di parole di
K n che differiscono da v soltanto per un bit. Chiaramente il numero di tali parole è


n
. In generale determinare il numero di parole di K n che hanno distanza t, con
n=
1
t < n, da v è equivalente a determinare il numero di tutte le possibili t-uple distinte di bits
presenti in v, infatti se si individuano arbitrariamente in v t bits e si cambiano i valori di
tali bits da “0” a “1” o da “1” a “0”, si ottiene una nuova parola che ha distanza t da v. Il


n
.
numero di parole che hanno distanza t da v è esattamente 
t
Esempio 1
Sia v = 101110101 una parola di K 9 . Il numero di parole che hanno distanza 1 in K 9 da v
 
 
9
9
9·8
è   = 9; Il numero di parole che hanno distanza 2 in K 9 da v è   =
= 36;
2
1
2
 
9
9·8·7
Il numero di parole che hanno distanza 3 in K 9 da v è   =
= 84.
3·2
3


Da quanto detto precedentemente e ricordando che 
n
 = 1 si ha il seguente teorema.
0
Teorema 19 Se 0 ≤ t ≤ n e v è una parola di lunghezza n, appartenente ad un codice C,
allora il numero di parole di lunghezza n e distanza al più t da v è:

N =

n
0

+

n

+
1

n
2

 + ··· + 

n
.
(4.2)
t
2
76
4.1 Cardinalità di un codice C
Il precedente teorema permette di determinare per ogni parola v di un codice C, avente
distanza d e lunghezza n, una “sfera” in K n di centro v e “raggio” t tale che al suo interno si
trovano esattamente N parole. Qui è usato il termine “sfera” per facilitare la comprensione
del lettore, ma se consideriamo le parole di K n come punti di uno spazio a n dimensioni
il concetto di “sfera” è molto più complesso e rientra nel campo della geometria finita che
esula da un corso di teoria dei codici.
Nel seguente teorema è mostrato che se la distanza di C è d = 2t + 1, allora le “sfere” che
hanno come centro le parole del codice e raggio t sono tutte disgiunte.
Teorema 20 Sia C un codice avente distanza d = 2t + 1 e lunghezza n, siano v e w
due distinte parole di C, allora non esiste alcuna parola c ∈ K n tale che d(v, c) ≤ t e
d(w, c) ≤ t.
Dim.
Supponiamo per assurdo che esista una c ∈ K n e due parole v, w ∈ C tali che d(v, c) ≤ t
e d(w, c) ≤ t, per la disuguaglianza triangolare si ha:
d(v, w) ≤ d(v, c) + d(c, w) ≤ t + t = 2t < 2t + 1 = d.
Si sono determinate due parole di C, v e w che hanno distanza minore della distanza di C
cioè d(v, w) < d, questo è assurdo.
2
Il risultato precedente permette di ottenere un limite superiore alla cardinalità | C | di un
codice, tale limite , è legato ai parametri n e d.
Teorema 21 (Limite di Hamming) Se C è un codice di lunghezza n e distanza d =
2t + 1 allora si ha che:
77
4.1 Cardinalità di un codice C

| C | · 

n


+
0
n


n
+
1


 + ··· + 
2
n
 ≤ 2n ,
(4.3)
 .
(4.4)
t
ovvero:
|C |≤ 


n

+
0
2n


n
+
1

n

 + ··· + 
n
2

t
Dim.
Se si considera un’arbitraria parola v ∈ C, per il teorema (19), le parole che distano al più
t da v sono:


N =
n

+
0

n

+
1

n

 + ··· + 
2

n
.
t
Inoltre, per il teorema 20, nessuna di tali parole ha distanza minore o uguale a t da una
qualsiasi altra parola presente in C. Il numero di parole distinte che hanno distanza minore
o uguale a t da ogni singola parola di C è:


| C | · 
n
0

+

n

+
1

n
 + ··· + 
2
Il numero di parole distinte in K n è 2n , si ha allora che:
78


n
t
 .
4.1 Cardinalità di un codice C

| C | · 

n


+
0
n


n
+
1


 + ··· + 
2
n
 ≤ 2n .
(4.5)
t
Il teorema è provato.
2
Esempio 2
Sia un codice C con n = 6 e d = 3, quindi essendo d = 2t + 1 si ha che t = 1. Per il
teorema di Hamming si ha:
|C| ≤ 


n
0
2n
=

+
n
26
= 9.
1+6
(4.6)

1
Poichè 9 non è una potenza del due e tutti i codici binari devono avere una cardinalità pari
ad una potenza di 2, allora | C | ≤ 8. Questo significa che in un codice C avente distanza
d = 3 e lunghezza n = 6 al massimo vi sono otto parole.
Il teorema seguente mette in relazione le grandezze (n, k, d) che caratterizzano un codice
lineare.
Teorema 22 (Limite di Singleton) Per un codice lineare (n,k,d) si ha che d−1 ≤ n−k.
Dim.
La matrice di parità H di un codice lineare C è definita come:
79
4.1 Cardinalità di un codice C


H =
X
.
In−k
In essa non vi possono essere più di n − k righe linearmente indipendenti, data la presenza
di In−k , le cui righe costituiscono una base per K n−k . Per il teorema 16 del capitolo 3,
si ha che in H comunque si scelgono arbitrariamente d − 1 righe esse sono linearmente
indipendenti, quindi segue che:
d − 1 ≤ n − k,
e il teorema è provato.
(4.7)
2
Poniamoci adesso il seguente problema, dati i parametri (n, k, d) vediamo se è possibile
determinare un codice lineare C le cui parole hanno lunghezza n, la sua dimensione è k e
la sua distanza è d.
Un codice lineare può essere individuato mediante la sua matrice di parità, cioè mediante
una matrice H (n × (n − k)), essa ha la caratteristica di avere almeno d righe linearmente
dipendenti e comunque si scelgono d − 1 sue righe esse sono linearmente indipendenti.
Se si riesce a determinare una tale matrice H, dato che essa è la matrice trasposta della
matrice generatrice del codice duale GC⊥ =t H, da essa, mediante l’algoritmo presentato
nel capitolo 3, si può determinare la matrice di parità HC⊥ del codice duale che individua
una matrice generatrice G =t HC⊥ (n × (n − k)) del codice C avente parametri (n, k, d).
Nel seguente esempio è mostrato un metodo utile a determinare la matrice di parità di un
codice lineare avente parametri (n, k, d), tale tecnica in seguito permetterà di formulare il
80
4.1 Cardinalità di un codice C
Figura 4.1:
teorema di Gilbert - Varshamov.
Esempio 3
Vediamo se è possibile determinare un codice lineare C di parametri (15, 6, 5). Individuiamo
la sua matrice di parità H (15 × 9). Essa può contenere la matrice I9 , costituita da righe
linearmente indipendenti. Bisogna determinare altre sei righe di K 9 in modo tale che vi
siano almeno 5 righe linearmente dipendenti e comunque si scelgono in essa 4 righe esse
devono essere linearmente indipendenti.
Cerchiamo di individuare la decima riga da aggiungere alle righe di I9 , iniziamo con escludere la parola nulla di K 9 , in quanto essa stessa è linearmente dipendente, inoltre è necessario
escludere qualsiasi parola contenuta in I9 e tutte le parole di K 9 ottenute da combinazioni
lineari di due o tre righe di I9 , quindi è possibile aggiungere una decima riga se il numero totale delle parole in K 9 , cioè 29 , è strettamente maggiore del numero di parole che
necessariamente devono essere escluse. Quindi deve valere la seguente disuguaglianza.



9
0

+

9
1

+

9
2
81

+

9
3
 < 29 .
4.1 Cardinalità di un codice C
La disuguaglianza è valida in quanto 1 + 9 + 36 + 84 < 29 , quindi è possibile aggiungere
una decima riga. Sia essa la riga 111100000 che formerà la matrice,

H10 = 

I9
.
111100000
È importante notare come la matrice H10 ha già d = 5 righe linearmente dipendenti, cioè la
prima, la seconda, la terza, la quarta e la decima. Determiniamo adesso H11 aggiungendo
a H10 un’undicesima riga mantenendo le proprietà richieste precedentemente, cioè in H11
non possono esistere 4 righe linearmente dipendenti. La seguente disuguaglianza, ottenuta
dalle precedenti considerazioni,



10
0

+

10

+
1

10

+
2

10
 < 29 ,
3
è ancora valida e quindi aggiungiamo la riga 100011100, otteniamo la matrice H11 . Iterando
questa procedura otteniamo la matrice di parità di C di parametri (15, 6, 5).

H10









=









I9
111100000
101000011
100011100
110000011
000101110
000001111
82









.








4.1 Cardinalità di un codice C
Teorema 23 (Limite di Gilbert-Varshamov) Un codice lineare C con parametri (n, k, d)
esiste se:



n−1

+

n−1
0

 + ··· + 
1

n−1
 < 2n−k .
d−2
Dim.
Il codice C si può determinare mediante la sua matrice di parità H, cioè una matrice
(n × (n − k)). Supponiamo di aver determinato una matrice Hi , dove il primo valore che i
può assumere è n−k cioè Hn−k = In−k . In generale consideriamo un i, con n−k ≤ i ≤ n−1,
Hi deve avere la proprietà che comunque si prendono in essa d − 1 righe esse devono
essere linearmente indipendenti. Cerchiamo di determinare una matrice del tipo Hi+1
aggiungendo una riga a Hi . Tale riga deve essere scelta in K n−k e deve essere differente
dalla parola nulla, è necessario poi escludere in K n−k tutte le parole che sono righe in Hi
e tutte le parole che risultano combinazione lineare di j righe di Hi con 2 ≤ j ≤ d − 2. Il
numero delle righe che non possono essere aggiunte in Hi e che appartengono a K n−k è
dato da:

Ni = 

i
0

+

i

+
1

i
2

 + ··· + 

i
.
d−2
Se Ni < 2n−k allora sarà possibile determinare una matrice Hi+1 . Se i + 1 < n, allora
ripetiamo quanto fatto precedentemente per Hi in modo da poter aggiungere una nuova
riga a Hi+1 e formare una matrice Hi+2 . Si ha che Ni+1 è uguale a:
83
4.2 Codici MDS

Ni+1 = 

i+1


+
i+1
0


+
i+1
1


 + ··· + 
2
i+1
.
d−2
Ancora una volta se Ni+1 < 2n−k allora sarà possibile determinare la matrice Hi+2 . È
importante notare che la disuguaglianza Ni < Ni+1 è valida. Il procedimento descritto, se
possibile, si può iterare fino a che i = n − 1, in tal caso se è anche valida la diseguaglianza
seguente,

Nn = 

n−1

+

n−1
0
1

+

n−1
2

 + ··· + 

n−1
 < 2n−k ,
(4.8)
d−2
allora sarà possibile determinare la matrice H di C. Inoltre poichè in generale vale sempre
la disuguaglianza Ni < Ni+1 per n − k ≤ i ≤ n − 1, è possibile determinare la matrice di
parità H di C solo se è verificata la disuguaglianza (4.8) e il teorema è provato.
4.2
2
Codici MDS
La diseguaglianza (4.7) mette in relazione tutti i parametri che caratterizzano un codice
C. Se tale diseguaglianza, per un codice lineare C, vale come eguaglianza, allora essa
caratterizza un insieme di codici in cui, fissati n e k, si ha che la loro distanza può assumere
il suo valore massimo cioè d = n − k + 1. Tali codici prendono il nome di codici MDS
dall’inglese “Maximum Distance Separable”.
84
4.2 Codici MDS
I codici MDS assumono una notevole importanza in quanto a tutt’oggi sono ampiamente
utilizzati nella lettura dati (lettori CD o DVD), tra i più importanti si ricordano i codici
Reed-Solomon che si rimandano ad un corso di teoria dei codici più avanzato.
Il teorema seguente identifica una serie di proprietà che caratterizzano i codici MDS e che
sono tra esse equivalenti.
Teorema 24 Per ogni codice lineare C (n, k, d) le seguenti proposizioni sono equivalenti:
1. d = n − k + 1
2. Comunque si scelgano n − k righe di H esse sono linearmente indipendenti.
3. Comunque si scelgano k colonne della matrice generatrice G, esse sono linearmente
indipendenti.
4. C è un MDS
Dim.
1. Se d = n − k + 1, dalla definizione, si ha che C è un codice MDS e vale il viceversa.
2. Supponiamo di avere una matrice di parità H avente la proprietà che comunque si
individuano in essa n − k righe esse sono linearmente indipendenti. Per il teorema 16
del capitolo 3, la matrice H ha la proprietà che comunque si scelgono d − 1 righe
esse sono linearmente indipendenti e ve ne sono d linearmente dipendenti, allora si
ha che n − k ≤ d − 1, ma per il teorema 22 anche la disuguaglianza d − 1 ≤ n − k è
valida, quindi deve essere d − 1 = n − k. È evidente che vale anche il viceversa.
3. Sia C un codice lineare MDS, allora si ha che n − d = k − 1. Se tale eguaglianza è
valida allora si ha che in ogni parola di C non possono esistere più di k−1 zeri. Infatti
una parola di minimo peso del codice ha esattamente n − k + 1 bits di valore “1” ed
esattamente k − 1 bits di valore “0”. Sia G la matrice generatrice di C, supponiamo
85
4.3 Codici estesi
per assurdo che esistano k colonne linearmente dipendenti. Se si estraggono tali
colonne, esse individuano una matrice quadrata A (k × k) le cui k colonne sono
linearmente dipendenti, per un teorema di algebra lineare, si ha che anche le k righe
di A sono linearmente dipendenti (dimensione dello spazio delle righe è uguale a
quello delle colonne). È possibile quindi determinare una parola u ∈ K k , diversa
dalla parola nulla, tale che u · A = 0 ∈ K k e segue anche che la parola del codice
u · G possiede k zeri, questo è un assurdo.
4. Se C è MDS allora banalmente valgono tutte le tre condizioni precedenti.
4.3
2
Codici estesi
Consideriamo un codice lineare C di parametri (n, k, d) e ad ogni parola di C si aggiunge
il bit di parità, cioè si aggiunge un bit in modo tale che ogni sua singola parola abbia peso
pari. Il codice così ottenuto si denota con C ∗ , esso ha lunghezza n + 1 ed è detto codice
esteso di C.
La matrice generatrice di un codice esteso si può rappresentare nel seguente modo G∗ =
[G, b], dove la sottomatrice G è la matrice generatrice di C e b è un vettore colonna, con
k componenti ciascuno dei quali assume valore “1” se il numero di bits di valore “1” della
parola corrispondente in G è dispari e valore “0” in caso contrario.
La matrice di parità H ∗ del codice esteso C ∗ può essere costruita tramite la matrice G∗
mediante il noto algoritmo oppure in modo più semplice dalla matrice di parità H del
codice originario C. La matrice di parità di C ∗ sarà:

H∗ = 

H J
0
86
1
,
(4.9)
4.3 Codici estesi
dove J è un vettore colonna formato da bits che assumono tutti valore “1”. Per provare
che tale matrice è effettivamente la matrice di parità di C ∗ basta provare che il prodotto
riga per colonna è G∗ · H ∗ = 0.
G∗ · H ∗ =
h
i
G, b

·

H J
0
1
=
h
i
GH, GJ + b
,
il prodotto G · H = 0, essendo G e H le matrici generatrice e di parità del codice C.
Consideriamo adesso il temine GJ + b, osserviamo che se ri è la riga i-esima della matrice
G allora si ha che:

 1 se ri contiene un numero dispari di bits di valore “1”;
ri · J =
 0
se ri contiene un numero pari di bits di valore “1”.
Se indichiamo con bi la componente i-esima del vettore b, essa assumerà il valore:

 1 se ri · J = 1;
bi =
 0 se r · J = 0.
i
Si ha dunque che GJ + b = 0 e quindi H ∗ è la matrice di parità di C ∗ .
87
4.4 Codici perfetti
Esempio 4
Consideriamo un codice lineare C avente matrici generatrice e di parità:





 0 1 





H = 1 1 
.




 1 0 


0 1


 1 0 0 1 0

G =
 0 1 0 0 1

0 0 1 1 1

1 0


,


Definiamo le matrici G∗ e H ∗ del codice esteso di C aggiungendo il bit di parità ad ogni
riga di G e utilizzando la (4.9).




G∗
4.4
 1 0 0 1 0 0 



=
 0 1 0 0 1 0 ,


0 0 1 1 1 1
H∗
1 0 1




 0 1 1 





= 1 1 1 
.




 1 0 1 


0 0 1
Codici perfetti
Un codice C di lunghezza n e distanza d = 2t + 1 si dice perfetto se si ha che:
|C |= 


n
0


+
n
2n

+

n
2
1
88
 .

 + ··· + 
n
t

(4.10)
4.4 Codici perfetti
Poichè la cardinalità di un codice binario deve essere uguale ad una potenza di 2 allora è
immediata la seguente condizione necessaria.
Teorema 25 Condizione necessaria per l’esistenza di un codice perfetto è che:



n

+

n
0

+
1

n

 + .... + 
2

n
,
t
sia potenza di 2.
Due codici perfetti che sono detti banali sono il codice C = {(000...000), (111...111)}, le
cui parole appartengono a K n e il codice C = K n .
Esempio 5
• Verifichiamo che il codice con n = 7 e d = 3 è perfetto.
d = 2t + 1 = 3 ⇒ t = 1 e quindi si ha che:
|C| = 


7
27
=

+
0
7
1
89

27
= 24 = 16.
23
4.4 Codici perfetti
Il codice C è perfetto.
• Verifichiamo che il codice con n = 23 e d = 7 sia un codice perfetto. Se d = 2t+1 = 7,
allora segue che t = 3 e si ha:
|C| = 


23
0
223
 

+
23
1
+

23
 =

+
2
23
223
= 212 = 4096.
211

3
Il secondo codice dell’esempio individua un codice che in seguito sarà trattato in dettaglio,
ma come codice esteso.
Il seguente teorema fu provato da Van Lint nel 1963 e da’ precise indicazioni sullo spettro
di esistenza, legato al parametro n, dei codici perfetti. In questi appunti è omessa la
dimostrazione.
Teorema 26 (Van Lint) Se C è un codice perfetto non banale di lunghezza n e distanza
d = 2t + 1, allora o n = 23 e d = 7, oppure n = 2r − 1 (per r ≥ 2) e d = 3.
2
Teorema 27 Se C è un codice perfetto di lunghezza n e distanza d = 2t + 1, allora C
corregge tutti gli errori di peso minore o uguale a t.
90
2
4.4 Codici perfetti
4.4.1
Codice di Hamming
Un codice lineare di lunghezza n = 2r − 1, con r ≥ 2, avente una matrice di parità H le
cui righe hanno lunghezza r è detto codice di Hamming.
In un codice di Hamming la matrice H è del tipo ((2r − 1) × r). Se consideriamo che le
parole distinte di lunghezza r sono 2r , allora, se si esclude la parola nulla, si ha che tutte
le altre parole di lunghezza r sono tutte presenti nelle righe di H, quindi comunque si
considerano due distinte righe di H esse sono linearmente indipendenti, inoltre in H sono
presenti le righe 10000 · · · 000, 01000 · · · 000 e 11000 · · · 000, di lunghezza r, è chiaro che
esse sono linearmente dipendenti, segue che i codici di Hamming hanno distanza d = 3 e
per il teorema 26 essi sono dei codici perfetti.
Esempio 6
La matrice di parità di un codice di Hamming con r = 3 (n = 2r − 1 = 7) è:

 1 1

 1 1



 1 0


 0 1


 1 0


 0 1


0 0
La sua matrice generatrice è:
91

1 

0 



1 


1 .


0 


0 


1
4.4 Codici perfetti

0 0 1 1 1 

0 0 1 1 0 

.
1 0 1 0 1 


0 1 0 1 1

 1 0

 0 1

G =
 0 0


0 0
Dato l’intero positivo r e il suo codice di Hamming corrispondente C sappiamo che la
relazione tra le dimensioni di C e il suo codice duale C ⊥ è:
dimC + dimC ⊥ = n,
Poichè dimC ⊥ = r ed inoltre n = 2r − 1, allora si ha che:
k = dimC = 2r − 1 − r.
La cardinalità del codice di Hamming C è:
| C | = 2k = 22
r −1−r
Gli stessi risultati precedentemente ottenuti si possono ricavare considerando che C è un
codice perfetto con d = 2t + 1 = 3 e t = 1 allora si ha che:
|C |= 


n
0
2n
r
 =

+
n

1
92
22 −1
r
= 22 −1−r .
r
1+2 −1
4.4 Codici perfetti
Sia un codice di Hamming C di lunghezza n = 2r − 1, se si considera una parola v di K n
di peso uno, essa certamente non appartiene a C, poichè d = 3, e la si somma ad un’altra
parola w distinta di peso uno, allora si ottiene una parola di peso due che non appartiene
a C, quindi v e w sono due parole che appartengono a coset differenti. Il numero di coset
di C è pari a 2r , quindi le 2r − 1 parole di lunghezza n = 2r − 1 e peso uno più la parola
nulla formano i coset leaders di un codice di Hamming C.
In generale un codice di Hamming ha la seguente tabella SDA:
COSET LEADER u
SINDROME u · H
0000 · · · 0000
00 · · · 00
I2r −1
H
Esempio 7
La tabella SDA del codice di Hamming dell’esempio 6 è qui sotto rappresentata.
COSET LEADER u
SINDROME u · H
0000000
000
1000000
111
0100000
110
0010000
101
0001000
011
0000100
100
0000010
010
0000001
001
93
4.4 Codici perfetti
4.4.2
Codice di Golay esteso
In questa sessione è presentato il codice perfetto esteso avente come parametri
(24, 12, 8), esso è generato dal codice perfetto di parametri (23, 11, 7) e si chiama
codice di Golay esteso .
Il codice di Golay ha una notevole importanza perchè è stato ampiamente utilizzato
dall’ente spaziale NASA negli anni ’80 soprattutto nelle trasmissioni delle sonde
Voyager.
Per definire tale codice è necessario costruire la matrice B1 di tipo (11 × 11) ottenuta dalla riga di 11 caratteri 11011100010, le successive righe di B1 sono ottenute
mediante lo spostamento (“shift”) del primo bit nell’ultima posizione.

B1















=
















1 1 0 1 1 1 0 0 0 1 0
1 0 1 1 1 0 0 0 1 0 1
0 1 1 1 0 0 0 1 0 1 1
1 1 1 0 0 0 1 0 1 1 0
1 1 0 0 0 1 0 1 1 0 1
1 0 0 0 1 0 1 1 0 1 1
0 0 0 1 0 1 1 0 1 1 1
0 0 1 0 1 1 0 1 1 1 0
0 1 0 1 1 0 1 1 1 0 0
1 0 1 1 0 1 1 1 0 0 0































(4.11)
0 1 1 0 1 1 1 0 0 0 1
Consideriamo adesso un’estensione B (12 × 12) della matrice B1 nel seguente modo:
94
4.4 Codici perfetti


B=
B1
JT













 


J
=


0
















1 1 0 1 1 1 0 0 0 1 0 1
1 0 1 1 1 0 0 0 1 0 1 1
0 1 1 1 0 0 0 1 0 1 1 1
1 1 1 0 0 0 1 0 1 1 0 1
1 1 0 0 0 1 0 1 1 0 1 1
1 0 0 0 1 0 1 1 0 1 1 1
0 0 0 1 0 1 1 0 1 1 1 1
0 0 1 0 1 1 0 1 1 1 0 1
0 1 0 1 1 0 1 1 1 0 0 1
1 0 1 1 0 1 1 1 0 0 0 1
0 1 1 0 1 1 1 0 0 0 1 1

















.
















(4.12)
1 1 1 1 1 1 1 1 1 1 1 0
Definiamo inoltre la matrice generatrice del codice di Golay esteso:
h
G=
i
I12 , B
,
Il codice di Golay esteso gode delle proprietà che sono enunciate nel seguente teorema.
Teorema 28 Un codice di Golay esteso C ha le seguenti proprietà:
1. Il codice C ha una lunghezza n = 24, dimensione k = 12 e | C | = 212 = 4096
parole.
95
4.4 Codici perfetti
2. La matrice B è una matrice simmetrica, cioè B T = B.
3. Due qualunque righe ri e rj di B sono tra loro ortogonali, cioè ri · rj = 0.


B
.
4. La matrice di parità di C è H = 
I

5. Esiste un’altra matrice di parità per C cioè H 0 = 

I
.
B
6. C è autoduale cioè C = C ⊥ .
7. La distanza di C è d = 8
8. Il codice C è un codice 3-correttore, cioè corregge tutti gli errori u tali che
wt(u) ≤ 3.
Dim.
Dimostriamo le proprietà del teorema in sequenza.
1. La dimostrazione è evidente osservando le caratteristiche della matrice generatrice.
2. La matrice B è evidentemente simmetrica, ciò è dovuto al metodo della sua
costruzione.
3. Per provare tale proprietà basta eseguire i prodotti ri · rj , con i 6= j e 1 ≤
i, j ≤ 12, e constatare la loro ortogonalità.
4. Per dimostrare che H è una matrice di parità si procede nel modo seguente:
h
G·H =
i
I, B



B
I
96
 = B + B = 0.
4.4 Codici perfetti
5. Per dimostrare che H 0 è una matrice di parità si procede nel modo seguente:
G · H0 =
i
h
I, B



I
 = I + BB T = I + I = 0.
B
6. Poichè H 0 = GT , allora il codice di Golay è un codice autoduale, cioè il suo
duale è esso stesso.
7. Consideriamo una parola v di C ottenuta dalla somma di due righe distinte
di G v = ri + rj con i 6= j. Poichè le due righe sono ortogonali, allora ri e rj
hanno un numero pari di bits “1” posti nelle stesse componenti, pertanto:
wt(v) = wt(ri ) + wt(rj ) − 2(2x) = wt(ri ) + wt(rj ) − 4x,
dove 2x è il numero pari di bits di valore “1” posti nelle stesse componenti di
ri e rj , inoltre tali righe hanno un peso uguale a 8 o 12, quindi il peso di v è
un multiplo di 4.
Consideriamo adesso la parola v 0 = v + rk , dove rk è un’altra qualunque riga
di G e v = ri + rj . Osserviamo che:
rk · v = (ri + rj ) · rk = rk · ri + rk · rj = 0 + 0 = 0,
quindi rk e v sono ortogonali, con analoghe considerazioni fatte in precedenza
si ha che:
wt(v 0 ) = wt(ri + rj ) + wt(rk ) − 4y,
dove 2y è il numero pari di bits di valore “1” presenti nelle stesse componenti
in v e rk . Una generica combinazione di righe di G permette di ottenere
97
4.4 Codici perfetti
una generica parola w di C e anch’essa, con analoghi ragionamenti fatti in
precedenza, ha un peso che è un multiplo di 4. Nella matrice G sono presenti
righe di peso 8 e 12, è necessario provare che non esistono parole di C di peso
4.
Supponiamo per assurdo che la parola w di C ha peso 4. Il codice C è
autoduale, allora ogni sua parola si può ottenere dalle due diverse matrici
h
i
h
i
generatrici di G = I, B e G0 = B, I cioè si ha:
h
w = u1
i
h
=
I, B
i
,
u1 , u 1 B
e
h
w = u2
i
B, I
h
=
i
u2 B, u2
.
Dato che wt(w) = 4, supponendo che wt(u1 ) ≥ 2 (cioè che i primi dodici bit
di w contengano due o più bit di valore 1), allora deve essere necessariamente
wt(u1 B) ≤ 2 che equivale a dire wt(u2 ) ≤ 2, ciò perchè w si può scrivere
sia mediante l’uso di G che di G0 ; nel caso contrario si ha che wt(u1 ) ≤ 2.
Facilmente si può calcolare che il peso della somma di due righe di B è maggiore
o uguale a quattro, allora si ha:
wt(w) = wt(ui ) + wt(ui B) ≥ 1 + 4 = 5,
dove il valore i può assumere il valore 1 o 2, ma ciò è assurdo in quanto
wt(w) = 4 e la proprietà è provata.
8. Tale proprietà è evidende essendo d = 8.
98
2
4.4 Codici perfetti
Abbiamo visto, dalla proprietà 8 del teorema precedente, che il codice di Golay
esteso è un codice 3-correttore, cioè corregge tutti gli errori di peso minore o uguale
a tre.
Ci si propone adesso di definire un algoritmo per la correzione di tali errori. Se w
è la parola ricevuta, e u l’errore utilizzato per la correzione si ha che wt(u) ≤ 3.
h
i
L’errore u può essere denotato mediante la seguente scrittura u = u1 , u2 , dove
u1 e u2 hanno lunghezza 12 (l (ui ) = 12 per i = 1 e 2). Poichè wt(u) ≤ 3, allora
deve essere wt(u1 ) ≤ 1 oppure wt(u2 ) ≤ 1. Indichiamo con s1 la sindrome di w, se


I
, allora si ha che:
si usa la matrice di parità H = 
B
h
s1 = w · H = u · H =
i
u1 , u 2


·
I
B
 = u1 + u2 B.
Consideriamo i seguenti due casi.
Primo caso
Se wt(u2 ) ≤ 1, cioè esso può assumere i valori 0 e 1.
• Se wt(u2 ) = 0 segue che u2 B = 0 e quindi risulta s1 = u1 + 0, con wt(u1 ) ≤ 3.
In questo caso l’errore è u = [s1 , 0]. È facile verificare che tale errore ha peso
minore o uguale a tre e ha sindrome uguale a w · H, quindi è un coset leader.
• Se wt(u2 ) = 1 segue che u2 B individua una riga bj di B e si ha s1 = u1 + bj e
conseguentemente si ha che u1 = s1 + bj .
Si cerca quindi di determinare una riga bj per cui si ha che wt(u1 ) = wt(s1 +
bj ) ≤ 2 ( ricordiamo che wt(u) ≤ 3), se tale bj esiste, allora l’errore è u =
[s1 + bj , ej ] ed esso ha la stessa sindrome di w infatti:
99
4.4 Codici perfetti
h
u·H =
i
s1 + bj , ej


·
I
B
 = s1 + bj + bj = s1
.
Secondo caso
Consideriamo
di parità

 adesso la sindrome di w usandola matrice

h
i
B
B
, allora s2 = w · H 0 = u1 , u2 · 
 = u1 B + u2 .
H0 = 
I
I
Se wt(u1 ) ≤ 1, allora wt(u1 ) può assumere i valori 0 e 1.
• Se wt(u1 ) = 0 segue che u1 B = 0 e quindi risulta s2 = 0 + u2 , con wt(u2 ) ≤ 3.
In questo caso l’errore è u = [0, s2 ]. Anche in questo caso si può verificare che
tale errore ha peso minore o uguale a tre e ha sindrome uguale a w · H 0 , esso
è quindi un coset leader.
• Se wt(u1 ) = 1 segue che u1 B individua una riga bi di B, quindi s2 = u2 + bi e
conseguentemente u2 = s2 + bi .
Si cerca quindi di determinare una riga bi per cui si ha che wt(u2 ) = wt(s2 +
bi ) ≤ 2, se tale bi esiste, allora l’errore è u = [ei , s1 · B + bi ], ed esso ha la
stessa sindrome di w infatti:
u · H0 =
i
h
ei , s1 · B + bi

·

B
I
 = bi + s2 + bi = s2 .
Da questa tecnica di decodifica è possibile determinare un algoritmo di decodifica
per il codice di Golay esteso.
100
4.4 Codici perfetti
Osserviamo che essendo B = B T , allora B 2 = B · B T = I ed è lecito scrivere:
s1 · B = (u1 + u2 B) · B = u1 B + u2 B 2 = u1 B + u2 = s2 .
(4.13)
Ciò significa che, calcolata la sindrome s1 si può facilmente determinare la sindrome
s2 .
Algoritmo di decodifica
1. Calcolo della sindrome s1 = w · H = u1 + u2 B.
h
2. Se wt(s1 ) ≤ 3 allora u =
i
s1 , 0
(caso in cui wt(u2 ) = 0).
h
3. Se wt(s1 + bj ) ≤ 2 per qualche riga bj di B, allora u =
i
s1 + bj , ej , dove
ej è la parola di lunghezza 12 con un bit di valore “1” nell’j-esima posizione,
tutti gli altri bits hanno valore “0”.
4. Calcolo della sindrome s2 = w · H 0 = s1 · B.
h
5. Se wt(s1 · B) ≤ 3 (caso in cui wt(u1 ) = 0), allora u =
i
0, s1 B .
i
h
6. Se wt(s1 B + bi ) ≤ 2 per qualche riga bi di B, allora u =
ei , s1 B + bi .
7. Se u non è determinato, allora si richiede la ritrasmissione.
8. Fine.
2
101
4.4 Codici perfetti
Esempio 8
Sia la parola ricevuta w = 101111101111, 010010010010. Calcoliamo la sindrome:

s = w·H = w

I
 = 101111101111 + 001111101110 = 100000000001,
B
osserviamo che wt(s) = 2 ≤ 3. Pertanto:
h
u=
i
s, 0
= 100000000001, 000000000000.
La parola che con maggiore probabilità è stata inviata è:
v = w + u = 001111101110, 010010010010.
Esempio 9
Sia la parola ricevuta w = 001001001101, 101000101000. Calcoliamo la sindrome:

s = w·H = w

I
 = 001001001101 + 111000000100 = 110001001001,
B
osserviamo che wt(s) = 5 > 3. Pertanto dal passo 3 dell’algoritmo di decodifica si ha:
s + b1 = 000110001100
⇒
wt(s + b1 ) = 4 > 3;
s + b2 = 011111000010
⇒
wt(s + b2 ) = 6 > 3;
s + b3 = 101101011110
⇒
wt(s + b3 ) = 8 > 3;
s + b4 = 001001100100
⇒
wt(s + b4 ) = 4 > 3;
s + b5 = 000000010010
⇒
wt(s + b5 ) = 2 < 3.
Quindi:
102
4.4 Codici perfetti
h
u=
i
s + b5 , e5
= 000000010010, 000010000000.
La parola che con maggiore probabilità è stata inviata è:
v = w + u = 001001011111, 101010101000.
103
Capitolo 5
Codici ciclici
5.1
Polinomi su K
In questo capitolo è mostrato come una parola di un codice C di lunghezza n può
essere rappresentata mediante polinomi di grado n − 1 su K, ma prima mostriamo
alcune proprietà dei polinomi a coefficienti in K, cioè dell’insieme K[x], i cui elementi
sono denotati con la simbologia f (x), g(x), p(x) ecc. ecc. Consideriamo un generico
polinomio di grado n di K[x].
f (x) = a0 + a1 x + a2 x2 + · · · + an−2 xn−2 + an−1 xn−1 + an xn .
In K[x] può essere considerata la classica operazione di somma tra polinomi. Poichè
in K si ha che 1 + 1 = 0, allora segue che xk + xk = 0, tutto ciò fa si che il grado
della somma di due polinomi f (x) + g(x) non ha sempre il massimo tra i gradi dei
polinomi f (x) e g(x).
104
5.1 Polinomi su K
Esempio 1
Siano i polinomi di K[x] f (x) = 1 + x + x4 e g(x) = x2 + x4 , si ha che:
f (x) + g(x) = 1 + x + x2 ,
è evidente che il polinomio somma ha grado 2 minore di 4 cioè il massimo grado dei polinomi
f (x) e g(x).
Siano adesso i polinomi l(x) = 1 + x2 + x3 e p(x) = x + x2 + x4 , si ha:
l(x) + p(x) = 1 + x + x3 + x4 ,
in questo caso invece il polinomio somma ha grado uguale al massimo grado dei due
polinomi.
Dagli esempi precedenti si può affermare che nell’operazione di somma tra due
generici polinomi f (x) e g(x) di K[x] si ha che:
deg(f (x) + g(x)) ≤ max {deg(f (x)), deg(g(x))} .
Nell’operazione di somma l’elemento neutro è il polinomio nullo, inoltre considerato
un generico polinomio g(x) di K[x], dato che g(x) + g(x) = 0, allora è evidente che
l’opposto di tale polinomio è il polinomio stesso.
Consideriamo in K[x] la classica operazione di prodotto di cui si ha un’applicazione
nell’esempio seguente.
Esempio 2
Siano i polinomi f (x) = 1 + x + x3 + x4 e g(x) = x + x2 + x3 consideriamo il prodotto tra
tali polinomi:
105
5.1 Polinomi su K
f (x) · g(x) = (x + x2 + x3 ) + x(x + x2 + x3 ) + x3 (x + x2 + x3 ) + x4 (x + x2 + x3 ) = x + x7 .
Consideriamo adesso il quadrato della somma di due polinomi osserviamo che:
[f (x) + g(x)]2 = f 2 (x) + f (x)g(x) + f (x)g(x) + g 2 (x) = f 2 (x) + g 2 (x).
Ciò significa che nel quadrato della somma di due polinomi di K[x] non si ha il
doppio prodotto.
Consideriamo adesso i polinomi f (x) e h(x) con h(x) 6= 0, allora esiste un unico
polinomio q(x) ed unico polinomio r(x), con deg(r(x)) < deg(h(x)), tali che:
f (x) = h(x)q(x) + r(x).
Il polinomio q(x) è detto quoziente, mentre r(x) resto.
Esempio 3
Sia f (x) = x + x2 + x6 + x7 + x8 e h(x) = 1 + x + x2 + x4 , si ha che:
106
(5.1)
5.2 Parole di C e polinomi
Quindi f (x) = h(x)(x3 + x4 ) + (x + x2 + x3 ) e in particolare il quoziente è q(x) = x3 + x4 ,
il resto r(x) = x + x2 + x3 , è possibile notare che deg(r(x)) < deg(h(x)) = 4.
5.2
Parole di C e polinomi
In questa sessione viene messa in corrispondenza una parola di K n con un polinomio
di grado n−1 su K, inoltre si fa vedere come si possono rappresentare tutte le parole
di un codice C mediante i polinomi di K[x]n−1 , cioè l’insieme di polinomi su K con
grado minore o uguale a n − 1.
Consideriamo il polinomio f (x) = a0 +a1 x+a2 x2 +....+an−1 xn−1 che ha grado al più
n − 1, si ricorda che i coefficienti ai assumono valori su K e alcuni possono assumere
valore “0”. A f (x) facciamo corrispondere la parola di lunghezza n v = a0 a1 a2 ....an−1 .
Si è quindi definita una corrispondenza biunivoca tra i polinomi di K[x]n−1 e le parole
di K n .
Esempio 4
Sia n = 5, consideriamo il polinomio di K[x]4 f (x) = 1 + x2 + x4 ad esso si può associare la
parola v = 10101, mentre al polinomio g(x) = 1 + x si può associare la parola w = 11000.
Siano f (x) e h(x) due polinomi con h(x) 6= 0, se si può scrivere f (x) = h(x)q(x) +
r(x), allora diremo che f (x) in modulo h(x) è uguale a r(x) e scriveremo che
f (x) mod h(x) = r(x).
Si dice che due polinomi f (x) e g(x) sono equivalenti in modulo h(x) e scriveremo
f (x) ≡ g(x) mod h(x), se e solo se entrambi divisi per h(x) 6= 0 hanno lo stesso
107
5.2 Parole di C e polinomi
resto cioè se:
f (x) mod h(x) = r(x) = g(x) mod h(x)
Esempio 5
Siano i polinomi f (x) = 1 + x4 + x9 + x11 , g(x) = 1 + x6 e h(x) = 1 + x5 , si ha che:
Quindi x11 + x9 + x4 + 1 = (x5 + 1)(x6 + x4 + x) + x + 1 cioè f (x) in modulo h(x) è uguale
a x + 1, inoltre si ha:
Quindi x6 + 1 = (x5 + 1)x + x + 1 e vale f (x) mod (h(x)) = x + 1 = g(x) mod (h(x)),
allora si può scrivere che f (x) ≡ g(x) mod h(x) = x + 1.
Fissato un polinomio h(x) di grado n, poichè per un qualunque polinomio f (x) di
K[x] si ha che f (x) mod h(x) = r(x) e il deg(r(x)) < n, allora ad ogni polinomio
108
5.3 Codici ciclici
f (x) di K[x] si può associare un polinomio r(x) di K[x]n−1 che identifica una parola
binaria di lunghezza n. In particolare tutti i polinomi equivalenti in modulo h(x)
individuano la stessa parola di K n .
Esempio 6
Il polinomio f (x) = 1 + x4 + x9 + x11 dell’esercizio 5 essendo in modulo h(x) = 1 + x5
uguale a x + 1 corrisponde alla parola di lunghezza 5 uguale a v = 11000.
Proprietà 7 Se p(x) è un polinomio di K[x] e f (x) ≡ g(x) mod h(x), allora valgono
le due seguenti proprietà.
• f (x) + p(x) ≡ g(x) + p(x) mod (h(x));
• f (x)p(x) ≡ g(x)p(x) mod (h(x)).
5.3
2
Codici ciclici
Prima di dare la definizione di codice ciclico in questa sessione è presentato un
particolare operatore che agisce su K n e permette di ottenere ancora una parola di
K n.
Sia v una parola di K n , si definisce operatore shift ciclico l’applicazione π : K n →
K n , esso agisce sulla parola v spostando il suo ultimo bit nella prima posizione.
109
5.3 Codici ciclici
Esempio 7
Si elencano in sequenza una serie di applicazioni dell’operatore π su diverse parole v di
lunghezza n differente.
Sia v = 1100 ⇒ π(v) = 0110.
Sia v = 011011 ⇒ π(v) = 101101.
Sia v = 101 ⇒ π(v) = 110.
Sia v = 10011 ⇒ π(v) = 11001.
È facile verificare che l’operatore π è lineare, quindi segue la proprietà.
Proprietà 8 L’operatore π è lineare cioè valgono le due proprietà:
• ∀ v, w ∈ K n , π(v + w) = π(v) + π(w).
• ∀ a ∈ K = {0, 1}, π(av) = aπ(v).
Un codice C si dice ciclico se per qualunque parola v ∈ C si ha che anche π(v) ∈ C,
cioè se si effettua lo shift ciclico su una qualunque parola di C la parola ottenuta
appartiene ancora a C.
Esempio 8
Sia il codice C = {000, 110, 101, 011}, si ha che:
π(v) = π(000) = 000 ∈ C;
π(v) = π(110) = 011 ∈ C;
π(v) = π(101) = 110 ∈ C;
π(v) = π(011) = 101 ∈ C.
110
5.3 Codici ciclici
Quindi il codice C è un codice ciclico.
Si può notare che il codice C dell’esempio 8 oltre ad essere ciclico è anche un codice
lineare, infatti la somma di due sue parole è ancora una parola del codice. L’esempio
seguente però mostra che non tutti i codici lineari sono anche ciclici.
Esempio 9
Sia il codice C = {000, 100, 011, 111}, si ha che:
π(v) = π(100) = 010 ∈
/ C;
π(v) = π(011) = 101 ∈
/ C.
Il codice C è lineare ma non ciclico.
Cerchiamo di determinare un codice ciclico e lineare; sia v ∈ K n e consideriamo
l’insieme S così definito:
©
ª
S = v, π(v), π 2 (v), · · · , π n−1 (v) ,
dove con π i (v) si intende una sequenza di i applicazioni
dell’operatore
π cioè
π(π(· · · (π(v)) · · · ). Consideriamo l’insieme di tutte le possibili combinazioni lineari
delle parole di S, cioè L(v, π(v), π 2 (v), · · · , π n−1 (v)), tale insieme definisce un codice
C che è ciclico lineare, in quanto C = L(v, π(v), π 2 (v), · · · , π n−1 (v)) e l’operatore
π è un’applicazione lineare. È facile anche notare che un codice così ottenuto è il
più piccolo codice ciclico lineare contenente v, infatti se v appartiene ad un codice
ciclico lineare C 0 , con C 0 6= C, allora esso sempre contiene l’insieme S e l’insieme
L(v, π(v), π 2 (v), · · · , π n−1 (v)). L’insieme S è un insieme di generatori per il codice
lineare C.
111
5.4 Codice ciclico e polinomi di K n−1
Esempio 10
Sia la parola di K 3 v = 100, consideriamo l’insieme S = {100, 010, 001}, allora si ha che
C = K 3 = {000, 100, 010, 001, 110, 101, 011, 111}.
Esempio 11
Sia la parola di K 4 v = 0101, π(v) = 1010 e π 2 (v) = 0101 = v, quindi S = {0101, 1010}.
È importante notare che la ciclicità delle parole v negli esempi precedenti era n − 1, adesso
è 1 poichè π 2 (v) = v, il codice ottenuto è C = {0000, 0101, 1010, 1111}.
5.4
Codice ciclico e polinomi di K n−1
Come si è visto nella seconda sessione del capitolo una qualunque parola v può
essere scritta in forma polinomiale. Facciamo quindi corrispondere ad ogni parola v
di lunghezza n, un polinomio v(x) di grado minore o uguale a n − 1.
L’operatore π sposta l’ultimo bit di v nella prima posizione formando una nuova
parola. In una visione polinomiale di v, l’operatore π è equivalente al prodotto
xv(x). Il concetto di shift ciclico, quindi, corrisponde al prodotto del fattore x per il
polinomio v(x), procedendo in una successione di prodotti per x si può determinare
un polinomio f (x) di grado maggiore di n − 1 che è legato ad una parola binaria
di lunghezza n + 1. Nasce la necessità di “modulare” il polinomio f (x) ottenuto
tramite il polinomio h(x) = xn + 1, cioè si considera il polinomio f (x) mod h(x)
che ha grado minore o uguale a n − 1 e corrisponde ad una parola di lunghezza n.
È importante notare che poichè xn mod (xn + 1) = 1, allora se in un polinomio è
presente il termine xn esso si può sostituire con il termine 1.
112
5.4 Codice ciclico e polinomi di K n−1
Quanto detto consente di generare un lineare da un punto di vista polinomiale. Sia
v una parola di K n a cui è associato il polinomio v(x), costruiamo l’insieme S così
definito:
©
ª
S = v(x), xv(v), x2 v(x), · · · , xn−1 v(x) .
(5.2)
Nella (5.2) al polinomio xi v(x) corrisponde la parola π i (v). È evidente che in S
possono essere presenti polinomi di grado maggiore di n − 1, allora è necessario
considerare ogni polinomio di S in modulo (xn +1), per far ciò si utilizza la scrittura:
©
ª
S = v(x), xv(x), · · · , xn−1 v(x) mod (xn + 1).
(5.3)
L’insieme di tutte le combinazioni lineari dei polinomi di S in modulo (xn + 1)
costituisce un codice lineare ciclico ed esso è il più piccolo codice ciclico contenente
la parola v. L’insieme S definisce un insieme di polinomi generatori del codice
ciclico lineare C, la tecnica di costruzione utilizzata è equivalente alla tecnica in cui
si adopera l’operatore π ed essa genera lo stesso codice.
Esempio 12
Sia la parola v = 1101000 di K 7 e sia h(x) = x7 + 1. Formiamo l’insieme S costituito dai
7 polinomi.
v = 1101000 ⇒ v(x) = 1 + x + x3 ;
π(v) = 0110100 ⇒ xv(x) = x + x2 + x4 ;
π 2 (v) = 0011010 ⇒ x2 v(x) = x2 + x3 + x5 ;
π 3 (v) = 0001101 ⇒ x3 v(x) = x3 + x4 + x6
π 4 (v) = 1000110 ⇒ x4 v(x) = x4 + x5 + x7 mod (x7 + 1) = 1 + x4 + x5 ;
π 5 (v) = 0100011 ⇒ x5 v(x) = x5 + x6 + x8 mod (x7 + 1) = x + x5 + x6 ;
113
5.4 Codice ciclico e polinomi di K n−1
π 6 (v) = 1010001 ⇒ x6 v(x) = x6 + x7 + x9 mod (x7 + 1) = 1 + x2 + x6 .
I sette polinomi ottenuti costituiscono l’insieme S e sono i generatori del codice ciclico
lineare C.
Una qualunque parola c(x) di un codice ciclico C ottenuto da S può esprimersi
mediante una combinazione lineare degli elementi di S, cioè:
£
¤
c(x) = a0 v(x) + a1 xv(x) + a2 x2 v(x) + ... + an−1 xn−1 v(x) mod (xn + 1) =
= (a0 +a1 x+a2 x2 +...+an−1 xn−1 )v(x) mod (xn +1) = a(x)v(x) mod (xn +1). (5.4)
Nella (5.4) si è determinato il polinomio a(x) = a0 + a1 x + a2 x2 + ... + an−1 xn−1 di
grado n − 1 che permette di enunciare il seguente lemma.
Lemma 2 Se C è un codice ciclico lineare e v ∈ C, allora per ogni polinomio a(x)
di grado n − 1 si ha che
c(x) = a(x)v(x) mod (xn + 1) ∈ C.
(5.5)
2
114
5.5 Matrice generatrice
5.5
Matrice generatrice
Consideriamo un codice ciclico e lineare C dove ogni sua parola ha una rappresentazione polinomiale, tra tutte le sue parole non nulle si consideri una parola a cui
corrisponde un polinomio g(x) che ha grado minimo rispetto ad ogni altra parola di
C.
È facile provare che esiste una sola parola il cui polinomio corrispondente ha grado
minimo. Supponiamo per assurdo che esistano due parole differenti in C a cui sono
associati due polinomi di grado minimo uguale a k, siano essi g(x) e g 0 (x). Se
si considera la somma delle due parole, quindi anche dei due polinomi, si ottiene
c(x) = g(x) + g 0 (x) e per la linearità di C si ha che c(x) ∈ C, inoltre poichè la
somma dei termini di grado k è zero (xk + xk = 0) segue che deg(c(x)) < k, ciò
è assurdo in quanto per la scelta fatta, g(x) e g 0 (x) sono due polinomi di grado
minimo in C e non può esistere in C una parola di grado minore di k. Il polinomio
di minimo grado in C è unico.
Se C è un codice ciclico lineare si chiama polinomio generatore di C l’unico
polinomio non nullo di grado minimo corrispondente a una parola di C. Il polinomio
generatore permette di generare tutte le parole di C.
Teorema 29 Se C è un codice ciclico lineare, allora si ha che ogni parola c(x) di
C si può esprimere nel modo seguente:
c(x) = a(x)g(x).
115
(5.6)
5.5 Matrice generatrice
Dim.
Per provare il teorema basta mostrare che il polinomio generatore divide ogni parola
di C. Supponiamo per assurdo che esista una parola c(x) ∈ C che non è divisibile
per g(x), allora si ha che:
c(x) = a(x)g(x) + r(x),
dalla quale è possibile ottenere:
r(x) = a(x)g(x) + c(x).
Per il lemma 2 si ha che a(x)g(x) è una parola di C ed inoltre per la linearità di C
si ha che a(x)g(x) + c(x) ∈ C ne segue che anche r(x) ∈ C, ma questo è assurdo in
quanto deg(r(x)) < deg(g(x)) e deve necessariamente essere r(x) = 0.
2
Il seguente teorema permette di legare il polinomio generatore con i concetti di
dimensione e base di un codice ciclico e lineare C.
Teorema 30 Sia C un codice ciclico lineare di lunghezza n e g(x) il suo polinomio
generatore di grado n − k = deg(g(x)), allora si ha:
1. Il codice C ha dimensione k.
2. Le parole corrispondenti a g(x), xg(x), ... ,xk−1 g(x) formano una base di C.
3. La parola c(x) appartiene a C se e solo se c(x) = a(x)g(x) dove deg(a(x)) < k
(cioè g(x) è un divisore per ogni parola c(x) in C).
116
5.5 Matrice generatrice
Dim.
Il polinomio g(x) ha grado n − k, i polinomi g(x), xg(x), ..., xk−1 g(x) hanno rispettivamente grado n − k, n − k + 1, ..., n − 1, sono diversi dal polinomio nullo e nessuno
di essi può essere espresso come combinazione lineare dei precedenti essendo questi
tutti di grado inferiore, quindi, per un teorema di Algebra lineare, essi sono linearmente indipendenti. Per il teorema 29 si ha che ogni parola c(x) di C si può scrivere
come c(x) = a(x)g(x), ciò prova il punto 3 del teorema ed inoltre i k polinomi g(x),
xg(x), ..., xk−1 g(x) formano una base di C.
2
Esempio 13
Sia g(x) = 1 + x + x3 il polinomio generatore per il codice ciclico C di lunghezza n = 7,
si ha che deg(g(x)) = n − k = 3, da cui k = n − 3 = 4 e il codice C ha dimensione 4.
Calcoliamo una base per C moltiplicando g(x) per i fattori x, x2 e x3 :
g(x) = 1 + x + x3 ⇒ 1101000;
xg(x) = x + x2 + x4 ⇒ 0110100;
x2 g(x) = x2 + x3 + x5 ⇒ 0011010;
x3 g(x) = x3 + x4 + x6 ⇒ 0001101.
Il teorema 30 definisce per un codice ciclico lineare C una sua base ottenuta dal
polinomio generatore g(x), allora tramite i polinomi g(x), xg(x), ..., xk−1 g(x), si
può definire la matrice generatrice del codice C nella seguente forma:
117
5.5 Matrice generatrice


g(x)


 xg(x)


 x2 g(x)

G=

.



.


xk−1 g(x)







.






(5.7)
Esempio 14
Sia C un codice ciclico lineare di lunghezza 4, avente polinomio generatore g(x) = 1 + x2 ,
allora si ha che n − k = 2. Una base per C è individuata dai polinomi:
g(x) = 1 + x2 ⇒ 1010
xg(x) = x + x3 ⇒ 0101.
La matrice generatrice di C è:

G=

1 0 1 0
.
0 1 0 1
Uno dei problemi fondamentali per la determinazione di un codice ciclico lineare
che ha parametri n e k è quello di individuare il suo polinomio generatore g(x).
Diverse sono le tecniche utilizzate e i due teoremi seguenti danno indicazioni su
alcune proprietà del polinomio generatore.
Teorema 31 Se g(x) è il polinomio generatore di un codice lineare ciclico C di
lunghezza n, allora g(x) divide 1 + xn cioè 1 + xn = g(x)f (x) e vale il viceversa.
118
5.5 Matrice generatrice
Dim.
Se dividiamo 1 + xn per g(x) si ha 1 + xn = g(x)f (x) + r(x), da cui si ottiene che
r(x) = g(x)f (x)+(1+ xn ). Poichè ogni polinomio deve essere considerato in modulo
(1 + xn ) è lecito scrivere r(x) = (g(x)f (x) + (1 + xn )) mod (xn + 1), tenendo presente
che (1 + xn ) mod (xn + 1) ha resto zero, si ha che r(x) = g(x)f (x) mod (xn + 1),
quindi r(x) ∈ C, ma deg(r(x)) < deg(g(x)) e poichè g(x) è il polinomio di grado
minimo in C, allora r(x) deve essere il polinomio nullo.
2
Teorema 32 Il polinomio generatore g(x) del più piccolo codice lineare ciclico C,
di lunghezza n e contenente la parola corrispondente a v(x), è il massimo comune
divisore di v(x) e di (1 + xn ).
Dim.
Per il lemma 2 si ha che ogni parola c(x) ∈ C si può esprimere come c(x) =
v(x)a(x) mod (xn +1), allora in particolare per g(x) si ha g(x) = a(x)v(x) mod (xn +
1) o equivalentemente g(x) = a(x)v(x) + b(x)(xn + 1). Per i teoremi 31 e 29 si ha
che g(x) è un divisore di (1 + xn ) e di v(x), quindi ogni comune divisore per v(x)
e 1 + xn deve dividere anche g(x), pertanto esso è il massimo comune divisore fra
v(x) e 1 + xn .
2
Un metodo alternativo per cercare un polinomio generatore, di un codice ciclico C di
dimensione k, consiste nel cercare di ridurre una sua matrice generatrice G in modo
che le colonne leading siano le ultime colonne di G. La riga di G corrispondente al
polinomio di minimo grado individua il polinomio generatore.
119
5.6 Sindrome e matrice di parità
5.6
Sindrome e matrice di parità
Supponiamo sia stata ricevuta la parola w, corrispondente a w(x), e che sia stata inviata la parola v, associata a v(x), allora definiamo errore polinomiale il
polinomio e(x) = v(x) + w(x). Si definisce sindrome polinomiale la quantità:
s(x) = w(x) mod (g(x)).
(5.8)
Poichè g(x) ha grado n−k, allora la sindrome s(x) ha grado minore di n−k e ad essa
corrisponde una parola di lunghezza n − k. Supponiamo che w(x) ∈ C, allora dato
che w(x) = a(x)g(x), segue che la sua sindrome è s(x) = 0. Se invece w(x) ∈
/ C,
allora, poichè w(x) = v(x) + e(x), si ha che
s(x) = w(x) mod (g(x)) = [v(x) + e(x)] mod (g(x)) = e(x) mod (g(x)),
dato che v(x) mod (g(x)) = 0. Ciò comporta che la sindrome della parola ricevuta w(x) corrisponde alla sindrome dell’errore e(x) e la definizione di sindrome
polinomiale corrisponde alla definizione di sindrome data nel capitolo 3.
Si definisce matrice di parità Hn×n−k la matrice la cui i-esima riga, ri , è la parola
di lunghezza n − k corrispondente al polinomio:
ri (x) = xi mod (g(x))
La matrice di parità è:
120
per
0 ≤ i ≤ n − 1.
5.6 Sindrome e matrice di parità


x0


 x


 x2

H=
 .



 .

xn−1







 mod (g(x)).






(5.9)
Se w è la parola ricevuta, poichè w(x) = v(x) + e(x) la sindrome polinomiale si può
ottenere anche mediante la matrice H nel seguente modo:
P
i
w · H = (v + e) · H ≡ n−1
i=0 (vi + ei )x mod (g(x)) =
P
Pn−1
i
i
= n−1
i=0 vi x mod (g(x)) +
i=0 ei x mod (g(x)) =
P
i
= n−1
i=0 ei x mod (g(x)) = e(x)mod(g(x)).
Ancora una volta la definizione precedente coincide con la definizione di sindrome
ottenuta tramite la matrice di parità del capitolo 3.
Esempio 15
Consideriamo un codice C di lunghezza 7 con polinomio generatore g(x) = 1 + x + x3 , si
ha che n − k = 3, quindi la dimensione di C è k = 4. Costruiamo la matrice di parità nel
modo seguente:
r0 (x) = 1 mod (g(x)) = 1 ⇔ 100;
r1 (x) = x mod (g(x)) = x ⇔ 010;
121
5.6 Sindrome e matrice di parità
r1 (x) = x2 mod (g(x)) = x2 ⇔ 001;
r1 (x) = x3 mod (g(x)) = 1 + x ⇔ 110;
r1 (x) = x4 mod (g(x)) = x + x2 ⇔ 011;
r1 (x) = x5 mod (g(x)) = 1 + x + x2 ⇔ 111;
r1 (x) = x6 mod (g(x)) = 1 + x2 ⇔ 101.
La matrice di parità è:

 1 0

 0 1



 0 0


H= 1 1


 0 1


 1 1


1 0
122

0 

0 



1 


0 .


1 


1 


1
Capitolo 6
Campi finiti e codici 2 - BCH
In questo capitolo è definita la nozione di campo finito. La trattazione non sarà
rigorosa, ma mirata a dare quei concetti base utili ad un corso di Teoria dei Codici
rivolto a studenti di ingegneria. Per maggiori approfondimenti si consiglia la visione
di testi di Matematica Discreta e Campi Finiti.
Quando si dice che un insieme numerico è un “campo”?
Un campo è un insieme numerico C su cui sono definite due operazioni algebriche
binarie di cui la prima, generalmente chiamata somma (+), risulta essere un gruppo commutativo e la seconda, chiamata prodotto (×), risulta anch’essa un gruppo
commutativo sull’insieme C −{0}, cioè l’insieme numerico C con l’esclusione dell’elemento neutro 0 rispetto alla somma. Esempi di insiemi numerici che sono dei campi
possono essere quelli dei numeri reali e dei numeri complessi su cui sono definite le
classiche operazioni di somma e prodotto.
123
6.1 Polinomio primitivo
Nel capitolo precedente si è definita una corrispondenza tra le parole di K n e i
polinomi di K[x] in modulo xn + 1, cioè i polinomi di K[x]n−1 . È evidente che per
tali polinomi vale la classica operazione di somma e rispetto a tale operazione si ha
che K[x]n−1 è un gruppo abeliano con elemento neutro il polinomio nullo, l’inverso
di un qualunque polinomio g(x) è sè stesso. L’operazione di somma di due polinomi
di K[x]n−1 è equivalente all’operazione di somma definita precedentemente in K n
come si vede nell’esempio seguente.
Esempio 1
Siano in K 4 le due parole v = 0101 e w = 0111 corrispondenti ai polinomi v(x) = x + x3
e w(x) = x + x2 + x3 , allora si ha che:
v + w = 0101 + 0111 = 0010,
equivalentemente,
v(x) + w(x) = x2 .
Tale polinomio somma in K 4 corrisponde alla parola 0010.
6.1
Polinomio primitivo
Un polinomio g(x) si dice irriducibile se esso è divisibile solo per 1 e per se stesso,
in caso contrario è detto riducibile. Nell’esempio seguente sono elencati una serie
di polinomi che sono sia riducibili che irriducibili.
124
6.1 Polinomio primitivo
Esempio 2
1. x è irriducibile.
2. x + 1 è irriducibile.
3. x2 è evidentemente riducibile.
4. x2 + 1 è riducibile in quanto si può esprimere come (x + 1)2 .
5. x2 +x+1 è irriducibile in quanto non si può esprimere come prodotto di due polinomi
di primo grado.
6. x3 +x+1 è irriducibile in quanto non si può esprimere come prodotto di un polinomio
di primo grado e un polinomio di secondo grado.
7. x4 + x + 1 è irriducibile.
8. x4 + 1 è riducibile in quanto può essere scritto come (x2 + 1)2 .
Diamo adesso una definizione che assume una fondamentale importanza nella definizione dei campi finiti. Un polinomio irriducibile di grado n > 1 è detto primitivo se
esso non divide tutti i polinomi del tipo xm + 1 con m < 2n − 1 e divide il polinomio
xm + 1 con m = 2n − 1.
Esempio 3
Consideriamo il polinomio h(x) = 1 + x + x2 , n = 2, esso è irriducibile e m = 22 − 1 = 3.
Se si considerano i polinomi del tipo xm + 1, con m < 3, allora si ha che essi non sono
divisibili per h(x), mentre è divisibile x3 + 1.
125
6.1 Polinomio primitivo
Quindi h(x) è un polinomio primitivo.
Esempio 4
Consideriamo il polinomio irriducibile h(x) = x3 + x + 1 e m = 23 − 1 = 7. Tutti i polinomi
xm + 1 con m < 7 non sono divisibili per h(x). Verifichiamo se esso divide il polinomio
x7 + 1:
Quindi h(x) è un polinomio irriducibile e primitivo.
126
6.2 Campi finiti di Galois
Esempio 5
Sia il polinomio h(x) = 1 + x + x2 + x3 + x4 , con m = 24 − 1 = 15, esso, se primitivo, non
divide tutti i polinomi xm + 1 con m < 15, ma poichè:
x5 + 1 = (1 + x)(1 + x + x2 + x3 + x4 ),
allora h(x) divide x5 + 1 ed esso non è un polinomio primitivo.
6.2
Campi finiti di Galois
Si considerino i polinomi di K[x] in modulo xn + 1 e definiamo in essi la classica
operazione di prodotto tra polinomi, cioè se f (x) e g(x) sono due polinomi arbitrari
non nulli di K[x] allora il loro prodotto è:
f (x) · g(x) mod xn + 1
e deve appartenere a K[x]n−1 − {0}, cioè dati due polinomi f (x) e g(x) non nulli, il
loro polinomio prodotto deve essere anch’esso non nullo e appartenere a K[x]n−1 −
{0}.
L’esempio seguente mostrerà che il prodotto definito precedentemente non rispetta
sempre tale proprietà.
Esempio 6
Proviamo ad utilizzare l’operazione di moltiplicazione sui polinomi in modulo 1 + x4 cioè
sui polinomi di K[x]3 equivalenti alle parole di K 4 . Sia la parola v = 0101 corrispondente
al polinomio v(x) = x + x3 e consideriamo il prodotto v(x) · v(x):
127
6.2 Campi finiti di Galois
(x + x3 )2 = x2 + x6 .
Consideriamo adesso tale polinomio in modulo x4 + 1 cioè:
quindi,
(x + x3 )2 = (x2 + x6 )mod(x4 + 1) = 0.
Il problema presentato nell’esempio 7 è legato al fatto che 1 + x4 non è irriducibile e
tutti i polinomi riducibili divisibili per 1+x4 sono equivalenti in modulo al polinomio
nullo, quindi alla parola nulla.
In base a quest’ultima osservazione consideriamo i polinomi di K[x] in modulo h(x)
con h(x) polinomio primitivo di grado n > 1. Se indichiamo il polinomio x con il
simbolo β , allora è possibile usare la seguente scrittura:
128
6.2 Campi finiti di Galois
β i = xi mod(h(x)).
(6.1)
Si noti che h(x), poichè è un polinomio primitivo, non divide i polinomi 1 + xm
per m < 2n − 1 e quindi β m 6= 1 per m < 2n − 1, ma divide 1 + xm , allora
1 = xm mod (h(x)) o equivalentemente β m = 1 se e solo se m = 2n − 1.
Si definisce il seguente insieme:
©
ª[
GF (2n ) = β i |i = 0, 1, ..., 2n − 2
{0} .
(6.2)
L’insieme GF (2n ) contiene 2n elementi distinti, infatti se supponiamo che due suoi
elementi β i e β j , con i < j e 0 ≤ i, j ≤ 2n − 2 siano tali che β i = β j , allora si ha
che β i = β j−i β i , il che implica che β j−i = 1, ciò accade solo se j − i è un multiplo
di 2n − 1, ma essendo 1 ≤ j − i ≤ 2n − 2 < 2n − 1 questo è impossibile e si ha che
β i 6= β j .
L’insieme GF (2n ) ha la struttura di campo con le operazioni di somma e prodotto,
esso prende il nome di Campo di Galois. Ogni singolo elemento di GF (2n ) si può
mettere in corrispondenza con le parole di K n , come vedremo nell’esempio seguente
in cui viene mostrato come si costruisce il campo di Galois GF (24 ) in cui sono
facilmente definite le operazioni di somma e prodotto.
129
6.2 Campi finiti di Galois
Esempio 7
Dato il polinomio primitivo h(x) = 1 + x + x4 , costruiamo il campo GF (24 ) ricavando i
suoi elementi come indicato nella tabella (6.1).
parola
polinomio
campo
0000
0
0
1000
1
1
0100
x
β
0010
x2
β2
0001
x3
β3
1100
x4 = 1 + x
β4
0110
x5 = x + x2
β5
0011
x6 = x2 + x3
β6
1101
x7 = x3 + x4 = 1 + x + x3
β7
1010
x8 = x + x2 + x4 = x + x2 + 1 + x = 1 + x2
β8
0101
x9 = x + x3
β9
1110
x10 = x2 + x4 = x2 + 1 + x
β 10
0111
x11 = x3 + x2 + x
β 11
1111
x12 = x4 + x3 + x2 = x + 1 + x2 + x3
β 12
1011
x13 = x2 + x + x3 + x4 = x2 + x + x3 + 1 + x = 1 + x2 + x3
β 13
1001
x14 = x3 + x4 + x = x3 + x + 1 + x = x3 + 1
β 14
Tabella 6.1:
GF (24 )
La somma tra gli elementi di GF(24 ) è estremamente semplice in quanto definita come
somma algebrica degli elementi di GF (24 ). Calcoliamo il prodotto tra le due parole (0110)
e (1101), corrispondenti alle parole β 5 e β 7 e ai polinomi x + x2 e 1 + x + x3 , si ha che:
130
6.2 Campi finiti di Galois
(0110) · (1101) = β 5 · β 7 = β 12 = 1111.
Ciò è equivalente al prodotto dei polinomi corrispondenti in modulo h(x):
(x + x2 ) · (1 + x + x3 ) = x5 · x7 = x12 mod h(x).
Un elemento α ∈ GF (2n ) è detto primitivo se ogni sua potenza m, con 1 ≤ m <
2n − 1, è diversa da 1 (αm 6= 1).
Si definisce ordine di un elemento α 6= 0 di GF (2r ) il più piccolo intero positivo m
per cui si ha che αm = 1. In particolare un elemento primitivo di GF (2r ) ha ordine
2n − 1.
Sia il polinomio p(x) ∈ K[x], si dice che p(x) ammette una radice α ∈ GF se
p(α) = 0.
Esempio 8
Sia il polinomio p(x) = 1 + x3 + x4 , con h(x) = 1 + x + x4 polinomio primitivo, vediamo
se β è una sua soluzione in GF (24 ).
p(β) = 1 + β 3 + β 4 = 1000 + 0001 + 1100 = 0101 = β 9 6= 0000,
quindi β non è una radice di p(x).
Consideriamo adesso l’elemento β 7 ∈ GF e vediamo se esso è radice di p(x). Ricordando
che β 15 = 1 si ha:
p(β 7 ) = 1 + (β 7 )3 + (β 7 )4 = 1 + β 21 + β 28 = 1 + (β 15 · β 6 ) + (β 15 · β 13 ) =
= 1000 + 0011 + 1011 = 0000
Quindi β 7 è soluzione di p(x).
131
6.3 Polinomio minimo
6.3
Polinomio minimo
Se α è un arbitrario elemento di GF (2n ), allora si definisce polinomio minimo
di α il polinomio di minimo grado che ha come radice α. Il polinomio minimo
di α è denotato mediante la simbologia mα (x), oppure, dato che α = β i , per un
determinato i, con mi (x) e le due scritture sono equivalenti:
mα (x) ≡ mi (x)
Trovare il polinomio minimo di un elemento α di GF (2n ) si riconduce a determinare
una combinazione lineare non banale dei vettori {1, α, α2 , ..., αn } che origini la parola
nulla cioè in termini di elementi di GF (2n ):
a0 + a1 α + a2 α2 + a3 α3 + ... + ar αn = 0.
Tale combinazione lineare esiste poichè ogni elemento della combinazione lineare
rappresentata nell’equazione precedente corrisponde a una parola di K n in cui n + 1
elementi sono sempre linearmente dipendenti.
Esempio 9
Cerchiamo di determinare il polinomio minimo dell’elemento α = β 3 ∈ GF (24 ), dove si
utilizza come polinomio primitivo h(x) = 1 + x + x4 . Consideriamo l’equazione
mα (x) = m3 (x) = a0 1 + a1 α + a2 α2 + a3 α3 + a4 α4 = a0 β 0 + a1 β 3 + a2 β 6 + a3 β 9 + a4 β 12 =
= a0 1 + a1 x3 + a2 (x2 + x3 ) + a3 (x + x3 ) + a4 (1 + x + x2 + x3 ).
(6.3)
Bisogna determinare i valori a0 , a1 , .., a4 ∈ {0, 1}, vista la corrispondenza tra gli elementi
di GF (24 ) e le parole di K 4 si ha:
132
6.3 Polinomio minimo
0000 = a0 (1000) + a1 (0001) + a2 (0011) + a3 (0101) + a4 (1111)
(6.4)
Risolvendo per componenti rispetto a a0 , a1 , a2 , a3 , a4 si determina:



a0 + a4 = 0





 a3 + a4 = 0
 a +a =0


2
4




 a +a +a +a =0
1
2
3
4
quindi:



a0 = a4





 a3 = a4
 a =a


2
4




 a =a
1
4
Per determinare una combinazione non banale è necessario porre a4 = 1 e quindi si ha che
a0 = a1 = a2 = a3 = a4 = 1 e il polinomio minimo è:
m3 (x) = 1 + x + x2 + x3 + x4 .
Il teorema seguente mostra le principali proprietà dei polinomi minimi.
Teorema 33 Sia α 6= 0 un elemento di GF (2n ) e sia mα (x) il suo minimo polinomio si ha:
1. Il polinomio minimo mα (x) è irriducibile.
2. Se f (x) è un polinomio tale che f (α) = 0, allora mα (x) divide f (x).
133
6.3 Polinomio minimo
3. Il polinomio minimo mα (x) è unico.
n −1
4. Il polinomio minimo mα (x) divide x2
+ 1.
Dim.
1. Supponiamo per assurdo che mα (x) è riducibile, in tal caso esso può essere scritto come mα (x) = q(x)p(x), poichè mα (α) = 0, allora si ha che
q(α)p(α) = 0 e quindi q(α) = 0 oppure p(α) = 0, ma deg(q(x)) < deg(mα (x))
e deg(p(x)) < deg(mα (x)), questo è assurdo in quanto mα (x) è il polinomio di
grado minore che ha α come radice.
2. Supponiamo che mα (x) non divide f (x), allora si può scrivere:
f (x) = mα (x)q(x) + r(x),
dove deg(r(x)) < deg(mα (x)), per ipotesi f (α) = 0 quindi:
f (α) = mα (α)q(α) + r(α) = 0 · q(α) + r(α) = r(α) = 0,
ciò è assurdo perchè il polinomio r(x) ha α come radice ed ha grado inferiore
di mα (x).
3. Se esistono due polinomi minimi m0α (x) e mα (x), per la parte seconda del
teorema si ha che mα (x) divide m0α (x) e m0α (x) divide mα (x), ciò vuol dire che
mα (x) = m0α (x) e il polinomio minimo è unico.
4. Poichè α è un elemento di GF (2n ), allora esiste un i per cui α = β i ed inoltre:
n −1
α2
n −1
+ 1 = (β i )2
n −1
Pertanto, mα (x) divide x2
n −1
+ 1 = (β 2
+ 1.
)i + 1 = 1i + 1 = 1 + 1 = 0.
2
134
6.3 Polinomio minimo
La seguente proprietà permette di ottenere informazioni sulle radici dei polinomi
minimi.
Proprietà 9 Sia f (x) un polinomio in K allora si ha che:
f (x)2 = f (x2 ).
(6.5)
Dim.
La proprietà è dimostrata dalle seguenti eguaglianze:
2
f (x) =
à n
X
!2
ai x
i=0
i
=
n
X
i 2
ai (x ) =
i=0
n
X
ai (x2 )i = f (x2 ).
i=0
2
La proprietà (9) permette di affermare che se α è una radice del polinomio f (x) cioè
f (α) = 0, allora anche f (α2 ) = 0, quindi α2 è una radice di f (x), così come lo è
n−1
anche α4 e in generale α2
.
n−1
Teorema 34 Le radici del polinomio minimo mα (x) sono α, α2 , α4 , · · · , α2
, in
particolare i polinomi m1 (x) e m3 (x) hanno n radici distinte e rispettivamente sono:
n−1
},
n−1 )
}.
{β, β 2 , β 4 , ..., β 2
{β 3 , β 6 , ..., β 3(2
135
(6.6)
6.3 Polinomio minimo
Dim.
La prima parte della proprietà segue dalla proprietà 9. Sia il polinomio minimo
i
j
m1 (x), consideriamo due soluzioni β 2 e β 2 della (6.6) e supponiamo per assurdo
i
j
che β 2 = β 2 con i > j e 0 ≤ i, j ≤ n − 1, allora si ha:
j
i
j
j
β 2 · β 2 −2 = β 2 ,
equivalente all’equazione:
i
j
β 2 −2 = 1.
(6.7)
La (6.7) vale se 2i − 2j = k(2n − 1), cioè 2i − 2j è un multiplo di 2n − 1, ma poichè
i e j variano tra 0 e n − 1, allora si ha:
2i − 2j ≤ 2n−1 − 1 < 2n − 1.
Ciò mostra che 2i − 2j non è un multiplo di 2n − 1 e tutte le n soluzioni di m1 (x)
sono tutte distinte. Con uguale procedura si dimostra che anche tutte le soluzioni
di m3 (x) sono tutte distinte.
2
elemento di GF(24 )
polinomoio minimo
0
x
1
1+x
β, β 2 , β 4 , β 8
1 + x + x4
β 3 , β 6 , β 9 , β 12
1 + x + x2 + x3 + x4
β 5 , β 10
1 + x + x2
β 7 , β 11 , β 13 , β 14
1 + x3 + x4
Tabella 6.2: Radici e polinomi minimi in GF(24 )
136
6.4 Codici di Hamming
La precedente tabella individua le soluzioni di tutti i polinomi minimi di GF (24 ).
6.4
Codici di Hamming
I codici di Hamming sono codici perfetti 1-correttori che hanno lunghezza l = 2n −1 e
le righe della loro matrice di parità hanno lunghezza n. In questa sezione è mostrato
che le 2n − 1 righe della matrice di parità di un codice di Hamming possono essere
rappresentate mediante gli elementi non nulli di un campo di Galois GF (2n ), infatti
essendo β un elemento primitivo di GF (2n ) allora per definizione le sue potenze sono
tutte distinte e individuano i 2n − 1 elementi non nulli di GF corrispondenti alle
parole non nulle di K n .
La matrice di parità di un codice di Hamming di lunghezza l = 2n − 1 può essere
espressa nel seguente modo:

H(2n −1)×r








=









1
β
β2
.
βi
.








.








(6.8)
n −2
β2
Esempio 10
Se n = 3, allora l = 23 − 1 = 7. Definiamo GF (23 ) mediante il polinomio primitivo
p(x) = 1 + x + x3 , l’elemento β corrispondente al polinomio x e alla parola di K 3 010,
ricordando poi che xi mod p(x), si ottiene:
137
6.4 Codici di Hamming


1




 β 




 2 
 β 




H =  β3 




 β4 




 β5 




6
β

↔
 1 0

 0 1



 0 0


H= 1 1


 0 1


 1 1


1 0

0 

0 



1 


0 .


1 


1 


1
Quanto detto precedentemente si può riassumere mediante il seguente teorema.
Teorema 35 Un polinomio primitivo di grado n è il generatore polinomiale di un
codice ciclico di Hamming di lunghezza 2n − 1.
2
Sia C un codice ciclico di lunghezza n con polinomio generatore g(x) e supponiamo
che α ∈ GF (2n ) sia una radice di g(x), allora chiaramente si ha che g(α) = 0. Poichè
tutte le parole c(x) di C possono essere scritte come c(x) = a(x) · g(x) allora segue
che c(α) = g(α) · x(α) = 0. Per i teoremi 37 e 38 si ha che mα (x) è divisore di ogni
parola c(x) appartenente a C ed inoltre è possibile scrivere g(x) come prodotto di
polinomi minimi.
Teorema 36 Sia g(x) il polinomio generatore di un codice ciclico di lunghezza n,
allora g(x) sarà il prodotto dei minimi polinomi di α1 , α2 , ..., αk ∈ GF (2n ), se e solo
se
∀c(x) ∈ C
c(α1 ) = c(α2 ) = ... = c(αk ) = 0.
(6.9)
2
138
6.4 Codici di Hamming
Cerchiamo di individuare una tecnica utile all’individuazione e alla correzione degli
errori per i codici di Hamming.
Se c(x) è la parola che è stata inviata e w(x) la parola ricevuta, allora l’errore e(x)
è definito nel seguente modo:
w(x) = c(x) + e(x).
Se il polinomio generatore g(x) = mα (x) è il polinomio primitivo, allora α è radice
di tale polinomio (g(α) = 0) e si ha che:
w(α) = c(α) + e(α) = 0 + e(α) = αj ,
dove αj è un elemento del campo GF . Pertanto il polinomio che rappresenta l’errore
è e(x) = xj e la correzione della parola ricevuta si può scrivere come:
c(x) = w(x) + xj .
Poichè si ha che:
c(α) = w(α) + αj = αj + αj = 0.
Quindi la parola ottenuta adoperando questa tecnica è una parola del codice. È
importante notare che l’aggiunta del polinomio xj a w(x) corrisponde in termini di
parole di K n al cambio del valore della componente j-esima nella parola ricevuta.
Esempio 11
Consideriamo il polinomio m1 (x) = 1 + x + x3 (primitivo con soluzione β) e il campo di
Galois GF (23 ). Supponiamo di ricevere w(x) = 1 + x2 + x3 + x6 , allora:
139
6.5 Codici 2-BCH
w(β) = 1 + β 2 + β 3 + β 6 = 100 + 001 + 110 + 101 = 110 = β 3
L’errore in questo caso è dato dal polinomio e(x) = x3 , quindi la correzione della parola
ricevuta è:
c(x) = w(x) + e(x) = 1 + x2 + x3 + x6 + x3 = 1 + x2 + x6
6.5
Codici 2-BCH
Una importante classe di codici correttori multipli è la classe dei codici BCH ( dai
nomi di Bose, Chaudhuri e Hocquengham ). Essi sono definiti da due interi positivi
r e t, con t < 2r−1 − 1, e la loro lunghezza è n = 2r − 1, essi sono codici t-correttori
di dimensione k ≥ n − rt.
In questa sessione sono considerati solo codici BCH 2-correttori di lunghezza
2r − 1. Essi hanno come polinomio generatore il polinomio g(x) = mβ (x)mβ 3 (x),
dove β appartiene a GF (2r ) con r ≥ 4. Poichè n = 2r − 1 e g(x) divide 1 + xn ,
allora g(x) è il polinomio generatore di un codice ciclico.
Si consideri un campo GF (2r ) e il codice BCH avente come polinomio generatore
g(x) = m1 (x)m3 (x), dove m1 (x) e m3 (x) sono due polinomi minimi aventi ciascuno r
soluzioni distinte. La matrice di parità H di tali codici è definita nel modo seguente:
140
6.6 Schema di codifica per codici 2-BCH



















β0
β0
β
β
β2
β6
.
.
βi
β 3i
.
.
r −2
β2

















3
(6.10)
r −2)
β 3(2
Poichè β i è un elemento di GF (2r ), esso rappresenta una parola di lunghezza r, quindi H è una matrice (2r − 1) × (2r). Inoltre, poichè il deg(m1 (x)) = r = deg(m3 (x))
ne segue che il grado di g(x) = m1 (x)m3 (x) è n − k = 2r, pertanto il codice ha
dimensione k = n − 2r = 2r − 1 − 2r. Si può dimostrare (ma non verrà fatto in tale
trattazione) che la distanza di tali codici è d = 5.
6.6
Schema di codifica per codici 2-BCH
Consideriamo che w è la parola ricevuta e w(x) il polinomio ad essa associato in una
trasmissione che utilizza un codice 2-BCH. Ricordando che tale codice è un codice
2- correttore, allora la sindrome di w è:
h
w·H =
i
3
w(β), w(β )
h
=
i
s1 , s3
(6.11)
dove s1 e s3 sono due parole di lunghezza r. Nella sequenza successiva è illustrato
la tecnica che permette di individuare l’algoritmo di decodifica dei codici 2-BCH.
• Se non vi sono errori nella trasmissione di w, cioè se w ∈ C, allora si ha che
w · H = 0 e quindi s1 = s3 = 0.
• Se si è nel caso in cui vi è solo un errore nella trasmissione della parola w,
allora l’errore utilizzato per correggere w(x) è e(x) = xi dato che tale errore,
141
6.6 Schema di codifica per codici 2-BCH
se esso è nella i-esima componente di w, individua la i-esima riga di H nel
calcolo della sindrome di w:
i
h
w·H =e·H =
i
β ,β
i
h
=
3i
(6.12)
s1 , s3
Tale caso si verifica se calcolando la sindrome si ha che s31 = s3 .
• Se si è nel caso in cui vi sono due errori nella trasmissione di w ed essi sono nelle
posizioni i-sima e j-esima, con i 6= j, allora l’errore utilizzato per correggere
w(x) è e(x) = xi +xj . Infatti la sindrome di w, per il teorema 18 del capitolo 3,
è la combinazione lineare delle righe i-esima e j-esima di H, cioè:
h
w·H =e·H =
i
i
j
3i
β + β ,β + β
3j
h
=
i
s 1 , s3
.
Consideriamo il seguente sistema di equazioni risultante:

 β i + β j = s1
 β 3i + β 3j = s .
3
Poichè:
β 3i + β 3j = (β i + β j )(β 2i + β i+j + β 2j ),
ed inoltre:
s21 = (β i + β j )2 = β 2i + β 2j ,
allora è possibile scrivere:
s3 = β 3i + β 3j = (β i + β j )(β 2i + β 2j + β i+j ) = s1 (s21 + β i+j ),
142
(6.13)
6.6 Schema di codifica per codici 2-BCH
Da cui si ottiene:
s3
+ s21 = β i+j .
s1
È possibile pensare β i e β j come radici dell’equazione di secondo grado:
x2 + (β i + β j )x + β i+j = 0.
Tale polinomio prende il nome di Polinomio di individuazione di errore
ed esso può essere anche scritto mediante s1 e s3 , cioè:
x2 + s1 x + (
s3
+ s21 ) = 0
s1
(6.14)
Pertanto nel caso di un errore di peso due calcolata la sindrome nelle sue parti
s1 e s3 , mediante sostituzione si determinano le radici dell’equazione (6.14) e
si individua e(x).
Se la tecnica mostrata precedentemente non permette di determinare e(x), cioè non
si trovano soluzioni della (6.14), allora vuol dire che è accaduto un errore con peso
maggiore di due ed è necessario richiedere la ritrasmissione.
Esempio 12
Sia w la parola ricevuta la cui sindrome è composta da s1 = 0111 = w(β) e da s3 = 1010 =
w(β 3 ). Dalla tabella 6.1 si deduce che s1 = β 11 e s3 = β 8 , quindi:
s3
β8
+ s21 = 11 + β 22 = β 8 β −11 β 15 + β 7 β 15 = β 12 + β 7 = 1111 + 1101 = 0010 = β 2 ,
s1
β
e polinomio di individuazione di errore è:
x2 + β 11 x + β 2 = 0,
le cui soluzioni numeriche, determinate mediante sostituzione, sono β i = β 4 e β j = β 13 .
143
Capitolo 7
Codici Reed Solomon
7.1
Introduzione
In questo capitolo sono presentati i codici BCH, ma prima di trattare tali codici
consideriamo l’insieme dei polinomi appartenenti a GF (2r )[x], cioè i polinomi del
tipo
a0 + a1 x + a2 x2 + · · · + am xm ,
(7.1)
dove i coefficienti ai ∈ GF (2r ) per 0 ≤ i ≤ m. È chiaro che il polinomio della (7.1),
se ha grado minore di 2r − 1, può essere messo in corrispondenza biunivoca con la
parola di lunghezza n = 2r − 1 a0 a1 a2 · · · an .
Esempio 1
Il polinomio f (x) = 1 + β 2 x + β 4 x3 + x5 a coefficienti in GF (23 ) è messo in corrispondenza
biunivoca con la parola di lunghezza n = 23 − 1 = 7 1β 2 0β 4 010
144
7.1 Introduzione
Sia un α ∈ GF (2r ), è evidente che il polinomio minimo di α in GF (2r )[x] è mα =
x + α. Se α1 , α2 , α3 , ..., αt sono t elementi distinti, diversi da zero e appartenenti a
GF (2r ) e se C è un codice ciclico lineare di lunghezza n = 2r − 1, avente la proprietà
che ogni sua parola c(x) ∈ C ha αi , per 1 ≤ i ≤ t, come radice, cioè c(αi ) = 0, allora,
per quanto detto nei capitoli precedenti, si ha che il polinomio generatore di C è
g(x) = (x + α1 )(x + α2 )...(x + αt ) e tale polinomio ha grado t = n − k. Ogni parola
di c(x) ∈ C, inoltre, può essere rappresentata mediante il prodotto c(x) = a(x)g(x)
dove a(x) è un polinomio di grado minore di n − deg(g(x)), si lascia poi al lettore
la prova che g(x) divide il polinomio xn + 1.
Teorema 37 Se il polinomio generatore g(x) di un codice ciclico lineare, di lunghezza n = 2r − 1, ha grado deg(g(x)) = n − k, allora la dimensione di tale codice
è k, le sue parole hanno caratteri in GF (2r ), la sua cardinalità è |C| = 2rk e la sua
matrice generatrice è:


 g(x) 


 xg(x) 


G=
.
 ... 




xk−1 g(x)
(7.2)
Dim.
Tutte le implicazioni del teorema, ad eccezione della cardinalità del codice C, seguono dal teorema 30. La cardinalità di C è 2rk perchè ogni parola del codice può
essere espressa mediante una combinazione lineare delle k parole presenti in G nel
seguente modo
145
7.1 Introduzione
c(x) = a0 g(x) + a1 xg(x) + a2 x2 g(x) + · · · + ak−1 xk−1 g(x),
e ogni ai ∈ GF (2r ) per 0 ≤ i ≤ k − 1, quindi si ha che |C| = 2rk .
(7.3)
2
Esempio 2
Sia il campo GF (23 ) generato dal polinomio primitivo 1 + x + x3 consideriamo il codice
ciclico di lunghezza n = 7 e polinomio generatore:
g(x) = (β + x)(β + x2 )
= β 3 + β 4 x + x2 .
(7.4)
Tale codice ha matrice generatrice:

β3 β4 1 0 0 0


 0 β3 β4 1 0 0


3
4
G=
1 0
0 0 β β


 0 0 0 β3 β4 1

0 0 0 0 β3 β4

0


0


0



0

1
Il seguente lemma è in questo corso ritenuto uno strumento tecnico che sarà utilizzato
in seguito sia per ricavare la distanza dei codici BCH, che negli algoritmi di decodifica
utilizzati da tali codici.
Lemma 3 Se α1 , α2 , α3 , ..., αt sono t elementi diversi da zero appartenenti a GF (2r ),
allora si ha che:
146
7.1 Introduzione

2
1 α1 α1

1 α2 α2
2

det  . .
.
 .. ..
..


1 αt αt2

...
α1t−1 

Y
. . . α2t−1 

=
(αi + αj ).

.. 
...
.  16j<i6t

t−1
. . . αt
(7.5)
2
Esempio 2
Sia il campo di Galois GF (24 ) generato dal polinomio generatore x4 + x + 1, allora la
seguente matrice ha determinante:


2
4
β 
1 β


2
7
2
10
7
10
12 4 6
7
7
det 
β 14 
 = (β + β )(β + β )(β + β ) = β β β = β
1 β


1 β 10 β 5
Il seguente teorema permette di individuare un’importante disuguaglianza tra la
distanza di un codice BCH e il numero delle radici del polinomio generatore.
Teorema 38 Se g(x) = (β m+1 + x)(β m+2 + x)(β m+3 + x) . . . (β m+δ−1 + x), con
β i ∈ GF (2r ), m + 1 6 i 6 m + δ − 1, è il polinomio generatore di un codice BCH di
lunghezza n = 2r − 1, allora si ha che d > δ
Dim.
La matrice di parità per tale codice è:
147
7.1 Introduzione


1
1

 m+1
 β
β m+2


2
(m+1)2
H=
β (m+2)
 β

..
..

.
.


n−1
n−1
β (m+1)
β (m+2)
...
...
...
...
1
β
m+δ−1
2
β (m+δ−1)
..
.
n−1





,





(7.6)
. . . β (m+δ−1)
dove la matrice di parità H è una matrice n × (δ − 1). Per provare il teorema è necessario provare che comunque si determinano δ −1 righe in H esse sono linearmente
indipendenti.
Si determinino in H δ − 1 righe arbitrarie, esse permettono di determinare una
matrice quadrata A di dimensione (δ − 1) × (δ − 1)


m+1 j1
m+2 j1
)
(β
)
 (β

 (β m+1 )j2
(β m+2 )j2

A=
..
..

.
.


(β m+1 )jδ−1 (β m+2 )jδ−1
...
...
(β
m+δ−1 j1
(β
m+δ−1 j2
)
...




.



)
..
.
(7.7)
. . . (β m+δ−1 )jδ−1
Se si calcola il determinante di A e si tengono conto delle proprietà dei determinanti,
si ha che il determinante di A è uguale al determinante della matrice B moltiplicato
per la quantità (β m+1 )j1 +j2 +...+jδ−1 , dove B è ottenuta da A dividendo le sue righe
rispettivamente per le quantità (β m+1 )j1 , · · · (β m+1 )jδ−1 .


j1
(β m+1 )j1 +j2 +...+jδ−1
j1 2
j1 δ−2
(β )
. . . (β )

1 β


j2 2
j2 δ−2 
1 β j 2
(β
)
.
.
.
(β
)


· det  .
.
..
..
..
..

 ..
.
.
.
.




jδ−1 δ−2
jδ−1 2
jδ−1
)
) . . . (β
(β
1 β
148
(7.8)
7.2 Codici Reed Solomon
Si ha che il determinante di A è uguale a (β m+1 )j1 +j2 +...+jδ−1
Q
(βij + βkj ) ed è certa-
mente diverso da zero, infatti (β m+1 )j1 +j2 +...+jδ−1 e |B| sono rispettivamente diversi
da zero, il primo perchè è un elemento diverso da zero di GF (2r ), mentre il secondo
per il lemma 3 perchè gli elementi β j , con m + 1 ≤ j ≤ m + δ − 1 sono a due a due
distinti e diversi da zero, quindi d > δ.
7.2
2
Codici Reed Solomon
I codici BCH definiti dal teorema 38 individuano i codici di Reed - Solomon
indicati anche con la simbologia RS(2r , δ) e per tali codici vale il seguente teorema
utile a definire i parametri n, k e d.
Teorema 39 Se C è un codice di Reed-Solomon RS(2r , δ), allora si ha che:
1. n = 2r − 1
2. k = 2r − δ
3. d = δ
4. |C| = 2rk
149
7.2 Codici Reed Solomon
Dim.
1. La dimostrazione è banale.
2. Il grado di g(x) è n − k = δ − 1, quindi segue che k = 2r − δ.
3. Per il teorema 38 si ha che d > δ, ma per il teorema del limite di Singleton si
ha che d − 1 6 n − k, sostituendo i valori di n e k in tale disuguaglianza si ha
che d 6 δ e quindi d = δ.
4. La dimostrazione è banale.
2
Poichè d = δ si ha che n−k = δ −1 = d−1 e ciò vuol dire che i codici Reed-Solomon
sono dei codici MDS .
La problematica legata alla rappresentazione delle parole di un codice RS(2r , δ) all’interno di una struttura hardware che utilizza simbologie binarie impone una nuova
rappresentazione di tali parole con parole binarie equivalenti. Tale rappresentazione
binaria può essere ottenuta sostituendo i caratteri appartenenti a GF (2r ) nelle parole del codice RS(2r , δ) con corrispondenti parole binarie di lunghezza r, quindi una
parola di lunghezza 2r −1 del codice RS(2r , δ), dopo tale sostituzione avrà lunghezza
r(2r − 1).
Esempio 2
Sia il campo GF (22 ) generato dal polinomio primitivo h(x) = 1 + x + x2 , tale campo ha
quattro parole la cui rappresentazione binaria è
GF (22 ) = {0 = 00; 1 = 10; β = 01; β 2 = 11}.
150
(7.9)
7.2 Codici Reed Solomon
00
000
00 00 00
10
β10
01 10 00
β0
β 2 β0
11 01 00
β 20
1β 2 0
10 11 00
01
0β1
00 01 10
11
ββ 2 1
01 11 10
β1
β 2 01
11 00 10
β 21
111
10 10 10
0β
0β 2 β
00 11 01
1β
βββ
01 01 01
ββ
β 2 1β
11 10 01
β 2β
10β
10 00 01
0β 2
01β 2
00 10 11
1β 2
β0β 2
01 00 11
ββ 2
β 2β 2β 2
11 11 11
β 2β 2
1ββ 2
10 01 11
Tabella 7.1: Parole binarie di un codice RS(4, 2)
151
7.2 Codici Reed Solomon
Sia g(x) = β + x il polinomio minimo che genera il codice RS(4, 2) avente lunghezza n = 3,
dimensione k = 2 e distanza d = 2, inoltre |C| = 16. La matrice generatrice di tale codice
è


β 1 0

G=
0 β 1
La tabella 7.1 da’ una rappresentazione delle parole di RS(4, 2). In essa nella prima colonna
sono rappresentate tutte le possibili combinazioni lineari delle righe di G, nella seconda
colonna le parole di RS(4, 2) sono espresse mediante l’alfabeto individuato dagli elementi
di GF (22 ) e nella terza colonna le parole sono espresse mediante l’alfabeto binario. In
quest’ultima colonna gli elementi di GF (22 ) sono sono stati sostituiti da parole binarie di
lunghezza due secondo le corrispondenze in GF (22 ) (7.9).
Consideriamo adesso in un codice RS(2r , δ) tutte le sue parole che hanno gli ultimi
s caratteri uguali a zero. Una qualunque combinazione lineare di queste parole deve
generare una parola avente gli ultimi s caratteri uguali a zero, allora è possibile
eliminare in tali parole gli ultimi s caratteri ottenendo così un sotto codice C(s) di
RS(2r , δ), detto codice s-ridotto, avente lunghezza n0 = 2r −1−s. Dalla tabella 7.1
si può vedere che le uniche parole del codice RS(4, 2) che hanno l’ultimo carattere
uguale a zero sono {000; β10; β 2 β0; 1β 2 0}, da esse si ricava il codice 1-ridotto:
C(1) = {00; β1; β 2 β; 1β 2 }.
Teorema 40 Sia un codice RS(2r , δ) e sia C(s) un suo codice s-ridotto avente
parametri (n0 , k 0 , d0 ), allora si ha che
1. La lunghezza n0 è 2r − 1 − s;
152
7.3 Correzione di un codice RS(2r , δ)
2. La matrice generatrice di C(s) è






0
G =



g(x)


xg(x) 



...


k−s−1
x
g(x)
(7.10)
3. La dimensione k 0 è 2r − δ − s
4. La distanza d0 è δ
5. |C(s)| = 2rk
0
Dim.
Per provare tale teorema è solo necessario provare che la distanza di C(s) è uguale a
δ. È chiaro che essendo C(s) un sotto codice di RS(2r , δ), allora si ha che d0 ≥ d = δ.
Per il teorema 22 si ha che d0 − 1 ≤ n0 − k 0 , utilizzando i valori di n0 e k 0 , si ha che
d0 ≤ n0 − k 0 + 1 = δ, quindi d0 = δ.
2
Il teorema precedente permette di determinare un codice di minore lunghezza del
codice RS(2r , δ), che ha una dimensione minore, ma che mantiene la distanza di
RS(2r , δ), inoltre poichè d0 − 1 = n0 − k 0 = δ − 1, allora si ha che tale codice è anche
un codice M DS.
7.3
Correzione di un codice RS(2r , δ)
Il problema dell’algoritmo di correzione dei codici 2-BCH era legato all’individuazione dei bits che erano stati alterati in trasmissione. Tale problema permetteva di
153
7.3 Correzione di un codice RS(2r , δ)
correggere la parola ricevuta modificando i bits alterati da 0 a 1 oppure da 1 a 0.
Con i codici BCH non solo è necessario individuare la posizione dei caratteri alterati, ma è anche necessario determinare gli elementi di GF (2r ) che devono essere
sommati a tali caratteri per ottenere la correzione della parola. Nella correzione
degli errori di un codice BCH si ha quindi la necessità non solo di individuare la posizione dell’errore mediante una quantità detta localizzatore di errore, ma anche
la grandezza necessaria per effettuare la correzione, ad esempio il localizzatore di
errore che assume valore β i individua la posizione i + 1, mentre la grandezza β m è
la quantità che bisogna aggiungere al carattere i + 1-esimo della parola ricevuta che
non appartiene al codice
Esempio 3
Sia il campo di Galois GF (23 ) avente polinomio primitivo 1+x+x3 e sia v(x) = β 3 β 4 β 0 0000
la parola inviata e w(x) = β 3 β 4 β 5 0000. È evidente che è stato alterato il terzo carattere
della parola v(x) cioè il localizzatore di errore è β 2 , mentre la quantità che bisogna aggiungere al terzo carattere è la grandezza β 4 = β 0 + β 5 quindi la parola errore che deve essere
sommata a w(x) è e(x) = 00β 4 0000.
Sia un codice Reed-Solomon RS(2r , δ), poichè ha distanza d = δ esso è un codice
t = b δ−1
c correttore. Sia w(x) una parola ricevuta non appartenente al codice e
2
siano a1 a2 . . . ae i localizzatori di errore e b1 b2 . . . be le grandezze ad essi legati, dove
e ≤ t è il numero di caratteri che sono stati alterati in w(x), cioè poniamo ai = 0
per e + 1 6 i 6 t .
La sindrome di w(x) è s = sm+1 sm+2 . . . sm+δ−1 dove sj = w(β j ), m + 1 6 j 6
m + δ − 1 e con β j radici del polinomio generatore g(x).
Per quanto detto precedentemente otteniamo
154
7.3 Correzione di un codice RS(2r , δ)
w(β j ) = v(β j ) + e(β j ) = e(β j ) =
X
(bi aji ),
(7.11)
i
un sistema non lineare avente 2e incognite e δ − 1 equazioni. Tale sistema essendo
non lineare è di difficile soluzione. Cerchiamo di risolvere il problema individuando
un polinomio che permette di individuare i localizzatori di errore. Tale polinomio
sarà del tipo:
σA (x) = (a1 + x)(a2 + x) . . . (ae + x),
(7.12)
che può anche essere scritto nel seguente modo
σA (x) = σ0 + σ1 x + . . . + σe−1 xe−1 + xe .
(7.13)
È possibile moltiplicare ambo i membri del polinomio (7.13) per le quantità bi aji ,
con 1 6 i 6 e, si ottengono le seguenti equazioni:
bi aji σA (x) = σ0 bi aji + σ1 bi aji x + . . . + σe−1 bi aji xe−1 + bi aji xe .
(7.14)
Se in σA si pone x = ai , allora si ha che σ(ai ) = 0, per 1 ≤ i ≤ e, e dall’equazione
(7.14) si ha che
0 = σ0 bi aji + σ1 bi aj+1
+ . . . + σe−1 bi aij+e−1 + bi aij+e .
i
Sommando le (7.15) rispetto a i si ottiene
155
(7.15)
7.3 Correzione di un codice RS(2r , δ)
0 = σ0
t
X
bi aji
+ σ1
i=1
t
X
bi aj+1
i
+ . . . + σe−1
i=1
t
X
bi aij+e−1
i=1
+
t
X
bi aij+e ;
i=1
0 = σ0 sj + σ1 sj+1 + . . . + σe−1 sj+e−1 + sj+e ;
(7.16)
sj+e = σ0 sj + σ1 sj+1 + . . . + σe−1 sj+e−1 .
L’ultima equazione delle (7.16) definisce, per m + 1 6 j 6 m + e, un sistema di
equazioni lineari nell’incognite σi , con 1 ≤ i ≤ e − 1, che si può rappresentare in
forma matriciale nel seguente modo:





sm+1 sm+2 . . . sm+e   σ0  sm+e+1 


 

sm+2 sm+3 . . . sm+e+1   σ1  sm+2+e 


 

 .
 .  =  . .
.
.
.
 ..

 

..
..
.. 

  ..   .. 


 

sm+e sm+e+1 . . . sm+2e
σe−1
sm+2e
(7.17)
Tale sistema è un sistema di e equazioni in e incognite e la sua matrice incompleta
può essere scritta nel seguente modo:







M =





1
...
a1
...
a21
..
.
...
..
.
ae−1
...
1
|
{z
Q
6=0,

1 
m+1

...
0 
 b1 a1
e−1
ae 
1
a
.
.
.
a


1
1
..  
  ..

 .
b2 am+1
.  . .
2
.
.. 
2 
.
.
.


ae 
.
. ,
..   . .
..
 ...


.
. 
..  
e−1
 1 ae . . . ae
. 

|
{z
}
0
...
be am+1
e
6=0,ai 6=aj ,i6=j
ae−1
|
{z
}
e
6=0,det6=0
}
(ai +aj )
tale matrice ha determinante diverso da zero, quindi per il teorema di Cramer si
ha che esiste un’unica soluzione σ̄0 , σ̄1 , . . . , σ̄e−1 del sistema (7.17), tale soluzione
156
7.3 Correzione di un codice RS(2r , δ)
permette di individuare il polinomio (7.13) e quindi i localizzatori ā1 , ā2 , . . . , āe . Il
sistema (7.11) adesso è un sistema di equazioni lineari nelle incognite b1 b2 . . . be come
è rappresentato sotto.
 

m+1
ā1
ām+1
2

ām+2 ām+2
2
 1
 .
..
 ..
.


ām+e
ām+e
1
2
|
{z
...


ām+1
e
 b1 
sm+1 
  

 b2  sm+2 
. . . ām+2
e
  

.=
.
..
.. 
 ..   . . . 
.
. 
  

  

. . . ām+e
b
s
e
m+e
e
}
M 00
Tale sistema è un sistema che ha e equazioni e e incognite e, per il lemma 3, si ha
che il determinante della sua matrice incompleta è diverso da zero, quindi per il
teorema di Cramer si ha che tale sistema ammette un’unica soluzione b̄1 , b̄2 , . . . , b̄e
individuata dalle grandezze legate ai localizzatori ā1 , ā2 , . . . , āe . I localizzatori e le
grandezze determinate permettono di correggere la parola ricevuta w(x).
157
7.3 Correzione di un codice RS(2r , δ)
PUBBLICATO IN PROPRIO PRESSO IL DIPARTIMENTO DI MATEMATICA E INFORMATICA, FACOLTA’ DI INGEGNERIA, UNIVERSITA’ DI CATANIA,
IL 06/02/2008.
158
Indice analitico
alfabeto, 1
codice sistematico, 64
Algoritmo di Huffman, 15
codice univocamente decifrabile, 4
BCH, 140
BCH 2-correttori, 140
bits di parità, 64
codici 2-BCH, 141
codici di Hamming, 137
codici MDS, 84, 150
codici Reed Solomon, 149
Campi di Galois, 127
Campo di Galois, 129
capacità del canale, 26
colonna leading, 51
coset, 66
coset leader, 70
caratteri, 1
CMLD, 39
dimensione, 50
codice, 2
distanza, 30, 31, 37, 48
codice s-ridotto, 152
distanza di Hamming, 37
codice ciclico, 109, 113
disuguaglianza triangolare, 37
codice di Golay esteso , 94
efficienza del canale, 28
codice di Hamming, 91
entropia condizionata, 25
codice equivalente, 64
entropia congiunta, 24
codice esteso, 86
errore, 35, 41, 42
codice istantaneo, 5
errore polinomiale, 120
codice lineare, 47
codice ortogonale, 49
codice ottimo, 13
codice perfetto, 89
funzione di assegnazione, 2
funzione entropia, 19
generatori, 49
159
INDICE ANALITICO
grandezza, 154
shift ciclico, 109
sindrome, 71
IMLD, 39
sindrome polinomiale, 120
leading, 51
sorgente di un codice, 1
Limite di Gilbert-Varshamov, 83
teorema di Kraft, 6
Limite di Hamming, 77
teorema di McMillan, 10
Limite di Singleton, 79
localizzatore di errore, 154
lunghezza media, 2
matrice di parità, 54
matrice generatrice, 53, 117
MLD, 37
ordine di un elemento, 131
peso, 35
Polinomio di individuazione di errore, 143
polinomio generatore, 115
polinomio irriducibile, 124
polinomio minimo, 132, 135
polinomio primitivo, 125, 126
proprietà del prefisso, 5
radice, 131
ridotta parzialmente, 51
ridotta totalmente, 53
schema di codifica, 2
SDA, 74
160
Scarica

appunti di teoria dei codici - Dipartimento di Matematica e Informatica