Prof.ssa Carla Fiori
Lezioni di
Algebra e Teoria dei Codici
Università di Modena e Reggio Emilia
Dipartimento di Scienze Fisiche, Informatiche, Matematiche
Questo documento è stato scritto in LATEX utilizzando l’editor LYX. I diagrammi invece sono stati prodotti utilizzando XY-Pic.
Quest’opera è stata rilasciata sotto la licenza Creative Commons AttribuzioneNon commerciale-Non opere derivate 2.5 Italia. Per leggere una copia della licenza
visita il sito web
http://creativecommons.org/licenses/by-nc-nd/2.5/it/
o spedisci una lettera a Creative Commons, 171 Second Street, Suite 300, San
Francisco, California, 94105, USA. Per ulteriori informazioni si prega di contattare Emanuele Bardelli, Marco Corghi e Dario Prandi agli indirizzi <mailto:51242@
unimore.it>, <mailto:[email protected]> o <mailto:[email protected]>.
\
=
$
BY:
Alcuni diritti riservati 2006-2007
This work is licensed under the Creative Commons Attribution-NoncommercialNo Derivative Works 2.5 Italy License. To view a copy of this license, visit
http://creativecommons.org/licenses/by-nc-nd/2.5/it/
or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco,
California, 94105, USA. For further information, please contact Emanuele Bardelli,
Marco Corghi e Dario Prandi at these e-mail addresses <mailto:51242@unimore.
it>, <mailto:[email protected]> or <mailto:[email protected]>.
\
=
$
BY:
Some Rights Reserved 2006-2007
Prefazione
Questi appunti raccolgono le lezioni del corso di Algebra e Teoria dei Codici , insegnamento fondamentale per la Laurea Magistrale in Matematica Computazionale e Modellistica, 6 cfu, 36 ore. Il docente, prof.ssa Carla Fiori, rende
reperibili questi appunti nella propria pagina web perchè siano a disposizione di
tutti gli studenti quale ausilio didattico.
i
Indice
Prefazione
i
Capitolo 1. Presentazione del corso
1. Programma del corso
2. Prerequisiti
3. Testi di riferimento
1
1
1
2
Capitolo 2. Generalità sui Codici
1. Introduzione
2. Trasmissione di un messaggio
3. Problemi di trasmissione
4. Canali di trasmissione. Canali simmetrici
5. Esempi. Codici: Fiscale, ISBN, Morse, ASCII.
3
3
4
5
7
9
Capitolo 3. Codici a Blocchi
1. Definizioni
2. Codici che rivelano e correggono errori. Distanza di Hamming.
3. Efficienza e Rapporto di separazione
4. Relazioni fra i parametri di un codice
5. (n, k)-codici, codici MDS, codici equivalenti
14
14
15
22
23
28
Capitolo 4. Codici Lineari
1. Definizioni e prime proprietà
2. Matrici generatrici
3. Codifica nei codici lineari
4. Decodifica dei codici lineari. Tabella standard
5. Codice duale e matrice di controllo
6. Decodifica dei codici lineari per sindrome
7. Codici lineari 1-correttori
8. L’enumeratore dei pesi di un codice lineare
9. Codice esteso
35
35
37
43
45
47
53
58
60
61
Capitolo 5. Codici Ciclici
1. Definizioni e proprietà
2. Polinomio generatore e matrice generatrice
3. Schemi di codifica
62
62
64
71
ii
INDICE
4. Polinomio di controllo e matrice di controllo
5. Decodifica
6. Codici BCH
iii
75
77
79
Capitolo 6. Codici di Hamming e codici perfetti
1. Definizioni e Proprietà
2. Codici di Hamming binari
3. Codici perfetti
84
84
87
88
Capitolo 7. Codici di Goppa
90
Capitolo 8. Codici correttori e gruppi di permutazioni
1. Gruppi come codici e distanza di Hamming
2. Gruppi strettamente k-transitivi
3. Uncoverings
4. Algoritmo di decodifica per gruppi strettamente k-transitivi
5. Uncovering dei gruppi di Mathieu M11 e M12
6. Estensione a gruppi non strettamente k-transitivi
7. Simboli ripetuti
8. Ottimizzazione
91
91
92
93
95
98
99
101
103
Capitolo 9. Elementi di Crittografia
1. Introduzione
2. Crittosistemi a chiave pubblica
3. Vantaggi, svantaggi, applicazioni dei crittosistemi a chiave pubblica
4. Il sistema RSA
5. La firma elettronica, autenticazione con il sistema RSA
6. Sicurezza del sistema RSA
107
107
109
110
111
121
122
CAPITOLO 1
Presentazione del corso
1. Programma del corso
(1)
(2)
(3)
(4)
(5)
(6)
(7)
Codici a blocchi.
Codici lineari.
Codici ciclici.
Codici di Hamming.
Codici correttori e gruppi di permutazioni.
Elementi di Crittografia.
Gruppi e insiemi di permutazioni equidistanti.
Per contestualizzare maggiormente gli argomenti trattati nei punti (1) − (5),
nelle parti (6) e (7) vengono presentati alcuni temi strettamente legati alla teoria
dei codici quali la crittografia o, in ambito più strettamente algebrico, lo studio di
particolari insiemi finiti di permutazioni.
2. Prerequisiti
Si ritengono note le definizioni e le principali proprietà delle seguenti nozioni.
• Numerazioni in basi diverse. Numerazione binaria.
• Strutture Algebriche e relative sottostrutture. Omomorfismo fra strutture
algebriche.
• Gruppo. Laterali di un sottogruppo. Gruppi ciclici.
• Permutazioni e loro proprietà.
• Anello. Ideali di un anello. Anello dei polinomi.
• Corpo e campo. Caratteristica di un campo. Campi di Galois. Divisione
di polinomi su un campo K. Ampliamenti algebrici dei campi. Polinomi
minimi.
• Struttura algebrica delle classi resto modulo n.
1
3. TESTI DI RIFERIMENTO
2
3. Testi di riferimento
Il materiale didattico è fornito dal docente con appunti e articoli sugli argomenti
trattati. Per i capitoli 2, 3, 4, 5, 6, 7, 9 si segnalano i seguenti testi di riferimento.
(1) L. Berardi, Algebra e teoria dei codici correttori, Milano, F. Angeli, 1994.
(2) M. W. Baldoni, C. Ciliberto, G. M. Piacentini Cattaneo, Aritmetica,
Crittografia e Codici, Milano, Springer-Verlag, 2006.
(3) L. Giuzzi, Codici Correttori, Milano, Springer, 2006.
CAPITOLO 2
Generalità sui Codici
1. Introduzione
00
Ti svegli una mattina, e nella semioscurità vedi una figura con uno strano
cappello accucciata in un angolo della stanza. Dopo un po’ i tuoi occhi focalizzano
e ti accorgi che in realtà sono i tuoi vestiti buttati su una sedia. Noti poi che la
tua amata se n’è andata e trovi un biglietto sul cuscino che dice 00 I LOVE XOU00 .
Quasi certamente questo ti rassicurerà, perchè presumerai che nel buio la Y sembri
una X. Certo, non sei sicuro al 100%. Potrebbe anche essere che in realtà la X
sia una L e che sei stato abbandonato per il tuo caro amico(o almeno così credevi)
Lou.00
(Pretzel, 1992)
Questo esempio racchiude l’essenza della teoria dei codici: trasmettendo messaggi c’è sempre una possibilità d’errore a cui ogni sistema di comunicazione deve
far fronte, in modo da essere affidabile.
I sistemi di comunicazione per trasferire messaggi sono molteplici: si può pensare ad una comunicazione via telegrafo o via telefono, ad un trasferimento di dati
da un computer ad un altro, ad un messaggio inviato attraverso un cavo ottico o
ad una antenna satellitare, ecc. ... .
Qualunque sia il sistema di comunicazione utilizzato, uno dei problemi più
frequenti è la presenza del rumore nel canale di comunicazione, ossia la presenza
di un insieme di segnali di disturbo e interferenze, estranei a quelli trasmessi.
Questi disturbi possono introdurre degli errori nelle informazioni trasmesse e ciò
che si riceve può differire da quanto è stato trasmesso.
La probabilità che nel corso di una trasmissione si verifichino degli errori non
può mai ridursi a zero, occorre pertanto individuare delle strategie che permettano di scoprire e correggere eventuali errori entrati durante la trasmissione del
messaggio.
3
2. TRASMISSIONE DI UN MESSAGGIO
4
La teoria dei codici affronta questo tipo di problemi ed elabora tecniche volte ad
identificare e a correggere gli eventuali errori commessi nel corso della trasmissione
dei dati, oltre che a permettere di codificare e decodificare velocemente i dati che
si vogliono inoltrare.
Queste tecniche richiedono però di trasmettere dati aggiuntivi (ridondanza)
che se da un lato permettono di verificare se c’è stato un errore ed eventualmente
correggerlo, dall’altro complicano ed appesantiscono le operazioni di trasmissione. Affinchè il sistema sia efficace è necessario trovare il giusto equilibrio tra la
ridondanza e la correttezza dell’informazione.
I codici correttori e rivelatori di errori sono importanti per le applicazioni ma,
al contempo, interessanti dal punto di vista teorico-matematico perchè senza la
matematica non si possono costruire buoni codici.
La branca della matematica su cui poggia la teoria dei codici è l’algebra e,
in particolare, sono le strutture algebriche finite. Ad esempio, l’ambito in cui si
sviluppa la teoria più interessante dei codici a blocchi è quello dei campi di Galois.
Molti indicano il 1948 quale anno di nascita della Teoria dei Codici perchè è
l’anno della pubblicazione dell’articolo Mathematical theory of communication di
C. E. Shannon in cui viene provata l’esistenza di codici capaci di correggere un
buon numero di errori. Da questi inizi la teoria dei codici ha avuto un enorme
sviluppo che dura tuttora (le pubblicazioni su questo argomento sono migliaia).
2. Trasmissione di un messaggio
M
Trasmettitore
Ricevitore
M
Codificatore
M
x
Decodificatore
x
y
M
x
y
C
A
N
A
L
E
disturbi
Trasmettitore (o sorgente) = emette il messaggio M .
Codificatore = traduce il messaggio in modo che possa attraversare il canale
di comunicazione (di norma trasforma i messaggi in segnali elettrici): M → x.
3. PROBLEMI DI TRASMISSIONE
5
Canale = è il mezzo usato per far viaggiare i segnali.
Decodificatore = ritrasforma i segnali nel messaggio M e lo invia al ricevitore.
Ricevitore = riceve il messaggio.
Rumore = disturbi di vario tipo.
Nella trasmissione di un messaggio, la prima necessità è quella di riconoscere
se il messaggio ricevuto contiene errori e in tal caso correggerli.
La scienza che si occupa dei metodi per individuare e correggere gli eventuali
errori immessi durante la trasmissione dei messaggi è la teoria dei codici.
La scienza che si occupa dei metodi per cifrare un messaggio è la crittografia.
3. Problemi di trasmissione
Per introdurre le varie problematiche che si devono affrontare, iniziamo con
due esempi.
Esempio 2.3.1. Supponiamo si voglia trasmettere un messaggio in lingua italiana. Per codificare associamo ad ogni lettera dell’alfabeto italiano il suo numero
d’ordine scritto in forma binaria.
a → 1 = 1 · 20 = 1
b → 2 = 1 · 21 + 0 · 20 = 10
c → 3 = 1 · 21 + 1 · 20 = 11
...............
z → 21 = 1 · 24 + 0 · 23 + 1 · 22 + 0 · 21 + 1 · 20 = 10101
Nel canale viene immessa la sequenza binaria. Il decodificatore associa alla
sequenza binaria la lettera dell’alfabeto italiano e la invia al ricevitore. E’ ovvio
che codificatore e decodificatore devono conoscere ed utilizzare lo stesso metodo
per codificare e decodificare. Trasmettere la lettera a significa
a → 1 → CANALE → 1 → a
Trasmettere la lettera z significa
z → 10101 → CANALE → 10101 → ?
Pur supponendo non vi siano stati errori durante la trasmissione, incontriamo
il primo ostacolo: poichè le lettere dell’alfabeto sono rappresentate da blocchi (di
0 ed 1) di lunghezza diversa, se trasmettiamo la sequenza 10101, il decodificatore
3. PROBLEMI DI TRASMISSIONE
6
non sa se la sequenza è relativa ad una sola lettera o se sono state trasmesse più
lettere in successione. Ad esempio:
10101 → 10101 = z
10101 → 10 10 1 = bba
10101 → 10 101 = be
Nasce dunque il problema della suddivisione delle sequenze ricevute. Per risolvere questo problema basta codificare tutte le lettere con sequenze aventi
la stessa lunghezza che dovrà essere almeno quella necessaria per rappresentare
la sequenza più lunga, nel nostro esempio la z. Per fare ciò è sufficiente aggiungere
all’inizio di ogni sequenza tanti zeri quanti ne occorrono per arrivare alla lunghezza
prestabilita (nel nostro esempio, scegliendo la lunghezza minima, per arrivare ad
avere cinque simboli). Stabilito che tutte le lettere dell’alfabeto saranno trasmesse
con delle sequenze di cinque simboli, la codifica diventa:
a → 00001
b → 00010
c → 00011
.........
z → 10101
e per decodificare non ci sono più ambiguità:
00001 → a
00010 → b
00011 → c
.........
10101 → z.
Esempio 2.3.2. Un collega di un’altra città sta eseguendo un esperimento di
chimica e, via posta elettronica, ci trasmette 0 se la reazione chimica è POSITIVA,
ci trasmette 1 se la reazione chimica è NEGATIVA. Nella trasmissione c’è però
una probabilità p di errore, ovviamente 0 ≤ p ≤ 1. Supponiamo sia p = 0, 01;
significa che presumiamo capiti una volta su 100 che venga trasmesso 1 invece
di 0 o viceversa. Se noi riceviamo 0 non possiamo dunque essere sicuri che la
reazione chimica sia POSITIVA. Per affrontare questo problema, introduciamo una
ridondanza ossia introduciamo degli elementi che 00 appesantiscono00 la trasmissione
ma riducono la probabilità di errore.
Chiediamo al collega di trasmettere 00 se è POSITIVA e di trasmettere 11 se
è NEGATIVA. Supponiamo che sia POSITIVA.
La probabilità di ricevere 11, ossia che nella trasmissione vengano effettuati due
errori è p2 = 0, 0001 e dunque, rispetto a prima, è molto ridotta. La probabilità di
ricevere 01 oppure 10, ossia che venga effettuato un solo errore, è 2 · 0, 99 · 0, 01 =
4. CANALI DI TRASMISSIONE. CANALI SIMMETRICI
7
0, 0198. La probabilità di ricevere 00, informazione corretta, è 0, 99·0, 99 = 0, 9801.
Inoltre se riceviamo 01 oppure 10 siamo certi che vi è un errore di trasmissione e
perciò possiamo richiedere al collega di riinviare il messaggio. Dunque solo in un
caso su 10000 potremo essere tratti in errore.
Se non ci sono problemi di tempo e di costi per l’utilizzo del canale di trasmissione, possiamo ancora migliorare la situazione fissando un intero positivo dispari
n e chiedendo di inviare una sequenza di n cifre 0 se è POSITIVA e una sequenza
di n cifre 1 se è NEGATIVA. Ciò aiuterà a decodificare POSITIVA se la sequenza
di arrivo contiene più cifre 0 che 1 e decodifiare NEGATIVA se contiene più cifre
1 che 0, (Principio di massima Somiglianza).
La probabilità di errore diventa
X n Pn =
pn−i (1 − p)i .
i
n
0≤i<b 2 c
che tende a zero per n che tende all’infinito.
4. Canali di trasmissione. Canali simmetrici
Sia A = {a1 , a2 , . . . , aq } un insieme di simboli/segnali che pensiamo come lettere di un alfabeto. Per canale di trasmissione, o di comunicazione, si intende un
sistema fisico Γ in grado di accettare in entrata (input) le lettere di A e, in corrispondenza di ciascuna lettera accettata, emettere in uscita (output) un elemento
ancora di A.
Si ritiene esclusa la possibilità che all’immissione di una lettera dell’alfabeto
non corrisponda l’emissione di una lettera.
Quando nel canale di trasmissione si immettono successivamente le lettere
ai1 , ai2 , . . . , ain e in uscita si trovano nell’ordine le lettere aj1 , aj2 , . . . , ajn , si dice
che è stata trasmessa la parola āi = (ai1 , ai2 , . . . , ain ) e che è stata ricevuta la parola a¯j = (aj1 , aj2 , . . . , ajn ); in queste ipotesi, il numero di componenti corrispondenti
diverse tra la parola trasmessa e quella ricevuta prende il nome di numero di errori
commesso nella trasmissione della parola āi .
Comunque prese due lettere ai , aj denotiamo con P (aj , ai ) la probabilità che
immettendo nel canale Γ la lettera ai si trovi in uscita la lettera aj e supponiamo
che tale probabilità dipenda soltanto dalla coppia (ai , aj ). In queste ipotesi il canale
si dice senza memoria e, posto
pij = P (aj , ai )
la matrice
P = (pij )
4. CANALI DI TRASMISSIONE. CANALI SIMMETRICI
8
si chiama matrice del canale Γ. Poichè ogni riga di P contiene le probabilità
di tutte le lettere che in uscita possono corrispondere all’immissione della lettera
relativa alla riga scelta, la somma degli elementi su ogni riga di P è uguale ad 1,
ossia
q
X
pij = 1 .
0 ≤ pij ≤ 1 ,
j=1
Nell’ambito dei canali di comunicazione senza memoria sono particolarmente
importanti i canali simmetrici. Un canale di questo tipo è definito dalla proprietà che la probabilità p che una lettera ai in entrata sia trasformata in uscita
in una lettera diversa aj non dipende da ai e aj ma è la stessa per tutte le coppie
di lettere distinte. Ciò significa che nella matrice del canale P risulta pij = p per
ogni coppia (i, j), i 6= j. Il numero p si chiama probabilità di errore del canale.
La matrice di un canale simmetrico rispetto ad un alfabeto A con q lettere è
dunque del tipo


1 − (q − 1)p
p
···
p


p
1 − (q − 1)p · · ·
p
.
P =
.
.
.
.


..
..
..
..
p
p
· · · 1 − (q − 1)p
In particolare sono molto usati i canali simmetrici binari denotati con BSC
(Binary Symmetric Channel). In essi l’alfabeto dispone solo di due simboli, per
esempio 0 ed 1; poichè ciascuna lettera in entrata ha la stessa probabilità p di
essere trasformata nell’altra in uscita, la matrice del canale è data da
1−p
p
P =
.
p
1−p
La matrice di un canale simmetrico binario viene schematizzata con la seguente
figura
1
1−P
/
v: 0
HH
v
HH
vv
HH
vv
HH vvv P
HvHv
vv HHH P
v
HH
v
HH
vv
HH
vv
v
H$
v
v
/
0 HH
1−P
1
5. ESEMPI. CODICI: FISCALE, ISBN, MORSE, ASCII.
9
5. Esempi. Codici: Fiscale, ISBN, Morse, ASCII.
Riportiamo alcuni esempi di codici i cui nomi sono certamente noti al lettore.
Esempio 2.5.1. Il Codice Fiscale Italiano è un codice su un alfabeto di 36
lettere (le 26 dell’alfabeto inglese e le cifre decimali da 0 a 9). Le sue parole servono
a codificare qualunque persona o ente abbia rapporti con il sistema fiscale italiano.
Nel caso di una persona fisica la parola corrispondente è composta da 16 lettere:
le prime 6 si riferiscono a cognome e nome, il secondo gruppo di 5 individua la
data di nascita e il sesso, il successivo gruppo di 4 individua la località italiana
o lo stato estero di nascita e l’ultima, che è di controllo, si calcola mediante un
opportuno algoritmo sulle prime 15.
Precisamente:
• Le prime tre lettere sono le prime tre consonanti del cognome.
• Il secondo gruppo di tre lettere sono la prima, la terza e la quarta consonante del nome.
• Seguono le ultime due cifre dell’anno di nascita.
• La lettera seguente indica il mese di nascita secondo le corrispondenze
Gennaio = A
Maggio = E
Settembre = P
Febbraio = B
Giugno = H
Ottobre
= R
Marzo
= C
Luglio = L
Novembre = S
Aprile
= D
Agosto = M
Dicembre = T
• Le due cifre successive indicano il giorno di nascita ed il sesso : per i
soggetti di sesso maschile, il giorno di nascita rimane invariato (con i
numeri da 1 a 31, facendo precedere dalla cifra 0 i giorni del mese da 1 a
9). Per i soggetti di sesso femminile, il giorno di nascita viene aumentato
di 40 (per cui i numeri che compaiono vanno da 41 a 71).
• I quattro simboli successivi indicano il comune italiano o lo stato estero
di nascita.
• Il sedicesimo carattere ha una funzione di controllo. Esso viene determinato nel seguente modo: a ciascuno dei primi quindici simboli viene
assegnato un valore numerico; se un simbolo occupa una posizione di ordine pari, ad esso si associa un numero secondo l’ordine naturale (cioè
alla lettera A o allo zero viene associato il valore zero; alla lettera B o
al numero 1 viene associato il valore 1, e così via per tutte le lettere e i
numeri); se invece un simbolo occupa una posizione di ordine dispari, ad
esso viene associato un valore numerico secondo la tabella sotto riportata. I valori numerici così determinati, vengono addizionati e la somma si
divide per il numero 26. Il carattere di controllo si ottiene convertendo
tale cifra nel carattere corrispondente l’ordine naturale.
5. ESEMPI. CODICI: FISCALE, ISBN, MORSE, ASCII.
A
B
C
D
E
F
G
H
I
Tabella di conversione dei caratteri
o zero = 1
| J o 9 =
o
1 = 0
|
K =
o
2 = 5
|
L =
o
3 = 7
|
M =
o
4 = 9
|
N =
o
5 = 13
|
O =
o
6 = 15
|
P =
o
7 = 17
|
Q =
o
8 = 19
|
R =
di ordine dispari.
21
|
S =
2
|
T =
4
|
U =
18
|
V =
20
|
W =
11
|
X =
3
|
Y =
6
|
Z =
8
|
10
12
14
16
10
22
25
24
23
Esempio 2.5.2. Il codice ISBN ( International Standard Book Number ) è un
codice a blocchi C di lunghezza 10 sull’alfabeto di 11 lettere costituito dalle cifre
decimali da 0 a 9 e dalla lettera X ed è usato per codificare i libri in commercio.
Quasi ogni libro, infatti, che non sia troppo vecchio, presenta stampata sul retro
della copertina una successione di dieci cifre, che è il suo ISBN e cioè la parola
di C ad esso associata. Lo schema di codifica, ad esempio, di un libro scritto in
inglese è il seguente: la prima lettera a1 di una parola a è zero e corrisponde alla
lingua inglese; le due lettere successive a2 a3 individuano la casa editrice; le sei
lettere successive a4 a5 a6 a7 a8 a9 indicano un numero assegnato al libro dalla casa
editrice; l’ultima lettera a10 è di controllo ed è uguale al resto r della divisione per
11 dell’intero
a1 + 2a2 + 3a3 + 4a4 + 5a5 + 6a6 + 7a7 + 8a8 + 9a9
se 0 ≤ r ≤ 9, è invece uguale ad X se risulta r = 10. Come si vede, l’ultima lettera
di una parola del codice ISBN è l’unica che può assumere il valore X. Per esempio,
il libro di E.F.Assmus e J.D.Key dal titolo Designs and Their Codes, pubblicato
dalla Cambridge University Press, ha ISBN uguale a 0 − 521 − 41361 − 3. Ciò
significa che la casa editrice Cambridge University Press è codificata con 00 5200 .
Da notare che i trattini che separano alcuni gruppi di cifre dell’ISBN non hanno
alcun significato al fine della codifica. Per maggiori informazioni sul codice ISBN
vedere il sito web: http://www.alice.it/bookshop/law.bks/codiinte.htm .
Esempio 2.5.3. Il codice Morse è un codice a lunghezza variabile sull’alfabeto
di tre lettere : punto, linea, spazio
Γ = {•, −, spazio}
Esso serve a codificare le lettere dell’alfabeto inglese ed è stato molto usato nel
passato soprattutto per trasmettere messaggi con il telegrafo senza fili. Il codice,
riportato in tabella, è stato costruito in modo che una sua parola è tanto più lunga
quanto la lettera corrispondente è meno frequente nella lingua inglese.
5. ESEMPI. CODICI: FISCALE, ISBN, MORSE, ASCII.
A •E •
I ••
M -Q --•U •• Y -•--
B - •••
F - •• - •
J •--N
-•
R
•-•
V ••• Z - - ••
C -•-•
G - -•
K -•O --S •••
W •--
D
H
L
P
T
X
11
- ••
• • ••
• - ••
•--•
- •• -
Si noti, per esempio, che nella lingua inglese la lettera E è più frequente della
Z e quindi la parola del codice 00 •00 corrispondente ad E è relativamente più corta
di quella 00 − − • •00 corrispondente a Z. Questo semplice accorgimento si presta
chiaramente a rendere più veloce la codifica, la trasmissione e la decodifica dei
messaggi. Lo spazio che figura fra le lettere di Γ non è mai utilizzato per la
codifica di una singola lettera ma è essenziale per dividere tra loro le parole del
codice presenti in un messaggio codificato. Più precisamente, quando si codifica
una frase, bisogna inserire esattamente uno spazio tra due lettere dell’alfabeto
codificato ed almeno due spazi fra due parole. Per esempio, se usiamo il simbolo
@ per indicare uno spazio, l’espressione
CODICE M ORSE
si codifica con
− • − • @ − − − @ − • • @ • •@ − • − •@ • @@ − −@ − − − @ • − • @ • • • @•
Osserviamo che il codice Morse non distingue le lettere minuscole dalle maiuscole.
Il codice Morse è un codice introdotto per la trasmissione di testo su linee telegrafiche e queste trasmettono solo un tipo di segnale: presenza o assenza di corrente.
Se si rappresenta con il simbolo 00 100 la presenza di corrente e con il simbolo 00 000
l’assenza, vigono le seguenti regole di modulazione:
(1) Il punto 00 •00 corrisponde all’unità fondamentale di tempo di trasmissione
e viene indicato con 00 100 .
(2) La linea 00 −00 corrisponde ad un segnale continuato di durata tripla rispetto
quello del punto e dunque corrisponde ad inviare la sequenza 111.
(3) Facendo corrispondere il simbolo 0 alla pausa della durata di un punto,
in ogni lettera i singoli simboli di punto e linea sono separati da 0, in ogni
parola le singole lettere sono fra loro separate da 000 e due parole sono
fra loro separate da 0000000.
Esempio 2.5.4. L’American Standard Code for Information Interchange, noto
come Codice ASCII, dal 1968 è il codice standard per i computer. E’ un codice
a blocchi sull’alfabeto F = {0, 1} formato da tutte le parole di lunghezza sette e,
quindi, contiene esattamente 27 = 128 parole. Esso è stato costruito per codificare
le lettere dell’alfabeto inglese maiuscole e minuscole, le cifre decimali da 0 a 9 e una
5. ESEMPI. CODICI: FISCALE, ISBN, MORSE, ASCII.
12
serie di altri simboli e istruzioni allo scopo di permettere all’architettura interna
di un computer di operare solo con i simboli 0 ed 1. Al codice standard iniziale
a 7 bit sono seguite estensioni a 8 bit con lo scopo di raddoppiare il numero di
caratteri rappresentabili. ASCII esteso (8 bit) ha 256 configurazioni: le prime 128
(da 00000000 a 01111111) sono associate ai caratteri dell’ASCII standard, le altre
128 (da 10000000 a 11111111) sono associate a lettere accentate, a caratteri grafici,
a simboli matematici e scientifici, eccetera.
Nella Tabella 1 si riporta, secondo il codice ASCII, la traduzione in numeri
dei simboli più comunemente usati durante la scrittura di un testo. Si parte da 32
perchè gli interi minori di 32 e il 127 sono caratteri di controllo; il 32 corrisponde
al carattere di spazio.
Nella Tabella 2 sono elencate le parole del codice ASCII che corrispondono
alle cifre da 0 a 9 e alle lettere maiuscole dell’alfabeto scritte in forma binaria.
Per esempio la sequenza
VA BENE !
viene trasformata in
0101011001000001001000000100001001000101010011100100010100100001
Tabella 1
32
33 !
34 00
35 #
36 $
37 %
38 &
39 0
40 (
41 )
42 ∗
43 +
44
45
46
47
48
49
50
51
52
53
54
55
,
−
.
/
0
1
2
3
4
5
6
7
56
57
58
59
60
61
62
63
64
65
66
67
8
9
:
;
<
=
>
?
@
A
B
C
68
69
70
71
72
73
74
75
76
77
78
79
D 80 P 92 .\ 104 h
E 81 Q 93 ] 105 i
F 82 R
94 ˆ 106 j
G 83 S 95 _ 107 k
H 84 T
96 8
108 l
I 85 U 97 a 109 m
J 86 V
98 b 110 n
K 87 W 99 c 111 o
L 88 X 100 d 112 p
M 89 Y 101 e 113 q
N 90 Z 102 f 114 r
O 91 [ 103 g 115 s
116
117
118
119
120
121
122
123
124
125
126
t
u
v
w
x
y
z
{
|
}
∼
5. ESEMPI. CODICI: FISCALE, ISBN, MORSE, ASCII.
Tabella 2
(spazio) 00100000
2 00110010
6 00110110
A 01000001
E 01000101
I 01001001
M 01001101
Q 01010001
U 01010101
Y 01011001
!
3
7
B
F
J
N
R
V
Z
00100001
00110011
00110111
01000010
01000110
01001010
01001110
01010010
01010110
01011010
0
4
8
C
G
K
O
S
W
00110000
00110100
00111000
01000011
01000111
01001011
01001111
01010011
01010111
1
5
9
D
H
L
P
T
X
00110001
00110101
00111001
01000100
01001000
01001100
01010000
01010100
01011000
13
CAPITOLO 3
Codici a Blocchi
Per superare i problemi evidenziati dagli esempi del paragrafo 3 del capitolo
precedente, i codici studiati sono principalmente codici a blocchi ossia codici in cui
le parole hanno tutte la stessa lunghezza.
Un altro notevole vantaggio che si ha nel considerare codici a blocchi, è che
ogni blocco viene codificato e decodificato in modo indipendente ed autonomo sia
da quelli che lo precedono che da quelli che lo seguono. Pertanto per descrivere
l’azione generale di codifica e di decodifica dei blocchi, basta descriverla su uno
solo di essi.
1. Definizioni
Definizione 3.1.1. Sia Aq = {x1 , x2 , . . . , xq } un insieme finito di cardinalità
|Aq | = q ≥ 2 e sia n un intero positivo. Si definisce codice a blocchi di lunghezza n ed ordine q (o codice q-ario) un qualunque sottoinsieme non vuoto C
di Anq .
L’insieme Aq è detto alfabeto di C; una parola del codice è una n-pla ordinata di simboli dell’alfabeto e viene denotata con x = x1 x2 · · · xn oppure x =
(x1 , x2 , · · · , xn ) o semplicemente con (x1 , x2 , · · · , xn ), i simboli xi che formano la
n-pla vengono detti componenti o coordinate della parola. L’ordine |C| = M di C
si dice grandezza del codice. Anq è detto spazio delle parole di lunghezza n e
ordine q.
I codici a blocchi rispondono all’esigenza di avere tutte le parole con la stessa
lunghezza e di avere la possibilità di prefissare la lunghezza n a seconda dell’esigenza del caso.
Esistono codici in cui variano grandezza del codice e lunghezza delle parole,
sono detti codici a lunghezza variabile.
14
2. CODICI CHE RIVELANO E CORREGGONO ERRORI. DISTANZA DI HAMMING.
15
Noi tratteremo solo codici a blocchi e pertanto nel seguito li chiameremo soltanto codici.
2. Codici che rivelano e correggono errori. Distanza di Hamming.
R. Hamming (1915 − 1998) è fra i primi a studiare tecniche per aumentare
l’efficienza di un codice. Lo scopo è quello di trovare metodi affinchè un codice sia
in grado non solo di scoprire ma anche di correggere errori. Illustriamo l’esempio
considerato dallo stesso Hamming e noto come codice (7, 4) di Hamming.
Supponiamo di dover trasmettere dei messaggi formati da numeri da 0 a 15
scritti in base 2 e quindi di trasmettere quaterne di cifre 0 e 1. Il nostro codice
è binario perchè ha per alfabeto il campo di Galois GF (2) = A2 = {0, 1} ed è
|C| = M = 24 = 16.
Se la parola da trasmettere è la quaterna (a1 , a2 , a3 , a4 ), noi trasmettiamo la
7-upla
(a1 , a2 , a3 , a4 , a1 + a3 + a4 , a1 + a2 + a4 , a1 + a2 + a3 )
in cui le somme sono fatte ovviamente in GF (2).
Ad esempio invece di trasmettere la quaterna (0, 1, 0, 0) viene trasmessa la
settupla (0, 1, 0, 0, 0, 1, 1). In pratica si costruisce un codice di lunghezza n = 7,
immergendo C = A42 in A72 mediante l’applicazione iniettiva
ϕ : A42 → A72
che ad (a1 , a2 , a3 , a4 ) ∈ A42 associa l’elemento (a1 , a2 , a3 , a4 , a1 + a3 + a4 , a1 + a2 +
a4 , a1 + a2 + a3 ) ∈ A72 .
A partire dal codice C = A42 si costruisce il codice ϕ(C) ⊆ A72 ; poichè C e
ϕ(C) sono in corrispondenza biunivoca, 00 identifichiamo00 C con ϕ(C) ⊆ A72 ossia
parleremo di C come il codice le cui parole sono delle 7-ple.
Vediamo cosa abbiamo guadagnato nel passare da sequenze costituite da quattro simboli a parole costituite da sette simboli. Osserviamo che se (x1 , x2 , · · · , x7 )
è una parola del codice, si ha

 x1 + x3 + x4 + x5 = 0
x1 + x2 + x4 + x6 = 0
 x +x +x +x =0
1
2
3
7
Infatti, per esempio, il primo membro della prima equazione è x1 +x3 +x4 +x5 =
2x1 + 2x3 + 2x4 che in A2 vale 0.
Il sistema lineare di equazioni costruito e considerato sul campo GF (2), è detto
sistema delle condizioni di parità del codice. Se riceviamo il messaggio
2. CODICI CHE RIVELANO E CORREGGONO ERRORI. DISTANZA DI HAMMING.
16
(x1 , x2 , · · · , x7 ) ed esso non verifica il sistema lineare sopra scritto, di sicuro vi è
un errore di trasmissione. Dunque il codice è in grado di scoprire errori.
Supponiamo ora di sapere, o di ritenere assai probabile, che nel trasmettere una
7-pla di C si possa verificare al massimo un errore. Poichè x5 = x1 + x3 + x4 , x6 =
x1 + x2 + x4 , x7 = x1 + x2 + x3 , il sistema di equazioni soprascritto è tale che i casi
possibili sono tutti e soli i seguenti:
• se (x1 , x2 , · · · , x7 ) non verifica nessuna delle equazioni del sistema lineare,
l’errore è al primo posto;
• se (x1 , x2 , · · · , x7 ) verifica la prima equazione del sistema lineare ma non
le altre due, l’errore è al secondo posto;
• se (x1 , x2 , · · · , x7 ) verifica la seconda equazione del sistema lineare ma non
le altre due, l’errore è al terzo posto;
• se (x1 , x2 , · · · , x7 ) verifica la terza equazione del sistema lineare ma non
le altre due , l’errore è al quarto posto;
• se (x1 , x2 , · · · , x7 ) verifica la seconda e la terza equazione del sistema
lineare ma non la prima, l’errore è al quinto posto;
• se (x1 , x2 , · · · , x7 ) verifica prima e la terza equazione del sistema lineare
ma non la seconda, l’errore è al sesto posto;
• se (x1 , x2 , · · · , x7 ) verifica la prima e la seconda equazione del sistema
lineare ma non la terza, l’errore è al settimo posto;
Dunque se sappiamo che c’è un solo errore, il sistema ci consente anche di
individuare dove è l’errore e quindi di correggerlo perchè, essendo il codice binario,
basta sostituire 0 a 1, o viceversa, nel posto in cui c’è l’errore.
Esempio 3.2.1. Supponiamo di ricevere la parola p = (0, 1, 0, 1, 0, 1, 0), che
contiene errori perchè non soddisfa il sistema lineare, supponiamo inoltre di sapere
che l’errore è uno solo. Poichè p non soddisfa nessuna delle tre equazioni del
sistema, si ha che l’errore è in x1 e perciò la parola corretta è p = (1, 1, 0, 1, 0, 1, 0).
(L’errore è nella prima coordinata perchè se l’errore fosse in x2 allora sarebbe
verificata la prima equazione, se l’errore fosse in x3 sarebbe verificata la seconda
equazione, se l’errore fosse in x4 sarebbe verificata la terza equazione, mentre la
7-upla ricevuta non soddisfa nessuna delle tre equazioni del sistema).
Il motivo per cui il codice (7, 4) di Hamming funziona è che, come si verifica
immediatamente, due diverse parole differiscono in almeno tre coordinate.
Cerchiamo di capire con un esempio. Sia (x1 , x2 , · · · , x7 ) una parola del codice
che durante la trasmissione subisce un errore in una sola coordinata, sia ad esempio
la prima. Al posto di p = (x1 , x2 , · · · , x7 ) riceviamo p0 = (x01 , x2 , · · · , x7 ). Poichè
ogni parola del codice differisce da p in almeno tre coordinate, p0 differisce dalle
parole del codice diverse da p in almeno due coordinate. Allora correggiamo l’errore
2. CODICI CHE RIVELANO E CORREGGONO ERRORI. DISTANZA DI HAMMING.
17
andando a considerare la parola del codice 00 più somigliante00 a quella ricevuta.
L’unica parola del codice che differisce da (x01 , x2 , · · · , x7 ) in una sola coordinata
(e quindi più somigliante) è la p = (x1 , x2 , · · · , x7 ).
Le considerazioni fatte ora per il codice (7, 4) di Hamming si generalizzano.
Per formalizzare queste problematiche introduciamo le seguenti definizioni.
Definizione 3.2.2. Siano p = (x1 , x2 , · · · , xn ), p0 = (y1 , y2 , · · · , yn ) ∈ Anq . Si
definisce distanza di Hamming di p da p0 il numero di coordinate in cui p e p0
differiscono, si indica con d(p, p0 ). In simboli
d(p, p0 ) = |{i | xi 6= yi }|.
La distanza di Hamming è un’applicazione d : Anq × Anq → R che soddisfa
le tre proprietà caratteristiche di una metrica tra punti del piano o dello spazio.
Infatti comunque prese tre parole p, p0 , p00 del codice, si ha :
(1) d(p, p0 ) ≥ 0; d(p, p0 ) = 0 se e solo se p = p0
(positività)
0
0
(2) d(p, p ) = d(p , p)
(simmetria)
(3) d(p, p0 ) ≤ d(p, p00 ) + d(p00 , p0 )
(disuguaglianza triangolare).
La validità di 1) e di 2) è immediata. Proviamo la 3).
Siano p = (x1 , x2 , · · · , xn ), p0 = (y1 , y2 , · · · , yn ), p00 = (z1 , z2 , · · · , zn ), occorre
provare che
|{i | xi 6= yi }| ≤ |{i | xi 6= zi }| + |{i | zi 6= yi }|.
Se in i si ha xi 6= yi , allora zi può essere uguale al più ad uno fra xi e yi e
pertanto ogni i che compare al primo membro compare anche in almeno uno degli
addendi del secondo membro. Ciò prova la validità della disuguaglianza.
Definizione 3.2.3. Si chiama distanza minima di un codice C, e si indica
con d = d(C), il minimo delle distanze tra due parole distinte qualsiasi di C. In
simboli
d = d(C) = min{d(p, p0 ), ∀ p, p0 ∈ C, p 6= p0 }.
La distanza minima di un codice, come faremo vedere nel seguito, è il parametro su cui si basano le indicazioni di quanti errori un codice può individuare e/o
correggere.
Definizione 3.2.4. Si dice che il codice C è un (n, M, d)q - codice se è :
• definito su un alfabeto di q simboli,
• di lunghezza n,
• di grandezza M = |C|,
• con distanza minima d.
2. CODICI CHE RIVELANO E CORREGGONO ERRORI. DISTANZA DI HAMMING.
18
I numeri q, n, M, d sono i parametri del codice.
Ad esempio il codice (7, 4) di Hamming è un (7, 16, 3)2 - codice.
La scrittura C ⊆ Anq significa che le parole del codice hanno lunghezza n (perchè
sono delle n-ple) e sono sull’alfabeto Aq di q simboli; pertanto, in seguito, la
scrittura (n, M, d)q verrà spesso semplificata a seconda di quali sono i parametri
necessari per la comprensione dell’argomento trattato.
Per studiare la relazione tra la distanza di Hamming e il problema della correzione degli errori di trasmissione, iniziamo con la seguente definizione.
Definizione 3.2.5. Un codice C si dice h-correttore se h è il numero massimo
di errori che il codice è in grado di correggere. Il codice si dice h-rivelatore se h
è il numero massimo di errori che il codice è in grado di rivelare.
Ad esempio il codice (7, 4) di Hamming è 1-correttore e 2-rivelatore.
Teorema 3.2.6. Un codice C di lunghezza n è h-rivelatore se e solo se ha
distanza minima d = h + 1.
Dimostrazione. Sia d = h+1. Se in una parola trasmessa p entra un numero
t di errori, t ≤ h, la sequenza p0 in uscita non è una parola del codice perchè
d(p, p0 ) = t < d e pertanto i t errori sono rivelati. Se invece entra un numero di
errori maggiore o uguale a d = h + 1, la sequenza che si riceve può essere un’altra
parola del codice e quindi gli errori non vengono rivelati e pertanto se d = h + 1 il
codice è h-rivelatore.
Viceversa, sia h il massimo numero di errori che il codice rivela. Allora una
qualunque parola di C deve avere almeno h + 1 componenti diverse da quella
trasmessa, ossia d(C) ≥ h + 1 e poichè h è il massimo numero di errori che il codice
può rivelare, in C esistono almeno due parole che hanno distanza esattamente h+1
da cui d(C) = h + 1.
)c-correttore, dove
Teorema 3.2.7. Un codice C con distanza minima d è b( d−1
2
d−1
d−1
b( 2 )c indica la parte intera di 2 .
Dimostrazione. Supponiamo che in una parola trasmessa p entri un numero
di errori minore o uguale a b( d−1
)c e sia p0 la n-pla ricevuta. Si ha d(p, p0 ) ≤
2
b( d−1
)c. Proviamo che per ogni altra parola p00 di C si ha d(p0 , p00 ) ≥ b( d−1
)c + 1
2
2
da ciò segue che la parola p è la più somigliante a p0 . Supponiamo per assurdo
)c. Allora si ha
che esista una parola p00 di C, p00 6= p, tale che d(p0 , p00 ) ≤ b( d−1
2
d−1
0
0 00
d(p , p)+d(p , p ) ≤ 2b( 2 )c ≤ d−1, e questo, per la disuguaglianza triangolare,
implica d(p, p00 ) ≤ d − 1 ma ciò è assurdo perchè d(C) = d.
2. CODICI CHE RIVELANO E CORREGGONO ERRORI. DISTANZA DI HAMMING.
19
Corollario 3.2.8. Sia C un codice con distanza minima d.
(1) C scopre t errori ⇔ t < d, ossia d ≥ t + 1 .
(2) C corregge t errori ⇔ d ≥ 2t + 1.
Dimostrazione.
(1) Un codice scopre t errori se e solo se, alterando una
parola del codice in r ≤ t coordinate, non si ottiene mai un’altra parola
del codice. Questo accade se e solo se due parole del codice hanno distanza
almeno t + 1.
(2) Un codice corregge t errori se e solo se alterando una parola del codice in
r ≤ t coordinate, la n-pla così ottenuta ha distanza maggiore di t da una
qualunque altra parola del codice. Questo accade se e solo se due parole
del codice hanno distanza almeno 2t + 1.
L’insieme Anq può essere pensato come uno spazio di dimensione n e pertanto se
in Anq si considera la distanza di Hamming d, allora la coppia (Anq , d) è uno spazio
metrico e possiamo dare la seguente definizione.
Definizione 3.2.9. Sia r un intero positivo. Per ogni x ∈ Anq , si definisce sfera
di centro x e raggio r l’insieme di tutti gli elementi y ∈ Anq tali che d(x, y) ≤ r.
In simboli
S(x, r) = {y | y ∈ Anq , d(x, y) ≤ r}.
La definizione ora data permette di caratterizzare geometricamente i codici
h-correttori sulla base del principio di massima somiglianza.
Teorema 3.2.10. Sia C ⊆ Anq un codice. C è h-correttore se e solo se comunque
prese due parole distinte p e p0 di C, si ha S(p, h) ∩ S(p0 , h) = ∅.
Dimostrazione. Sia C h-correttore e siano p, p0 ∈ C, p 6= p0 . Per il corollario
3.2.8 si ha d(p, p0 ) ≥ 2h+1. Supponiamo per assurdo che sia S(p, h)∩S(p0 , h) 6= ∅
e sia x ∈ S(p, h)∩S(p0 , h). Ciò significa che d(p, x) ≤ h, d(p0 , x) ≤ h e quindi per
la proprietà della disuguaglianza triangolare si ha d(p, p0 ) ≤ h + h < 2h + 1 = d
e ciò è assurdo.
Viceversa, sia S(p, h) ∩ S(p0 , h) = ∅ per ogni p, p0 ∈ C, p 6= p0 . Supponiamo per
assurdo che esistano p, p0 ∈ C tali che d(p, p0 ) ≤ 2h. Non può essere d(p, p0 ) ≤ h
perchè in tal caso p0 ∈ S(p, h) contro l’ipotesi S(p, h) ∩ S(p0 , h) = ∅. Sia allora
h + 1 ≤ d(p, p0 ) ≤ 2h, poniamo d(p, p0 ) = h + t con 1 ≤ t ≤ h. Senza ledere in
generalità possiamo supporre che le (h + t) componenti in cui p e p0 differiscono
siano le prime h + t . Sia z ∈ Anq avente le prime h componenti uguali a p
e le successive t componenti ( dalla (h + 1)-esima alla (h + t)-esima ) uguali a
quelle di p0 ; tutte le altre componenti di z siano uguali a quelle di p e p0 . Si ha
2. CODICI CHE RIVELANO E CORREGGONO ERRORI. DISTANZA DI HAMMING.
20
d(z, p) = t ≤ h e perciò z ∈ S(p, h), inoltre d(z, p0 ) = h e perciò z ∈ S(p0 , h).
Risulta dunque z ∈ S(p, h) ∩ S(p0 , h) e ciò è assurdo per l’ipotesi fatta. Rimane
così provato che è d(p, p0 ) ≥ 2h + 1 per ogni p, p0 ∈ C e pertanto per il corollario
3.2.8 il codice C è h-correttore.
Se un codice C è h-correttore e durante la trasmissione entrano al più h errori,
allora ogni n-pla p0 ricevuta appartiene ad una ed una sola sfera S(p, h) e quindi p
è la parola di C più vicina a p0 . Dire che per la decodifica si applica il principio di
massima somiglianza significa decodificare ogni n-pla ricevuta p0 come
la parola p centro della sfera S(p, h) a cui p0 appartiene.
Il numero h degli errori che un (n, M, d)-codice C garantisce di poter correggere
(Teorema 3.2.10) è detto raggio di impacchettamento di C perchè coincide con il
massimo intero r tale che
S(p, r) ∩ S(p0 , r) = ∅
per ogni coppia di parole distinte p, p0 ∈ C.
Esempio 3.2.11. Sia C = {c1 , c2 , c3 , c4 }, con
c1 = (00000), c2 = (10110), c3 = (01011), c4 = (11101).
La distanza minima di questo codice è d = 3; pertanto per il teorema 3.2.7, è
sempre possibile correggere esattamente un errore. Sia ora S l’insieme di tutte
le possibili sequenze di lunghezza 5 su A = {0, 1}; ovviamente |S| = 25 = 32.
Consideriamo tutte le sfere di raggio 1 e centro nelle parole di C.
Sc1 = {(00000), (10000), (01000), (00100), (00010), (00001)}
Sc2 = {(10110), (00110), (11110), (10010), (10100), (10111)}
Sc3 = {(01011), (11011), (00011), (01111), (01001), (01010)}
Sc4 = {(11101), (01101), (10101), (11001), (11111), (11100)}.
L’unione di tali sfere contiene solo 24 delle possibili 32 sequenze di lunghezza 5,
sia S ∗ l’insieme delle sequenze che non cadono in alcuna delle sfere:
S ∗ = {(11000), (01100), (10001), (00101), (01110), (00111), (10011), (11010)}.
Supponiamo che sia stata ricevuta la parola u = (00011); calcoliamo la distanza
da ogni parola di C, risulta :
d(c1 , u) = 2, d(c2 , u) = 3, d(c3 , u) = 1, d(c4 , u) = 4.
Poichè u ∈ Sc3 , si può decodificare u con p = c3 . Se fosse stata ricevuta la parola
v = (11000), le distanze dalle parole del codice sarebbero :
d(c1 , v) = 2, d(c2 , v) = 3, d(c3 , v) = 3, d(c4 , v) = 2.
2. CODICI CHE RIVELANO E CORREGGONO ERRORI. DISTANZA DI HAMMING.
21
A questo punto non saremmo in grado di correggere automaticamente l’errore,
l’unica informazione sarebbe che ci sono almeno due errori perchè v non è una
parola del codice.
Il seguente teorema mette in luce che può risultare più conveniente avere codici
con distanza minima pari anzichè dispari.
Teorema 3.2.12. Sia C un codice con distanza minima d pari, d = 2h+2, h ∈
N. Allora C oltre ad essere h-correttore è anche almeno (h + 1)-rivelatore.
Dimostrazione. Poichè C ha distanza minima d = 2h+2, per il teorema 3.2.7
il codice corregge h = b d−1
c = d2 − 1 errori. Proviamo che C rivela (h + 1) = d2
2
errori. Se in una parola p trasmessa entrano d2 errori, la sequenza ricevuta non
appartiene a nessuna sfera avente centro in una parola del codice e raggio h perchè
h < d2 , quindi i d2 errori sono rivelati. Essi non possono essere corretti perchè la
sequenza ricevuta potrebbe essere equidistante da due parole del codice.
Esempio 3.2.13. Sia C un codice binario 1-correttore con distanza minima
d ≥ 3. Siano p e q due parole del codice aventi distanza minima ossia d(p, q) = d.
(1) Se durante la trasmissione entra un errore, la sequenza in uscita appartiene alla sfera S(p, 1) o alla sfera S(q, 1) a seconda che sia stata trasmessa
p oppure q. Sia nel caso che d sia dispari sia nel caso che d sia pari, per il
principio di massima somiglianza l’errore viene corretto e il decodificatore
associa alla sequenza ricevuta il centro della sfera a cui essa appartiene
che è la parola trasmessa.
(2) Supponiamo ora di trasmettere p e che entrino due errori. Analizziamo
la situazione distinguendo il caso in cui d è dispari e il caso in cui d è pari.
• 1◦ caso: la distanza minima di C è dispari. Sia d = 3 e siano p =
(11101), q = (00001) due parole del codice tali che d(p, q) = 3.
Poichè abbiamo supposto che trasmettendo p entrino due errori, supponiamo arrivi la sequenza p0 = (00101) che appartiene alla sfera
S(q, 1) per cui i due errori non solo non vengono rivelati ma la sequenza verrebbe decodificata come la parola q quando invece è stata
trasmessa p.
• 2◦ caso: la distanza minima di C è pari. Sia d = 4 e siano p =
(11101), q = (00000) due parole del codice tali che d(p, q) = 4.
Come per il caso precedente, supponiamo che nel trasmettere p entrino due errori e si riceva la sequenza p0 = (00101) . Risulta d =
(p0 , p) = 2, d(p0 , q) = 2; ciò significa che p0 non appartiene nè alla sfera
S(p, 1) nè alla sfera S(q, 1). Dunque se entrano due errori, anche in
questo caso, non si è in grado di correggerli ma però vengono rivelati
perchè d(p, p0 ) = 2 mentre la distanza minima è 4.
3. EFFICIENZA E RAPPORTO DI SEPARAZIONE
22
Esplicitiamo ulteriormente con la seguente nota.
Nota 3.2.14. Sia C un codice con distanza minima d e h-correttore. Supponiamo venga trasmessa la parola p e si riceva p0 in cui sono entrati h + 1
errori.
• Se d è pari allora C rivela gli h + 1 errori. Infatti sia d = 2t + 2, poichè C
c = t ossia d = 2h + 2.
è h-correttore, per il teorema 3.2.7 si ha h = b d−1
2
Gli h + 1 errori vengono rivelati (anche se non corretti) perchè p0 non può
appartenere a nessuna sfera di centro q ∈ C e raggio h ossia d(p0 , q) > h,
infatti se fosse d(p0 , q) ≤ h si avrebbe
2h + 2 = d ≤ d(p, q) ≤ d(p, p0 ) + d(p0 , q) ≤ (h + 1) + h = 2h + 1
e ciò è assurdo.
• Se d è dispari, l’errore non è rivelato e la decodifica potrebbe essere errata
perchè p0 potrebbe appartenere ad una sfera di centro q ∈ C e raggio h e in
questo caso p verrebbe decodificata con la parola q. Infatti sia d = 2t + 1,
poichè C è h-correttore, per il Teorema 3.2.7 si ha h = b d−1
c = t ossia
2
d = 2h + 1 e pertanto
2h + 1 = d ≤ d(p, q) ≤ d(p, p0 ) + d(p0 , q) ≤ (h + 1) + h = 2h + 1
non porta ad un assurdo.
3. Efficienza e Rapporto di separazione
Efficienza di un codice.
Osserviamo che la lunghezza n del codice C ⊆ Anq si può vedere come una
misura del costo del codice : più la parola di un codice è lunga, più tempo ed
energia occorrono per inviare i messaggi e quindi maggiore è la spesa di gestione.
La grandezza M del codice C, si può vedere come una misura della ricchezza del
codice : più parole ha un codice, maggiore e più varia è la sua possibilità di
trasmettere informazioni. Il rapporto qualità/prezzo può essere rappresentato dal
numero
logq M
R=
n
Il numero R si dice efficienza o rapporto di informazione del codice. Occorre
tenerlo il più possibile vicino ad 1 perchè il codice sia poco costoso, ma per renderlo
efficiente di scoprire e/o correggere errori non deve essere troppo vicino ad 1.
Nota 3.3.1. Se k < n è la lunghezza minima della sequenza per poter esprimere
tutti i messaggi (ossia Akq è il vocabolario minimo), allora si ha R = nk poichè risulta
M = q k . Inoltre da M ≤ q n segue R ≤ 1.
4. RELAZIONI FRA I PARAMETRI DI UN CODICE
23
Rapporto di separazione.
Se d è la distanza minima del codice, un’altra misura è il numero
d
δ=
n
detto rapporto di separazione del codice. Più grande è δ (ossia più grande è
la distanza minima d), più il codice ha possibilità di correggere gli errori.
4. Relazioni fra i parametri di un codice
Sia C ⊆ Anq un (n, M, d)q -codice .
I parametri del codice a blocchi non variano in modo indipendente ma sono
correlati fra loro. E’ dunque importante stabilire delle relazioni che esprimano
questi legami, non solo per determinare la possibile esistenza di un codice, ma
anche per stabilire quando è che un codice è migliore di un altro in considerazione
delle esigenze del caso, per esempio a parità di prestazioni è preferibile il codice
più corto perchè meno costoso.
Le principali relazioni fra i parametri riguardano la limitazione superiore e la
limitazione inferiore di M in termini di n e d.
Teorema 3.4.1 (Stima di Singleton). Sia C ⊆ Anq con distanza minima d.
Allora risulta
|C| ≤ q n−d+1
Dimostrazione. Comunque prese due parole p, p0 ∈ C, p 6= p0 , esse hanno
al più (n − d)-componenti uguali perchè d(p, p0 ) ≥ d. Ne segue che comunque si
fissano n − d + 1 posti i1 , . . . , in−d+1 , nel codice non esistono due parole distinte
aventi la stessa (n − d + 1)-pla nei posti fissati. Quindi fissati comunque n − d + 1
posti, possiamo associare ad ogni parola la (n − d + 1)-pla (ci1 , . . . , cin−d+1 ) che
si trova nei posti fissati, inoltre a parole distinte corrispondono (n − d + 1)-ple
distinte. Da ciò segue che l’applicazione
ϕ : C → An−d+1
,
q
ϕ(c) = (ci1 , . . . , cin−d+1 )
è iniettiva e pertanto |C| ≤ |An−d+1
| = q n−d+1 .
q
Corollario 3.4.2. Nella stima di Singleton vale l’uguaglianza se e solo se per
ogni n − d + 1 componenti le parole del codice assumono su di esse tutti i possibili
valori.
4. RELAZIONI FRA I PARAMETRI DI UN CODICE
24
Un’altra stima superiore per |C| si può ottenere riprendendo il concetto di sfera
di centro x ∈ C e raggio r (def. 3.2.9). Calcoliamo anzittutto la cardinalità ( o
volume) di una sfera.
Teorema 3.4.3. Il numero degli elementi della sfera S(x, r) è
|S(x, r)| =
r X
n
i=0
i
(q − 1)i
Dimostrazione. Sia 0 ≤ t ≤ n e sia σ(x, t) = {y | y ∈ Anq , d(x, y) = t}.
Allora la sfera di centro x e raggio r è tale che
r
[
S(x, r) =
σ(x, t).
t=0
0
0
Poichè per t 6= t si ha σ(x, t) ∩ σ(x, t ) = ∅, risulta
|S(x, r)| =
r
X
|σ(x, t)|
t=0
e pertanto per calcolare |S(x, r)| basta calcolare |σ(x, t)|.
Se x = (x1 , . . . , xn ) è il centro, σ(x, t) è data da tutte le n-ple y = (y1 , . . . , yn )
tali che d(x, y) = t. Fissiamo t posti della n-pla x, ad esempio i primi t. Il numero
delle n-ple che differiscono dalla x = (x1 , . . . , xn ) nei primi t posti è (q − 1)t , infatti
in ognuno dei t posti fissati possono comparire come componenti i (q − 1) elementi
di Aq diversi dalla componente che compare in quel posto in x. I t posti possono
essere fissati in tanti modi quante sono le combinazioni semplici di n elementi presi
a t a t . Allora
n
|σ(x, t)| =
(q − 1)t .
t
Segue che la cardinalità di una sfera è
r X
n
|S(x, r)| =
(q − 1)i .
i
i=0
Grazie al precedente risultato, si ottiene la seguente limitazione detta anche
limitazione per impacchettamento di sfere.
Teorema 3.4.4 (Stima di Hamming). Sia C ⊆ Anq un codice h-correttore.
Allora risulta
qn
|C| ≤ Ph n
i
i=0 i (q − 1)
4. RELAZIONI FRA I PARAMETRI DI UN CODICE
25
Dimostrazione. Per il corollario 3.2.8 si ha d ≥ 2h + 1 e pertanto per ogni
coppia di parole x, y ∈ C, le due sfere S(x, h) e S(y, h) non hanno elementi in
comune. D’altra parte, Anq contiene l’unione S di tutte le sfere S(x, h) al variare
di x ∈ C ed essendo tali sfere in numero di |C| e a due a due disgiunte, S contiene
|C| · |S(x, r)| elementi e quindi
|C| · |S(x, r)| ≤ q n .
Nota 3.4.5. La stima di Hamming è quasi sempre migliore di quella di Singleton. Infatti si dimostra che se C ⊆ An2 è un codice con distanza minima d, i
parametri per cui la stima di Singleton è migliore di quella di Hamming sono solo
i seguenti.
• d = 2 e n qualunque;
• d = 4 e n = 4, 5, 6;
• d = 6 e N = 6, 7;
• d pari, d ≥ 8 e n = d.
Un’altra stima superiore per |C| si ottiene considerando il massimo valore
possibile della distanza tra due parole distinte del codice.
Teorema 3.4.6 (Stima di Plotkin). Sia C ⊆ Anq con distanza minima d e tale
che qd − n(q − 1) > 0. Allora si ha
|C| ≤
qd
.
qd − n(q − 1)
Dimostrazione. Per la dimostrazione si rinvia a [2] pag. 413.
I codici C per i quali nella stima di Hamming vale l’uguaglianza si dicono
perfetti. Ad esempio il codice (7, 4) di Hamming è perfetto.
Definizione 3.4.7. Sia C ⊆ Anq un codice h-correttore. C si dice perfetto se
|C| = Ph
i=0
qn
n
(q − 1)i
i
I seguenti codici sono detti codici perfetti banali.
(1) C = Anq verifica l’uguaglianza per h = 0.
(2) C tale che |C| = 1 , in questo caso ogni n-pla viene decodificata nell’unica
parola del codice.
4. RELAZIONI FRA I PARAMETRI DI UN CODICE
26
(3) C = {(00 · · · 0), (11 · · · 1)} binario di lunghezza n dispari, costituito dalle
sole due parole aventi come componenti tutti 0 oppure tutti 1, corregge
n−1
errori ed è perfetto.
2
Nota 3.4.8. Dalla definizione 3.4.7 seguono immediatamente le seguenti caratterizzazioni e le seguenti condizioni necessarie di esistenza.
(1) Un codice C h-correttore è perfetto se e solo se l’unione di tutte le sfere
S(x, h), x ∈ C, coincide con l’insieme di tutte le parole possibili.
(2) Un codice C h-correttore è perfetto se e solo se la famiglia {S(x, h)}x∈C
delle sfere di centro x ∈ C e raggio h costituisce una partizione di Fq .
(3) Un codice C h-correttore è perfetto se e solo se ogni n-pla di Anq ha una
distanza minore od uguale ad h da una ed una sola parola di C .
(4) Condizione necessaria affinchè un codice C ⊆ Anq , h-correttore, sia perfetto
è che
h X
n
(q − 1)i | q n .
i
i=0
(5) Condizione necessaria per l’esistenza di un codice C ⊆ Anq 1-correttore
perfetto è che
(1 + n(q − 1)) | q n .
(6) Non esistono codici binari 1-correttori perfetti di lunghezza pari .
Esempio 3.4.9. Consideriamo il piano proiettivo di ordine 2 o piano di Fano.
P = {1, 2, 3, 4, 5, 6, 7} è l’insieme dei punti.
1
2
4
6
5
3
7
per 5,5 cm
B = {B1 = {1, Formato
2, 4}, B5,5
2 = {2, 3, 5}, B3 = {3, 4, 6}, B4 = {4, 5, 7}, B5 = {5, 6, 1}, B6 =
{6, 7, 2}, B7 = {7, 1, 3}} è l’insieme
Altezza delle
figura 4rette.
cm width=4 cm
La matrice d’incidenza A del piano di Fano è :
4. RELAZIONI FRA I PARAMETRI DI UN CODICE
B1
B2
B3
B4
B5
B6
B7
1
1
0
0
0
1
0
1
2
1
1
0
0
0
1
0
3
0
1
1
0
0
0
1
4
1
0
1
1
0
0
0
5
0
1
0
1
1
0
0
6
0
0
1
0
1
1
0
27
7
0
0
0
1
0
1
1
A partire da questa matrice d’incidenza, costruiamo un codice binario 1-correttore
perfetto C nel modo seguente.
Le parole di C sono:
(1) Le sette righe della matrice A che denoteremo con ci .
(2) Le sette righe della matrice Ā ottenuta da A scambiando tra loro i simboli
0 e 1. Ad esempio la prima riga di Ā dà la parola 0010111. Denotiamo
con c̄i tali parole.
(3) Le parole 0 = (0000000) ed 1 = (1111111).
Per come costruite le parole e ricordando le proprietà del piano proiettivo, è facile
verificare che C ha distanza minima d = 3. Il codice è 1-correttore e |C| = 16. C è
perfetto perchè :
27
qn
27
= 7
= 16 = |C|
=
Ph n
i
1+7
(2 − 1)0 + 71 (2 − 1)1
0
i=0 i (q − 1)
Dopo aver considerato tre limitazioni superiori per |C|, riportiamo una limitazione inferiore .
Teorema 3.4.10 (Stima di Gilbert-Varshamov). Sia M = |C| il massimo per
cui esiste un codice C ⊆ Anq con distanza minima d. Si ha
M ≥ Pd−1
i=0
qn
n
(q − 1)i
i
Dimostrazione. Costruiamo un codice C che verifica l’uguaglianza. Consideriamo una qualunque x1 ∈ Anq e mettiamola in C. Scegliamo una seconda parola
x2 ∈ Anq che abbia distanza almeno d da x1 e mettiamola in C. Scegliamo una
terza parola x3 ∈ Anq che abbia distanza almeno d sia da x1 che da x2 . Procediamo
allo stesso modo. Dopo aver scelto le prime h parole x1 , . . . , xh aventi tutte a due
a due distanza almeno d tra di loro, scegliamo la (h + 1)-esima parola xh+1 avente
distanza almeno d da tutte le parole x1 , . . . , xh , sempre che questo sia possibile.
Infatti il procedimento avrà termine perchè ad un certo punto non ci sarà più
spazio per scegliere ancora una parola. A questo punto si è costruito un codice C
5. (N, K)-CODICI, CODICI MDS, CODICI EQUIVALENTI
28
che ha la seguente proprietà: l’unione di tutte le sfere S(x, d − 1) con centri nei
punti x ∈ C coincide con tutto Anq , se così non fosse avremmo potuto continuare.
Il codice costruito è tale che
M · |S(x, d − 1)| ≥ q n
da cui segue la stima per M .
Quanto esposto fino ad ora giustifica il fatto che ad un buon codice si richiedono
le seguenti proprietà:
• lunghezza n abbastanza piccola per permettere una trasmissione veloce
delle sue parole;
• un numero M di parole abbastanza grande per codificare una buona
quantità di messaggi;
• distanza minima abbastanza grande per correggere il maggior numero
possibile di errori.
Ovviamente queste richieste sono fra loro contrastanti e perciò non è possibile
ottimizzare uno dei parametri senza avere preventivamente fissato gli altri due.
Questo tipo di problema è quello comunemente noto con il nome di problema
fondamentale della teoria dei codici.
5. (n, k)-codici, codici MDS, codici equivalenti
Esistono codici nei quali una parola rimane individuata univocamente assegnando un numero di simboli minore della lunghezza delle parole.
Definizione 3.5.1. Siano i1 , i2 , . . . , ik interi positivi tali che 1 ≤ i1 < i2 <
. . . < ik ≤ n. I posti i1 , i2 , . . . , ik sono detti posti di informazione per un codice
C ⊆ Anq se, comunque si fissi una k-upla (y1 , y2 , . . . , yk ), yi ∈ Aq , esiste una ed una
sola parola di C tale che nel posto i1 compaia y1 , nel posto i2 compaia y2 , . . . , nel
posto ik compaia yk .
Definizione 3.5.2. Un codice C ⊆ Anq avente k posti di informazione si dice
(n, k)-codice oppure codice sistematico.
5. (N, K)-CODICI, CODICI MDS, CODICI EQUIVALENTI
29
Se esistono k posti d’informazione, l’applicazione di C in Akq che ad ogni parola
di C associa la k-upla che si presenta nei k posti d’informazione è biunivoca perchè
la k-upla individua la parola univocamente e pertanto M = |C| = q k . I k simboli
che compaiono nella k-upla sono detti di informazione mentre i rimanenti n − k
simboli sono detti di controllo o ridondanti. In un (n, k)-codice le sequenze
emesse dal codificatore di sorgente vengono suddivise in k-uple e ad ogni k-upla
vengono aggiunti n−k simboli di controllo mediante un fissato algoritmo; in questo
modo ogni k-upla viene trasformata in una n-upla. Poichè in un (n, k)-codice è
possibile distinguere i simboli di informazione da quelli ridondanti, questi codici
sono anche detti separabili. Il rapporto nk viene detto tasso di informazione
di un (n, k)-codice.
Teorema 3.5.3. Se C ⊆ Anq è un (n, k)-codice allora |C| = q k .
Dimostrazione. Segue dalla biezione esistente fra C e Akq .
Esempio 3.5.4. Sia C il codice formato dalle parole: C = {0011, 0101, 1101}.
Dire se C è un (4, 2)-codice.
Risposta - NO, perchè non vale il Teorema 3.5.3, infatti |C| 6= 22 .
Analizziamo il codice solo in base alla definizione di (n, k)-codice.
(1) I posti {1, 2} non sono di informazione, infatti delle possibili coppie 00, 01,
10, 11 in C manca 10.
(2) I posti {1, 4} non sono di informazione perchè manca la coppia 00 e la
coppia 01 figura due volte.
Analogamente per le altre coppie di posti e dunque poichè C non ha due posti di
informazione non è un (4, 2)-codice.
Esempio 3.5.5. Consideriamo il codice C = {0011, 0101, 1100, 1011}. I posti
{1, 2} sono di informazione come anche i posti {1, 3}; al contrario comunque si
considerino altri due posti, essi non sono di informazione. C è un (4, 2)-codice.
Esempio 3.5.6. I codici
C1 = {0000, 1100, 1010, 1001, 0110, 0101, 0011, 1111}
C2 = {1000, 0100, 0010, 0001, 1110, 1011, 1101, 0111}.
sono entrambi dei (4, 3)-codici perchè tre qualsiasi posti sono di informazione.
Teorema 3.5.7 (Limitazione di Singleton). Se C ⊆ Anq è un (n, k)-codice allora
d ≤ n − k + 1.
5. (N, K)-CODICI, CODICI MDS, CODICI EQUIVALENTI
30
Dimostrazione. Se C è un (n, k)-codice con distanza minima d, allora per
3.4.1 e 3.5.3 si ha
|C| ≤ q n−d+1 e |C| = q k .
Queste relazioni implicano k ≤ n − d + 1 da cui d ≤ n − k + 1 .
La disuguaglianza di 3.5.7 dà una limitazione superiore per la distanza minima
di un (n, k)-codice. Se, da un lato, al crescere della ridondanza n−k può aumentare
la capacità del codice di correggere errori, dall’altro al crescere della ridondanza
diminuisce il tasso di informazione nk il quale dà la misura della percentuale di
informazione contenuta in una n-upla.
Come già detto, in un buon codice dovrebbero essere grandi sia nk (e quindi
poca ridondanza) sia la distanza minima (più grande è d più il codice ha possibilità
di correggere errori). Poichè le due cose si contrappongono, occorre trovare codici
in cui i parametri siano in un giusto equilibrio.
Definizione 3.5.8. Un (n, k)-codice si dice ottimale oppure MDS ( a massima distanza separabile) se, comunque presi k posti, essi sono di informazione.
Teorema 3.5.9. Condizione necessaria e sufficiente affinchè un (n, k)-codice
C con distanza minima d sia un codice MDS è che sia d = n − k + 1 .
Dimostrazione. Sia C un codice MDS. Supponiamo per assurdo che sia d <
n−k+1 ossia d ≤ n−k, allora esistono in C due parole x e y tali che d(x, y) ≤ n−k;
queste due parole hanno almeno k componenti uguali e pertanto esistono k posti
che non sono di informazione contro l’ipotesi che C sia MDS. Deve pertanto essere
d = n − k + 1.
Viceversa, sia d = n − k + 1. Se per assurdo C non fosse MDS, ci sarebbero
k posti non di informazione. Siano x e y le parole aventi componenti uguali nei k
posti non di informazione. Si ha d(x, y) ≤ n − k < d e ciò è assurdo perchè d è la
distanza minima del codice.
Esempio 3.5.10. I codici C1 e C2 dell’esempio 3.5.6 sono (4, 3)-codici ottimali.
Infatti hanno entrambi distanza minima d = 4 − 3 + 1 = 2.
Esempio 3.5.11. Sia (F, +) un gruppo additivo di ordine q. Prendendo F come
alfabeto, consideriamo il codice C di lunghezza n, definito da
n
X
C = {(x1 , x2 , . . . , xn ) | xi ∈ F,
xi = 0}.
i=1
5. (N, K)-CODICI, CODICI MDS, CODICI EQUIVALENTI
31
Se in ogni n-pla fissiamo n − 1 elementi, rimane univocamente determinato l’elemento n-simo perchè deve risultare x1 + x2 + · · · + xn = 0.
Dunque C è un codice con n − 1 posti d’informazione e pertanto è un (n, n − 1)codice. Poichè è possibile scrivere qualsiasi elemento in funzione dei rimanenti
n − 1, il codice C è MDS. Allora la distanza minima è d = n − (n − 1) + 1 = 2.
Poichè n − 1 posti qualsiasi sono di informazione, ogni parola ha un solo simbolo
di controllo.
Esempio 3.5.12. Codice a ripetizione : è così detto un codice C in cui i
simboli che compaiono in una qualsiasi parola sono tutti uguali tra loro.
Se C è un codice a ripetizione di lunghezza n, allora il codice è un (n, 1)-codice;
infatti un solo simbolo è sufficiente per individuare una parola. Inoltre C è un
codice MDS perchè qualsiasi posto è di informazione. La distanza minima è allora
c errori.
d = n − 1 + 1 = n. Il codice C corregge allora fino a b n−1
2
NOTA - Il codice a ripetizione è un codice con molta ridondanza e quindi
poco conveniente perchè per trasmettere una informazione si devono usare troppi
simboli; inoltre contiene solo q parole (supposto che l’alfabeto abbia q simboli).
Esempio 3.5.13. Costruzione di un (p, 2)-codice MDS con alfabeto F =
GF (p), p primo.
La costruzione che presentiamo è il caso p = 3. Sia F = {0, 1, 2}.
Passo 1. Si scrivono le parole aventi le componenti tutte uguali fra loro:
000, 111, 222
Passo 2 . Pensando le tre parole precedenti scritte in colonna, si considera come
quarta parola la diagonale 012 . Si costruiscono altre due parole sommando 1 ad
ogni componente di essa (somma modulo 3) :
012, 120, 201
Passo 3 . Si ripete il passo 2. e si ottengono :
021, 102, 210
Quando sulla diagonale otteniamo una parola già presa in considerazione, (000),
il processo termina e ciò accade al passo p, quando abbiamo ottenuto tutte le p2
parole del codice: C = {000, 111, 222, 012, 120, 201, 021, 102, 210}.
Definizione 3.5.14. Due codici C1 , C2 ⊆ Anq si dicono equivalenti se è possibile ottenere tutte le parole di C2 da quelle di C1 applicando un numero finito di
volte le seguenti operazioni:
(1) permutazione delle n posizioni (1, 2, . . . , n) in tutte le parole di C1 ;
5. (N, K)-CODICI, CODICI MDS, CODICI EQUIVALENTI
32
(2) permutazione dei simboli dell’alfabeto applicata, in tutte le parole, alle
componenti che occupano una posizione fissata.
Se C ⊆ Anq , |C| = M , le parole di C possono essere scritte come righe di una
tabella avente M righe ed n colonne. L’operazione 1) corrisponde ad una permutazione delle colonne della tabella, l’operazione 2) corrisponde ad una permutazione
dei simboli dell’alfabeto Aq applicata ad una colonna della tabella.
Esempio 3.5.15. Consideriamo i seguenti due codici binari:
C1 :
00000
C2 :
00100
01101
00011
10110
11111
11011
11000
Verifichiamo che C2 è equivalente a C1 . Applicando ai simboli che compaiono nella
terza posizione delle parole di C2 la permutazione 0 7→ 1, 1 7→ 0 , si ottiene il
codice C3 :
C3 :
0 0 0 0 0
0 0 1 1 1
1 1 0 1 1
1 1 1 0 0
Applicando alle colonne di C3 la permutazione 1 7→ 1, 2 7→ 4, 3 7→ 3, 4 7→ 2, 5 7→ 5
si ottengono le parole
0 0
0 1
1 1
1 0
che sono le parole
0
1
0
1
di
0 0
0 1
1 1
1 0
C1 .
Esempio 3.5.16. Consideriamo il codice ternario
C:
0 1 2
1 2 0
2 0 1
proviamo che esso è equivalente ad un codice a ripetizione.
Applichiamo ai simboli della prima posizione (colonna) la permutazione
0 7→ 0, 1 7→ 2, 2 7→ 1 ;
ai simboli della seconda posizione applichiamo la permutazione
0 7→ 1, 1 7→ 0, 2 7→ 2 ;
5. (N, K)-CODICI, CODICI MDS, CODICI EQUIVALENTI
33
ai simboli della terza posizione applichiamo la permutazione
0 7→ 2, 1 7→ 1, 2 7→ 0 .
Si ottiene
0 0 0
2 2 2
1 1 1
che sono le parole del codice ternario a ripetizione di lunghezza 3.
Il concetto di codici equivalenti è importante perchè due codici equivalenti
correggono lo stesso numero di errori. Ciò segue dal fatto che le operazioni
descritte per costruire codici equivalenti non cambiano la distanza tra due qualsiasi
parole e perciò neanche la distanza minima. Due codici equivalenti hanno dunque
le stesse proprietà metriche, così come hanno la stessa ridondanza e la stessa
efficienza.
Teorema 3.5.17. Dato un codice C ⊆ Anq esiste sempre un codice C1 ⊆ Anq
equivalente a C e contenente una qualsiasi fissata parola v ∈ Anq \ C.
Dimostrazione. Sia p una qualunque parola di C. Applicando al più n
permutazioni sui simboli, dalla parola p si ottiene la parola v.
Esempio 3.5.18. Dato il codice binario
C = {001, 101, 110, 011},
costruire un codice C1 equivalente a C e tale che 000 ∈ C1 .
Soluzione - Basta applicare ai simboli che compaiono al terzo posto la permutazione 0 7→ 1, 1 7→ 0 . Infatti si ottiene :
000, 100, 111, 010
che sono le parole di un codice equivalente a C.
Da quanto esposto fino ad ora, appare evidente che nella teoria dei codici
correttori è importante avere:
(1) Codici capaci di correggere un prefissato numero di errori.
(2) Codici di facile codifica e di facile decodifica.
5. (N, K)-CODICI, CODICI MDS, CODICI EQUIVALENTI
34
Per affrontare questi problemi occorre avere codici che abbiano una struttura
algebrica 00 ricca 00 . Per rendersi conto di ciò, basta pensare ad un codice C costruito
su un alfabeto di 10 simboli ed avente 100 posti di informazione. C contiene 10100
parole, la codifica e la decodifica sono teoricamente possibili, ma non praticamente
per l’elevato numero di parole di C. Se poi si vuole determinare la distanza minima
100
si devono fare 102 confronti !!!
Anche per superare questi problemi, sono stati introdotti i codici lineari che
senza dubbio sono una delle più importanti famiglie di codici.
CAPITOLO 4
Codici Lineari
L’importanza dei codici lineari sta nel fatto che l’insieme delle parole ha una
forte struttura algebrica e per questo sono facilitate molte operazioni quali:
• calcolare i parametri del codice;
• codificare e trasmettere i messaggi;
• decodificare i messaggi;
• scoprire e correggere errori;
• calcolare la probabilità di una corretta decodifica.
1. Definizioni e prime proprietà
Sia Fq = GF (q), q = pt , p primo, t ≥ 1, un campo di Galois. Nel seguito con
Fq si intenderà sempre il campo GF (q) e sarà l’alfabeto su cui è definito il codice.
Sotto questa ipotesi la struttura algebrica più naturale da usare su Fqn è quella di
spazio vettoriale sul campo Fq ; ricordiamo che in questo caso gli elementi di Fqn si
chiamano vettori di ordine n sul campo Fq i cui elementi si dicono scalari.
Definizione 4.1.1. Un codice C si dice lineare se è un sottospazio vettoriale
di Fqn .
Esempio 4.1.2. Costruiamo un codice lineare binario C di dimensione due
e lunghezza 5. Consideriamo F2 = GF (2) e definiamo C come il sottospazio
vettoriale di F25 avente per base B = {b1 = (1 0 1 1 1), b2 = (1 1 1 1 0)}.
Risulta C = {λb1 + µb2 | λ, µ ∈ F2 } e pertanto
(0
(1
(0
(1
0)
0)
1)
1)
→
→
→
→
0 · b1 + 0 · b2
1 · b1 + 0 · b2
0 · b1 + 1 · b2
1 · b1 + 1 · b2
= (0
= (1
= (1
= (0
0
0
1
1
0
1
1
0
0
1
1
0
0)
1)
0)
1)
Quindi C = {(0 0 0 0 0), (1 0 1 1 1), (1 1 1 1 0), (0 1 0 0 1)}. Questo codice ha
distanza minima d = 2.
35
1. DEFINIZIONI E PRIME PROPRIETÀ
36
Si osservi che dalla definizione segue
• C è un codice lineare se e solo se la somma di due parole e il prodotto di
una parola per uno scalare è ancora una parola del codice.
• Se C è un codice lineare di dimensione k allora C è un (n, k)-codice (vedi
teorema 4.2.2) ed è isomorfo a Fqk e pertanto |C| = q k . Inoltre se C ha
distanza minima d si ha k ≤ n − d + 1, d ≤ n − k + 1, |C| ≤ q n−d+1 .
• Un codice lineare contiene sempre la parola (0, 0, . . . , 0) perchè 00 contiene00
sempre il vettore nullo.
• Il numero dei sottospazi k dimensionali di V = Fqn è
(q n − 1)(q n−1 − 1) · · · (q n−k+1 − 1)
(q k − 1)(q k−1 − 1) · · · (q − 1)
e pertanto vi sono esattamente sk possibili (n, k)-codici differenti.
sk =
Nota 4.1.3. Come mostra il seguente esempio, spazi vettoriali isomorfi possono
dare codici con distanza minima diversa e perciò non equivalenti.
Esempio 4.1.4. Sia F = GF (2). Sia C1 = {λ(1, 0, 0) + µ(0, 1, 0), ∀ λ, µ ∈ F }
il sottospazio di F 3 di dimensione 2 generato da v1 = (1, 0, 0) e v2 = (0, 1, 0).
Sia ora C2 = {λ(1, 1, 0) + µ(1, 0, 1), ∀ λ, µ ∈ F } il sottospazio di F 3 di
dimensione 2 generato da w1 = (1, 1, 0) e w2 = (1, 0, 1).
C1 e C2 come spazi vettoriali sono isomorfi ma non lo sono come codici. Infatti
risulta d(C1 ) = 1 mentre d(C2 ) = 2 come si verifica facilmente esplicitando le parole
dei due codici. C1 e C2 sono dei (3, 2)-codici lineari binari e quindi contengono
22 = 4 parole .
C1 = {(0, 0, 0), (1, 0, 0), (0, 1, 0), (1, 1, 0)}, C2 = {(0, 0, 0), (1, 0, 1), (1, 1, 0), (0, 1, 1)}.
Definizione 4.1.5. Si definisce peso di Hamming w(x) di un vettore x ∈ Fqn
il numero delle componenti non nulle di x.
Teorema 4.1.6. Sia C un codice lineare con distanza minima d. Si ha
• d(x, y) = w(x − y), ∀ x, y ∈ C
• d è uguale al minimo peso delle sue parole non nulle.
Dimostrazione. Siano x, y ∈ C, poichè d(x, y) è il numero di posti in cui le
componenti di x e y sono diverse, si ha che d(x, y) è il numero delle componenti
non nulle della parola x − y ∈ C ossia d(x, y) = w(x − y).
Sia ora d la distanza minima di C, allora esistono due parole x, y ∈ C tali
che d(x, y) = d cioè w(x − y) = d(x, y), quindi il peso minimo è d oppure
un intero minore di d. Se esistesse una parola y ∈ C con w(y) < d, seguirebbe
d(y, 0) = w(y) < d, e perciò d non sarebbe la distanza minima.
2. MATRICI GENERATRICI
37
Il teorema ora dimostrato mette in evidenza l’importanza della nozione di peso di Hamming. Per un codice non lineare trovare la minima distanza significa
calcolare la distanza
di ogni coppia di parole del codice ossia occorre calcolare
|C|
e confrontare 2 distanze, mentre per i codici lineari il problema si risolve con
il calcolo del peso delle singole parole del codice ossia è sufficiente calcolare e
confrontare i |C| − 1 pesi di Hamming delle parole non nulle di C.
Abbiamo dimostrato che un codice con distanza minima d pari, oltre a correggere d2 − 1 errori, rivela d2 errori (vedi teorema 3.2.11). E’ dunque utile il seguente
risultato.
Teorema 4.1.7. Un codice lineare binario C ⊆ F2n con distanza minima d
dispari esiste se e solo se esiste un codice binario C1 ⊆ F2n+1 avente distanza
minima d + 1 e con |C| = |C1 |. Inoltre C1 è lineare.
Dimostrazione. Si rinvia a [1] pag. 126.
2. Matrici generatrici
L’operazione di codifica di un messaggio mediante un codice lineare è una
trasformazione lineare e pertanto un vantaggio nel considerare codici lineari è
quello di avere la possibilità di una rapida descrizione del codice e della facile
decodifica delle parole. Uno dei metodi con cui ciò si realizza è la 00 costruzione00 di
una matrice che lo rappresenta.
Ad esempio
Nello spazio vettoriale V = F25 i vettori v1 = (1 0 0 0 1), v2 = (1 1 0 1 0), v3 =
(1 1 1 0 1) formano una base per un (5, 3)-codice binario C (associato al sottospazio
F23 di V = F25 ). Sia

 

v1
1 0 0 0 1
G =  v2  =  1 1 0 1 0  .
v3
1 1 1 0 1
Comunque preso un vettore m = (m1 m2 m3 ) di F23 rappresentante il messaggio da
trasmettere, possiamo trovare la parola p di C che gli corrisponde, ossia il vettore
di F25 che sarà trasmesso, calcolando
p = m1 v1 + m2 v2 + m3 v3 = mG.
2. MATRICI GENERATRICI
38
Se ad esempio m = (1 0 1) , verrà trasmesso


1 0 0 0 1
mG = (1 0 1)  1 1 0 1 0  = (0 1 1 0 0).
1 1 1 0 1
Generalizziamo
Sia C ⊆ Fqn un codice lineare di dimensione k ≤ n, sia {e1 , e2 , . . . , ek } una base
di C e sia {b1 , b2 , . . . , bn } una base di Fqn . Ogni vettore ei può essere scritto in modo
unico come combinazione lineare dei vettori bi :

e1 = e11 b1 + e12 b2 + · · · + e1n bn


 e2 = e21 b1 + e22 b2 + · · · + e2n bn
..

.


ek = ek1 b1 + ek2 b2 + · · · + ekn bn
Pertanto è unica la matrice
e11 · · ·
 e21 · · ·
G=
 ...

e1k · · ·
e2k · · ·

e1n
e2n 


ek1 · · · ekk · · · ekn
G è di tipo k × n, ha rango k essendo {ei } una base di C.
Definizione 4.2.1. Sia C ⊆ Fqn un codice lineare di dimensione k. Si definisce
matrice generatrice di C una matrice di tipo k×n le cui righe sono le componenti
dei vettori di una base di C rispetto una base di Fqn .
Osserviamo che, se invece di prendere una base del codice prendessimo un sistema di generatori x1 , . . . , xh , h ≥ k, perverremmo con lo stesso procedimento
sopra descritto , ad una matrice di tipo h × n di rango k, che può ancora considerarsi una matrice generatrice. La restrizione sulla indipendenza delle righe della
matrice generatrice non è strettamente necessaria, è utile per minimizzare l’ingombro algoritmico e di registrazione dei dati. Per questo quando si parla di matrice
generatrice si intende quella costruita a partire da una base del codice.
Di norma come base di V = Fqn si considera la base canonica.
Un vantaggio che si ha considerando codici lineari è che la loro descrizione è
molto più semplice attraverso la matrice G che non con l’elenco delle parole del
codice. Se ad esempio C è un (50, 40)-codice lineare binario allora
|C| = 240 = (24 )10 > 1010
2. MATRICI GENERATRICI
39
mentre G, avendo 40 righe e 50 colonne, ha 2000 elementi.
Teorema 4.2.2. Un codice lineare C ⊆ Fqn di dimensione k è un (n, k)-codice.
Dimostrazione. Siano {ei }, i = 1, · · · , k e {bj }, j = 1, · · · , n, basi rispettivamente di C e di Fqn e sia


e11 · · · e1k · · · e1n
 e21 · · · e2k · · · e2n 

G=

 ...
ek1 · · · ekk · · · ekn
la matrice generatrice di C rispetto alle basi fissate. Poichè G ha rango k, in essa
esiste almeno un minore di ordine k non nullo. Sia ad esempio
e11 · · · e1k e21 · · · e2k .
..
e
k1 · · · ekk
Proviamo che i primi k posti sono di informazione.
Si deve provare che assegnata una qualsiasi k-upla (a1 , · · · , ak ) c’è una ed una
sola parola x = (x1 x2 · · · xk )G = x1 e1 + · · · + xk ek (x è una n-upla) che ha a1
come prima componente, a2 come seconda componente, . . . , ak come k-esima
componente. Ciò equivale a provare che il sistema

x1 e11 + x2 e21 + · · · + xk ek1 = a1


 x1 e12 + x2 e22 + · · · + xk ek2 = a2
(x1 x2 · · · xk )G =
..

.


x1 e1k + x2 e2k + · · · + xk ekk = ak
ha una ed una sola soluzione e questo segue dal fatto che esso è un sistema lineare
di k equazioni in k incognite con determinante della matrice dei coefficienti non
nullo per ipotesi. Inoltre le rimanenti (n−k) componenti ak+1 , . . . , an di tale parola
sono combinazioni lineari di x1 , . . . , xk tramite i coefficienti eij , e pertanto sono
univocamente determinate.
Corollario 4.2.3. Un codice lineare di dimensione k è MDS se e solo se ogni
minore di ordine k di una sua matrice generatrice è non nullo.
Dimostrazione. Segue dal teorema precedente poichè un (n, k)-codice è M DS
se k posti qualsiasi sono di informazione.
2. MATRICI GENERATRICI
40
Come già osservato nell’esempio 4.1.4, due qualunque (n, k)-codici lineari sono
sempre isomorfi come spazi vettoriali ma un isomorfismo fra spazi vettoriali non
assicura che venga conservata la struttura metrica e pertanto non è detto che
due qualunque (n, k)-codici lineari siano equivalenti perchè possono avere distanza
minima diversa. La definizione di equivalenza tra codici data in 3.5.14 per due
codici a blocchi qualsiasi vale, ovviamente, anche per i codici lineari ma in generale
con questa definizione non è detto venga conservata la proprietà di linearità ossia
un codice lineare può risultare equivalente a un codice non lineare. Ad esempio :
Sia C = {(0, 1), (0, 0)}, esso è un (2, 1)-codice binario lineare. Come codice, per
la definizione 3.5.14 esso è equivalente al (2, 1)-codice C1 = {(1, 1), (1, 0)}, ma C1
non è lineare non essendo sottospazio vettoriale.
Quanto osservato motiva il fatto che la 3.5.14 si modifichi per i codici lineari
nel senso seguente.
Definizione 4.2.4. Due codici lineari C1 , C2 ⊆ Fqn si dicono equivalenti se è
possibile ottenere tutte le parole di uno di essi da quelle dell’altro applicando un
numero finito di volte le seguenti operazioni:
(1) permutazione delle n posizioni (1, 2, . . . , n);
(2) moltiplicazione dei simboli che compaiono in una data posizione per uno
scalare non nullo.
Rispetto alla 3.5.14 viene modificata la proprietà (2) perchè è importante passare da un codice lineare ad un codice equivalente che sia ancora lineare ed abbia
la stessa distanza minima. Ricordando che un codice lineare si può 00 identificare00
con una sua matrice generatrice, se sui simboli che compaiono in una colonna della
matrice generatrice di un codice lineare C si applicasse una permutazione qualsiasi,
si otterrebbe un codice che, anche se fosse ancora lineare, potrebbe avere distanza
minima diversa. Vediamo un esempio.
Esempio 4.2.5. Sia C ⊆ F33 un codice di dimensione 2 con matrice generatrice
1 1 0
G=
0 1 2
Si ha C = {λ(1, 1, 0) + µ(0, 1, 2)} = {(λ, λ + µ, 2µ), λ, µ ∈ GF (3)}. Per (λ, µ) 6=
(0, 0) ogni parola di C ha almeno due componenti non nulle e quindi d(C) = 2.
Operando sui simboli del secondo posto (seconda colonna) tramite la permutazione
0 7→ 1, 1 7→ 0, 2 7→ 2 la matrice G viene trasformata in
1 0 0
G1 =
0 0 2
2. MATRICI GENERATRICI
41
che è matrice generatrice di un codice C1 ⊆ F33 con d(C1 ) = 1. I codici C e C1 sono
isomorfi come spazi vettoriali ma non come codici perchè hanno distanza minima
diversa.
E’ possibile operare su una matrice generatrice di un codice lineare in modo da
avere una matrice generatrice dello stesso codice o di un codice lineare equivalente.
Teorema 4.2.6. Due matrici G e G1 ad elementi in GF (q) e di tipo k ×
n generano (n, k)-codici lineari equivalenti se una delle due matrici può essere
ottenuta dall’altra tramite una sequenza finita di trasformazioni dei seguenti tipi:
(1) scambiare due righe;
(2) moltiplicare gli elementi di una riga per un elemento non nullo di GF (q);
(3) sommare ad una riga un’altra riga moltiplicata per un elemento non nullo
di GF (q);
(4) permutare due colonne;
(5) moltiplicare gli elementi di una colonna per un elemento non nullo di
GF (q).
Dimostrazione. Le operazioni (1), (2), (3) danno un cambiamento di base
dello spazio vettoriale, dunque si ha lo stesso spazio vettoriale, cioè lo stesso codice
rappresentato dalla matrice di partenza.
L’operazione (4) equivale ad una permutazione delle posizioni (1, 2, . . . , n).
L’operazione (5) equivale a moltiplicare le componenti di tutte le parole che
occupano una posizione fissata per un elemento non nullo di GF (q).
Nota 4.2.7. Si osservi che sommare ad una colonna un’altra colonna moltiplicata per un elemento non nullo di GF (q), non preserva l’equivalenza di codici.
Dunque in una matrice generatrice il ruolo ricoperto dalle righe e dalle colonne
non è simmetrico.
La matrice generatrice di un codice lineare non è unica perchè dipende dalle basi
fissate. E’ quindi importante scegliere matrici generatrici il più semplice possibile
ma equivalenti ossia che generino codici equivalenti. Per un codice lineare C ⊆ Fqn
di dimensione k si può scegliere la seguente matrice detta forma standard o
forma ridotta normale.

1 0 . . . 0 x1,k+1 . . . x1,n
 0 1 . . . 0 x2,k+1 . . . x2,n 

S=
 ...


0 0 . . . 1 xk,k+1 . . . xk,n
2. MATRICI GENERATRICI
42
In forma più compatta questa matrice si può scrivere nel seguente modo
S = (Ik |A)
dove Ik è la matrice unitaria di ordine k ed è data dalle prime k colonne di S,
mentre A è la matrice rimanente. La convenienza di una matrice in questa forma
è che, una volta codificato il vettore a = (a1 , . . . , ak ) si ottiene un vettore che nelle
prime k componenti coincide con a. Dunque la ridondanza del codice è esattamente
nelle rimanenti (n − k) componenti.
Si osservi che la forma standard di una matrice generatrice non è unica. Per
esempio una permutazione qualsiasi delle colonne della matrice A porta alla costruzione di un’altra matrice T , generatrice di un codice equivalente a C perchè T
è sempre in forma standard ( [3], pag. 64).
Corollario 4.2.8. Per ogni (n, k)-codice (o codice sistematico) sopra un campo Fq esiste una matrice standard
G = (Ik |A)
le cui righe generano C oppure generano un (n, k)-codice C1 equivalente a C. Viceversa se C ammette una matrice standard allora è un codice sistematico.
Esempio 4.2.9. Sia C un codice lineare su GF (2) avente matrice generatrice

1 0 1 1 1
G= 0 1 1 0 1 
1 1 0 0 0

(1) Trasformare G in forma normale.
(2) Determinare quante parole contiene C.
(3) Trovare la distanza minima d.
Soluzione (1) Poichè il minore costituito dalle prime tre colonne è nullo, non è possibile
trasformare G in forma standard usando solo trasformazioni elementari sulle righe. Per avere le prime tre colonne linearmente indipendenti,
applichiamo alle posizioni (ossia alle colonne di G) la permutazione
1 7→ 4, 2 7→ 2, 3 7→ 3, 4 7→ 1, 5 7→ 5,
otteniamo la matrice


1 0 1 1 1
Ḡ =  0 1 1 0 1 
0 1 0 1 0
3. CODIFICA NEI CODICI LINEARI
43
che ha le prime tre colonne linearmente indipendenti e perciò si può operare sulle righe. Sostituendo la terza riga con la somma della seconda e
terza riga, si ottiene


1 0 1 1 1
 0 1 1 0 1 
0 0 1 1 1
Sostituendo alla prima riga la somma della prima con la terza riga e
sostituendo alla seconda riga la somma della seconda e terza riga, si ottiene


1 0 0 0 0
 0 1 0 1 0 
0 0 1 1 1
che è una matrice in forma standard e genera un codice equivalente a
quello dato.
(2) C ha lunghezza 5 e dalla G si deduce che k = 3, pertanto C è un (5, 3)codice binario e dunque |C| = 23 = 8.
(3) La parola (10000) appartiene a C ed ha peso 1 e perciò d = 1.
3. Codifica nei codici lineari
Codificare un messaggio in un (n, k)-codice significa associare ad un messaggio
costituito da k simboli una parola data da una n-upla in modo che ad ogni k-upla
corrisponda una ed una sola parola.
Per i codici lineari l’algoritmo di codifica è quello di seguito illustrato.
Sia C ⊆ Fqn , Fq = GF (q), un (n, k)-codice lineare avente matrice generatrice


e11 · · · e1k · · · e1n
 e21 · · · e2k · · · e2n 

G=
 ...

ek1 · · · ekk · · · ekn
Supponiamo che i primi k posti siano di informazione. Le parole del codice C
sono le n-uple che si ottengono combinando linearmente le righe di G tramite le
k-uple di elementi di Fq . Codifichiamo ogni messaggio m = (m1 , m2 , . . . , mk ) nella
parola di C che si ottiene moltiplicando m per G, dunque m viene codificata in
3. CODIFICA NEI CODICI LINEARI
e11 · · ·
 e21 · · ·
c = (m1 , m2 , · · · , mk ) 
 ...

e1k · · ·
e2k · · ·
44

e1n
e2n 
 = (c1 , c2 , · · · , cn )

ek1 · · · ekk · · · ekn
ossia
c=m·G
dove il prodotto è, come di consueto, righe per colonne, cioè l’i-esima coordinata
del prodotto m · G è il prodotto scalare ci = m1 e1,i + m2 e2,i + · · · + mk ek,i . In definitiva l’operazione di codifica procede per semplici operazioni algebriche di somma
e prodotto.
L’algoritmo descritto associa ad ogni messaggio una ed una sola parola del
codice e pertanto costituisce uno schema di codifica per un (n, k)-codice lineare.
La codifica di un codice lineare è ancora più semplice se la matrice generatrice
è in forma standard. Sia G = (Ik |A). Si ha
(m1 , . . . , mk )(Ik |A) = (m1 , m2 , . . . , mk , m1 e1,k+1 +. . .+mk ek,k+1 , . . . m1 e1n +. . .+mk ekn )
Il messaggio m = (m1 , . . . , mk ) viene codificato nella parola c = (c1 , . . . , cn ), con
ci = mi , 1 ≤ i ≤ k, e (ck+1 , . . . , cn ) = (m1 , . . . , mk )A.
I simboli ck+1 , . . . , cn sono di controllo.
Esempio 4.3.1. Sia C il codice lineare ternario con matrice generatrice G scritta
in forma standard :


1 0 0 1 2 0
G =  0 1 0 0 1 1 .
0 0 1 2 0 1
Codificare la sequenza 102101210122 emessa dalla sorgente.
Soluzione - Da G si deduce che C ha lunghezza 6 ed ha tre simboli di informazione
e pertanto C è un (6, 3)-codice ternario. Ogni tre simboli della sequenza data
rappresentano un messaggio e perciò nella codifica ad ogni blocco di tre simboli
vengono aggiunti tre simboli di controllo. Dividiamo la sequenza emessa dalla
sorgente in blocchi di lunghezza 3:
102, 101, 210, 122
e codifichiamo ogni blocco. Si ha:
(102) · G = (102222)
(101) · G = (101021)
(210) · G = (210221)
4. DECODIFICA DEI CODICI LINEARI. TABELLA STANDARD
45
(122) · G = (122211)
e pertanto verrà trasmessa la sequenza
102222101021210221122211
4. Decodifica dei codici lineari. Tabella standard
Sia C ⊆ Fqn un (n, k)-codice lineare costruito su Fq = GF (q). Il gruppo (C, +)
è un sottogruppo di (Fqn , +) e |C| = q k e pertanto (C, +) in (Fqn , +) ha m = q n−k
laterali C1 = C, C2 , . . . , Cm . Si ha :
• Ogni elemento di Fqn appartiene ad uno ed un solo laterale Ci , i = 1, . . . , m
e perciò un qualsiasi vettore y ricevuto appartiene ad un solo Ci , ossia
y = ai + c, essendo c una parola del codice C ed ai un elemento di Fqn .
• Se è stata trasmessa la parola x e si riceve y, si ha e = y − x = ai + c − x =
ai + c̄, che è un elemento di Ci quindi l’errore 00 e 00 è un elemento dello
stesso laterale a cui appartiene l’elemento ricevuto.
• Poichè l’errore più probabile è quello di peso minimo, il decodificatore sceglie come vettore errore il vettore e∗ di peso minimo fra i vettori
appartenenti a Ci e decodifica la n-upla ricevuta come y − e∗ .
Per ogni laterale Ci , i = 1, . . . , m, occorre fissare una parola ai ∈ Ci quale
leader (o direttrice) del laterale. Il leader deve essere scelto fra i vettori di peso
minimo appartenenti a quel laterale.
Teorema 4.4.1. Sia C ⊆ Fqn . Se y ∈ Fqn appartiene al laterale Ci , ossia
se y = ai + cj , essendo ai il leader del laterale Ci e cj una parola di C, allora
d(y, cj ) ≤ d(y, c) per ogni c ∈ C.
Dimostrazione. Da y = ai +cj si ha d(y, cj ) = d(ai +cj , cj ) = w(ai +cj −cj ) =
w(ai ), inoltre d(y, c) = d(ai + cj , c) = w(ai + cj − c). Poichè ai + cj − c ∈ Ci ed ai
è il leader di Ci , segue che w(ai ) ≤ w(ai + cj − c), quindi d(y, cj ) ≤ d(y, c) ossia cj
è la parola di C più vicina al vettore ricevuto y.
I laterali del gruppo (C, +) permettono di decodificare i codici lineari tramite
una tabella , detta tabella standard, costruita nel seguente modo.
Tutti gli elementi di Fqn si distribuiscono in una matrice-tabella Σ = (σij ) con
q n−k righe e q k colonne. Ogni riga contiene gli elementi di un laterale di C in modo
tale che valgono le seguenti proprietà.
(1) La prima riga contiene tutti gli elementi del codice C, iniziando dal vettore
nullo ossia σ11 = (00 · · · 0).
4. DECODIFICA DEI CODICI LINEARI. TABELLA STANDARD
46
(2) Per ogni indice di riga i, nella prima colonna (ossia come elemento σi1 )
si scrive la parola ai scelta come il leader del laterale Ci ; ai deve essere
scelto fra i vettori di peso minimo appartenenti a quel laterale.
(3) Per ogni coppia di indici (i, j) è σij = ai + σ1j , pertanto la riga i-esima
contiene tutti gli elementi del laterale ai + C.
Un semplice algoritmo per costruire una tabella standard Σ di C è il seguente:
• primo passo: distribuire le parole di C sulla prima riga di Σ con l’unica
condizione σ11 = 0;
• secondo passo: scegliere una parola a2 di peso minimo in Fqn − C e
porre σ21 = a2 ;
• terzo passo: distribuire sulla seconda riga di Σ le parole di a2 + C in
modo che sia σ2j = a2 + σ1j ;
• quarto passo: scegliere una parola a3 di peso minimo in Fqn \{C∪(a2 +C)}
e porre σ31 = a3 ;
• quinto passo: distribuire sulla terza riga di Σ le parole di a3 + C in modo
che sia σ3j = a3 + σ1j ;
. . . continuare in questo modo fino all’esaurimento delle parole di Fqn .
La tabella così costruita contiene ogni elemento di Fqn una ed una sola volta.
Se il decodificatore riceve un elemento y ∈ Ci , trova y nella tabella e decodifica y
come la parola del codice che si trova nella stessa colonna, cioè come y − ai che è
la parola del codice più vicina ad y.
Esempio 4.4.2. Sia C = {0000, 1011, 0101, 1110} un (4, 2)-codice binario
lineare. La tabella standard è:
C1 = C
C2
C3
C4
(0
(1
(0
(0
0
0
1
0
0
0
0
1
0)
0)
0)
0)
(1
(0
(1
(1
0
0
1
0
1
1
1
0
1)
1)
1)
1)
(0
(1
(0
(0
1
1
0
1
0
0
0
1
1)
1)
1)
1)
(1
(0
(1
(1
1
1
0
1
1
1
1
0
0)
0)
0)
0)
Se ad esempio viene ricevuto y = (1111), allora la parola trasmessa è c =
y − (0100) = (1111) − (0100) = 1011 che è proprio la parola di C che si trova nella
stessa colonna di y.
Nel paragrafo 6 di questo capitolo, si vedrà che questo schema di decodifica può
essere semplificato usando il concetto di codice duale e di sindrome di un vettore.
5. CODICE DUALE E MATRICE DI CONTROLLO
47
5. Codice duale e matrice di controllo
Per trovare metodi che semplifichino la decodifica di un codice lineare, occorre
introdurre alcune nozioni.
Poichè l’insieme delle parole di un codice lineare costituisce un sottospazio
di uno spazio vettoriale finito, in questi spazi vettoriali non si può introdurre la
nozione di prodotto scalare in senso euclideo; è però ugualmente possibile definire
la nozione di prodotto scalare e il concetto di ortogonalità fra vettori.
Definizione 4.5.1. Comunque presi x, y ∈ Fqn
x • y = (x1 , x2 , . . . , xn ) • (y1 , y2 , . . . , yn ) =
n
X
xi yi
i=1
è detto prodotto scalare di x e y.
Due vettori si dicono ortogonali se il loro prodotto scalare è nullo.
Un vettore si dice isotropo se è ortogonale a se stesso.
Si ricordi che nella definizione precedente la somma è calcolata in GF (q).
Inoltre è facile verificare che, comunque presi x, y, z ∈ Fqn , λ ∈ Fq , si ha
(1) x • y = y • x
(2) x • (y + z) = x • y + x • z
(3) (λx) • y = λ(x • y) .
Si noti che a differenza di quanto accade nella geometria euclidea, quando si
opera00 in un campo finito il prodotto scalare di un vettore non nullo per se stesso
può essere zero. Per esempio, in GF (2) risulta (1, 1, 0, 0) • (1, 1, 0, 0) = 1 + 1 = 0.
00
Definizione 4.5.2. Sia C ⊆ Fqn un sottospazio di dimensione k. Si definisce
spazio ortogonale a C e si denota con C ⊥ l’insieme
C ⊥ = {x ∈ Fqn | x • c = 0 ∀ c ∈ C}.
C ⊥ prende il nome di codice duale o ortogonale a C. Se C = C ⊥ , il codice C si
dice autoduale .
Nota 4.5.3.
(1) C ⊥ è un sottospazio vettoriale di Fqn perchè è chiuso rispetto alle operazioni
di addizione di vettori e di moltiplicazione di un vettore per uno scalare.
(2) A differenza degli spazi vettoriali definiti su R, i sottospazi C e C ⊥ di Fqn
possono avere in comune vettori diversi dal vettore nullo, tali vettori sono
i vettori isotropi.
(3) (C ⊥ )⊥ = C.
5. CODICE DUALE E MATRICE DI CONTROLLO
48
(4) Sia C ⊆ Fqn autoduale, allora x • y = 0 per ogni coppia di parole di C non
necessariamente distinte e pertanto si ha
n
dim C = dim C ⊥ = k =
2
Ricordiamo che se A è una matrice, con At si indica la matrice trasposta di A,
ossia la matrice che ha per colonne le righe di A.
Teorema 4.5.4. Sia C ⊆ Fqn un (n, k)-codice generato dalla matrice G. Allora
un vettore x ∈ Fqn è una parola del codice duale C ⊥ se e solo se è ortogonale a tutti
i vettori riga di G:
x ∈ C⊥ ⇔
xGt = 0
dove 0 è la matrice 1 × k i cui elementi sono tutti nulli.
Dimostrazione. Sia x ∈ C ⊥ , allora x è ortogonale ad ogni parola di C e in
particolare alle parole che costituiscono una base di C e pertanto xGt = 0.
Viceversa, sia xGt = 0. Allora x è ortogonale a tutti i vettori e1 , e2 , . . . , ek che
costituiscono una base di C. Poichè per ogni parola c ∈ C si ha c = λ1 e1 +. . .+λk ek
segue che
x • c = x • (λ1 e1 + . . . + λk ek ) = λ1 (x • e1 ) + . . . + λk (x • ek ) = 0.
Pertanto x è ortogonale ad ogni parola c ∈ C e quindi x ∈ C ⊥ .
Teorema 4.5.5. Se C ⊆ Fqn è un (n, k)-codice lineare allora C ⊥ è un
(n, n − k)-codice lineare.
Dimostrazione. Dal teorema precedente segue che i vettori x ∈ C ⊥ sono
tutti e soli i vettori di Fqn ortogonali ai vettori di una base {ei }, i = 1, . . . , k, di C.
Questi vettori sono dati da tutte e sole le soluzioni del sistema

e11 x1 + e12 x2 + · · · + e1n xn = 0


 e21 x1 + e22 x2 + · · · + e2n xn = 0
..

.


ek1 x1 + ek2 x2 + · · · + ekn xn = 0
Questo è un sistema lineare omogeneo di k equazioni in n incognite con rango
della matrice dei coefficienti uguale a k quindi ha q n−k autosoluzioni delle quali
esattamente n−k linearmenti indipendenti. Segue che n−k autosoluzioni qualsiasi,
linearmente indipendenti, sono una base di C ⊥ e perciò dim C ⊥ = n − k.
dim C + dim (C ⊥ ) = n
5. CODICE DUALE E MATRICE DI CONTROLLO
49
Definizione 4.5.6. Sia C un (n, k)-codice lineare. Una matrice generatrice di
C è detta matrice di controllo (o matrice di controllo di parità ) del codice
C, si denota con H ed è di tipo (n − k) × n.
⊥
Teorema 4.5.7. Un vettore x ∈ Fqn , x = (x1 x2 · · · xn ), è una parola del codice
C se e solo se xH t = 0, dove 0 è la matrice 1 × (n − k) i cui elementi sono tutti
nulli. In simboli:
x ∈ C ⇔ xH t = 0
Dimostrazione. Un vettore x ∈ Fqn è una parola di C se e solo se è ortogonale
a C ⊥ ossia se e solo se è ortogonale a tutti i vettori y ∈ C ⊥ ossia se e solo se è
ortogonale a tutti i vettori di una base di C ⊥ . Poichè le componenti dei vettori
di una base di C ⊥ sono le righe di H, un vettore x è una parola di C se e solo se
xH t = 0.
Dunque la conoscenza di H permette di controllare facilmente se un vettore
di Fqn è una parola del codice C e pertanto C può essere completamente descritto
da una sua matrice di controllo di parità. Questo è il motivo per cui H si chiama
matrice di controllo di C e le equazioni del sistema xH t = 0 sono dette equazioni
di controllo.
Così come la matrice generatrice, anche la matrice di controllo di un codice non
è unica, in generale. Se come matrice generatrice di C si sceglie quella standard
allora la costruzione della matrice H è semplice ed immediata.
Teorema 4.5.8. Sia G = (Ik | A) una matrice generatrice standard di un
(n, k)-codice lineare C. Allora H = (−At | In−k ) è una matrice di controllo per C.
Dimostrazione. Sia

1 0 . . . 0 e1,k+1 . . . e1,n
 0 1 . . . 0 e2,k+1 . . . e2,n 

G=
 ...


0 0 . . . 1 ek,k+1 . . . ek,n
una matrice generatrice rispetto alle basi {ei } di C e {bj } di Fqn , per i = 1, . . . , k; j =
1, . . . , n. Un vettore x = (x1 , . . . , xn ) ∈ Fqn è una parola di C ⊥ se e solo se xGt = 0,
cioè se e solo se è soluzione del sistema

x1 + e1,k+1 xk+1 + · · · + e1,n xn = 0


 x2 + e2,k+1 xk+1 + · · · + e2,n xn = 0
..

.


xk + ek,k+1 xk+1 + · · · + ek,n xn = 0
5. CODICE DUALE E MATRICE DI CONTROLLO
50
Esso ha n − k autosoluzioni linearmente indipendenti perchè è lineare omogeneo di
k equazioni in n incognite con caratteristica della matrice dei coefficienti uguale a
k. Troviamo le (n − k) autosoluzioni assegnando alle incognite xk+1 , . . . , xn successivamente i valori (1, 0, . . . , 0), (0, 1, . . . , 0), (0, 0, . . . , 1). In questo modo otteniamo
una base di C ⊥ data dai vettori:
(−e1,k+1 , −e2,k+1 , . . . , −ek,k+1 , 1, 0, . . . , 0)
(−e1,k+2 , −e2,k+2 , . . . , −ek,k+2 , 0, 1, . . . , 0)
...
...
...
(−e1,n , −e2,n , . . . , −ek,n , 0, 0, . . . , 1)
e pertanto la matrice


−e1,k+1 −e2,k+1 . . . −ek,k+1 1 0 . . . 0
 −e1,k+2 −e2,k+2 . . . −ek,k+2 0 1 . . . 0 
 = (−At | In−k )
H=
..


.
−e1,k+n −e2,k+n . . . −ek,k+n 0 0 . . . 1
è una matrice di controllo per C.
Esempio 4.5.9.
(1) La matrice di controllo del codice binario (7, 4) di Hamming è


1 0 1 1 1 0 0
H =  1 1 0 1 0 1 0  = (−At | In−k )
1 1 1 0 0 0 1
la quale ha effettivamente rango 3.
(2) Sia C il (7, 4)-codice sopra

0
 0
G=
 2
2
Z3 con matrice generatrice

0 0 2 1 1 0
0 1 1 0 2 0 

1 0 2 0 2 0 
0 0 1 0 0 1
Per trovare una matrice del tipo G0 = (I4 |A) che generi un codice D equivalente a C, permutiamo le colonne di G in modo che assumano l’ordine
5, 3, 2, 7, 1, 4, 6, ossia applichiamo alle posizioni (colonne) la permutazione
1 7→ 5, 2 7→ 3, 3 7→ 2, 4 7→ 6, 5 7→ 1, 6 7→ 7, 7 7→ 4,
5. CODICE DUALE E MATRICE DI CONTROLLO
ossia moltiplichiamo a destra

0 0
 0 0

 0 1

P = 0 0
 1 0

 0 0
0 0
In questo modo si ottiene
D equivalente a C

1 0 0 0 0 2

0 1 0 0 0 1
G0 = 
 0 0 1 0 2 2
0 0 0 1 2 1
51
G per la matrice di permutazione

0 0 1 0 0
1 0 0 0 0 

0 0 0 0 0 

0 0 0 0 1 
0 0 0 0 0 

0 1 0 0 0 
0 0 0 1 0
una matrice standard G0 che genera un codice

1
2 
 = (I4 |A),
2 
0
Una matrice generatrice di D⊥ è

0 0
0
t

1 2
H = (−A | I3 ) =
2 1
Moltiplicando H 0 a destra

0 0
 0 0

 0 1

Pt =  0 0

 1 0
 0 0
0 0
si ottiene la seguente matrice

1 1

0 1
H=
0 1

0
 0
A=
 2
2
2
1
2
1

1
2 
.
2 
0
allora

1 1 1 0 0
1 2 0 1 0 .
1 0 0 0 1
per la matrice di permutazione

0 0 1 0 0
1 0 0 0 0 

0 0 0 0 0 

0 0 0 1 0 

0 0 0 0 0 
0 0 0 0 1 
0 1 0 0 0
generatrice per C ⊥ :

0 0 0 1 0
2 0 1 2 1 .
1 1 2 0 0
Osserviamo che GH t = 0; inoltre H ha, come previsto, rango n − k = 3.
Esempio 4.5.10. Trovare la matrice di controllo di un codice lineare binario C
assegnato tramite la matrice


1 0 0 1 1
G =  0 1 0 1 0 .
0 0 1 0 1
5. CODICE DUALE E MATRICE DI CONTROLLO
Un vettore x ∈ F25 è ortogonale a C se
forma estesa significa:

+x4 +x5
 x1
+x2
+x4

+x3
+x5
52
e solo se xGt = 0. Se x = (x1 x2 x3 x4 x5 ), in
= 0
= 0 ,
= 0

 x1 = x2 + x3
x4 = x2

x5 = x3
E pertanto C ⊥ = {x | x = (x2 + x3 , x2 , x3 , x2 , x3 )}.
Una base di C ⊥ è {(1, 1, 0, 1, 0), (1, 0, 1, 0, 1)} quindi una matrice di controllo di C
è
1 1 0 1 0
H=
.
1 0 1 0 1
Un vettore x ∈ F25 è una parola di C se e solo se xH t = 0 ossia
x1 +x2
+x4
= 0
x1
+x3
+x5 = 0
Queste due equazioni sono equazioni di controllo del codice C.
Come mostra il seguente teorema, partendo da una matrice di controllo si può
anche calcolare la distanza minima del codice lineare.
Teorema 4.5.11. Sia H una matrice di controllo di un (n, k)-codice lineare
C ⊆ Fqn . Allora la distanza minima del codice è il minimo ordine di un insieme
linearmente dipendente di colonne della matrice H.
Dimostrazione. Si rinvia a [1] pag. 146 − 148.
Corollario 4.5.12. Sia H una matrice di controllo di un (n, k)-codice lineare
C ⊆ Fqn con distanza minima d. Si ha :
(1) d − 1 colonne di H sono sempre linearmente indipendenti.
(2) H ha rango almeno d − 1.
Dimostrazione. Segue dal teorema precedente.
Nel Corollario 3.2.8 si è dimostrato che un (n, k)-codice con distanza minima
d = 2h + 1 è h-correttore. Allora, per il teorema precedente, la costruzione di un
codice h-correttore equivale alla costruzione di una matrice H di tipo (n−k)×n con
rango n − k e tale che 2h colonne qualsiasi di essa siano linearmente indipendenti.
In particolare, costruire un (n, k)-codice lineare 1-correttore equivale a costruire
una matrice H di tipo (n − k) × n con rango (n − k) e nella quale due colonne
qualsiasi siano linearmente indipendenti.
6. DECODIFICA DEI CODICI LINEARI PER SINDROME
53
Esempio 4.5.13. Consideriamo la seguente matrice H di rango 3 e con elementi
in GF (3) :


2 0 0 1 1
H =  0 2 0 0 2 .
0 0 1 2 0
Le colonne di H sono a due a due linearmente indipendenti e ne esistono tre
linearmente dipendenti (ad esempio la prima, la seconda e la quinta) e pertanto 3
è il minimo numero di colonne linearmente dipendenti. Quindi H è una matrice
di controllo di un (5, 2)-codice ternario con d = 3. Questo codice è 1-correttore
perchè d = 2 · 1 + 1.
Se d è la distanza minima di un (n, k)-codice C la limitazione di Singleton
d ≤ n − k + 1 ci dà una condizione necessaria per l’esistenza di C ma ciò non
assicura che C esista. In generale, il problema dell’esistenza di un codice avente
parametri assegnati è difficile. Se il codice è lineare, un modo per affrontarlo è
quello di dare condizioni per l’esistenza di una matrice di controllo di C.
Teorema 4.5.14. Si ha
(1) Un (n, k)-codice lineare C ⊆ F2n avente distanza minima d esiste se vale
n−1
n−1
1+
+ ...,
< 2n−k
1
d−2
(2) Un (n, k)-codice lineare C ⊆ Fqn avente distanza minima d esiste se vale
d−2
X
s n−1
(q − 1)
< q n−k
s
s=0
Dimostrazione. Si rinvia a [1] pag. 149, 150.
6. Decodifica dei codici lineari per sindrome
La nozione di codice ortogonale si rivela particolarmente utile per costruire
algoritmi di decodifica specifici per i codici lineari.
Definizione 4.6.1. Sia H una matrice di controllo del (n, k)-codice lineare
C ⊆ Fqn . Si definisce sindrome di un vettore x ∈ Fqn il vettore
s = x · H t ∈ Fqn−k .
6. DECODIFICA DEI CODICI LINEARI PER SINDROME
54
Nota 4.6.2. L’utilità della matrice di controllo H associata al codice C ⊆ Fqn
discende dal teorema 4.5.7:
un vettore v dello spazio vettoriale Fqn è una parola del codice C se e solo se
t
vH = 0.
Allora se durante la trasmissione di una parola non entrano errori, la
sua sindrome è zero, ma non vale il viceversa. Infatti potrebbero entrare
un numero di errori tale da trasformare la parola trasmessa in un’altra parola del
codice. In questo caso, pur essendo zero la sindrome della parola ricevuta, essa è
diversa dalla parola trasmessa. Senza fare nessuna ipotesi sul numero massimo di
errori che possono entrare in una parola durante la trasmissione e sulla distanza
minima del codice, in effetti non si può dire se la parola ricevuta è quella trasmessa.
Ma se, per esempio, sappiamo che in ogni parola entra al più un errore durante la
trasmissione e che d = 3, allora una parola non può diventare un’altra parola del
codice durante la trasmissione e quindi se la sindrome della parola ricevuta è zero,
si è certi che la parola ricevuta è quella trasmessa, mentre se la sindrome è diversa
da zero è entrato un errore.
La sindrome di un vettore può essere di aiuto per correggere errori eventualmente entrati durante la trasmissione delle parole, ma è anche un valido aiuto per
semplificare notevolmente il metodo di decodifica per i codici lineari basato sui
laterali di un sottogruppo. Vale infatti il seguente teorema.
Teorema 4.6.3. Sia H una matrice di controllo di un (n, k)-codice lineare
C ⊆ Fqn . Allora due vettori x, y ∈ Fqn sono in uno stesso laterale di C se e solo se
hanno la stessa sindrome.
Dimostrazione. Siano x, y ∈ Fqn , risulta
x + C = y + C ⇔ y − x ∈ C ⇔ (y − x)H t = 0 ⇔ yH t − xH t = 0 ⇔ xH t = yH t
.
Dal teorema ora dimostrato si ha in particolare che le sindromi sono in corrispondenza biunivoca con i laterali di C e che la sindrome di un qualsiasi vettore
di un laterale Ci è uguale alla sindrome del leader scelto per Ci . Assegnata H, la
corrispondenza che associa ad ogni leader la sua sindrome è biunivoca, ciò semplifica la decodifica tramite la tabella standard. L’algoritmo di decodifica diventa il
seguente.
Algoritmo
• Passo
• Passo
• Passo
di
1.
2.
3.
decodifica mediante sindrome.
Si calcola la sindrome s = y · H t del vettore ricevuto y.
Si trova il leader ai avente come sindrome s.
Si decodifica y come la parola y − ai .
6. DECODIFICA DEI CODICI LINEARI PER SINDROME
55
Esempio 4.6.4. Sia C il (4, 2)-codice lineare binario avente come matrice generatrice
1 1 1 0
G=
.
0 1 1 1
Operando sulle righe, la G può essere trasformata nella matrice standard
1 0 0 1
0
G =
= (I2 |A).
0 1 1 1
Una matrice di controllo per C è allora:
0 1 1 0
H=
= (−At |I4−2 ).
1 1 0 1
Costruiamo ora la TABELLA standard:
a1
a2
a3
a4
=0
=1
=0
=0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
1
1
1
1
0
1
1
1
1
0
0
0
0
0
0
1
0
0
1
1
0
1
1
1
1
0
1
1
1
1
1
0
1
1
0
0
1
0
0
0
0
1
1
1
1
1
La sindrome dei leader a1 , a2 , a3 , a4 è rispettivamente
s1 = a1 H t = (00), s2 = a2 H t = (01), s3 = a3 H t = (11), s4 = a4 H t = (10).
Supponiamo si riceva il vettore y = (0101). Si ha yH t = (10) = s4 , allora y viene
decodificato nella parola y − a4 = 0111.
Lo schema di decodifica mediante sindrome necessita quindi di una matrice
con due sole colonne, la prima delle quali formata dalle parole leader, la seconda
formata dalle sindromi delle parole leader. E’ chiaro quindi che, se C è abbastanza
grande, la decodifica mediante sindrome è molto più veloce rispetto quella con
tabella standard.
Esempio 4.6.5. Sia C il (6, 3)-codice binario le
controllo di parità sono date, rispettivamente, da



1 1 0 1 0 0
1
G =  0 1 1 0 1 0 , H =  0
1 0 1 0 0 1
0
cui matrici generatrice e di

0 0 1 0 1
1 0 1 1 0 .
0 1 0 1 1
6. DECODIFICA DEI CODICI LINEARI PER SINDROME
Tale codice ha
leader
000000
000001
000010
000100
001000
010000
100000
001100
56
distanza minima d = 3. La tabella standard di C è
110100
110101
110110
110000
111100
100100
010100
111000
011010
011011
011000
011110
010010
001010
111010
010110
101001
101000
101011
101101
100001
111001
001001
100101
101110
101111
101100
101010
100110
111110
001110
100010
110011
110010
110001
110111
111011
100011
010011
111111
011101
011100
011111
011001
010101
001101
111101
010001
000111
000110
000101
000011
001111
010111
100111
001011
Possiamo semplificare il procedimento limitandoci a considerare la corrispondenza
biunivoca fra i leader e le rispettive sindromi. Rappresentiamo questa corrispondenza con la seguente tabella formata
• dalla colonna dei vettori leader scelti fra quelli di peso minimo nella
F6
rispettiva classe Ci , i = 1, 2, . . . , 8 (Ci sono gli elementi del quoziente C2 );
• dalla colonna s delle sindromi
leader
s
000000 000
000001 101
000010 011
000100 110
001000 001
010000 010
100000 100
001100 111
Supponiamo di ricevere la parola y = (100011). Calcoliamo s(y) = yH t = (010);
poichè (010) è la sindrome del leader a6 della classe C6 , decodifichiamo y come
y − ai = (100011) − (010000) = (110011).
Nota 4.6.6. L’algoritmo di decodifica tramite sindrome, richiede di precomputare e memorizzare la corrispondenza fra tutte le possibili sindrome e i leader
delle classi. Se il codice C utilizza parole molto lunghe, può occupare notevole
spazio. Se il codice è binario, un metodo di implementazione finalizzato a ridurre l’occupazione di memoria di un decodificatore è quello presentato nel seguente
algoritmo di decodifica.
Algoritmo di Decodifica 00 passo-passo00 per codici binari
(1) Costruire la tabella Σ che associa ad ogni sindrome s il peso minimo di
un elemento con sindrome s; denotiamo tale numero con Σ(s).
(2) Porre i = 1.
6. DECODIFICA DEI CODICI LINEARI PER SINDROME
57
(3) Calcolare la sindrome del vettore ricevuto s = yH t e determinare, tramite
la tabella Σ, il peso w = Σ(s) del corrispondente leader di classe.
(4) • Se w = 0, allora non sono individuati errori, il procedimento di
decodifica termina restituendo la parola p = y.
• Se w 6= 0 e Σ((y + ei )H t ) ≤ Σ(yH t ), sostituire y con y + ei dove ei
è un vettore le cui componenti sono tutte 0 tranne la i-esima.
(5) Porre i = i + 1.
(6) Se i > n, segnalare che non si è riusciti a correggere l’errore.
(7) Tornare al passo 3.
Nel funzionamento dell’algoritmo, il punto fondamentale è che, durante tutto
il processo di decodifica, il peso dell’errore non può mai crescere. Dopo al più n
passi, rimane determinato un vettore che può cadere nella classe il cui leader ha
peso nullo; se questo si verifica, allora il vettore è stato decodificato correttamente.
Esempio 4.6.7. Sia C il codice dell’esempio 4.6.5. Al posto della tabella che
associa ad ogni leader di classe la corrispettiva sindrome, è sufficiente considerare
la tabella in cui i leader delle classi laterali sono sostituiti con i propri pesi.
s w(Cj )
000
0
101
1
011
1
110
1
001
1
010
1
100
1
111
2
Teorema 4.6.8. Se C ⊆ F2n è un codice lineare binario allora la sindrome
di una parola ricevuta è una matrice riga avente come elementi la somma degli
elementi delle colonne di H corrispondenti ai posti in cui sono entrati errori.
Dimostrazione. Sia x la parola di C trasmessa. Allora xH t = 0. Supponiamo
che entrino degli errori e sia e il vettore errore il quale ha tante componenti non
nulle quanti sono gli errori entrati; infatti la parola ricevuta è y = x + e e si ha
yH t = (x + e)H t = xH t + eH t = eH t .
Sia e = (0, . . . , 1a , . . . , 1b , . . . , 0).
7. CODICI LINEARI 1-CORRETTORI
58
Se
h1,1
 h2,1
H=
..

.

...
...
h1,a
h2,a
...
...
h1,b
h2,b
...
...

h1,n
h2,n 


hn−k,1 . . . hn−k,a . . . hn−k,b . . . hn−k,n
segue
yH t = eH t =
h1,a + h1,b
h2,a + h2,b
...
hn−k,a + hn−k,b
Dal teorema ora dimostrato segue che se le colonne di una matrice di controllo
H di un codice binario C sono a due a due linearmente indipendenti (cioè distinte
e non nulle), allora si può decidere dove è un singolo errore e correggerlo.
D’altra parte se le colonne di H sono a due a due linearmente indipendenti e
ne esistono tre linearmente dipendenti, allora d = 3 e C è 1-correttore.
7. Codici lineari 1-correttori
La decodifica tramite tabella standard è molto utile nei codici lineari che correggono almeno 2 errori mentre la decodifica nei codici lineari 1-correttori può
essere fatta più semplicemente.
Schema di Decodifica per i codici lineari 1-correttori q-ari
Sia C ⊆ Fqn un codice lineare con d(C) ≥ 3, ossia sia C un codice 1-correttore.
Sia H una sua matrice di controllo e supponiamo che in ogni parola entri al più
un errore ossia che per ogni errore e dovuto al canale si abbia w(e) ≤ 1.
Sia trasmessa una parola x ∈ C e sia ricevuto il vettore y = x + e. Si ha
yH t = (x + e)H t = xH t + eH t = eH t , cioè la sindrome del vettore ricevuto
uguaglia la sindrome del vettore errore. Se eH t = 0, poichè e non può essere una
parola (non nulla) di C, essendo w(e) ≤ 1, il decodificatore decide che e = 0 e
quindi y è la parola trasmessa.
Supponiamo ora che eH t 6= 0. In questo caso necessariamente e 6= 0 e
dall’ipotesi w(e) ≤ 1 segue che e ha un’unica componente non nulla, sia e =
(0, 0, . . . , ei , 0, . . . , 0). In questo caso si ha
eH t = h1,i ei h2,i ei . . . hn−k,i ei = ei h1,i h2,i . . . hn−k,i
cioè la sindrome è il prodotto tra un elemento di GF (q), che dà la 00 grandezza00 dell’errore, e la colonna di H corrispondente alla componente dove è entrato l’errore.
In questo caso la n-upla y ricevuta viene decodificata nella parola
x = y − e = (y1 , . . . , yi , . . . , yn ) − (0, . . . , 0, ei , 0, . . . , 0) =
7. CODICI LINEARI 1-CORRETTORI
59
= (yi , . . . , yi−1 , yi − ei , yi+1 , . . . , xn ).
In sintesi:
Passo 1. Si calcola la sindrome yH t del vettore y ricevuto.
Passo 2. Se yH t = 0, si suppone y sia proprio la parola trasmessa.
Passo 3. Se yH t = s 6= 0, si confronta s con ogni colonna di H.
Passo 4. Se s è multiplo di una colonna, sia la i-esima, di H secondo
lo scalare ei , allora l’errore è dato dalla n-upla avente come componente
i-esima ei e tutte le altre componenti nulle. Si decodifica y come la parola
x = y − e.
• Passo 5. Se non si verifica nessuno dei casi detti, la n-upla ricevuta contiene almeno due errori e quindi non si può risalire alla parola
trasmessa.
•
•
•
•
Se il codice è binario lo schema di decodifica diventa:
Schema di Decodifica per i codici lineari 1-correttori binari
• Passo 1. Si calcola la sindrome yH t del vettore y ricevuto.
• Passo 2. Se yH t = 0, si suppone che la parola trasmessa coincida con il
vettore ricevuto.
• Passo 3. Se yH t 6= 0 e yH t è uguale ad una colonna, la j-esima, di H,
si ha che la j-esima componente del vettore ricevuto è errata e si corregge
l’errore.
• Passo 4. Se yH t 6= 0 e yH t non è uguale ad una colonna di H, certamente
sono entrati almeno due errori e non è possibile correggerli.
Esempio 4.7.1. Consideriamo il (5, 2)-codice ternario dell’esempio 4.5.13. Supponiamo che venga trasmessa la parola x = (1 0 1 1 0) e che in uscita arrivi il
vettore y = (1 0 0 1 0). Si ha
yH t = 0 0 2 = 2 0 0 1
che implica l’esistenza di un errore di 00 grandezza 00 2 nella terza posizione. Allora
x = (1 0 0 1 0) − (0 0 2 0 0) = (1 0 1 1 0).
Nota 4.7.2. L’affidabilità che offre il canale è molto importante. Se si usa ad
esempio un codice 1-correttore, l’evento che in una parola possano entrare due o più
errori deve avere una probabilità quasi nulla. Infatti se in una parola entrano due
errori, la sindrome del vettore ricevuto può essere ancora uguale ad una colonna di
H, in tal caso i due errori non vengono rivelati e la decodifica è errata. Ciò dipende
dal fatto che, se è trasmessa una parola x ed arriva la sequenza y contenente due
errori, la sequenza y viene decodificata nella parola x0 che differisce da y per una
8. L’ENUMERATORE DEI PESI DI UN CODICE LINEARE
60
sola componente, se esiste nel codice una parola x0 con d(y, x0 ) = 1, e ciò può
accadere se d(x, x0 ) = 3.
Ad esempio riferendoci sempre al codice ternario dell’esempio 4.5.13, supponiamo di trasmettere ancora la parola x = (1 0 1 1 0) e di ricevere y = (1 0 0 0 0),
contenente due errori. Risulta yH t = (2 0 0), che è uguale alla prima colonna
di H, così che y verrebbe decodificata nella parola (0 0 0 0 0). In questo caso la
decodifica risulterebbe errata.
8. L’enumeratore dei pesi di un codice lineare
Nello studio di un codice lineare C di lunghezza n, uno dei problemi centrali
è il calcolo del numero wi = wi (C) di tutte le parole di C di peso i, per ogni
i = 1, 2, . . . , n. A tale proposito spesso si considera il polinomio
n
X
X
W (x, y) = WC (x, y) =
xw(a) y n−w(a) =
wi xi y n−i ,
a∈C
i=0
che prende il nome di enumeratore dei pesi di C.
Una importante relazione fra l’enumeratore dei pesi W (x, y) di C e l’enumeratore dei pesi W ⊥ (x, y) del codice duale di C, è data dal seguente teorema di cui
non riportiamo la dimostrazione.
Teorema 4.8.1 ( F. J. MacWilliams, 1963 ). Siano W (x, y) e W ⊥ (x, y) gli
enumeratori dei pesi rispettivamente di un (n, k)-codice C su Fq e del suo duale.
Allora risulta
W ⊥ (x, y) = q −k W (y − x, y + (q − 1)x)
e quindi, se C è autoduale, risulta
W (x, y) = q −n/2 W (y − x, y + (q − 1)x).
Nota 4.8.2. In alcuni casi la conoscenza dei pesi delle parole di una matrice
generatrice G di un codice lineare fornisce informazioni sui coefficienti del polinomio enumeratore dei pesi. Per esempio, se due parole a e b di un codice binario C
hanno peso pari 2s e 2t, rispettivamente, detto m il numero degli indici j tali che
aj = bj = 1, risulta
w(a + b) = 2s − m + 2t − m = 2(s + t − m).
Ne segue che, se le parole di G hanno tutte peso pari, allora si dice che C è un
codice pari , cioè tutte le sue parole hanno peso pari. Analogamente si prova che,
se C è autoortogonale e tutte le parole di G hanno peso divisibile per 4, la stessa
9. CODICE ESTESO
61
proprietà è vera per tutte le parole di C. In questo caso C si dice doppiamente
pari .
9. Codice esteso
Per ogni parola p = (a1 , a2 , . . . , an ) a componenti in Fq , si dice controllo di
parità di p l’opposto della somma delle sue componenti, cioè a0 = −(a1 + a2 +
· · · + an ). Considerato l’ (n, k)-codice C, rimane determinato l’ (n + 1, k)-codice C¯
definito da
C¯ = {p0 = (a0 , a1 , a2 , . . . , an ) | p ∈ C}
che è detto codice esteso di C. Tutte le parole del codice esteso hanno controllo di
parità nullo e pertanto ha senso prenderlo in considerazione solo quando le parole
di C non hanno tutte controllo di parità uguale a zero. Per esempio, il codice
ASCII esteso è proprio il codice esteso di C = F27 .
Osserviamo che, se C ha matrice controllo di parità H, allora


1 1 ··· 1
 0


H̄ = 
.
 ..

H
0
¯
è una matrice controllo di parità per C.
CAPITOLO 5
Codici Ciclici
I codici ciclici sono una famiglia di codici lineari fra le più importanti perchè essi
possono essere implementati in modo molto semplice. Questi codici sono tali che se
contengono una parola allora contengono anche tutte le sue permutazioni cicliche
e per questo si possono rappresentare algebricamente facendo uso dei polinomi
[x]
poichè esiste un isomorfismo fra gli spazi vettoriali Fqn e (xFnq−1)
.
Con abuso di linguaggio denoteremo un polinomio p(x) ∈ Fq [x] e la
[x]
sua classe nell’anello (xFnq−1)
con lo stesso simbolo.
Ogni codice di questa famiglia gode di notevoli proprietà fra cui:
• può essere costruito a partire da un singolo vettore;
• ammette degli algoritmi di decodifica efficienti;
• può rivelarsi particolarmente efficace per correggere alcune tipologie di
errore.
Per tutto il capitolo con Fq indicheremo il campo di Galois GF (q).
1. Definizioni e proprietà
Definizione 5.1.1. Un codice lineare C ⊆ Fqn si dice ciclico se applicando
una permutazione ciclica ad una qualsiasi sua parola c si ottiene un’altra parola
di C:
c = (c0 , c1 , . . . , cn−1 ) ∈ C ⇒ (cn−1 , c0 , . . . , cn−2 ) ∈ C
Sia Fq [x] l’anello dei polinomi nella variabile x e sia (xn − 1) l’ideale di Fq [x]
[x]
generato da xn − 1. Fissato il polinomio xn − 1, sia Rn [x] = ( (xFnq−1)
, +, ·) l’anello
n
quoziente dei polinomi su Fq modulo l’ideale (x − 1).
Tenendo presente che:
• i polinomi che si ottengono in corrispondenza degli elementi di Fqn sono
tutti e soli quelli di grado minore di n,
62
1. DEFINIZIONI E PROPRIETÀ
63
• ogni laterale proprio dell’ideale (xn − 1) di Fq [x] contiene un unico polinomio di grado minore di n,
ogni polinomio a coefficienti in Fq viene sostanzialmente identificato con il resto
della sua divisione per xn − 1.
Sia f : Fqn → Rn [x] l’applicazione definita da
f (c) = c0 + c1 x + . . . , cn−1 xn−1
per ogni c = (c0 , . . . , cn−1 ) ∈ Fqn .
Si ha :
(1) L’applicazione f è biettiva. Infatti Rn [x] ha come elementi i polinomi di
Fq [x] di grado minore o uguale ad n − 1 (si ricordi che se il prodotto di
due polinomi ha grado maggiore o uguale ad n, occorre prendere il suo
resto nella divisione per (xn − 1)). Dunque ogni parola può essere vista
come una n-upla di Fqn o, equivalentemente, come un polinomio di Rn [x].
(2) Rn [x] è uno spazio vettoriale di dimensione n isomorfo allo spazio vettoriale Fqn . Infatti la biezione f precedente è chiaramente un isomorfismo
di spazi vettoriali e C(x) è un sottospazio vettoriale di Rn [x].
Quanto osservato assicura che la definizione 5.1.1 equivale a
c(x) ∈ C ⇒ xc(x) ∈ C
e ciò porta immediatamente ad una caratterizzazione algebrica dei codici
ciclici.
(3) In Rn [x] moltiplicare un polinomio c(x) per x corrisponde a permutare
ciclicamente le componenti della n-pla corrispondente a c(x) (ossia a shiftare di un posto a destra). Infatti, poichè in Rn [x] risulta xn = 1, si
ha
xc(x) = c0 x + c1 x2 + . . . + cn−2 xn−1 + cn−1 xn =
= cn−1 + c0 x + c1 x2 + . . . + cn−2 xn−1 .
Esempio 5.1.2. Consideriamo il codice lineare binario di lunghezza 3:
C = {(000), (110), (101), (011)}
Esso può essere rappresentato come insieme di polinomi nella variabile x:
C = {0, 1 + x, 1 + x2 , x + x2 }.
Shiftando di un posto a destra le componenti di ogni terna, si ottiene l’insieme
{(000), (011), (110), (101)} ossia si ottiene sempre una parola di C e dunque C è
un codice ciclico. Alla stessa conclusione si arriva se in Rn [x] si moltiplica per x
ogni parola-polinomio di C, infatti si ha .
0·x = 0, (1+x)·x = x+x2 , (1+x2 )·x = x+x3 = x+1, (x+x2 )·x = x2 +x3 = x2 +1.
2. POLINOMIO GENERATORE E MATRICE GENERATRICE
64
Teorema 5.1.3. Un codice lineare C di lunghezza n è ciclico se e solo se è un
ideale di Rn [x].
Dimostrazione. Sia C un ideale di Rn [x]. Allora comunque preso c(x) ∈ C
si ha xc(x) ∈ C e pertanto C è ciclico.
Viceversa, sia C ciclico. Essendo C lineare, se c1 (x), c2 (x) ∈ C allora c1 (x) −
c2 (x) ∈ C. Inoltre essendo C ciclico, se c(x) ∈ C anche xc(x), x2 c(x), . . . , xn−1 c(x) ∈
C, pertanto per la linearità di C, anche λ0 c(x) + λ1 xc(x) + . . . + λn−1 xn−1 c(x) =
(λ0 +λ1 x+. . .+λn−1 xn−1 )c(x) è una parola di C. Facendo variare i coefficienti λi in
Fq , l’espressione (λ0 + λ1 x + . . . + λn−1 xn−1 ) fornisce tutti i polinomi di Rn [x]. Il prossimo teorema assicura che ogni codice ciclico C ∈ Fqn è un ideale principale di Rn [x] ossia Rn [x] è un anello ad ideali principali. Poichè C = {0} è un
ideale principale di Rn [x], nel seguito supporremo C =
6 {0}.
Teorema 5.1.4. Sia g(x) un polinomio monico non nullo di grado minimo
appartenente ad un codice ciclico C di lunghezza n. Allora ogni elemento c(x) ∈ C
può essere scritto nella forma c(x) = f (x)g(x) per un opportuno f (x) ∈ Rn [x].
Dimostrazione. Supponiamo per assurdo che c(x) ∈ C non sia multiplo di
g(x). Poichè g(x) è di grado minimo in C, si ha c(x) = q(x)g(x)+r(x) con gr[r(x)] <
gr[g(x)]. Poichè c(x), q(x)g(x) ∈ C e C è lineare, segue che r(x) = c(x)−q(x)g(x) ∈
C. Se r(x) 6= 0 si ha un assurdo perchè r(x) ha grado minore di g(x).
2. Polinomio generatore e matrice generatrice
Definizione 5.2.1. Si definisce polinomio generatore di un codice ciclico C
un polinomio g(x) ∈ C non nullo, monico, di grado minimo.
Teorema 5.2.2. Il polinomio generatore di un codice ciclico è unico.
Dimostrazione. Supponiamo per assurdo che g(x) e g1 (x) siano due generatori del codice ciclico C e dunque monici e di grado minimo. Poichè C è un ideale,
segue che il polinomio g(x) − g1 (x) appartiene a C e ha grado minore del grado di
g(x) e g1 (x) e ciò è assurdo.
Per la ricerca del polinomio generatore, vengono in aiuto i seguenti teoremi.
Teorema 5.2.3. Se g(x) è il polinomio generatore di un codice ciclico di
lunghezza n, allora g(x) divide xn − 1.
2. POLINOMIO GENERATORE E MATRICE GENERATRICE
65
Dimostrazione. Supponiamo per assurdo che g(x) non divida xn − 1. Allora
xn − 1 = g(x)q(x) + r(x) con r(x) non nullo e di grado minore di g(x). Poichè
g(x)q(x) ∈ C e r(x) = −g(x)q(x) (mod(xn − 1)), segue r(x) ∈ C ma ciò è assurdo
perchè g(x) è di grado minimo in C.
Teorema 5.2.4. Sia g(x) un polinomio monico divisore di xn − 1. Allora g(x)
genera il codice ciclico C = {f (x)g(x), f (x) ∈ Rn [x]}.
Dimostrazione. Sia C = {f (x)g(x), f (x) ∈ Rn [x]}. Basta provare che g(x)
è il polinomio di grado minimo appartenente a C. Sia g1 (x) ∈ C un polinomio
monico di grado minimo, sia cioè un generatore di C. Per il teorema precedente
g1 (x) è un divisore di xn − 1. Poichè g1 (x) ∈ C si ha g1 (x) = f (x)g(x) ∈ Rn [x] e
in Fq [x] diventa g1 (x) = f (x)g(x) + p(x)(xn − 1). Poichè g(x) divide xn − 1, dalla
relazione precedente segue che g(x) divide g1 (x). D’altra parte g1 (x) divide g(x)
essendo g1 (x) il generatore di C. Allora g(x) = g1 (x) perchè i due polinomi sono
monici.
Teorema 5.2.5. Sia C un codice ciclico di lunghezza n generato da g(x) di
grado n − k. Allora ogni parola c(x) ∈ C si può esprimere in modo unico nella
forma c(x) = f (x)g(x), con f (x) ∈ Rn [x], gr(f (x)) ≤ k − 1.
Dimostrazione. Per la definizione di codice ciclico, ogni parola di C è del
tipo c(x) = f (x)g(x). Distinguiamo due casi.
1◦ caso. Sia gr(f (x)) ≤ k − 1. Occorre solo provare l’unicità della rappresentazione. Supponiamo c(x) = f (x)g(x) = f1 (x)g(x), si ha [f (x) − f1 (x)]g(x) = 0 e
quindi necessariamente f (x) = f1 (x).
2◦ caso. Sia gr(f (x)) ≥ k. Allora gr(c(x)) ≥ k + (n − k) = n e si ha c(x) =
f (x)g(x) = q(x)(xn − 1) + r(x), con gr(r(x)) ≤ n − 1 oppure gr(r(x)) = 0. Poichè
g(x) divide xn − 1 si ha che g(x) è un divisore di r(x) ed esiste un unico polinomio
f1 (x) tale che r(x) = f1 (x)g(x) con gr(f1 (x)) ≤ k − 1. Si ha quindi c(x) =
f (x)g(x) = q(x)(xn − 1) + f1 (x)g(x), che in Rn [x] diventa c(x) = f1 (x)g(x).
Ricordando le proprietà degli ideali e tenendo presente il teorema 5.2.3, si ha
che il numero degli (n, k)-codici ciclici su Fq è uguale al numero dei polinomi di
Fq [x] che dividono xn − 1, a meno di una costante moltiplicativa non nulla.
Se i polinomi fattori irriducibili di xn −1 sono h, ossia xn −1 = f1 (x)f2 (x) · · · fh (x),
allora i codici ciclici di lunghezza n sono 2h (includendo anche i banali) e si ottengono scegliendo come polinomio generatore uno qualsiasi dei 2h fattori di xn − 1.
Poichè i codici banali sono due, quello contenente la sola parola nulla e Rn [x], si
ha che i codici ciclici non banali sono 2h − 2.
Quindi dopo aver scomposto xn − 1 in fattori irriducibili, è facile costruire tutti
i codici ciclici di lunghezza n.
2. POLINOMIO GENERATORE E MATRICE GENERATRICE
66
Nel seguito consideriamo codici ciclici di lunghezza n su Fq = GF (q) di
caratteristica p, q = pt , con n e q primi fra loro, cioè M CD(n, q) = 1.
Questo perchè si vuole che i fattori irriducibili in cui si scompone xn − 1 siano distinti. Se fosse M CD(n, q) = pr 6= 1, si avrebbe n = apr con r intero e
r
M CD(a, q) = 1 e sarebbe xn − 1 = (xa − 1)p . Sotto l’ipotesi M CD(n, q) = 1 i
fattori irriducibili nei quali si scompone xn − 1 sono tutti distinti.
Esempio 5.2.6. Determinare i codici ciclici binari di lunghezza 3.
Fissato x3 + 1, è R3 [x] = F2 [x]/(x3 + 1). Poichè x3 + 1 = (x + 1)(x2 + x + 1), oltre
ai codici banali ci sono 2h − 2 = 22 − 2 = 2 codici ciclici binari di lunghezza 3.
• Se g(x) = (1 + x) il codice C da esso generato è
C = {0; 1 + x; 1 + x2 ; x + x2 }
perchè gli elementi di C sono i prodotti di g(x) per i polinomi di R3 [x] di
grado minore o uguale a 1, ossia g(x) per i polinomi 0; 1; x; 1 + x.
• Se consideriamo come polinomio generatore g(x) = 1 + x + x2 , si ottiene
il codice
C1 = {0; 1 + x + x2 }
I codici C e C1 , come terne (c0 c1 c2 ) di elementi di GF (2), sono rappresentati da:
C = {(0 0 0), (1 1 0), (1 0 1), (0 1 1)}
e
C1 = {( 0 0 0), (1 1 1)}
Esempio 5.2.7. Determinare i codici ciclici ternari di lunghezza 4.
Il polinomio x4 − 1 ∈ F3 [x] ha la seguente scomposizione in fattori irriducibili:
x4 − 1 = (x − 1)(x + 1)(x2 + 1)
e quindi i polinomi a coefficienti in F3 che dividono x4 − 1, sono
1; x − 1; x + 1; x2 + 1; (x − 1)(x + 1); (x − 1)(x2 + 1); (x + 1)(x2 + 1); x4 − 1.
Esistono dunque otto codici ciclici di lunghezza 4 su F3 (compresi i due banali)
generati dagli otto polinomi soprascritti. D’altra parte 8 = 23 essendo tre i fattori
irriducibili in cui si scompone x4 − 1.
Esempio 5.2.8. Determinare tutti i possibili codici ciclici binari di lunghezza
7.
Questi codici sono sottospazi di F27 . Consideriamo f (x) = x7 − 1. In F2 il
polinomio f (x) si fattorizza in fattori irriducibili nel seguente modo:
x7 − 1 = (x + 1)(x3 + x2 + 1)(x3 + x + 1)
perciò i divisori monici di f (x) sono tutti e soli i seguenti:
g1 (x) = 1; g2 (x) = x + 1; g3 (x) = x3 + x2 + 1; g4 (x) = x3 + x + 1;
2. POLINOMIO GENERATORE E MATRICE GENERATRICE
67
g5 (x) = (x + 1)(x3 + x2 + 1); g6 (x) = (x + 1)(x3 + x + 1);
g7 (x) = (x3 + x2 + 1)(x3 + x + 1); g8 (x) = f (x).
Ne segue che F27 contiene esattamente otto codici ciclici (compresi i banali).
Ad esempio, g6 (x) genera il codice ciclico
C = {0000000; 1011100; 0101110; 0010111; 1001011; 1100101; 1110010; 0111001}
Analogamente g7 (x) genera il codice:
C = {0000000; 1111111}.
Esempio 5.2.9. Costruire un (15, 9)-codice ciclico binario.
Occorre trovare un polinomio monico divisore di x15 − 1 e di grado n − k =
15 − 9 = 6. Poichè g(x) = x6 + x5 + x4 + x3 + 1 = (1 + x + x2 )(1 + x + x4 ) soddisfa
queste condizioni, esso genera un (15, 9)-codice ciclico.
Quale aiuto per la costruzione dei codici ciclici binari, riportiamo la seguente
tavola di fattorizzazione di xn − 1 su GF (2) per n ≤ 25.
2. POLINOMIO GENERATORE E MATRICE GENERATRICE
68
Tavola della Fattorizzazione di xn − 1 su GF (2) per n ≤ 25.
n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Fattorizzazione
1+x
(1 + x)2
(1 + x)(1 + x + x2 )
(1 + x)4
(1 + x)(1 + x + x2 + x3 + x4 )
(1 + x)2 (1 + x + x2 )2
(1 + x)(1 + x + x3 )(1 + x2 + x3 )
(1 + x)8
(1 + x)(1 + x + x2 )(1 + x3 + x6 )
(1 + x)2 (1 + x + x2 + x3 + x4 )2
(1 + x)(1 + x + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 )
(1 + x)4 (1 + x + x2 )4
(1 + x)(1 + x + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 )
(1 + x)2 (1 + x + x3 )(1 + x2 + x3 )2
(1 + x)(1 + x + x2 )(1 + x + x2 + x3 + x4 )(1 + x + x4 )(1 + x3 + x4 )
(1 + x)16
(1 + x)(1 + x + x2 + x4 + x6 + x7 + x8 )(1 + x3 + x4 + x5 + x8 )
(1 + x)2 (1 + x + x2 )2 (1 + x3 + x6 )2
(1 + x)(1 + x + x2 + x3 + x4 + · · · + x16 + x17 + x18 )
(1 + x)4 (1 + x + x2 + x3 + x4 )4
(1 + x)(1 + x + x2 )(1 + x2 + x3 )(1 + x + x3 )(1 + x2 + x4 + x5 + x6 )(1 + x+
+x2 + x4 + x6 )
(1 + x)2 (1 + x + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 )2
(1 + x)(1 + x + x5 + x6 + x7 + x9 + x11 )(1 + x2 + x4 + x5 + x6 + x10 + x11 )
(1 + x)8 (1 + x + x2 )8
(1 + x)(1 + x + x2 + x3 + x4 )(1 + x5 + x10 + x15 + x20 )
Matrice Generatrice
Un codice ciclico è lineare e pertanto ad esso si può associare una matrice
generatrice. Illustriamo due metodi per costruirla.
Primo metodo - Come mostra il prossimo teorema, la forma naturale per
la matrice generatrice di un codice ciclico è quella detta 00 a scala 00 ossia ottenuta
considerando k scorrimenti ciclici del vettore corrispondente ai coefficienti del polinomio generatore. In particolare, la sottomatrice quadrata ottenuta considerando
le prime k colonne è triangolare superiore e ha determinante non nullo. Pertanto,
le prime k posizioni sono posti di informazione e bastano a ricostruire, in assenza
2. POLINOMIO GENERATORE E MATRICE GENERATRICE
69
di errori, la parola originariamente trasmessa. Questa forma ciclica non risulta
quasi mai standard.
Teorema 5.2.10. Sia C un codice ciclico di lunghezza n generato dal polinomio
monico g(x) = g0 + g1 x + · · · + gn−k−1 xn−k−1 + xn−k . Allora una sua matrice
generatrice è


 
g(x)
g0 g1 · · · · · · gn−k−1
1
0
···
0
 xg(x)   0 g0 · · · · · ·
···
gn−k−1 1
···
0 
= . .
G=
.
.
.
.
.
.
.
.. 

  .. ..
..
..
..
..
..
..
..
. 
xk−1 g(x)
0
0
···
g0
···
···
· · · gn−k−1 1
Dimostrazione. G ha rango k perchè le righe sono linearmente indipendenti.
Dobbiamo provare che ogni parola di C si può esprimere come combinazione lineare
dei vettori riga di G. Dalla definizione di codice ciclico segue che un elemento
c = (c0 , c1 , . . . , cn−1 ) ∈ Fqn appartiene a C se e solo se il polinomio c(x) = c0 +
c1 x + . . . + cn−1 xn−1 ad esso associato è della forma c(x) = g(x)f (x) mod(xn − 1),
con f (x) ∈ Rn [x], gr(f (x)) ≤ k − 1, ossia se e solo se
c(x) = g(x)(f0 + f1 x + . . . + fk−1 xk−1 ) =
= f0 g(x) + f1 xg(x) + . . . + fk−1 xk−1 g(x) =
= f0 (g0 , g1 , . . . , 1, . . . , 0)+
+f1 (0, g0 , g1 , . . . , 1, . . . , 0)+
+f2 (0, 0, g0 , . . . , 1, . . . , 0)+
+......+
+fk−1 (0, 0, . . . , g0 , . . . , 1).
Segue che una qualsiasi parola c ∈ C si può esprimere come combinazione lineare
delle righe di G e pertanto G è una matrice generatrice di C.
Corollario 5.2.11. Un codice ciclico C avente come polinomio generatore un
polinomio di grado n − k, ha dimensione k e pertanto è un (n, k)-codice.
Secondo metodo - Per un codice ciclico è sempre possibile costruire una matrice generatrice in una forma standard, detta 00 antisistematica00 , particolarmente
comoda in fase di implementazione di algoritmi di decodifica perchè una copia
della parola originale si trova nelle ultime k posizioni trasmesse.
Teorema 5.2.12. Sia C un codice ciclico di lunghezza n generato dal polinomio
g(x) con gr(g(x)) = n − k. Per C è sempre possibile determinare una matrice
generatrice della forma G = (A|Ik ).
2. POLINOMIO GENERATORE E MATRICE GENERATRICE
70
Dimostrazione.
• Dividiamo i monomi xi per g(x), con n − k ≤ i ≤ n − 1, si ottiene
xi = qi (x)g(x) + ri (x)
dove i polinomi ri (x) hanno grado minore di n − k oppure sono nulli.
• Consideriamo una matrice avente come righe i coefficienti delle parole
pi (x) = qi (x)g(x) = −ri (x)+xi ordinate per i = n − k, n − k +1, . . . , n − 1,
inoltre ordiniamo ogni polinomio in senso crescente. Se
ri (x) = r0,i + r1,i x + · · · + rn−k−1,i xn−k−1
si ha
pi (x) = −ri (x) + xi = −r0,i − r1,i x − · · · − rn−k−1,i xn−k−1 + xi ∈ C
• La matrice cercata è la matrice di tipo k × n

−r0,n−k
−r1,n−k · · · −rn−k−1,n−k
 −r0,n−k+1 −r1,n−k+1 · · · −rn−k−1,n−k+1
G=
..
..
..
..

.
.
.
.
−r0,n−1
−r1,n−1
···
−rn−k−1,n−1

0 ··· 0
1 ··· 0 
.. .. .. 
. . . 
0 0 ··· 1
1
0
..
.
Ogni riga di G è una parola del codice C generato da g(x), inoltre G ha rango k e
quindi le righe sono linearmente indipendenti. G è dunque una matrice generatrice
di C ed è del tipo G = (A | Ik ) in cui le righe di A corrispondono a −ri (x), n − k ≤
i ≤ n − 1.
Esempio 5.2.13. Sia C un codice ciclico binario di lunghezza 7 generato dal
polinomio g(x) = 1 + x + x3 . Trovare la matrice generatrice di C applicando sia il
primo metodo che il secondo metodo.
Soluzione - Poichè gr(g(x)) = n − k, risulta 3 = 7 − 4 e pertanto C è un
(7, 4)-codice.
Primo metodo
 


g(x)
1 1 0 1 0 0 0
 xg(x)   0 1 1 0 1 0 0 

 
G=
 x2 g(x)  =  0 0 1 1 0 1 0 
x3 g(x)
0 0 0 1 1 0 1
Secondo metodo
Poichè gr(g(x)) = 3, dividiamo per g(x) i monomi x3 , x4 , x5 , x6 . Si ottiene
x3
x4
x5
x6
=
=
=
=
(x3 + x + 1) + (x + 1)
x(x3 + x + 1) + (x2 + x)
(x2 + 1)(x3 + x + 1) + (x2 + x + 1)
(x3 + x + 1)(x3 + x + 1) + (x2 + 1)
3. SCHEMI DI CODIFICA
71
Considerando i polinomi resto r3 = 1+x, r4 = x+x2 , r5 = 1+x+x2 , r6 = 1+x2 ,
con il secondo metodo, si ottiene la matrice:


−1 −1
0 1 0 0 0
 0 −1 −1 0 1 0 0 

Ḡ = 
 −1 −1 −1 0 0 1 0 
−1
0 −1 0 0 0 1
3. Schemi di codifica
Sia C un (n, k)-codice ciclico generato da g(x) di grado n − k.
Primo metodo di codifica
Al messaggio m = (m0 , m1 , . . . , mk−1 ) associamo il polinomio m(x) = m0 +
m1 x + . . . + mk−1 xk−1 . Per 5.2.5 il messaggio m(x) può essere codificato nella
parola c(x) = m(x)g(x).
Secondo metodo di codifica
Per questo secondo metodo, illustreremo due modi di codifica: il primo utilizza
la matrice generatrice standard mentre il secondo opera solo con polinomi ossia
non occorre scrivere la matrice generatrice. In entrambi i casi i posti di
informazione sono gli ultimi k posti ed è importante notare che in questi posti
ritroviamo inalterati i k simboli di informazione del messaggio da codificare. Questo fatto assicura che per l’operazione di codifica è sufficiente un algoritmo che
determini le componenti dei soli n − k posti di controllo.
1◦ modo - Sia m = (m0 , m1 , . . . , mk−1 ) il messaggio da codificare.
Sia G = (A|Ik ) la matrice generatrice standard di tipo k × n del (n, k)-codice
C ottenuta a partire dal polinomio generatore g(x). Una matrice di questo tipo
si può sempre costruire come illustrato nel paragrafo 2 di questo capitolo (vedi
teorema 5.2.12).
• Si codifica il messaggio m come c = mG.
Poichè G è standard, si ha c = (c0 , . . . , cn−k−1 , m0 , . . . mk−1 ) e dunque i simboli
di informazione m0 , m1 , . . . mk−1 rimangono inalterati e occupano le ultime k
posizioni mentre i simboli di controllo sono i primi n − k.
2◦ modo - Sia m = (m0 , m1 , . . . , mk−1 ) il messaggio da codificare e sia m(x) =
m0 + m1 x + · · · + mk−1 xk−1 il polinomio ad esso associato. Dividiamo il polinomio
xn−k m(x) per il polinomio generatore g(x); si ottiene xn−k m(x) = q(x)g(x) + r(x)
da cui c(x) = q(x)g(x) = −r(x) + xn−k m(x).Consideriamo c(x) ordinato secondo
potenze crescenti,
c(x) = −r0 − r1 x − r2 x2 − . . . − rn−k−1 xn−k−1 + mn−k xn−k + mn−1 xn−1 .
3. SCHEMI DI CODIFICA
72
• Il messaggio m viene codificato nella parola
c = (−r0 , −r1 , . . . , −rn−k−1 , mn−k , . . . , mn−1 ).
che ha i k simboli di informazione m0 , m1 , . . . mk−1 negli ultimi k posti e gli n − k
simboli di controllo, che sono i coefficienti di −r(x), nelle prime n − k posizioni.
Esempio 5.3.1. Sia C un codice ciclico binario di lunghezza 7 generato da
g(x) = 1 + x + x3 . Costruiamo la matrice generatrice standard come descritto nel
teorema 5.2.12. Con l’algoritmo euclideo determiniamo:
x3
x4
x5
x6
=
=
=
=
Si ottiene così la seguente

1
 0
G = (A|Ik ) = 
 1
1
1 · (x3 + x + 1) + (1 + x)
x · (x3 + x + 1) + (x + x2 )
(x2 + 1) · (x3 + x + 1) + (1 + x + x2 )
(x3 + x + 1) · (x3 + x + 1) + (1 + x2 )
matrice generatrice (vedi anche esempio 5.2.13):



1 1 0
1 0 1 0 0 0
 0 1 1 
1 1 0 1 0 0 


;
A=

 1 1 1 
1 1 0 0 1 0
1 0 1
0 1 0 0 0 1
Le righe di A corrispondono ai vettori dei coefficienti dei polinomi resto 1 +
x; x + x2 ; 1 + x + x2 ; 1 + x2 .
Sia dato il messaggio m = (1110) e codifichiamo utilizzando il secondo schema.
• Codifica con il secondo schema, 1◦ modo.
Per codificare m utilizziamo la matrice standard G. Il messaggio viene
codificato in c = mG = (0101110).
• Codifica con il secondo schema, 2◦ modo.
Ad m si associa il polinomio m(x) = 1 + x + x2 . Si considera il polinomio
xn−k m(x) e si divide per g(x); nel nostro caso si ottiene x3 (1 + x + x2 ) =
(x + x2 )(1 + x + x3 ) + x, e pertanto la parola associata ad m(x) è c(x) =
xn−k m(x)−r(x) = x3 (1+x+x2 )−x = x+x3 +x4 +x5 , ossia c = (0101110).
Algoritmo di Codifica
Descriviamo un algoritmo di codifica per un (n, k)-codice ciclico basato su quanto
esposto nel 2◦ modo del secondo metodo (vedi [3] pag. 114).
Siano dati
• Un (n, k)-codice ciclico C con polinomio generatore g(x) = g0 + g1 x + · · · +
gn−k−1 xn−k−1 + xn−k .
• Un messaggio m = (m0 m1 · · · mk−1 ).
3. SCHEMI DI CODIFICA
73
Determinare un vettore c = (c0 c1 . . . cn−k−1 ) di simboli di controllo tale che m sia
codificato in (c0 c1 . . . cn−k−1 m0 m1 . . . mk−1 ) ∈ C.
Posto g = (g0 g1 . . . gn−k−1 ) l’algoritmo è il seguente.
(1) Si pone c0j = 0 per 0 ≤ j ≤ n − k − 1.
(2) Per ogni i, 1 ≤ i ≤ k, procediamo come segue:
(i−1)
(i−1)
1◦ caso : mk−i = cn−k−1 . Allora si pone cij = cj−1 per n − k − 1 ≤ j ≤ 1
e ci0 = 0.
(i−1)
(i−1)
2◦ caso : mk−i 6= cn−k−1 . Allora si pone cij = cj−1 + gj per n − k − 1 ≤
j ≤ 1 e ci0 = g0 .
(3) Il vettore cercato è il vettore ottenuto per i = k.
Il grande vantaggio di questo algoritmo è che non si richiede di memorizzare
tutta la matrice generatrice G = (A|Ik ) e nemmeno di calcolare a priori i polinomi
ri (x).
Esempio 5.3.2. Consideriamo il (7, 4)-codice ciclico binario C generato da
g(x) = 1 + x + x3 (vedi esempio 5.3.1). Sia m = (m0 m1 m2 m3 ) = (1 0 1 1)
il messaggio da trasmettere. Determinare un vettore c = (c0 c1 c2 ) di simboli di
controllo tale che p = (c0 c1 c2 m0 m1 m2 m3 ) ∈ C.
Soluzione - Consideriamo g = (g0 g1 g2 ) = (1 1 0) e calcoliamo
i
0
1
2
3
4
Primo passo i = 1:
ci0 ci1 ci2
0 0 0
1 1 0
1 0 1
1 0 0
1 0 0
m4−i
m3
m2
m1
m0
=1
=1
=0
=1
(c00 c01 c02 ) = (0 0 0) e m3 = 1 6= c02 = 0 allora
c12 = c01 + g2 = 0 + 0 = 0
c11 = c00 + g1 = 0 + 1 = 1
c10 = g0 = 1
Secondo passo i = 2:
(c10 c11 c12 ) = (1 1 0) e m2 = 1 6= c12 = 0 allora
c22 = c11 + g2 = 1 + 0 = 1
c21 = c10 + g1 = 1 + 1 = 0
c20 = g0 = 1
Terzo passo i = 3:
(c20 c21 c22 ) = (1 0 1) e m1 = 0 6= c22 = 1 allora
3. SCHEMI DI CODIFICA
74
c32 = c21 + g2 = 0 + 0 = 0
c31 = c20 + g1 = 1 + 1 = 0
c30 = g0 = 1
Quarto passo i = 4:
(c30 c31 c32 ) = (1 0 0) e m0 = 1 6= c32 = 0 allora
c42 = c31 + g2 = 0 + 0 = 0
c41 = c30 + g1 = 1 + 1 = 0
c40 = g0 = 1
Il vettore cercato è (1 0 0) e pertanto il messaggio viene codificato in
p = (1 0 0 1 0 1 1) ∈ C.
Esempio 5.3.3. Sia g(x) = 1 + x4 + x6 + x7 + x8 il polinomio generatore di un
(15, 7)-codice ciclico binario C. Per codificare il messaggio
m = (m0 m1 m2 m3 m4 m5 m6 ) = (1 0 1 1 0 1 1)
consideriamo g = (g0 g1 g2 g3 g4 g5 g6 g7 ) = (1 0 0 0 1 0 1 1) e calcoliamo
i
0
1
2
3
4
5
6
7
ci0 ci1 ci2 ci3 ci4 ci5 ci6 ci7
0 0 0 0 0 0 0 0
1 0 0 0 1 0 1 1
0 1 0 0 0 1 0 1
1 0 1 0 1 0 0 1
0 1 0 1 0 1 0 0
1 0 1 0 0 0 0 1
1 1 0 1 1 0 1 1
0 1 1 0 1 1 0 1
m7−i
1 = m6
1 = m5
0 = m4
1 = m3
1 = m2
0 = m1
1 = m0
Il vettore cercato è (0 1 1 0 1 1 0 1) e pertanto il messaggio m = (1 0 1 1 0 1 1) è
codificato in p = (0 1 1 0 1 1 0 1 1 0 1 1 0 1 1) ∈ C.
Come si è visto, per la codifica di un codice ciclico è necessario moltiplicare
e/o dividere polinomi a coefficienti in GF (q). Per fare questo vengono in aiuto
degli apparecchi elettronici chiamati registri a scorrimento lineare ( linear shift
register ). Per la loro descrizione si rinvia a [1] pag. 206 − 215.
4. POLINOMIO DI CONTROLLO E MATRICE DI CONTROLLO
75
4. Polinomio di controllo e matrice di controllo
In un codice ciclico C, oltre al polinomio generatore g(x) c’è un altro polinomio
di Rn [x] che individua univocamente il codice. Questo polinomio gioca un ruolo
analogo a quello della matrice di controllo per i codici lineari.
Sia g(x) un divisore di xn − 1, ossia xn − 1 = g(x)h(x) nell’anello Fq [x] e quindi
g(x)h(x) = 0 in Rn [x]. Poichè h(x) è un divisore di xn − 1, esso genera un codice
ciclico.
Se g(x) = g0 + g1 x + . . . + gn−k−1 xn−k−1 + xn−k è di grado n − k, allora h(x)
ha grado k ed è del tipo h(x) = xk + hk−1 xk−1 + . . . + h1 x + h0 .
Teorema 5.4.1. Una parola c appartiene al codice ciclico C generato da g(x)
se e solo se c(x)h(x) = 0 in Rn [x], con g(x)h(x) = xn − 1 in Fq [x].
Dimostrazione. Se c è una parola di C, allora il polinomio c(x) associato a
c è un multiplo di g(x), cioè c(x) = p(x)g(x) da cui c(x)h(x) = p(x)g(x)h(x) =
p(x)(xn − 1) in Fq [x]. Ciò significa c(x)h(x) = 0 in Rn [x].
Viceversa, supponiamo c(x)h(x) = 0 in Rn [x]. Ciò significa che in Fq [x] è
c(x)h(x) = p(x)(xn − 1) = p(x)g(x)h(x) da cui segue c(x) = p(x)g(x) e quindi
c(x) è una parola del codice.
Definizione 5.4.2. Sia C ⊆ Fqn un codice ciclico generato da g(x). Si definisce
polinomio di controllo di C il polinomio h(x) tale che g(x)h(x) = xn − 1 in Fq [x]
ossia g(x)h(x) = 0 in Rn [x].
Se dim C = k ( ossia gr(g(x)) = n − k e gr(h(x)) = k ) allora il codice generato
da h(x) ha dimensione n − k che è la stessa dimensione del codice duale C ⊥ , ma in
generale non coincide con esso. Questo perchè l’essere c(x)h(x) = 0 in Rn [x] non
equivale all’ortogonalità dei vettori c ed h associati a c(x) ed h(x), rispettivamente.
E’ però vero che, in ogni caso, il codice generato da h(x) è equivalente a C ⊥ , come
mostra il prossimo teorema.
Teorema 5.4.3. Sia C un (n, k)-codice ciclico generato da g(x) ed avente come
polinomio di controllo
h(x) = h0 + h1 x + . . . + hk xk .
Allora la matrice di tipo (n − k) × n

hk hk−1 · · ·
 0
hk hk−1
H=
..
..
 ...
.
.
0
0
0

· · · · · · h0
0 ··· 0
··· ···
0
h0 · · · 0 
..
..
..
..
..
.. 
.
.
.
.
.
. 
· · · hk hk−1 · · · · · · h0
4. POLINOMIO DI CONTROLLO E MATRICE DI CONTROLLO
76
è una matrice di controllo per C. Inoltre C ⊥ è un codice ciclico generato dal
polinomio
h̄ = hk + hk−1 x + . . . + h0 xk .
Dimostrazione. Le righe di H sono evidentemente indipendenti. Sia G la
matrice generatrice di C individuata dall’unico polinomio generatore c(x) per cui
è c(x)h(x) = xn − 1. In c(x)h(x) sono allora nulli i coefficienti di xs , per ogni
s 6= 0, n, e ciò implica che GH t = 0, cioè H è una matrice di controllo di C.
Osserviamo ora che risulta
h̄ = xk h(x−1 ),
c̄(x) = cn−k + cn−k−1 x + cn−k−2 x2 + · · · + c1 xn−k−1 + c0 xn−k = xn−k c(x−1 ),
1 − xn = xn (x−n − 1) = xn c(x−1 )h(x−1 ) = xk h(x−1 )xn−k c(x−1 ) = h̄(x)c̄(x),
cioè h̄(x) divide xn − 1. Dalla 5.3.1 segue allora che C ⊥ è ciclico con polinomio
generatore h̄(x) e il teorema è completamente dimostrato.
Definizione 5.4.4. Sia h(x) = h0 + h1 x + . . . + hk xk polinomio di controllo
del (n, k)-codice ciclico C. Si chiama polinomio reciproco di h(x) il polinomio
h̄ = hk + hk−1 x + . . . + h0 xk .
Esempio 5.4.5. Sia C un codice ciclico binario di lunghezza 7 generato da
g(x) = 1 + x + x3 . Si ha:
(1) C ha dimensione 4.
7 +1
(2) Il polinomio di controllo è h(x) = xg(x)
= 1 + x + x2 + x4 ; esso genera
un codice ciclico C1 di dimensione 3.
(3) Una matrice generatrice di C (costruita con il primo metodo, teorema
5.2.10) è


1 1 0 1 0 0 0
 0 1 1 0 1 0 0 

G=
 0 0 1 1 0 1 0 
0 0 0 1 1 0 1
(4) Una matrice di controllo di

1
H= 0
0
Cè

0 1 1 1 0 0
1 0 1 1 1 0 
0 1 0 1 1 1
(5) Il polinomio reciproco di h(x) è il polinomio h̄(x) = xk h( x1 ) = x4 (1 +
1
+ x14 ) = x4 + x3 + x2 + 1.
x2
1
x
+
5. DECODIFICA
77
(6) Determiniamo una matrice generatrice di C nella forma standard antisistematica G0 = (A|Ik ), utilizzando il secondo metodo (teorema 5.2.12). Le
righe di G0 sono date dai coefficienti dei polinomi −ri (x)+xi , dove ri (x) è il
resto della divisione di xi per g(x), essendo n − k ≤ i ≤ n − 1. La prima, la
seconda, la terza, la quarta riga di G0 sono date rispettivamente dai coefficienti dei polinomi (x+1)+x3 , (x2 +x)+x4 , (x2 +x+1)+x5 , (x2 +1)+x6 .
Risulta pertanto:


1 1 0 1 0 0 0
 0 1 1 0 1 0 0 

G0 = 
 1 1 1 0 0 1 0  = (A|I4 ).
1 0 1 0 0 0 1
(7) Se la matrice generatrice di C è G0 allora la matrice di controllo è


1 0 0 1 0 1 1
H = (I3 | − At ) =  0 1 0 1 1 1 0 
0 0 1 0 1 1 1
5. Decodifica
Se il codice ciclico viene usato solo come codice rivelatore di errori, si procede
come segue.
Se si riceve un vettore y(x), il decodificatore deve stabilire se è oppure no un
elemento del codice. Per fare ciò si può usare il polinomio di controllo e vedere
n −1
, la relazione y(x)h(x) = 0
se y(x)h(x) = 0 in Rn [x]. Inoltre, poichè h(x) = xg(x)
(xn − 1) che significa y(x)
≡ 0 mod (xn − 1). Pertanto se
equivale a 0 = y(x)
g(x)
g(x)
y(x)h(x) = 0, dividendo y(x) per g(x) si ottiene come resto 0. Allora, per vedere
se ci sono errori, il decodificatore può dividere il vettore ricevuto per g(x), invece
di moltiplicarlo per h(x).
Gli schemi di decodifica veri e propri dipendono dal singolo tipo di codice. In
ogni caso anche la decodifica di un codice ciclico può essere implementata in modo
conciso in termini di polinomi.
Fissiamo un (n, k)-codice ciclico C ⊆ Fqn con polinomio generatore g(x). Per
quanto visto precedentemente, è sempre possibile rappresentare l’operazione di
codifica mediante una matrice generatrice G della forma G = (A|Ik ) e pertanto è
la matrice di controllo di C è del tipo
H = (In−k | − At ).
Considerando i polinomi resto ri (x) si vede immediatamente che
5. DECODIFICA
H=
1 0
0
0 1
0
0 0
1
r0 ( x)
r1 ( x)
78
rk −1 ( x)
Teorema 5.5.1. Sia C ⊆ Fqn un (n, k)-codice ciclico generato da g(x) e sia H
una sua matrice di controllo del tipo H = (In−k | − At ). Sia v ∈ Fqn un vettore e
s la sua sindrome rispetto ad H. Siano v(x) e s(x) le rispettive rappresentazioni
polinomiali. Allora s(x) è il resto della divisione di v(x) per g(x).
Dimostrazione. Si rinvia a [3] pag. 116.
In altre parole, il teorema assicura che la sindrome di una sequenza può essere
determinata semplicemente eseguendo una divisione fra polinomi mediante l’algoritmo euclideo. Questo può risultare molto più agevole da implementare che non
l’usuale prodotto fra matrice e vettore.
Esempio 5.5.2. Sia C il (7, 4)-codice ciclico binario generato dal polinomio
g(x) = 1 + x + x3 . Una sua matrice generatrice del tipo G = (A|I4 ) è (vedi esempio
5.2.13)


1 1 0 1 0 0 0
 0 1 1 0 1 0 0 

G=
 1 1 1 0 0 1 0 
1 0 1 0 0 0 1
e pertanto una matrice di controllo è data da


1 0 0 1 0 1 1
H =  0 1 0 1 1 1 0  = (I3 | − At )
0 0 1 0 1 1 1
Supponiamo di aver ricevuto la sequenza r = (1 0 1 1 0 1 1). La sindrome di r è
s = rH t = (0 0 1). Troviamola ora in altro modo: consideriamo la rappresentazione
polinomiale di r : r(x) = 1 + x2 + x3 + x5 + x6 . Dividendo r(x) per g(x) si ottiene
: r(x) = (x3 + x2 + x + 1)g(x) + x2 . Come previsto, il polinomio associato alla
sindrome di r è s(x) = x2 e pertanto la sindrome è (0 0 1) come già trovato nel
modo 00 classico00 .
Per maggiori approfondimenti si rinvia a [3] pag. 117 − 123.
6. CODICI BCH
79
6. Codici BCH
I codici BCH, dalle iniziali dei loro inventori R. C. Bose, D. K. Ray-Chaudhuri,
A. Hocquenghem, sono codici ciclici pluri-correttori (1959 − 60).
Scegliendo 00 opportunamente00 il polinomio generatore, si può fare in modo che,
entro certi limiti, la distanza minima del codice sia maggiore di un intero prefissato.
Fissato un campo Fq , si vuole costruire un codice su Fq che abbia distanza
minima d ≥ δ, dove δ è un intero arbitrario. L’idea base è quella di lavorare in
un’estensione algebrica di Fq .
Definizione 5.6.1. Un codice ciclico di lunghezza n su Fq è detto codice
BCH con distanza garantita δ se è generato da un polinomio g(x) che è il
minimo comune multiplo dei polinomi minimi (su Fq ) degli elementi
αl , αl+1 , . . . , αl+δ−2
con α radice primitiva n-esima dell’unità e l ≥ 0 intero fissato.
Poichè l’elemento α è una radice n-esima dell’unità, anche ogni sua potenza αj
è radice n-esima dell’unità. Pertanto
x − αj
divide sempre xn − 1; perciò il polinomio g(x) della definizione 5.6.1 deve, anche
esso, dividere xn − 1 e il codice generato ha lunghezza n e dimensione n−gr(g(x)).
Dalla definizione segue che il polinomio g(x) che genera il codice BCH è il
polinomio di grado minimo su GF (q) avente αl , αl+1 , . . . , αl+δ−2 come radici.
Definizione 5.6.2. Sia C un codice BCH di lunghezza n su Fq , con distanza
garantita δ. C è detto BCH in senso stretto se nella definizione 5.6.1 si ha l = 1
Ossia C è generato da g(x) tale che :
(1) g(x) | xn − 1 ,
(2) α radice primitiva n-sima dell’unità,
(3) g(x) = m.c.m.(f1 (x), f2 (x), . . . , fδ−1 (x)) con fi (x) polinomio minimo di
αi , 1 ≤ i ≤ δ − 1.
In generale, con il simbolo BCHq (n, δ) si indica un codice BCH in senso stretto
q-ario di lunghezza n e distanza garantita δ.
Il numero δ non è necessariamente la distanza minima del codice BCH, ma
ne dà una limitazione inferiore, come afferma il seguente teorema di cui, per la
dimostrazione, si rinvia a [3] pag. 159.
Teorema 5.6.3 (Limitazione BCH). Sia C un codice BCH sopra Fq di distanza
garantita δ. Allora C ha distanza minima d ≥ δ.
6. CODICI BCH
80
Ricordiamo che per determinare una radice primitiva n-esima dell’unità, in
generale, si deve trovare l’estensione algebrica Fqm ⊇ Fq definita dal più piccolo
intero m tale che n divida q m − 1. Determinato m, sia q m − 1 = kn e sia ξ un
m
elemento primitivo di Fqm . Poichè ξ q −1 = ξ nk = 1, si ha che α = ξ k è una radice
primitiva n-esima dell’unità.
Per costruire un codice BCH si deve lavorare contemporaneamente su due
campi : il campo Fq cui appartengono le componenti delle parole del codice e su
cui è definito lo spazio vettoriale C ⊆ Fqn , e il campo Fqm in cui giacciono le radici
dell’unità utilizzate nella costruzione e detto campo di calcolo del codice.
Esempio 5.6.4. Costruire il codice BCH2 (15, 7).
La lunghezza del codice è 15, pertanto serve una radice 15-esima dell’unità:
indichiamo con α questa radice. Poichè 4 è il più piccolo intero positivo tale che
15 divide 24 − 1, scegliamo come α un elemento primitivo di F24 . Poichè 16 = 24 ,
possiamo scegliere una radice del seguente polinomio di grado 4, irriducibile in
GF (2):
x4 + x + 1
Per avere δ = 7, occorre considerare un polinomio g(x) generatore del codice BCH
che abbia come radici (1 + 7 − 2) sei potenze consecutive di α.
(1) In GF (24 ) gli elementi α, α2 , α3 , α4 , α5 , α6 sono radici 15-esime dell’unità.
Le radici α, α2 , α4 hanno come polinomio minimo irriducibile su GF (2) il
polinomio p(x) = 1 + x + x4 ; α5 ha come polinomio minimo irriducibile
su GF (2) il polinomio q(x) = 1 + x + x2 ; α6 ha come polinomio minimo
irriducibile su GF (2) il polinomio r(x) = 1 + x + x2 + x3 + x4 . Il codice
BCH cercato è allora generato dal minimo comune multiplo dei polinomi
p(x), q(x), r(x) ossia è generato dal polinomio g(x) = 1 + x + x2 + x4 +
x5 + x8 + x10 . Poichè g(x) è una parola del codice di peso 7, si ha che in
questo caso d = δ. Inoltre, poichè l = 1, il codice è BCH in senso stretto.
(2) In GF (24 ) gli elementi α9 , α10 , α11 , α12 , α13 , α14 sono sei potenze consecutive di α e sono radici 15-esime dell’unità. Le radici α9 , α12 hanno come polinomio minimo irriducibile su GF (2) il polinomio p(x) = 1+x+x2 +x3 +x4 ;
α10 ha come polinomio minimo irriducibile su GF (2) il polinomio q(x) =
1 + x + x2 ; α11 , α13 , α14 hanno come polinomio minimo irriducibile su
GF (2) il polinomio r(x) = 1 + x3 + x4 . Il codice BCH cercato è allora
generato dal minimo comune multiplo dei polinomi p(x), q(x), r(x) ossia è
generato dal polinomio g(x) = 1 + x2 + x5 + x6 + x8 + x9 + x10 . Poichè g(x)
è una parola del codice di peso 7, come nel caso precedente si ha d = δ
ma il codice non è BCH in senso stretto perchè l = 9.
6. CODICI BCH
81
Per costruire un codice BCH, è di grande utilità considerare le classi ciclotomiche del campo di calcolo del codice; infatti con queste si determinano immediatamente i polinomi minimi con cui ottenere il polinomio generatore del
codice.
Esempio 5.6.5. Costruire un codice BCH binario di lunghezza 15.
Sia α un elemento primitivo di GF (24 ), ne segue che α è una radice primitiva
15-esima dell’unità. Le classi ciclotomiche modulo 15 su GF (2) sono:
C0 = {0}, C1 = {1, 2, 4, 8}, C3 = {3, 6, 9, 12}, C5 = {5, 10}, C7 = {7, 11, 13, 14}.
Se mi (x) è il polinomio minimo di αi , ossia mi (αi ) = 0, posto mi (x) = mαi (x),
otteniamo:
m0 (x) =
m1 (x) =
m3 (x) =
m5 (x) =
m7 (x) =
(x − 1)
(x − α)(x − α2 )(x − α4 )(x − α8 )
(x − α3 )(x − α6 )(x − α9 )(x − α12 )
(x − α5 )(x − α10 )
(x − α7 )(x − α11 )(x − α13 )(x − α14 ) .
Ovviamente ogni mi (x) è divisore di x15 − 1 e perciò se g(x) è il prodotto di un
certo numero di polinomi mi (x), allora g(x) è un divisore di x15 − 1 e quindi genera
un codice ciclico. Se g(x) ha δ − 1 potenze consecutive di α come radici, allora il
codice C da esso generato ha distanza garantita δ.
Se costruiamo l’ampliamento GF (24 ) di GF (2) tramite il polinomio 1 + x + x4 ,
ossia 1 + α + α4 = 0, otteniamo
m1 (x) = (x2 + α2 x + αx + α3 )(x2 + α8 x + α4 x + α12 ) =
= x4 + (α8 + α4 + α2 + α)x3 + (α12 + α10 + α9 + α6 + α5 + α3 )x2 +
+(α14 + α13 + α11 + α7 )x + 1
= x4 + x + 1 ;
analogamente
m3 (x) = x4 + x3 + x2 + x + 1
m5 (x) = x2 + x + 1
m7 (x) = x4 + x3 + 1 .
• Se fissiamo g(x) = m3 (x)m5 (x)m7 (x), le potenze α9 , α10 , α11 , α12 , α13 , α14
sono radici di g(x) potenze consecutive e perciò g(x) genera un codice
BCH con distanza garantita δ = 7 perchè 9 + δ − 2 = 14. In questo caso
si tratta di un (15, 5)-codice perchè g(x) ha grado 10.
• Se fissiamo g(x) = m1 (x)m3 (x)m5 (x), le potenze α, α2 , α3 , α4 , α5 , α6 sono
radici di g(x) potenze consecutive e perciò otteniamo ancora un (15, 5)codice con distanza garantita δ = 7 perchè 1 + δ − 2 = 6.
6. CODICI BCH
82
• Se fissiamo g(x) = m1 (x)m3 (x) otteniamo un (15, 7)-codice ciclico, avendo
g(x) grado 8. Inoltre, essendo α, α2 , α3 , α4 radici di g(x) potenze consecutive, C è un BCH codice con distanza garantita δ = 5.
Si ha g(x) = m1 (x)m3 (x) = x8 + x7 + x6 + x4 + 1 ed essendo 5 il peso di
g(x), si ha d(C) = δ = 5.
• Se fissiamo g(x) = m0 (x)m1 (x)m3 (x), otteniamo ancora un (15, 6)-codice
con distanza garantita δ = 6.
In generale, se g(x) ha come radice α e genera un codice BCH con distanza
garantita δ, il codice generato da m0 (x)g(x) ha distanza garantita δ + 1.
Esempio 5.6.6. Costruire un codice BCH ternario di lunghezza 8.
Poichè 8 | 32 − 1, sia α un elemento primitivo di GF (32 ), ossia α è una radice
primitiva ottava dell’unità. Le classi ciclotomiche modulo 8 su GF (3) sono:
C0 = {0}, C1 = {1, 3}, C2 = {2, 6}, C4 = {4}, C5 = {5, 7}.
Se denotiamo con mi (x) il polinomio minimo di αi , si ha:
m0 (x) =
m1 (x) =
m2 (x) =
m4 (x) =
m5 (x) =
(x − 1)
(x − α)(x − α3 )
(x − α2 )(x − α6 )
(x − α4 )
(x − α5 )(x − α7 ) .
Se fissiamo g(x) = m2 (x)m5 (x), otteniamo un codice C che è BCH C con distanza
garantita δ = 4, essendo α5 , α6 , α7 radici di g(x) e potenze consecutive. Inoltre
poichè g(x) ha peso esattamente 4, si ha d(C) = δ = 4. Il codice C è un (8, 4)-codice
perchè il grado di g(x) è 4.
Esempio 5.6.7. Costruire un codice BCH codice ternario di lunghezza 13.
Il minimo ordine m di un ampliamento algebrico di GF (3) tale che 3m −1 = 13k
è 3, infatti 33 − 1 = 2 · 13.
Sia α un elemento primitivo di GF (33 ), ad esempio α sia radice del polinomio
3
x + 2x2 + 1; allora β = αk = α2 è radice 13-esima primitiva dell’unità.
Le classi ciclotomiche modulo 13 su GF (3) sono:
C0 = {0}, C1 = {1, 3, 9}, C2 = {2, 5, 6}, C4 = {4, 10, 12}, C7 = {7, 8, 11}.
Se denotiamo con mi (x) il polinomio minimo di β i , si ha:
m0 (x) =
m1 (x) =
m2 (x) =
m4 (x) =
m7 (x) =
(x − 1)
(x − β)(x − β 3 )(x − β 9 ) = x3 + 2x2 + 2x + 2
(x − β 2 )(x − β 5 )(x − β 6 ) = x3 + 2x + 2
(x − β 4 )(x − β 10 )(x − β 12 ) = x3 + 2x2 + x + 2
(x − β 7 )(x − β 8 )(x − β 11 ) = x3 + x2 + 2 .
6. CODICI BCH
83
• Se fissiamo g(x) = m0 (x)m1 (x)m2 (x) = x7 + x6 + 2x5 + x4 + 2x + 2,
otteniamo un codice C che è BCH con distanza garantita δ = 5.
• Se fissiamo g(x) = m1 (x)m2 (x), otteniamo un codice C che è BCH con
distanza garantita δ = 4.
Esempio 5.6.8. Costruire un codice C = BCH2 (9, 2).
Per poterlo costruire occorre anzittutto una radice primitiva nona dell’unità su
F2 . Il campo di spezzamento di x9 − 1 è F26 perchè il più piccolo intero tale che
9|2m − 1 è m = 6. Indichiamo con ξ un generatore del gruppo moltiplicativo di F26
e sia
x6 + x4 + x3 + x + 1
il polinomio minimo di ξ in GF (2) (è irriducibile e ha grado 6 perchè determina
l’estensione F26 di F2 ). Il periodo di ξ è 26 − 1 = 63. Ne segue che α = ξ 63/9 = ξ 7 è
una radice primitiva nona dell’unità. Poichè 1 + δ − 2 = 1 + 2 − 2 = 1, per costruire
il codice BCH richiesto occorre una radice radice nona dell’unità; consideriamo
pertanto la radice α. Essa ha polinomio minimo
x6 + x3 + 1.
Il codice BCH cercato, essendo generato dal minimo comune multiplo dei polinomi
minimi, in questo caso, è generato da g(x) = (x6 + x3 + 1) e poichè gr(g(x)) =
n − k = 6, la dimensione del codice cercato è 9 − 6 = 3. Da g(x) = x6 + x3 + 1
possiamo scrivere esplicitamente una matrice generatrice per C :


1 0 0 1 0 0 1 0 0
G= 0 1 0 0 1 0 0 1 0 
0 0 1 0 0 1 0 0 1
Le otto parole di C sono date da
• il vettore nullo (peso 0);
• le tre righe della matrice G (peso 3);
• le tre combinazioni delle righe di G a due a due (peso 6);
• il vettore ottenuto sommando tutte e tre le righe di G (peso 9).
Ne segue che il codice C ha distanza minima 3, strettamente maggiore della distanza
garantita.
Una limitazione superiore per la distanza minima di un codice BCH è data dal
seguente teorema che riportiamo senza dimostrazione.
Teorema 5.6.9. Sia C un codice BCH primitivo binario di distanza garantita
δ. Allora la distanza minima d di C soddisfa
δ ≤ d ≤ 2δ − 1.
CAPITOLO 6
Codici di Hamming e codici perfetti
I codici di Hamming sono codici lineari 1-correttori perfetti e per questo particolarmente adatti a situazioni in cui è necessaria la correzione di un singolo errore.
Costituiscono una famiglia di codici molto importante perchè per essi è facile sia
la codifica che la decodifica. Scoperti dallo stesso Hamming nel 1948, l’approccio da noi seguito non è quello originale ma è basato sull’insieme dei sottospazi
1-dimensionali di uno spazio vettoriale.
Il lavoro di Hamming, dal titolo Error Detecting and Error Correcting Codes,
fu pubblicato nel 1950 sulla rivista Bell System Tech. J., vol. 29, n.2, 1950.
R.W.Hamming (1915 − 1998), matematico americano, diede importanti contributi nel campo dell’informatica e delle telecomunicazioni. Mentre lavorava sui
computer presso i laboratori della Bell telephone, dove collaborava con Shannon,
Hamming si rese conto che veniva sprecato molto tempo a causa dell’incapacità
del computer di gestire gli errori. Se veniva rivelato un singolo errore, il computer abbandonava il lavoro per iniziarne un altro, senza mai tornare al precedente.
Hamming poteva accedere ai computer solo nel fine settimana; per questo qualche volta al lunedì trovava il suo lavoro non svolto ed era costretto ad aspettare
un’intera settimana per farlo eseguire di nuovo al computer. Questo lo indusse a
studiare il problema del rilevamento di errori, ovvero a come correggerli.
1. Definizioni e Proprietà
Descriviamo i codici di Hamming tramite una loro matrice di controllo .
r
−1
Definizione 6.1.1. Sia n = qq−1
, k = n − r, r ≥ 2. Un codice C è detto codice
di Hamming di ordine r su Fq se è un (n, n − r)- codice la cui matrice di
controllo H è una matrice r × n tale che ogni colonna è linearmente indipendente
da ogni altra colonna.
84
1. DEFINIZIONI E PROPRIETÀ
85
Per la definizione data, le colonne di una matrice di controllo H di un codice di
Hamming sono tutte le r-ple di elementi di Fq a due a due linearmente indipendenti.
r −1 q r −1
Segue che, data una matrice di controllo H di un ( qq−1
, q−1 − r)-codice, tutte
le altre si possono ottenere da H tramite trasformazioni elementari su righe e
colonne e pertanto, a meno di equivalenze, i codici di Hamming sono codici lineari
individuati univocamente dai loro parametri.
Il rango della matrice di controllo H è sempre 2 perchè due qualunque colonne
c1 , c2 sono linearmente indipendenti e ne contiene tre linearmente dipendenti perchè
il sottospazio generato da c1 +c2 è, a sua volta, rappresentato in H. Per il corollario
4.5.12 ne segue che tutti i codici di Hamming hanno distanza minima d = 3
e sono pertanto 1-correttori e 2-rivelatori.
Ne segue che le sfere di centro le parole del codice e raggio 1 sono a due a due
disgiunte e, poichè ognuna di esse contiene esattamente n(q − 1) + 1 parole di
r −1
Fqn , ricordando che n = qq−1
, risulta
q n−r [1 + n(q − 1)] = q n = |Fqn |
e pertanto il codice è un codice perfetto. Vale dunque il seguente teorema.
Teorema 6.1.2. I codici di Hamming sono 1-correttori e perfetti.
Un po’ di conti. Sia n − k = r, determiniamo il numero massimo di r-ple a
due a due linearmente indipendenti che si possono costruire con q elementi. Il
numero di r-ple distinte non nulle che si ottengono con q elementi è q r − 1 ; ma
per ogni r-pla fissata ci sono (q − 2) altre r-ple linearmente dipendenti da essa e
pertanto l’insieme di tutte le r-ple si suddivide in sottoinsiemi disgiunti ognuno
con (q − 1) r-ple a due a due linearmente dipendenti. Quindi delle (q r − 1) r-ple
non nulle, esattamente (q r − 1)/(q − 1) sono a due a due linearmente indipendenti.
Ne segue che il massimo numero di r-ple a due a due linearmente indipendenti è
n = (q r − 1)/(q − 1) e pertanto k = n − r = [(q r − 1)/(q − 1)] − r.
Un metodo semplice per scrivere una matrice di controllo di un codice q-ario di
Hamming è quello di scegliere come colonne tra le r-ple non nulle possibili, quelle
che hanno il primo elemento non nullo uguale ad 1. Ovviamente ciò equivale a
scegliere una r-pla in ogni sottoinsieme di (q − 1) r-ple a due a due linearmente
indipendenti.
La decodifica dei codici q-ari di Hamming viene fatta usando lo schema di
decodifica descritto nel paragrafo 4.6 per i codici lineari 1-correttori.
Si può dimostrare che un codice q-ario di Hamming di lunghezza (q r −1)/(q −1)
è equivalente ad un codice ciclico se r e (q − 1) sono primi tra loro.
1. DEFINIZIONI E PROPRIETÀ
86
Nel teorema 6.2.3 mostreremo invece che ogni codice binario di Hamming è
equivalente ad un codice ciclico.
Osserviamo infine che una parola non nulla p del codice ha peso w(p) e presenta
lettere diverse da zero nelle posizioni i1 , i2 , . . . , iw se e solo se in H le colonne di
posto i1 , i2 , . . . , iw sono linearmente dipendenti.
Esempio 6.1.3. Sia q = 3, r = 2. Il codice di Hamming che si ottiene è un
32 −1
− 2) = (4, 2)-codice ternario. Per scrivere una matrice di controllo,
3−1
diamo la rappresentazione in base 3 dei numeri compresi fra 1 e 8.
2 −1
( 33−1
,
1
3
5
7
=
1 · 30
= 1 · 31 + 0 · 30
= 1 · 31 + 2 · 30
= 2 · 31 + 1 · 30
=
=
=
=
0
1
1
2
1
0
2
1
2
4
6
8
=
2 · 30
= 1 · 31 + 1 · 30
= 2 · 31 + 0 · 30
= 2 · 31 + 2 · 30
=
=
=
=
0
1
2
2
2
1
0
2
Si osservi che la coppia (0 2) è proporzionale alla coppia (0 1); così come (2 0) è
proporzionale a (1 0); (1 2) è proporzionale a (2 1); (2 2) è proporzionale a (1 1),
ovviamente nell’aritmetica modulo 3. Una matrice di controllo del (4, 2)-codice
ternario di Hamming è allora
0 1 1 1
H=
1 0 1 2
Esempio 6.1.4. Se q = 5 ed r = 2 si ha un (6, 4)-codice di Hamming di ordine
5 avente come matrice di controllo
0 1 1 1 1 1
H=
1 0 1 2 3 4
Supponiamo di ricevere y = (2 0 3 0 3 1). Si ha yH t = (2 3) = 2(1 4). Si deduce
che l’errore è nella sesta componente e la 00 grandezza00 di tale errore è 2 per cui la
parola trasmessa è
x = y − (0 0 0 0 0 2) = (2 0 3 0 3 4).
2. CODICI DI HAMMING BINARI
87
2. Codici di Hamming binari
Un caso particolarmente interessante di codici di Hamming è quello binario.
In questo caso la matrice di controllo H contiene tutti e soli i vettori non nulli di
F2r . In altre parole
si definisce codice binario di Hamming un (2r −1, 2r −1−r)-codice avente come
matrice di controllo una matrice H le cui colonne sono tutte le r-ple non nulle di
elementi di GF (2).
Ad esempio per r = 2 si ottiene un (3, 1)-codice; per r = 3 si ottiene un
(7, 4)-codice; per r = 4 si ottiene un (15, 11)-codice.
Esempio 6.2.1. Per avere la matrice di controllo di un (7, 4)-codice di Hamming
è sufficiente scrivere una matrice le cui colonne sono la rappresentazione in base
due dei numeri 1, 2, 3, 4, 5, 6, 7. Si ha


0 0 0 1 1 1 1
H= 0 1 1 0 0 1 1 
1 0 1 0 1 0 1
Prima di dimostrare il prossimo teorema, ricordiamo alcuni noti risultati di
algebra:
• Sia K un campo di caratteristica p e sia α un elemento non nullo di K.
Un polinomio monico m(x) a coefficienti in GF (p) di grado minimo tale
che m(α) = 0 è detto polinomio minimo di α rispetto a GF (p) e si denota
con mα (x).
• Il polinomio minimo di un elemento non nullo α di GF (q) = GF (ph ) è
Y
mα (x) =
(x − β).
β∈C(α)
• Se f (x) ∈ GF (p)[x] è tale che f (α) = 0, α ∈ GF (ph ), allora mα (x) divide
f (x).
Teorema 6.2.2. I (2r − 1, 2r − 1 − r)-codici C binari di Hamming sono codici
ciclici generati dal polinomio minimo mα (x) di un elemento primitivo a di GF (2r ).
Dimostrazione. Sia α un elemento primitivo del campo GF (2r ). Dalla definizione di codice binario di Hamming segue che una sua matrice di controllo di
lunghezza 2r − 1 si può rappresentare come
r
H = 1 α α2 · · · α2 −2
Per 4.5.7 un vettore c = (c0 , c1 , . . . , cn−1 ) è in C se e solo se cH t = 0 e, passando ai
polinomi, c(x) = c0 +c1 x+. . .+cn−1 xn−1 è in C se e solo se c0 +c1 α+. . .+cn−1 αn−1 =
3. CODICI PERFETTI
88
0, cioè se e solo se c(α) = 0. Dalle proprietà algebriche prima ricordate, segue
che mα (x) divide ogni polinomio-parola c(x) ∈ C, quindi mα (x) è il polinomio
generatore di C.
Nota 6.2.3. Il codice duale di un codice di Hamming binario è un codice
equidistante ossia è un codice in cui tutte le parole diverse da 0 hanno il medesimo
peso che è 3 (vedi [3] pag. 84 − 85).
3. Codici perfetti
Ricordiamo che la proprietà di un codice di essere perfetto dipende esclusivamente dai suoi parametri.
I parametri dei codici perfetti sopra alfabeti con un numero primo di simboli
sono stati completamente determinati, si veda [3] pag. 242.
Altri codici perfetti, oltre a quelli di Hamming, sono stati scoperti nel 1949 da
Golay. Uno è un (23, 12)-codice binario 3-correttore con distanza d = 7; l’altro è un
(11, 6)-codice ternario 2-correttore con distanza d = 5. Questi due codici di Golay,
insieme ai codici di Hamming, sono gli unici codici lineari perfetti non banali.
I codici di Golay e i codici di Golay estesi sono codici sporadici associati ai
disegni di Mathieu . Sono particolarmente interessanti anche perchè hanno una
struttura algebrica molto ricca e perciò si prestano ad essere decodificati con facilità tanto che le prime sonde interplanetarie utilizzavano codici di Golay per la
trasmissione dei dati.
Sull’esistenza di codici perfetti possiamo affermare che.
• Sono codici perfetti banali il codice C = F n , i codici contenenti una sola
parola, i codici di ripetizione binari di lunghezza dispari.
• I codici di Hamming (classe infinita di codici lineari perfetti non banali),
• Il codice lineare binario G23 e il codice lineare ternario G11 di Golay (sono
codici lineari perfetti non banali).
Nel 1973 i lavori di J.H.van Lint e A.Tietavainen provarono il seguente risultato.
Teorema 6.3.1. Se q è potenza di un primo, ogni codice q-ario perfetto non
banale ha i parametri di un codice di Hamming o di uno dei due codici di Golay.
3. CODICI PERFETTI
89
Nel caso lineare, il precedente teorema porta alla seguente caratterizzazione dei
codici perfetti non banali.
Teorema 6.3.2. Ogni codice lineare perfetto non banale è equivalente ad un
codice di Hamming o ad uno dei due codici di Golay.
Rimane aperto il problema nel caso in cui l’alfabeto non sia un campo di Galois.
In questo caso, il risultato più significativo è stato trovato nel 1982 ed è dato dal
seguente teorema.
Teorema 6.3.3. Per h ≥ 3, h 6= 6, 8, il solo codice non banale h-correttore
perfetto sopra un alfabeto qualsiasi è il (23, 12)-codice binario di Golay.
Per h = 1 il problema è lontano dall’essere risolto. E’ stato dimostrato il
seguente teorema.
Teorema 6.3.4. Non esiste un codice 1-correttore perfetto di lunghezza 7 sopra
un alfabeto di 6 simboli.
CAPITOLO 7
Codici di Goppa
I codici di Goppa sono codici lineari di cui ci limitiamo a dare la definizione.
Per una loro trattazione si rinvia a [2] pag. 427.
Il motivo per cui, prima di concludere la parte dedicata ai codici, si vogliono
citare i codici Goppa, è che nella teoria dei codici essi aprono la strada all’uso di
idee e tecniche di geometria algebrica.
Definizione 7.0.5. Sia Fq un campo finito, sia m un intero positivo e f (x)
un polinomio monico di grado t > 0 su Fqm . Sia inoltre L = {γ1 , γ2 , . . . , γn } un
insieme di n elementi distinti di Fqm tali che f (γh ) 6= 0, per h = 1, . . . , n. Il codice
di Goppa C(L, f (x))q,m è il sottoinsieme delle n-ple (c1 , c2 , . . . , cn ) di elementi di
Fq tali che
n
X
ci
≡ 0 (mod f (x)).
x − γi
i=1
90
CAPITOLO 8
Codici correttori e gruppi di permutazioni
I primi studi relativi ad applicazioni degli insiemi di permutazioni alla teoria
dei codici risalgono agli anni 1970. Solo negli ultimi anni ha preso vigore anche
lo studio di codici correttori che sono gruppi di permutazioni, si veda ad esempio
il lavoro di R.F.Bailey Error-correcting codes from permutation groups, Discrete
Mathematics 309, 4253 − 4265, 2009.
1. Gruppi come codici e distanza di Hamming
Considerato un codice le cui parole hanno lunghezza n, dire che il codice è
un gruppo significa che le parole del codice sono permutazioni dell’alfabeto A =
{1, 2, . . . , n} e pertanto significa considerare un sottogruppo del gruppo simmetrico
Sn . Ogni parola del codice può allora essere rappresentata con una stringa i cui
elementi sono, rispettivamente, le immagini degli elementi 1, 2, . . . , n considerati
nel loro ordine naturale. Ad esempio, in S9 , la stringa
123456789
rappresenta la permutazione identità, mentre la stringa
231794685
indica la seguente permutazione di S9
1 2 3 4 5 6 7 8 9
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
2 3 1 7 9 4 6 8 9
Se le parole di un codice C sono permutazioni su n elementi, risulta molto utile
interpretare la distanza di Hamming in termini di punti fissi.
Teorema 8.1.1. Siano g, h ∈ Sn , allora si ha
d(g, h) = n − |F ix(gh−1 )|
dove Fix(g) denota l’insieme dei punti fissi di g.
91
2. GRUPPI STRETTAMENTE K-TRANSITIVI
92
Dimostrazione. Moltiplicando per h−1 sia g che h si ottiene
d(g, h) = d(gh−1 , id.)
ossia la distanza di Hamming fra g ed h è il numero di posti in cui gh−1 differisce
dall’identità e questo numero è proprio n − |F ix(gh−1 )|.
Dal teorema precedente segue che la distanza minima di un insieme C di
permutazioni è uguale a
d(C) = ming,h∈C,g6=h {n − |F ix(gh−1 )|} = n − maxg,h∈C,g6=h |F ix(gh−1 )|
e pertanto se C = G è un gruppo di permutazioni si ha
d(G) = n − maxg,h∈C,g6=h |F ix(gh−1 )|.
2. Gruppi strettamente k-transitivi
In quest’ambito, un ovvio punto di partenza sono i gruppi strettamente ktransitivi perchè la distanza minima di questi gruppi è facile da calcolare.
Se G è un gruppo di permutazioni su A = {1, . . . , n}, ossia G di grado n, si
dice che G è strettamente k-transitivo se comunque prese due k-ple ordinate di
elementi distinti di A, esiste uno ed un solo elemento di G che manda la prima
k-pla nella seconda. Nel seguito, poichè gli studi sono finalizzati ad applicazioni
nella teoria dei codici, si supporrà sempre k ≥ 2.
I gruppi strettamente k-transitivi, k ≥ 2, sono tutti classificati:
k ≥ 6 : Sk , Sk+1 , Ak+2 .
k = 5 : S5 , S6 , A7 , il gruppo di Mathieu M12 .
k = 4 : S4 , S5 , A6 , il gruppo di Mathieu M11 .
k=3:
• Il gruppo proiettivo lineare su GF (q) ∪ {∞}
P GL(2, q) = {α : x → ax+b
, a, b, c, d ∈ GF (q), ad − bc 6= 0}.
cx+d
• Il gruppo Gσ su GF (q) ∪ {∞}, q = p2m , p 6= 2 così definito
(
)
∗
α : x → ax+b
,
a,
b,
c,
d
∈
GF
(q),
ad
−
bc
∈
H
;
cx+d
Gσ =
β : x → aσ(x)+b
, a, b, c, d ∈ GF (q), ad − bc ∈ GF (q)∗ \ H ∗
cσ(x)+d
m
dove σ : x → xp è l’automorfismo involutorio di GF (q), H ∗ gruppo dei
quadrati non nulli di GF (q).
3. UNCOVERINGS
93
k = 2 : Il gruppo delle affinità sulla retta affine
AG(1, F ) = {α :→ ax + b, a, b ∈ F, a 6= 0},
dove F è un quasicorpo finito.
Teorema 8.2.1. Sia G un gruppo di permutazioni strettamente k-transitivo di
grado n. Allora la distanza minima di G è n − k + 1.
Dimostrazione. Per definizione di stretta k-transitività, solo l’identità fissa
k punti e pertanto il massimo numero di punti fissati da un elemento di G che non
sia l’identità è k − 1. Quindi la distanza minima è n − (k − 1) = n − k + 1.
Esempio 8.2.2. Il gruppo simmetrico Sn è sia strettamente n-transitivo che
strettamente (n−1)-transitivo, mentre il gruppo alterno An è strettamente (n−2)transitivo. Pertanto la distanza minima di Sn è n − (n − 1) + 1 = 2, mentre la
distanza minima di An è n − (n − 2) + 1 = 3.
Se considerato come codice, il gruppo simmetrico non è molto utile perchè può
correggere h = b(d − 1)/2c = b(2 − 1)/2c = 0 errori. Il gruppo alterno può invece
correggere 1 errore.
3. Uncoverings
La capacità correttiva di un codice che è un gruppo strettamente k-transitivo
G di grado n è
d−1
(n − k + 1) − 1
n−k
c=b
c=b
c
h=b
2
2
2
e pertanto il metodo di decodifica presentato da Bailey e qui riportato, assume
come condizione iniziale che si siano verificati al più h = b n−k
c errori, cioè che
2
almeno n − h simboli siano corretti. Per la stretta k-transitività, ogni k-pla di simboli corretti identifica univocamente la parola del codice, tuttavia, non sappiamo
in quali t ≤ h posizioni siano gli errori, occorre dunque un metodo per scegliere un
insieme di k-ple in modo da poter essere certi che almeno una non contenga errori.
Ovvero, abbiamo bisogno di un insieme di k-sottoinsiemi di A = {1, 2, . . . , n} tali
che ogni t-sottoinsieme, t ≤ h, sia disgiunto da almeno un k-sottoinsieme.
Definizione 8.3.1. Un insieme U di k-sottoinsiemi di A = {1, 2, . . . , n} è detto
un (n, k, h)-uncovering se per ogni h-sottoinsieme R ⊂ A, esiste S ∈ U tale che
R ∩ S = ∅.
3. UNCOVERINGS
94
Esempio 8.3.2. Consideriamo il gruppo P GL(2, 7) strettamente 3-transitivo su
A = {1, 2, 3, 4, 5, 6, 7, 8}, si ha n = 8, k = 3, h = b(8 − 3)/2c = 2. Se consideriamo
U = {(1, 2, 3), (4, 5, 6), (2, 3, 7), (1, 7, 8)}, esso è un (8, 3, 2)-uncovering. Infatti per
ogni (a, b) con a, b ∈ A, in U esiste almeno un elemento che ha intersezione vuota
con (a, b).
Per velocizzare la decodifica, occorre che l’uncovering sia il più piccolo possibile.
Il problema diventa quindi quello di trovare il più piccolo uncovering possibile per
un dato insieme di parametri, ossia un minimo (n, k, h)-uncovering.
Il problema complementare, ossia quello di trovare un insieme di m-sottoinsiemi
di A tale che ogni h-sottoinsieme di A (con h < m) sia contenuto in almeno un
m-sottoinsieme, è molto interessante e studiato nell’ambito della teoria dei disegni.
Un tale insieme è noto come (n, m, h)-covering design, e gli insiemi di m elementi
sono detti blocchi del disegno. Ne segue che prendendo i complementari dei blocchi
di un (n, m, h)-covering design si ottiene un (n, n − m, h)-uncovering. Per questo
motivo chiameremo coblocchi gli elementi di un uncovering.
Per quanto detto, per la ricerca degli uncoverings è utile la letteratura sui
coverings design. Ad esempio, esiste in internet una raccolta di coverings design per
piccoli parametri: la Jolla Covering Repository 1. Molte delle costruzioni contenute
nella raccolta sono descritte in un articolo di Gordon2, mentre un quadro più
generale si trova nel lavoro di MacWilliams-Mullin3
Esempio 8.3.3. Consideriamo il gruppo P GL(2, 7) strettamente 3-transitivo su
A = {1, 2, 3, 4, 5, 6, 7, 8}, si ha n = 8, k = 3, h = b(8 − 3)/2c = 2. Se consideriamo
U = {(1, 2, 3), (4, 5, 6), (2, 3, 7), (1, 7, 8)}, esso è un (8, 3, 2)-uncovering. Infatti per
ogni (a, b) con a, b ∈ A, in U esiste almeno un elemento che ha intersezione vuota
con (a, b).
1Gordon,
D.M.,La Jolla Covering Repository, htpp://www.ccrwest.org/cover.html
D., Kuperberg G., Patashnik O., New constructions for covering designs, J. Comb.
Des., 3, 1995, 269 − 284.
3
MacWilliams F., Mullin R.,Coverings and packings, Contemporary Design Theory: A
collection of survey, New York, John Wiley et Sons, 1992.
2Gordon
4. ALGORITMO DI DECODIFICA PER GRUPPI STRETTAMENTE k-TRANSITIVI
95
4. Algoritmo di decodifica per gruppi strettamente k-transitivi
Algoritmo di decodifica
Sia G un gruppo di permutazioni strettamente k-transitivo su A, |A| = n. Sia
h = b(n − k)/2c e sia U un uncovering di G.
Supponiamo di ricevere la parola w = w1 w2 . . . wn . Consideriamo S1 ∈ U e
per i ∈ S1 analizziamo le componenti wi della parola ricevuta (ricordiamo che S1
è un k-sottoinsieme di A). Innanzitutto controlliamo che, in quelle posizioni, non
ci siano simboli ripetuti. Se non ce ne sono, per la stretta k-transitività di G,
esiste un’unica permutazione di G che manda wi nel posto i, per ogni i ∈ S1 , ossia
c’è una sola parola del codice con componente wi nel posto i, per ogni i ∈ S1 .
Cerchiamo questa parola tra gli elementi di G, sia p, e calcoliamo la sua distanza
dalla parola w ricevuta. Se la distanza è d(p, w) ≤ h allora p è la parola corretta
ossia decodifichiamo w con la parola p e terminiamo la procedura di decodifica.
Se invece d(p, w) > h, consideriamo un altro elemento S2 ∈ U e ripetiamo la
procedura. Ovviamente se in qualche passo t le componenti di w individuate da
St ∈ U presentano un simbolo ripetuto, è certo che nella trasmissione si è verificato
un errore e consideriamo immediatamente un altro elemento di U.
Il seguente schema descrive l’Algoritmo di decodifica sopra riportato.
START
Scelta di una
k-upla di
Ricerca della parola p
individuata dalla k-upla
La distanza di p dalla
parola ricevuta è ≤ h
SI
STOP
Figura widht 11.5 cm per 9.0 cm
Scelta di un’altra
k-upla di
NO
4. ALGORITMO DI DECODIFICA PER GRUPPI STRETTAMENTE k-TRANSITIVI
96
Esempio 8.4.1. Sia G = P GL(2, 7) e consideriamo l’uncovering U dell’esempio
8.3.2, ricordiamo che h = 2. Supponiamo di trasmettere la parola (permutazione)
g=12345678
e che venga ricevuta la parola
w=42365678.
Consideriamo S1 = (1, 2, 3) ∈ U e troviamo l’elemento di P GL(2, 7) che manda la
terna (1, 2, 3) in (w1 , w2 , w3 ) = (4, 2, 3). E’ la parola
p = 4 2 3 6 8 7 5 1.
Poichè d(p, w) = 4, la parola p non si accetta perchè d(p, w) > h. Consideriamo
allora un altro elemento dell’uncovering, sia S2 = (4, 5, 6) ∈ U, in w le componenti
relative ai posti indicati da S2 sono (w4 , w5 , w6 ) = (6, 5, 6) perciò non può esservi
nessuna permutazione di G con quei valori essedoci una ripetizione. Consideriamo
quindi un altro elemento dell’uncovering, sia S3 = (2, 3, 7) ∈ U, in w nelle posizioni
indicate da S3 troviamo le componenti (2, 3, 7); in G la permutazione che manda
(2, 3, 7) in (2, 3, 7) è la permutazione
g = 1 2 3 4 5 6 7 8,
poichè d(g, w) = 2(≤ h) la parola g è quella corretta per decodificare w.
E’ possibile trovare degli uncoverings per tutti i gruppi strettamente k-transitivi
fatta eccezione per il gruppo simmetrico Sn perchè la sua capacità correttiva è zero.
Costruzione di un uncovering per il gruppo alterno.
Consideriamo come codice il gruppo alterno An , esso è strettamente (n − 2)transitivo e pertanto è 1-correttore poichè risulta h = b(n − k)/2c = 1. Sia
Ω = {1, 2, . . . , n}, per costruire un uncovering occorre determinare un insieme U i
cui elementi sono degli (n − 2)-sottoinsiemi di Ω con la proprietà che ogni elemento
di Ω non appartenga ad almeno uno dei sottoinsiemi elementi di U.
Sia T l’insieme i cui elementi sono coppie di elementi di Ω e definito come
segue:
• Se n è pari, consideriamo T costituito dalle 21 n coppie disgiunte di elementi
di Ω.
• Se n è dispari, consideriamo T costituito dalle 12 (n − 1) coppie disgiunte
di elementi di Ω e dalla coppia formata dal rimanente elemento di Ω e da
un qualsiasi altro elemento.
Per avere un (n, n − 2, 1)-uncovering U basta considerare gli (n − 2)-sottoinsiemi
di Ω che sono i complementari delle coppie appartenenti a T .
4. ALGORITMO DI DECODIFICA PER GRUPPI STRETTAMENTE k-TRANSITIVI
97
Esempio 8.4.2. Consideriamo il gruppo alterno A7 , il (7, 5, 1)-uncovering di
A7 costruito con il metodo precedente è il seguente
U = {(3, 4, 5, 6, 7), (1, 2, 5, 6, 7), (1, 2, 3, 4, 7), (2, 3, 4, 5, 6)}.
Supponiamo di trasmettere la permutazione
g=2314675
e che venga ricevuta la parola
w=2314475
in cui è presente un errore nella quinta posizione. Decodifichiamo utilizzando
l’uncovering U. Consideriamo S1 = (3, 4, 5, 6, 7) ∈ U e cerchiamo in A7 l’elemento
che nei posti (3, 4, 5, 6, 7) ha come componenti rispettivamente (1, 4, 4, 7, 5) (ossia
la permutazione che manda (3, 4, 5, 6, 7) rispettivamente in (1, 4, 4, 7, 5)). Poichè
le componenti che stanno nel quarto e quinto posto sono uguali, in A7 non può
esservi nessuna permutazione con quelle componenti.
Consideriamo ora S2 = (1, 2, 5, 6, 7) ∈ U e cerchiamo in A7 l’elemento che
nei posti (1, 2, 5, 6, 7) ha come componenti rispettivamente (2, 3, 4, 7, 5) (ossia la
permutazione che manda (1, 2, 5, 6, 7) rispettivamente in (2, 3, 4, 7, 5)). E’ la permutazione
p=2361475
(l’unica altra possibilità di permutazione su Ω sarebbe stata p0 = 2 3 1 6 4 7 5 che
è di classe dispari e dunque non appartenente ad A7 ).
Poichè d(p, w) = 2(> h) la parola p non è accettata.
Consideriamo ora S3 = (1, 2, 3, 4, 7) ∈ U e cerchiamo in A7 l’elemento che
nei posti (1, 2, 3, 4, 7) ha come componenti rispettivamente (2, 3, 1, 4, 5) (ossia la
permutazione che manda (1, 2, 3, 4, 7) rispettivamente in (2, 3, 1, 4, 5)). E’ la permutazione
p = 2 3 1 4 6 7 5.
Poichè d(p, w) = 1(≤ h) la parola p è accettata ossia decodifichiamo w con p che
è proprio la parola g trasmessa.
Nota 8.4.3. Il metodo di decodifica descritto con l’algoritmo presentato in
questo paragrafo, non è il metodo di decodifica noto come permutation decoding .
5. UNCOVERING DEI GRUPPI DI MATHIEU M11 E M12
98
5. Uncovering dei gruppi di Mathieu M11 e M12
I gruppi di Mathieu sono cinque gruppi finiti scoperti dal matematico francese
Emile Mathieu (1835 − 1890). Questi gruppi vengono denotati con Mn , per i
valori n = 11, 12, 22, 23, 24. In particolare, M12 è strettamente 5-transitivo e ha
grado 12; M11 è lo stabilizzatore di un elemento di M12 e pertanto è strettamente
4-transitivo e di grado 11. Esistono vari metodi per costruirli, ma, per M12 , quello
presentato per il seguente schema è sicuramente il più semplice da ricordare 4
1
2
3
4
7
5
6
8
9
10
11
12
Generatori per M12
Figura widht 4.0 cm per 7.0 cm
Il gruppo M12 è generato dalle due permutazioni ottenute nel seguente modo:
• Una permutazione è la composizione dei 2-cicli formati dai numeri che
sono alle estremità dei segmenti rappresentati con I—J ossia
(1 2)(3 4)(5 6)(7 8)(9 10)(11 12).
• L’altra permutazione è la composizione dei 3-cicli ottenuti leggendo in
senso antiorario i numeri posti attorno ai punti rappresentati con • ossia
(1 3 2)(4 7 5)(8 9 11).
M12 è strettamente 5-transitivo su n = 12 elementi, ha distanza minima d =
12 − 5 + 1 = 8 e pertanto è 3-correttore.
M11 è strettamente 4-transitivo su n = 11 elementi, ha distanza minima d =
11 − 4 + 1 = 8 e pertanto è 3-correttore.
Se i gruppi M12 e M11 sono utilizzati come codici, essendo strettamente transitivi,
per la loro decodifica si può usare il metodo degli uncoverings. Riportiamo di
seguito un (12, 5, 3)-uncovering per M12 e un (11, 4, 3)-uncovering per M11 .
4Le
origini di questo diagramma sono nella teoria di Groethendieck 00 dessin d’enfants00 . G.
Jones,1998; Characters and syrfaces: a survey. The Atlas of finite Groups: Ten Years On
(eds Curtis e Wilson), London Mathematical Society Lecture Notes Series (249). Cambridge
University Press .
6. ESTENSIONE A GRUPPI NON STRETTAMENTE k-TRANSITIVI
(12, 5, 3)-uncovering per M12
1 2 3 4
5
1 2 6 11 12
1 3 7 8
9
1 4 6 7 10
1 5 8 9 11
2 4 8 9 12
2 5 7 10 11
3 4 7 11 12
3 5 6 10 12
3 6 8 9 11
6 7 8 9 10
99
(11, 4, 3)-uncovering per M11
1 2 3 4
1 2 5 6
3 4 5 6
7 8 9 10
7 8 9 11
7 8 10 11
7 9 10 11
8 9 10 11
6. Estensione a gruppi non strettamente k-transitivi
L’algoritmo presentato nel paragrafo 8.4 vale per i gruppi strettamente ktransitivi, tuttavia è possibile darne una generalizzazione applicabile ai gruppi
non strettamente k-transitivi.
Definizione 8.6.1. Sia G un gruppo su un insieme finito A. Una base per G
è un insieme B = {x1 , . . . , xb } ⊆ A tale che G(x1 ,...,xb ) =< 1 >, ossia lo stabilizzatore di B è l’elemento identità. Una base non ridondante è una base tale che
G(x1 ,...,xi ,xi+1 ) 6= G(x1 ,...,xi ) per i = 1, . . . , b − 1.
Esempio 8.6.2. In un gruppo G strettamente k-transitivo su A, ogni k-pla di
elementi di A costituisce una base non ridondante.
Esempio 8.6.3. Sia G = GL(n, q) il gruppo generale lineare che agisce sui
vettori non nulli di Fqn . Una base dello spazio vettoriale Fqn costituisce una base
non ridondante per G.
Teorema 8.6.4. Sia G un gruppo e sia (x1 , . . . , xb ) una sua base. Considerati due elementi g, h ∈ G, se (x1 , . . . , xb )g = (x1 , . . . , xb )h allora g = h, ossia
l’azione di un elemento g ∈ G su una base (x1 , . . . , xb ) determina univocamente
quell’elemento.
6. ESTENSIONE A GRUPPI NON STRETTAMENTE k-TRANSITIVI
100
Dimostrazione. Siano g, h ∈ G e sia (x1 , . . . , xb ) una base di G. Se xgi =
−1
xhi per ogni i = 1, . . . , b, allora xgh
= xi per ogni i = 1, . . . , b, ossia gh−1 ∈
i
G(x1 ,...,xb ) =< 1 >, e pertanto gh−1 = 1 da cui segue g = h.
Il teorema ora dimostrato assicura che se un gruppo G viene utilizzato come
codice e nella trasmissione si riceve una parola contenente errori in posizioni diverse
da quelle individuate da una base, nella operazione di decodifica gli errori vengono
corretti. Ne consegue che per generalizzare l’algoritmo di decodifica presentato nel
paragrafo 8.4 per i gruppi strettamente k-transitivi, basta sostituire 00 k-pla00 con
00
base00 . La nozione di 00 uncovering00 dovrà invece essere sostituita con quella più
generale di 00 uncovering-by-bases00 .
Definizione 8.6.5. Sia G un gruppo su A, |A| = n, con capacità correttiva h.
Si dice che U è un uncovering-by-bases per G se U è un insieme di basi per G
tali che ogni h-sottoinsieme di A è disgiunto da almeno una base.
Chiaramente, nel caso in cui G sia un gruppo strettamente k-transitivo, un
uncovering-by-bases è un (n, k, h)-uncovering.
L’algoritmo che utilizza gli uncovering-by-bases si differenzia da quello che
utilizza gli uncovering per due aspetti
• ammette la possibilità che le basi dell’uncovering abbiano dimensioni
diverse;
• l’esistenza di un elemento del gruppo che, nelle posizioni individuate da
una data base, concordi con la parola ricevuta non assicura la correttezza
e pertanto l’algoritmo include un controllo di non esistenza.
Algoritmo di decodifica
Sia G un gruppo di permutazioni su A, |A| = n. Sia U un uncovering-by-bases di
G.
Supponiamo di ricevere la parola w = w1 w2 . . . wn . Consideriamo una base
B1 ∈ U e per i ∈ B1 analizziamo le componenti wi della parola ricevuta . Innanzitutto controlliamo che, in quelle posizioni, non ci siano simboli ripetuti. Supposto
che queste componenti siano tutte distinte, verifichiamo se in G esiste un elemento
che manda wi nel posto i, per ogni i ∈ B1 , ossia se c’è una parola del codice con
componente wi nel posto i, per ogni i ∈ B1 . Se questa parola esiste, sia p. Calcoliamo la sua distanza dalla parola w ricevuta. Se la distanza è d(p, w) ≤ h allora
possiamo concludere che la parola trasmessa è p ossia decodifichiamo w con la parola p e terminiamo la procedura di decodifica. Se invece d(p, w) > h, consideriamo
un’altra base B2 ∈ U e ripetiamo la procedura. Ovviamente se in qualche passo t
7. SIMBOLI RIPETUTI
101
le componenti di w individuate da St ∈ U presentano un simbolo ripetuto, è certo che nella trasmissione si è verificato un errore e consideriamo immediatamente
un’altra base.
Non è detto che per un qualunque gruppo G esista sempre un uncovering-bybases, ma, come assicura il prossimo teorema, ciò è vero per ogni gruppo finito.
Teorema 8.6.6. Per ogni gruppo finito G su un insieme A, |A| = n, esiste
sempre un uncovering-by-bases.
Dimostrazione. Sia d la distanza minima di G, h = b(d−1)/2c. Supponiamo
per assurdo che esista un h-sottoinsieme R ⊆ A che intersechi ogni base di G. Allora
lo stabilizzatore puntuale di R̄ = A\R non è banale perchè R̄ non contiene una
base. Esiste pertanto g ∈ G, g diverso dall’ identità, che fissa R̄ punto per punto
e perciò |F ix(g)| ≥ |R̄| = n − r. Ma il massimo numero di punti fissati da un
elemento che non sia l’identità è n − d < n − r e pertanto si ha un assurdo.
Si noti che il teorema ora dimostrato assicura solo l’esistenza di un uncoveringby-bases ma non fornisce nessuna indicazione costruttiva.
7. Simboli ripetuti
Supponiamo di usare un gruppo come codice e di trasmettere pertanto come
parola una permutazione. Se la parola ricevuta contiene errori, allora potrebbe non
essere più una permutazione, ossia potrebbe contenere uno o più simboli ripetuti.
Esaminiamo come i simboli ripetuti possono aiutare nella decodifica, in particolare
possono essere di aiuto nel ridurre il numero di passi da eseguire. Per illustrare
questo, utilizziamo il caso del gruppo di Mathieu M12 . La dimensione di questo
codice è tale che le possibilità in cui possono presentarsi gli errori sono in numero
sufficientemente piccolo da poterle esaminare una ad una. Per codici più grandi,
si può comunque applicare quanto illustreremo per M12 , basta isolare nelle parole
alcune cifre dove sappiamo esserci un errore e applicare un algoritmo simile alle
rimanenti cifre per individuare errori e in un numero minore di passi.
Consideriamo il gruppo M12 , ricordiamo che M12 è 3-correttore. Per la decodifica, se una parola ricevuta è una permutazione allora applichiamo l’Algoritmo
presentato nel paragrafo 8.4. Se si riceve una parola che non è una permutazione,
si può migliorare l’algoritmo andando a considerare i posti dove figurano simboli
ripetuti. Ad esempio, se i tre errori sono tre repliche dello stesso simbolo (il simbolo si presenta quindi quattro volte), allora sappiamo che i rimanenti otto simboli
sono corretti e perciò (essendo il gruppo strettamente 5-transitivo) possiamo immediatamente trovare l’unica parola del codice individuata da una qualunque 5-pla
7. SIMBOLI RIPETUTI
102
presa fra gli otto simboli corretti. In un solo passo si è così giunti a decodificare
correttamente la parola ricevuta.
Analizziamo nel dettaglio il caso del gruppo M12 quando la parola ricevuta non
è una permutazione. Supponiamo venga trasmessa la parola identità
1 2 3 4 5 6 7 8 9 10 11 12
1◦ caso: la parola ricevuta contiene tre errori.
• Un simbolo ripetuto, due simboli spostati:
esempio: 1 1 4 3 5 6 7 8 9 10 11 12
Occorre un (10, 5, 2)-uncovering perchè sappiamo che almeno uno dei due
1 è un errore.
• Due diversi simboli ripetuti, un simbolo spostato:
esempio: 1 1 3 3 2 6 7 8 9 10 11 12
Occorre un (8, 5, 1)-uncovering.
• Tre diversi simboli ripetuti:
esempio: 1 1 3 3 5 5 7 8 9 10 11 12
Sappiamo che ci sono tre errori nelle prime sei posizioni, possiamo quindi
considerare cinque qualsiasi delle ultime sei posizioni per individuare la
parola del codice trasmessa.
• Un simbolo ripetuto tre volte:
esempio: 1 1 1 1 5 6 7 8 9 10 11 12
Possiamo considerare cinque qualsiasi delle ultime otto posizioni per individuare la parola del codice trasmessa.
• Un simbolo ripetuto due volte, un altro simbolo ripetuto:
esempio: 1 1 1 4 4 6 7 8 9 10 11 12
Possiamo considerare cinque qualsiasi delle ultime sette posizioni per
individuare la parola del codice trasmessa.
• Un simbolo ripetuto due volte, un simbolo spostato:
esempio: 1 1 1 2 5 6 7 8 9 10 11 12
Occorre un (9, 5, 1)-uncovering.
• Un simbolo ripetuto due volte, entrambi in posizioni non corrette, un
simbolo spostato:
esempio: 3 3 1 4 5 6 7 8 9 10 11 12
Occorre un (10, 5, 2)-uncovering.
2◦ caso: la parola ricevuta contiene due errori.
• Due simboli ripetuti:
esempio: 1 1 3 3 5 6 7 8 9 10 11 12
Occorre un (8, 5, 1)-uncovering perchè sappiamo che almeno uno dei due
1 è un errore.
• Un simbolo ripetuto due volte:
esempio: 1 1 1 4 5 6 7 8 9 10 11 12
8. OTTIMIZZAZIONE
103
Occorre un (9, 5, 1)-uncovering.
3◦ caso: la parola ricevuta contiene un errore.
• Un simbolo ripetuto:
esempio: 1 1 3 4 5 6 7 8 9 10 11 12
Occorre un (10, 5, 1)-uncovering.
Riportiamo gli uncovering che, dall’analisi fatta, occorrono per la decodifica.
(12, 5, 3)-uncovering per M12
1 2 3 4
5
1 2 6 11 12
1 3 7 8
9
1 4 6 7 10
1 5 8 9 11
2 4 8 9 12
2 5 7 10 11
3 4 7 11 12
3 5 6 10 12
3 6 8 9 11
6 7 8 9 10
(10, 5, 2)-uncovering per M12
1 2 3 4 5
1 2 7 8 10
1 5 6 7 9
2 3 6 8 9
3 4 7 9 10
4 5 6 8 10
(9, 5, 1)-uncovering per M12
1 2 3 4 5
1 6 7 8 9
5 6 7 8 9
(8, 5, 1)-uncovering per M12
1 2 3 4 5
1 2 6 7 8
4 5 6 7 8
8. Ottimizzazione
Fino ad ora, quando si è considerato un uncovering-by-bases non si è tenuto
conto in quale ordine prendere le basi. Tuttavia, applicando l’algoritmo di decodifica, l’ordine con cui si considerano le basi è importante perchè influisce sui tempi
di prestazione. Sebbene gli uncovering siano sempre stati presentati in ordine lessicografico, non c’è ragione per cui questo ordinamento debba essere usato nella
pratica. Vediamo come ordinare un uncovering-by-bases in modo ottimale.
Sia G un gruppo di grado n e h-correttore. Sia U, |U| = u, un uncovering-bybases così ordinato: (B1 , B2 , . . . , Bu ). Per un dato insieme E, |E| ≤ h, di posizioni
d’errore, indichiamo con i il numero delle prove che si devono effettuare per trovare
8. OTTIMIZZAZIONE
104
la prima base disgiunta da E (quindi i è il numero di volte in cui deve essere eseguito
l’algoritmo). Possiamo allora calcolare il numero medio di prove, che dipenderà
dall’ordine con cui si prendono le basi.
Per contare il numero medio delle prove necessarie per j ≤ h errori, definiamo
la successione sj = (s1j , s2j , . . . , suj ), dove sij è il numero di sottoinsiemi di ordine
j di {1, 2, . . . , n} disgiunti da Bi ma non da B1 , . . . , Bi−1 . Pertanto il numero medio
di prove è
Pu
is
ij .
aj = i=1
n
j
Esempio 8.8.1. Si consideri il gruppo di Mathieu M12 , esso ha grado 12 e capacità correttiva 3. Consideriamo il (12, 5, 3)-uncovering del paragrafo precedente
in ordine lessicografico. Supponiamo che si verifichino tre errori e di ricevere la
sequenza
35, 31, 30, 23, 17, 21, 20, 15, 17, 8, 3
Utilizzando la formula precedente troviamo che il numero medio di prove è a3 =
1016
.
220
Un modo per ottimizzare l’ordine con cui considerare gli elementi di un uncovering, è quello di minimizzare il numero ah . In generale non è un problema di
facile risoluzione, tuttavia, esiste un metodo relativamente semplice per migliorare
l’efficienza di un dato ordinamento.
Algoritmo di decodifica 00 ottimizzato00
Consideriamo l’uncovering nell’ordine (B1 , B2 , . . . , Bu ) che determina la successione s = (s1 , s2 , . . . , su ). Assumiamo j = h e supponiamo s1 ≥ s2 ≥ . . . ≥ sl e
che sia
sl < sl+1
ovvero che sia il primo punto in cui la successione si incrementa. Otteniamo un
nuovo ordinamento (B10 , B20 , . . . , Bu0 ) scambiando Bl e Bl+1 e lasciando inalterati
tutti gli altri elementi. In questo modo abbiamo
0
= B1 , . . . , Bl−1
= Bl−1
B10
0
0
Bl
= Bl+1 , Bl+1
= Bl .
0
Bl+2
= Bl+2 , . . . , Bu0 = Bu
Questo nuovo ordinamento genera la successione s = (s01 , . . . , s0u . Osserviamo
che:
• s01 = s1 , . . . , s0l−1 e s0l+2 = sl+2 , . . . , s0u = su ;
• s0l ≥ sl+1 e s0l+1 ≤ sl ;
• s0l + s0l+1 = sl + sl+1 .
8. OTTIMIZZAZIONE
105
Questo nuovo ordine è effettivamente un miglioramento, come assicura il seguente teorema.
Teorema 8.8.2. Con riferimento alle notazioni sopra riportate, si ha
u
u
X
X
0
isi <
isi .
i=1
i=1
Dimostrazione. Poichè s01 = s1 , . . . , s0l−1 e s0l+2 = sl+2 , . . . , s0u = su , è sufficiente mostrare che
ls0l + (l + 1)s0l+1 < lsl + (l + 1)sl+1 .
Dalle disuguaglianze sl < sl+1 , s0l ≥ sl+1 e s0l+1 ≤ sl , si ha sl < sl+1 ≤ s0l , pertanto
s0l = sl + d per qualche d > 0. Ricordando che s0l + s0l+1 = sl + sl+1 , otteniamo
s0l − sl = sl+1 − s0l+1 = d.
Pertanto si ha che l(s0l − sl = l(sl+1 − s0l+1 ) < (l + 1)(sl+1 − s0l+1 ), da cui otteniamo
ls0l + (l + 1)s0l+1 < lsl + (l + 1)sl+1 .
Rimane dunque provato che l’algoritmo di decodifica 00 ottimizzato00 precedentemente riportato, riduce effettivamente il numero medio di prove. Possiamo
pertanto iterarlo per ottenere una successione decrescente.
Esempio 8.8.3. Consideriamo l’uncovering dell’esempio 8.8.1. Il quinto termine della successione ottenuta è più piccolo del sesto e perciò cambiamo l’ordine
nell’uncovering scambiando la quinta base con la sesta, otteniamo
(12, 5, 3)-uncovering per M12
1 2 3 4 5
1 2 6 11 12
1 3 7 8 9
1 4 6 7 10
2 4 8 9 12
1 5 8 9 11
2 5 7 10 11
3 4 7 11 12
3 5 6 10 12
3 6 8 9 11
6 7 8 9 10
Questo nuovo ordine genera la seguente successione:
35, 31, 30, 23, 23, 15, 20, 15, 17, 8, 3.
8. OTTIMIZZAZIONE
106
Iteriamo poi l’algoritmo di decodifica 00 ottimizzato00 finchè non otteniamo il seguente ordine:
(12, 5, 3)-uncovering per M12
1 2 3 4 5
1 2 6 11 12
1 3 7 8 9
1 4 6 7 10
2 4 8 9 12
2 5 7 10 11
3 5 6 10 12
3 4 7 11 12
1 5 8 9 11
3 6 8 9 11
6 7 8 9 10
che genera la seguente successione decrescente:
35, 31, 30, 23, 23, 23, 20, 13, 11, 8, 3.
Con questo ordine il numero medio di prove (per tre errori) è ora
988
.
220
Si noti che il teorema 8.8.2 non assicura l’esistenza di ordinamento migliore,
ma assicura che il miglior ordinamento possibile eve generare una successione decrescente. Un’esaustiva ricerca fatta utilizzando GAP, ha rivelato che per M12 il
959
valore minimo per il numero medio di prove è 220
e che 288 degli 11! possibili
ordinamenti generano quel valore.
CAPITOLO 9
Elementi di Crittografia
Da sempre, soprattutto in tempi di guerra, si è sentita la necessità di trovare
stratagemmi per inviare messaggi in modo da non farli scoprire all’avversario. Un
modo può essere quello di nascondere il messaggio: questa tecnica prende il nome
di stenografia. Un altro modo per spedire un messaggio senza che il nemico lo
possa capire, si ottiene nascondendo non il messaggio ma il suo significato: in
questo caso si parla di crittografia.
1. Introduzione
Compito primario della crittografia è quello di fornire strumenti che permettano
la trasmissione di informazioni in modo che solo persone autorizzate siano in grado
di capirle.
Il problema di sviluppare metodi efficienti per comunicare in modo segreto e sicuro è diventato estremamente attuale con lo sviluppo dei sistemi di comunicazione
(in particolare di quelli elettronici e informatici).
GLOSSARIO di CRITTOGRAFIA
Testo in chiaro, messaggio in chiaro: Messaggio originale che si vuole
mandare in modo segreto, oppure stringa di simboli che rappresenta il messaggio
o il testo che si vuole cifrare.
Testo cifrato, messaggio cifrato: Versione alterata, nascosta del testo in
chiaro.
Crittare, cifrare, crittografare: Passare dal testo in chiaro al testo cifrato.
Decifrare : Passare dal testo cifrato al testo in chiaro.
Cifratura : Metodo usato per modificare il testo in chiaro nel testo cifrato.
107
1. INTRODUZIONE
108
Decifratura : Passaggio dal testo cifrato al testo in chiaro, si tratta del
processo inverso della cifratura.
Chiave : Determina una ben precisa trasformazione di cifratura, ma anche la
regola inversa di decifratura, fra tutte quelle possibili che si possono usare: nel
primo caso si parla di chiave per cifrare, nel secondo di chiave per decifrare.
Crittologia : Scienza della cifratura dei messaggi.
Crittoanalisi : Scienza dell’interpretazione di messaggi cifrati.
Compito del crittologo è di inventare sistemi (detti crittosistemi) per trasformare un messaggio in chiaro in un messaggio cifrato. Compito del crittoanalista
è di contrastare questa operazione trovando dei modi per interpretare i messaggi
cifrati riportandoli in chiaro senza autorizzazione.
Messaggi Unitari : Generalmente i messaggi, sia quelli in chiaro sia quelli
cifrati, vengono spezzati in messaggi unitari che possono essere costituiti da una
singola lettera o da blocchi di lettere. Il vantaggio di dividere un messaggio in
blocchi di lunghezza prefissata è quello di evitare la possibilità di riconoscere facilmente inizio e fine di parole, rendendo così più difficile la crittoanalisi basata sulle
frequenze.
Crittografia simmetrica : Sin dall’antichità, i metodi classici per cifrare
sono costruiti in modo che mittente e destinatario abbiano una chiave comune con
la quale il mittente cifra e il destinatario decifra; un algoritmo di questo tipo si
dice simmetrico.
Crittografia asimmetrica o a Chiave Pubblica : Dai tempi dei tempi
occorre arrivare al 1975 per avere una grande svolta nella crittografia, ciò avviene
con l’introduzione di algoritmi in cui solo il destinatario ha bisogno di una chiave
segreta; questo tipo di algoritmo è detto asimmetrico o a chiave pubblica. I sistemi
asimmetrici furono proposti da W.Diffie e M. Hellman dell’Università di Stanford
in un lavoro pubblicato nel 1976 dal titolo New directions in Cryptography.
In un cifrario a chiave pubblica, per calcolare in un tempo ragionevolmente
breve la decifratura di un messaggio, è necessario essere in possesso di altre informazioni oltre a quelle rese pubbliche, ossia, per decifrare senza avere opportune
informazioni aggiuntive occorre un tempo di calcolo incredibilmente lungo. Anche
i sistemi asimmetrici sono comunque attaccabili e nella prospettiva di computer
con capacità di calcolo molto più avanzate rispetto a quelle attuali, la crittografia
si sta orientando verso nuove metodologie che trovano riferimento nella crittografia
quantistica.
2. CRITTOSISTEMI A CHIAVE PUBBLICA
109
Crittografia Quantistica : La crittografia quantistica rappresenta, dopo
quella a chiave pubblica, una seconda vera rivoluzione perchè, ad oggi, risulta
inattaccabile. La crittografia quantistica sfrutta delle peculiarità della meccanica quantistica nella fase dello scambio delle chiavi per evitare che queste possano
essere intercettate da un attaccante senza che i due interlocutori se ne accorgano.
Il principio che sta alla base della crittografia quantistica è il principio di indeterminazione di Heisenberg. Questo principio afferma che non è possibile conoscere,
simultaneamente e con precisione assoluta, alcune particolari coppie di caratteristiche di un oggetto quantistico, come ad esempio la posizione e la velocità di un
elettrone. Se si cerca di misurare esattamente la posizione, si perde la possibilità
di verificare la velocità dell’elettrone. Se invece si misura con precisione assoluta
la velocità, si perdono inevitabilmente informazioni sul luogo in cui l’elettrone si
trova.
Secondo la meccanica quantistica, per quante tecniche nuove e più precise si
possano sviluppare per eseguire queste misure, il limite rimane e non è concettualmente eliminabile.
Realizzando una chiave quantistica (cioè realizzata con elementi come i fotoni
che rispondono alle leggi della meccanica quantistica) chi volesse, non autorizzato, cercare di decriptare il messaggio, modificherebbe inevitabilmente la chiave,
oltretutto in maniera puramente casuale quindi incontrollabile e verrebbe quindi
certamente scoperto. Nell’ambito della crittografia quantistica, un algoritmo che
permette lo scambio di una chiave tra due utenti e garantisce che questa non possa
essere intercettata da terzi senza che i due interlocutori se ne accorgano, è chiamato BB84, dal nome dei suoi ideatori: Bennet e Brassard che lo realizzarono nel
1984.
2. Crittosistemi a chiave pubblica
I sistemi di crittografia a chiave pubblica, come già detto, sono stati ideati da
Diffie e Hellman nel 1975. Essi utilizzano una chiave pubblica che permette la cifratura ma non la decifratura di un messaggio. Ogni utente pubblica la propria chiave
di cifratura per permettere a chiunque voglia comunicare con lui segretamente di
poterlo fare.
Per descrivere i cifrari a chiave pubblica, supponiamo che ogni partecipante P
al sistema di cifratura abbia una coppia di chiavi:
• una chiave pubblica C = CP per cifrare;
• una chiave privata (segreta) D = DP per decifrare;
3. VANTAGGI, SVANTAGGI, APPLICAZIONI DEI CRITTOSISTEMI A CHIAVE PUBBLICA
110
con la proprietà che non è possibile calcolare DP conoscendo CP . Tutte le chiavi
pubbliche sono utilizzabili pubblicamente, esse possono essere raccolte in un archivio pubblico al pari di un elenco telefonico. Al contrario le chiavi private sono
note solo ai loro proprietari.
Per comodità denotiamo con C(m) il testo cifrato ottenuto dal messaggio m
usando la chiave C.
Supponiamo che ogni partecipante ad un sistema di cifratura asimmetrica abbia
sia la chiave pubblica sia quella privata:
(1) Se P1 vuole mandare il messaggio m a P2 , allora P1
• trova la chiave pubblica CP2 di P2 ,
• cifra il messaggio m usando CP2 ,
• manda CP2 (m) a P2 .
(2) P2 è in grado di decifrare il testo cifrato CP2 (m) poichè P2 (e solo P2 )
conosce la chiave DP2 :
DP2 (CP2 (m)) = m.
(3) Nessun altro partecipante può decifrare CP2 (m), perchè nessuno può dedurre DP2 nè da CP2 nè da CP2 (m).
3. Vantaggi, svantaggi, applicazioni dei crittosistemi a chiave pubblica
Vantaggi
I vantaggi offerti dai sistemi di cifratura a chiave pubblica sono molteplici.
• Non è necessario nessun scambio di chiavi tra i partecipanti. Si può mandare un messaggio segreto senza nessun bisogno di scegliere prima, insieme
al destinatario, una chiave segreta.
• Occorre un numero di chiavi relativamente piccolo. Usando sistemi simmetrici, ogni coppia di partecipanti deve avere una chiave segreta personale,
quindi se ci sono n partecipanti occorrono n(n−1)
chiavi diverse. Invece,
2
usando un algoritmo asimmetrico, ogni partecipante ha bisogno di sole
due chiavi e solo una di queste deve essere tenuta segreta, quindi con n
partecipanti il numero delle chiavi è solo 2n.
• Nuovi utenti possono entrare nel sistema senza alcun problema per i vecchi. Invece con un sistema simmetrico, se entra un nuovo utente, tutti i
vecchi partecipanti devono scambiare una chiave segreta con lui. In un
sistema asimmetrico, i vecchi utenti non devono scambiare alcun dato con
il neoutente.
4. IL SISTEMA RSA
111
Svantaggi
• Nessun algoritmo asimmetrico è inattaccabile e allo stesso tempo veloce.
• Un algoritmo a chiave pubblica richiede la custodia di chiavi e pertanto
ci deve essere la garanzia che le chiavi pubbliche siano autentiche.
Applicazioni
Le applicazioni dei sistemi a chiave pubblica sono molteplici, ad esempio:
• l’autentica elettronica della firma;
• l’accesso ad archivi segreti o a sistemi di sicurezza;
• l’accesso a servizi come carte di credito, programmi televisivi a pagamento, ecc. .
4. Il sistema RSA
RSA è un sistema di crittografia a chiave pubblica ideato da Diffie e Hellman
ma chiamato sistema RSA dai nomi di coloro che, nel 1977, per primi lo hanno
realizzato : R. Rivest, A.Shamir, L.Adleman.
Negli anni, sono stati realizzati altri algoritmi asimmetrici ma l’algoritmo RSA
è certamente il più conosciuto e quello studiato in modo più approfondito.
RICHIAMI di MATEMATICA
• Indicatore di Eulero φ(n). Dato un numero naturale n, con φ(n) (indicatore di Eulero) si indica il numero dei numeri naturali minori di n e primi
con n. Esempio: φ(1) = 1 (per convenzione), φ(2) = 1, φ(3) = 2, φ(4) =
2, φ(6) = 2, φ(10) = 4, φ(15) = 8.
• Se p è un numero primo, allora : φ(p) = p − 1.
• Se p e q sono due numeri primi distinti, allora : φ(pq) = (p − 1)(q − 1).
• Teorema di Eulero : Se m ed n sono due numeri naturali primi fra loro
allora mφ(n) ≡ 1 mod n.
• Teorema : Se a e b sono due interi primi tra loro, allora esiste un intero
c tale che b · c ≡ 1 mod a.
Teorema 9.4.1. Sia n prodotto di numeri primi distinti: n = p1 p2 · · · pr . Se
a, b ∈ N∗ sono tali che pi − 1 divide ab − 1 per ogni i = 1, 2, . . . , r, allora
mab ≡ m mod n
per ogni intero m (anche se m non è primo con n).
4. IL SISTEMA RSA
112
Dimostrazione. Sia n = p1 p2 · · · pr con pi numero primo per ogni i = 1, 2, . . . , r
e pi 6= pj per i 6= j. Iniziamo con il dimostrare che per ogni m ∈ N∗ risulta
mab ≡ m mod p1 .
Distinguiamo due casi.
1◦ caso - Gli interi m e p1 non sono primi fra loro. Allora m è multiplo di p1
perchè p1 è un numero primo; ovviamente anche mab è multiplo di p1 e pertanto
si ha
m ≡ 0 mod p1 , mab ≡ 0 mod p1
da cui segue
mab ≡ m mod p1 .
2◦ caso - Gli interi m e p1 sono primi fra loro. Allora:
(1) dall’ipotesi si ha che ab−1 è divisibile per (p1 −1), ossia ab ≡ 1 mod (p1 −1)
ab = 1 + k(p1 − 1).
(2) Da (1) si ha mab = m·mk(p1 −1) = m·(mp1 −1 )k . Poichè (p1 −1) = φ(p1 ), dal
Teorema di Eulero precedentemente richiamato si ha mφ(p1 ) ≡ 1 mod p1 ,
ossia mp1 −1 ≡ 1 mod p1 . Ne segue che mab ≡ m · 1k mod p1 ossia
mab ≡ m mod p1 .
Rimane così provato che
mab ≡ m mod p1
per ogni m ∈ N∗ .
Quanto dimostrato per il numero primo p1 , vale per ogni numero primo
pi tale che ab − 1 è divisibile per pi − 1 e pertanto, poichè n = p1 p2 · · · pr è
prodotto di numeri primi distinti soddisfacenti la proprietà richiesta, per
ogni i = 1, 2, . . . , r si ha che pi divide l’intero mab − m e, per i 6= j, anche
il prodotto pi pj divide mab − m. Ne segue che per n = p1 p2 · · · pr si ha
mab ≡ m mod n
per ogni m ∈ N∗ .
GENERAZIONE delle CHIAVI
Poichè ogni partecipante al sistema RSA deve essere fornito di due chiavi, prima
di descrivere l’algoritmo vediamo come si generano le chiavi pubbliche e le chiavi
private.
E’ consigliabile affidare ad un centro addetto questa operazione. Per ogni
partecipante il centro sceglie due numeri primi distinti p e q ognuno dei quali sia
di almeno 100 cifre e li moltiplica ottenendo n = pq.
4. IL SISTEMA RSA
113
Successivamente calcola φ(n) = φ(pq) = (p − 1)(q − 1) e infine il centro sceglie
un numero naturale e primo con φ(n), ossia M CD(e, p − 1) = M CD(e, q − 1) = 1,
e calcola d tale che
e · d mod φ(n) = 1.
Ora il partecipante al sistema riceve le sue due chiavi:
- Chiave pubblica: la coppia di numeri (n, e).
- Chiave privata: il numero d.
Osservazioni
• Nessun partecipante ha bisogno di conoscere i numeri p, q, φ(n). Anche
per questo è consigliabile non lasciare al singolo il compito di scegliere
la sua chiave ma lasciare il compito ad un centro addetto che poi cancellerà immediatamente i dati usati per il calcolo delle chiavi, ciò eviterà
che qualcuno possa impadronirsi di p, q, φ(n) e quindi calcolare la chiave
segreta.
• Il numero e può essere scelto in modo opportuno affinchè sia facile calcolare me mod n. Ad esempio:
– E’ stato proposto di scegliere sempre come numero e il quarto numero
4
di Fermat F4 = 22 +1 = 65537 perchè la sua rappresentazione binaria
è semplicemente 10000000000000001 e quindi è relativamente facile
calcolare me . Ovviamente l’altro numero della chiave pubblica, ossia
il numero n, è diverso per ogni partecipante al sistema e questo è
sufficiente per garantire che le chiavi segrete siano tutte diverse.
– Un altro modo è quello di prendere un numero primo che non divida
φ(n).
– Un terzo modo di procedere è quello di scegliere a caso un numero e,
calcolare M CD(e, φ(n)) usando l’algoritmo di Euclide, e poi dividere
e per questo M CD. A questo punto si calcola il numero d (chiave
segreta) corrispondente ad e usando l’algoritmo di Euclide. Ovviamente calcolare φ(n) non è un problema perchè p e q sono primi fra
loro.
• Con la chiave pubblica si può trovare la chiave segreta solo se si riesce a
fattorizzare n nei suoi fattori primi p e q, ma ad oggi non si conoscono
algoritmi per fattorizzare numeri grandi in tempi ragionevoli. Si tenga
conto che RSA utilizza numeri primi che hanno da 100 a 200 cifre e quindi, anche con gli algoritmi più evoluti, risulta davvero difficile riuscire a
fattorizzare n in tempi ragionevoli.
4. IL SISTEMA RSA
114
ALGORITMO RSA
L’algoritmo RSA è una diretta applicazione del Teorema di Eulero precedentemente richiamato.
Supponiamo che A voglia inviare un messaggio a B. Anzitutto A deve conoscere
la chiave pubblica di B che supponiamo sia la coppia (n, e).
• Il messaggio deve essere codificato in una sequenza di uno o più interi
positivi mi tali che per ogni i sia mi < n e M CD(mi , n) = 1.
In realtà la richiesta che sia M CD(mi , n) = 1 è una condizione che semplifica la
procedura, ma non è necessaria, come dimostra il Teorema 9.4.1 . La richiesta non
fa perdere in generalità.
Per codificare in modo che i messaggi mi soddisfino alle richieste soprascritte,
esistono vari modi; nella maggior parte dei computers si usa il sistema ASCII (vedi
esempio 2.5.4). Senza soffermarci sulla procedura di codifica, supponiamo che il
messaggio sia stato codificato nell’intero positivo m con m < n e M CD(m, n) = 1.
CIFRATURA
Nota la chiave pubblica (n, e) del destinatario B, al testo in chiaro m si applica
la formula
me mod n = t
in questo modo A ottiene il testo cifrato t da trasmettere a B.
DECIFRATURA
Il signor B riceve t e decifra applicando la sua chiave privata con la formula
td mod n = m.
Questo metodo per cifrare e decifrare funziona perchè applica il Teorema di
Eulero e il Teorema 9.4.1. Infatti da t ≡ me mod n segue td ≡ med mod n.
Da ed ≡ 1 mod φ(n) si ha ed = 1 + kφ(n) e pertanto med = m1+kφ(n) da cui
td ≡ m1+kφ(n) mod n. Poichè M CD(m, n) = 1 e m < n, per il Teorema di Eulero
si ha m1+kφ(n) ≡ m mod n e quindi
td ≡ m mod n.
Poichè m < n non c’è ambiguità nella determinazione del numero congruo a
t mod n perchè fra 0 e n − 1 ce ne è uno solo.
d
Esempio 9.4.2. Supponiamo che Carla voglia inviare un messaggio a Ugo con
il metodo RSA.
4. IL SISTEMA RSA
115
(1) Generiamo le chiavi di Ugo. Scegliamo due numeri primi molto grandi p e
q. Come già detto, solitamente questi vengono scelti dal centro di calcolo
e poi cancellati. Nel nostro esempio, per ragioni di calcolo, scegliamo
numeri piccoli: sia p = 17 e q = 11.
(2) Calcoliamo n = pq = 17 · 11 = 187 e scegliamo un numero naturale e tale
che sia primo con φ(n) = (p − 1)(q − 1) = 160, sia e = 7.
(3) Calcoliamo d tale che e · d mod φ(n) = 1, ossia tale che 7 · d mod 160 = 1,
pertanto d = 23.
Ugo ha come chiave pubblica la coppia (n, e) = (187, 7) e come chiave
privata d = 23.
(4) Per cifrare il messaggio da inviare, Carla deve prima trasformare il messaggio in un numero m. Supponiamo che Carla utilizzi il sistema ASCII
e, per semplicità, supponiamo che il messaggio sia costituito dalla sola
lettera V . Questa lettera nel codice ASCII è rappresentata dal numero 86
ossia m = 86 (e risulta 86 < 187).
(5) Carla per cifrare il messaggio m = 86, prende la chiave pubblica di Ugo che
è (n, e) = (187, 7) e calcola t = 867 mod 187. Per eseguire questo calcolo
conviene usare le proprietà del calcolo modulare esponenziale. Poichè
7 = 1 + 2 + 22 = 1 + 2 + 4, si ha
867 mod 187 = (861 mod 187) · (862 mod 187) · (864 mod 187)
e poichè 862 = 7396 ≡ 103 mod 187 e 864 = 54700816 ≡ 137 mod 187,
si ha
867 = 86 · 103 · 137 = 1213546 ≡ 103 mod 187.
Il messaggio che Carla invia e Ugo riceve è t = 103.
(6) Una eventuale spia, vedendo il messaggio t = 103 non riesce a capire cosa
è stato inviato (nel codice ASCII t = 103 corrisponde alla virgola). Ugo,
invece, avendo la chiave privata, riesce a decifrarlo.
(7) Per decifrare il messaggio e ottenere m, Ugo deve solo calcolare la congruenza
td mod n
ossia
10323 mod 187.
Poichè 23 = 1 + 2 + 22 + 24 = 1 + 2 + 4 + 16, si deve calcolare
{(1031 mod187) · (1032 mod187) · (1034 mod187) · (10316 mod187)} mod 187
e poichè
1032 mod 187 = 137, 1034 mod 187 = 69, 10316 mod 187 = 103
si ha
{(103 · 137 · 69 · 103} mod 187, 100286877 mod 187 = 86
e dunque Ugo decifra che il messaggio inviatogli da Carla è m = 86 che
nel codice ASCII è la lettera V.
4. IL SISTEMA RSA
116
Esempio 9.4.3. Carla e Francesco utilizzano il sistema RSA per scambiarsi un
messaggio. Francesco ha ricevuto da Carla questo messaggio: qual è il corso che
ti è piaciuto di più ?
Francesco vuole rispondere con il seguente messaggio
algebra
Per inviare la risposta a Carla, Francesco dovrà procedere come segue.
(1) Trasforma ogni lettera del messaggio in un intero in base all’equivalenza
numerica a due cifre di cui alla tabella sotto riportata (la corrispondenza
lettera-numero assegna ad ogni lettera un numero di due cifre ).
Tabella - Equivalenza lettere-numeri a due cifre o binaria
a → 00 = 00000 j → 09 = 01001 s → 18 = 10010
b → 01 = 00001 k → 10 = 01010 t → 19 = 10011
c → 02 = 00010
l → 11 = 01011 u → 20 = 10100
d → 03 = 00011 m → 12 = 01100 v → 21 = 10101
e → 04 = 00100 n → 13 = 01101 w → 22 = 10110
f → 05 = 00101 o → 14 = 01110 x → 23 = 10111
g → 06 = 00110 p → 15 = 01111 y → 24 = 11000
h → 07 = 00111 q → 16 = 10000 z → 25 = 11001
i → 08 = 01000 r → 17 = 10001
La sequenza di numeri corrispondenti al messaggio algebra è
00 11 06 04 01 17 00
(2) Guarda l’elenco delle chiavi pubbliche e trova
Chiave pubblica di Carla (nC , eC ) = (1003, 3).
(3) Ora Francesco suddivide il messaggio da inviare in messaggi unitari mi in
modo che l’intero associato ad ogni messaggio unitario sia minore di nC =
1003 e relativamente primo con 1003. Osserva che dividendo il messaggio
algebra in blocchi di due lettere (ossia digrafi) nel modo seguente
al ge br ax,
i numeri corrispondenti ai singoli messaggi unitari sono
0011
0604
0117
0023,
ossia, rispettivamente, i numeri m1 = 11, m2 = 604, m3 = 117, m4 = 23
che sono tutti minori di 1003 e relativamente primi con 1003. Per trovare
il MCD tra questi numeri e 1003, Francesco utilizzerà l’algoritmo euclideo
delle divisioni successive perchè non conosce la fattorizzazione di nC in
fattori primi. Si noti che Francesco ha dovuto aggiungere al messaggio
unitario finale la lettera x, in modo da farlo diventare un digrafo. Se
avesse pensato di dividere il messaggio in blocchi di tre lettere anzichè di
4. IL SISTEMA RSA
117
due, ci sarebbero dei messaggi unitari mi cui corrispondono degli interi
maggiori di nC :
alg → m1 = 606 < 1003,
ebr → m2 = 40117 > 1003,
axx → m3 = 2323 > 1003,
e pertanto non varrebbe M CD(mi , nC ) = 1 che è una condizione che
semplifica la procedura.
Dunque si considera la suddivisione del messaggio algebra in blocchi di
due lettere e pertanto i messaggi unitari in chiaro saranno rappresentati
dai seguenti numeri:
m1 = 11,
m2 = 604,
m3 = 117,
m4 = 23.
(4) Ora inizia l’operazione di cifratura vera e propria per l’invio del messaggio
a Carla in modo tale che quest’ultima lo possa decifrare e sia l’unica a
poterlo fare in un tempo ragionevole. Per cifrare il messaggio da spedire
a Carla, Francesco eleva ogni mi alla potenza eC . Il messaggio cifrato
che Francesco invia sarà dunque rappresentato dai seguenti numeri ti , i =
1, 2, 3, 4.
t1 = me1C mod nC = 113 mod 1003 = 328,
t2 = me2C mod nC = 6043 mod 1003 = 797,
t3 = me3C mod nC = 1173 mod 1003 = 825,
t4 = me4C mod nC = 233 mod 1003 = 131.
Ora Francesco ha terminato la sua operazione e invia a Carla il messaggio
cifrato costituito dai messaggi unitari
t1 = 328,
t2 = 797,
t3 = 825,
t4 = 131,
(5) Carla ha ricevuto il messaggio e deve procedere alla decifratura, cioè per
ogni ti deve scoprire il messaggio originario mi sapendo che
ti = mei C mod nC .
Carla, e solo lei, ha la chiave segreta dC che, ricordiamo, soddisfa alle
proprietà
• 1 ≤ dC < φ(nC ) = (p − 1)(q − 1),
• dC è soluzione della congruenza eC dC ≡ 1 (modφ(nC )).
Inoltre, la congruenza soprascritta ha un’unica soluzione perchè
M CD(eC , φ(nC )) = 1. Nel nostro caso la soluzione, chiave segreta di
Carla, è
dC = 619
infatti nC = 1003 = 17 · 59, φ(1003) = 16 · 58 = 928, e pertanto la
soluzione della congruenza 3x ≡ 1 mod 928, è dC = 619.
(6) Per decifrare, Carla eleva ogni ti a dC = 619, cioè calcola
328619 ,
797619 ,
825619 ,
131619 .
4. IL SISTEMA RSA
118
L’esponente 619 è grande allora per il calcolo Carla scrive 619 in base 2:
619 = (1001101011)2 = 512 + 64 + 32 + 8 + 2 + 1.
Ne segue che, per ogni i = 1, 2, 3, 4, si ha
32
8
2
1
t619
= t512
· t64
i
i
i · ti · ti · ti · ti .
Per i = 1 le potenze si calcolano facilmente utilizzando la seguente tabella
relativa a t1 = 328 :
k
1
2
22
23
24
25
26
27
28
29
C1k mod 1003
328
3282 mod 1003 = 263
=4
2632 mod 1003 = 965
=8
9652 mod 1003 = 441
= 16 4412 mod 1003 = 902
= 32 9022 mod 1003 = 171
= 64 1712 mod 1003 = 154
= 128 1542 mod 1003 = 647
= 256 6472 mod 1003 = 358
= 512 3582 mod 1003 = 783
Dai calcoli riportati nella tabella, si ottiene
328619 = 328512 · 32864 · 32832 · 3288 · 3282 · 3281 ≡
≡ 783 · 154 · 171 · 441 · 263 · 328 ≡ 11 mod 1003.
Si noti che, elevando t1 = 328 all’esponente dC = 619, si ottiene il numero
11 = m1 , cioè il numero corrispondente al messaggio originario. Carla procede allo stesso modo con gli altri tre blocchi del messaggio e, in
definitiva, ottiene
328619 mod 1003 = 11,
825619 mod 1003 = 117,
797619 mod 1003 = 604,
131619 mod 1003 = 23.
Questi numeri vanno pensati a quattro cifre, ossia
0011,
0604,
0117,
0023,
e corrispondono ai quattro blocchi di messaggio originali che erano dei
digrafi e pertanto Carla deve dividere ciascuno in due parti e ciascuna delle
due parti rappresenta una lettera. Utilizzando la tabella dell’equivalenza
lettere-numeri riportata al punto (1), Carla ottiene
00 11 06 04 01 17 00 23
a l g e b r a x
e quindi riesce a capire quale è il corso che è piaciuto di più a Francesco.
4. IL SISTEMA RSA
119
Nota 9.4.4. Abbiamo detto che il messaggio unitario deve essere minore di
n. Dimostriamo con un esempio che la condizione è necessaria. Consideriamo il
messaggio
no
e supponiamo di inviarlo a Francesco che ha come chiave pubblica la coppia (nF =
77, eF = 13). Consideriamo l’intera parola no come messaggio unitario (digrafo):
(1) trasformiamo il messaggio in un numero associando ad ogni lettera il suo
equivalente numerico (vedi Tabella al punto (1) dell’esempio 9.4.3). Il
numero associato risulta essere
1314
che è maggiore di nF = 77;
(2) per cifrare eleviamo 1314 alla potenza eF = 13. Si ottiene
131413 ≡ 26 mod 77 ,
t = 26.
(3) Francesco riceve il messaggio
26
Per decifrare questo messaggio Francesco utilizza la sua chiave segreta che
è dF = 37 ( soluzione della congruenza 13 · dF ≡ 1 mod φ(77), cioè 13 ·
dF ≡ 1 mod 60).
Elevando 26 alla potenza 37 e calcolando mod 77, si ottiene 5 che
Francesco interpreta come
f
e quindi non ritrova il messaggio che gli è stato inviato (vedi tabella
equivalenza lettere-numeri riportata nell’esempio 9.4.3).
Dunque è necessario che il messaggio unitario sia minore di nF , altrimenti è impossibile decifrare il messaggio.
Nota 9.4.5. Nell’esempio 9.4.3 abbiamo visto che per inviare a Carla il messaggio algebra, Francesco lo ha suddiviso in digrafi. Per fare ciò ha dovuto procedere
per tentativi, verificando che i numeri corrispondenti ai singoli digrafi fossero tutti
minori di nC e primi con esso.
C’è però un metodo migliore per scegliere in che modo suddividere il messaggio. Non conviene dividere il messaggio originario algebra, ma conviene dividere
il messaggio numerico ottenuto associando un numero a due cifre ad ogni lettera.
Anzi, c’è un modo naturale di suddividerlo, vediamo quale.
Dopo che si è trasformato il messaggio in una serie di numeri, ciascuno a due cifre, consideriamo il numero (detto messaggio numerico) costituito dalla successione
di tutte le cifre. Suddividiamo questo numero in blocchi di k cifre dove
k = numero di cifre di nC diminuito di una unità .
4. IL SISTEMA RSA
120
In questo modo, senza dover esaminare il messaggio, il singolo messaggio numerico
unitario è automaticamente minore di nC . Non solo, questo modo di procedere è
noto a tutti perchè tutti conoscono nC e sanno che il mittente del messaggio divide
il messaggio numerico in blocchi ottenuti in questo modo.
Vediamo un esempio.
Esempio 9.4.6. Supponiamo che Francesco debba inviare a Carla il messaggio
vieni qui
(1) Francesco trasforma il messaggio, trascurando la spaziatura, nella sequenza di numeri di due cifre (Tabella dell’esempio 9.4.3)
21 08 04 13 08 16 20 08
che scriveremo come
2108041308162008.
Ciò non crea ambiguità perchè sappiamo che ogni numero associato ad una
lettera del messaggio originario è costituito da due cifre. Quello ottenuto
è il messaggio numerico.
(2) Come già scritto nell’esempio 9.4.3, le chiavi pubblica e privata di Carla sono, rispettivamente, (nC = 1003, eC = 3) e dC = 619. Osservato
che il numero nC = 1003 ha quattro cifre, Francesco spezza il messaggio
numerico in gruppi di 4 − 1 = 3 cifre, ossia in trigrafi, come segue:
210 804 130 816 200 823.
Si noti che Francesco ha aggiunto 23, corrispondente alla lettera x, in
modo che tutti i messaggi numerici unitari siano costituiti da tre cifre.
In questo modo ha spezzato il messaggio numerico in messaggi numerici
unitari che sicuramente sono minori di nC = 1003. Si osservi che questa
suddivisione non è una suddivisione del messaggio originario vieni qui
perchè i blocchi numerici unitari di tre cifre non corrispondono a nessun
gruppo di lettere. Occorre inoltre controllare che ogni mi sia relativamente
primo con 1003. E’ facile verificare che l’unica eccezione è quella di 816.
Ciò però non ha importanza perchè vale il Teorema 9.4.1 che ci assicura
che la condizione M CD(mi , 1003) è solo di utilità ma non strettamente
necessaria. In definitiva i singoli messaggi numerici unitari sono
m1 = 210, m2 = 804, m3 = 130, m4 = 816, m5 = 200, m6 = 823.
Si noti che le operazioni fin qui fatte non corrispondono a nessun tipo di
cifratura, infatti la trasformazione di un messaggio in una successione di
numeri è standard così come la ripartizione dello stesso in gruppi di tre
cifre, che dipende dal valore di nC che è pubblico.
5. LA FIRMA ELETTRONICA, AUTENTICAZIONE CON IL SISTEMA RSA
121
(3) Si cifrano i messaggi numerici unitari e si ottiene:
t1 = me1C mod nC , 2103 mod 1003 = 301,
t1 = 301,
t2 = me2C mod nC , 8043 mod 1003 = 975,
t2 = 975,
eC
3
t3 = m3 mod nC , 130 mod 1003 = 430,
t3 = 430,
t4 = me4C mod nC , 8163 mod 1003 = 357,
t4 = 357,
eC
3
t5 = m5 mod nC , 200 mod 1003 = 72,
t5 = 72,
t6 = me6C mod nC , 8233 mod 1003 = 445,
t6 = 445.
(4) Carla riceve la seguente successione di messaggi unitari:
t1 = 301, t2 = 975, t3 = 430, t4 = 357, t5 = 72, t6 = 445.
Per decifrare, Carla eleva ogni ti alla sua chiave segreta dC = 619, ossia
calcola
301619 , 975619 , 430619 , 357619 , 72619 , 445619
e trova
301619 mod 1003 = 210 = m1 ,
430619 mod 1003 = 130 = m3 ,
72619 mod 1003 = 200 = m5 ,
In definitiva, Carla ottiene la sequenza di
ora raggruppa a due a due ottenendo
975619 mod 1003 = 804 = m2 ,
357619 mod 1003 = 816 = m4 ,
445619 mod 1003 = 823 = m6 .
cifre 210804130816200823 che
21, 08, 04, 13, 08, 16, 20, 08, 23
e quindi Carla riesce a leggere il messaggio vieni quix che capisce significa
vieni qui.
5. La firma elettronica, autenticazione con il sistema RSA
Il sistema RSA consente di risolvere il problema della autenticazione elettronica
di una firma. Ad esempio, se Francesco riceve un messaggio da una persona che
si firma Carla, deve essere certo che sia stata proprio Carla ad inviarglielo. Se
(nC , eC ) e dC sono la chiave, rispettivamente, pubblica e privata di Carla, per
risolvere questo problema si procede come segue.
(1) Carla scrive il messaggio m1 contenente la sua firma F e, perchè la firma
possa essere autenticata, aggiunge il messaggio m2 con m2 = F dC ( mod nC ),
(ricordiamo che solo lei conosce dC ). Poi, con le solite modalità di cifratura, invia a Francesco il messaggio cifrato.
(2) Francesco, con le solite modalità, decifra il messaggio e per verificare
l’autenticità della firma calcola me2C (mod nC ).
6. SICUREZZA DEL SISTEMA RSA
122
(3) Se me2C (mod nC ) = F, allora la firma è autentica
me2C ≡ (F dC )eC = F dC eC ≡ F( mod nC ).
La firma è quella di Carla perchè solo lei conosce la propria chiave privata
che è la sola compatibile con eC e nC utilizzati da Francesco.
Si noti che per l’autentica della firma si usano solo le chiavi relative a colui che
spedisce il messaggio (ovviamente per cifrare e decifrare il messaggio occorrono, al
solito, anche le chiavi del destinatario).
Esempio 9.5.1. Carla invia un documento firmato a Francesco.
• Chiave pubblica di Carla : (nC = 77, eC = 13),
• Chiave privata di Carla : dC = 37.
(Poichè 77 = 11·7, la chiave privata di Carla è dC = 37 perchè 37·13 ≡ 1(mod 60),
dove 60 = φ(77).)
Supponiamo che la firma di Carla sia F = 5.
(1) Nell’inviare il messaggio a Francesco, Carla ha autenticato la sua firma
aggiungendo il messaggio
47 (ottenuto calcolando 537 mod 77).
(2) Francesco verifica l’autenticità della firma calcolando
4713 mod 77 (= 5).
(3) La firma è autentica perchè Francesco ottiene 5 che è la firma di Carla .
6. Sicurezza del sistema RSA
La sicurezza del sistema RSA sta nel fatto che non esiste a tutt’oggi un algoritmo efficiente per fattorizzare numeri grandi. Se A invia a B un messaggio m,
un estraneo che tentasse di decifrarlo abusivamente dovrebbe trovare la fattorizzazione della chiave pubblica nB di B. Nel caso che nB sia prodotto di due numeri
primi ciascuno con 100 e più cifre, anche utilizzando i più sofisticati algoritmi e
i calcolatori più veloci, occorrerebbero anni di calcolo per fattorizzare nB e pertanto si ritiene che la fattorizzazione di nB sia impossibile per un estraneo non
autorizzato. Questo però è vero in generale, ma non sempre, come ha mostrato il
seguente episodio.
Nell’agosto 1977, dalle colonne della pagina Mathematical Games di M. Gardner, i tre inventori del sistema RSA sfidarono i lettori della rivista Scientific American a decifrare un messaggio corrispondente ad un numero a 129 cifre, operazione
6. SICUREZZA DEL SISTEMA RSA
123
che secondo loro avrebbe richiesto miliardi di anni. Offrivano 100 dollari di premio a chi avesse trovato la soluzione. Per decifrare il loro messaggio originale era
necessario fattorizzare il numero
n = 11438162575788886766923577997614661201021829672124236256256184293
5706935245733897830597123563958705058989075147599290026879543541,
che era stato pubblicato assieme al numero e = 9007, ossia (n, e) era la chiave
pubblica di Rivest, Shamir e Adleman. Per garantire che il messaggio proveniva
proprio dai tre studiosi, fu aggiunta la seguente autenticazione della loro firma
ottenuta usando la chiave segreta dell’algoritmo
1671786115038084424601527138916839824543690103235831121783503844
6929062655448792237114490509578608655662496577974840004057020373.
Elevando questo numero alla potenza 9007 e riducendo modulo n si otteneva il
numero
0609181920001915122205180023091419001
5140500082114041805040004151212011819
corrispondente alla frase
First solver wins one hundred dollars,
che era la garanzia che il messaggio proveniva proprio da Rivest, Shamir, Adleman.
Diciassette anni dopo il matematico Arjen K. Lenstra insieme ad un gruppo
di qualche centinaio di persone, in soli otto mesi riuscì a trovare la soluzione. La
tecnica usata per affrontare il problema è quella che prende il nome di crivello
quadratico polinomiale multiplo, una tecnica che permette di suddividere il lavoro
in tante parti più piccole. Per organizzare questo lavoro, Lenstra si servì di centinaia di collaboratori in tutto il mondo impegnando migliaia di calcolatori, il tutto
coordinato via internet. Ognuno di questi collaboratori mandò a Lenstra i risultati
della parte di lavoro da loro svolta. Unendo il tutto, con un supercalcolatore in
due giorni furono trovati i due fattori, uno di 64 cifre e uno di 65 cifre. Questo
permise a Lenstra di decifrare il messaggio di Rivest, Shamir e Adleman.
Il messaggio diceva
the magic words are sqeamish ossifrage.
A detta degli stessi autori, si tratta di parole senza senso, ma essi non si aspettavano che le parole potessero mai essere decifrate. Quella che sembrava una sfida
impossibile, dopo 17 anni si era invece rivelata possibile. Si può allora concludere
che la crittografia è ancora una scienza sperimentale. Un sistema ritenuto sicuro
oggi può non esserlo domani!
Scarica

Lezioni di Algebra e Teoria dei Codici