Corso di Algebra Avanzata Teoria dei Codici e Crittografia: 3 Teoria dei Codici


Teoria dei Codici

Obiettivi

  • Fornire i fondamenti matematici dei codici per la correzione d’errori.

  • Mostrare come costruire codici lineari, codici ciclici e codici di Hamming.

  • Presentare metodi pratici di codifica e decodifica (sindrome, correzione).

  • Eseguire esercizi numerici e simulazioni a mano per comprendere i meccanismi.

1. Concetti fondamentali e notazioni

  • Lavoriamo su vettori binari F2n\mathbb{F}_2^n (campo finito con due elementi: 0,10,1; operazioni modulo 2).

  • Un codice CC è un sottoinsieme non vuoto di F2n\mathbb{F}_2^n.

  • Un codice lineare CC di lunghezza nn e dimensione kk è un sottospazio vettoriale di F2n\mathbb{F}_2^n di dimensione kk; si indica come [n,k][n,k] (talvolta [n,k,d][n,k,d] includendo distanza minima dd).

  • Peso w(v)w(v) di un vettore vv = numero di componenti uguali a 1.

  • Distanza di Hamming d(u,v)d(u,v) = peso di uvu-v (operazione in F2\mathbb{F}_2); per un codice lineare la distanza minima dd è il minimo peso non nullo tra i codici: d=min{w(c)    cC,c0}d=\min\{w(c)\;|\;c\in C, c\neq 0\}.

Proprietà utili: per un codice lineare [n,k,d][n,k,d] vale che può correggere fino a t=d12t=\left\lfloor\frac{d-1}{2}\right\rfloor errori (decodifica hard-decision minimum-distance).

2. Codici lineari: generatori e controllo di parità

Matrice generatrice GG

Se CC è un sottospazio kk-dimensionale, esiste una matrice GG k×nk\times n (righe linearmente indipendenti) tale che ogni parola codice cCc\in C si esprime come

c=uG,uF2k,c = u G,\qquad u\in\mathbb{F}_2^k,

dove uu è il vettore di informazione (message). Si parla di codifica sistematica se GG è della forma G=[Ik    P]G = [I_k \;|\; P] (identità k×kk\times k seguita da una matrice PP k×(nk)k\times (n-k)): allora il codiceword contiene i bit informazione nei primi kk posti seguiti dai bit di parità.

Matrice di controllo HH

Per un codice lineare CC esiste una matrice di controllo HH (nk)×n(n-k)\times n tale che

C={cF2n    HcT=0}.C = \{ c \in \mathbb{F}_2^n \;|\; H c^T = 0 \}.

Le righe di HH generano lo spazio ortogonale CC^\perp. Se G=[Ik    P]G=[I_k \;|\; P] allora una scelta convenzionale è

H=[PTInk]H = \begin{bmatrix} -P^T & I_{n-k} \end{bmatrix}

(con operazioni in F2\mathbb{F}_2, dunque il segno meno è identico al plus).

Encoding e verifica

  • Codifica: dato uF2ku\in\mathbb{F}_2^k, calcoli c=uGc = uG.

  • Verifica: dati rF2nr\in\mathbb{F}_2^n (ricevuto), calcoli la sindrome

s=HrT.s = H r^T.

Se s=0s=0 allora rr è un codiceword (o c’è un errore appartenente al codice nullo); altrimenti ss identifica il cosiddetto coset di errore.

3. Distanza minima, bound fondamentali

  • Bound di Hamming (sfera di Hamming) per codici binari: per correggere tt errori, si deve avere

i=0t(ni)2nk.\sum_{i=0}^{t} \binom{n}{i} \le 2^{n-k}.
  • Singleton bound: dnk+1d \le n-k+1. Un codice che raggiunge d=nk+1d=n-k+1 è MDS (maximally distance separable).

  • Bound di Gilbert–Varshamov e altri forniscono limiti esistenziali (non approfonditi qui).

4. Codice di Hamming: struttura e decodifica

Costruzione del codice di Hamming (7,4)(7,4)

Il codice di Hamming a singola correzione con parametro [7,4][7,4] è uno degli esempi base.

  • Dimensione k=4k=4, lunghezza n=7n=7, controllo nk=3n-k=3.

  • Si costruisce spesso in forma sistematica G=[I4    P]G=[I_4 \;|\; P] e H=[PT    I3]H=[-P^T \;|\; I_3].

Una scelta comune (matrici su F2\mathbb{F}_2) è:

G=(1000110010010100101000001011)H=(111110010010100101001).G = \begin{pmatrix} 1&0&0&0 & 1&1&0\\ 0&1&0&0 & 1&0&1\\ 0&0&1&0 & 1&0&0\\ 0&0&0&1 & 0&1&1 \end{pmatrix} \quad H = \begin{pmatrix} 1&1&1&1&1&0&0\\ 1&0&0&1&0&1&0\\ 0&1&0&1&0&0&1 \end{pmatrix}.

(Esistono molte rappresentazioni equivalenti via operazioni elementari sulle colonne; l’importante è che le colonne di HH siano tutte le diverse 0\neq 0 vettori in F23\mathbb{F}_2^3.)

Le colonne di HH generalmente corrispondono all’indirizzo binario (1..7):

colonne H={(001)T,(010)T,(011)T,(100)T,(101)T,(110)T,(111)T}\text{colonne } H = \{ (0\,0\,1)^T,(0\,1\,0)^T,(0\,1\,1)^T,(1\,0\,0)^T,(1\,0\,1)^T,(1\,1\,0)^T,(1\,1\,1)^T\}

(alcune convenzioni usano ordine diverso).

Proprietà

  • Distanza minima d=3d=3 → può correggere t=1t=1 errore e rilevare fino a 2 errori.

  • Decodifica tramite sindrome: la sindrome s=HrTs=Hr^T (3 bit) indica la posizione dell’errore (se s0s\neq 0); per il (7,4)(7,4) la sindrome non nulla corrisponde esattamente al vettore colonna di HH che indica il bit errato.

Esempio numerico (Hamming (7,4))

Scegliamo il messaggio u=(1  0  1  1)u=(1\;0\;1\;1). Codifichiamo c=uGc=uG (operazioni mod 2):

Dalla riga di GG, calcoli a mano:

  • uu moltiplicato per GG:

    c=(1,0,1,1)(1000110010010100101000001011)c = (1,0,1,1) \cdot \begin{pmatrix} 1&0&0&0 & 1&1&0\\ 0&1&0&0 & 1&0&1\\ 0&0&1&0 & 1&0&0\\ 0&0&0&1 & 0&1&1 \end{pmatrix}

    componendo:

    c=(1,0,1,1)info    parityc = (1,0,1,1)_{\text{info}} \;|\; \text{parity}

    Calcoliamo le colonne dei bit di parità:

    • prima colonna di parità (col 5) = somma mod2 delle colonne P corrispondenti ai bit info attivi: per brevità: otteniamo

    c=(1,0,1,1,  p1,p2,p3).c = (1,0,1,1, \; p_1, p_2, p_3).

    Procedendo si trova (con i valori di GG sopra) c=(1,0,1,1,0,0,0)c=(1,0,1,1,0,0,0) oppure altro a seconda della versione di GG; l’importante è seguire i calcoli con la matrice effettiva scelta. (Nella pratica si usano generatori standard; qui l’esempio è didattico: nella decodifica seguente useremo un codiceword numerico definito.)

Supponiamo che il codiceword trasmesso sia c=(1,0,1,1,0,0,0)c=(1,0,1,1,0,0,0). Durante la trasmissione si verifica un errore in posizione 3 (contiamo da 1 a 7), il vettore ricevuto è

r=(1,0,0,1,0,0,0).r = (1,0,\underline{0},1,0,0,0).

Calcoliamo la sindrome

s=HrT,s = H r^T,

operando modulo 2. Se ss coincide con la colonna di HH corrispondente alla posizione 3, allora si corregge invertendo quel bit. Dopo la correzione si ottiene il codiceword corretto cc.

(Per chiarezza: nei materiali didattici si riporta passo passo il calcolo numerico della sindrome, colonna per colonna. Qui per brevità abbiamo descritto il metodo: se desideri, scrivo il calcolo bit-per-bit seguendo la matrice specifica.)

5. Decodifica per sindrome (algoritmo)

Algoritmo (hard-decision, correzione fino a t errori con tabella sindrome):

  1. Ricevi rF2nr\in\mathbb{F}_2^n.

  2. Calcola s=HrTs = H r^T.

  3. Se s=0s=0 → output c^=r\hat c = r (nessun errore rilevato).

  4. Altrimenti cerca in una tabella precalcolata che mappa ogni possibile sindrome ss al più probabile pattern di errore ee (per Hamming è il singolo bit con quella sindrome).

  5. Correggi c^=re\hat c = r - e (equiv. r+er + e in F2\mathbb{F}_2), quindi estrai l’informazione uu da c^\hat c.

Complessità: calcolo sindrome O(n(nk))O(n(n-k)), con tabella sindrome l’operazione è O(n) per applicare la correzione.

6. Codici ciclici: rappresentazione polinomiale

Un codice ciclico CC di lunghezza nn è un codice lineare tale che se c=(c0,c1,,cn1)Cc=(c_0,c_1,\dots,c_{n-1})\in C allora la rotazione ciclica (cn1,c0,,cn2) (c_{n-1},c_0,\dots,c_{n-2}) è ancora in CC.

Rappresentazione

Associamo a un vettore cc il polinomio

c(x)=c0+c1x++cn1xn1c(x) = c_0 + c_1 x + \dots + c_{n-1} x^{n-1}

in F2[x]\mathbb{F}_2[x] modulo xn1x^n-1. Un codice CC è ciclico ⇔ esiste un polinomio g(x)g(x) divisore di xn1x^n-1 tale che

C={c(x)=m(x)g(x)    m(x)F2[x], degm<k},C = \{ c(x) = m(x) g(x) \;|\; m(x) \in \mathbb{F}_2[x],\ \deg m < k \},

dove g(x)g(x) è il polinomio generatore di grado nkn-k.

Proprietà

  • g(x)g(x) è monico e di grado nkn-k.

  • xn1=g(x)h(x)x^n-1 = g(x) h(x) per qualche polinomio h(x)h(x).

  • Parità e controllo si esprimono via polinomi: la condizione h(x)c(x)0(modxn1)h(x) c(x) \equiv 0 \pmod{x^n-1}.

Esempio: CRC semplificato

La CRC è un codice ciclico di tipo rilevazione: dato un messaggio m(x)m(x), si calcola t(x)=xrm(x)modg(x)t(x)=x^{r} m(x) \bmod g(x) e si invia c(x)=xrm(x)t(x)c(x)=x^{r} m(x) - t(x), dove g(x)g(x) è il polinomio generatore di grado rr. In ricezione si verifica c(x)modg(x)=0c(x) \bmod g(x)=0 per determinare errori rilevabili.

7. Codici più avanzati: BCH e Reed–Solomon (cenni)

  • BCH codes: codici ciclici costruiti su estensioni dei campi finiti F2m\mathbb{F}_{2^m}; permettono correzione di più errori con costruzione parametrica.

  • Reed–Solomon: codici su Fq\mathbb{F}_{q} (con qq grande), sono MDS e molto usati (CD, DVD, comunicazioni satellitari).

8. Correzione vs. rilevazione, canale e criteri di decodifica

  • Hard-decision decoding: lavoriamo con simboli binari discreti (0/1). Decodifica minima distanza è ottima per canali simmetrici a memoria nulla.

  • Soft-decision decoding: sfrutta informazioni di affidabilità (es. valori reali). Algoritmi come Viterbi/BCJR o il decoding soft per Reed–Solomon/BCH sono più potenti ma più costosi.

  • Canale binario simmetrico (BSC): modello comune, probabilità di bit-flip pp. Massimizzazione della probabilità a posteriori (MAP) coincide con decodifica a minima distanza per canale simmetrico.

9. Attività pratiche e esercizi svolti

Esercizio 1 — Costruzione di un codice di Hamming (7,4) e decodifica

Obiettivo: costruire G,HG, H, codificare u=(1,0,1,1)u=(1,0,1,1), introdurre errore in posizione 3, calcolare sindrome e correggere.

Soluzione passo-passo:

  1. Prendiamo GG e HH come nella sezione 4 (o una delle forme canoniche).

  2. Codifica uu con c=uGc = uG. Calcoliamo esplicitamente ogni prodotto riga-colonna modulo 2. (Operazioni bitwise XOR).

  3. Introduciamo errore ee con 1 nella posizione 3: r=c+er = c + e.

  4. Calcoliamo s=HrT=H(cT+eT)=HcT+HeT=0+HeT=HeTs = H r^T = H(c^T + e^T) = Hc^T + He^T = 0 + He^T = He^T. Poiché ee ha un unico 1 in posizione 3, ss sarà la colonna 3 di HH.

  5. Troviamo che tale sindrome identifica la posizione 3 → inverto il bit 3 in rr → otteniamo c^=r+e\hat c = r + e = c.

(Se vuoi, incollo qui i calcoli numerici riga-per-riga con numeri. Basta dirmelo e li sviluppo esplicitamente per la matrice scelta.)

Esercizio 2 — Simulazione di Hamming su più messaggi

Costruisci tutti i codiciword per i 16 messaggi di 4 bit, genera tutti i possibili vettori di errore a singolo bit e verifica la correzione automatica tramite sindrome per ciascuna possibile ricezione (dimostrazione esaustiva che Hamming(7,4) corregge 1 errore).

Esercizio 3 — Codice ciclico semplice e CRC

  • Sia n=7n=7, g(x)=x3+x+1g(x)=x^3+x+1 (esempio). Dato m=(1,0,1,1)m=(1,0,1,1) rappresentato da m(x)=1+x2+x3m(x)=1+x^2+x^3 (con grado < k), calcola il codeword c(x)=m(x)g(x)mod(x71)c(x)=m(x)g(x) \bmod (x^7-1).

  • Esegui una simulazione di errore (flipping di bit) e verifica la condizione c(x)modg(x)c(x) \bmod g(x).

10. Metodi pratici e consigli di implementazione

  • In implementazioni reali, generatori e matrici usano bitwise XOR e shift register per codici ciclici (LFSR per CRC).

  • Per decoding efficienti di codici BCH/Reed–Solomon si usano algoritmi di algebra sui campi finiti (Euclide esteso, Berlekamp–Massey).

  • Per canali rumorosi si preferiscono schemi concatenati (RS + convolutional) o codici moderni LDPC/Polar con decoding iterativo (belief propagation).

11. Esercizi proposti (da svolgere)

  1. Costruisci il codice [7,4][7,4] di Hamming nella forma sistematica con generator G=[I4P]G=[I_4|P] e ottieni PP tale che H=[PTI3]H=[-P^T|I_3]. Verifica la tabella delle sindromi.

  2. Per il messaggio u=(1,1,0,0)u=(1,1,0,0) calcola cc. Simula un errore in posizione 5 e decodifica. Mostra tutti i passaggi.

  3. Sia n=7n=7 e g(x)=x3+x+1g(x)=x^3+x+1. Dimostra che g(x)g(x) divide x71x^7-1 su F2[x]\mathbb{F}_2[x]. Costruisci il codice ciclico corrispondente e trova la dimensione kk.

  4. Implementa in pseudo-codice la funzione encode(u) e decode(r) per il codice di Hamming (use a syndromes table).

12. Punti critici e appunti di rigore

  • La scelta di GG e HH è non unica: matrici diverse definiscono lo stesso codice (equivalenza di colonne).

  • La decodifica per minima distanza è ottima ma computazionalmente proibitiva per codici generali: la sindrome + tabella funziona solo se il numero di pattern di errore probabili è piccolo (es. t=1). Per correzione multipla si usano algoritmi strutturati (BCH, Reed–Solomon, Viterbi per convolutional).

  • La rappresentazione polinomiale è potente per i codici ciclici ma richiede consapevolezza dei campi finiti quando si passa a codici non binari.

13. Conclusione sintetica

La teoria dei codici mette in relazione algebra lineare (sottospazi vettoriali, matrici GG e HH), algebra polinomiale (codici ciclici), teoria dei campi finiti (BCH, RS) e algoritmi numerici per la decodifica. Il passaggio dalla teoria (distanza minima, bound) alle applicazioni pratiche richiede la scelta di strutture codificanti che bilancino capacità di correzione, efficienza di codifica/decodifica e complessità computazionale, tenendo conto del modello di canale.

Commenti

Post popolari in questo blog

Corso di Stampa 3D: 3 – Modelling 3D – Software

Corso di chimica: Reazioni chimiche

Corso di Taglio e Lavorazioni Digitali: 6 Introduzione al CNC