Note della lezione 16

Teoria dell’Informazione II
Anno Accademico 2013–2014
Lezione 16
Ugo Vaccaro
Nella Lezione scorsa abbiamo introdotto una classe di codici a correzione di errore (codici di Hamming) in grado
di correggere tutte le possibili occorrenze di un errore che potevano capitare durante la trasmissione di parole
del codice. In questa lezione introdurremo una generalizzazione dei codici di Hamming e proveremo che essi sono
in grado di correggere un numero maggiore di errori. In via preliminare, abbiamo bisogno di ricordare alcune
propiet`
a di base dei campi finiti.
Denotiamo con F2 il campo con elementi {0, 1}, munito dell’operazione di addizione e moltiplicazione modulo 2.
Con F2m denoteremo il campo composto da tutti i 2m vettori binari di lunghezza m. L’operazione di addizione
in F2m `e la solita operazione di addizione vettoriale, ovverosia se a, b ∈ F2m , allora a + b = c ∈ F2m , ed il vettore
c ha come i-esima componente la somma (modulo 2) della i-esima componente di a e b.
Per definire un’opportuna operazione di moltiplicazione in F2m , `e utile vedere gli elementi (vettori) di F2m come
polinomi di grado al pi`
u m − 1. Ovvero, dato il vettore a = (a0 , a1 . . . , am−1 ), esso lo vedremo come il polinomio
a(x) = a0 + a1 x + . . . + am−1 xm−1 . Un polinomio p(x) di grado > 1 a coefficienti in F2 `e detto polinomio
irriducibile se esso non `e divisibile per nessun altro polinomio a coefficienti in F2 . Si pu`o vedere che un polinomio
m
irriducibile su F2 necessariamente divide il polinomio x2 −1 + 1. Un polinomio p(x) a coefficienti in F2 `e detto
m
polinomio primitivo se esso `e un polinomio irriducibile (quindi divide x2 −1 + 1), e non divide xn + 1 per ogni
n < 2m − 1. Polinomi primitivi esistono e sono noti per ogni m. Ad esempio, i seguenti polinomi sono primitivi
su F2 : m = 3, x3 + x + 1 m = 4, x4 + x + 1 m = 5, x5 + x2 + 1. A questo punto, definiamo la seguente regola di
moltiplicazione tra vettori in F2m . Dati a, b ∈ F2m , porremo
a · b = c se e solo se c(x) = a(x)b(x) mod p(x)
(1)
m
dove p(x) = pm x + . . . + p0 = `e un polinomio primitivo. Si pu`o vedere facilmente che in questo modo l’insieme
F2m − {0} `e un gruppo commutativo. Ne segue che F2m munito dell’operazione di addizione prima definita e
della operazione di moltiplicazione (1) `e un campo finito.
Sia ora p(x) = p0 + p1 x + . . . + pm xm un polinomio primitivo di grado m su F2 , e sia α una radice di p(x).
m
Ogni radice di p(x) viene detta radice primitiva. Poich`e per definizione p(x) divide x2 −1 + 1, otteniamo che
m
m
m
x2 −1 + 1 = q(x)p(x), per qualche polinomio q(x), da cui α2 −1 + 1 = q(α)p(α) = 0, e quindi α2 −1 = 1. Ci`
o
m
che `e interessante, `e che `e possibile provare che le successive potenze 1 = α0 , . . . , α2 −2 sono tutti gli elementi di
Vm (F2 ), tranne 0, in altri termini α `e un generatore del gruppo (moltiplicativo) F2m − {0}.
Vediamo un esempio. Sia m = 3, sia dato il polinomio primitivo x3 + x + 1 e sia α radice primitiva, per cui
α3 + α + 1 = 0, il che `e equivalente a dire che α3 = α + 1. Il campo F23 ha ovviamente 8 elementi, che possono
essere rappresentati come 8 potenze di α, oppure come 8 polinomi su F2 di grado al pi`
u 2, oppure come vettori
binari a tre componenti, come mostrato nella tabella di seguito:
αi
α0 = 1
α1
α2
α3
α4
α5
α6
α7
0
α
α
α2
α+1
α(α + 1) = α2 + α
α(α2 + α) = α2 + α + 1
α(α2 + α + 1) = α2 + 1
α(α2 + 1) = 1
polinomio (grado ≤ 2)
1
x
x2
x+1
x2 + x
x2 + x + 1
x2 + 1
1
vettore (a2 , a1 , a0 )
001
010
100
011
110
111
101
´ inoltre semplice calcolare l’inverso di un elemento attraverso la identit`a α−i = αn−i , dove n = 2m − 1.
E
Ritorniamo ora per un momento
ai codici di Hamming
introdotti la lezione scorsa. Ricordiamo che essi erano
definiti come codici C = x ∈ {0, 1}n : HxT = 0 , dove H `e la matrice binaria le cui colonne sono tutti i
m
possibili 2m − 1 vettori binari 6= 0 lunghi m ed m `e un generico intero. Quindi C avr`a 22 −m−1 parole, ciascuna
di lunghezza 2m − 1. Un modo formalmente diverso, ma sostanzialmente equivalente, di scrivere la matrice H di
un codice di Hamming `e il seguente: se α `e radice primitiva di F2m , allora
H = [α0 , α, . . . , αn−1 ].
I codici di Reed-Solomon di parametri
n e t, dove n = 2m − 1 per qualche intero m e t `e un intero ≥ 1, sono
definiti come quei codici C = x ∈ {0, 1}n : HxT = 0 dove la matrice H `e cos`ı composta:
 0
α
α0

H= .
 ..
α
α2
...
...
..
.

αn−1
α2(n−1) 


..

.
α0
α2t
...
α2t(n−1)
dove α `e radice primitiva di F2m . In altri termini, un vettore c = (c0 , . . . , cn−1 ), dove ci ∈ Vm (F2 ) per ogni
i = 0, . . . , n − 1, `e una parola codice del codice di Reed-Solomon di parametri n e t (denotato con RS(n, t)) se e
solo se valgono le condizioni
n−1
X
αij ci = 0, j = 1, . . . , 2t.
(2)
i=0
Notiamo che ciascun ci `e esso stesso un vettore binario ad m componenti, per cui se scrivessimo una parola
c = (c0 , . . . , cn−1 ) ∈ RS(n, t) in binario, essa conterrebbe mn = m(2m − 1) bits.
Cerchiamo ora di scoprire qual `e la capacit`
a di correzione di errore del codice RS(n, t). Ricordiamo a tal proposito
il risultato fondamentale visto la lezione scorsa, secondo il quale un generico codice C `e in grado di correggere t
errori se e solo se wmin(C) ≥ 2t + 1. Ricordiamo anche che ogni vettore c = (c0 , . . . , cn−1 ), pu`o anche essere visto
come il polinomio c(x) = c0 + c1 + . . . + cn−1 xn−1 . Secondo questa corrispondenza, e dalla (2), otteniamo che
c ∈ RS(n, t) ⇔
n−1
X
αij ci = 0,
j = 1, . . . , 2t
(3)
i=0
⇔ c(αj ) = 0
j = 1, . . . , 2t
(4)
In altri termini, c = (cn−1 , . . . , c0 ) ∈ RS(n, t) se e solo il corripondente polinomio c(x) = cn−1 xn−1 + . . . + c1 x + c0
si annulla nei punti αj , j = 1, . . . , 2t. Quindi RS(n, t) consta di tutti i polinomi a coefficienti su F2m , di grado al
pi`
u n − 1, che sono multipli del polinomio g(x) = (x − α) · · · (x − α2t ).
Lemma 1 Vale che wmin (RS(n, t)) = 2t + 1, per cui il codice RS(n, t) `e in grado di correggere tutte le possibili
occorrenze di t errori nelle parole codice.
Dimostrazione. Proviamo innanzitutto che wmin (RS(n, t)) ≤ 2t + 1. Da quanto prima detto, g(x) = (x −
α) · · · (x−α2t ) ∈ RS(n, t). Essendo g(x) di grado 2t, esso avr`a al pi`
u 2t+1 coefficienti 6= 0, siano essi (g0 , . . . , g2t ).
Ne segue che il vettore associato g = (g0 , . . . , g2t , 0, . . . , 0), di lunghezzza n appartenente a RS(n, t), ha peso di
Hamming w(g) ≤ 2t + 1, per cui wmin (RS(n, t)) ≤ 2t + 1.
Per provare la diseguaglianza opposta wmin (RS(n, t)) ≥ 2t + 1, ricordiamo il Corollario 1 della precedente lezione,
il quale affermava che per codici lineari wmin (C) = minimo numero di colonne di H la cui somma `e uguale a 0, ,
ovvero wmin (C) =minimo numero di colonne di H linearmente indipendenti. Consideriamo ora una generica
2
sottomatrice H 0 di H definente il codice RS(n, t), composta da r ≤ 2t arbitrarie colonne e prime r righe. Essa
avr`
a la forma


γ1 . . . γ r
γ12 . . . γr2 


H0 = 
,
..


.
r
r
γ1 . . . γ r
e calcoliamocene il determinante Det(H 0 ). Si ha:

Det(H 0 )
1
γ1
..
.
...
...
..
.


(γ1 · · · γr )Det 

γ1r−1 . . .
Y
= γ1 · · · γr
(γj − γi ) 6= 0
=
1
γr
..
.





γrr−1
i<j
dove abbiamo certamente riconosciuto la familiare forma delle matrici di Vandermonde, e quindi del loro determinante. Ne consegue che qualunque insieme di al pi`
u 2t colonne di H `e composto da colonne linearmente
indipendenti, per cui wmin (RS(n, t)) ≥ 2t + 1, il che conclude la prova del Lemma.
Il Lemma appena visto afferma che, usando una decodifica a minima distanza, `e possibile ricostruire la parola
codice del codice RS(n, t) originalmente trasmessa conoscendo la versione corrotta di essa, purch`e non si siano
verificati pi`
u di t errori nella trasmissione. Ma come realizzare questa operazione di correzione in pratica, ovvero
come trovare velocemente, a partire dal vettore ricevuto l’unica parola del codice RS(n, t) a distanza al pi`
u t da
esso? Il problema `e di grande importanza pratica, in quanto i codici RS(n, t) sono effettivamente usati in vari
contesti. Ad esempio, i codici RS(n, t) sono usati per memorizzare dati su Compact Disc, per la realizzazione
dei codici a barra che appaiono sui prodotti nei supermercati, per la trasmissione dati da sonde spaziali (ad
es., Mars Pathfinder, Galileo, Mars Exploration Rover e la sonda Cassini). Per derivare un metodo efficiente di
correzione di errori per i codici RS(n, t), da questo punto in poi identificheremo ogni vettore c = (cn−1 , . . . , c0 )
con il corripondente polinomio C(x) = cn−1 xn−1 + . . . + c1 x + c0 .
Sia quindi la parola trasmessa pari a C(x) = c0 + . . . + cn−1 xn−1 e sia R(x) = r0 + . . . + rn−1 xn−1 il vettore
(polinomio) ricevuto. Sar`
a accaduto un errore nella posizione i se e solo se ri 6= ci . Sia ei = ri − ci . Definiamo
il polinomio E(x) = e0 + . . . + en−1 xn−1 (detto polinomio valutatore di errore). Ovviamente varr`a R(x) =
C(x) + E(x), e l’operazione di correzione d’errore `e equivalente a scoprire il polinomio E(x) a partire da R(x).
Supponiamo che siano occorsi γ errori nelle posizioni j1 , . . . , jγ , ci`o implica che i coefficienti ej1 , . . . , ejγ di E(x)
sono 6= 0, mentre i restanti coefficienti ei sono nulli, per cui E(x) = ej1 xj1 + . . . + ejγ xjγ . Definiamo β1 =
αj1 , . . . , βγ = αjγ e E1 = ej1 , . . . , Eγ = ejγ per cui E(x) = E1 xj1 + . . . + Eγ xjγ . Calcoliamo ora il vettore
S = (s1 , . . . , s2t ) = HRT (detto vettore sindrome). Risulta
si
=
(riga ima di H)R = (αi , . . . , αij , . . . , αi(n−1) )(r0 , . . . , rn−1 )
= r0 + r1 αi + . . . + rj αij + . . . + rn−1 αi(n−1)
= R(αi )
Essendo
S = HRT = H(C + E)T = HC T + HE T = HE T
in quanto ovviamente HC T = 0 poich`e C `e una parola codice di RS(n, t), otteniamo che
si
=
E(αi ) = e0 + e1 αi + . . . + en−1 αi(n−1)
=
E1 αij1 + . . . + Eγ αijγ
=
E1 β1i + . . . + Eγ βγi =
γ
X
j=1
3
Ej βji .
Quindi ciascuna componente del vettore sindrome `e funzione del vettore degli errori E occorso, e non della parola
C trasmessa. Proviamo ora che ciascun coefficiente si del vettore (polinomio) sindrome, i = 1, . . . , 2t, che avevamo
visto essere anche uguale al valore che il polinomio R(x) assume in αi (ovvero R(αi )) `e anche uguale al valore che
il polinomio resto della divisione di R(x) per (x + αi ) assume nel punto αi . Infatti, dividendo R(x) per (x + αi )
otteniamo R(x) = qi (x)(x + αi ) + bi , dove qi (x) `e il polinomio quoziente e bi `e il resto (necessariamente di grado
0, in quanto deve essere di grado minore del divisore (x + αi ), da cui
R(αi ) = qi (αi )(αi + αi ) + bi = bi ,
essendo ovviamente αi + αi = 0, nell’aritmetica di F2m .
Notiamo ora che per scoprire chi `e il polinomio E(x) = ej1 xj1 + . . . + ejγ xjγ , che ci permetterebbe di ricostruire la
parola trasmessa C(x) a partire dal vettore ricevuto R(x), occorre sia trovare le posizioni degli errori (j1 , . . . , jγ )
che il valore degli errori (E1 , . . . , Eγ ). Ricordando che abbiamo posto β1 = αj1 , . . . , βγ = αjγ , possiamo definire il
polinomio locatore degli errori come quel polinomio σ(x) che ha come radici i valori β1−1 , . . . , βγ−1 . Il nome di σ(x)
`e giustificato dal fatto che dalla conoscenza delle sue radici β1−1 = αj1 = αn−j1 , . . . , βγ−1 = αjγ = αn−jγ , possiamo
dedurre le posizioni degli errori (j1 , . . . , jγ ). Ovviamente, σ(x) `e per il momento incognito, facciamo vedere, per`
o,
che esso pu`
o essere calcolato a partire dalle quantit`a a noi note s1 = R(α), . . . , s2t = R(α2t ). Esprimiamo σ(x)
come
σ(x) = (1 + β1 x) . . . (1 + βγ x) = 1 + σ1 x + . . . + σγ x
e diamo un metodo per calcolare σ1 , . . . , σγ a partire da s1 = R(α), . . . , s2t = R(α2t ).
Poich´e σ(β`−1 ) = 0, ∀` = 1, . . . , γ, vale anche che per ogni j ≤ 2t
0
=
=
γ
X
`=1
γ
X
E` β`j+γ σ(β`−1 )
E` β`j+γ (1 + σ1 β`−1 + . . . + σγ β`−γ )
`=1
=
γ
X
E` β`j+γ + σ1
`=1
=
γ
X
E` β`j+γ−1 + . . . + σγ
`=1
γ
X
E` β`j
`=1
sj+γ + σ1 sj+γ−1 + . . . + σγ sj
Ovvero, sγ+j = σ1 sj+γ−1 + . . . + σγ sj , per ogni j, per cui i valori σi incogniti soddisfano il seguente sistema di
equazioni lineari
sγ+1
=
sγ+2
= σ1 sγ+1 + . . . + σγ s2
...
s2γ
σ1 sγ + . . . + σγ s1
...
= σ1 s2γ−1 + . . . + σγ sγ
che in forma matriciale si pu`
o scrivere come:

s1
 s2

. . .
sγ

 

...
sγ
σγ
sγ+1

 

. . . sγ+1 
 σγ−1  = sγ+2 
...
...  ...   ... 
. . . s2γ−1
σ1
s2γ
Proviamo ora il seguente importante risultato.
4
(5)
Teorema 1 La

s1
 s2
M =
. . .
sµ
matrice
s2
s3
...
sµ+1

...
sµ
. . . sµ+1 

...
... 
. . . s2µ−1
ha determinante diverso da 0 (e quindi `e invertibie) se µ = γ =# errori occorsi nella trasmissione, determinante
nullo se µ > γ.
Dimostrazione. Innanzitutto ricordiamo la relazione esistente tra i valori delle sindromi si , i valori degli errori
Ei e i valori βi = αji che permettevano la individuazione delle posizioni dove sono occorsi gli errori:
s1 = E1 β1 + E2 β2 + . . . + Eγ βγ
s2 = E1 β12 + E2 β22 + . . . + Eγ βγ2
...
...
s2t = E1 β12t + E2 β22t + . . . + Eγ βγ2t
Definiamo le quantit`
a Xi come
(
βi
Xi =
0
per i = 1, . . . , γ
per i > γ
Per ogni intero µ, consideriamo ora la seguente matrice (di Vandermonde) A che ha come generico elemento Aij
nella riga i e colonna j il valore Aij = Xji−1 , ovvero


1
1
...
1
 X1
X2
...
Xµ 

A=
 ...
...
...
... 
X1µ−1 X2µ−1 . . . Xµµ−1
e la matrice B che ha ha come generico elemento Bij nella riga i e colonna j il valore Aij = Ei Xi δij , dove
(
1 se i = j
δij =
0 se i 6= j.
Ovvero

E1 X1
 0
B=
 ...
0
0
E2 X2
...
0

...
0
...
0 

...
... 
. . . Eµ Xµ
dove conviene ricordare che Eµ = 0 per µ > γ, in quanto il numero di errori occorsi `e pari a γ e quindi il
valore degli errori per µ > γ `e ovviamente nullo. Consideriamo ora la matrice prodotto (ABAT ) e calcoliamone
esplicitamente l’elemento nella riga i-esima e colonna j-esima, ovvero
(ABAT )ij =
µ
X
X`i−1
`=1
=
=
µ
X
`=1
µ
X
µ
X
E` X` δ`k Xkj−1
k=1
X`i−1 E` X` X`j−1
E` X`i+j−1
`=1
= si
5
Ne segue che M = ABAT , da cui segue anche che
det(M ) = det(A)det(B)det(A).
Ricordiamo che se µ > γ, allora Eµ = 0, il che implica che per µ > γ vale det(B) = 0 = det(M ). D’altra parte,
se µ = γ, allora ovviamente det(B) 6= 0. Inoltre, se µ = γ tutte le colonne si A sono differenti tra di loro, per cui
anche il determinante della matrice di Vandermonde A `e non nullo, per cui anche det(M ) 6= 0. Ci`o conclude la
dimostrazione del Teorema.
Il Teorema 1 `e alla base dell’algoritmo di correzione degli errori per i codici RS(n, t). Innanzitutto possiamo
trovare il numero esatto di errori nel modo seguente. Come primo tentativo poniamo γ = t, dove t `e il numero
massimo che il codice RS(n, t) pu`
o correggere. Calcoliamo poi il determinante della matrice M cos`ı ottenuta. Se
tale determinante `e diverso da zero, allora abbiamo trovato il valore corretto di γ, altrimenti decrementiamo il
valore tentativo di γ di 1 e continuiamo, fin quando troveremo una matrice con determinante diverso da zero. In
virt`
u del Teorema 1, avremo trovato l’esatto numero di errori γ occorso durante la trasmissione. A questo punto
invertiamo la matrice M e risolviamo il sistema di equazioni (5), ovvero

s1
 s2

. . .
sγ

 

...
sγ
σγ
sγ+1

 

. . . sγ+1 
 σγ−1  = sγ+2 
...
...  ...   ... 
. . . s2γ−1
σ1
s2γ
(6)
per calcolarci i coefficienti σ1 , . . . , σγ e quindi il polinomio locatore degli errori
σ(x) = 1 + σ1 x + . . . + σγ x = (1 + β1 x) . . . (1 + βγ x).
Da esso, calcolandocene le radici e facendone gli inversi, scopriremo le locazioni degli errori, ovvero dove sono
occorsi gli errori duranta la trasmissione della parola c(x). Ci restano da scoprire i valori degli errori, ovvero le
quantit`
a E1 , . . . , Eγ . A tal fine, ricordiamo che valeva la seguente espressione
si = E1 β1i + . . . + Eγ βγi =
γ
X
Ej βji ,
i = 1, . . . , 2t
j=1
che pu`
o essere scritta in
  
β1 . . .
s1
 s2   β12 . . .
 =
. . .  . . . . . .
s2t
β12t . . .
forma matriciale come
 
βγ
E1
 E2 
βγ2 
 
. . .  . . .
βγ2t
Eγ
Questo `e un sistema di 2t equazioni lineari nelle γ incognite E1 , . . . , Eγ (ricordiamo che i valori βij li abbiamo
scoperti). Potremmo scoprire i valori incogniti E1 , . . . , Eγ usando le prime γ equazioni del sistema di sopra se
e solo se esse sono linearmente indipendenti, ovvero se il determinante della matrice che otteniamo da quella di
sopra considerando solo le prime γ righe `e diverso da zero. Ma possiamo osservare che vale la seguente uguaglianza




1
...
1
β1 . . . β γ

 β1
 β12 . . . βγ2 
...
βγ 




det 
. . . . . . . . . = (β1 · β2 · . . . · βγ )det  . . . . . . . . . .
β1γ . . . βγγ
β1γ−1 . . . βγγ−1
La matrice al membro destro `e la familiare matrice di Vandermonde, che ha determinante diverso da zero se e
solo se i valori β1 , β2 , . . . , βγ sono distinti tra di loro, il che `e il caso in quanto essi sono univocamente associati
alle differenti locazioni dove sono occorsi gli errori.
6
A questo punto, il seguente algoritmo ci permette la correzione di errori.
Metodo (Peterson-Gorenstein–Ziegler)
1. Input: R(x)
2. Calcola s1 , . . . , s2t
3. Poni γ = t

s1
 s2

4. While Det 
. . .
sγ

 
σγ
s1
σγ−1   s2
 
5. 
 . . .  = . . .
σ1
sγ

...
sγ

. . . sγ+1 
 = 0 poni γ = γ − 1
...
. . . 
. . . s2γ−1
−1 

...
sγ
sγ+1


. . . sγ+1 
 sγ+2 


...
...
... 
. . . s2γ−1
s2γ
6. Trova le posizioni degli errori j1 , . . . , jγ , trovando le radici β1−1 = α−j1 , . . . , βγ−1 = α−jγ del polinomio locatore
degli errori σ(x) = (1 + β1 x) . . . (1 + βγ x) = 1 + σ1 x + . . . + σγ x

 
β1
E1
 E2   β12
 
7. 
 . . .  = . . .
Eγ
β1γ
...
...
...
...
−1  
βγ
s1
 s2 
βγ2 
  
. . . . . .
βγγ
sγ
Per trovare le radici del polinomio σ(x), il metodo pi`
u semplice `e di calcolare σ(αj ), per tutti i possibili valori
m
j = 0, 1, . . . , 2 − 1. Per velocizzare i calcoli, si usa una variante della cosiddetta regola di Horner, per cui, per
ogni β nel campo finito F2m , vale
σ(β) = (. . . (((σγ β + σγ−1 )β + σγ−2 )β + σγ−3 )β + . . . + σ0 ).
La regola di Horner richieder`
a γ moltiplicazioni e γ addizioni per calcolare σ(β). La parte onerosa, dal punto
di vista computazionale, `e rappresentata dai punti 5. e 7. dell’algoritmo prima visto, dove occorre calcolare
l’inverso di matrici. In pratica, si usano algoritmi pi`
u complessi dal punto di vista concettuale, ma pi`
u efficienti
dal punto di vista computazionale, ovvero che richiedono un numero di operazioni minore.
7