Un codice a parità singola aggiunge a una stringa di L bit un solo bit di controllo, la somma modulo 2 dei bit della stringa. La parola di codice ha così n=L+1 bit e un numero pari di 1. Il codice rivela ogni errore che inverte un numero dispari di bit, ma non vede un numero pari di inversioni.
Il canale inverte alcuni bit della parola trasmessa C. Il vettore d'errore E, di n bit, ha un 1 nelle posizioni invertite, e si riceve C⊕E, con somma bit a bit modulo 2. Metà dei 2n vettori possibili ha un numero pari di 1: la parità non cambia e l'errore passa inosservato. Non è però una probabilità, perché pochi errori sono molto più probabili di molti.
Probabilità di non rivelare un errore
Sia p la probabilità che un bit sia ricevuto errato (BER, bit error rate). Si assume che i bit si sbaglino in modo indipendente. Nella pratica gli errori arrivano a raffica, ma l'ipotesi rende il calcolo possibile.
Una configurazione precisa, con i bit errati e n−i corretti, ha probabilità
pi(1−p)n−i=(1−p)n(1−pp)i
Il rapporto p/(1−p) è molto minore di 1, perché p è piccolo (valori tipici da 10−4 a 10−6). Elevato a i diventa sempre più piccolo, quindi poche inversioni sono molto più probabili di molte.
Gli i errori possono occupare (in) posizioni diverse, perciò la probabilità di averne esattamente i è
Pi=(in)pi(1−p)n−i
La parità singola non rivela l'errore quando i è pari e almeno 2. È un falso negativo: l'errore non viene segnalato.
PFN=i=2,4,6,…i≤n∑Pi
Per n=32 e p=10−3 si ottiene PFN≈5⋅10−4. È un valore alto se i messaggi sono milioni.
Errori non rivelati dalla parità singola
p=10−3p
PFN al variare di p
La probabilità di non rivelare un errore cresce con il tasso di errore e con la lunghezza della parola. Aumentando n il punto sale.
Due debolezze: un solo bit protegge una stringa lunga e la parola è costruita in modo poco robusto. Servono più bit di controllo e parole di codice scelte meglio.
Parole di codice lontane fra loro
Le stringhe di n bit sono 2n e solo alcune sono parole di codice. Con n=4 sono 16. Se tutte lo fossero, un solo errore porterebbe a un'altra parola senza lasciare traccia: manca la ridondanza. Con due bit di controllo e due di messaggio le parole di codice sono 4 su 16.
Conta anche quali 4 si scelgono. Se sono vicine, un piccolo errore porta da una all'altra. Se sono lontane, porta fuori dal codice e il ricevitore se ne accorge. Serve una distanza fra stringhe binarie.
La distanza di HammingdH(M1,M2) è il numero di posizioni in cui due stringhe della stessa lunghezza differiscono. Per M1=10110 e M2=11011 differiscono la seconda, la terza e la quinta posizione, quindi dH(M1,M2)=3.
La distanzad di un codice è la minima distanza fra due sue parole distinte:
d=C1=C2mindH(C1,C2)
Le stringhe di 3 bit stanno ai vertici di un cubo e la distanza di Hamming è il numero di spigoli da percorrere. Il codice con C1=011 e C2=100 ha d=3. Se si trasmette 011 e il canale inverte un bit, si riceve per esempio 001. Non è una parola di codice, quindi l'errore è rivelato. 001 dista 1 da C1 e 2 da C2, quindi la parola più vicina è C1 e si corregge.
Il cubo delle stringhe di 3 bit
000001010101110111011100ricevuta
Ogni errore sposta la stringa ricevuta lungo uno spigolo. Con un errore la parola di codice più vicina è ancora quella trasmessa 011; con due diventa l'altra.
Nel cubo le croci sono le parole di codice e i cerchi le altre stringhe. Con due errori si arriva a 101, che dista 1 da C2 e 2 da C1: la correzione sceglie C2 e sbaglia. Con tre errori si arriva a C2 stessa e non si rivela niente.
Quanti errori si rivelano e si correggono
In un codice di distanza d ogni bit errato sposta la stringa ricevuta a distanza 1 dalla precedente. Con meno di d errori la stringa non può essere un'altra parola di codice, quindi l'errore si rivela. Se non si tenta di correggere, si rivelano fino a d−1 errori.
Per correggere si sceglie la parola di codice più vicina a quella ricevuta. La scelta è giusta finché la parola trasmessa resta la più vicina, cioè con al più ⌊(d−1)/2⌋ errori.
Esempio con d=5: C1=00000 e C2=11111. Con uno o due errori la stringa ricevuta è ancora più vicina a C1, quindi si corregge. Con tre errori può essere più vicina a C2 e la correzione sbaglia. Per d=5 si correggono 2 errori e si rivelano fino a 4.
Codice di Hamming (7,4)
Il codice migliore ha la distanza minima più grande possibile, e i codici di Hamming danno una regola per costruirlo. Il (7,4) trasmette 4 bit informativi D1,…,D4 con 3 bit di controllo P1,P2,P3, in 7 bit. I bit di controllo non stanno in coda, ma nelle posizioni 1, 2 e 4:
(P1,P2,D1,P3,D2,D3,D4)
Ogni bit di controllo impone parità pari su un gruppo di bit di informazione:
Con D1D2D3D4=1010 si ottiene P1=1, P2=0, P3=1 e la parola 1011010. Questo schema ha distanza d=3: corregge un errore, oppure rivela fino a due errori se non si corregge.
Un errore sul bit D2 rompe i controlli di P1 e P3, che lo contengono, e lascia a posto P2. Solo D2 sta in P1 e P3 senza stare in P2, quindi i controlli indicano D2 e basta invertirlo.
Quali controlli contengono un bit
D1=1D2=0D3=1D4=0P1=1P2=0P3=1bit errato
controllo di P1
controllo di P2
controllo di P3
Un bit errato rompe la parità di tutti e soli i controlli che lo contengono. Ogni bit ha una combinazione diversa, quindi si sa quale invertire.
Con due errori la stringa non è una parola di codice, ma i controlli puntano a un solo bit, diverso dai due sbagliati. Un decodificatore che corregge presume un errore solo, inverte quel bit e ottiene un'altra parola di codice, quindi sbaglia. Usato solo per rivelare, il codice riconosce invece anche i due errori.
Parità bidimensionale o a blocchi
Il messaggio si dispone in una matrice di righe della stessa lunghezza. Si aggiunge a ogni riga un bit che rende pari il numero di 1, e lo stesso a ogni colonna. Un bit nell'angolo completa la parità delle parità. In ricezione si ricostruisce la matrice e si ricontrollano righe e colonne.
Un errore. Una sola riga e una sola colonna hanno parità sbagliata, e si incrociano nel bit errato: si inverte e si corregge.
Due o tre errori. Si rivelano, ma la posizione non è univoca, quindi la correzione non è garantita.
Numero dispari di errori. Si rivela sempre, perché almeno una riga ha un numero dispari di inversioni.
Quattro errori. Se stanno ai vertici di un rettangolo, ogni riga e ogni colonna ne contiene due, le parità tornano e l'errore non si rivela.
Internet checksum
Il checksum è un codice usato da IP (livello 3) e dal livello 4, con blocchi di 16 bit. Qui K è la lunghezza di un blocco, non quella del messaggio. Il messaggio ha L bit, con L multiplo di K, e si divide in m=L/K blocchi B0,B1,…,Bm−1. Si somma modulo 2K−1.
Il checksum è un blocco Bm, l'opposto della somma:
Bm≡−j=0∑m−1Bj(mod2K−1)
Così, sommando tutti i blocchi insieme al checksum, si ottiene 0. Il ricevitore divide ciò che riceve in blocchi di K bit e li somma: con risultato 0 la stringa è una parola di codice, altrimenti c'è un errore.
Esempio con K=4, quindi modulo 24−1=15, e due blocchi B0=1100=12 e B1=1010=10: