Teoria dei Codici
Transcript
Teoria dei Codici
Teoria dei Codici Fabio Stumbo Università di Ferrara 8 gennaio 2016 Indice Indice i 1 Nozioni base sui codici 1.1 Definizioni fondamentali e notazioni . . . . Funzioni di codifica, decodifica e verifica . . 1.2 Prime proprietà . . . . . . . . . . . . . . . . Metrica del codice . . . . . . . . . . . . . . Relazioni tra i parametri . . . . . . . . . . . Prime applicazioni . . . . . . . . . . . . . . 1.3 Costruzione di codici nuovi da codici vecchi Perforazione . . . . . . . . . . . . . . . . . . Accorciamento . . . . . . . . . . . . . . . . Somma diretta . . . . . . . . . . . . . . . . Accorciamento (caso lineare) . . . . . . . . Estensione . . . . . . . . . . . . . . . . . . Codice duale . . . . . . . . . . . . . . . . . La costruzione (C1 , C2 ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 3 5 5 6 8 11 11 11 11 12 12 12 12 2 Codici lineari 2.1 Prime proprietà . . . . . . . . . . . . . . . 2.2 Codici lineari equivalenti . . . . . . . . . . 2.3 Matrice generatrice e matrice di controllo 2.4 Codici di Hamming . . . . . . . . . . . . . 2.5 Enumeratore di peso . . . . . . . . . . . . Identità di MacWilliams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 13 15 16 20 23 24 3 Codici ciclici 3.1 Spazi vettoriali e polinomi . . . . . . . . . . . 3.2 Polinomio generatore . . . . . . . . . . . . . 3.3 Polinomio di controllo . . . . . . . . . . . . . 3.4 Codifica, decodifica e verifica nei codici ciclici 3.5 Zeri di un codice ciclico . . . . . . . . . . . . Zeri e matrice di controllo di parità . . . . . . Zeri e distanza minima . . . . . . . . . . . . . 3.6 Idempotenti . . . . . . . . . . . . . . . . . . . 3.7 Famiglie di codici ciclici . . . . . . . . . . . . Codici BCH . . . . . . . . . . . . . . . . . . . Codici di Hamming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 28 32 35 37 39 40 43 45 52 52 53 i . . . . . . INDICE 3.8 ii Codici di Reed-Solomon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Progettazione di codici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Correzione degli errori nei codici lineari 4.1 Decodifica nei codici lineari . . . . . . . Correzione con tabella di Slepian . . . . Correzione a sindrome . . . . . . . . . . Correzione a sindrome – 2 . . . . . . . . Decodifica nei codici di Hamming . . . . 4.2 Decodifica nei codici ciclici: algoritmo di 4.3 Decodifica dei codici BCH . . . . . . . . Algoritmo PGZ e metodo di Forney . . Algoritmo di Sugiyama . . . . . . . . . . Algoritmo di Berlekamp-Massey . . . . 4.4 Un esempio svolto . . . . . . . . . . . . PGZ . . . . . . . . . . . . . . . . . . . . Sugiyama . . . . . . . . . . . . . . . . . Berlekamp-Massey . . . . . . . . . . . . 4.5 Altri esempi . . . . . . . . . . . . . . . . BCH [7,4] . . . . . . . . . . . . . . . . . BCH [15,7] . . . . . . . . . . . . . . . . BCH [15,5] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Meggitt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 54 56 56 57 58 59 60 60 64 65 74 78 95 96 98 99 100 100 101 103 A L’algoritmo euclideo 107 A.1 AEE in generale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 A.2 AEE per A = Z . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 A.3 AEE per A = K[X] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 B Rappresentazione degli elementi dei campi finiti 122 B.1 Il campo F16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 C Campi finiti e radici dell’unità 127 C.1 Coniugati ed elementi primitivi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 C.2 Polinomi ciclotomici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 Bibliografia 136 Capitolo 1 Nozioni base sui codici 1.1 Definizioni fondamentali e notazioni Un alfabeto q-ario è un insieme Q = {a1 , . . . , aq } con q elementi, detti simboli. Generalmente, ma non sempre, sceglieremo Q = Fq . Un codice è un sottoinsieme C ⊆ Qn . Per brevità, se non c’è possibilità di equivoco indicheremo l’elemento v = (v1 , . . . , vn ) ∈ Qn con v1 . . . vn . L’intero n si dice lunghezza del codice e gli elementi del codice si dicono parole. Se Q = F2 il codice è detto binario. Se Q = Fq è un campo finito e C è un sottospazio vettoriale di Fnq il codice è detto lineare; con k indicheremo la sua dimensione. Il tasso di informazione è il numero τ (C) = 1 logq M, n dove M = |C|; la ridondanza è n − logq M . Se v = v1 . . . vn e y = y1 . . . yn sono elementi di Qn , la distanza di Hamming (vedremo che questa è effettivamente una metrica, cfr. 1.6) tra v ed y è definita come d (v, y) = |{i : vi 6= yi e 1 ≤ i ≤ n}| . La palla di centro v e raggio r è l’insieme S (v, r) = {y ∈ Qn : d (v, y) ≤ r} e la minima distanza del codice C è l’intero d (C) = min {d (v, y) : v, y ∈ C e v 6= y} . La lunghezza, la cardinalità e la minima distanza di un codice sono tre parametri fondamentali di un codice C: per evidenziarli, chiameremo un codice di lunghezza n, cardinalità M e minima distanza d un (n, M, d)-codice. Se il codice è lineare, cioè C è un sottospazio vettoriale di dimensione k di Fnq , allora la sua cardinalità è data da M = q k ; in questo caso, diremo che C è un [n, k, d]-codice su Fq (o anche, più brevemente, un [n, k]-codice, se la distanza minima non è rilevante nella discussione). Si dice che un codice 1 CAPITOLO 1. NOZIONI BASE SUI CODICI 2 scopre s errori se modificando una parola del codice in al più s componenti si ottiene una parola non nel codice; in formula: ∀v ∈ C S (v, s) ∩ C = {v} ; (1.1) corregge t errori se per ogni parola w di lunghezza n esiste un’unica parola di C con distanza al più t da v; in formula: ∀w ∈ Qn ∃!v : v ∈ C ∩ S (w, t) (1.2) d−1 bX 2 c n i (q − 1) = q n ; M· i i=0 (1.3) Un (n, M, d)-codice C si dice: perfetto (cfr. 1.10) se massimale se non esiste un (n, M 0 , d)-codice C 0 tale che M 0 > M e C 0 ) C; ottimale (cfr. 1.9) se, posto Aq (n, d) = max {M 0 tale che esiste un (n, M 0 , d)-codice Q-ario} , si ha Aq (n, d) = q n−d+1 e M = Aq (n, d). Nel caso dei codici lineari, un [n, k, d]-codice è MDS se k + d = n + 1. I codici ottimali sono anche detti Maximum Distance Separable (MDS). Osservazione 1.1. Indichiamo con C (n, d) l’insieme di tutti gli (n, ∗, d)-codici su Q; si ha che C è un codice massimale se, e solo se, è massimale in C (n, d) relativamente all’ordinamento ⊆ se, e solo se, non esiste una parola u ∈ Qn \ C tale che d (v, u) ≥ d per ogni parola del codice v; C è un codice ottimale se, e solo se, ha cardinalità uguale al massimo possibile teorico. Chiaramente, un codice ottimale è massimale. Il viceversa non è vero: sia Q = F2 , n = 3 e d = 2; il codice C1 = {000, 110, 101, 011} è ottimale. Per contro, il codice C2 = {000, 111} è massimale perché non esiste alcuna parola di distanza almeno 2 dalle parole di C2 aggiungendo la quale esso possa essere esteso ma, evidentemente, non è ottimale. Due codici della stessa lunghezza (e sullo stesso alfabeto) C, D si dicono equivalenti se si ottengono l’uno dall’altro tramite un numero finito di operazioni di uno dei seguenti tipi: (A) Permutazione delle posizioni nelle parole. Scelta una permutazione σ ∈ Sn degli indici, si considera ∼ Qn → Qn v = v1 . . . vn 7→ vσ = vσ(1) . . . vσ(n) CAPITOLO 1. NOZIONI BASE SUI CODICI 3 (B) Permutazione dei simboli in una posizione fissata. Scelta una permutazione τ ∈ S (Q) delle lettere dell’alfabeto, si considera ∼ Qn → Qn v = v1 . . . vn 7→ vτ,i = v1 . . . vi−1 τ (vi ) vi+1 . . . vn Osservazione 1.2. Nel caso dei codici lineari, nella definizione di equivalenza è necessario restringere le operazioni di tipo (B): si considerano ammissibili solo le permutazioni originate dalla moltiplicazione di uno scalare. Ciò è necessario affinché operazioni di tipo (A) e (B) corrispondano ad operazioni elementari sulle colonne di opportune matrici (cfr. teorema 2.14). Più precisamente, le operazioni di tipo (A) corrispondono al cambio di base ottenuto dalla permutazione dei vettori della base mentre le operazioni di tipo (B) corrispondono al cambio di base effettuato moltiplicando per uno scalare un elemento della base. Funzioni di codifica, decodifica e verifica Lo scopo di un codice è quello di trasmettere un’informazione in modo tale che alla ricezione sia possibile, entro certi limiti, accertare se siano avvenuti errori nel corso della trasmissione e, eventualmente, correggere tali errori. Questo obiettivo viene raggiunto aumentando la “dimensione” dell’informazione tramite l’aggiunta di caratteri di controllo (detti anche ridondanza) legati all’informazione vera e propria da regole (generalmente di tipo matematico) che permettono di verificare l’integrità del messaggio. In altre parole, se lo spazio dell’informazione che si sta considerando è Qr allora affinché un codice C ⊂ Qn (con r ≤ n) sia utilizzabile è necessario fornire due funzioni biiettive dette codifica e decodifica γ : Qr → C δ : C → Qr tali che δ ◦ γ = idQr . La funzione di codifica si dice sistematica se esiste un insieme di indici i1 , . . . , ir tali che γ (v1 · · · vr )ij = vj per ogni j = 1, . . . , r. Ciò sostanzialmente vuol dire che all’interno di una parola del codice ci sono alcune coordinate che contengono, tale e quale, tutta l’informazione. In tal caso è ovvio che la funzione di decodifica è semplicemente la proiezione sulle coordinate i1 , . . . , ir . Sono inoltre necessarie due funzioni ed : Qn → {0, 1} ec : Qn → C La prima (error detection) dice se si sono verificati errori nella trasmissione e, per far ciò, si usano le proprietà matematiche che caratterizzano la ridondanza; come funzione matematica, ed si riduce alla funzione caratteristica dell’insieme C. La seconda (error correction) corregge gli errori eventualmente presenti; anche per ciò si usano le proprietà matematiche della ridondanza. Se v ∈ Qn è una parola ricevuta, il fatto che ed (v) = 0 ci assicura che nella trasmissione sono avvenuti degli errori. Per contro, il fatto che ed (v) = 1 non assicura che non siano avvenuti degli errori: potrebbero anche esserci stati alcuni errori che modificano la parola di partenza in un’altra parola del codice ma diversa da quella di partenza. Di pari passo, nel caso si applichi la funzione di correzione degli errori ec non si ha la sicurezza di recuperare la parola originaria, perché si potrebbe finire su una parola del codice diversa da quella di partenza. CAPITOLO 1. NOZIONI BASE SUI CODICI 4 Detto ciò, è necessario avere comunque un principio che ci guidi nel decidere che fare della parola ricevuta v: lasciarla inalterata o fornire una correzione. La scelta più spontanea è: se v ∈ C, lasciarla inalterata, cioè assumere che non si siano verificati errori nella trasmissione; se v ∈ / C, correggere v con una parola del codice u tale che d (u, v) = min {d (y, v) | y ∈ C} . (1.4) Questo principio che guida la scelta dell’elemento del codice con cui correggere la parola ricevuta è chiamato principio di massima verosimiglianza. Naturalmente, nel caso in cui ci sia più di una parola del codice che realizza il minimo di cui sopra, si pone il problema di quale parola del codice scegliere tra quelle che realizzano tale minimo ma risulta difficile enunciare un principio generale per questo caso: in genere, quando si verifica questa condizione l’algoritmo di correzione restituisce un codice di errore. In base a queste considerazioni, si capisce perché sia necessario, nei casi concreti, assumere che nel corso della trasmissione siano avvenuti al più un certo numero di errori e perché, nel corso della progettazione di un codice per un uso specifico, sia necessario avere una stima realistica della quantità di errori che possono verificarsi sul canale di trasmissione che si prevede di utilizzare. Il teorema 1.16 dice quanti errori ci si può aspettare di individuare e correggere in funzione dei parametri del codice. Osservazione 1.3. Spesso viene usato il termine “decodifica” per riferirsi al complesso delle operazioni necessarie all’individuazione e alla correzione degli errori. Inoltre, la funzione ec può essere considerata più in generale come una funzione di verifica, cioè una funzione che data una parola ci dice se essa appartiene al codice o meno. Esempio 1.4. Codice di ripetizione1 Descrizione: Individua e corregge un errore. Alfabeto: F2 = {0, 1}. Lunghezza: 3. Tasso di informazione: 1/3. Parole del codice: C = {000, 111}. Distanza minima: 3. Funzione di codifica: F2 → F32 i 7→ iii Controllo: sia R = (ijk) la parola ricevuta. Verificare se i = j = k. Correzione: Se i = j = k allora non ci sono stati errori, altrimenti si è avuto un errore: in tal caso, cambiare il bit diverso dagli altri due. 1 È immediato estendere il codice di ripetizione ad un codice di ripetizione di una lunghezza qualsiasi su un alfabeto qualsiasi. CAPITOLO 1. NOZIONI BASE SUI CODICI 5 Decodifica: F32 → F2 iii 7→ i N.B.: in realtà, se i = j = k possono anche essersi verificati 3 errori, così come nel caso contrario possono essersi verificati 2 errori: non c’è però modo di evincere ciò dalla parola ricevuta. È questo il motivo per cui è necessario fare l’ipotesi di lavoro che si sia verificato al più un errore. Osservazione 1.5. La correzione degli errori sostanzialmente richiede di partizionare lo spazio M in sottoinsiemi in modo tale che ogni sottoinsieme contenga un’unica parola del codice: M= . [ Mv ; v∈C alla ricezione di una parola w si va a vedere in quale insieme Mv della partizione appartiene w e si assume che la parola inviata sia v. Si tratta quindi di determinare una opportuna partizione: ciò può essere fatto in molti modi, come per esempio in 4.1 o 4.1. Un altro modo è quello di usare le palle centrate nelle parole del codice e di raggio t, a patto che t sia tale che due palle distinte non abbiano intersezione. Queste palle ricoprono M esattamente quando il codice è perfetto; se il codice non è perfetto, resta una parte dello spazio M non ricoperta: se la parola ricevuta è in questa “zona grigia”, allora la funzione di correzione degli errori deve rilevare ciò restituendo un codice di errore. 1.2 Prime proprietà Metrica del codice Per prima cosa, verifichiamo che la distanza di Hamming è realmente una distanza in Qn . Proposizione 1.6. Per ogni v, y, z ∈ Qn valgono le proprietà 1. d (v, y) ≥ 0 e d (v, y) = 0 ⇔ v = y; 2. d (v, y) = d (y, v); 3. d (v, y) ≤ d (v, z) + d (z, y) (disuguaglianza triangolare). Dimostrazione. Le prime due proprietà sono ovvie. Per la disuguaglianza triangolare basta osservare che {i : vi 6= yi } ⊆ {i : vi 6= zi } ∪ {i : zi 6= yi } e pertanto d (v, y) = |{i : vi 6= yi }| ≤ |{i : vi 6= zi } ∪ {i : zi 6= yi }| = |{i : vi 6= zi }| + |{i : zi 6= yi }| − |{i : vi 6= zi } ∩ {i : zi 6= yi }| ≤ |{i : vi 6= zi }| + |{i : zi 6= yi }| = d (v, z) + d (z, y) CAPITOLO 1. NOZIONI BASE SUI CODICI 6 Calcoliamo adesso il “volume” della palla di raggio r: Proposizione 1.7. Sia v ∈ Qn e r un intero positivo. Si ha: ( qn n |S (v, r)| = Vq (r) = Pr i n i=0 i (q − 1) se r ≥ n se r ≤ n Dimostrazione. Se r ≥ n allora S (v, r) = Qn e la tesi segue. Sia ora r ≤ n. Osserviamo che la “palla” è l’unione disgiunta delle “sfere”: S (v, r) = r [ {y ∈ Qn : d (v, y) = i} i=0 e pertanto |S (v, r)| = r X |{y ∈ Qn : d (v, y) = i}| ; i=0 0 n 0 d’altra parte, {v ∈ Q : d (v, v ) = i} è l’insieme delle parole che differiscono da v in esattamente i posizioni: tali posizioni possono essere scelte in ni e in ogni posizione il corrispondente elemento di v 0 può essere scelto in q − 1 modi distinti, pertanto n i 0 n 0 (q − 1) |{v ∈ Q : d (v, v ) = i}| = i da cui la tesi. Si osservi che per r ≥ n si ha dipende da v. Pr i=0 n i i (q − 1) = q n ; in particolare, il volume della palla non Proposizione 1.8. Un (n, M, d)-codice è perfetto se, e solo se, le palle di raggio d−1 centrate 2 nelle parole del codice formano un ricoprimento disgiunto di Qn . Dimostrazione. Innanzi tutto osserviamo che se v, v 0 ∈ C allora S v, d−1 ∩S v 0 , d−1 = ∅: 2 2 d−1 infatti se fosse y ∈ S v, 2 ∩ S v 0 , d−1 allora 2 d−1 d−1 d ≤ d (v, v 0 ) ≤ d (v, y) + d (y, v 0 ) ≤ + ≤ d − 1. 2 2 A questo punto, l’equivalenza segue dal fatto che l’unione di tutte le palle considerate ha Pb d−1 c n i cardinalità M · i=02 i (q − 1) e dalla definizione di codice perfetto. Relazioni tra i parametri Esistono molte relazioni tra i parametri n, M e d di un codice: vediamo alcune disuguaglianze fondamentali. Sia C un (n, M, d)-codice q-ario. Per definizione, M ≤ Aq (n, d). Teorema 1.9 (Disuguaglianza di Singleton). Aq (n, d) ≤ q n−d+1 . Nel caso lineare, questa disuguaglianza si riduce a k ≤ n − d + 1. CAPITOLO 1. NOZIONI BASE SUI CODICI 7 Dimostrazione. Consideriamo l’applicazione C → Qn−d+1 v1 v2 . . . vn 7→ v1 v2 . . . vn−d+1 Dato che la distanza minima tra due parole del codice è d, quest’applicazione è iniettiva, da cui la tesi. Teorema 1.10 (Disuguaglianza di Hamming). Posto e = d−1 si ha 2 Aq (n, d) ≤ qn . (e) Vqn Dimostrazione. Basta osservare che se v e v 0 sono due distinte parole del codice allora S (v, e) ∩ S (v 0 , e) = ∅, pertanto l’unione [ S (v, e) v∈C è disgiunta e quindi X [ |S (v, e)| S (v, e) = v∈C v∈C X = Vqn (e) = M · Vqn (e) ≤ q n v∈C da cui si ricava la tesi. Teorema 1.11 (Disuguaglianza di Gilbert-Varshamov). Vqn qn ≤ Aq (n, d) . (d − 1) Dimostrazione. Sia C un (n, M, d)-codice ottimale, cioè M = |C| = Aq (n, d): per definizione, ogni parola in Qn ha distanza minore di d da almeno una parola di C, altrimenti aggiungendo tale parola si otterrebbe un codice più grande con la stessa lunghezza e la stessa distanza minima, contro la definizione di ottimalità. Questo vuol dire che [ Qn = S (v, d − 1) v∈C da cui qn ≤ X |S (v, d − 1)| v∈C ≤ X Vqn (d − 1) v∈C ≤ Vqn (d − 1) Aq (n, d) e quindi la tesi. CAPITOLO 1. NOZIONI BASE SUI CODICI 8 Teorema 1.12 (Disuguaglianza di Plotkin). 1. Se d è pari e 2d > n allora d A2 (n, d) ≤ 2 ; 2d − n 2. se d è dispari e 2d + 1 > n allora A2 (n, d) ≤ 2 d+1 ; 2d + 1 − n 3. se d e pari allora A2 (2d, d) ≤ 4d; 4. se dè dispari allora A2 (2d + 1, d) ≤ 4d + 4. (Senza dimostrazione) Prime applicazioni Già queste poche nozioni sono sufficienti per ottenere alcune informazioni sull’esistenza di un codice e sulle sue proprietà di scoperta e correzione di errori. I seguenti due lemmi hanno dimostrazione ovvia a partire dalla definizione. Proposizione 1.13. 1. Siano C, C 0 = α (C) due codici equivalenti e siano v, y ∈ C; allora d (v, y) = d = (α (v) , α (y)) . In particolare, le distanze minime coincidono. 2. Se C è un codice e v ∈ Qn , allora esiste un codice C 0 equivalente a C tale che v ∈ C 0 . Dimostrazione. Banale. Proposizione 1.14. Un (n, M, d)-codice C che corregge t errori scopre almeno t errori. Dimostrazione. Sia v ∈ C. Dal fatto che C corregge t errori segue che ∃!w : w ∈ C ∩ S (v, t) ; ma chiaramente v ∈ S (v, t) , pertanto C ∩ S (v, t) = {v} . Proposizione 1.15. Un (n, M, d)-codice C corregge t errori se, e solo se, ∀v, y ∈ C (v 6= y ⇒ S (v, t) ∩ S (y, t) = ∅) . Dimostrazione. Siano v, y ∈ C due distinte parole del codice; allora S (v, t) ∩ S (y, t) 6= ∅ ⇐⇒ ∃w ∈ Qn tale che v, y ∈ S (w, t) . Teorema 1.16. Sia C un (n, M, d)-codice. 1. C scopre s errori se, e solo se, d ≥ s + 1. (1.5) CAPITOLO 1. NOZIONI BASE SUI CODICI 9 2. C corregge t errori se, e solo se, d ≥ 2t + 1. In altre parole, un (n, M, d)-codice scopre fino a d − 1 errori e corregge fino a d−1 2 errori. Dimostrazione. 1. Dire che C scopre s errori è la stessa cosa che dire che se si considera una parola v ∈ C allora non è possibile modificare v in al più s posizioni ed ottenere ancora una parola di C, vale a dire che per ogni v ∈ C si ha che S (v, s) ∩ C = {v}, che è la stessa cosa che dire che la distanza minima del codice è maggiore o uguale a s + 1. 2. Supponiamo prima che d ≥ 2t + 1. Sia w una parola qualsiasi in cui ci sono al più t errori. Dire che C è in grado di correggere tali errori vuol dire che nella palla di centro w e raggio t esiste un’unica parola del codice: |S (w, t) ∩ C| = 1. Supponiamo per assurdo che esistano due parole distinte v, y ∈ C tali che v, y ∈ S (w, t) ∩ C. Applicando la disuguaglianza triangolare si ha d (v, y) ≤ d (v, w) + d (w, y) ≤ t + t = 2t, contro l’ipotesi. Viceversa, supponiamo che d ≤ 2t e siano v, y due differenti parole del codice che distano tra loro d. Grazie alla proposizione 1.13, senza perdere di generalità, possiamo supporre che le coordinate in cui le due parole differiscono sono le prime 2t, pertanto se v = v1 . . . vn e y = y1 . . . yn allora vi = yi per i > 2t. Definiamo w = w1 . . . wn tramite ( vi se i ≤ t wi = yi se i > t Con questa definizione, si ha v, y ∈ B (w, t), pertanto C non è in grado di correggere t errori. Osservazione 1.17. Supponiamo che C sia un codice che riesce a correggere fino a t errori; sia v la parola del codice inviata e w la parola ricevuta. Se d (v, w) ≤ t, la funzione di correzione degli errori è in grado di ricostruire correttamente v a partire da w, usando il fatto che v è l’unica parola di C nella palla di centro w e raggio t. Nel caso in cui durante una trasmissione avvengano più di t errori, si possono verificare due casi: 1. nella palla di centro w e raggio t non c’è nessuna parola del codice: S (w, t) ∩ C = ∅ (ciò è possibile solo se C non è perfetto). In questo caso, la funzione di correzione deve restituire un codice di errore; 2. nella palla di centro w e raggio t c’è una parola del codice: S (w, t) ∩ C = {u}. In realtà, u non è la parola del codice v che è stata inviata, ma questo la funzione di correzione non può saperlo e quindi corregge w restituendo u dato che d (w, u) ≤ t partendo dal presupposto errato che siano avvenuti al più t errori. Si capisce che non può esservi rimedio a questo equivoco. Come già osservato, è questo il motivo per cui siamo costretti a fare l’ipotesi di lavoro che nella trasmissione si siano verificati al più t errori. Esempio 1.18. Se nel codice di ripetizione 1.4 viene spedita la parola v = 000 ma si verificano due errori e si riceve la parola w = 101, allora w viene corretta, erroneamente, in u = 111. Proposizione 1.19. La minima distanza di un codice perfetto è dispari. CAPITOLO 1. NOZIONI BASE SUI CODICI 10 Dimostrazione. Supponiamo che C sia un (n, M, d)-codice perfetto con d = 2e + 2. Si ha che d−1 = e. 2 Fissiamo una parola del codice v e modifichiamola nelle prime e + 1 posizioni in modo da avere una parola w tale che d (v, w) = e + 1; per costruzione, w ∈ / S (v, e). Sia ora y un’altra parola del codice. Si ha d (v, y) ≥ 2e + 2 e quindi, per la disuguaglianza triangolare, 2e + 2 ≤ d (v, y) ≤ d (v, w) + d (w, y) = e + 1 + d (w, y) e, pertanto, d (w, y) ≥ e + 1, cioè w ∈ / S (y, e). In definitiva, [ w∈ / S (v, e) , v∈C contro la proposizione 1.8. Teorema 1.20. Sia d un numero intero positivo pari. Esiste un (n, M, d)-codice binario se, e solo se, esiste un (n − 1, M, d − 1)-codice binario. In particolare, A2 (n, d) = A2 (n − 1, d − 1) . Dimostrazione. (⇒) Sia C un (n, M, d)-codice binario e siano c, c0 ∈ C tali che d (c, c0 ) = d. Scegliamo una posizione i in cui essi differiscono. Posto Q = {0, 1}, consideriamo l’applicazione ∼ f : Qn → Qn−1 v1 . . . vn 7→ v1 . . . vi−1 vi+1 . . . vn È chiaro che ( d (f (v) , f (y)) = d (v, y) d (v, y) − 1 se vi = yi se vi = 6 yi ed inoltre la funzione f è iniettiva su C, dato che d ≥ 2; pertanto il codice f (C) così ottenuto è un (n − 1, M, d − 1)-codice. (⇐) Sia C un (n − 1, M, d − 1)-codice binario. Definiamo ∼ f : Qn−1 → Qn v1 . . . vn−1 7→ v1 . . . vn−1 δv dove δv = n−1 X vi i=0 Chiaramente f (C) ha lunghezza n e, essendo f iniettiva, ha dimensione M. Resta da vedere la distanza minima. Se v, y ∈ Qn , si ha d (f (v) , f (y)) = d (v, y) + δv,y dove δv,y = δv + δy pertanto d (f (C)) ≥ d (C) = d − 1. Osserviamo che è facile verificare che δv,y = # {i tale che vi 6= yi } . CAPITOLO 1. NOZIONI BASE SUI CODICI 11 Se prendiamo ora c, c0 ∈ C tali che d (c, c0 ) = d (C) = d − 1, abbiamo che d (f (c) , f (c0 )) = d (c, c0 ) + δc,c0 ≤ d − 1 + 1 = d. In definitiva, sappiamo che d (f (C)) ∈ {d − 1, d} . D’altra parte, ( 0 se v e y differiscono in un numero pari di posizioni δv,y = 1 se v e y differiscono in un numero dispari di posizioni pertanto d (f (v) , f (y)) deve essere un numero pari e quindi d (f (C)) = d. 1.3 Costruzione di codici nuovi da codici vecchi Ci sono alcune tecniche standard che permettono di costruire nuovi codici a partire da codici dati: vediamone alcune. Perforazione Sia C un (n, M, d)-codice su Q e sia T ={i1 , . . . , it } un insieme di indici; la perforazione C T di C è il sottoinsieme di Qn−t che si ottiene prendendo le parole di C e cancellando in ognuna le coordinate i1 , . . . , it . Osservazione 1.21. Supponiamo T = {i}; se la distanza minima d è maggiore di 1, allora T C = |C| e d C T ( d = d−1 se C ha una parola di peso minimo con la i -esima coordinata non nulla; altrimenti. Accorciamento Sia T ={i1 , . . . , it } un insieme di indici e Qt = (q1 , . . . , qt ) una t-upla di simboli di Q; consideriamo il sottocodice C (T, Qt ) = v = v1 . . . vn ∈ C : vij = qj ∀j = 1, . . . , t . L’accorciamento CT,Qt di C su T è la perforazione su T del sottocodice C (T, Qt ), cioè CT = T C (T, Qt ) . Somma diretta Siano C1 e C2 , rispettivamente, un (n1 , M1 , d1 )-codice ed un (n2 , M2 , d2 )-codice su Q. Se v 0 = v10 . . . vn0 1 ∈ C1 e v 00 = v100 . . . vn002 ∈ C2 , la concatenazione di v 0 e v 00 è data dalla parola 0 00 (v , v ) = v10 . . . vn0 1 v100 . . . vn002 ∈ Qn1 +n2 . La somma diretta di C1 e C2 è il codice C1 ⊕ C2 = (v 0 , v 00 ) ∈ Qn1 +n2 : v 0 ∈ C1 , v 00 ∈ C2 . Nel caso in cui Q ha qualche tipo di struttura algebrica le costruzioni possono essere descritte anche tramite tale struttura e se ne possono definire altre. Un caso di questo tipo molto importante è quello dei codici lineari. Sia dunque Q = Fq e C un [n, k, d]-codice su Fq . CAPITOLO 1. NOZIONI BASE SUI CODICI 12 Accorciamento (caso lineare) Sia T ={i1 , . . . , it } un insieme di indici e consideriamo il sottocodice C (T ) = v = v1 . . . vn ∈ C : vij = 0 ∀j = 1, . . . , t . T L’accorciamento CT di C su T è la perforazione su T del sottocodice C (T ), cioè CT = C (T ) . Estensione Il codice esteso Ĉ è il codice definito da Ĉ = v1 . . . vn+1 ∈ Fn+1 : v1 . . . vn ∈ C ∧ v1 + · · · + vn + vn+1 = 0 . q Codice duale Indichiamo con v · y il prodotto scalare standard di due vettori di Fnq : v · y = v1 y1 + · · · + vn yn . Il codice duale C ⊥ è definito come C ⊥ = y ∈ Fnq : v · y = 0 ∀v ∈ C . La costruzione (C1 , C2 ) Siano C1 e C2 , rispettivamente, un [n, k1 , d1 ]-codice ed un [n, k2 , d2 ]-codice su Fq . Il codice (C1 |C2 ) è definito come (C1 |C2 ) = (u, u + v) ∈ F2n q : u ∈ C1 ∧ v ∈ C2 . Capitolo 2 Codici lineari Nel seguito C sarà sempre un [n, k, d]-codice lineare su un campo finito Fq , cioè un Fq sottospazio vettoriale di dimensione k dello spazio vettoriale Fnq . Per brevità, useremo sempre la notazione K = Fq , V = Fnq = K n . 2.1 Prime proprietà Nel caso dei codici lineari, la distanza è strettamente legata al concetto di peso. Definizione 2.1. Se v = v1 . . . vn ∈ V il peso w (v) di v è il numero delle sue coordinate non nulle: w (v) = |{i : vi 6= 0}| . Il peso minimo di C è il minimo dei pesi delle parole non nulle di C: w (C) = min {w (v) : v ∈ C ∧ v 6= 0} . Proposizione 2.2. Siano v, y, z ∈ V, α ∈ K ∗ ; allora 1. d (v + z, y + z) = d (v, y); 2. d(αv, αy) = d (v, y); 3. d (v, y) = d (v − y, 0) = w (v − y); 4. d (C) = w (C). Dimostrazione. Esercizio. Essendo un sottospazio vettoriale, C è completamente determinato da una sua base: ciò ci permette di di contare quanti [n, k]-codici distinti esistono. Proposizione 2.3. Il numero di basi ordinate di C è q k − 1 q k − q · · · q k − q k−1 . Dimostrazione. Per costruire una base ordinata v 1 , . . . , vk di C possiamo scegliere a piacere 2 1 v 1 in C \ {0}, poi possiamo 1 2 scegliere a piacere v in C \ v , successivamente possiamo scegliere 3 a piacere v in C \ v , v e così via. 13 CAPITOLO 2. CODICI LINEARI 14 La prima scelta può essere operata in q k − 1 modi, la seconda in q k − q modi, la terza in q − q 2 modi e così via. Da ciò, segue la formula. k Proposizione 2.4. Il numero degli [n, k]-codici distinti (q n − 1) q n−1 − 1 · · · q n−k+1 − 1 . (q k − 1) (q k−1 − 1) · · · (q − 1) Dimostrazione. Dobbiamo contare quanti sono i sottospazi di V di dimensione k. Contando come prima, il numero di k-uple (ordinate) di vettori linearmente indipendenti di V è dato da (q n − 1) (q n − q) · · · q n − q k−1 . Ogni tale k-upla individua un sottospazio di dimensione k e ogni tale sottospazio ha lo stesso numero di basi, vale a dire q k − 1 q k − q · · · q k − q k−1 , per la proposizione precedente. Il numero di sottospazi distinti è quindi il quoziente di questi due numeri, cioè la tesi. Proposizione 2.5. Siano C, C 0 , C1 , C2 codici lineari con parametri, rispettivamente, [n, k, d], [n, k 0 , d0 ], [n1 , k1 , d1 ], [n2 , k2 , d2 ] e T un insieme di indici; allora i codici C T , CT , Ĉ, C ⊥ , C1 ⊕C2 e (C|C 0 ) sono tutti lineari. Inoltre dim C ⊥ = n − k; ⊥ C ⊥ = C; C⊥ C⊥ T T = CT ⊥ ; ⊥ = (CT ) ; h i i parametri di Ĉ sono n + 1, k, dˆ con dˆ ∈ {d, d + 1}; se T = {i}, allora i parametri di C T sono . se d > 1 • [n − 1, k, d − 1] se C ha una parola di peso minimo con la i-esima coordinata non nulla; • [n − 1, k, d] altrimenti . se d = 1 • [n − 1, k − 1, d0 ] con d0 ≥ 1 se C ha una parola di peso 1 con la i-esima coordinata non nulla; • [n − 1, k, 1] altrimenti; se T = {i} la distanza minima di CT è maggiore o uguale a quella di C; i parametri di C1 ⊕ C2 sono [n1 + n2 , k1 + k2 , min {d1 , d2 }]; i parametri di (C|C 0 ) sono [2n, k + k 0 , min {2d, d0 }]. CAPITOLO 2. CODICI LINEARI 15 Dimostrazione. La maggior parte delle affermazioni sono banali o ben note in algebra lineare: vediamo quindi solo le affermazioni meno ovvie. ⊥ ⊥ C ⊥ T = C T : vediamo per prima l’inclusione C ⊥ T ⊆ C T . Sia v ∈ V e indichiamo con v ∗ il vettore ottenuto cancellando le coordinate in T. v ∗ ∈ C ⊥ T è equivalente a dire che v · y = 0 per ogni y ∈ C e che in tutti gli indici in T il valore della corrispondente coordinata di ⊥ v è 0. Da ciò segue anche v ∗ · y ∗ = 0 e quindi v ∗ ∈ C T . ⊥ Viceversa, sia ṽ ∈ C T . Questo vuol dire che ṽ · y ∗ = 0 per ogni y ∗ ∈ C T . Costruiamo adesso v ∈ V mettendo 0 nelle coordinate indicate in T e i valori delle rispettive coordinate di ṽ nelle altre, in modo che v ∗ = ṽ. In questo modo se y ∈ C si ha v · y = v ∗ · y ∗ = ṽ · y ∗ =0, quindi v ∈ C ⊥ ; inoltre le coordinate in T di v sono 0 per costruzione, pertanto v ∗ = ṽ ∈ C ⊥ T . La successiva è simile. (C|C 0 ) è un [2n, k + k 0 , min {2d, d0 }]-codice: che la lunghezza delle parole sia 2n segue dalla definizione. Sia v1 , . . . , vk una base di C e sia v10 , . . . , vk0 0 una base di C 0 . È facile verificare che (v1 , v1 ) , . . . , (vk , vk ) , (0, v10 ) , . . . , (0, vk0 0 ) è una base di (C|C 0 ). Siano ora v ∈ C e v 0 ∈ C 0 , in modo che (v, v + v 0 ) ∈ (C|C 0 ). Se v 0 = 0 allora w ((v, v)) = 2w (v) ≥ 2d; notiamo che vale l’uguaglianza se v (non nullo) è di peso minimo in C. Per contro, se v = 0 allora w (0, v 0 ) ≥ d0 e, nuovamente, vale l’uguaglianza per qualche v 0 . Da ciò, la tesi. 2.2 Codici lineari equivalenti Nella definizione di equivalenza tra codici data in 1.1, il fatto di ammettere tutte le permutazioni dei simboli in una coordinata fissata non ci permette di mantenere la linearità di un codice. Esempio 2.6. Sia C = {00, 11, 22} ⊆ F23 e applichiamo la permutazione σ = (0, 1, 2) alla seconda coordinata: il codice {01, 12, 20} che si ottiene in questo modo non è lineare. Se ci interessa mantenere la proprietà di linearità nell’equivalenza è quindi necessario restringere la definizione. Definizione 2.7. Due codici lineari di lunghezza n si dicono equivalenti se si ottengono l’uno dall’altro mediante operazioni del seguente tipo: 1. applicazione di una permutazione di {1, . . . , n} alle coordinate di tutte le parole del codice; 2. moltiplicazione per uno scalare di una coordinata fissata in tutte le parole del codice. Questa definizione ci induce a considerare tutte le trasformazioni di V definite nello stesso modo. Definizione 2.8. Un’applicazione f : V → V si dice trasformazione monomiale se esistono n costanti non nulle d1 , . . . , dn ∈ F∗q e una permutazione σ ∈ Sn tali che f (v1 , . . . , vn ) = d1 vσ(1) , . . . , dn vσ(n) . CAPITOLO 2. CODICI LINEARI 16 È facile vedere che una trasformazione monomiale è un’applicazione lineare e la matrice che la rappresenta è del tipo SD, dove S è una matrice di permutazione e D è una matrice diagonale invertibile. Ricordiamo che un’isometria è un automorfismo lineare di V che conserva la distanza: d (f (y) , f (z)) = d (y, z) ∀y, z ∈ V. Equivalentemente, w (f (v)) = w (v) per ogni v ∈ V . Proposizione 2.9. Una trasformazione lineare f : V → V è un’isometria se, e solo se, è una trasformazione monomiale. Dimostrazione. Chiaramente una trasformazione monomiale è un’isometria. Sia f un’isometria e sia {e1 , . . . , en } la base canonica di V = Fnq . Dato che w (f (ei )) = w (ei ) = 1, si deve avere f (ei ) = di eσ(i) per qualche di ∈ Fq e σ (i) ∈ {1, . . . , n}. Dato che f è invertibile, ne segue che di è non nullo per ogni i e inoltre i 7→ σ (i) è una permutazione. Siano C1 , C2 ⊂ V due codici lineari e f : V → V un’isometria. Per quanto visto, se f (C1 ) = C2 allora i due codici sono equivalenti. È vero anche il viceversa. Teorema 2.10 (di estensione). Siano C1 , C2 ⊂ V due codici lineari e f : C1 → V un’applicazione lineare tale che f (C1 ) = C2 . Se w (f (v)) = w (v) per ogni v ∈ C1 , allora f può essere estesa ad una isometria di V . Dimostrazione. f è iniettiva, pertanto C1 e C2 hanno la stessa dimensione. Siano y ∈ V \ C1 e z ∈ V \ C2 . Definiamo f1 : C1 ⊕ Fq y → C2 ⊕ Fq z v + ky 7→ f (v) + kz È evidente che f1 è un’applicazione lineare in V che conserva il peso e tale che f1 |C1 = f . Continuando ad estendere iterativamente in questo modo, dopo n − dim C1 passi si ha la tesi. 2.3 Matrice generatrice e matrice di controllo Un codice C è un sottospazio vettoriale (di dimensione k) di V pertanto può essere descritto in due modi fondamentali: in modo esplicito, come combinazione lineare di una base; in modo implicito, come l’insieme delle soluzioni di un sistema di equazioni lineari. Per esprimere il codice esplicitamente abbiamo bisogno di una base v 1 , . . . , v k di C ed ogni altro vettore di C si esprimerà in modo unico come combinazione lineare di questi vettori: ∀v ∈ C∃!λ1 , . . . , λk ∈ Fnq | v = λ1 v 1 + · · · + λk v k . (2.1) Naturalmente, le coordinate (λ1 , . . . , λk ) di v sono riferite alla base v 1 , . . . , v k di C. Se in V è data una base B e vogliamo esprimere i vettori di C relativamente alla base di V allora dobbiamo esprimere ogni v i in funzione della base B: v i = v1i , . . . , vni . La formula (2.1) ci permette di scrivere v in funzione della base B: se indichiamo con G la matrice k × n in cui al CAPITOLO 2. CODICI LINEARI 17 posto (i, j) troviamo vji allora le coordinate di v nella base B sono date dal vettore (λ1 , . . . , λk )G. Osserviamo che la funzione Kk → Kn = V (λ1 , . . . , λk ) 7→ (λ1 , . . . , λk )G è una funzione di codifica per C. Definizione 2.11. La matrice G è detta matrice generatrice del codice C. Pertanto, la matrice generatrice di un [n, k]-codice è una matrice k×n le cui righe sono una base del sottospazio vettoriale C. Una matrice generatrice G per un [n, k]-codice C si dice in forma standard se è della forma G = [Ik |A], dove Ik è la matrice identità di dimensione k e A è una matrice k × (n − k). Osservazione 2.12. Una matrice generatrice in forma standard è particolarmente comoda, dato che fornisce una codifica sistematica: se (λ1 , . . . , λk ) è l’informazione da codificare, allora nella codifica si ha (λ1 , . . . , λk ) 7→ (λ1 , . . . , λk )G = (λ1 , . . . , λk , vk+1 , . . . , vn ) per qualche vk+1 , . . . , vn e quindi l’informazione è presente in modo esplicito nella parola codificata. Ciò ovviamente rende anche immediata l’operazione di decodifica. Se invece la matrice generatrice non è in forma standard, per effettuare la decodifica si deve risolvere il sistema lineare n × k dato da v1 x1 .. . G ... = . . .. xk vn Esempio 2.13. Sia C il [4, 2, 2]-codice binario generato da 1011 e 0101, cioè C = {0000, 1011, 0101, 1110} . Una matrice generatrice di C è G= 1 0 0 1 1 0 1 . 1 Descrivere C in modo implicito significa invece vedere C come l’insieme delle soluzioni di un sistema lineare omogeneo; dall’algebra lineare sappiamo che se H è la matrice che individua il sistema lineare di equazioni la dimensione di {v ∈ V | Hv tr = 0} è n − rk H, pertanto H deve essere una matrice di rango n − k. Per quanto visto nella sezione 2.2, cercare un’equivalenza tra due codici è la stessa cosa che cercare un’isometria dello spazio vettoriale V in se stesso che mandi un codice nell’altro, pertanto la descrizione di un codice tramite le matrici permette di ricondurre il problema dell’equivalenza di due codici a ben note tecniche di algebra lineare. Richiamiamo le operazioni fondamentali di riga e colonna sulle matrici: R1 permutazione di due righe; R2 moltiplicazione di una riga per uno scalare non nullo; R3 somma di una riga con un multiplo scalare di un’altra; CAPITOLO 2. CODICI LINEARI 18 C1 permutazione di due colonne; C2 moltiplicazione di una colonna per uno scalare non nullo; C3 somma di una colonna con un multiplo scalare di un’altra. Dai teoremi dell’algebra lineare riguardanti la rappresentazione delle applicazioni lineari tramite matrici abbiamo che Teorema 2.14. Due matrici sono le matrici generatrici (oppure le matrici di controllo di parità) per lo stesso codice se, e solo se, si ottengono l’una dall’altra con un numero finito di operazioni di tipo R1, R2 ed R3. Due matrici sono le matrici generatrici (oppure le matrici di controllo di parità) per due codici equivalenti se, e solo se, si ottengono l’una dall’altra con un numero finito di operazioni di tipo R1, R2, R3, C1 C2. Dimostrazione. Un codice C è un sottospazio di K n di dimensione k, cioè è l’immagine di un’applicazione lineare iniettiva γ : K k ,→ K n (i.e., la funzione di codifica). Fissiamo in K n , una volta per tutte, la base canonica e indichiamo le coordinate dei vettori rispetto a tale base con dei vettori riga; con tale notazione la matrice generatrice G è la matrice che rappresenta l’applicazione lineare γ rispetto alla base canonica di K k , cioè se u ∈ K k ha coordinate (u1 , . . . , uk ) allora γ (u) = v dove v è il vettore di coordinate (u1 , . . . , uk ) G. In questo contesto, la composizione di operazioni di riga sulla matrice generatrice di C può essere considerata come un cambiamento di base in K k pertanto, fissata la base canonica in K n , effettuando operazioni di riga sulla matrice generatrice non si cambiano le coordinate di un vettore di K n rispetto alla base fissata e quindi facendo solo operazioni di righe si trova una nuova matrice generatrice per il codice considerato. Continuando a mantenere fissata la base canonica di K n , la composizione di operazioni di colonna su G (o, equivalentemente, la moltiplicazione a destra per una matrice n × n invertibile) può essere interpretata come un’applicazione lineare f : K n → K n (scegliendo la base canonica anche nel codominio) e, per la proposizione 2.9, tale applicazione è un’isometria se, e solo se, si usano solo operazioni di tipo C1 e C2. L’immagine del codice sarà in questo caso equivalente al codice di partenza ma in generale diverso. Osservazione 2.15. Come detto, l’operazione di tipo C3 non è ammissibile perché, se usata, dà luogo ad un’applicazione lineare che non è un’isometria, pertanto trasforma il codice in un codice non equivalente: per esempio, i due codici binari C = {00, 10} e C 0 = {00, 11} hanno come matrici generatrici G = [1 0] e G0 = [1 1] che si ottengono l’una dall’altra con un’operazione C3, però non sono equivalenti perché hanno peso minimo diverso. Grazie a questo teorema, partendo da una matrice generatrice se ne può ottenere un’altra che abbia una forma standard. Proposizione 2.16. Sia G matrice generatrice per un [n, k]-codice C. Sono equivalenti: 1. G fornisce una codifica sistematica; 2. G si può ridurre in forma standard usando solo operazioni di tipo C1; 3. esiste un insieme di indici i1 , . . . , ik tali che le colonne Gij di G formano la matrice identità Ik . Dimostrazione. Segue dalle definizioni. CAPITOLO 2. CODICI LINEARI 19 Corollario 2.17. Ogni codice lineare ammette una codifica sistematica. Ogni codice lineare è equivalente ad un codice lineare avente matrice generatrice in forma standard. Dimostrazione. Si tratta semplicemente della classica eliminazione gaussiana. Notiamo che per ottenere ciò che ci interessa sono sufficienti le operazioni R1, R2, R3 e C1. Se si usano solo le operazioni R1, R2 ed R3 si ottiene una codifica sistematica del codice di partenza ma con matrice in forma non necessariamente standard. Se si ammette anche l’operazione C1 allora la matrice può essere ridotta in forma standard ma il codice si trasforma in un codice equivalente. Come osservato, un sottospazio di uno spazio vettoriale può anche essere descritto in forma implicita, come spazio delle soluzioni di un sistema lineare omogeneo. Questo punto di vista in teoria di codici conduce al concetto di controllo di parità. Definizione 2.18. Una matrice H di dimensione (n − k) × n e rango n − k è detta matrice di controllo della parità di C se è tale che C = {v ∈ V : Hv tr = 0} . Teorema 2.19. Sia C un codice lineare e G una sua matrice generatrice, H una matrice (n − k) × n; allora 1. v ∈ C ⊥ ⇔ Gv tr = 0 ⇔ vGtr = 0; 2. H è una matrice di controllo della parità di C se, e solo se, H è una matrice generatrice di C ⊥ ; 3. H è una matrice di controllo della parità di C se, e solo se, H ha rango n − k e GH tr = 0. Dimostrazione. Banale. Esempio 2.20. Sia C il [4, 2, 2]-codice binario generato da 1011 e 0101. C ⊥ ha dimensione 2; dato che 1101, 0111 ∈ C ⊥ allora C ⊥ = h1101, 0111i = {0000, 1101, 0111, 1010} . Una matrice generatrice di C ⊥ (e quindi una matrice di controllo della parità di C) è 1 1 0 1 H= . 0 1 1 1 Se un codice ha la matrice generatrice in forma standard diventa particolarmente semplice calcolare una matrice di controllo della parità: Teorema 2.21. Se la matrice generatrice di C è G = [Ik |A] allora la matrice H = [−Atr |In−k ] è una matrice di controllo della parità di C. Dimostrazione. È evidente che il rango di H è n − k ed è semplice verificare che GH tr = 0. Esempio 2.22. Sia C il [4, 2, 2]-codice binario generato da 1011 e 0101. Dato che la matrice 1 0 1 1 generatrice G = è in forma standard, senza calcolare C ⊥ e una sua base possiamo 0 1 0 1 subito concludere che una matrice di controllo di parità di C è 1 0 1 0 H= . 1 1 0 1 CAPITOLO 2. CODICI LINEARI 20 Dalla matrice di controllo di parità è possibile ricavare informazioni sulla distanza minima: Teorema 2.23. Sia C un [n, k]-codice con matrice di controllo della parità H. Allora C ha distanza minima almeno d se, e solo se, ogni insieme di d − 1 colonne di H è linearmente indipendente. Dimostrazione. (⇒) Siano H 1 , . . . , H n le colonne di H e supponiamo che d − 1 di esse siano dipendenti. Possiamo supporre che si tratti delle prime d − 1 colonne. Siano λ1 , . . . , λd−1 ∈ Fq non tutti nulli tali che λ1 H 1 + · · · + λd−1 H d−1 = 0. (2.2) Definiamo v = v1 . . . vn ∈ V tramite ( λi vi = 0 se i ≤ d − 1 altrimenti L’equazione (2.2) può essere riscritta come Hv t = 0 che, essendo H una matrice di controllo, implica v ∈ C, pertanto d (c) ≤ d − 1. (⇐) Se d (C) < d allora esiste una parola v ∈ C di peso minore di d. Dato che Hv tr = 0, ciò implica che le colonne di H relative agli indici di v con coordinata non nulla sono linearmente dipendenti. Corollario 2.24. Un codice lineare con matrice di controllo H ha distanza minima d se, e solo se, 1. ogni insieme di d − 1 colonne di H è linearmente indipendente; 2. esiste un insieme di d colonne di H linearmente dipendenti. In particolare, d (C) ≥ 2 se, e solo se, non ci sono colonne nulle. d (C) ≥ 3 se, e solo se, non ci sono due colonne l’una multipla dell’altra. 2.4 Codici di Hamming I codici di Hamming sono una famiglia di codici lineari che generalizza un codice di parametri [7, 4] ideato da R. Hamming ai Laboratori Bell nel 1950. Vediamo innanzi tutto la descrizione del codice originario, poi generalizzata. Esempio 2.25. Codice di Hamming [7, 4] Descrizione: Individua e corregge un errore. Alfabeto: F2 = {0, 1}. Lunghezza: 7. Dimensione: 4. CAPITOLO 2. CODICI LINEARI 21 Funzione di codifica: F42 → F72 u 7→ uG dove G è la matrice 1 1 1 0 G= 0 1 1 1 il che è equivalente a dire che il vettore 1 0 0 0 u= a 0 1 1 1 b 0 1 0 0 0 0 1 0 0 0 , 0 1 d c viene codificato con il vettore v= x dove y a z b c d x = a + b + d y =a+c+d z =b+c+d Tasso di informazione: 4/7. Parole del codice: 1110000 C= 1101001 1001100 1100110 1000011 1011010 0000000 0101010 0100101 1010101 0111100 1111111 0011001 0110011 0010110 0001111 Distanza minima: 3. Controllo: Sia e l’errore avvenuto nella trasmissione e r = v + e la parola ricevuta. Per costruzione v ∈ C se, e solo se, Hv tr = 0, dove H è la matrice di controllo di parità 1 0 1 0 1 0 1 H = 0 1 1 0 0 1 1 . 0 0 0 1 1 1 1 Il controllo avviene quindi calcolando Hrtr = H(v tr + etr ) = Hv tr + Hetr = Hetr . Correzione: Poiché si assume che d (r, v) ≤ 1, cioè che d (e, 0) ≤ 1, si ha: . Hrtr = 0 ⇔ r = 0 (non ci sono stati errori); . Hrtr = H i ⇔ e = ei , dove ei è l’i-esimo vettore della base canonica di F72 (e quindi c’è stato un errore nella posizione i). Decodifica: Avviene semplicemente per estrazione dei bit di informazione: 0 0 0 0 0 0 0 0 1 0 0 0 u = v 0 0 0 0 . 0 1 0 0 0 0 1 0 0 0 0 1 CAPITOLO 2. CODICI LINEARI 22 Osserviamo che la matrice generatrice non è in forma standard però è sufficiente una permutazione delle colonne per portarla in forma standard. Il vantaggio di avere la matrice in questa forma è dato dal fatto che la colonna H i della matrice di controllo H non è altro che l’espressione binaria di i. Grazie a ciò, non è necessario costruire una tabella delle sindromi per gli elementi direttori: se si è verificato un (solo) errore nella posizione i, possiamo ottenere l’indice i semplicemente calcolando il numero intero la cui espressione binaria è data dalle cifre del vettore Hrt . Proposizione 2.26. Il codice di Hamming [7, 4] è un codice perfetto. Dimostrazione. Nel caso del codice di Hamming i parametri del codice sono n = 7, M = 24 , d = 3 e q = 2, per cui la formula che definisce un codice perfetto, cioè d−1 bX 2 c n i (q − 1) = q n M· i i=0 diventa d−1 bX 1 2 c X n 7 i i 4 M· (q − 1) = 2 (2 − 1) = 24 (1 + 7) = 27 = q n . i i i=0 i=0 Il fatto che il codice sia perfetto dice che le sfere di raggio d−1 (cioè 1, in questo caso) 2 centrate nelle parole del codice ricoprono, senza intersezioni, tutte le parole possibili. È una proprietà di cui pochi codici possono fregiarsi: a parte i codici banali (codici con una parola o codici di ripetizione), nel 1973 è stato dimostrato che ogni codice perfetto non banale su un alfabeto di cardinalità potenza di un primo ha i parametri di un codice di Hamming oppure di un codice di Golay. r Per definire il codice di Hamming in generale, dato un vettore Pr−1 v = vi 1 . . . vr ∈ K consideriamo v come la rappresentazione q- aria del numero naturale i=0 vi+1 q . La cifra vr è detta cifra più significativa di tale numero. Definizione 2.27. Dati q ed r la matrice di Hamming Hq (r) è la matrice con r righe ed in cui le colonne sono i vettori v tr che rappresentano, da sinistra a destra, i numeri interi 1, 2, . . . in base q, limitatamente però a quei numeri che hanno 1 come cifra più significativa. Il codice di Hamming è quel codice Hq (r) che ha Hq (r) come matrice di controllo di parità. Un codice di Hamming q-ario con parametro r è un codice lineare su Fq equivalente a Hq (r). Teorema 2.28. 1. La matrice Hq (r) ha r righe e q r −1 q−1 colonne. 2. Le righe di Hq (r) sono linearmente indipendenti. 3. Due qualunque colonne di Hq (r) sono linearmente indipendenti ed esistono 3 colonne linearmente dipendenti. 4. Hq (r) è un codice perfetto con parametri n= qr − 1 , k = n − r, d = 3. q−1 CAPITOLO 2. CODICI LINEARI 23 5. Ogni codice lineare su K con gli stessi parametri di Hq (r) è (equivalente a) un codice di Hamming. Dimostrazione. 1. Dobbiamo solo calcolare il numero di colonne. Per ciò, osserviamo che, posto Vi = {v = v1 . . . vr : (vi = 1) ∧ (vj = 0 ∀j > i)} per i = 1, . . . , r, si ha che |Vi | = q i−1 . Dato che al variare di tutti gli indici i = 1, . . . , r i (trasposti dei) vettori di Vi formano tutte le colonne di Hq (r), si ha che il numero di tali colonne è r X q i−1 = i=1 r−1 X i=0 qi = qr − 1 . q−1 2. È sufficiente osservare che nell’insieme Vi appena definito è presente il vettore 0 . . . 010 . . . 0 in cui 1 compare in i-esima posizione, pertanto la matrice identità r × r è una sottomatrice di Hq (r) e quindi le righe sono linearmente indipendenti. 3. Dire che due vettori sono indipendenti è la stessa cosa che dire che non sono l’uno multiplo dell’altro. Siano v ∈ Vi e v 0 ∈ Vi0 . Se i 6= i0 , chiaramente non possono essere l’uno multiplo dell’altro. Se invece i = i0 , l’unico coefficiente possibile è 1, che implica v = v 0 . Quanto alla seconda affermazione, è sufficiente considerare i tre vettori u = 100 . . . 0, v = 010 . . . 0, w = 110 . . . 0. r −1 . La dimensione del codice è n − r, 4. Per il punto 1, la lunghezza delle parole è n = qq−1 per il punto 2 e il teorema 2.19. La distanza minima è 3, grazie al punto 3 ed applicando il teorema 2.23 ed il suo corollario. La formula (1.3) diventa pertanto d−1 bX 1 2 c X n n i i (q − 1) = q k (q − 1) M· i i i=0 i=0 = q k (1 + n (q − 1)) = q k (1 + q r − 1) = q k+r = q n h i r −1 5. Se C è un n = qq−1 , k = n − r, d = 3 -codice la sua matrice di controllo di parità H ha le stesse dimensioni di Hq (r). Inoltre in H non ci sono due colonne proporzionali perché d = 3 (cfr. il teorema 2.23 ed il suo corollario) e quindi neanche due colonne uguali. Moltiplicando per un opportuno scalare possiamo supporre che la coordinata più significativa sia 1: in questo modo ogni colonna di H è una colonna di Hq (r). Dato che hanno le stesse dimensioni, a meno di una permutazione delle colonne si ha H = Hq (r) . Osservazione 2.29. Nel caso binario (cioè q = 2) spesso un codice di Hamming viene indicato non tramite i parametri q ed r ma tramite i parametri [n, k] (la distanza viene omessa essendo sempre 3). In tal caso, la relazione che lega i parametri diventa n = 2r − 1 e k = n − r, per cui se vengono dati [n, k] allora si ha r = n − k = log2 (n + 1). 2.5 Enumeratore di peso L’enumeratore di un codice è un polinomio associato ad un codice che racchiude nei suoi coefficienti molte informazioni sul codice stesso. CAPITOLO 2. CODICI LINEARI 24 Definizione 2.30. Sia C un [n, k, d]-codice e i un numero naturale, 0 ≤ i ≤ n; definiamo la distribuzione del peso di C come gli interi Ai (C) = # {v ∈ C|w (v) = i} , cioè il numero di parole del codice di peso i. Se il codice è sottinteso, useremo semplicemente Ai . L’enumeratore di peso del codice C è il polinomio WC (X) = n X Ai (C) X i i=0 o anche il polinomio omogeneo associato WC (X, Y ) = n X Ai (C) X i Y n−i . i=0 Una prima proprietà dell’enumeratore di peso è il Teorema 2.31. Siano C1 , C2 due codici lineari. Allora WC1 ⊕C2 (X, Y ) = WC1 (X, Y ) WC2 (X, Y ) . Dimostrazione. Si ha che Ai (C1 ⊕ C2 ) = lunghezza di Ci , abbiamo WC1 ⊕C2 (X, Y ) = Pi j=0 nX 1 +n2 Aj (C1 ) Ai−j (C2 ) e quindi, chiamando con ni la Ai (C1 ⊕ C2 ) X i Y n1 +n2 −i i=0 Osserviamo ora che se j > n1 allora Aj (C1 ) = 0 e nello stesso modo se i − j > n2 allora Ai−j (C2 ) = 0, pertanto possiamo scrivere WC1 ⊕C2 (X, Y ) = = nX 1 +n2 i X i=0 j=0 n1 X Aj (C1 ) Ai−j (C2 ) X j X i−j Y n1 −j Y n2 −(i−j) ! r Ar (C1 ) X Y n1 −r r=0 n2 X ! s As (C2 ) X Y n2 −s s=0 = WC1 (X, Y ) WC2 (X, Y ) . Identità di MacWilliams La distribuzione del peso di C è strettamente collegata alla distribuzione del peso di C ⊥ , tramite le identità (2.3). Prima di vedere il teorema, ricordiamo che se I ⊆ {1, . . . , n} allora la perforazione in I, indicata con C I , è il codice ottenuto cancellando tutte le coordinate in I, mentre l’accorciamento CI è la perforazione in I del sottocodice C (I) di C formato da tutte le parole che valgono 0 in tutte le coordinate appartenenti ad I. Ricordiamo anche che per i codici lineari si ha ⊥ I ⊥ CI = C ⊥ I e (CI ) = C ⊥ . Indichiamo con I il complementare di I: I = {1, . . . , n} \ I. CAPITOLO 2. CODICI LINEARI 25 Teorema 2.32 (Identità di MacWilliams). Sia C un [n, k, d]-codice, A0 , . . . , An la sua distribu⊥ ⊥ zione del peso e A⊥ 0 , . . . , An la distribuzione del peso di C . Allora n−ν X ν X n−j n−j Aj = q k−ν A⊥ j ν n − ν j=0 j=0 (2.3) per 0 ≤ ν ≤ n. Dimostrazione. Indichiamo con M la matrice q k × n avente come righe le parole del codice C e con Mi , M i e Mi,j indichiamo, rispettivamente, la i-esima riga, la i-esima colonna e l’elemento i, j di M . Il peso di ogni parola è univocamente determinato, pertanto n X Aj = |C| = q k = q k A⊥ 0 (2.4) j=0 che è la (2.3) per ν = 0. Per dimostrare le altre equazioni conteremo gli zeri in M in due modi diversi. Sia 0 < ν ≤ n e indichiamo con Nν il numero di ν-uple di zeri (non necessariamente consecutivi) nelle righe di M . Più precisamente, k Nν = q X n o # {j1 , . . . , jν } ⊂ {1, . . . , n} Mi,jh = 0 per ogni h = 1, . . . , ν . i=1 Dapprima calcoliamo Nν contandoquante ν-uple di zeri ci sono in una riga fissata. Dato che ogni riga di M di peso j contiene n−j ν-uple di zeri e considerando che ci sono Aj righe di peso ν j, abbiamo n n−ν X X n − j n−j Nν = Aj = Aj , (2.5) ν ν j=0 j=0 perché j > n − ν ⇒ ν > n − j ⇒ n−j = 0. ν Calcoliamo ora Nν ragionando sulle colonne: fissata una ν-upla di indici I, contiamo quante righe hanno una ν-upla di zeri negli indici individuati da I. Sia quindi I = {j1 , . . . , jν } ⊂ {1, . . . , n} una ν-upla di indici. Indichiamo con M I la matrice q k × |I| ottenuta da M cancellando le colonne relative agli indici contenuti in I. Le righe della matrice M I sono le parole del codice C I , però ogni parola di tale codice può comparire più di una volta. Sia kI = dim C I . Se v ∈ C e v I ∈ C I indica la parola ottenuta da v, è immediato verificare che f : v 7→ v I è un’applicazione lineare suriettiva da C in C I , pertanto il suo nucleo ha dimensione dim C − dim C I = k − kI , cioè ha cardinalità q k−kI , per cui ogni fibra di tale applicazione ha cardinalità q k−kI . D’altra parte ogni riga di M I è l’immagine secondo tale applicazione di una parola di C e quindi ogni parola di C I compare in M I esattamente q k−kI volte. In particolare, se v ∈ C è una parola del codice che ha zeri nelle coordinate individuate dagli indici in I, si ha che f (v) = v I è la parola nulla di lunghezza I. In definitiva, tutte le righe di M che hanno una ν-upla di zeri CAPITOLO 2. CODICI LINEARI 26 negli indici individuati da I sono tutte le righe che corrispondono, in M I , alla riga nulla; in altri termini, X (2.6) Nν = q k−kI . I⊂{1,...,n} |I|=ν ⊥ Dato che C I è un [ν, ν − kI ]-codice, applicando la (2.4) a tale codice si ha q ν−kI ν X = Aj C I ⊥ j=0 e quindi la (2.6) diventa X Nν = q k−kI I⊂{1,...,n} |I|=ν = q k−ν X q ν−kI I⊂{1,...,n} |I|=ν =q k−ν X ν X Aj C I ⊥ C I ⊥ I⊂{1,...,n} j=0 |I|=ν =q k−ν ν X X Aj (2.7) j=0 I⊂{1,...,n} |I|=ν Sia 0 ≤ j ≤ ν e poniamo U = (u, I) x ∈ C ⊥ , I ⊂ {1, . . . , n} , |I| = ν, w (u) = j, supp (u) ⊆ I dove supp (u) indica il supporto di u. ⊥ ⊥ Fissiamo I di cardinalità ν: ci sono Aj vettori v ∈ C I vettori di peso j; dato CI ⊥ = C ⊥ I , ne segue che ogni tale v è l’immagine tramite f di un unico u ∈ C ⊥ di che C I ⊥ P peso j e supporto contenuto in I. Questo implica che |U | = I⊂{1,...,n} Aj CI . |I|=ν ⊥ Ora fissiamo j: vi sono A⊥ di peso j e per ognuna di queste parole ci sono j parole u ∈ C n−j n−j ν−j = n−ν sottoinsiemi I ⊆ {1, . . ., n} di cardinalità ν che contengono il supporto di u, cioè n−j tali che (u, I) ∈ U , per cui |U | = n−ν A⊥ j . Usando ciò nella (2.7), otteniamo Nν = q k−ν ν X X Aj j=0 I⊂{1,...,n} |I|=ν =q che, insieme alla (2.5), dà la tesi. k−ν ν X n−j A⊥ j n − ν j=0 C I ⊥ CAPITOLO 2. CODICI LINEARI 27 Le identità di MacWilliams hanno molte formulazioni equivalenti. Per vederne alcune, diamo prima una definizione. Definizione 2.33. I polinomi di Krawtchouck sono definiti come Kjn,q (X) = j X l (−1) (q − 1) j−l l=0 per 0 ≤ j ≤ n e con X l = X n−X l j−l (2.8) X(X−1)(X−2)···(X−l+1) . l! n−X Partendo dalle serie di Taylor di (1 + (q − 1) Z) ∞ X e di (1 − Z) n−X Kkn,q (X) Z k = (1 + (q − 1) Z) X e moltiplicandole si ottiene X (1 − Z) (2.9) k=0 Si può dimostrare che per i polinomi di Krawtchouck valgono le seguenti relazioni di ortogonalità: n X n n i k (q − 1) Krn,q (i) Ksn,q (i) = δr,s (2.10) (q − 1) q n i r i=0 n X Krn,q (i) Kin,q (s) = δr,s q n (2.11) i=0 Teorema 2.34. Per un codice C si ha 1 WC (Y − X, Y + (q − 1) X) |C| 1 1−X n WC ⊥ (X) = (1 + (q − 1) X) WC |C| 1 + (q − 1) X WC ⊥ (X, Y ) = (2.12) (2.13) n A⊥ j = 1 X Ai Kjn,q (i) |C| i=0 per j = 0, . . . , n (2.14) Dimostrazione. (Cenno) Evidentemente le prime due formule sono equivalenti, essendo la prima la versione omogenea della seconda. Per vedere che la (2.12) è equivalente alle (2.14) basta espandere il membro di destra della (2.12): i coefficienti sono dati dalla (2.14). Per vedere che la (2.12) è equivalente alle (2.3), si sostituisce X + Z al posto di Y , si espande e si ricavano le (2.3) come coefficienti. Osservazione 2.35. La (2.14) è la soluzione esplicita della (2.3). Il fatto che quest’ultima sia risolubile segue subito dall’osservazione che la matrice (n + 1) × (n + 1) dei coefficienti degli A⊥ j individuata dalle (2.3) è triangolare con coefficienti non nulli sulla diagonale. Capitolo 3 Codici ciclici Uno spazio vettoriale può essere dotato di altre strutture algebriche: se si definiscono nuove strutture i sottospazi vettoriali che vengono definiti tramite esse acquistano proprietà che in alcuni casi permettono di ottenere informazioni importanti nell’ambito della teoria dei codici. Il caso dei codici ciclici è un esempio particolarmente significativo di questa tecnica. Anche in questo capitolo useremo la notazione K = Fq , V = Fnq = K n ; inoltre K [X] sarà l’anello dei polinomi a coefficienti in K mentre con Rn indicheremo l’anello quoziente Rn = K [X] / (X n − 1) = K [x], dove si pone x = X + (X n − 1). Osserviamo che in Rn x è un elemento invertibile e il suo inverso è xn−1 . Come vedremo, in genere supporremo che MCD (n, char K) = 1. 3.1 Spazi vettoriali e polinomi Uno spazio vettoriale di dimensione n può essere visto come l’insieme dei polinomi a coefficienti in K di grado minore di n; più precisamente, ι: Kn → K [X] v = (v1 , . . . , vn ) → 7 v1 + v2 X + · · · + vn X n−1 è un morfismo iniettivo di spazi vettoriali. È evidente come, in questo contesto, sia più pratico indicare gli indici dei vettori a partire da 0: nel seguito seguiremo quindi questa convenzione. Inoltre, per brevità continueremo a scrivere v = v0 . . . vn−1 invece di v = (v0 , . . . , vn−1 ), quando questo non genera confusione. L’immagine di ι verrà brevemente indicata con ι (v) = v (X). Si ha che ι (V ) è un sottospazio vettoriale di K [X] ma non è un sottoanello, non essendo chiuso per la moltiplicazione. Vediamo come si può definire in V una struttura di anello. Sia In l’ideale (X n − 1) e consideriamo la proiezione al quoziente π : K [X] → Rn = K [X] /In . Indichiamo con η la composizione η = π ◦ ι. È facile verificare che η è un isomorfismo di K-spazi vettoriali, pertanto tramite η è possibile definire una struttura di K-algebra su V ponendo vw = η −1 (η (v) η (w)) . Osservazione 3.1. Gli elementi di Rn sono classi laterali di polinomi: Rn = {f (X) + In : f (X) ∈ K [X]} . 28 CAPITOLO 3. CODICI CICLICI 29 Una notazione standard è f (X) per indicare la classe laterale f (X) + In . Avendo posto x = X + In = X, si ha anche f (X) = f (x), pertanto possiamo usare una qualsiasi delle tre notazioni equivalenti Rn = {f (X) + In : f (X) ∈ K [X]} = f (X) : f (X) ∈ K [X] = {f (x) : f (X) ∈ K [X]} Ogni classe laterale può essere rappresentata da un polinomio di grado minore di n; se f (X) ∈ K [X] è un polinomio, per trovare il rappresentante canonico della classe laterale f (X) + In = f (x) si può procedere in due modi equivalenti: si può effettuare la divisione euclidea f (X) = q (X) (X n − 1) + r (X) con deg r < n, in modo che f (x) = r (x), oppure si può sostituire (ricorsivamente) 1 al posto di ogni copia xn in f (x), dato che in Rn si ha xn = 1. Se W è un sottoinsieme di V indicheremo con W (x) l’immagine di W tramite η. Visto che in V abbiamo una struttura indotta di anello, viene naturale chiedersi chi siano gli ideali di V secondo tale struttura. A tal scopo, definiamo un’applicazione biiettiva di V in se stesso. Definizione 3.2. Indichiamo con σ l’applicazione di shift ciclico (a destra): σ: Kn → Kn (v0 , v1 , . . . , vn−2 , vn−1 ) 7→ (vn−1 , v0 , v1 , . . . , vn−2 ) Ci sarà utile anche il concetto di polinomio reciproco. Definizione 3.3. Se f (X) ∈ K [X] è un polinomio di grado m, il polinomio reciproco f è il polinomio f ∗ (X) = X m f X −1 . Osservazione 3.4. L’espressione X m f X −1 in principio ha senso solo in K (X), il campo quoziente di K [X]; in realtà è facile verificare che f ∗ (X) ∈ K [X]. Inoltre, se f (X) = f0 + f1 X + · · · fm X m allora f ∗ (X) = fm + fm−1 X + · · · + f0 X m . Lemma 3.5. Il seguente diagramma è commutativo V σ η Rn /V η λx / Rn dove λx è la moltiplicazione per x, cioè η (σ (v)) = xη (v). Dimostrazione. η (σ (v)) = η (σ (v0 , v1 , . . . , vn−2 , vn−1 )) = η (vn−1 , v0 , . . . , vn−3 , vn−2 ) = vn−1 + v0 x + · · · + vn−2 xn−1 = vn−1 xn + v0 x + · · · + vn−2 xn−1 = v0 x + · · · + vn−2 xn−1 + vn−1 xn = x v0 + · · · + vn−2 xn−2 + vn−1 xn−1 = xη (v) . CAPITOLO 3. CODICI CICLICI 30 Lemma 3.6. Sia W un sottoinsieme di V ; allora σ (W ) = W se, e solo se, xW (x) = W (x). Dimostrazione. σ è un’applicazione biiettiva da V in V pertanto, trattandosi di insiemi finiti, σ (W ) ⊂ W ⇒ σ (W ) = W . Dato che x è invertibile in Rn essendo xn = 1, la stessa cosa vale per λx . Il fatto che η sia una biiezione e che η (W ) = W (x) unito al lemma precedente implicano che σ (w) ∈ W ⇔ xw (x) ∈ W (x). Teorema 3.7. Sia C un sottoinsieme di V . C è un sottospazio vettoriale se, e solo se, C (x) è un sottogruppo additivo di Rn che assorbe la moltiplicazione per gli scalari. In tal caso, σ (C) = C se, e solo se, C (x) assorbe la moltiplicazione in Rn . Dimostrazione. La prima proprietà segue dal fatto che η è un isomorfismo di spazi vettoriali. Supponiamo quindi che C sia un codice lineare: si deve dimostrare che σ (C) = C se, e solo se, C (x) assorbe la moltiplicazione. Per il lemma precedente, dobbiamo dimostrare che C (x) assorbe la moltiplicazione se, e solo se, C (x) assorbe la moltiplicazione per x. Un’implicazione è ovvia. Supponiamo che C (x) assorba la moltiplicazione per x e siano f (x) = f0 + f1 x + · · · + fn−1 xn−1 ∈ Rn , v (x) = v0 + · · · + vn−1 xn−1 ∈ C (x) . Allora f v = f0 + f1 x + · · · + fn−1 xn−1 v = f0 v + f1 xv + · · · + fn−1 xn−1 v ed è chiaro che xv ∈ C (x) ⇒ xi v ∈ C (x) ∀i ⇒ f v ∈ C (x). In definitiva, se in V consideriamo la struttura di anello indotta dall’isomorfismo di spazi vettoriali η, allora gli ideali sono esattamente quei codici (cioè sottospazi vettoriali) che sono invarianti rispetto ad uno shift a destra (e, per inciso, anche a sinistra). Ciò ci induce dare la seguente Definizione 3.8. Un codice C ⊂ V si dice ciclico se σ (C) = C. Osservazione 3.9. Dato che σ è un’applicazione iniettiva e C è finito, per verificare che σ (C) = C è sufficiente verificare che σ (C) ⊂ C. L’operazione di shift è strettamente legata al prodotto in Rn : Proposizione 3.10. Siano a (x) , b (x) ∈ Rn e a, b i corrispondenti elementi di V . Indichiamo con b̃ (x) l’elemento b̃ (x) = b x−1 = b xn−1 = b0 + bn−1 x + bn−2 x2 + · · · + b1 xn−1 e con b̃ il corrispondente elemento di V . Allora, in Rn , a (x) b (x) = n−1 X a · σ i b̃ xi . (3.1) i=0 In particolare, a (x) b (x) = 0 in Rn se, e solo se, a0 a1 . . . an−1 è ortogonale a bn−1 bn−2 . . . b1 b0 e ad ogni suo shift ciclico. CAPITOLO 3. CODICI CICLICI 31 Dimostrazione. Per definizione di prodotto nei polinomi si ha ! X X a (x) b (x) = aj bk xi i∈Z j,k∈Z j+k=i considerando i polinomi come serie di potenze con coefficienti nulli per i < 0 e i > n − 1. Dato che xn = 1, la formula precedente diventa ! n−1 X X a (x) b (x) = a j bk x i i=0 j,k (n) j+k ≡ i = n−1 X i=0 e si vede facilmente che i X j=0 i X aj bi−j + aj bi−j + j=0 n−1 X n−1 X aj bn+i−j xi j=i+1 aj bn+i−j = a · σ i b̃ . j=i+1 Proposizione 3.11. Se C è un codice ciclico allora anche C ⊥ lo è. Dimostrazione. Siano v = v0 . . . vn−1 e w = w0 . . . wn−1 due elementi di V . Si ha che v · w = v0 w0 + v1 w1 + · · · + vn−2 wn−2 + vn−1 wn−1 = vn−1 wn−1 + v0 w0 + v1 w1 + · · · + vn−2 wn−2 = σ (v) · σ (w) Sia ora u ∈ C ⊥ e fissiamo v ∈ C; dal fatto che σ è biiettiva da C in C segue che esiste v 0 ∈ C tale che σ (v 0 ) = v, pertanto σ (u) · v = σ (u) · σ (v 0 ) = u · v 0 = 0. Poiché v ∈ C è generico concludiamo σ (u) ∈ C ⊥ . Osservazione 3.12. Se C è un codice ciclico e C 0 è equivalente a C non è detto che C 0 sia ciclico. Per esempio, sia C il [4, 2]-codice binario C = {0000, 1010, 0101, 1111} e C 0 il codice ottenuto permutando le ultime due coordinate, cioè C 0 = {0000, 1001, 0110, 1111} ; evidentemente C 0 non è ciclico. Evidenziamo il significato di questa osservazione: nei codici, la proprietà di essere ciclico non è invariante per equivalenza. CAPITOLO 3. CODICI CICLICI 3.2 32 Polinomio generatore Dal teorema 3.7 segue che possiamo aspettarci di capire la struttura dei codici ciclici tramite lo studio dell’anello di polinomi Rn . Quest’ultimo, a sua volta, è semplicemente il quoziente dell’anello K [X] rispetto all’ideale In , pertanto i tre teoremi di isomorfismo, uniti alla corrispondenza dei reticoli degli ideali che ne è conseguenza, ci permettono studiare la struttura degli ideali di k [x] e dei loro generatori. Teorema 3.13. Sia J un ideale non nullo di Rn . Si ponga r = min deg f (X) : f (x) ∈ J e f (X) 6= 0 . Allora 1. 0 ≤ r < n; 2. se g (x) ∈ J e g (X) è un polinomio grado r allora (g (x)) = J (in particolare, J è principale); 3. se (g (x)) = J, deg g (X) = r, f (x) ∈ J e deg f (X) < n allora esiste q (x) ∈ Rn tale che f (x) = q (x) g (x) e deg q (X) < n − r; 4. se (g (x)) = J e deg g (X) = r allora g (X) è un divisore proprio di X n − 1; 5. vi è un unico polinomio g (X) monico e di grado r tale che (g (x)) = J. 6. Posto X n − 1 = g (X) h (X) con g (X) monico e di grado r tale che (g (x)) = J, sia l (x) = v (x) g (x) ∈ (g (x)); allora (g (x)) = (l (x)) ⇔ ∃u (X) : h (X) |1 − u (X) v (X) . In tal caso, g (x) = u (x) l (x). 7. Con la stessa notazione del punto 6, (g (x)) = (l (x)) ⇔ MCD (l (X) , X n − 1) = g (X) . Dimostrazione. Come detto, la dimostrazione segue semplicemente dai teoremi di isomorfismo e dalla struttura degli anelli euclidei. Nonostante ciò, ne riportiamo brevemente le idee principali. 1. Dato che J è non nullo, esiste f (X) ∈ K [X] tal che f (x) = f (X) + In ∈ J è non nullo in Rn (cioè, f (X) ∈ / In e, in particolare, f (X) è non nullo); allora se f (X) = q (X) (X n − 1) + b (X) è la divisione euclidea di f (X) rispetto a X n − 1 si ha f (x) = b (x) in Rn e, in particolare, b (x) 6= 0. Da ciò, b (X) è non nullo, quindi deg b (X) ≥ 0, e inoltre deg b (X) < n per costruzione di b (X).1 2. Sia g (x) ∈ J con g (X) di grado r (in particolare, g (X) è non nullo per il punto 1) e sia f (x) ∈ J. Dalla minimalità di r segue deg f (X) ≥ r. Eseguiamo la divisione euclidea di f (X) rispetto a g (X) e siano q (X) e b (X) tali che f (X) = q (X) g (X) + b (X) con deg b (X) < r. Passando al quoziente, b (x) = (f (x) − q (x) g (x)) ∈ J, cosa che contraddice la minimalità di r se b (X) è non nullo, pertanto b (X) = 0 e quindi f (x) = q (x) g (x) . 1 Usiamo la convenzione deg 0 = −∞. CAPITOLO 3. CODICI CICLICI 33 3. Segue dal punto precedente osservando che, con la medesima notazione, deg f (X) = deg q (X) + deg g (X), pertanto deg q (X) = deg f (X) − deg g (X) < n − r. 4. Ancora una volta, eseguiamo la divisione euclidea: sia X n − 1 = q (X) g (X) + b (X) con deg b (X) < r. Passando al quoziente, xn − 1 = 0 = q (x) g (x) + b (x) e pertanto b (x) ∈ J, cosa che contraddice la minimalità di r se b (X) è non nullo. 5. Supponiamo che g (X) , g 0 (X) siano due polinomi monici, di grado r e tali che (g (x)) = (g 0 (x)) = J; allora h (X) = g (X) − g 0 (X) ha grado minore di r e h (x) ∈ J. Per non contraddire la minimalità di r, si deve avere h (X) = 0, cioè g (X) = g 0 (X). 6. In queste ipotesi, dato che (g (x)) ⊇ (l (x)) allora (g (x)) = (l (x)) ⇔ (g (x)) ⊆ (l (x)) ⇔ ∃u (X) ∈ K [X] : g (x) = u (x) l (x) ⇔ ∃u (X) ∈ K [X] : g (x) = u (x) v (x) g (x) ⇔ ∃u (X) ∈ K [X] : X n − 1|g (X) − u (X) v (X) g (X) ⇔ ∃u (X) : g (X) h (X) |g (X) (1 − u (X) v (X)) ⇔ ∃u (X) : h (X) |1 − u (X) v (X) Se 1 − u (X) v (X) = r (X) h (X) allora u (x) l (x) = u (x) v (x) r (x) = (1 − l (x) h (x)) g (x) = g (x) − r (x) h (x) g (x) = g (x) . 7. Questo segue dal fatto che (l (x)) = (l (X) + (X n − 1)) / (X n − 1) = ((l (X)) + (X n − 1)) / (X n − 1) = (MCD (l (X) , X n − 1)) / (X n − 1) Osservazione 3.14. Il teorema precedente in realtà vale più in generale per R = K [x] = K [X] / (a (X)) con dimostrazione sostanzialmente immutata. Il teorema ci permette di dare la seguente definizione: Definizione 3.15. Sia C un [n, k]-codice ciclico su K; si dice polinomio generatore di C l’unico polinomio monico di grado minimo g (X) tale che (g (x)) = C (x) . Osservazione 3.16. Se g (X) = g0 + g1 X + · · · + gr X r è il polinomio generatore di un codice ciclico C allora gr = 1 e g0 6= 0: quest’ultima segue dal fatto che g (X) |X n − 1. Dal teorema segue che i polinomi generatori vanno ricercati tra i divisori propri e monici di X n − 1. Viceversa, è ovvio che un tale divisore genera un ideale proprio e non nullo, che corrisponde ad un codice ciclico. Inoltre, polinomi diversi generano polinomi diversi; riassumendo, possiamo concludere che CAPITOLO 3. CODICI CICLICI 34 Teorema 3.17. I codici ciclici in Fnq sono in biiezione con i divisori monici del polinomio X n −1. 0 ps Osservazione 3.18. Se q = pb e n = ps n0 con p - n0 , allora X n − 1 = X n − 1 in Fq pertanto, almeno in prima battuta, possiamo limitarci a studiare il caso in cui n e q sono coprimi: da ora in poi, supporremo sempre MCD (n, q) = 1. Inoltre generalmente supporremo 0 < k < n, visto che i casi estremi sono banali. Con queste ipotesi, Corollario 3.19. Se t è il numero di fattori monici irriducibili di X n −1 in K [X] allora esistono 2t codici ciclici di lunghezza n su K. Dimostrazione. Se MCD (n, q) = 1 il polinomio X n − 1 non ha fattori multipli, grazie al criterio della derivata, e quindi ogni fattore (monico) irriducibile ha molteplicità 1: X n − 1 = p1 (X) · . . . · pt (X) con pi - pj per i 6= j. Applicando il teorema precedente si ha la tesi. Un codice ciclico è un caso particolare di un codice lineare, pertanto può essere definito tramite una matrice generatrice; d’altra parte, in quanto codice ciclico può essere definito tramite un polinomio: vediamo la relazione esistente tra questi due concetti. Teorema 3.20. Sia C un codice ciclico di lunghezza n, g (X) = g0 + g1 X + · · · + gr X r il suo polinomio generatore e k = n − r. Allora η −1 g (x) , xg (x) , . . . , xk−1 g (x) è una base di C; in particolare, dim C g0 0 G = Gg = ... 0 0 = k e la matrice k × n g1 g0 ··· ··· 0 ··· g1 .. . gr ··· .. . 0 gr .. . 0 0 .. . ··· ··· .. . 0 ··· g0 0 g1 g0 ··· g1 gr ··· 0 0 0 0 gr è una matrice generatrice per C. Dimostrazione. Indichiamo con Gi le righe della matrice G. Dalla definizione segue che Gi = η −1 xi−1 g (x) per i = 1, . . . , k. Si osservi che per definizione di polinomio generatore si ha gr = 1, pertanto i vettori Gi sono linearmente indipendenti, dato che G contiene un minore triangolare inferiore di dimensione k × k con tutti 1 sulla diagonale e pertanto di rango k. Resta da vedere che i vettori Gi generano C. Sia v ∈ C, v = v0 v1 . . . vn−1 . Per definizione, v (x) = v0 + v1 x + · · · + vn−1 xn−1 ∈ C (x) = (g (x)) pertanto per il teorema 3.13 esiste un polinomio a (x) = a0 + a1 x + · · · ak−1 xk−1 ∈ K [X] di grado minore di k tale che a (X) g (X) = v (X). Da ciò, v (x) = a (x) g (x) ! k−1 X i = ai x g (x) i=0 CAPITOLO 3. CODICI CICLICI 35 = k−1 X ai xi g (x) i=0 = k−1 X ai η (Gi ) i=0 =η k−1 X ! ai Gi i=0 e dunque v = Pk−1 i=0 ai Gi . Corollario 3.21. Se C è un codice ciclico di lunghezza n è dimensione k allora in K [X] vi è un unico polinomio g (X) che sia monico, di grado r = n − k e tale che g (x) ∈ C (x) e tale polinomio è il polinomio generatore di C. Osservazione 3.22. Il polinomio generatore di un codice ciclico è unico; per contro, di matrici generatrici ne esistono parecchie: una per ogni base (ordinata). Osservazione 3.23. Dato che n−1 X X aj gl xi v (x) = a (x) g (x) = i=0 j+l=i si ha che il coefficiente del monomio di grado i di v (x) = a (x) g (x) è semplicemente il prodotto del vettore a con la colonna i+1-esima della matrice Gg . 3.3 Polinomio di controllo Un codice lineare C può essere anche descritto tramite una matrice di controllo di parità che, come visto, è una matrice generatrice del codice lineare duale C ⊥ . Nel caso dei codici ciclici una matrice può essere calcolata a partire dal polinomio generatore. Vediamo come. Sia C un codice ciclico; sappiamo che anche C ⊥ è ciclico. Se g (X) è il polinomio generatore di C, allora g (X) |X n − 1 e pertanto X n − 1 = g (X) h (X) per un polinomio monico, di grado n − r = k e coprimo con g (X). Teorema 3.24. Sia C un [n, k]-codice ciclico, g (X) = g0 +· · ·+gr X r il suo polinomio generatore di grado r = n − k e h (X) = h0 + · · · + hk X k tale che X n − 1 = g (X) h (X); allora 1. v ∈ C ⇔ X n − 1|v (X) h (X) ⇔ v (x) h (x) = 0 in Rn ; 2. se indichiamo con g ⊥ (X) il polinomio generatore di C ⊥ allora k −1 g ⊥ (X) = h−1 , 0 X h X cioè, g ⊥ (X) è il polinomio reciproco di h (X) reso monico; 3. una matrice generatrice di C ⊥ dalla matrice (n − k) × n hk 0 H = Hh = ... 0 0 (e quindi una matrice di controllo di parità di C) è data hk−1 hk ··· ··· 0 ··· hk−1 .. . h0 ··· .. . 0 h0 .. . 0 0 .. . ··· ··· .. . 0 ··· hk 0 hk−1 hk ··· hk−1 h0 ··· 0 0 . 0 0 h0 CAPITOLO 3. CODICI CICLICI 36 Dimostrazione. 1. Ricordiamo che: (a) grazie al teorema 3.13, si ha v (x) ∈ C (x) ⇒ ∃f (X) ∈ K [X] : deg f (X) < n − r e v (x) = f (x) g (x) ; il viceversa è ovvio; (b) dato che K [X] è un dominio di integrità, se a (X), b (X) e c (X) sono tre polinomi in K [X] con c (X) non nullo, allora a (X) c (X) = b (X) c (X) in K [X] implica a (X) = b (X) in K [X]; nuovamente, il viceversa è ovvio. Usando queste osservazioni, si ha v ∈ C ⇔ v (x) ∈ C (x) ⇔ ∃f (X) ∈ K [X] : deg f (X) < n − r e v (x) = f (x) g (x) ⇔ ∃f (X) ∈ K [X] : deg f (X) < n − r e (X n − 1) | (v (X) − f (X) g (X)) ⇔ ∃f (X) ∈ K [X] : deg f (X) < n − r e v (X) = f (X) g (X) ⇔ ∃f (X) ∈ K [X] : deg f (X) < n − r e v (X) h (X) = f (X) g (X) h (X) ⇔ (X n − 1) | v (X) h (X) ⇔ v (x) h (x) = 0 in Rn 2. Innanzi tutto, è chiaro che h0 6= 0, dato che g (X) h (X) = X n − 1 implica h0 g0 = −1. k −1 Indichiamo con l (X) il polinomio h−1 e con l la sua immagine η −1 (l) in V . Per 0 X h X costruzione l (X) è monico e deg l (X) = k = n − r. D’altra parte, dim C ⊥ = n − dim C = n − k = r e pertanto deg l (X) = n − dim C ⊥ . Per poter applicare il corollario 3.21 ci resta solo da vedere che l (x) ∈ C ⊥ (x), cioè l ∈ C ⊥ . Per definizione si ha che −1 ∗ l = (l0 , . . . , ln−1 ) = h−1 0 (hk , . . . , h0 , 0, . . . , 0) = h0 h , (3.2) dove h∗ = η −1 (h∗ (x)), pertanto è sufficiente vedere che h∗ ∈ C ⊥ . Sia v = (v0 , . . . , vn−1 ) ∈ C; allora per il teorema 3.13 esiste f (X) : deg f (X) < n − r = k e v (x) = f (x) g (x). Sia f (X) = f0 + f1 X + . . . + fk−1 X k−1 . Abbiamo che v (X) h (X) = f (X) g (X) h (X) = f (X) (X n − 1). D’altra parte, dal fatto che deg f (X) < k e k < n segue che f (X) (X n − 1) = f (X) X n − f (X) ha 0 come coefficiente del monomio X k . Ma tale coefficiente è k X vi hk−1 = v · h∗ i=0 e quindi v · h∗ = 0. Dato che v era generico in C, ne segue che h∗ ∈ C ⊥ e quindi g ⊥ = l. CAPITOLO 3. CODICI CICLICI 37 3. Applicando il teorema 3.20 si ricava una matrice generatrice Gg⊥ di C ⊥ a partire da g ⊥ (X); ma grazie a (3.2) si ottiene che la relazione tra Gg⊥ e Hh è data da Hh = h−1 0 Gg ⊥ e pertanto anche Hh è una matrice generatrice di C ⊥ . Osservazione 3.25. 1. Come corollario otteniamo che g ⊥ (X) divide X n − 1. Ciò si poteva anche ottenere direttamente con un calcolo apparentemente in K (X) ma in realtà in K [X]: n X n − 1 = g0−1 h−1 0 (1 − X ) n = g0−1 h−1 X −n − 1 0 X n −1 h X −1 = g0−1 h−1 0 X g X k r −1 = g0−1 h−1 X h X −1 0 X g X = g0−1 g ∗ (X) g ⊥ (X) 2. Nella dimostrazione del punto 2. non solo il coefficiente del monomio X k è 0, ma sono 0 tutti i coefficienti dei monomi X k , . . . , X n−1 : scrivendo chi sono questi coefficienti si scopre che non sono altro che il vettore colonna c0 hk hk−1 ··· h0 0 0 · · · 0 c1 c2 0 hk hk−1 · · · h0 0 ··· 0 .. .. . . . . . . . . . . . . . 0 . . . . ··· . 0 ··· 0 hk hk−1 ··· h0 0 ... 0 0 ··· 0 hk hk−1 · · · h0 cn−2 cn−1 Anche a partire da questa osservazione si poteva condurre tutta la dimostrazione del teorema. 3.4 Codifica, decodifica e verifica nei codici ciclici Per un codice lineare una codifica data da una matrice generatrice in forma standard è molto comoda: una tale codifica è sistematica e semplifica pertanto tutte le operazioni di codifica, decodifica e verifica. Se un [n, k]-codice ciclico C viene presentato mediante il polinomio generatore g (X) di grado r, la definizione stessa di codice ciclico ci permette di definire un’applicazione di codifica: dato che v ∈ C ⇒ ∃a (X) ∈ K [X] : deg a (X) < k = n − r e v (x) = a (x) g (x) ne segue che Kk → Rn a = (a0 , . . . , ak−1 ) 7→ a (x) g (x) CAPITOLO 3. CODICI CICLICI 38 è una codifica. Dal punto di vista dell’algebra lineare, questo è equivalente a considerare la matrice generatrice Gg associata al polinomio generatore g (X) e considerare la codifica Kk → Kn a = (a0 , . . . , ak−1 ) 7→ aGg Come abbiamo visto, con questa notazione si ha che il coefficiente del monomio di grado i di a (x) g (x) è dato dal prodotto del vettore riga a per la colonna i-esima di Gg . Questa codifica ha lo svantaggio di non essere sistematica e quindi per la decodifica è necessario risolvere un sistema di equazioni lineari n × k. È comunque facile costruire una codifica sistematica a partire dalla matrice generatrice fornita dal polinomio generatore: per il corollario 2.17 per trovare una codifica sistematica per C bisogna effettuare l’eliminazione gaussiana su una matrice generatrice. Dato che per il polinomio generatore g (X) vale g0 6= 0, partendo dalla matrice generatrice Gg possiamo effettuare l’eliminazione sulle prime k colonne di Gg e, in questo modo, ottenere una codifica sistematica standard. Se dopo l’eliminazione gaussiana la matrice generatrice ha la forma [Ik |B] dove B = [bi,j ] è una matrice (n − r) × r, la codifica Kk → Kn a = (a0 , . . . , ak−1 ) 7→ v = a [Ik |B] dice che ( ai vi = Pk−1 j=0 aj bj+1,i se i ≤ k − 1 se i ≥ k (3.3) D’altra parte, se H = Hh è la matrice di controllo di parità e h (X) = h0 + . . . + hk X k è il polinomio di controllo di C, si ha v ∈ C ⇔ vH tr = 0 ⇔ Hv tr = 0. (3.4) Da ciò, hk 0 Hv tr = ... 0 0 hk−1 hk ··· ··· 0 ··· hk−1 .. . h0 ··· .. . 0 h0 .. . 0 0 .. . ··· ··· .. . 0 ··· hk 0 hk−1 hk ··· hk−1 h0 ··· v0 v1 v2 .. . .. . 0 0 0 0 h0 vn−2 vn−1 e quindi il sistema di n equazioni Hv tr = 0 ha rango k (ricordiamo che hk = 1 e h0 6= 0) e le sue soluzioni sono k−1 X hk−j vi−k+j per i = k, . . . , n − 1. (3.5) vi = −h−1 0 j=0 I valori di v0 , . . . , vk−1 sono liberi: si tratta delle variabili indipendenti del sistema, cioè le coordinate di informazione a0 , . . . , ak−1 della (3.3); la (3.5) permette di trovare in modo ricorsivo i coefficienti bi,j della matrice B che fornisce la restante parte della codifica sistematica (3.3). Nel caso dei codici ciclici le proprietà algebriche permettono di costruire anche un’altra codifica sistematica particolarmente significativa: la forma di Gg , unita al fatto che gr = 1, ci dice che possiamo effettuare l’eliminazione gaussiana sulle ultime k colonne di Gg . La codifica così ottenuta è sistematica ma non standard nel senso stretto definito in 2.11, perché ritroviamo la CAPITOLO 3. CODICI CICLICI 39 matrice identità non come il blocco iniziale di Gg bensì come il blocco finale. Questa codifica sistematica ha un’interpretazione algebrica che permette di implementarla in modo diretto senza passare per l’eliminazione gaussiana: dato un polinomio a (X) = a0 + · · · + ak−1 X k−1 si consideri il polinomio vI (X) = X n−k a (X). Tale polinomio ha grado al più uguale a n − 1 e inoltre non contiene monomi di grado minore di n − k = r. Effettuiamo ora la divisione euclidea vI (X) = q (X) g (X) + vR (X) con deg vR (X) < r e definiamo v (X) = vI (X) − vR (X) . Per costruzione v (X) è un polinomio di grado minore di n, multiplo di g (X) e che ha come coefficienti dei monomi di grado r, . . . , n − 1 proprio a0 , . . . , ak−1 , pertanto se definiamo Kk → Kn −1 a = (a0 , . . . , ak−1 ) 7→ η (v (x)) utilizzando l’unicità di quoziente e resto della divisione euclidea concludiamo che questa codifica coincide con la codifica sistematica data dall’eliminazione gaussiana effettuata sulle ultime k colonne di Gg . Infine per quel che riguarda la verifica, cioè controllare se un dato v ∈ K n sta in C, essa si effettua a partire dalle proprietà algebriche della definizione di codice ciclico: per costruzione v ∈ C ⇔ g (X) | v (X) e pertanto dato v è sufficiente vedere se il resto della divisione di v (X) per g (X) è 0 oppure no per sapere se v è nel codice. In alternativa, si può usare la matrice di controllo di parità e la (3.4). 3.5 Zeri di un codice ciclico Se C è un [n, k]-codice ciclico allora C è determinato dal suo polinomio generatore g (X) ∈ K [X] = Fq [X] che è un polinomio monico, di grado r = n − k e che divide xn − 1. D’altra parte nelle nostre ipotesi (cioè, MCD (n, p = char K) = 1) per il criterio della derivata si ha che le radici di X n − 1 sono tutte distinte (in Fp = K). In realtà, come si vede nella sezione C.2 le radici di X n − 1 sono tutte in Fqb , dove b = ordn (q) è l’ordine moltiplicativo di q in Zn . Fissiamo un elemento primitivo β di Fqb e indichiamo con α una radice primitiva n-esima q b −1 dell’unità: per esempio, α = β n . Indichiamo con S = {s1 , . . . , sw } un insieme di rappresentanti per le classi q-ciclotomiche modulo n e con Cs1 , . . . , Csw le rispettive classi q-ciclotomiche modulo n. Poiché g (X) |X n − 1 ne segue che esistono t polinomi g1 (X) , . . . , gt (X) irriducibili in K [X] tali che g (X) = g1 (X) · . . . · gt (X) . Ogni polinomio gj (X) è il polinomio minimo mαsj (X) di αsj per un opportuno sj ∈ S, pertanto esiste un sottoinsieme S 0 ⊂ S tale che Y Y Y g (X) = mαs (X) = (X − αu ) . s∈S 0 s∈S 0 u∈Cs CAPITOLO 3. CODICI CICLICI 40 Definizione 3.26. Con la notazione precedente, l’insieme [ Cs Tα = s∈S 0 è detto insieme di definizione di C e l’insieme Z = {αu : u ∈ Tα } è detto insieme degli zeri di C. Osservazione 3.27. Dalla definizione segue che v (x) ∈ C (x) ⇔ ∀u ∈ Tα , v (αu ) = 0 ⇔ ∀ζ ∈ Z, v (ζ) = 0. (3.6) Inoltre, deg g (X) = r = |Tα | = |Z|. Zeri e matrice di controllo di parità L’insieme Z è esattamente l’insieme degli zeri del polinomio generatore del codice C, pertanto esso determina univocamente g (X) e viceversa. Grazie a ciò, è possibile costruire una matrice di controllo della parità per C a partire da Z. Lemma 3.28. Sia g (X) un generatore per un n-codice ciclico C, α una radice primitiva nesima di 1, v ∈ Fnq e siano u, u0 ∈ Cs due numeri in una stessa classe ciclotomica. Indicando 0 con m (X) il polinomio minimo di αu (ed αu ) allora 0 v (αu ) = 0 ⇔ v αu = 0 ⇔ m (X) |v (X) . (3.7) Dimostrazione. Evidentemente basta dimostrare che v (αu ) = 0 ⇔ m (X) |v (X). Una delle due implicazioni è ovvia. Supponiamo v (αu ) = 0. Allora (X − αu ) |v (X) in Fq [X] e quindi MCD (X − αu , v (X)) 6= 1 in Fq [X]; ma il MCD (X − αu , v (X)) è sempre lo stesso in qualsiasi estensione che contenga Fq , pertanto MCD (x − αu , v (X)) 6= 1 in Fq [X]. Dato che in Fq [X] il polinomio m (X) è irriducibile e (X − αu ) |m (X) in Fq [X], ne segue m (X) |v (X). Teorema 3.29. Se g (X) è il polinomio generatore di un [n, k]-codice C, α è una radice primitiva n-esima di 1 e i1 , . . . , iw sono interi tali che g (X) = mαi1 (X) · . . . · mαiw (X) . Sia L la matrice 1 1 L = . .. α i1 α i2 .. . α2i1 α2i2 .. . ··· ··· .. . α(n−1)i1 α(n−1)i2 .. . 1 α iw α2iw ··· α(n−1)iw Se v = v0 . . . vn−1 ∈ Fnq allora v ∈ C ⇔ Lv tr = 0. CAPITOLO 3. CODICI CICLICI 41 Dimostrazione. Per ipotesi, Ci1 , . . . , Ciw sono le distinte classi ciclotomiche tali che g (X) = w Y m αij w Y Y (X) = j=1 (X − αu ) j=1 u∈Cij pertanto w [ u Z= α : u ∈ C ij . j=1 Sia v = v0 . . . vn−1 e sia v (X) il polinomio associato. Per il lemma 3.28 basta controllare solo una radice di ogni fattore irriducibile, pertanto la (3.6) diventa v (x) ∈ C (x) ⇔ v αij = 0 ∀j = 1, . . . , w ⇔ n−1 X vl αlij = 0 ∀j = 1, . . . , w (3.8) l=0 tr ⇔ Lv = 0 Osservazione 3.30. La matrice L è una simile ad una matrice di Vandermonde, a parte il fatto che non è quadrata, e l’equazione (3.8) dice che una tale matrice è una matrice che valuta un polinomio (nel nostro caso, il polinomio v (X)) in un insieme di punti (in questo caso, gli αij ). Corollario 3.31. Con la notazione precedente, k = dim C ≥ n − bw dove b = [Fq [α] : Fq ] = ordn (q). Osservazione 3.32. La matrice L del teorema non è una matrice di controllo della parità di C. Infatti, essa non è una matrice a coefficienti in K = Fq , bensì è una matrice a coefficienti in Fqb , dove b = ordn (q). Ciononostante, da essa si può ottenere una matrice di controllo della parità di C. A tal fine, si scelga una base B di Fqb su K (per esempio, B = 1, β, . . . , β b−1 ); ogni elemento di Fqb si scrive in modo unico come un vettore colonna (cioè, una matrice b × 1) a coefficienti in Fq . Sostituendo ogni elemento di L con la sua scrittura ottenuta in questo modo, si ottiene una matrice H̃ di tr dimensione bw inK . Mostriamo che LvP = 0 se, e solo se, H̃v tr = 0. × in a2icoefficienti b−1 (n−1)i j Sia Li = 1, α , α , . . . , α una riga di L e α = t=0 at,j β t ; allora Li v tr = n−1 X vj αji j=0 = n−1 X vj = n−1 X t=0 at,ji β t t=0 j=0 b−1 X b−1 X vj at,ji β t j=0 da cui segue quanto affermato. Naturalmente non è detto che le righe di H siano linearmente indipendenti: nel caso, è sufficiente eliminare le righe linearmente dipendenti per ottenere una matrice di controllo di rango massimo. CAPITOLO 3. CODICI CICLICI 42 Esempio 3.33. Consideriamo il [7, 3]-codice binario C che ha come polinomio generatore g (X) = 1 + X 2 + X 3 + X 4 . Il polinomio di controllo è h (X) = 1 + X 2 + X 3 1 1 0 0 1 1 H= 0 0 1 0 0 0 pertanto una matrice di controllo è data da 1 0 0 0 0 1 0 0 . 1 0 1 0 1 1 0 1 Sia α una radice primitiva settima di 1; il suo polinomio minimo è X 3 + X + 1. Osserviamo che, in questo caso, α è anche un elemento primitivo (cfr. C.12). Poiché il polinomio generatore è g (X) = (X + 1) X 3 + X + 1 = mα0 (X) mα1 (X), la matrice L del teorema 3.29 è data da 1 1 1 1 1 1 1 L= . 1 α α2 α3 α4 α5 α6 Una base di F8 su F2 è data da B = 1, α, α2 . Per procedere secondo quanto osservato, dobbiamo sostituire ogni potenza di α con il vettore colonna 3 × 1 che esprime tale potenza come combinazione lineare a coefficienti in F2 degli elementi di B: 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 L= 1 0 0 1 0 1 1 0 1 0 1 1 1 0 0 1 0 1 1 1 0 ottenendo quindi la matrice 1 0 0 H̃ = 1 0 0 1 0 0 0 1 0 In questo caso, ci sono due righe che sono abbiamo 1 1 1 0 0 H = 0 1 0 0 1 0 0 0 0 1 1 0 0 1 1 0 1 0 0 0 1 1 1 0 0 1 1 1 1 0 0 . 1 0 1 banalmente dipendenti dalle altre: cancellandole 1 1 1 1 1 0 1 0 1 1 . 0 1 1 1 0 1 0 1 1 1 Adesso le righe di H 0 sono linearmente indipendenti e non è necessario cancellare altre righe: H 0 è una matrice di controllo di parità per C. È facile verificare che la matrice H 0 può essere trasformata nella matrice H con sole operazioni di riga2 2 Sommare la riga 4 alla 1; la 1 alla 2; la 4 alla 2; la 2 alla 3; la 3 alla 4. CAPITOLO 3. CODICI CICLICI 43 Zeri e distanza minima Abbiamo detto che Z determina univocamente g (X) e viceversa, essendo l’insieme degli zeri del polinomio. Per contro, Tα è solo un insieme di numeri naturali: esso determina univocamente g (X) (e viceversa) solo una volta che è fissata la radice primitiva α; in altre parole, lo stesso insieme di numeri può identificare polinomi diversi con diverse radici, oppure uno stesso polinomio può essere identificato da diversi insiemi di numeri con diverse radici. Esempio 3.34. Nel codice dell’esempio 3.33 abbiamo n = 7, q = p = 2 e g (X) = 1 + X 2 + X 3 + X 4 ; dato che b = ord7 (2) = 3, le radici di x7 + 1 sono tutte in F8 . In tale campo ogni elemento che non è in F2 è una radice primitiva; siano α e γ radici, rispettivamente, dei polinomi X 3 + X + 1 e X 3 + X 2 + 1. Essendo hαi = hγi, ognuna delle due radici è potenza dell’altra; per esempio α = γ 3 e γ = α5 . Avendo scelto l’elemento primitivo ed il polinomio generatore, l’insieme di definizione relativamente ad α è dato da Tα = C0 ∪ C1 = {0, 1, 2, 4}α mentre relativamente a γ abbiamo Tγ = C0 ∪ C3 = {0, 3, 5, 6}γ . L’insieme delle radici è invece indipendente dall’elemento primitivo scelto: cambia solo il modo in cui vengono rappresentati gli elementi del campo finito. Nel caso dell’esempio si ha Z = 1, α, α2 , α4 = 1, γ 5 , γ 3 , γ 6 e Z identifica il polinomio generatore g (X) Viceversa, lo stesso insieme {0, 1, 2, 4} combinato con l’elemento primitivo γ fornisce l’insieme di definizione {0, 1, 2, 4}γ che identifica il polinomio g̃ (X) = X 3 + X 2 + 1 (X + 1) = 1 + X + X 2 + X 4 il quale genera un codice C̃ diverso da C. Si osservi che per C̃ l’insieme degli zeri risulta essere Z̃ = 1, γ, γ 2 , γ 4 6= Z che identifica il polinomio generatore g̃ (X) di C̃: g̃ (X) = (X + 1) (X + γ) X + γ 2 = (X + 1) X 3 + X 2 + 1 X + γ4 = 1 + X + X2 + X4 Alla luce di questo esempio, vediamo qual è la relazione tra due insiemi di definizione relativi a due distinti elementi primitivi. Proposizione 3.35. Sia C un [n, k]-codice con polinomio generatore g (X) di grado r = n − k e siano α, γ due radici primitive n-esime di 1. Sia inoltre m un intero coprimo con n tale che γ = αm . Allora Tα = mTγ = {mv (mod n) : v ∈ Tγ } . CAPITOLO 3. CODICI CICLICI 44 Dimostrazione. Indichiamo con mγ (X) e mα (X) i polinomi minimi di α e γ rispettivamente. Se gj (X) un fattore irriducibile di g (X), esistono due interi s, t tali che Y Y (X − γ v ) . (X − αu ) = gj (X) = v∈Ct u∈Cs Se δ è una radice di gj (X) allora esiste un intero z tale che δ = γ z = αmz e quindi z ∈ Ct e mz ∈ Cs da cui mCt ∩ Cs 6= ∅. Grazie a (C.6) abbiamo Cs = Cmt . Ripetendo il ragionamento per ogni fattore di g (X) si ha la tesi. Quanto visto ci dice che dato un codice ciclico C con polinomio generatore g (X) (e insieme degli zeri Z), cambiando la radice primitiva si può cambiare l’insieme di definizione. Riuscire a scegliere un opportuno insieme di definizione per il codice dato può essere importante, perché possiamo ottenere importanti informazioni. Definizione 3.36. Si dice che l’insieme di definizione Tα contiene s interi consecutivi se esiste un intero c tale che c + i (mod n) ∈ Tβ ∀i = 0, 1, . . . , s − 1. Teorema 3.37 (Disuguaglianza BCH). Sia C un [n, k]-codice ciclico con polinomio generatore g (X) e insieme di generatori Tα relativamente ad una data radice primitiva α. Se C ha distanza minima d e Tα contiene δ − 1 interi consecutivi, allora d ≥ δ. Dimostrazione. Siano t, t + 1, . . . , t + δ − 2 ∈ Tα gli interi consecutivi Pw presenti in Tα e sia v = v0 . . . vn−1 ∈ C una parola di peso w > 0. Possiamo scrivere v (X) = j=1 vij X ij , dove vij sono le coordinate non nulle di v. Nel sistema di equazioni di controllo Lv tr = 0 consideriamo solo il sottosistema delle equazioni v αi per i = t, t + 1, . . . , t + δ − 2. Esso è i i vi1 (αt ) 1 + ··· + viw (αt ) w = 0 t+1 iw vi αt+1 i1 + · · · + v α = 0 iw 1 . . . . . . .. .. .. .. .. .. ... i1 iw vi1 αt+δ−2 + · · · + viw αt+δ−2 = 0 In forma matriciale, M ṽ tr = 0, dove ṽ = vi1 . . . viw e i i (αt ) 1 (αt ) 2 i2 i 1 αt+1 αt+1 M = .. .. . . t+δ−2 i1 t+δ−2 i2 α α ··· ··· .. . ··· i (αt ) w iw αt+1 . .. . i w t+δ−2 α CAPITOLO 3. CODICI CICLICI 45 Supponiamo w < δ e consideriamo la sottomatrice M 0 formata dalle prime w righe di M : 1 1 ··· 1 α i1 αi2 ··· αiw M 0 = αt(i1 +i2 +···+iw ) .. .. .. .. . . . . α(w−2)i1 α(w−2)i2 · · · α(w−2)iw e pertanto det M 0 6= 0, dato che è un multiplo non nullo di una matrice di Vandermonde. Ciò è una contraddizione e quindi w ≥ δ, da cui d ≥ δ. 3.6 Idempotenti In K [X] due polinomi generano lo stesso ideale se, e solo se, si ottengono l’uno dall’altro per la moltiplicazione di una costante non nulla e fra questi generatori uno solo è monico. In K [x] le cose sono più complesse perché non è un dominio di integrità; ciononostante, il teorema 3.13 ci assicura che K [x]è ancora ad ideali principali e ci dice quali sono i possibili generatori dell’ideale (g (x)). Sebbene il polinomio generatore è quello di “grado” più piccolo fra quelli che genera il proprio ideale ed ha molte utili proprietà, tra gli altri generatori ce ne possono essere alcuni che godono proprietà interessanti e utili. Definizione 3.38. Se R è un anello, un elemento e ∈ R si dice idempotente se e2 = e. Se I è un ideale di R ed e è un elemento idempotente tale che I = (e), allora e è detto generatore idempotente di I. Un insieme di idempotenti e1 , . . . , es di R si dice un insieme di idempotenti primitivi se e1 + · · · + es = 1R e ei ej = 0 per i 6= j. Il teorema di Wedderburn assicura che ogni ideale di un anello semisemplice abbia un generatore idempotente. Nel caso di nostro interesse, R = Rn , ciò può anche essere ottenuto per via elementare ed in modo costruttivo; tratteremo esplicitamente il caso Rn = K [X] / (X n − 1), anche se è facile generalizzare i risultati al caso R = K [X] / (f (X)). Teorema 3.39. Sia C (x) = (g (x)) un ideale proprio e non nullo di Rn , dove g (X) è il polinomio generatore e X n − 1 = g (X) h (X). Sia inoltre 1 = a (X) g (X) + b (X) h (X) l’identità di Bézout. Valgono le seguenti proprietà: 1. se e (x) ∈ C (x) allora e (x) è un generatore idempotente se, e solo se, e (x) è una unità di C (x); 2. esiste un unico idempotente e (x) tale che C (x) = (e (x)). Inoltre, e (x) = a (x) g (x); 3. se e (x) è un idempotente (non nullo) tale che (e (x)) = C (x), allora g (X) = MCD (e (X) , X n − 1) . Osserviamo che anche i due ideali banali (0) , R hanno comunque un (unico) generatore idempotente che coincide con il polinomio generatore (rispettivamente, 0 e 1). Ricordiamo anche che R è commutativo. CAPITOLO 3. CODICI CICLICI 46 Dimostrazione. 1. C (x) è un ideale di R e pertanto è anche un suo sottoanello (in generale, senza unità). Supponiamo che e (x) sia una unità di C (x), cioè c (x) e (x) = c (x) ∀c (x) ∈ C (x). Questo implica C (x) ⊆ (e (x)). D’altra parte, C (x) ⊇ (e (x)), dato che C (x) è un ideale e e (x) ∈ C (x). Viceversa, sia (e (x)) = C (x) con e (x) idempotente. Essendo e (x) un generatore, segue che dato c (x) ∈ C (x) esiste f (x) ∈ Rn tale che c (x) = f (x) e (x). Usando il fatto che e (x) è idempotente, otteniamo c (x) = f (x) e (x) = f (x) e (x) = f (x) e (x) e (x) = c (x) e (x) e quindi e (x) è un’unità di C (x). 2. Per prima cosa, verifichiamo l’unicità. Se e1 (x) , e2 (x) sono due generatori idempotenti, allora sono entrambi delle unità per il punto 1 e quindi e1 (x) = e1 (x) e2 (x) = e2 (x). Per quel che riguarda l’esistenza, l’identità di Bézout in K [X] diventa, in Rn = K [x], 1 = a (x) g (x) + b (x) h (x) . Inoltre, g (x) h (x) = 0. Moltiplichiamo l’identità di Bézout per a (x) g (x) 2 a (x) g (x) = (a (x) g (x)) + a (x) g (x) b (x) h (x) = (a (x) g (x)) 2 pertanto, posto e (x) = a (x) g (x), abbiamo che e (x) è un idempotente di C (x). Sia ora c (x) = f (x) g (x) un generico elemento di C (x); nuovamente dall’identità di Bézout abbiamo c (x) = f (x) g (x) = f (x) g (x) a (x) g (x) + f (x) g (x) b (x) h (x) = f (x) g (x) a (x) g (x) = f (x) g (x) e (x) = c (x) e (x) e pertanto (e (x)) è un’identità per C (x), quindi è un generatore idempotente. 3. Questo è un caso particolare del teorema 3.13. Nel caso dei codici binari, il generatore idempotente può essere caratterizzato in altri modi. Esercizio 3.40. e (x) è idempotente in Rn se, e solo se, l’insieme S delle potenze di x con coefficiente non nullo è una unione di laterali ciclotomici di n. La matrice costruita con gli shift ciclici del polinomio generatore è una matrice generatrice. Questa proprietà è valida anche per il generatore idempotente. Proposizione 3.41. Dato un codice C di dimensione k con polinomio generatore g (X) e generatore idempotente e (x) = e0 + · · · + en−1 xn−1 , la matrice e0 e1 · · · en−2 en−1 en−1 e0 · · · en−3 en−2 M = . .. .. .. .. . ··· . . e1 e2 ··· en−1 e0 avente come prima riga i coefficienti di e (x) e come k − 1 righe successive gli shift ciclici della prima riga è una matrice generatrice per C. CAPITOLO 3. CODICI CICLICI 47 Dimostrazione. Supponiamo che M non sia una matrice generatrice per C. Allora esiste un vettore a di dimensione 1 × k tale che aM = 0. Consideriamo l’elemento a (x) di K [x] avente grado al più k − 1 e associato ad a. È facile verificare che a (x) e (x) = (aM ) (x) in Rn = K [x], per cui a (x) e (x) = 0 in Rn . Ma 0 = 0g (x) = a (x) e (x) g (x) = a (x) g (x) = (aG) (x) e quindi aG = 0, che contraddice il fatto che G sia una matrice generatrice per C. Esempio 3.42. Consideriamo i codici binari di lunghezza 7. Dato che X 7 + 1 = (X + 1) X 3 + X + 1 X 3 + X 2 + 1 = γ1 (X) γ2 (X) γ3 (X) ha tre fattori irriducibili distinti, ci sono 23 = 8 codici, con polinomi generatori dati da γ1δ1 (X) γ2δ2 (X) γ3δ3 (X) δi ∈ {0, 1} . Indicando con gi (X) il polinomio generatore e con ei (x) il generatore idempotente, abbiamo i dim gi (X) 0 0 1 + X7 1 1 2 3 ei (x) 0 4 5 1+X +X +X +X +X +X 2 3 6 2 1 + x + x + x + x4 + x5 + x6 4 3 1 + x3 + x5 + x6 2 3 1+X +X +X 3 3 1 + X + X2 + X4 1 + x + x2 + x4 4 4 1 + X + X3 x + x2 + x4 5 4 1 + X2 + X3 x3 + x5 + x6 2 6 6 1+X x + x + x3 + x4 + x5 + x6 7 7 1 1 ed anche i gi (X) ei (x) insieme di definizione 0 γ1 (X) γ2 (X) γ3 (X) 0 {0, 1, 2, 3, 4, 5, 6} 1 γ2 (X) γ3 (X) g1 (x) {1, 2, 3, 4, 5, 6} 2 γ1 (X) γ2 (X) 3 x g2 (x) {0, 1, 2, 4} 3 γ1 (X) γ3 (X) g3 (x) {0, 3, 5, 6} 4 γ2 (X) xg4 (x) = e1 (x) + e2 (x) {1, 2, 4} 3 {3, 5, 6} γ1 (X) x g5 (x) = e1 (x) + e3 (x) x + x3 + x5 g6 (x) = e2 (x) + e3 (x) 1 1 = e1 (x) + e2 (x) + e3 (x) {} 5 γ3 (X) 6 7 {0} In particolare, 1 = e1 (x) + e2 (x) + e3 (x) e osserviamo anche che ei (x) ej (x) = 0 se i, j ∈ {1, 2, 3} e i 6= j, pertanto {e1 (x) , e2 (x) , e3 (x)} forma un insieme di idempotenti primitivi. Dato che i codici ciclici sono in biiezione con gli ideali di Rn , ne segue che la somma e l’intersezione di due codici ciclici sono ancora ciclici e corrispondono, rispettivamente, alla somma ed all’intersezione dei corrispondenti ideali. CAPITOLO 3. CODICI CICLICI 48 Teorema 3.43. Per i = 1, 2 siano Ci due codici ciclici aventi polinomi generatori gi (X) e generatori idempotenti ei (x). Allora: 1. ha il polinomio generatore di C1 ∩ C2 è mcm (g1 (X) , g2 (X)) e il generatore idempotente è e1 (x) e2 (x); 2. il polinomio generatore di C1 + C2 è MCD (g1 (X) , g2 (X)) e il generatore idempotente è e1 (x) + e2 (x) − e1 (x) e2 (x). Dimostrazione. L’affermazione sui polinomi generatori segue dal corrispondente risultato sugli ideali di K [X] usando le proprietà del polinomio generatore del teorema 3.13. 2 2 2 1. Chiaramente e1 (x) e2 (x) ∈ C1 ∩C2 . Inoltre (e1 (x) e2 (x)) = e1 (x) e2 (x) = e1 (x) e2 (x), pertanto è un idempotente. Resta da vedere che è un’unità in C1 ∩ C2 . Sappiamo che ei (x) è un’unità in Ci . Sia c (x) ∈ C1 (x) ∩ C2 (x). Allora e1 (x) e2 (x) c (x) = e1 (x) c (x) = c (x) e quindi e1 (x) e2 (x) è il generatore idempotente di C1 ∩ C2 . 2. Anche in questo caso è ovvio che e1 (x) + e2 (x) − e1 (x) e2 (x) ∈ C1 + C2 . Calcolando il quadrato, 2 2 2 2 (e1 (x) + e2 (x) − e1 (x) e2 (x)) = e1 (x) + e2 (x) + (e1 (x) e2 (x)) + 2 2 + 2e1 (x) e2 (x) − 2e1 (x) e2 (x) − 2e1 (x) e2 (x) = e1 (x) + e2 (x) + e1 (x) e2 (x) + + 2e1 (x) e2 (x) − 2e1 (x) e2 (x) − 2e1 (x) e2 (x) = e1 (x) + e2 (x) − e1 (x) e2 (x) Nuovamente resta da vedere che l’elemento agisce come una unità. Sia c (x) = c1 (x) + c2 (x) ∈ C1 (x) + C2 (x). Allora (c1 (x) + c2 (x)) (e1 (x) + e2 (x) − e1 (x) e2 (x)) = = c1 (x) (e1 (x) + e2 (x) − e1 (x) e2 (x)) + + c2 (x) (e1 (x) + e2 (x) − e1 (x) e2 (x)) = c1 (x) e1 (x) + c1 (x) e2 (x) − c1 (x) e1 (x) e2 (x) + + c2 (x) e1 (x) + c2 (x) e2 (x) − c2 (x) e1 (x) e2 (x) = c1 (x) + c1 (x) e2 (x) − c1 (x) e2 (x) + + c2 (x) e1 (x) + c2 (x) − c2 (x) e1 (x) = c1 (x) + c2 (x) che implica la tesi. Se il reticolo dei codici ciclici coincide con il reticolo degli ideali di Rn , i codici minimali e quelli massimali corrispondono rispettivamente agli ideali minimali ed a quelli massimali. Definizione 3.44. Supponiamo che, in K [X], si abbia la fattorizzazione X n − 1 = f0 (X) f1 (X) . . . fr (X) CAPITOLO 3. CODICI CICLICI 49 dove possiamo supporre f0 (X) = X − 1 e i fattori sono tutti distinti, grazie al fatto che MCD (n, char K) = 1. Poniamo Xn − 1 , fˆi (X) = fi (X) cioè fˆi (X) è il prodottodi tutti i polinomi tranne l’i-esimo e indichiamo con êi (x) il generatore ˆ idempotente dell’ideale fi (x) . Teorema 3.45. Sia C un codice ciclico proprio e non nullo. 1. Il codice C è minimale se, e solo se, il suo polinomio generatore è uno degli fˆi (X). Inoltre, se C è minimale, C (x) è un’estensione finita di K, isomorfa a K [X] / (fi (X)). 2. Il codice C è massimale se, e solo se, il suo polinomio generatore è uno degli fi (X). Dimostrazione. Sia g (X) il polinomio generatore di C. 1. Il codice C è minimale se, e solo se, non ci sono ideali propri I tali che (X n − 1) ⊂ I ⊂ n −1 è irriducibile, che è equivalente al fatto che g (X) (g (X)) e questo è vero se, e solo se, Xg(X) è uno degli fˆi (X). Supponiamo ora che C sia minimale con polinomio generatore g (x) e generatore idempotente e (x). Il generatore idempotente è l’unità dell’anello commutativo unitario C (x). Sia c (x) ∈ C (X) non nullo. Dato che (c (x)) è un ideale non nullo contenuto in C (x), ne segue per minimalità che (c (x)) = C (x) = (e (x)), pertanto esiste γ (x) ∈ Rn tale che c (x) γ (x) = e (x). Allora γ (x) e (x) ∈ (e (x)) = C (x) e c (x) γ (x) e (x) = e (x) e (x) = e (x) che vuol dire che γ (x) e (x) ∈ C (x) è l’inverso moltiplicativo di c (x), pertanto ogni elemento non nullo di C (x) è invertibile, cioè C (x) è un campo. Dato che C (x) è un sottospazio vettoriale di Rn che ha dimensione finita su K, lo stesso vale per C (x). Più precisamente, l’applicazione K [X] → f (X) 7→ C (x) = (e (x)) f (x) e (x) è un morfismo di anelli suriettivo (perché e (x) è idempotente!) il cui nucleo è (g (X)) e g (X) è irriducibile per la minimalità di C,come abbiamo appena visto, da cui la tesi. 2. C è massimale se, e solo se, C (x) = (g (x)) è massimale se, e solo se, K [x] / (g (x)) è un campo. Ma n K [x] / (g (x)) = K [X] / (X − 1)(g (X)) / (X n − 1) ∼ = K [X] / (g (X)) e quest’ultimo è un campo se, e solo se, g (X) è irriducibile cioè se, e solo se, g (X) è uno degli fi (X) (dovendo essere un fattore di X n − 1). Osserviamo che fˆ0 (X) = 1+X +· · ·+X n−1 è il polinomio generatore del codice di dimensione 1 generato dal vettore 111 . . . 11, cioè il codice di ripetizione di lunghezza n. I teoremi precedenti sono gli ingredienti per trovare un insieme di generatori idempotenti primitivi. CAPITOLO 3. CODICI CICLICI 50 Teorema 3.46. In Rn valgono le seguenti proprietà. 1. Gli êi (x) formano un insieme completo di idempotenti primitivi per i = 0, . . . , r. 2. Rn è la somma diretta dei sottospazi fˆi (x) per i = 0, . . . , r. 3. Gli unici idempotenti di fˆi (x) sono 0 e êi (x). 4. Se C (x) è un ideale di Rn (i.e., un codice ciclico) ed e (x) è il generatore idempotente allora esiste un sottoinsieme T ⊂ {0, . . . , r} tale che X X fˆi (x) . e (x) = êi (x) e C (x) = i∈T i∈T Dimostrazione. 1. Dobbiamo dimostrare innanzi tutto che êi (x) êj (x) = 0 se i 6= j. Poiché ˆ (êi (x)) = fi (x) , esistono u (x) , v (x) tali che êi (x) = u (x) fˆi (x) e êj (x) = u (x) fˆj (x), pertanto êi (x) êj (x) = u (x) fˆi (x) u (x) fˆj (x) . Dato che per costruzione X n − 1 | fˆi (X) fˆj (X) poiché X n −1 non ha fattori multipli, abbiamo 0 = fˆi (x) fˆj(x) che implica êi (x) êj (x) = 0. ˆ La costruzione implica anche che MCD f0 (X) , . . . , fˆr (X) = 1 e, per l’algoritmo euclideo, esistono a0 (X) , . . . , ar (X) tali che 1= r X ai (X) fˆi (X) . (3.9) i=0 L’equazione precedente dice che Rn = fˆ0 (x) + fˆ1 (x) + · · · + fˆr (x) . Applicando induttivamente il teorema 3.43 e usando êi (x) êj (x) = 0, abbiamo che il generatore idempotente di fˆ0 (x) + fˆ1 (x) + · · · + fˆi (x) è ê0 (x) + ê1 (x) + · · · + êi (x), pertanto il generatore idempotente di Rn , che è 1, è anche uguale a ê0 (x) + ê1 (x) + · · · + êr (x). 2. La (3.9) ci dice che Rn è somma degli ideali in oggetto: resta solo da vedere che la somma è diretta. Poniamo r X Ii = fˆj (x) . j=0 j6=i Applicando induttivamente il teorema 3.43 e considerando la fattorizzazione di X n − 1, si ottiene che Ii = (fi (x)). Nuovamente per gli stessi motivi, Ii ∩ fˆi (x) ha come polinomio generatore fi (X) fˆi (X) = X n − 1 e quindi Ii ∩ fˆi (x) = 0. CAPITOLO 3. CODICI CICLICI 51 3. Dal teorema 3.45, fˆi (x) è un campo. Un idempotente è radice del polinomio X 2 − X e in ogni campo tale polinomio ha esattamente due radici: lo 0 e l’identità moltiplicativa del La tesi segue dal teorema 3.39 che dice che êi (x) è l’identità moltiplicativa di campo. ˆ fi (x) . 2 4. Fissato i, consideriamo e (x) êi (x). Si ha che e (x) êi (x) ∈ (êi (x)) ed inoltre (e(x) êi (x)) = 2 2 ˆ e (x) êi (x) = e (x) êi (x), cioè e (x) êi (x) è un idempotente di (êi (x)) = fi (x) . Ab biamo appena visto che in fˆi (x) ci sono solo due idempotenti e quindi e (x) êi (x) = 0 oppure e (x) êi (x) = êi (x). Poniamo T = {i | e (x) êi (x) = êi (x)} . Allora e (x) = e (x) 1 = e (x) r X êi (x) = i=0 r X e (x) êi (x) = i=0 X êi (x) . i∈T Infine, usando l’induzione ed il teorema 3.43, ! X X X C (x) = (e (x)) = êi (x) = (êi (x)) = fˆi (x) . i∈T i∈T i∈T Infine, sapendo come è legato il polinomio generatore del codice ortogonale al polinomio generatore del codice originale, vediamo la relazione esistente tra i rispettivi generatori idempotenti. Teorema 3.47. Sia C un codice ciclico con polinomio generatore g (X) e generatore idempotente e (x). Sia inoltre X n − 1 = g (X) h (X). Allora il codice con polinomio generatore h(X) ha come generatore idempotente 1 − e (x) e C ⊥ ha come generatore idempotente 1 − e x−1 . Dimostrazione. Sia 1 = a (X) g (X) + b (X) h (X) l’identità di Bézout. Dal teorema 3.39 segue che b (x) h (x) = 1 − a (x) g (x) = 1 − e (x) è il generatore idempotente del codice D avente h (X) come polinomio generatore. Ciò vuol dire che 1 − e (x) è una unità per D (x), cioè D (x) = (1 − e (x)) e 2 f (x) (1 − e (x)) = f (x) (1 − e (x)) ∀f (X) ∈ K [X] . (3.10) Consideriamo ora il codice ortogonale. Se c (x) ∈ C (x) = (e (x)), abbiamo c (x) (1 − e (x)) = c (x) − c (x) e (x) = c (x) − c (x) = 0 e quindi dalla proposizione 3.10 segue che 1 − e x−1 ∈ C ⊥ (x). Consideriamo l’equazione (3.10) a livello polinomiale: in K [X] diventa f (X) (1 − e (X)) ≡ f (X) (1 − e (X)) 2 (mod X n − 1) ∀f (X) ∈ K [X] . Applicando il morfismo di valutazione in X n−1 otteniamo f X n−1 1 − e X n−1 ≡ f X n−1 1 − e X n−1 2 (mod X n(n−1) − 1) ∀f (X) ∈ K [X] . CAPITOLO 3. CODICI CICLICI 52 Poiché X n − 1|X n(x−1) − 1, al quoziente abbiamo xn(x−1) − 1 = 0 e quindi f xn−1 1 − e xn−1 = f xn−1 1 − e xn−1 2 ∀f (X) ∈ K [X] cioè 2 ∀f (X) ∈ K [X] 1 − e x−1 Ma al variare di f (X) in K [X] si ha che f x−1 varia in tutto K [x], per cui l’equazione precedente è equivalente a f x−1 1 − e x−1 = f x−1 2 ∀f (X) ∈ K [X] f (x) 1 − e x−1 = f (x) 1 − e x−1 la quale vuol dire che 1 − e x−1 è una unità di C ⊥ (x) e quindi, per il teorema 3.39, è il generatore idempotente. 3.7 Famiglie di codici ciclici Come si è visto in precedenza (cfr. corollario 3.31 e teorema 3.37) la maggiore struttura algebrica dei codici ciclici permette di ottenere informazioni aggiuntive sulla struttura e i parametri del codice. Se si vogliono raffinare ulteriormente le informazioni bisogna quindi imporre maggiori condizioni nelle direzioni indicate dai risultati visti in modo da restringere lo studio a particolari famiglie di codici ciclici. Codici BCH I codici BCH prendono il nome dalle iniziali dei loro sviluppatori: A. Hocquenghem nel 1959 e, indipendentemente, R. Bose e D. K. Ray-Chaudhuri nel 1960. Una delle caratteristiche fondamentali dei codici BCH è che nella loro progettazione si ha un controllo molto preciso sulla distanza minima e, quindi, sulla capacità di correzione degli errori. Per questi motivi i codici BCH sono largamente utilizzati nelle applicazioni. Per esempio, sono usati nelle trasmissioni satellitari, nella riproduzione dei CD, dei DVD, per la lettura e scrittura degli hard disk, ecc. Fissiamo degli interi n, δ con 2 ≤ δ e un campo base K = Fq . Poniamo b = ordn (q). Definizione 3.48. Un codice BCH di lunghezza n su K e distanza designata δ è un codice ciclico che ha come insieme di definizione l’unione delle classi ciclotomiche di δ − 1 interi consecutivi: T = Ct ∪ Ct+1 ∪ · · · ∪ Ct+δ−2 . Se t = 1 si dice che C è un codice BCH in senso stretto. Se n = q b − 1 si dice che C è un codice BCH primitivo. Osservazione 3.49. In un codice BCH non viene specificato il polinomio generatore: esso non è quindi specificato completamente fino a quando non si fissa una radice primitiva. Osservazione 3.50. Dato che in T ci sono δ − 1 interi consecutivi si ha che la distanza minima è almeno δ; in realtà, potrebbe essere ancora maggiore, perché nell’unione delle classi ciclotomiche ci potrebbero essere altri interi che contribuiscono ad allungare l’intervallo di interi consecutivi. CAPITOLO 3. CODICI CICLICI 53 Codici di Hamming Molti, ma non tutti, codici di Hamming sono codici ciclici; più precisamente, sono codici BCH in senso stretto: Teorema 3.51. Se MCD (r, q − 1) = 1 e n = (q r − 1) / (q − 1) allora un codice BCH in senso stretto con insieme di definizione T = C1 è un codice di Hamming q-ario con parametro r. Dimostrazione. Sia α una radice primitiva n-esima di 1, mα (X) il suo polinomio minimo su Fq . Sappiamo che deg mα (X) = [Fq (α) : Fq ] = ordn (q). Dire che T = C1 è la stessa cosa che dire che il polinomio generatore g (X) del codice è mα (X), pertanto la dimensione del codice è k = n − deg mα (X). Dato che qr − 1 q−1 = q r−1 + · · · + q + 1 = q r−1 − 1 + · · · + (q − 1) + r n= ≡r (mod q − 1) si ha MCD (n, q − 1) = 1. Sia ordn (q) = s: esiste quindi un intero positivo l tale che q s − 1 = nl. q r − 1 = n (q − 1) ≡ 0 (mod n) implica s|r, da cui q s − 1|q r − 1, cioè nl|n (q − 1) e quindi l|q − 1. D’altra parte, q − 1|q s − 1 = nl e, dato che MCD (n, q − 1) = 1, si ha q − 1|l, per cui l = q − 1 s e q − 1 = nl = n (q − 1) = q r − 1, cioè s = r. In definiva, ordn (q) = r e quindi deg g (X) = deg mα (X) = ordn (q) = r e k = n − r. Dato che r = ordn (q) = deg mα (X) = [Fq [α] : Fq ] ogni potenza di α può essere rappresentata come un vettore in Frq : indichiamo con H la matrice che ha nelle colonne i coefficienti di 1, α, α2 , . . . , αn−1 rappresentati in tal modo. La matrice H è una matrice r × n a coefficienti in Fq . Da MCD (n, q − 1) = 1 segue che αq−1 è una radice primitiva n-esima di 1 per cui αi(q−1) 6= 1 per i = 1, 2, . . . , n − 1. Ciò implica αi ∈ / Fq per i = 1, 2, . . . , n − 1. Da questo segue che le colonne di H sono a due a due linearmente indipendenti. Osserviamo ora che moltiplicare per uno scalare una colonna di H vuol dire moltiplicare per l’inverso di tale scalare la corrispondente coordinata di tutte le parole del codice, pertanto a meno di passare ad un codice equivalente possiamo supporre che la coordinata più significativa di ogni colonna di H sia 1: con questa ipotesi, dire che due colonne sono linearmente indipendenti è la stessa cosa che dire che sono diverse pertanto H è, a meno di una permutazione, proprio la matrice di Hamming Hq (r), cfr. teorema 2.28. Se MCD (r, q − 1) 6= 1 il teorema non val più: si può dimostrare che il codice di Hamming H4 (3) (definito in 2.27) non è ciclico ed è il più piccolo codice di Hamming non ciclico. Osservazione 3.52. La disuguaglianza BCH dice che con le ipotesi del teorema la distanza minima è almeno 2: in realtà è maggiore (ed è esattamente 3). Esempio 3.53. Il codice dell’esempio 3.33 è il codice di Hamming definito nella sezione 2.4 CAPITOLO 3. CODICI CICLICI 54 Codici di Reed-Solomon I codici di Reed-Solomon sono una particolare sottofamiglia dei codici BCH introdotti da Reed e Solomon nel 1960. Grazie alla loro capacità di correggere errori che si presentano in blocchi, piuttosto che in modo casuale, sono particolarmente utilizzati nelle telecomunicazioni. Per esempio, nel 1977 sono stati utilizzati nel programma spaziale Voyager. Definizione 3.54. Un codice di Reed-Solomon è un codice BCH di lunghezza n = q − 1. Proposizione 3.55. Se C è un codice di Reed-Solomon, valgono i seguenti fatti. 1. ordn (q) = 1. 2. Ogni classe q-ciclotomica modulo n ha un solo elemento. 3. Fq è il campo di spezzamento di X n − 1. 4. Ogni elemento non nullo di Fq è una radice n-esima di 1. 5. Ogni radice primitiva n-esima di 1 è un elemento primitivo di Fq . 6. Se T è l’insieme di definizione di C allora T = {t, t + 1, . . . , t + δ − 2}. 7. La distanza minima di C è proprio δ. 8. C è un codice MDS. Dimostrazione. Sono tutte ovvie. Per le ultime due, dalla disuguaglianza di Singleton e da quella BCH si ha k ≤ n − d + 1 ≤ n − δ + 1 = n − |T | = k. 3.8 Progettazione di codici Quanto visto in questo capitolo permette la progettazione di codici BCH capaci di correggere (almeno) un numero t di errori deciso a priori: riassumiamo i passi necessari. Fissare t (il numero di errori che si vuole correggere), Fq (il campo base dei coefficienti) e n (la lunghezza del codice). In seguito3 : 1. Determinare b = ordn q. Fqb è la più piccola estensione di Fq che contiene le radici n-esime di 1. Se n = q b − 1 si ha un codice primitivo. Se n = q − 1 si ha un codice di Reed-Solomon. 2. Determinare un elemento primitivo β ∈ Fqb ed il corrispondente polinomio minimo mβ (X). 3. Determinare una radice primitiva n-esima α di 1 in Fqb ed il suo polinomio minimo mα (X). Si può scegliere α = β q b −1 n . 4. Per j = 0, . . . , n − 1 determinare Cj , le classi q-ciclotomiche modulo n. 3 In corsivo i commenti. CAPITOLO 3. CODICI CICLICI 55 5. Fissato τ ∈ [1, . . . , n] determinare v [ u = min v | [τ, . . . , τ + 2t − 1] ⊆ Cj j=τ e porre T = Cτ ∪ Cτ +1 ∪ · · · ∪ Cu . T è il più piccolo insieme di definizione che contiene 2t interi consecutivi a partire da τ . Ciò assicura che la distanza minima sia almeno 2t + 1. Se τ = 1, come si sceglie spesso, il codice è BCH in senso stretto. Nonostante la scelta, può accadere che T contenga più di 2t interi consecutivi e quindi la capacità di correzione risulta in realtà maggiore. 6. Calcolare dove mαj (X) = Q l∈Cj g (X) = mcm (mατ (X) , . . . , mαu (X)) X − αl è il polinomio minimo di αj . Il polinomio g (X) è il polinomio generatore di un [n, n − deg g (X) , δ]-codice su Fq di distanza minima δ ≥ 2t + 1. In questa costruzione sono coinvolti due campi: il campo base Fq e la sua estensione Fqb . Una volta calcolato g (X), che è in Fq [X], per codificare si usa solo il campo più piccolo. Per decodificare, invece, è necessario svolgere i calcoli nel campo più grande. Poiché Fqb = Fq [β] è la più piccola estensione di Fq che contiene una radice n-esima dell’unità, si ha Fqb = Fq [α], per cui anche se α non è primitivo è comunque sufficiente la conoscenza di α e del suo polinomio minimo mα (X) per poter effettuare tutti i calcoli necessari. Capitolo 4 Correzione degli errori nei codici lineari Affinché un codice sia utile nella pratica è necessario che esistano degli efficienti algoritmi di correzione degli errori (più brevemente, di decodifica). All’aumentare delle proprietà algebriche che definiscono le parole del codice corrisponde una più precisa descrizione della struttura del codice stesso e, come vedremo, aumentano le possibilità di controllo sulla correzione, fino a riuscire ad ottenere algoritmi di correzione molto efficienti. In questo capitolo vediamo come ottenere ciò partendo prima dai codici lineari nella loro generalità, per poi specializzarci alle varie classi di sottocodici. In particolare, vedremo che nell’importante sottoclasse dei codici BCH si possono costruire algoritmi di correzione molto efficienti e largamente utilizzati nella pratica quotidiana. 4.1 Decodifica nei codici lineari Se consideriamo un codice generico C il modo più naturale per decodificare una parola v ricevuta dopo una trasmissione (cioè recuperare la parola del codice v che è stata inviata) è quello della massima verosimiglianza (cfr. (1.4)): partendo da v 0 si costruiscono le sfere centrate in v 0 e di raggio crescente fino a quando non si ottiene una sfera che contiene almeno una parola del codice C: a questo punto, se nella sfera vi è una sola parola del codice la si sceglie come (presunta) parola inviata v; se invece, sfortunatamente, nel primo caso in cui S (v 0 , r) ∩ C 6= ∅ si ha che nella sfera ci sono due parole del codice, allora è necessario scegliere una delle due in base a qualche criterio. Questo algoritmo, naturalmente, non è molto pratico ma non ci si può aspettare molto di meglio se non è data alcuna informazione sul codice e sull’alfabeto. Nel caso dei codici lineari il principio massima verosimiglianza (1.4) può essere applicato in modo naturale perché la struttura matematica di sottogruppo del codice C rispetto allo spazio totale V induce un partizionamento canonico di V : il partizionamento ottenuto tramite i laterali di C. L’idea è di scegliere in ogni classe laterale di C un elemento privilegiato, l’elemento direttore (o coset leader), che si supporrà essere l’errore che si è prodotto nel corso della trasmissione: ricevuta la parola v 0 , se e (v 0 ) è l’elemento direttore della classe laterale v 0 + C allora la decodifica di v 0 è data dalla parola v = v 0 − e (v 0 ). Nell’applicare questo procedimento è quindi di fondamentale importanza il criterio utilizzato per la scelta dell’elemento direttore; il principio della massima verosimiglianza induce a definire 56 CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 57 come elemento direttore di una classe laterale un elemento di tale classe avente peso minimo. Questo sembra un buon criterio, purtroppo la scelta può non risultare univoca: per esempio, se C è il [4, 2, 2]-codice binario generato da 1011 e 0101 allora nella classe laterale 1111 + C ci sono due elementi di peso 1, vale a dire 0100 e 0001. In qualche caso, però, la scelta è effettivamente univoca: allora v Proposizione 4.1. Se C è un [n, k, d]-codice su K e v è una parola con w (v) ≤ d−1 2 è un vettore di peso minimo della sua classe laterale ed è unico. Dimostrazione. Sia v 0 = v + c con c ∈ C \ {0} e supponiamo che v 0 abbia peso minimo nella classe laterale v + C, di modo che w (v 0 ) ≤ w (v). Da c ∈ C \ {0} segue che w (c) ≥ d. Per la disuguaglianza triangolare, d ≤ w (c) = w (v 0 − v) = d (v 0 , v) ≤ d (v 0 , 0) + d (0, v) d−1 0 ≤d−1 = w (v ) + w (v) ≤ 2w (v) ≤ 2 2 che è una contraddizione. L’esempio riportato prima della proposizione non soddisfa le ipotesi, in quanto ma ogni elemento di 1111 + C ha peso positivo. Fatta la scelta, vediamo come recuperare la parola decodificata. d−1 2 = 0 Correzione con tabella di Slepian Definizione 4.2. Una tabella di Slepian, o tabella standard, di un [n, k]-codice C è una tabella (o matrice) Σ = (σi,j ) di dimensioni q n−k × q k costruita nel modo seguente: ogni riga è formata dagli elementi di una classe laterale di C (e nella prima riga ci sono gli elementi di C); il primo elemento σi,1 di ogni riga è l’elemento direttore (in particolare, σ1,1 = 0 . . . 0) e gli altri elementi della riga (cioè, della classe laterale σi,1 + C) sono dati da σi,j = σi,1 + σ1,j . A questo punto, diventa automatico usare la tabella per decodificare la parola ricevuta v 0 : basta determinare gli indici i, j tali che v 0 = σi,j e si ha che la decodifica di v 0 è σ1,j . Esempio 4.3. Una tabella di Slepian per il [4, 2, 2]-codice C binario generato da 1011 e 0101 è data da 0000 1011 0101 1110 1000 0011 1101 0110 (4.1) 0100 1111 0001 1010 0010 1001 0111 1100 Se la parola ricevuta è 1010 allora il relativo elemento direttore è 0100 e pertanto la parola decodificata è 1110. Come già osservato, in questo esempio la scelta dell’elemento direttore non è univoca: infatti nella classe laterale data dalla terza riga ci sono due elementi di peso 1 e scegliere 0001 come elemento direttore sarebbe stata una scelta altrettanto legittima; in questo caso la tabella sarebbe stata 0000 1011 0101 1110 1000 0011 1101 0110 (4.2) 0001 1010 0100 1111 0010 1001 0111 1100 e la parola ricevuta 1010 sarebbe stata decodificata con la parola 1011. CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 58 Correzione a sindrome Un altro modo per correggere gli errori sfrutta il fatto che la funzione S : Kn → Kk v 7→ S (v) = vH tr ha due proprietà: 1. è lineare; 2. v ∈ C ⇔ S (v) = 0. Da ciò, segue che Lemma 4.4. u + C = v + C ⇔ Hutr = Hv tr . Dimostrazione. tr u + C = v + C ⇔ u − v ∈ C ⇔ H (u − v) = 0 ⇔ Hutr = Hv tr . In altre parole, il vettore S (v) è un invariante della classe laterale. Definizione 4.5. Si dice sindrome di un vettore (di lunghezza n) il vettore S (v) = vH tr (di lunghezza k). Se v è il vettore ricevuto allora il calcolo della sua sindrome S (v) è immediato (se conosciamo la matrice di controllo di parità); se abbiamo precedentemente provveduto a calcolare le sindromi di tutti gli elementi direttori, ciò ci permette di trovare l’elemento direttore di v e, quindi, di decodificarlo. Esempio 4.6. Sia C il [4, 2, 2]-codice binario generato da 1011 e 0101. Una matrice di controllo di parità di C è 1 0 1 0 H= . 1 1 0 1 La tabella delle sindromi relative ai coefficienti direttori della tabella di Slepian (4.1) è data da elemento direttore sindrome 0000 00 1000 11 0100 01 0010 10 Se la parola ricevuta è v 0 = 1010, la sua sindrome è S (v 0 ) = 01, che ci rimanda all’elemento direttore e (v 0 ) = 0100 e pertanto la decodifica è v = v 0 − e (v 0 ) = 1010 − 0100 = 1110. Per contro, la tabella delle sindromi relative ai coefficienti direttori della matrice di Slepian (4.2) è data da CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI elemento direttore sindrome 0000 00 1000 11 0001 01 0010 10 59 Notiamo che le sindromi non cambiano: cambiano solo gli elementi direttori. Se la parola ricevuta è v 0 = 1010, la sua sindrome continua ad essere S (v 0 ) = 01 che però, questa volta, ci rimanda all’elemento direttore e (v 0 ) = 0001 e pertanto la decodifica diventa v = v 0 − e (v 0 ) = 1010 − 0001 = 1011. Naturalmente il risultato nell’applicare la decodifica con la tabella di Slepian o con la tabella delle sindromi è identica, ciò che cambia è il tipo di ricerca che bisogna fare: con la tabella di Slepian si deve cercare un vettore di lunghezza n in una tabella con q n elementi mentre con la tabella delle sindromi si deve cercare un vettore di lunghezza n − k in una lista di q n−k vettori. Correzione a sindrome – 2 Nei i due schemi precedenti lo spazio totale viene partizionato in sottoinsiemi disgiunti: i laterali del codice C. In ogni laterale si sceglie un rappresentante e se la parola ricevuta v appartiene al laterale e + C si assume che l’errore verificato sia e e si decodifica v con la parola del codice v − e. Il principio di massima verosimiglianza induce a scegliere in ogni laterale un rappresentante di peso minimo ma, come abbiamo visto, non sempre ciò è possibile in modo univoco. Un modo per tenere conto di ciò è restringere il tentativo di correggere la parola ricevuta solo a quei casi in cui sia possibile applicare il principio di massima verosimiglianza in modo non ambiguo, al costo di rinunciare eventualmente a correggere alcune parole: per i codici lineari ciò può essere effettuato sfruttando la struttura di gruppo dello spazio unita al teorema 1.16: se t è il numero massimo di errori che il codice è in grado di correggere, si considerano i laterali ai quali appartengono tutte le parole di peso minore o uguale a t. In tali laterali, vi è un’unica parola di peso minimo (cfr. teorema 1.16 e proposizione 4.1): tale parola viene scelta come presunto errore se la parola ricevuta è in uno di questi laterali. Se invece la parola ricevuta non appartiene all’unione dei suddetti laterali, la parola non viene corretta perché si devono essere verificati più errori di quanti siamo sicuri di poter correggere. Riassumendo, lo schema di correzione a sindromi funziona così, supponendo di aver ricevuto la parola v: 1. costruire la tabella T con tutte le coppie (e, S (e)) al variare di tutte le possibili parole e di peso minore o uguale a t; 2. calcolare S (v); 3. consultare la tabella: (a) se esiste una parola e di peso minore o uguale a t tale che S (e) = S (v), decodificare v con v − e; (b) altrimenti, restituire un codice di errore. Osserviamo che lo schema appena esposto permette di effettuare sempre la decodifica esattamente quando il codice è perfetto. CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 60 Decodifica nei codici di Hamming Come visto nel caso particolare del codice di Hamming [7, 4] la decodifica diventa particolarmente semplice, soprattutto nel caso binario, se si usa un codice con matrice di controllo di parità data dalla matrice Hq (r). Nel caso non binario, tuttavia, è necessario un passaggio ulteriore perché non è sufficiente individuare la posizione in cui è avvenuto l’errore ma si deve anche individuare come è cambiata la coordinata. Mostriamo la procedura nel caso generale: la semplificazione nel caso binario risulterà evidente. Mettiamoci dunque nell’ipotesi che la matrice di controllo di parità sia H = Hq (r) e siano H 1 , . . . , H n le sue colonne. Siano inoltre e1 , . . . , en i vettori della base canonica di Fnq . Il codice di Hamming è in grado di individuare e correggere al più un errore: sia quindi v ∈ C la parola del codice inviata e che dobbiamo recuperare, r la parola ricevuta e supponiamo che si sia verificato un errore di valore α ∈ Fq nella coordinata ei , vale a dire r − v = αei . Calcolando la sindrome abbiamo S (r) = S (v + αei ) = S (v) + αS (ei ) = αH i . Dato che H i ha per costruzione 1 come cifra più significativa, si ottiene subito α: esso è la cifra più significativa di S (r). Ottenuto α, si ha che α−1 S (r) = H i : in questo modo, confrontando α−1 S (r) con la matrice H si recupera anche i e, da qui, si ottiene v tramite v = r − αei . 4.2 Decodifica nei codici ciclici: algoritmo di Meggitt Sia C un codice ciclico con polinomio generatore g (X) di grado r, S la funzione che calcola la sindrome di una parola. Nella sezione 4.1 abbiamo definito la sindrome di v come S(v) = vH tr ; in realtà, le proprietà essenziali che deve avere S sono che è un morfismo di spazi vettoriali e che S (v) = 0 ⇔ v ∈ C. Nel caso dei codici ciclici può esser utile definire la funzione sindrome del polinomio v (X) come la classe di resto del polinomio v (X) modulo g (X). Più precisamente, se f (X) ∈ K [X] allora indichiamo con Rg (f (X)) il polinomio resto nella divisione euclidea di f (X) rispetto a g (X). Per definizione, il grado del resto è minore del grado di g (X). Definizione 4.7. Se C è un codice ciclico con polinomio generatore g (X), il polinomio sindrome di f (X) ∈ K [X] è S (f ) = Rg (f (X)). La decodifica di Meggitt si basa sul principio della decodifica a sindromi esposta nella sezione 4.1: supponendo che il codice sia in grado di correggere t errori, si crea una tabella con le sindromi di un opportuno insieme di parole di peso minore o uguale a t. Alla ricezione di una parola v se ne calcola la sindrome: si cerca nella tabella una parola e avente la stessa sindrome di quella ricevuta e si assume che e rappresenti l’errore avvenuto nella trasmissione e quindi si decodifica la parola ricevuta con v − e. Nei codici ciclici questo schema può essere semplificato poiché si può ridurre il numero di sindromi da calcolare: mostriamo che è sufficiente considerare solo le classi laterali i cui polinomi rappresentanti siano di grado massimo, cioè n − 1, oltre che di peso minore o uguale a t. Supponiamo che c (X) sia il polinomio del codice trasmesso, v (X) il polinomio ricevuto ed ẽ (X) il polinomio di errore di grado m < n − 1 di modo che v (X) = c (X) + ẽ (X) . Segue che S (v) = S (ẽ); inoltre, X n−1−m v (X) = X n−1−m c (X) + X n−1−m ẽ (X) CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 61 e, dato che C è ciclico, si ha xn−1−m c (x) ∈ C (x), per cui S X n−1−m v (X) = S X n−1−m ẽ (X) e quindi compare nella tabella delle sindromi: esistepertanto un polinomio e (X) di grado n − 1 e peso minore o uguale a t tale che S X n−1−m ẽ (X) = S (e (X)). Dato che sia xn−1−m ẽ (x) che e (x) hanno peso minore o uguale a t e C corregge t errori, ne segue che xn−1−m ẽ (x) = e (x) cioè ẽ (x) = xm+1 e (x) e da ciò si ricava v. In definitiva, lo schema di decodifica di Meggitt si sviluppa in due parti: 1. calcolare una tabella con le sindromi dei polinomi di peso minore o uguale a t e grado n − 1; 2. se si riceve v, calcolare S X i v (X) per i = 0, . . . , n − 1 fino a quando non si trova una sindrome nella tabella calcolata, che permette come descritto di decodificare v; se invece si esauriscono le possibilità senza aver determinato una sindrome nella tabella, vuol dire che si sono verificati più di t errori e quindi il codice non è in grado di effettuare la correzione. Il significato di questo procedimento è: supponiamo che in v si sia verificato almeno un errore e al più t errori e inoltre che l’errore nella coordinata più significativa (cioè, più a destra) sia in posizione m; allora S (v (X)) , . . . , S X n−1−m−1 v (X) non saranno nella nostra tabella, perché sono sindromi di polinomi di grado minore di n − 1. La sindrome S = S X n−1−m v (X) invece è nella tabella, perché il polinomio sul quale la si calcola ha grado n − 1; si deve quindi avere S = S (e (X)) per qualche e (X) di grado n − 1 e peso minore o uguale a t perché abbiamo effettuato delle rotazioni cicliche dei coefficienti fino a portare l’errore più significativo in posizione n − 1. Per determinare l’errore ẽ (X) è quindi necessario effettuare n − 1 − m shift a sinistra oppure, equivalentemente, m + 1 shift a destra; recuperato l’errore, lo si sottrae alla parola ricevuta. La decodifica avviene dunque assumendo che la parola di errore ẽ (X) sia X m+1 e (X). Questo permette di ridurre sensibilmente la dimensione della tabella delle sindromi che è necessario calcolare preventivamente e diventa di implementazione ancora più efficace se si rie scono a calcolare in modo efficiente le sindromi S X i v (X) . Usando come sindrome il resto della divisione euclidea, il teorema seguente ci permette di calcolare le sindromi in maniera ricorsiva mediante operazioni di facile implementazione in un calcolatore: è questo il motivo della ridefinizione della sindrome nei codici ciclici. Ricordiamo che, nell’anello quoziente Rn , la moltiplicazione di un polinomio per X ha come effetto lo shift circolare a destra di una posizione nel vettore delle coordinate; questo permette di ricavare la sindrome di X i+1 v (X) a partire da quella di X i v (X): Teorema 4.8. Sia g (X) un polinomio monico di grado r. Se f (X) ∈ K [X] e S (f (X)) = s (X) = r−1 X si X i i=0 allora S (Xf (X)) = S (Xs (X)) = Xs (X) − sr−1 g (X) . CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 62 Dimostrazione. Scriviamo f (X) = q (X) g (X) + s (X) Xs (X) = q̂ (X) g (X) + ŝ (X) di modo che S (f (X)) = s (X) e S (Xs (X)) = ŝ (X), per cui Xf (X) = Xq (X) g (X) + Xs (X) = g (X) (Xq (X) + q̂ (X)) + ŝ (X) che implica S (Xf (X)) = S (Xs (X)) = ŝ (X), che è la prima affermazione della tesi. Inoltre, Xs (X) = sr−1 g (X) + Xs (X) − sr−1 g (X) . Dato che deg (Xs (X) − sr−1 g (X)) ≤ r−1 = deg g (X), segue anche la seconda affermazione. Osservazione 4.9. La decodifica di Meggitt può essere implementata in molti modi diversi. A seconda dell’implementazione può essere vantaggioso definire il polinomio sindrome in modo leggermente diverso. Per esempio, una particolare implementazione prevede l’uso di circuiti a scorrimento di registro. In tal caso, le operazioni risultano più semplici usando come definizione di sindrome la formula S (X) = Rg X deg g(X) f (X) . La teoria resta invariata. Ricapitoliamo quanto visto: sia C sia un [n, k]-codice ciclico con polinomio generatore g (X) in grado di correggere al più t errori e sia v sia la parola ricevuta. Per effettuare la decodifica di Meggitt 1. si crea una tabella con tutte le coppie S (C) = {(f (X) , S (f (X))) : deg f (X) = n − 1 ∧ w (f (x)) ≤ t} ; 2. posto i = min j : f (X) , S X j v (X) ∈ S (C) per qualche f (X) , sia e (X) tale che e (X) , S X i v (X) ∈ S (C). La parola v (x) viene decodificata con v (x) − xn−i e (x). 3. Se invece f (X) , S X j v (X) ∈ / S (C) per nessun valore, si restituisce un codice di errore. Esempio 4.10. Consideriamo il [15, 7]-codice ciclico binario C con polinomio generatore g (X) = 1 + X 4 + X 6 + X 7 + X 8 = X 4 + X + 1 X 4 + X 3 + X 2 + X + 1 . Se α è una radice di X 4 + X + 1, l’insieme di definizione è Tα = {1, 2, 3, 4, 6, 8, 9, 12} e quindi C può correggere fino a due errori. CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI e (X) S (e (X)) 0 X 0 14 7 6 X + X + X5 + X3 1 + X 14 X7 + X6 + X5 + X3 + 1 X + X 14 X7 + X6 + X5 + X3 + X 2 X +X 14 X7 + X6 + X5 + X3 + X2 X 3 + X 14 X7 + X6 + X5 X 4 + X 14 X7 + X6 + X5 + X4 + X3 X 5 + X 14 X 6 + X 14 X7 + X6 + X3 X7 + X5 + X3 X 7 + X 14 X6 + X5 + X3 X 8 + X 14 9 X +X 14 X5 + X4 + X3 + 1 7 X + X4 + X3 + X + 1 X 10 + X 14 X3 + X2 + X X 11 + X 14 X7 + X6 + X5 + X4 + X2 + 1 X 12 + X 14 X7 + X6 + X4 + X X 13 63 +X 14 X7 + X4 + X3 + X2 Supponiamo di aver ricevuto la parola v = 101000011011100, che corrisponde al polinomio v (X) = 1 + X 2 + X 7 + X 8 + X 10 + X 11 + X 12 . Si ha S0 = S (v (X)) = X 7 + X 4 + X 2 + 1 che non compare nella tabella. Calcoliamo allora S1 = S (Xv (X)) = S (XS0 ). Per il teorema1 S1 = Xs (X) + g (X) = X 7 + X 6 + X 5 + X 4 + X 3 + X + 1. che non è nella tabella. Calcoliamo quindi S2 = S X 2 v (X) = S (XS1 ): S2 = XS1 + g (X) = X 5 + X 2 + X + 1. Neanche questo è nella tabella. Procedendo con il calcolo, S3 = S X 3 v (X) ; si ha S3 = XS2 = X 6 + X 3 + X 2 + X, che non compare nella tabella. Per S4 = S X 4 v (X) abbiamo S4 = XS3 = X 7 + X 4 + X 3 + X 2 che, questa volta, compare in tabella come sindrome di X 13 + X 14 . Dato che X 4 v (X) è la parola v traslata a destra di 4 posizioni, abbiamo che in X 4 v (X) ci sono due errori: uno in penultima ed uno in ultima posizione. Correggendo questi due errori e poi traslando a sinistra di 4 posizioni, recuperiamo la parola inviata, cioè u = 101000011101100. In formule, u (x) = v (x) + x11 x13 + x14 , dove la riduzione al quoziente è fatta relativamente al polinomio X 15 + 1. 1 Ricordiamo che r = 8 e −1 = 1. CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 64 Osserviamo che con lo schema di Meggitt abbiamo dovuto calcolare una tabella con solo 16 sindromi, invece che una tabella con le 121 sindromi di tutti i polinomi di peso minore o uguale a 2. Esempio 4.11. Con le stesse impostazioni, supponiamo questa volta di aver ricevuto la parola v = 101000011011000, che corrisponde al polinomio v (X) = 1 + X 2 + X 7 + X 8 + X 10 + X 11 . Se calcoliamo tutte le sindromi, abbiamo la tabella i S X i v (X) 0 1 X7 + X5 + X3 + X2 + X + 1 X7 + X3 + X2 + X + 1 2 X7 + X6 + X3 + X2 + X + 1 3 X6 + X3 + X2 + X + 1 4 X7 + X4 + X3 + X2 + X 5 X7 + X6 + X5 + X3 + X2 + 1 6 X3 + X + 1 7 X4 + X2 + X 8 X5 + X3 + X2 9 X6 + X4 + X3 10 X7 + X5 + X4 11 X7 + X5 + X4 + 1 12 7 X + X5 + X4 + X + 1 13 X7 + X5 + X4 + X2 + X + 1 14 X7 + X5 + X4 + X3 + X2 + X + 1 Come si vede, in nessun caso otteniamo una delle sindromi “ammissibili” precedentemente calcolate: in questo caso lo schema di decodifica della sezione 4.1 (e quindi anche lo schema di Meggitt) restituisce un errore; ciò vuol dire che non c’è alcuna parola del codice che dista al più 2 da v. 4.3 Decodifica dei codici BCH I codici BCH, con la sottofamiglia dei codici Reed-Solomon, hanno importanti applicazioni, grazie al fatto che esistono efficienti algoritmi di decodifica. Un algoritmo di decodifica ha come scopo di determinare il numero degli errori; le posizioni degli errori; i valori degli errori. Alcuni di questi obiettivi possono essere raggiunti seguendo strade diverse, sviluppando così algoritmi più o meno efficienti. Fissiamo la notazione che useremo. CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 65 q = pa è una potenza di un primo, n è un intero coprimo con p, b = ordn (q), β è un elemento primitivo di Fqb e α è una radice primitiva n-esima di 1 in Fqb ; C è un [n, k]-codice BCH in senso stretto su Fq (che il codice sia in senso stretto non è un’ipotesi necessaria ma semplifica la notazione); g (X) = g0 + · · · + gr X r (con k + r = n) è il polinomio generatore di C; δ è la distanza designata; w è la parola ricevuta: essa è composta da una parola del codice v ed un errore e di peso ; i corrispondenti polinomi sono m ≤ t = δ−1 2 w (X) = v (X) + e (X) = v (X) + ei1 X i1 + · · · + eim X im con eij 6= 0 Stiamo quindi implicitamente usando l’ipotesi di lavoro che siano avvenuti m ≤ t errori, come già più volte osservato. La prima delle nostre incognite è m, il numero degli errori avvenuti durante la trasmissione. Le altre sono gli interi i1 , . . . , im , detti locazioni degli errori, e i valori ei1 , . . . , eim ∈ Fq , detti grandezze degli errori. Per costruzione, v αi = 0 per i = 1, . . . , 2t, per cui se definiamo le sindromi Si tramite i Si = w α si ha Si = w αi = v αi + e αi = e αi m m m X i j X i X = eij αi = eij αij = j γji j=1 j=1 j=1 dove si è posto j = eij ∈ Fq e γj = αij ∈ Fqb per j = 1, . . . , m. Osserviamo che logα γj = ij , pertanto i γj tengono traccia delle posizioni in cui si sono verificati gli errori. Indichiamo inoltre con S (X) il polinomio sindrome: S (X) = S1 + S2 X + · · · + S2t X 2t−1 . Abbiamo quindi un sistema di 2t equazioni 1 γ12 + · · · + m γm 2 1 γ 1 + · · · + m γ m .. .. . ··· . 2t 1 γ12t + · · · + m γm = = .. . S1 S2 .. . = S2t In questo sistema i valori S1 , . . . , S2t sono noti, mentre non sono noti m, gli j ed i γj . Algoritmo PGZ e metodo di Forney L’algoritmo PGZ prende il nome dai suoi ideatori: Peterson, Gorenstein e Ziegler. (4.3) (4.4) CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 66 Determinazione del numero degli errori Per prima cosa, occupiamoci di determinare m a partire dalla sola conoscenza degli Sj . Per l = 1, . . . , t definiamo la matrice S1 S2 · · · Sl S2 S3 · · · Sl+1 S[l] = . .. .. . .. . ··· . Sl Sl+1 · · · S2l−1 Teorema 4.12. S[m] è invertibile e inoltre m = rk S[t] . Dimostrazione. Indichiamo con D la matrice diagonale 1 γ 1 0 ··· 0 γ ··· 2 2 D= .. .. 0 . . 0 ··· 0 0 0 0 m γ m e, per l ≤ t, indichiamo con Al la matrice 1 γ1 .. . Al = γji−1 i=1,...,l = j=1,...,m γ1l−1 Svolgendo i calcoli, si verifica 1 γ1 Al DAtr l = .. . ··· ··· ··· ··· 1 γm .. . . l−1 γm che ··· ··· 1 γm .. . 0 1 1 γ 1 · · · .. .. .. . . . . . . ··· 0 · · · 1 m γm l−1 γ1l−1 · · · γm S1 S2 · · · Sl S2 S3 · · · Sl+1 = . .. .. = S[l] .. . ··· . Sl Sl+1 · · · S2l−1 γ1 .. . γm ··· ··· ··· γ1l−1 .. . l−1 γm (4.5) Dato che per costruzione gli elementi γ1 , . . . , γm ∈ Fqb sono distinti non nulli, per l = m la matrice Am è una matrice di Vandermonde invertibile; essendo anche gli 1 , . . . , m non nulli, ne segue che S[m] è invertibile. Ancora per il fatto che i γi sono distinti, i polinomi pi (X) ∈ Fqb [X] definiti da pi (X) = m−1 X (X − γ1 ) · . . . · (X − γi−1 ) (X − γi+1 ) · . . . · (X − γm ) = pi,j X j (γi − γ1 ) · . . . · (γi − γi−1 ) (γi − γi+1 ) · . . . · (γi − γm ) j=0 sono di grado m − 1 e tali che pi (γj ) = δi,j (dove δi,j è la delta di Kronecker). CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI Se indichiamo con P la matrice m × t p1,0 p1,1 .. .. P = . . pm,0 pm,1 ··· .. . p1,m−1 .. . 0 .. . ··· .. . 0 .. . ··· pm,m−1 0 ··· 0 67 la relazione pi (γj ) = δi,j è equivalente a P At = Im , dove Im è la matrice identità m × m. Da ciò e dal fatto che la (4.5) in particolare ci dice che At DAtr t = S[t] , abbiamo D = Im DIm = P At DAtr P tr = P S[t] P tr da cui rk S[t] ≥ rk P S[t] P tr = rk D = m. D’altra parte, rk S[t] = rk At DAtr ≤ rk D = m t e quindi rk S[t] = m. In virtù di questo teorema si ha det S[m] 6= 0 mentre det S[m+1] = det S[m+2] = · · · = det S[t] = 0 per cui per determinare m si deve calcolare det S[t] , det S[t−1] , det S[t−2] e così via fino a quando non se ne trova uno non nullo: l’ordine di questo minore principale è il valore m cercato. Naturalmente, il caso in cui non si sono verificati errori è quello in cui Si = 0 per ogni i: in questo caso, l’algoritmo termina subito. Determinazione della posizione degli errori Dato che ij = logα γj , la posizione degli errori è nota una volta che sono noti i valori γ1 , . . . , γm (a meno di risolvere il problema del logaritmo discreto). Questi ultimi, a loro volta, sono noti una volta che sono noti i coefficienti del polinomio σ (X) = (1 − γ1 X) (1 − γ2 X) · . . . · (1 − γm X) = 1 + m X σi X i . (4.6) i=1 −1 sono esattamente tutte (a meno di trovare le radici del polinomio). Infatti, si ha che γ1−1 , . . . , γm e sole le radici di σ. Per questo motivo il polinomio σ (X) è detto polinomio error locator. Osserviamo che questo polinomio ha tutte le radici distinte. In definitiva, il problema di determinare la posizione degli errori si riconduce al problema di determinare i coefficienti di σ (X). Teorema 4.13. Gli elementi σi sono l’unica soluzione del sistema lineare m × m S1 S2 ··· Sm σm −Sm+1 S2 S3 · · · Sm+1 σm−1 −Sm+2 = . .. .. . . . .. .. .. .. . . Sm Sm+1 · · · S2m−1 σ1 −S2m (4.7) CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 68 Dimostrazione. Per costruzione, σ γi−1 = 0 per i = 1, . . . , m; vale a dire σ1 γ1−1 .. . 1 + .. . 1 + −1 σ1 γm +···+ ··· +···+ σm γ1−m .. . = 0 .. . −m σm γm = 0 Fissiamo un intero i ∈ {1, . . . , 2t − m} e moltiplichiamo la riga j per j γji+m : i+m 1 γ 1 .. . i+m m γ m + σ1 1 γ1i+m−1 .. . + i+m−1 σ 1 m γ m +···+ σm 1 γ1i .. . ··· i + · · · + σ m m γ m = 0 .. . = 0 Sommando tutte le righe, otteniamo Si+m + σ1 Si+m−1 + · · · + σm Si = 0 per i = 1, . . . , 2t − m. (4.8) In particolare, per i = 1, . . . , m le (4.8) sono esattamente il sistema lineare (4.7). La matrice dei coefficienti di tale sistema è S[m] e il suo rango, secondo il teorema 4.12, è esattamente m. Il sistema ha quindi un’unica soluzione, che può essere calcolata con i metodi dell’algebra lineare. Osservazione 4.14. I calcoli fatti nella dimostrazione sono una parafrasi di quelli necessari per dimostrare le identità di Newton. Di fatto, se q = 2 allora le equazioni del sistema (4.7) sono proprio le equazioni di Newton per i relativi indici. Osservazione 4.15. Dato che σ (X) = 1 + σ1 X + · · · + σm−1 X m−1 + σm X m , il suo polinomio reciproco σ ∗ (X) è σ ∗ (X) = X m σ X −1 = X m + σ1 X m−1 + · · · + σm−1 X + σm m Y (X − γj ) = j=i quindi determinare l’uno o l’altro è indifferente perché ci si riduce sempre al sistema (4.7). Il motivo per cui viene scelta la (4.6) come definizione del polinomio error locator è che, come vedremo, per il calcolo del valore dell’errore è più naturale usare σ (X) invece di σ ∗ (X). Se invece non è necessario calcolare il valore dell’errore (per esempio, nel caso di un codice binario) allora può essere più spontaneo usare i coefficienti σ1 , . . . , σm per costruire σ ∗ (X) piuttosto che σ (X), in modo da evitare il passaggio di invertire le radici. Determinazione del valore degli errori Avendo determinato m e gli interi i1 , . . . , im , ci restano da determinare i valori degli errori, cioè gli eij . Naturalmente ciò non è necessario nel caso q = 2: nel caso dei codici binari l’algoritmo si arresta qui. CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 69 Il sistema (4.4) 1 γ 1 1 γ12 .. . 1 γ12t +···+ +···+ ··· +···+ m γ m 2 m γ m .. . = = .. . S1 S2 .. . 2t m γ m = S2t è a questo punto un sistema lineare a coefficienti in Fqb di rango massimo m nelle incognite j = eij con i = 1, . . . , m e siamo nuovamente ricondotti all’utilizzo degli algoritmi dell’algebra lineare. Osservazione 4.16. Da quanto detto, risulta che per poter applicare questo algoritmo sono necessari alcuni algoritmi collaterali: logaritmo discreto nei campi finiti, calcolo delle radici di un polinomio a coefficienti in un campo finito e calcolo dell’inverso di un elemento di un campo finito; infatti, dalla conoscenza di σ (X) dobbiamo essere in grado di ricavare le sue radici ζj , da queste gli inversi γj = ζj−1 e da questi ultimi gli interi ij = logα γj , che sono le locazioni degli errori. Questo si applica, come vedremo, anche a tutti gli altri algoritmi di decodifica: ogni algoritmo ci permetterà di determinare il polinomio error locator e da questo dobbiamo ricavare gli altri dati necessari. Di questi tre problemi solo il calcolo dell’inverso è di facile ed efficiente soluzione, grazie all’algoritmo euclideo; gli altri due problemi sono complessi e non ci occuperemo qui della loro soluzione. Citiamo solo l’esistenza di un algoritmo molto utilizzato (l’algoritmo Chien search) che permette di ridurre la complessità computazionale della ricerca delle radici di un polinomio rispetto al semplice tentativo “a forza bruta”. Riepilogo PGZ Tenuto conto dell’osservazione precedente, l’algoritmo si basa sui teoremi 4.12 e 4.13 e il suo svolgimento segue il seguente schema: 1. individuazione del numero degli errori: calcolare le sindromi Si per i = 1, . . . , 2t e costruire le matrici S[i] per i = 1, . . . , t; calcolare det S[i] per i = t, t − 1, . . . , 2, 1: il primo indice m per cui det S[m] 6= 0 è il numero degli errori; 2. individuazione della posizione degli errori: risolvere il sistema lineare non singolare (4.7) S1 S2 ··· Sm σm −Sm+1 S2 S3 · · · Sm+1 σm−1 −Sm+2 = . .. .. . . . .. .. .. .. . . Sm Sm+1 ··· 3. (solo se q 6= 2) individuazione del singolare (4.4) 1 γ 1 1 γ12 .. . 1 γ12t S2m−1 −S2m σ1 valore degli errori: risolvere il sistema lineare non +···+ +···+ m γ m 2 m γ m .. . ··· 2t + · · · + m γ m = = .. . S1 S2 .. . = S2t CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 70 Metodo di Forney Il metodo di Forney è una variante dell’algoritmo PGZ. Le osservazioni che si svolgono per svilupparlo sono poi utili anche per sviluppare altri algoritmi. I primi due passi (calcolo del numero degli errori e della loro posizione) sono invariati. Nel terzo passo (la determinazione del valore degli errori) invece di risolvere il sistema lineare (4.4) si utilizza un polinomio che, opportunamente valutato, permette di calcolare il valore degli errori. Naturalmente in tutto quanto segue si assume che m > 0, altrimenti l’algoritmo termina subito. Iniziamo osservando che Lemma 4.17. Il polinomio S (X) σ (X) non ha monomi nei gradi m, . . . , 2t − 1. Dimostrazione. Pensando ad S (X) e σ (X) come serie di potenze con coefficienti nulli negli indici maggiori dei rispettivi gradi, abbiamo ! ∞ h X X S (X) σ (X) = Sh−k+1 σk X h . h=0 k=0 La tesi è quindi equivalente alle equazioni (4.8). Il lemma ci induce a definire un nuovo polinomio Definizione 4.18. Sia ω (X) il polinomio resto della divisione di S (X) σ (X) rispetto a X 2t , di modo che ω (X) ≡ S (X) σ (X) (mod X 2t ). (4.9) ω (X) è detto polinomio error evaluator. Per il lemma, si ha deg ω (X) < m. Teorema 4.19. Se indichiamo con σ 0 (X) la derivata di σ (X), allora gli errori sono dati da ω α−ik ω γk−1 k = eik = − 0 −i = − 0 −1 per k = 1, . . . , m. σ (α k ) σ γk Dimostrazione. Per prima cosa, osserviamo che il polinomio error locator è, per costruzione, un 0 polinomio senza radici multiple pertanto, per il criterio della derivata, MCD (σ (X) , σ (X)) = 1 0 −ij e quindi 0 6= σ α ∈ Fqb . Per definizione, S (X) = 2t−1 X Si+1 X i i=0 = 2t−1 X m X i=0 = m X = j=1 j γji+1 X i j=1 j γ j j=1 m X 2t−1 X ! γji X i i=0 2t j γ j (γj X) − 1 γj X − 1 CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 71 da cui S (X) σ (X) = S (X) m Y (1 − γl X) l=1 m Y m = (−1) S (X) (γl X − 1) l=1 m m 2t Y X (γ X) − 1 j m (γl X − 1) = (−1) j γ j γj X − 1 j=1 (4.10) l=1 = (−1) m m X m Y 2t j γj (γj X) − 1 (γl X − 1) j=1 ≡ (−1) m+1 l=1 l6=j m X j γ j j=1 m Y (γl X − 1) (mod X 2t ) l=1 l6=j Dato che deg ω (X) ≤ 2t − 1 e m ≤ t abbiamo ω (X) = (−1) m+1 m X j γ j j=1 = m X j γ j j=1 m Y m Y (γl X − 1) l=1 l6=j (4.11) (1 − γl X) l=1 l6=j e valutando in γk−1 otteniamo m Y m+1 k γ k γl γk−1 − 1 . ω γk−1 = (−1) (4.12) l=1 l6=k Occupiamoci ora di σ (X): da σ (X) = (−1) m m Y (γl X − 1) l=1 segue m σ 0 (X) = (−1) m X γj j=1 m Y (γl X − 1) . l=1 l6=j e quindi si ha m Y m σ 0 γk−1 = (−1) γk γl γk−1 − 1 . l=1 l6=k Mettendo insieme la (4.12) e la (4.13) si ha la tesi. (4.13) CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 72 Osservazione 4.20. La formula (4.11) potrebbe essere usata come definizione alternativa del polinomio error evaluator: m+1 ω (X) = (−1) m X j γ j j=1 m Y (γl X − 1) (4.14) l=1 l6=j Osservazione 4.21. La definizione del polinomio error evaluator 4.18 sembra uscire dal cilindro. Per capire come si arriva a questa definizione, costruiamo un polinomio h (X) tale che h γk−1 = k per k = 1, . . . , m.. Il procedimento per fare ciò è semplice e ben noto: prima si costruiscono dei polinomi hj (X) tali che hj γk−1 = δj,k : m Y (γl X − 1) . hj (X) = γl γj−1 − 1 l=1 l6=j Se, per brevità, poniamo gj (X) = Qm l=1 l6=j (1 − γl X), possiamo scrivere σ (X) = (1 − γj X) m Y (1 − γl X) = (1 − γj X) gj (X) l=1 l6=j e σ 0 (X) = − m X γj gj (X) . j=1 A questo punto, basta porre h (X) = m X j hj (X) . (4.15) j=1 Il problema è che in questo modo nella definizione di h (X) si usano gli k , che sono proprio le nostre incognite. È necessario allora cercare qualche relazione che permetta di costruire h (X) usando ciò che conosciamo e dato che il valore degli k è in qualche modo codificato nelle sindromi, è ragionevole aspettarci che nella relazione cercata interverrà il polinomio sindrome. Dato che hj (X) = gj (X) gj γj−1 la (4.15) diventa h (X) = m X j=1 −1 ma gj γj −1 = −γj−1 σ 0 γj j gj (X) ; gj γj−1 e quindi h (X) = − m X j=1 j m X gj (X) gj (X) = − j γj 0 −1 γj−1 σ 0 γj−1 σ γj j=1 è il polinomio cercato tale che h γk−1 = k per k = 1, . . . , m. (4.16) CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 73 La (4.16) suggerisce la definizione ω (X) = m X j γj j=1 m Y (1 − γl X) (4.17) l=1 l6=j (in accordo con la (4.11)) dato che la funzione razionale − σω(X) 0 (X) ha valutazione uguale a quella −1 −1 del polinomio h (X) in γ1 , . . . , γm : m m m Y Y X ω γk−1 = j γ j 1 − γl γk−1 = k γk 1 − γl γk−1 = k γk gk γk−1 = −k σ 0 γk−1 . j=1 l=1 l6=j l=1 l6=k Seguendo questa strada, resta da dimostrare che ω (X) definito secondo la (4.17) sia lo stesso precedentemente definito, cioè che con questa definizione è soddisfatta la relazione ω (X) ≡ S (X) σ (X) (mod X 2t ). Ciò naturalmente può essere fatto ripercorrendo a ritroso la (4.10). Quest’ultima, comunque, trova anche un’interpretazione che ne chiarisce l’origine, a patto di mettersi nel campo delle serie formali di Laurent Fqb ((X)): in tale campo, ω (X) = (−1) m+1 m X j γ j j=1 = (−1) m+1 = σ (X) m X j=1 m X − j=1 = σ (X) m X m X m Y 1 j γ j (γl X − 1) γj X − 1 l=1 1 j γ j γj X − 1 −j γj j=1 = σ (X) ∞ X l=0 j (γl X − 1) l=1 l6=j j=1 = σ (X) m Y ∞ X ∞ 1 X l+1 l γj X − γj l=0 ! ! γjl+1 X l l=0 m X j γjl+1 X l j=1 e si riconosce che i primi 2t coefficienti dell’ultima serie di potenze sono esattamente le sindromi: troncando quindi questa relazione al grado 2t, cioè passando al quoziente modulo X 2t , si ottiene esattamente la (4.10) che è alla base della definizione 4.18. Corollario 4.22. Si ha deg ω (X) < m e ω (X) 6= 0. Dimostrazione. Segue dalla formula (4.11) che definisce ω (X) e dal fatto che che i γj sono tutti distinti per cui m Y ω γk−1 = −k γk 1 − γl γk−1 = −k σ 0 γk−1 = 6 0 l=1 l6=k per k = 1, . . . , m. CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 74 Algoritmo di Sugiyama L’algoritmo di Sugiyama evita il calcolo dei determinanti agendo in modo più efficiente rispetto all’algoritmo PGZ. Questo algoritmo utilizza l’algoritmo euclideo e risolve la decodifica determinando in un colpo solo sia m che i polinomi error locator ed error evaluator. Come nella precedente sezione, anche in questa supponiamo che S (X) 6= 0, cioè m > 0, altrimenti abbiamo una parola del codice e l’algoritmo termina subito. Riprendiamo la relazione che definisce ω (X): ω (X) ≡ S (X) σ (X) (mod X 2t ). (4.18) Questa equazione è equivalente al fatto che esiste un polinomio v (X) tale che ω (X) = v (X) X 2t + S (X) σ (X) . (4.19) Definizione 4.23. L’equazione (4.19) (anche nella sua versione modulare (4.18)) è detta equazione fondamentale per i codici BCH. Nell’equazione fondamentale (4.19) i polinomi S (X) e σ (X) determinano univocamente i polinomi ω (X) e v (X). Per calcolarli, ripartiamo dall’ultima uguaglianza nella (4.10) (quella che si ha subito prima di passare al modulo): m S (X) σ (X) = (−1) m X m Y 2t j γj (γj X) − 1 (γl X − 1) j=1 m = (−1) m X l=1 l6=j j γj2t+1 j=1 m Y m m X Y m+1 j γ j (γl X − 1) (γl X − 1) X 2t + (−1) j=1 l=1 l6=j m m l=1 l6=j Y X m+1 (γl X − 1) X 2t + ω (X) j γj2t+1 = − (−1) j=1 l=1 l6=j pertanto se si pone v (X) = (−1) m+1 m X j=1 j γj2t+1 m Y (γl X − 1) (4.20) l=1 l6=j si ottiene la (4.19). Definizione 4.24. Il polinomio (4.20) è detto polinomio error co-evaluator. Abbiamo quindi che i polinomi error locator, error evaluator ed error co-evaluator sono una terna che soddisfano l’equazione fondamentale. Riassumiamo alcune loro proprietà evidenti. Lemma 4.25. Siano ω (X), v (X) e σ (X) rispettivamente, i polinomi error evaluator, error co-evaluator ed error locator. Allora 1. deg ω (X) < t; 2. deg v (X) < t; 3. deg σ (X) ≤ t; CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 75 4. σ (0) = 1; 5. MCD (σ (X) , v (X)) = 1. Dimostrazione. Le prime quattro seguono direttamente dalla definizione (per le prime tre in realtà dalla definizione segue che le disuguaglianze possono essere anche più strette). Quanto −1 all’ultima, anch’essa segue dalla definizione osservando che le radici di σ (X) sono γ1−1 , . . . , γm e m Y m+1 −1 2t+1 v γj = (−1) j γ j γl γj−1 − 1 6= 0 l=1 l6=j dato che i γj sono tutti diversi tra loro. Il nostro obiettivo è mostrare che le proprietà elencate nel lemma 4.25 sono sufficienti a determinare univocamente la terna ω (X), v (X) e σ (X). Per trovare altre soluzioni che soddisfino l’equazione, osserviamo che ∃a (X) , b (X) , c (X) |a (X) = b (X) X 2t + c (X) S (X) ⇔ a (X) ∈ MCD X 2t , S (X) . Lemma 4.26. MCD X 2t , S (X) = X d per qualche d < t. 2t Dimostrazione. Chiaramente MCD X , S (X) = X d per qualche d. Essendo soluzione dell’e d quazione fondamentale, ω (X) ∈ X ; dal corollario 4.22, ω (X) 6= 0, pertanto d ≤ deg ω (X) e quindi d < t per il lemma precedente. Dato che il massimo comun divisore tra X 2t e S (X) ha grado minore di t, l’algoritmo euclideo ci permette di trovare delle soluzioni dell’equazione fondamentale aventi grado “abbastanza piccolo”: il teorema A.3 dice che se ri (X), xi (X) e yi (X) sono le successioni indicate per il calcolo di MCD X 2t , S (X) allora si ha ri (X) = xi (X) X 2t + yi (X) S (X) . Grazie al teorema A.13, i gradi dei resti ri (X) formano una successioni di interi strettamente decrescente per i ≥ 1: indichiamo con ω0 (X) il primo resto rj (X) per cui deg rj (X) < t e con v0 (X) e σ0 (X) i rispettivi coefficienti xj (X) e yj (X) nell’equazione precedente. Teorema 4.27. Con le notazioni precedenti, valgono le seguenti proprietà: 1. deg ω0 (X) < t; 2. deg v0 (X) < t; 3. deg σ0 (X) ≤ t; 4. MCD (σ0 (X) , v0 (X)) = 1. Dimostrazione. La 1 vale per costruzione. La 4 è la A.3.7. Usando la notazione dell’algoritmo euclideo, per il teorema A.13 si ha deg yj−1 (X) < deg σ0 (X) e deg rj−1 (X) > deg ω0 (X) da cui deg (yj−1 (X) ω0 (X)) < deg (σ0 (X)rj−1 (X)) . CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 76 Dal teorema A.3.5, σ0 (X) rj−1 (X) − ω0 (X) yj−1 (X) = ±X 2t da cui deg (σ0 (X) rj−1 (X)) = 2t. Dato che ω0 (X) = rj (X) è il primo resto di grado minore di t, si ha deg rj−1 (X) ≥ t e quindi deg σ0 (X) ≤ t, cioè la 3. Per la 2 si ragiona in modo simile: deg xj−1 (X) < deg v0 (X) per cui deg (xj−1 (X) ω0 (X)) < deg (v0 (X)rj−1 (X)) . Dato che v0 (X) rj−1 (X) − ω0 (X) xj−1 (X) = ±S (X) segue deg (v0 (X) rj−1 (X)) < 2t e deg v0 (X) < t. −1 Moltiplicando la terna σ0 (X) , ω0 (X) , v0 (X) per σ0 (0) abbiamo un’altra soluzione dell’equazione che soddisfa le proprietà del lemma 4.25: resta da capire quante sono tali terne. Teorema 4.28. Sia (a (X) , b (X) , c (X)) una soluzione dell’equazione a (X) = b (X) X 2t + c (X) S (X) . 1. Se (a) deg a (X) < t, (b) deg b (X) < t, (c) deg c (X) ≤ t allora esiste un polinomio k (X) tale che a (X) = k (X) ω (X) , b (X) = k (X) v (X) e c (X) = k (X) σ (X) . 2. Se, inoltre, MCD (b (X) , c (X)) = 1 allora k (X) = k ∈ F∗q è una costante non nulla. 3. Infine, se oltre alle precedenti vale anche c (0) = 1, allora k = 1. Dimostrazione. Supponiamo di aver dimostrato la proprietà 1. Dato che k (X) divide sia b (X) che c (X), segue che k (X) divide anche il loro massimo comun divisore, pertanto k (X) è una costante, ovviamente non nulla. La 3 segue banalmente dalla 2 e dal fatto che σ (0) = 1. Resta da dimostrare la 1. Abbiamo a (X) = b (X) X 2t + c (X) S (X) ω (X) = v (X) X 2t + σ (X) S (X) Eliminando S (X) da queste due equazioni abbiamo σ (X) a (X) − c (X) ω (X) = (σ (X) b (X) − c (X) v (X)) X 2t . Entrambi gli addendi a sinistra hanno grado strettamente minore di 2t, pertanto la precedente equazione implica σ (X) a (X) − c (X) ω (X) = 0 (4.21) σ (X) b (X) − c (X) v (X) = 0 (4.22) CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 77 Sappiamo che MCD (σ (X) , v (X)) = 1: siano f (X) e g (X) tali che f (X) σ (X) + g (X) v (X) = 1. Moltiplicando per c (X) e usando la (4.22) abbiamo c (X) = f (X) σ (X) c (X) + g (X) v (X) c (X) = f (X) σ (X) c (X) + g (X) σ (X) b (X) = (f (X) c (X) + g (X) b (X)) σ (X) = k (X) σ (X) dove k (X) = f (X) c (X) + g (X) b (X). Sostituendo c (X) nella (4.21) e nella (4.22), otteniamo infine σ (X) a (X) = σ (X) k (X) ω (X) σ (X) b (X) = σ (X) k (X) v (X) Dato che σ (X) 6= 0, dalla legge di cancellazione in Fq [X] segue a (X) = k (X) ω (X) b (X) = k (X) v (X) Unendo questi risultati, otteniamo che ω0 (X) = σ0 (0) ω (X) v0 (X) = σ0 (0) v (X) σ0 (X) = σ0 (0) σ (X) che è il risultato cercato. Riepilogo Sugiyama Riassumiamo i passaggi fondamentali per effettuare la decodifica di un codice BCH con questo metodo. 1. Determinare le sindromi S1 , . . . , S2t e costruire il polinomio sindrome S (X). 2. Applicare l’algoritmo euclideo ai polinomi X 2t e S(t) fermandosi al primo passaggio in cui il resto è di grado minore di t: siano −1 rj (X) −1 Xj (X) −1 yj (X) ω (X) = yj (0) v (X) = yj (0) σ (X) = yj (0) i polinomi così trovati: essi sono, nell’ordine, i polinomi error evaluator, error co-evaluator e error locator. 3. Il grado di σ (X) è m, il numero degli errori. CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 78 4. Determinare le posizioni degli errori trovando le radici di σ (X), facendo gli inversi e prendendone il logaritmo rispetto ad α. 5. Determinare i valori degli errori con il metodo di Forney, cioè tramite la formula ω α−ik ω γ −1 k = eik = − 0 −i = − 0 k−1 per k = 1, . . . , m. σ (α k ) σ γk Algoritmo di Berlekamp-Massey L’algoritmo di Berlekamp-Massey è probabilmente l’algoritmo più utilizzato per la correzione dei codici BCH. Esso permette di determinare il polinomio error locator σ (X) in modo più efficiente rispetto all’algoritmo PGZ perché parte da un problema computazionalmente poco complesso e aumenta ricorsivamente i calcoli solo quando sono strettamente necessari. Nel caso in cui il codice non sia binario, una volta trovato il polinomio error locator si procede alla determinazione del valore degli errori usando il metodo di Forney. Per introdurre l’algoritmo dobbiamo prima sviluppare la teoria necessaria. LFSR e serie di potenze Definizione 4.29. Una successione A = (a1 , a2 , . . .) di elementi di un campo K si dice linear feedback shift register (LFSR) se esiste un intero k > 0 e degli elementi c1 , . . . , ck tali che ai = c1 ai−1 + c2 ai−2 + · · · + ck ai−k = k X cj ai−j per ogni i > k. (4.23) j=1 La k-upla (a1 , . . . , ak ) si dice seme del LFSR mentre (c1 , . . . , ck ) si dice generatore. Il polinomio c (X) = 1 − c1 X − · · · − ck X k si dice polinomio generatore. Scriveremo anche A = h(a1 , . . . , ak ) , (c1 , . . . , ck )i = h(a1 , . . . , ak ) , c (X)i . Nel seguito tenderemo ad identificare un generatore (c1 , . .P . , ck ) con il corrispondente polinomio ∞ generatore ed il LFSR A con la serie di potenze A (X) = i=0 ai+1 X i . Osservazione 4.30. Un LFSR non è altro che la soluzione di un’equazione alle differenze finite lineare omogenea (y1 , . . . , yk ) = (a1 , . . . , ak ) yn+k − c1 yn+k−1 − · · · − ck yn = 0 per n ≥ 1 In questo contesto il problema è trovare l’equazione che fornisce una soluzione data piuttosto che trovare la soluzione data l’equazione. Osservazione 4.31. È evidente che un generatore ed il seme individuano univocamente il LFSR; essi non sono però necessariamente unici: il LFSR costante (a, a, a, . . .) ha come generatore (1) ma anche (1, −1, 1), (1, −1, 1, −1, 1), ecc. CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 79 P∞ P∞ Definizione 4.32. Se B (X) = i=0 bi X i e C (X) = i=0 ci X i sono due serie di potenze in K [[X]], il prodotto (di convoluzione) è definito in K [[X]] come ∞ X X B (X) C (X) = bj c k X i . (4.24) i=0 j+k=i Indichiamo con (B (X) C (X))i il coefficiente di grado i di B (X) C (X). Osservazione 4.33. È ben noto che il prodotto definito dalla (4.24) è associativo, per cui segue subito che (4.25) X j B (X) C (X) i = X j (B (X) C (X)) i = (B (X) C (X))i−j dove si considerano nulli i coefficienti di indice negativo. Osservazione 4.34. A causa della nostra convenzione di iniziare a contare gli indici di un LFSR a partire da 1, quando consideriamo un LFSR come serie di potenze dobbiamo tener conto di questo sfasamento nella definizione (4.24): questo vuol dire che il coefficiente del monomio di grado i è dato dalla somma dei prodotti dei coefficienti la cui somma degli indici è i + 1. Proposizione 4.35. Sia A = (a1 , a2 , . . .) un LFSR e f (X) = 1+f1 X +· · ·+fk X k un polinomio di grado k tale che f (0) = 1. Si ha A = h(a1 , . . . , ak ) , f (X)i se, e solo se, (f (X) A (X))i = 0 per ogni i ≥ deg f (X) . (4.26) Dimostrazione. Se l > k, tenendo conto dello sfasamento sottolineato nell’osservazione precedente, partendo dalla (4.23) si ha al = k X j=1 −fj al−j ⇔ k X fj al−j = 0 ⇔ (f (X) A (X))l−1 = 0. j=0 Questa proposizione ci induce a definire l’insieme dei generatori di un LFSR o, più in generale, di una serie di potenze: Definizione 4.36. Se B = B (X) è una serie di potenze, gli annullatori di B sono gli elementi dell’insieme Ann B = f (X) ∈ K [X] f (X) B (X) ∈ K [X] . (4.27) I generatori di B sono gli elementi dell’insieme Gen B = f (X) ∈ Ann B deg (f (X) B (X)) < deg f (X) . (4.28) Osservazione 4.37. Se con R indichiamo l’anello dei polinomi K [X], con M l’anello delle serie di potenze visto come R-modulo, con M 0 il sottomodulo di M dato da R1 e con N il modulo quoziente M/M 0 , allora si ha Ann B = AnnR B = f ∈ R|f B = 0 , dove B = B + M 0 è la classe di resto di B nel quoziente. Sappiamo che Ann B è un ideale di R. Osserviamo anche che 0 ∈ / Gen B. I generatori sono ovviamente chiusi rispetto alla moltiplicazione per scalari non nulli. Sono anche chiusi rispetto alle traslazioni: CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 80 Proposizione 4.38. Siano f (X) e g (X) due polinomi e supponiamo f (X) = X r g (X); allora f (X) ∈ Gen B ⇔ g (X) ∈ Gen B. Dimostrazione. Poiché i ≥ deg f (X) se e solo se i − r ≥ deg g (X), per la (4.25) si ha (f (X) B (X))i = ((X r g (X)) B (X))i = (g (X) B (X))i−r da cui la tesi. Proposizione 4.39. Sia B una serie di potenze; allora Gen B 6= ∅ ⇔ B è un LFSR. Se B è un LFSR allora Gen B = Ann B \ {0}. −1 In particolare, se Ann (B) = (f (X)) allora f (0) 6= 0 e c (X) = f (0) f (X) ∈ Gen B è un generatore per B di grado minimo. Dimostrazione. Se B è un LFSR, per definizione Gen B 6= ∅. Viceversa, sia f (X) ∈ Gen B e scriviamo f (X) = aX r g (X) con g (0) = 1. Per la proposizione 4.38 si ha g (X) ∈ Gen B e g (X) è un polinomio generatore perché g (0) = 1, quindi B è un LFSR. Supponiamo ora Gen B 6= ∅ e siano Ann (B) = (f (X)) con f (X) 6= 0 e h (X) ∈ Gen B. Allora h (X) = q (X) f (X) per un polinomio q (X) ∈ K [X]. Poiché h (X) ∈ Gen B e f (X) ∈ Ann (B) si ha deg (h (X) B (X)) < deg (h (X)) deg (q (X) f (X) B (X)) < deg (q (X) f (X)) deg q (X) + deg (f (X) B (X)) < deg q (X) + deg f (X) deg (f (X) B (X)) < deg f (X) pertanto f (X) ∈ Gen B. Utilizzando gli stessi conti al contrario, si ottiene che ogni multiplo non nullo di f (X) è in Gen B. Sia ora Ann (B) = (f (X)) e scriviamo f (X) = X r g (X) con g (0) 6= 0. Se si assume r > 0, applicando la proposizione 4.38 si contraddice la minimalità di deg f (X). Da ciò segue che è possibile definire nell’enunciato. Dato che c (0) = 1, dalla proposizione 4.35 c (X) come indicato segue che B = b1 , . . . , bdeg c(X) , c (X) . Grazie alla proposizione 4.39 possiamo definire il generatore di grado minimo. Definizione 4.40. Sia A un LFSR e sia f (X) ∈ Gen A è un polinomio di grado minimo tra quelli in Gen A; se f (0) = 1, allora f (X) è detto polinomio generatore di grado minimo di A. Il fatto che Gen A = Ann (A) \ {0} ci assicura che il polinomio generatore di grado minimo di A è unico e si ha (f (X)) = Ann (A). La proposizione 4.39 ci permette di caratterizzare i LFSR all’interno di K [[X]] (o, meglio, all’interno del suo campo quoziente). Ricordiamo che una serie di potenze B = B (X) è invertibile se, e solo se, B (0) 6= 0. Corollario 4.41. Sia B = B (X) una serie di potenze. 1. Ann (B) 6= {0} se, e solo se, esistono due polinomi f (X) e g (X) tali che B (X) = g(X) f (X) . CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 81 2. Gen B 6= ∅ se, e solo se, esistono due polinomi f (X) e g (X) tali che f (0) 6= 0, deg g (X) < deg f (X) e B (X) = fg(X) (X) . In tali casi, se si scelgono f (X) e g (X) tali che MCD (f (X) , g (X)) = 1 allora (f (X)) = I (B). Dimostrazione. I due punti sono simili: mostriamo solo il secondo. (⇐) Si ha f (X) B (X) = g (X) e quindi f (X) ∈ Gen B che pertanto è non vuoto; dalla proposizione 4.39 segue che B è un LFSR. (⇒) Sia f (X) un polinomio generatore di B e poniamo g (X) = f (X) B (X). Dal fatto che f (X) è un polinomio generatore abbiamo f (0) = 1, pertanto f (X) è invertibile, per cui B (X) = fg(X) (X) ; poiché f (X) ∈ Gen B, abbiamo deg g (X) < deg f (X). Sia ora MCD (f (X) , g (X)) = 1 e sia h (X) ∈ Ann (B), di modo che h (X) B (X) è un polinomio; poiché h (X) B (X) = h(X)g(X) f (X) , usando il fatto che MCD (f (X) , g (X)) = 1 si ottiene f (X) |h (X), da cui la tesi. Osservazione 4.42. Indicando con S = {f ∈ K [X] |f (0) 6= 0} si ha che S è chiuso moltiplicativamente ed inoltre S ⊂ U (K [[X]]), pertanto possiamo effettuare l’identificazione S −1 K [X] ⊂ K [[X]]. In questo senso, il corollario 4.41 ci dice che i LFSR sono le “frazioni proprie” di K [[X]]. Questo vuol anche dire che l’algoritmo di Berlekamp-Massey è lo strumento che permette di costruire la funzione generatrice, espressa in forma di funzione razionale, di una successione definita per ricorrenza, cfr. (4.49). LFSR generati da successioni finite Lo scopo dell’algoritmo di Berlekamp-Massey è determinare il polinomio generatore di grado minimo per un LFSR di cui siano forniti i primi N elementi, cioè risolvere il seguente problema. Problema 4.43. Dati N elementi S = (S1 , . . . , SN ), determinare un polinomio c (X) = 1 + c1 X + · · · + cl X l di grado minore o uguale a N tale che esso generi, insieme a (S1 , . . . , Sl ), un LFSR i cui primi N elementi siano proprio (S1 , . . . , SN ) e tale che c (X) sia di grado minimo rispetto a questa proprietà. In altre parole, vogliamo trovare un polinomio generatore di grado minimo di fra tutti i polinomi che generano un LFSR che inizia per S. Osservazione 4.44. Non è detto che una soluzione del problema 4.43 sia necessariamente unica. Per esempio, si consideri S = (0, 1): evidentemente, non esiste nessun polinomio c (X) = 1 + c1 X di primo grado che generi, insieme ad un opportuno seme (a), un LFSR A = (a1 , a2 , a3 , . . .) tale che (a1 , a2 ) = S. Infatti si dovrebbe avere a = 0 ma allora il LFSR generato è sempre il LFSR con tutti i termini nulli, indipendentemente da c1 . Viceversa, ogni polinomio di secondo grado c (X) = 1 + c1 X + c2 X 2 genera, insieme al seme (0, 1), un LFSR i cui primi due elementi sono banalmente S. Saremo in particolare interessati a risolvere il problema con dato iniziale fornito dalla successione delle sindromi. In questo caso è naturale estendere la successione finita delle sindromi S1 , . . . , S2t in modo da ottenere un LFSR: se poniamo Sj + σ1 Sj−1 + · · · + σm Sj−m = 0 per j > 2t, (4.29) allora queste equazioni, insieme alle (4.8), ci dicono che Σ = {S1 , S2 , . . .} è un LFSR avente il polinomio error locator σ (X) come generatore e gli elementi (S1 , . . . , Sm ) come seme. CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 82 Introduciamo la notazione che useremo nel seguito. Se A è un LFSR, indichiamo con A(k) i primi k elementi di A. Se S = (S1 , . . . , SN ) è una successione finita e c (X) = 1 + c1 X + · · · + cN X N un polinomio tale che c (0) = 1, indichiamo con hS, c (X)i il LFSR generato da S e c (X). Poniamo n o hSi = A | A è un LFSR e A(N ) = S (4.30) cioè l’insieme di tutti i LFSR che iniziano per S. Con G (S) indichiamo l’insieme di tutti i polinomi generatori di grado minimo di qualche LFSR che inizia per S: G (S) = c (X) ∈ K [X] | c (X) (4.31) è un polinomio generatore di grado minimo per qualche A ∈ hSi e infine indichiamo con l (S) il minimo dei gradi possibili: l (S) = min {deg c (X) | c (X) ∈ G (S)} . (4.32) Appare evidente che ci capiterà frequentemente di confrontare i primi termini di un LFSR con una successione data: ciò viene fatto tramite la proposizione 4.35. Riscriviamo questo caso particolare per riferimenti futuri. Lemma 4.45. Sia f (X) = 1 + f1 X + · · · + fl X l un polinomio di grado l e sia h un intero tale che l < h. Indichiamo con A = (a1 , a2 , . . .) il LFSR generato da f (X) e S (l) . Allora A(h) = S (h) se, e solo se, f (X) S (h) (X) = 0 per l < j ≤ h. (4.33) j−1 Secondo queste definizioni, se g (X) ∈ G (S) e l = deg g (X) ≤ N allora g (X) genera, insieme a (S1 , . . . , Sl ), un LFSR che inizia per S e pertanto l ≥ l (S). Lemma 4.46. Con la notazione introdotta, hSi = 6 ∅ e l (S) ≤ N . Inoltre, se S 0 è un’altra successione e l0 = l (S 0 ) è il corrispondente minimo grado, allora S ⊂ S 0 ⇒ l (S) ≤ l (S 0 ). Dimostrazione. Se S (N ) = (S1 , . . . , SN ) è la successione data, basta considerare una qualsiasi successione di elementi (c1 , . . . , cN ): il LFSR da loro generato considerandoli, rispettivamente, seme e generatore inizia per S. Quindi hSi = 6 ∅. Inoltre il polinomio generatore c (X) = 1 − c1 X − · · · − cN X N ha grado N e quindi l ≤ N . L’ultima osservazione segue dal fatto che hS 0 i ⊂ hSi. Grazie al lemma 4.46 abbiamo l’esistenza di una soluzione al problema 4.43 e anche un limite superiore per il grado delle soluzioni. Ovviamente non è detto che il polinomio 1−c1 X −· · ·−cN X N , che è un polinomio generatore, realizzi il grado minimo l(S): ciò avviene se, e solo se, l (S) = N . Il nostro obiettivo è calcolare una soluzione del problema 4.43 nel caso in cui S = (S1 , . . . , S2t ), le sindromi di un codice BCH. Lo studio fatto dell’equazione fondamentale per i codici BCH ci dice che la soluzione del problema è proprio il polinomio error locator. Lemma 4.47. Se S = (S1 , . . . , S2t ) allora l (S) ≤ m. Dimostrazione. La successione Σ definita dalle (4.29) è un LFSR che inizia per S, cioè Σ ∈ hSi; il suo polinomio generatore è il polinomio error locator σ (X), cioè σ (X) ∈ G (S); da ciò, l (S) ≤ m = deg σ (X). CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 83 Teorema 4.48. Siano S = (S1 , . . . , S2t ) le sindromi di un codice BCH e Σ = {S1 , S2 , . . .} il LFSR delle sindromi. Se c (X) una soluzione del problema 4.43 per S e se deg c (X) ≤ t, allora si deve avere c (X) = σ (X) e l (S) = m, dove σ (X) è il polinomio error locator e m è il suo grado. Dimostrazione. Nel caso delle sindromi, per il lemma abbiamo l (S) ≤ m = deg σ (X), dato che σ (X) ∈ hSi. Sia dunque c (X) una soluzione del problema con N = deg c (X) ≤ m e poniamo C = h(S1 , . . . , SN ) , c (X)i. Per il lemma 4.45, da C (2t) = S segue che S (X) c (X) non ha monomi nei gradi m, . . . , 2t − 1. Sia a (X) il resto della divisione di S (X) c (X) rispetto a X 2t ; da quanto appenda detto, deg a (X) < m ≤ t. Se poniamo a (X) − S (X) c (X) = b (X) X 2t , si ha che anche deg b (X) < t, pertanto la terna a (X) , b (X) , c (X) è una soluzione dell’equazione fondamentale (4.19) che soddisfa le proprietà del teorema 4.28. Da ciò, esiste k (X) tale che c (X) = k (X) σ (X); questo, unito al fatto che deg c (X) ≤ deg σ (X), implica che k (X) è una costante (non nulla). Da σ (0) = c (0) = 1, segue k = 1 L’algoritmo B-M Sia data una successione S = (S1 , . . . , S2t ). L’algoritmo di Berlekamp-Massey che svilupperemo in questa sezione permette di risolvere il problema 4.43 per la successione S. Nel caso particolare in cui S è la successione delle sindromi, il teorema 4.48 ci assicura che la soluzione è il polinomio error locator. Osservazione 4.49. Se m è il grado del polinomio error locator, da quanto visto nelle sezioni precedenti segue che il LFSR Σ delle sindromi è, in realtà, univocamente determinato dai soli S1 , S2 , . . . , S2m . Non supponendo di conoscere m né il polinomio error locator, il nostro punto di partenza sarà necessariamente la successione S1 , S2 , . . . , S2t . Come nella sezione precedente poniamo S (j) = (S1 , S2 , . . . , Sj ) per 1 ≤ j ≤ 2t. Indichiamo anche con S (j) (X) il polinomio individuato da S (j) . Il nostro obiettivo è costruire dei polinomi (j) (j) σ (j) (X) = 1 + σ1 X + · · · + σlj X lj di grado lj ≤ j tali che σ (j) (X) generi, con seme S1 , . . . , Slj , un LFSR Σj i cui primi j elementi siano S (j) e, inoltre, tali che σ (j) (X) sia soluzione del problema 4.43 per S (j) . Introduciamo la seguente notazione, in accordo a quella della precedente sezione. Per 1 ≤ j ≤ 2t definiamo n o λj = min deg c (X) | c (X) ∈ G S (j) . Dal lemma 4.46 segue che λj ≤ j per 1 ≤ j ≤ 2t ed inoltre λj−1 ≤ λj per 1 < j ≤ 2t. L’ipotesi induttiva è quindi che per k − 1 = 1, . . . , 2t − 1 il polinomio σ (k−1) (X) sia un polinomio che realizza tale minimo, cioè lk−1 = λk−1 ; in altre parole, abbiamo una successione di LFSR D E (1) Σ1 = S (λ1 ) , σ (1) (X) tale che Σ1 = S (1) D E (2) Σ2 = S (λ2 ) , σ (2) (X) tale che Σ2 = S (2) CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 84 .. . D E Σk−1 = S (λk−1 ) , σ (k−1) (X) (k−1) tale che Σk−1 = S (k−1) Supponendo di aver costruito σ (k−1) (X) che risolve il problema 4.43 per S (k−1) , se necessario lo si modifica in un nuovo polinomio σ (k) (X) che risolve il problema 4.43 per S (k) ; la modifica viene effettuata utilizzando un polinomio σ (r−1) (X) scelto in modo opportuno tra quelli precedenti σ (k−1) (X). Ricordiamo che nel caso generale non abbiamo la certezza che la soluzione sia unica, né che il suo grado sia minore o uguale di t però, nel caso delle sindromi di un codice BCH, si ha σ (2t) (X) = σ (X), il polinomio error locator. Se però il polinomio finale σ (2t) (X) ha grado maggiore di t allora la successione S (2t) non è interpretabile come quella delle sindromi di un codice BCH: in altre parole, si devono essere verificati più di t errori nella trasmissione. Prima di iniziare la dimostrazione, è opportuno trasformare in formule le ipotesi induttive; per controllare i primi k − 1 o k elementi del LFSR generato, applichiamo il lemma 4.45 ai polinomi derivanti dall’induzione: il polinomio σ (k−1) (X), con il seme S1 , . . . , Sλk−1 , genera un LFSR Σk−1 iniziante per S (k−1) , per cui vale la relazione λk−1 Sj = − X (k−1) σi per λk−1 < j ≤ k − 1, Sj−i (4.34) i=1 cioè σ (k−1) (X) S (k−1) (X) j−1 = 0 per λk−1 < j ≤ k − 1. (4.35) Dato che S (k) coincide con S (k−1) sui primi k − 1 valori e considerato che ci limitiamo a λk−1 < j ≤ k − 1, quest’ultima è equivalente a σ (k−1) (X) S (k) (X) = 0 per λk−1 < j ≤ k − 1. (4.36) j−1 Osserviamo anche che dalla (4.25) si ha X k−r σ (r−1) (X) S (k) (X) = σ (r−1) (X) S (k) (X) j−1 j−1−k+r e, per r ≤ k − 1, l’ipotesi induttiva (4.36) diventa σ (r−1) (X) S (k) (X) = 0 per λr−1 < j − k + r ≤ r − 1 j−k+r−1 cioè σ (r−1) (X) S (k) (X) j−1−k+r = 0 per k − r + λr−1 < j ≤ k − 1. (4.37) Controlliamo ora se Σk−1 inizia per S (k) : in tal caso l’induzione finisce subito, perché basta porre σ (k) (X) = σ (k−1) (X). A tal fine, calcoliamo l’elemento k-esimo del LFSR generato da σ (k−1) (X) e S1 , . . . , Sλk−1 : esso è λk−1 X (k−1) Ŝk = − σi Sk−i . i=1 I primi k valori del LFSR Σk−1 sono quindi S1 , . . . , Sk−1 , Ŝk . CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 85 Definizione 4.50. La discrepanza è dk = Sk − Ŝk . (k−1) Come nel lemma 4.45, tenendo conto σ0 λk−1 dk = Sk − Ŝk = Sk + X i=1 = 1 e che σ (k−1) ha grado λk−1 ≤ k − 1, si ha λk−1 (k−1) σi Sk−i = X (k−1) σi Sk−i = σ (k−1) (X) S (k) (X) i=0 . (4.38) k−1 La successione S1 , . . . , Sk−1 , Ŝk ha quindi una discrepanza ( 0, . . . , 0 , dk ) | {z } k−1 volte rispetto alla successione desiderata S (k) . L’idea per correggere questa discrepanza è la seguente: scegliamo r ≤ k − 1. Per ipotesi induttiva, σ (r−1) (X) insieme a S1 , . . . , Sλr−1 genera un LFSR Σr−1 iniziante per S (r−1) ; dato che σ (r−1) (X) ∈ Gen Σr−1 , il LFSR Σr−1 generato da σ (r−1) (X) ha discrepanza (0, . . . , 0 , dr ) | {z } r−1 volte rispetto a S (r) . Scegliamo r in modo che dr 6= 0: traslando a destra il polinomio di k − r (cioè moltiplicando σ (r−1) (X) per X k−r ), aggiustando opportunamente il coefficiente direttivo e sommando, si corregge la discrepanza di σ (k−1) (X) definendo così σ (k) (X). Osserviamo che si deve scegliere un σ (r−1) (X) con r ≤ k − 1, altrimenti si cercherebbe di correggere la discrepanza di σ (k−1) (X) con se stessa; in altre parole, se nell’aggiornamento (4.39) si utilizzasse r = k si otterrebbe banalmente σ (k) (X) = 0. Teorema 4.51. Con la notazione precedente, definiamo σ (−1) (X) = σ (0) (X) = 1, d0 = 1 e λ−1 = λ0 = 0. Sia k ∈ [1, . . . , 2t] e supponiamo che per i = 1, . . . , k − 1 siano definiti i polinomi σ (i) (X) che risolvono il problema 4.43 per S (i) . Definiamo inoltre la discrepanza dk secondo la (4.38). Allora esistono a ∈ K ed un intero r ≤ k − 1 tali che il polinomio σ (k) (X) = σ (k−1) (X) + aX k−r σ (r−1) (X) , (4.39) risolve il problema 4.43 per S (k) . In particolare, il polinomio σ (2t) (X) è il polinomio error locator. Dimostrazione. Se k = 1, si ha d1 = S1 . Scegliendo a = −S1 e r = 0 allora σ (1) (X) = 1 − S1 X = 1 + (−S1 ) X 1 σ (−1) (X) , che è banalmente una soluzione del problema per S (1) = (S1 ) (anche nel caso S1 = 0) e la (4.39) è verificata. Sia k > 1. Se dk = 0, non c’è niente da fare: si ha che σ (k−1) (X) produce un LFSR i cui primi k elementi sono S (k) e pertanto basta porre σ (k) (X) = σ (k−1) (X) e Σk = Σk−1 . Infatti, dato che σ (k−1) (X) risolve il problema 4.43 per S (k−1) , segue che σ (k−1) (X) risolve il problema 4.43 anche per S (k) , visto che per il lemma 4.46 il grado del polinomio generatore di grado minimo non può diminuire al crescere della parte iniziale della successione. Quindi per a = 0 e r = 0 la (4.39) è soddisfatta. Se dk 6= 0, definiamo σ (k) (X) modificando σ (k−1) (X) secondo la formula (4.39), con a ∈ K ed r ≤ k − 1 da determinare; osserviamo che da r < k segue che σ (k) (0) = σ (k−1) (0) = 1 CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 86 e quindi σ (k) (X) genera un LFSR se si fissa un seme con almeno lk = deg σ (k) (X) elementi. Chiaramente, se si pone n o l = max deg σ (k−1) (X) , deg X k−r σ (r−1) (X) = max {λk−1 , k − r + λr−1 } Sappiamo che se λk−1 6= k − r + λr−1 ⇒ lk = l. (4.40) Se invece i due numeri sono uguali possiamo solo concludere che lk ≤ l. Dall’ipotesi induttiva si ha λj ≤ j per ogni j ≤ k − 1, per cui l ≤ k − 1. Sia j un intero tale che l < j ≤ k; allora σ (k) (X) S (k) (X) = σ (k−1) (X) + aX k−r σ (r−1) (X) S (k) (X) j−1 j−1 (k−1) (k) k−r (r−1) = σ (X) S (X) + aX σ (X) S (k) (X) j−1 j−1 (k−1) (k) (r−1) (k) = σ (X) S (X) +a σ (X) S (X) (4.41) j−1 j−1−k+r Sia l < j < k. Poiché vale sia λk−1 ≤ l < j che k − r + λr−1 ≤ l < j, per la (4.36) e la (4.37), si ha σ (k) (X) S (k) (X) = 0. j−1 Se invece j = k, allora, usando la (4.38) anche per k = r, la (4.41) diventa σ (k) (X) S (k) (X) = σ (k−1) (X) S (k) (X) + a σ (r−1) (X) S (k) (X) k−1 k−1 λk−1 = X r−1 λr−1 (k−1) σi Sk−i + a i=0 X (r−1) σi Sr−i i=0 = dk + adr Scegliamo ora r ≤ k − 1 in modo che dr sia non nullo e a = −d−1 r dk : con questa scelta, σ (k) (X) S (k) (X) = 0 per l < j ≤ k. j−1 Per il lemma 4.45, il polinomio σ (k) (X), insieme al seme (S1 , . . . , Slk ), genera un LFSR Σk che inizia per S (k) . In particolare, per il lemma 4.46, si ha lk ≥ λk−1 = deg σ (k−1) (X). Questo, unito alla (4.40), ci permette di concludere che, in ogni caso, lk = deg σ (k) (X) = l = max {λk−1 , k − r + λr−1 } . Riassumendo, per definire σ (k) (X) si procede ponendo scegliendo r tale che r ≤ k − 1 e dr 6= 0. Scelto un tale r (se esiste), si definisce k−r (r−1) σ (k) (X) = σ (k−1) (X) − d−1 σ (X) . r dk X (k) In questo modo, posto lk = deg σ (k) (X) e Σk = (S1 , . . . , Slk ) , σ (k) (X) , si ha Σk = S (k) e pertanto lk ≥ λk . CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 87 Resta da capire se si può scegliere un r tale che r ≤k−1 e dr 6= 0. (4.42) Se Sj = 0 per ogni j non c’è niente da fare e l’algoritmo termina subito. Supponiamo quindi che gli Sj non siano tutti nulli e poniamo i = min {j | Sj 6= 0}. Dato che i ≥ 1, la tesi è ovvia fino a quando k < i, essendo σ (0) (X) = · · · = σ (i−1) (X) = 1. Per k = i, si ha di = Si , da cui σ (i) (X) = 1 − Si X i = 1 + (−Si ) X i σ (−1) (X), che è la (4.39) 2 per r = 0 e a = −d−1 r dk . Se k ≥ i + 1, una scelta di r in modo tale da soddisfare la (4.42) è sempre possibile: basta scegliere r = i. Ci possono però essere più scelte possibili per r. Per contro, una volta scelto r, (k) la scelta di a nella (4.39) è obbligata: a = −d−1 (X) r dk e, con queste definizioni, il polinomio σ (k) così definito insieme al seme (S1 , . . . , Slk ) genera sicuramente un LFSR che inizia per S . A priori non è detto però che si tratti di un generatore di grado minimo e, pur sfruttando la discrezionalità sulla scelta di r, nulla assicura che un polinomio definito seguendo la formula (4.39) fornisce necessariamente un generatore di grado minimo per qualche valore di r tra quelli ammissibili. Dobbiamo vedere che per qualche r ammissibile ciò avviene. Il lemma 4.54 assicura che per uno dei valori di r che soddisfano la (4.42) il polinomio σ (k) (X) così definito è soluzione del problema 4.43 per S (k) e ciò conclude la dimostrazione. Osservazione 4.52. Nel caso dei codici BCH, il teorema 4.48 ci permette di concludere che il polinomio finale σ (2t) (X) è proprio il polinomio error locator, se è di grado minore o uguale a t. Per minimizzare il grado di σ (k) definito tramite la (4.39), dobbiamo capire come si può modificare il grado secondo tale formula. Avendo posto lk−1 = deg σ (k−1) (X), l’ipotesi induttiva è λk−1 = lk−1 . Come già visto durante la dimostrazione, se dk = 0 allora Σk = Σk−1 e σ (k) (X) = σ (k−1) (X). Da ciò lk = lk−1 = λk−1 e l’algoritmo prosegue correttamente: poiché λk ≥ λk−1 e lk ≥ λk , otteniamo lk = λk che è la tesi induttiva. Possiamo limitarci quindi a studiare il caso dk 6= 0. Lemma 4.53. Sia c (X) = 1 + c1 X + · · · + cl X l un polinomio di grado l che insieme a (S1 , . . . , Sl ) produce un LFSR che inizia per S (k) e, con la notazione precedente, supponiamo dk = 6 0. Allora l ≥ max {λk−1 , k − λk−1 } e quindi λk ≥ max {λk−1 , k − λk−1 }. Dimostrazione. Per definizione di λk , si ha l ≥ λk ≥ λk−1 = lk−1 . Se λk−1 ≥ k − λk−1 non c’è niente da dimostrare: supponiamo quindi λk−1 < k/2. Per assurdo, supponiamo l ≤ k − 1 − λk−1 . Per ipotesi, ( λk−1 X (k−1) Sj per λk−1 + 1 ≤ j ≤ k − 1 − σi Sj−i = Ŝk 6= Sk per j = k i=1 2 In sostanza, k = i è il “vero” passo iniziale per l’induzione. (4.43) CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI − l X per l + 1 ≤ j ≤ k. ci Sj−i = Sj 88 (4.44) i=1 In particolare, Sk = − l X ci Sk−i . (4.45) i=1 Le sindromi coinvolte in questa somma sono Sk−l , . . . , Sk−1 e abbiamo per ipotesi che λk−1 + 1 ≤ k − l: possiamo quindi usare le (4.43) e sostituire i rispettivi valori nella (4.45), ottenendo Sk = − l X ci Sk−i i=1 = l X λk−1 X ci i=1 X Sk−i−j j=1 lk−1 = (k−1) σj (k−1) σj j=1 l X ci Sk−i−j i=1 Usando la stessa tecnica ma partendo dalla (4.43) e dall’ipotesi scritta questa volta come l + 1 ≤ k − λk−1 , si ottiene λk−1 Ŝk = − (k−1) X σi Sk−i i=1 λk−1 = X (k−1) σi i=1 l X cj Sk−i−j j=1 e dato che Sk 6= Ŝk si ha una contraddizione. Mostriamo ora che è possibile effettuare una opportuna scelta di r in modo da avere che lk = deg σ (k) (X) soddisfa lk = max {λk−1 , k − λk−1 }. Lemma 4.54. Se dk 6= 0 allora si può scegliere r in modo che definendo σ (k) (X) tramite la (4.39) si abbia lk = max {λk−1 , k − λk−1 } . In particolare, durante l’aggiornamento il grado del polinomio generatore di grado minimo cambia se, e solo se, k > 2λk−1 . Dimostrazione. Poniamo i = min {j | Sj 6= 0}. Chiaramente k ≥ i e per l = 1, . . . , i−1 è evidente che i polinomi minimi sono σ (l) (X) = 1, tutti di lunghezza 0. Come nel teorema, poniamo per convenzione anche σ (0) (X) = 1, di modo che sia definito λ0 = 0. Osserviamo che di = Si 6= 0. Se k = i allora poniamo σ (i) (X) = 1 − Si X i . In questo modo si ha lk = i = max {0, i} = max {λk−1 , k − λk−1 } che è la tesi. Inoltre, i = λi > λi−1 = 0 e ciò vale anche se i = 1, per la scelta fatta. Supponiamo ora k > i e definiamo R = {j ∈ N | (j ≤ k − 1) ∧ (dj 6= 0) ∧ (λj−1 < λj )} . CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 89 Innanzi tutto, dato che i ≤ k − 1, di 6= 0 e λi−1 < λi si ha i ∈ R, cioè R 6= ∅ e, inoltre, è evidentemente finito. Poniamo r = max R. Per come è definito r, abbiamo λk−1 = λr . (4.46) Infatti, se r + 1 ≤ j ≤ k − 1 per non contraddire la massimalità di r si deve avere dj = 0 oppure λj−1 = λj . Se dj = 0, vuol dire che non c’è aggiornamento nel polinomio, pertanto la sua lunghezza non cambia; se invece λj−1 = λj il polinomio viene aggiornato ma la sua lunghezza non cambia. In ogni caso, ad ogni passo tra r +1 e k −1 la lunghezza del generatore di grado minimo non cambia. Dato che r ≤ k − 1 possiamo applicare l’ipotesi induttiva: λr = max {λr−1 , r − λr−1 } . (4.47) Nuovamente, la definizione di r dice che λr−1 < λr ; ciò, insieme alla (4.46) ed alla (4.47), ci dà λk−1 = λr = max {λr−1 , r − λr−1 } = r − λr−1 . Definendo σ (k) (X) secondo la formula di aggiornamento (4.39), abbiamo lk = deg σ (k) (X) ≤ max {λk−1 , k − r + λr−1 } = max {λk−1 , k − λk−1 } che, insieme al lemma 4.53 applicato a c (X) = σ (k) (X), dà la tesi. Naturalmente, nell’aggiornamento (4.39) il grado del polinomio non cambia se, e solo se, λk−1 ≥ k − λk−1 . Il lemma ci dice in quali casi aumenta il grado di un polinomio generatore di grado minimo e ci permette di ottenere ulteriori informazioni. Corollario 4.55. Se dk = 0, allora λk = λk−1 . Se dk 6= 0 allora 1. λk ≥ k2 . 2. λk > λk−1 ⇒ λk+1 = λk . Dimostrazione. Se dk = 0 non c’è niente da dimostrare. Supponiamo quindi che dk 6= 0. 1. Poiché λk = max{λk−1 , k − λk−1 }, si ha (λk ≥ λk−1 ) ∧ (λk ≥ k − λk−1 ) ⇒ λk + λk ≥ λk−1 + (k − λk−1 ) ⇒ 2λk ≥ k. 2. Se λk > λk−1 allora k + 1 − λk < k + 1 − λk−1 che è equivalente a k + 1 − λk ≤ k − λk−1 . Ma se λk > λk−1 allora da λk = max{λk−1 , k − λk−1 } segue λk = k − λk−1 , per cui k + 1 − λk ≤ λk . D’altra parte, applicando il lemma per k + 1 si ottiene λk+1 = max {λk , k + 1 − λk } e quindi λk+1 = λk . CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 90 Oltre a completare la dimostrazione del teorema 4.51 assicurando che l’aggiornamento (4.39) è possibile in modo da ottenere ancora un polinomio generatore di grado minimo, la dimostrazione del lemma 4.54 ci fornisce il valore di r da usare per l’aggiornamento: si tratta dell’ultimo generatore di grado minimo con discrepanza non nulla precedentemente trovato tale che durante il suo aggiornamento è cambiata la lunghezza; tale polinomio viene traslato a destra di una posizione ad ogni ciclo finché non viene sostituito da un nuovo polinomio e il suo coefficiente direttivo viene opportunamente modificato. Inoltre, il lemma ci dice anche se la lunghezza del polinomio generatore cambia o meno nel corso dell’aggiornamento: questa informazione è necessaria per sapere se durante l’aggiornamento attuale cambia il valore di r da utilizzare in futuro oppure rimane lo stesso. Possiamo riassumere quanto trovato in questa sezione nel Teorema 4.56 (Algoritmo di Berlekamp-Massey). Date le sindromi S1 , . . . , S2t , inizializziamo le variabili c (X) = 1, p (X) = X, δ = 1 e l = 0. Per k ∈ [1, . . . , 2t] calcoliamo la discrepanza d= l X ci Sk−i . i=0 Ad ogni passo, usiamo la variabile ausiliaria γ (X) definita tramite la formula γ (X) = c (X) − dδp (X) (4.48) e aggiorniamo le variabili p (X) , c (X) , δ, l secondo la seguente regola se k > 2l e d 6= 0 allora p (X) ← Xc (X) c (X) ← γ (X) δ ← d−1 l ← deg c (X) altrimenti p (X) ← Xp (X) c (X) ← γ (X) Al termine del ciclo il polinomio c (X) è il polinomio error locator. Dimostrazione. L’unica differenza tra la (4.39) e la (4.48) è che in quest’ultima manca la traslazione di k − r posti, cioè il prodotto per X k−r : ciò è dovuto al fatto che esso viene fatto di una posizione alla volta ad ogni aggiornamento. La regola di aggiornamento tiene conto del lemma 4.54 che ci dice quando il grado del polinomio generatore di grado minimo aumenta: in tal caso bisogna cambiare il polinomio di servizio σ (r) (X), ricordandone la discrepanza. Osserviamo che nella (4.48) non c’è aggiornamento del polinomio se la discrepanza attuale d è 0. Le variabili usate nel teorema hanno il seguente significato: 1. Si = sindromi; CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 91 2. k = indice di ricorsione attuale; 3. c (X) = polinomio generatore al passo k − 1; 4. l = grado del polinomio generatore al passo k − 1; 5. d = discrepanza attuale; 6. γ (X) = polinomio generatore attuale; 7. p (X) = traslato del polinomio generatore al momento dell’ultimo cambio di lunghezza; 8. δ = inverso della discrepanza al momento dell’ultimo cambio di lunghezza. Osservazione 4.57. Se alla fine dell’algoritmo il polinomio c (X) ha grado maggiore di t allora la successione delle sindromi S1 , . . . , S2t non soddisfa le equazioni (4.8): questo vuol dire che la parola ricevuta ha distanza maggiore di t da ogni parola del codice e quindi non può essere decodificata. In questo caso, l’algoritmo di decodifica deve restituire un codice di errore. Riepilogo B-M Secondo quanto visto nel teorema 4.56, i passi necessari per l’applicazione dell’algoritmo di Berlekamp-Massey sono: 1. inizializzare le variabili: (a) Si per i = 1, . . . , 2t; (b) k = 1; (c) c (X) = 1; (d) l = 0; (e) p (X) = X; (f) δ = 1; 2. calcolare la discrepanza d = Pl i=0 ci Sk−i ; 3. se d = 0, aggiornare p (X) ← Xp (X) e andare al punto 5; 4. se d 6= 0 definire γ (X) = c (X) − dδp (X) e inoltre (a) se 2l ≥ k aggiornare: i. p (X) ← Xp (X); ii. c (X) ← γ (X); (b) se 2l < k aggiornare: i. ii. iii. iv. p (X) ← Xc (X); c (X) ← γ (X); δ ← d−1 ; l ← deg c (X); 5. incrementare l’indice di iterazione: k ← k + 1; se k > 2t terminare l’algoritmo restituendo c (X), altrimenti tornare al punto 2. CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 92 Gli aggiornamenti descrivono le seguenti possibilità: 3. non si aggiorna il polinomio generatore di grado minimo; 4.a. si aggiorna il polinomio generatore di grado minimo ma il suo grado non cambia; 4.b. si aggiorna il polinomio generatore di grado minimo e il suo grado cambia. Esempi Come evidenziato nell’osservazione 4.42, l’algoritmo di Berlekamp-Massey può essere usato per determinare la funzione generatrice di una successione definita per ricorrenza dati alcuni suoi termini: vediamo alcuni esempi di applicazione dell’algoritmo a successioni classiche. La successione di Fibonacci Sia S = (S1 , S2 , S3 , S4 ) = (0, 1, 1, 2) la parte iniziale della successione di Fibonacci e applichiamo l’algoritmo a questa sequenza. Si ha k Sk d c (X) 1 1 0 0 1 2 1 1 1 − X2 2 3 1 1 1−X −X 4 2 0 1 − X − X2 l p (X) δ 0 X 1 0 X 2 X 2 1 1 2 X 2 1 2 X3 1 Una soluzione del problema 4.43 per S è data quindi da c (X) = 1 − X − X 2 . Indichiamo con F il LFSR generato da c (X) con seme (0, 1): F = h(0, 1) , c (X)i. b(X) Per il corollario 4.41, abbiamo F (X) = c(X) , cioè c (X) F (X) = b (X). D’altra parte, sappiamo che deg b (X) < 2, per cui c (X) F (X) ≡ (1 − X) X ≡ X (mod X 2 ), che vuol dire b (X) = X, da cui si ricava F (X) = X . 1 − X − X2 Sia ora fn la successione di Fibonacci: 0 fn = 1 fn−2 + fn−1 (4.49) se n = 0 se n = 1 se n ≥ 2 e sia f = (f0 , f1 , . . .) = (0, 1, 1, 2, 3, 5, 8, 11, . . .). Poiché l’equazione caratteristica di f è X 2 + X − 1, si ha X 2 + X − 1 ∈ Ann f . Ma f (2) = S (2) e deg cP (X) = 2, pertanto f = F e la (4.49) è ∞ la ben nota formula per la funzione generatrice F (X) = i=0 Fi X i . CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 93 Sia S = (S1 , S2 , S3 , S4 ) = (1, 3, 7, 15). Svolgendo i calcoli come prima, Crescita delle foglie k 1 Sk 1 d 1 c (X) l p (X) 1 0 X 1−X 1 X δ 1 1 2 2 3 2 1 − 3X 1 X 3 7 −2 1 − 3X + 2X 2 2 X − 3X 2 − 12 4 15 0 1 − 3X + 2X 2 2 X 2 − 3X 3 − 21 1 Una soluzione del problema 4.43 per S è data quindi da c (X) = 1 − 3X + 2X 2 . Indichiamo con F il LFSR generato da c (X) con seme (1, 3): F = h(1, 3) , c (X)i = (0, 1, 1, 2, 3, 5, 8, . . .) che diventa F (X) = X + X 2 + 2X 3 + · · · . Per il corollario 4.41, abbiamo F (X) = b(X) c(X) , con deg b (X) < 2. D’altra parte, c (X) F (X) ≡ (1 − 3X) (1 + 3X) ≡ 1 (mod X 2 ), per cui b (X) = 1, da cui si ricava F (X) = 1 . 1 − 3X + 2X 2 (4.50) Sia ora fn la successione 1 fn = 3 3fn−1 − 2fn−2 se n = 0 se n = 1 se n ≥ 2 Questa successione rappresenta un modello per la crescita dei rami di una pianta secondo la seguente regola: supponiamo che, in una certa varietà di piante, ogni anno i nuovi rami spuntano dai rami che sono cresciuti nel corso dell’anno precedente e, inoltre, che spuntino esattamente due nuovi rami da ogni ramo che era spuntato l’anno precedente. P∞ Come prima, f = F e la (4.50) è la formula per la funzione generatrice F (X) = i=0 Fi X i . I quadrati Nei due esempi precedenti, le successioni S da cui si partiva erano la parte iniziale di due successioni definite per ricorrenza e già note a priori: il fatto che il loro polinomio caratteristico sia di grado due, ci assicurava che già al terzo passo dell’induzione avremmo trovato il polinomio generatore di grado minimo, perché tale polinomio coincide con il polinomio caratteristico che definisce la formula induttiva e il seme ha lunghezza uguale al grado di tale polinomio. In generale, se si parte da una successione (infinita) S definita in modo non ricorsivo, come si può procedere per determinare se essa è in realtà una successione ricorsiva lineare, cioè un LFSR? Se applichiamo l’algoritmo di Berlekamp-Massey, al passo k otteniamo un polinomio (k) σ (k) (X) di grado λk che genera, insieme a S (λk ) un LFSR Σk tale che Σk = S (k) . La speranza sarebbe quella di ottenere Σk = S per qualche k. Naturalmente non è detto che esista un tale CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 94 k, perché S potrebbe non essere un LFSR. Se invece lo è, un tale k deve esistere e quindi, da un certo punto in poi, le discrepanze del teorema devono essere nulle: questo suggerisce che un buon candidato per fermarsi è k tale che dk = 0. A questo punto, si può controllare se il LFSR generato è S oppure no: se troviamo S l’algoritmo termina, altrimenti vuol dire che proseguendo si deve incontrare almeno un’altra discrepanza dj non nulla per qualche j > k e quindi bisogna continuare l’esecuzione dell’algoritmo fino a trovare h tale che dh = 0 e h > j e si ripete il controllo. Come esempio, consideriamo la successione di tutti i quadrati degli interi: fn = n2 . La successione non è definita mediante una regola induttiva, pertanto applichiamo l’algoritmo di Berlekamp-Massey come indicato a S = (0, 1, 4, 9, 16, 25, 36, . . .). La prima discrepanza nulla la troviamo al primo passo: d1 = 0 e σ (1) (X) = 1. Il LFSR generato però è quello costante (0, 0, 0, . . .) e quindi non è ciò che cerchiamo. Del resto, la discrepanza successiva è non nulla, questo vuol dire che è senz’altro prematuro fermarsi. Continuando, otteniamo d7 = 0: la tabella completa dello svolgimento dell’algoritmo si presenta come segue k Sk d c (X) l p (X) δ 1 0 X 1 1 0 0 1 0 X2 1 2 1 1 1 − X2 2 X 1 3 4 4 1 − 4X − X 2 2 X2 1 4 9 −8 1 − 4X + 7X 2 3 X3 1 5 16 8 1 − 4X + 7X 2 − 8X 3 3 X − 4X 2 + 7X 3 1 8 6 25 −8 1 − 3X + 3X 2 − X 3 3 X 2 − 4X 3 + 7X 4 1 8 7 36 0 1 − 3X + 3X 2 − X 3 3 X 3 − 4X 4 + 7X 5 1 8 8 49 0 1 − 3X + 3X 2 − X 3 3 X 4 − 4X 5 + 7X 6 1 8 9 64 0 1 − 3X + 3X 2 − X 3 3 X 5 − 4X 6 + 7X 7 1 8 Il fatto che anche le discrepanze successive siano nulle è incoraggiante: si può effettuare la congettura che S sia un LFSR e che −c (X) = X 3 − 3X 2 + 3X − 1 sia il suo polinomio caratteristico. Naturalmente, ciò deve essere verificato per altra via. Nel caso specifico, abbiamo 2 2 2 fn+3 − 3fn+2 + 3fn+1 − fn = (n + 3) − 3 (n + 2) + 3 (n + 1) − n2 2 2 2 = (n + 3) − n2 − 3 (n + 2) − (n + 1) = (2n + 3) 3 − 3 ((2n + 3) 1) = 0 che conferma la congettura. In definitiva, c (X) S (X) ≡ 1 − 3X + 3X 2 e quindi S (X) = ∞ X i=0 X + 4X 2 ≡ X + X 2 i2 X = X (1 + X) (1 − X) 3 (mod X 3 ) (4.51) CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 95 è la funzione generatrice di S, come è ben noto. Si osservi come in tutti gli esempi svolti la crescita del grado dei polinomi generatori soddisfi le condizioni imposte dal corollario 4.55. Osservazione 4.58. La (4.51) è un caso particolare di una formula più generale dovuta ad Eulero: se con S (n, X) indichiamo la funzione generatrice delle potenze n-esime, cioè S (n, X) = ∞ X in X i i=0 allora si ha Pn j=0 S (n, X) = A (n, j) X j+1 n+1 (1 − X) = XAn (X) n+1 (1 − X) dove A (n, j) è il numero euleriano: esso è definito come il numero delle permutazioni dei numeri da 1 a n in cui esattamente j numeri sono maggiori del precedente (permutazioni con j “salite”). Più precisamente, se si rappresenta una permutazioneσ ∈ Sn secondo la notazione di Cauchy 1 2 ··· n−1 n σ= , σ (1) σ (2) · · · σ (n − 1) σ (n) allora A (n, j) = # {σ ∈ Sn tali che # {i|σ (i) > σ (i − 1)} = j} . Pn Il polinomio An (X) = j=0 A (n, j) X j è detto polinomio euleriano. 4.4 Un esempio svolto Svolgiamo nel dettaglio un esempio di decodifica di un codice BCH seguendo i vari algoritmi visti. In questa sezione C è un [15, 9, 7]-codice di Reed-Solomon su F16 , α è una radice primitiva 15-esima dell’unità che, in questo caso, è anche un elemento primitivo di F16 . Supponiamo che il polinomio minimo di α sia mα (X) = X 4 + X + 1. Per la rappresentazione degli elementi di F16 in funzione di α facciamo riferimento alla tabella in B, alla quale rimandiamo anche per effettuare le somme ed i prodotti. La caratteristica è 2, però il campo non è binario, quindi è necessario determinare anche i valori degli errori. L’insieme di definizione, per avere distanza designata 7, è dato da Tα = {1, 2, 3, 4, 5, 6} e pertanto il polinomio generatore è g (X) = 6 Y X + αi i=1 6 = α + α9 X + α6 X 2 + α4 X 3 + α10 X 5 + X 6 Supponiamo di aver ricevuto la parola w = w0 w1 w2 . . . w13 w14 = α7 , 0, α10 , 1, α2 , α5 , α4 , α4 , 0, 0, 0, α7 , 0, 0, 0 CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 96 che corrisponde al polinomio w (X) = α7 + α10 X 2 + X 3 + α2 X 4 + α5 X 5 + α4 X 6 + α4 X 7 + α7 X 11 . Per prima cosa, dobbiamo calcolare le sindromi Si = w αi per i = 1, . . . , 6: questo è un passaggio necessario per ogni algoritmo. Usando la tabella per fare i calcoli, abbiamo S1 = α7 + α12 + α3 + α6 + α10 + α10 + α11 + α18 = 1 + α + α3 + 1 + α + α2 + α3 + α3 + α2 + α3 + + 1 + α + α2 + 1 + α + α2 + α + α2 + α3 + α3 = α + α2 = α5 Con calcoli analoghi, otteniamo S2 = α7 S3 = α10 S4 = α5 S5 = α7 S6 = α3 Il polinomio sindrome è dunque S (X) = α5 + α7 X + α10 X 2 + α5 X 3 + α7 X 4 + α3 X 5 . PGZ Numero degli errori Si ha S[1] = α 5 S[2] 5 α = 7 α α7 α10 α5 = α7 α10 S[3] α7 α10 α5 α10 α5 α7 Calcolando i determinanti, det S[1] = α5 det S[2] = α3 det S[3] = α10 , pertanto il numero m degli errori è 3. Locazione degli errori Il polinomio error locator è dato soddisfano il sistema 5 α α7 α10 da σ (X) = 1 + σ1 X + σ2 X 2 + σ3 X 3 e i suoi coefficienti 5 α7 α10 σ3 α α10 α5 σ2 = α7 . α5 α7 α3 σ1 Risolvendolo, si trova che 4 σ3 α σ2 = α6 σ1 α5 CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 97 e quindi σ (X) = 1 + α5 X + α6 X 2 + α4 X 3 . Le sue radici si trovano a tentativi, andando a sostituire i valori 1, α, α2 , . . . , α14 . Si ottiene σ (X) = α4 X + α4 X + α9 X + α13 le radici e i loro inversi sono 13 ζ1 α ζ2 = α9 ζ3 α4 2 γ1 α γ2 = α6 γ3 α11 pertanto gli errori si trovano nelle posizioni relative agli esponenti 2, 6 e 11, cioè le coordinate errate sono w2 , w6 e w11 : e (X) = 1 X 2 + 2 X 6 + 3 X 11 . Determinazione del valore degli errori Il sistema (4.4) è 2 α α4 α6 α6 α12 α3 5 α11 1 α α7 2 = α7 . α3 α3 3 Risolvendolo, otteniamo 1 1 2 = α3 α7 3 cioè e (X) = X 2 + α3 X 6 + α7 X 11 che ci porta alla decodifica v (X) = w (X) + e (X) = α7 + α10 + 1 X 2 + X 3 + α2 X 4 + α5 X 5 + α4 + α3 X 6 + α4 X 7 + α7 + α7 X 11 = α7 + α5 X 2 + X 3 + α2 X 4 + α5 X 5 + α7 X 6 + α4 X 7 e quindi la parola che era stata spedita è v = α7 , 0, α5 , 1, α2 , α5 , α7 , α4 , 0, 0, 0, 0, 0, 0, 0 . Determinazione del valore degli errori - 2 Effettuiamo nuovamente il calcolo usando questa volta il metodo di Forney. Dobbiamo calcolare il polinomio error evaluator. Da S (X) σ (X) = α5 + α7 X + α10 X 2 + α5 X 3 + α7 X 4 + α3 X 5 1 + α5 X + α6 X 2 + α4 X 3 = α5 + α7 X + α10 X 2 + α5 X 3 + α7 X 4 + α3 X 5 + + α10 X + α12 X 2 + X 3 + α10 X 4 + α12 X 5 + α8 X 6 + + α11 X 2 + α13 X 3 + αX 4 + α11 X 5 + α13 X 6 + α9 X 7 + CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 98 + α9 X 3 + α11 X 4 + α14 X 5 + α9 X 6 + α11 X 7 + α7 X 8 = α5 + α6 X + α5 X 2 + αX 6 + α2 X 7 + α7 X 8 ≡ α5 + α6 X + α5 X 2 (mod X 6 ) e quindi ω (X) = α5 + α6 X + α5 X 2 . Inoltre, σ 0 (X) = α5 + α4 X 2 e, applicando il teorema 4.19, abbiamo 1 = ω(ζ1 ) σ 0 (ζ1 ) = α5 +α19 +α31 α5 +α30 = α10 α10 =1 2 = ω(ζ2 ) σ 0 (ζ2 ) = α5 +α15 +α23 α5 +α22 = α α13 = α3 3 = ω(ζ3 ) σ 0 (ζ3 ) = α5 +α10 +α13 α5 +α12 = α6 α14 = α7 e troviamo nuovamente e (X) = X 2 + α3 X 6 + α7 X 11 . Sugiyama Dobbiamo applicare l’algoritmo euclideo ai polinomi X 6 e S (X) fermandoci appena troviamo un resto di grado minore di 3. Usando la notazione del teorema A.3, costruiamo la tabella (usando la notazione vettoriale per i polinomi) i qi ri 0 (0, 0, 0, 0, 0, 0, 1) 5 1 12 2 α, α 3 α5 , α3 4 α11 , α7 7 10 5 7 α ,α ,α ,α ,α ,α α6 , 1, α13 , α10 , 1 α3 , α10 , α10 , α8 α8 , α9 , α8 3 xi yi (1) (0) (0) (1) α, α12 (1) α5 , α3 α4 , α5 , α10 α13 , α10 , 1 α3 , α8 , α9 , α7 Dopo aver normalizzato in modo da rendere uguale a 1 il termine noto di y4 (X), abbiamo −1 σ (X) = y4 (0) y4 (X) = 1 + α5 X + α6 X 2 + α4 X 3 m = deg σ (X) = 3 −1 ω (X) = y4 (0) r4 (X) = α5 + α6 X + α5 X 2 Trovando le radici di σ (X) otteniamo nuovamente 13 2 ζ1 α γ1 α ζ2 = α9 γ2 = α6 ζ3 α4 α11 γ3 e CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 1 = ω(ζ1 ) σ 0 (ζ1 ) = α5 +α19 +α31 α5 +α30 = α10 α10 =1 2 = ω(ζ2 ) σ 0 (ζ2 ) = α5 +α15 +α23 α5 +α22 = α α13 = α3 3 = ω(ζ3 ) σ 0 (ζ3 ) = α5 +α10 +α13 α5 +α12 = α6 α14 = α7 e (X) = X 2 + α3 X 6 + α7 X 11 . Berlekamp-Massey Ricordiamo i passi necessari: 1. inizializzare le variabili: (a) Si per i = 1, . . . , 2t; (b) k = 1; (c) c (X) = 1; (d) l = 0; (e) p (X) = X; (f) δ = 1; 2. calcolare la discrepanza d = Pl i=0 ci Sk−i ; 3. se d = 0, aggiornare p (X) ← Xp (X) e andare al punto 5; 4. se d 6= 0 definire γ (X) = c (X) − dδp (X) e inoltre (a) se 2l ≥ k aggiornare: i. p (X) ← Xp (X); ii. c (X) ← γ (X); (b) se 2l < k aggiornare: i. ii. iii. iv. p (X) ← Xc (X); c (X) ← γ (X); δ ← d−1 ; l ← deg c (X); 5. incrementare l’indice di iterazione: k ← k + 1; se k > 2t terminare l’algoritmo restituendo c (X), altrimenti tornare al punto 2. La tabella che sviluppa l’algoritmo è 99 CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI k Sk 1 α 5 2 d c (X) l δ 0 X 1 1+α X 1 X α10 α6 1 + α2 X 1 X2 α10 α10 α13 1 + α2 X + α8 X 2 2 X + α2 X 2 α2 4 α5 α3 1 + αX + α11 X 2 2 X 2 + α2 X 3 α2 5 α7 α7 1 + αX + α2 X 2 + α11 X 3 3 X + αX 2 + α11 X 3 α8 6 α3 α9 1 + α5 X + α6 X 2 + α4 X 3 3 X 2 + αX 3 + α11 X 4 α8 1 4.5 p (X) 100 5 α7 3 α 5 Altri esempi Descriviamo nel dettaglio alcuni codici BCH. BCH [7,4] Descrizione: Individua e corregge un errore. Alfabeto: F2 = {0, 1}. Lunghezza: 7. Gli elementi di F72 vengono anche rappresentati tramite polinomi di grado al più 6 mediante la funzione F72 → F2 [X] (a0 , a1 , a2 , a3 , a4 , a5 , a6 ) 7→ a0 + a1 X + a2 X 2 + a3 X 3 + a4 X 4 + a5 X 5 + a6 X 6 Funzione di codifica: Il polinomio generatore è g (X) = X 3 + X + 1 ∈ F2 [X] e sia α una sua radice. Si ha che α è un elemento primitivo di F8 e ogni elemento non nullo di F8 si scrive in modo unico come a2 α2 + a1 α + a0 : cfr. B. Sia vI = (a3 , a4 , a5 , a6 ) ∈ F42 l’informazione che si vuole codificare. Costruiamo il polinomio vI (X) = a3 X 3 +a4 X 4 +a5 X 5 +a6 X 6 e determiniamo il resto della sua divisione per g (X): vI (X) = q (X) g (X) + vR (X) , con vR (X) = a0 + a1 X + a2 X 2 . La funzione di codifica è allora F42 → F72 (a3 , a4 , a5 , a6 ) 7→ (a0 , a1 , a2 , a3 , a4 , a5 , a6 ) Tasso di informazione: 4/7. Parole del codice: Le parole di C sono tutte le combinazioni lineari dei vettori z1 z2 z3 z4 = 1101000 = 0110100 = 0011010 = 0001101 CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 101 cioè 0000000 0001101 1100101 1010001 1101000 1011100 0111001 1111111 0110100 1110010 0010111 0100011 0011010 0101110 1000110 0100011 Distanza minima: 3. Controllo: Per costruzione, v ∈ C ⇔ g (X) |v (X) ⇔ v (α) = 0. Se la parola ricevuta è r = v + e, dove e è l’errore (ed e (X) è il relativo polinomio), si calcola r (α) = v (α) + e (α) = e (α) . Correzione: • r (α) = 0: Non si sono verificati errori. • r (α) = αi : Si è verificato un errore nella posizione di esponente i. Per correggerlo, sommare 1 a tale coordinata. Decodifica: Per troncamento: F72 → F42 (a0 , a1 , a2 , a3 , a4 , a5 , a6 ) 7→ (a3 , a4 , a5 , a6 ) BCH [15,7] Descrizione: Individua e corregge 2 errori. Alfabeto: F2 = {0, 1}. Lunghezza: 15. Gli elementi di F15 2 vengono anche rappresentati tramite polinomi di grado al più 14 mediante la funzione F15 2 → F2 [X] (a0 , a1 , . . . , a13 , a14 ) 7→ 14 X ai X i i=0 Funzione di codifica: Consideriamo il polinomio m1 (X) = X 4 + X + 1 ∈ F2 [X] e sia α una sua radice. Si ha che α è un elemento primitivo di F16 e ogni elemento non nullo di F16 si scrive in modo unico come a3 α3 + a2 α2 + a1 α + a0 : cfr. B. Il polinomio minimo di α3 è m3 (X) = X 4 + X 3 + X 2 + X + 1. Il polinomio generatore del codice è g (X) = m1 (X) m3 (X) = X 8 + X 7 + X 6 + X 4 + 1. Esso ha grado 8 e g αi = 0 per i = 1, 2, 3, 4. Sia vI = (a8 , . . . , a14 ) ∈ F72 l’informazione che si vuole codificare. Costruiamo il polinomio vI (X) = a8 X 8 + · · · + a14 X 14 e determiniamo il resto della sua divisione per g (X): vI (X) = q (X) g (X) + vR (X) , con vR (X) = a0 + · · · + a7 X 7 . La funzione di codifica è allora F72 → F15 2 (a8 , . . . , a14 ) 7→ (a0 , a1 , . . . , a13 , a14 ) CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 102 Tasso di informazione: 7/15. Parole del codice: Le parole di C sono tutte le combinazioni lineari dei vettori z1 z2 z3 z4 z5 z6 z7 = 100010111000000 = 010001011100000 = 001000101110000 = 000100010111000 = 000010001011100 = 000001000101110 = 000000100010111 Distanza minima: 5. Controllo: Per costruzione, v ∈ C ⇔ g (X) |v (X) ⇔ v αl = 0 per l = 1, 2, 3, 4. Se la parola ricevuta è r = v + e, dove e è l’errore (ed e (X) è il relativo polinomio), si calcolano Sl = r αl = v αl + e αl = e αl per l = 1, 2, 3, 4. Correzione: Calcoliamo la matrice S[2] = S1 S2 S2 . S3 • Se non c’è stato alcun errore, S[2] = 0 0 0 . 0 • Se c’è stato un errore nella posizione i, i α α2i S[2] = 2i α α3i i α α2i αi = 2i α α3i 0 0 1 αi 0 0 0 • Se ci sono stati due errori nelle posizioni i, j, i α + αj α2i + α2j S[2] = 2i α + α2j α3i + α3j i 1 1 α 0 1 αi = i α αj 0 αj 1 αj Si ha quindi che il numero di errori è dato dal rango di S[2] . Supponiamo che ci siano stati due errori: dobbiamo determinare i e j. Si ha e (X) = X i + X j , pertanto Sl = e αl = αli + αlj . Per ciò, calcoliamo un polinomio che abbia esattamente αi ed αj come radici. polinomio è σ ∗ (X) = X + αi X + αj = X 2 + σ1 X + σ2 Tale CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI e i suoi coefficienti devono soddisfare il sistema 2i α + σ1 α i + σ2 α2j + σ1 αj + σ2 = 0 = 0 103 (4.52) Moltiplicando la prima equazione per αi e la seconda per αj , otteniamo 3i α + σ1 α2i + σ2 αi = 0 α3j + σ1 α2j + σ2 αj = 0 e, sommando le equazioni di quest’ultimo sistema, otteniamo S3 + σ1 S2 + σ2 S1 = 0. Analogamente, se moltiplichiamo la prima equazione del sistema (4.52) per α2i e la seconda per α2j e poi sommiamo le due equazioni otteniamo S4 + σ1 S3 + σ2 S2 = 0. In definitiva, σ1 e σ2 devono essere soluzioni del sistema S1 S2 σ2 S = 3 . S2 S3 σ1 S4 Risolvendolo, si ottiene σ1 σ2 = S1 = (S3 + S1 S2 ) S1−1 e quindi trovando le radici del polinomio X 2 + σ1 X + σ2 si determinano le posizioni in cui si sono verificati gli errori. Dato che l’alfabeto ha solo due caratteri, ciò è sufficiente per correggere gli errori. Decodifica: Per troncamento: 7 F15 2 → F2 (a0 , a1 , . . . , a13 , a14 ) 7→ (a8 , a9 , . . . , a14 ) BCH [15,5] Descrizione: Individua e corregge 3 errori. Alfabeto: F2 = {0, 1}. Lunghezza: 15. Gli elementi di F15 2 vengono anche rappresentati tramite polinomi di grado al più 14 mediante la funzione F15 2 → F2 [X] (a0 , a1 , . . . , a13 , a14 ) 7→ 14 X ai X i i=0 Funzione di codifica: Il polinomio generatore è g (X) = m1 (X) m3 (X) m5 (X) = X 10 + X 8 + X 5 + X 4 + X 2 + X + 1, CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 104 dove m5 (X) = X 2 + X + 1 è il polinomio minimo di α5 e pertanto g αi = 0 per i = 1, 2, 3, 4, 5, 6. Sia vI = (a10 , . . . , a14 ) ∈ F52 l’informazione che si vuole codificare, vI (X) = a10 X 10 + · · · + a14 X 14 e vI (X) = q (X) g (X) + vR (X) , con vR (X) = a0 + · · · + a9 X 9 . Come prima, la funzione di codifica è F52 → F15 2 (a10 , . . . , a14 ) 7→ (a0 , a1 , . . . , a13 , a14 ) Tasso di informazione: 5/15. Parole del codice: Le parole di C sono tutte le combinazioni lineari dei vettori z1 z2 z3 z4 z5 = 111011001010000 = 011101100101000 = 001110110010100 = 000111011001010 = 000011101100101 Distanza minima: 7. Controllo: Per costruzione, v ∈ C ⇔ g (X) |v (X) ⇔ v αi = 0 per i = 1, 2, 3, 4, 5, 6. Se la parola ricevuta è r = v + e, dove e è l’errore (ed e (X) è il relativo polinomio), si calcolano Sl = r αl = v αl + e αl = e αl per l = 1, 2, 3, 4, 6. Correzione: Calcoliamo la matrice S[3] S1 = S2 S3 S2 S3 S4 S3 S4 . S5 0 0 0 0 0 . 0 • Se non c’è stato alcun errore, S[3] 0 = 0 0 • Se c’è stato un errore nella posizione i, i α α2i α3i S[3] = α2i α3i α4i α3i α4i α5i i 1 0 0 α = α i 0 0 0 α2i 0 0 0 0 0 1 0 0 0 0 0 0 αi 0 0 α2i 0 0 CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI • Se ci sono stati due errori nelle posizioni i, j, i α + αj α2i + α2j α3i + α3j S[3] = α2i + α2j α3i + α3j α4i + α4j α3i + α3j α4i + α4j α5i + α5j 1 1 0 αi 0 0 1 αi i j j α 0 0 α 0 1 αj = α 2i 2j α α 0 0 0 0 0 0 105 α2i α2j 0 • Se ci sono stati tre errori nelle posizioni i, j, k, i α + αj + αk α2i + α2j + α2k α3i + α3j + α3k S[3] = α2i + α2j + α2k α3i + α3j + α3k α4i + α4j + α4k α3i + α3j + α3k α4i + α4j + α4k α5i + α5j + α5k i 1 1 1 α 0 0 1 αi α2i = αi αj αk 0 αj 0 1 αj α2j 1 αk α2k 0 0 αk α2i α2j α2k In ogni caso il numero di errori è dato dal rango di S[3] : rk S[3] = numero degli errori. Supponiamo che ci siano stati 3 errori (se gli errori sono meno, si procede come negli esempi precedenti). Si ha e (X) = X i + X j + X k , pertanto Sl = e αl = αli + αlj + αlk . Dobbiamo determinare i, j, k. Il polinomio reciproco del polinomio error locator ha esattamente αi , αj ed αk come radici: σ ∗ (X) = X + αi X + αj X + αk = X 3 + σ1 X 2 + σ2 X + σ3 . I suoi coefficienti devono soddisfare il sistema 3i α + σ1 α2i + σ2 αi + σ3 α3j + σ1 α2j + σ2 αj + σ3 3k α + σ1 α2k + σ2 αk + σ3 = 0 = 0 = 0 Moltiplicando la prima equazione per αi , la seconda per αj e 4i α + σ1 α3i + σ2 α2i + σ3 αi = α4j + σ1 α3j + σ2 α2j + σ3 αj = 4k α + σ1 α3k + σ2 α2k + σ3 αk = (4.53) la terza per αk , otteniamo 0 0 0 e, sommando le equazioni di quest’ultimo sistema, otteniamo S4 + σ1 S3 + σ2 S2 + σ3 S1 = 0. Analogamente, se moltiplichiamo la prima equazione del sistema (4.53) per α2i , la seconda per α2j e la terza per α2k e poi sommiamo le tre equazioni otteniamo S5 + σ1 S4 + σ2 S3 + σ3 S2 = 0. CAPITOLO 4. CORREZIONE DEGLI ERRORI NEI CODICI LINEARI 106 Infine, moltiplicando rispettivamente per α2i , α2j e α2k e sommando otteniamo S6 + σ1 S5 + σ2 S4 + σ3 S3 = 0. In definitiva, σ1 , σ2 e σ3 devono essere soluzioni del sistema S1 S2 S3 σ3 S3 S2 S3 S4 σ2 = S4 . S3 S4 S5 σ1 S5 Risolvendolo otteniamo i coefficienti del polinomio le cui radici (determinate “a forza bruta”) individuano le posizioni in cui si sono verificati gli errori, che possono essere subito corretti visto che il codice è binario. Decodifica: Per troncamento: 7 F15 2 → F2 (a0 , a1 , . . . , a13 , a14 ) 7→ (a10 , a11 , . . . , a14 ) Appendice A L’algoritmo euclideo In questa appendice raccogliamo alcune proprietà dell’algoritmo euclideo esteso (AEE) molto utili nelle applicazioni. Ricordiamo il teorema di Euclide che dà origine all’algoritmo. Teorema A.1 (Euclide). Se a, b sono due numeri naturali con a > b allora MCD (a, b) = MCD (a − b, b) . Più in generale, Teorema A.2. Siano a, b, q, r elementi di un anello a fattorizzazione unica A tali che a = qb+r. Allora MCD (a, b) = MCD (b, r) . Dimostrazione. Chiamiamo con X l’insieme dei divisori comuni di a e b, cioè X = {d : d|a ∧ d|b} e con Y i divisori comuni di b ed r: Y = {d : d|b ∧ d|r} . Dimostriamo che X = Y, da cui segue il teorema. “⊆”: Sia d ∈ X un divisore comune di a e b: possiamo quindi scrivere a = da0 e b = db0 . Scegliendo q ed r tali che a = qb + r, si ha r = a − bq = da0 − db0 q = d(a0 − b0 q) e quindi d | r, cioè d ∈ Y. “⊇”: Sia d ∈ Y : b = db0 e r = dr0 . Allora a = bq + r = db0 q + dr0 = d (b0 q + r0 ) e quindi d | a, cioè d ∈ X. Questo teorema permette di ridurre il problema del calcolo del MCD tra a e b al problema del calcolo del MCD tra b ed r. 107 APPENDICE A. L’ALGORITMO EUCLIDEO A.1 108 AEE in generale Nel caso in cui l’anello A sia euclideo, questo teorema fornisce un algoritmo per il calcolo del MCD. Escludiamo dal teorema i casi banali in cui uno degli elementi è nullo. Teorema A.3 (Algoritmo euclideo). Sia A un anello euclideo e a, b ∈ A due elementi non nulli. Definiamo ( ( ( r0 = a x0 = 1 y0 = 0 , , . (A.1) r1 = b x1 = 0 y1 = 1 e, per induzione, definiamo per i ≥ 0, qi+2 , ri+2 ∈ A in modo tale che ri = qi+2 ri+1 + ri+2 con ri+2 = 0 oppure ∂ (r) < ∂ (b) , dove ∂ è il grado euclideo di A. Inoltre, sempre per induzione, definiamo ( xi+2 = xi − qi+2 xi+1 yi+2 = yi − qi+2 yi+1 (A.2) (A.3) Allora la successione dei resti ri delle divisioni euclidee a = q2 b + r2 b = q3 r2 + r3 r2 = q4 r3 + r4 .. . (A.4) rn−1 = qn+1 rn + rn+1 rn = qn+2 rn+1 arriva a 0 (= rn+2 ) in un numero finito di passi e qn+2 6= 1 se a 6= b. Inoltre, per i = 0, . . . , n + 1, si ha che 1. MCD (a, b) = MCD (ri , ri+1 ) = rn+1 ; 2. ri = xi a + yi b; in particolare, per i = n + 1 si ha l’identità di Bézout: MCD (a, b) = xn+1 a + yn+1 b; 3. xi+1 ri − xi ri+1 = (−1) i+1 (A.5) b; i 4. yi+1 ri − yi ri+1 = (−1) a; i 5. yi+1 xi − yi xi+1 = (−1) ; 6. MCD (xi , yi ) = 1 (anche per i = n + 2). Dimostrazione. Essendo b 6= 0, la divisione euclidea permette di scegliere q ed r in modo che a = qb + r e r = 0 oppure ∂ (r) < ∂ (b) . Partendo da r0 = a e r1 = b, costruiamo per induzione la successione dei resti (ri )i∈N secondo la regola ri = qi+2 ri+1 + ri+2 . Si noti che se ∂ (b) > ∂ (a) allora nel primo passo dell’algoritmo APPENDICE A. L’ALGORITMO EUCLIDEO 109 euclideo si ha q = 0, r = a: in altre parole, il primo passo ha l’effetto di “scambiare” a e b e poi la successione dei resti procede come quella dei resti calcolata applicando lo stesso algoritmo partendo dalla coppia (b, a). Pertanto non è restrittivo supporre sempre ∂ (b) ≤ ∂ (a). Per definizione di divisione euclidea, si ha che per i > 0 la successione (∂ri )i∈N è una successione di numeri naturali strettamente decrescente per i > 0 e quindi deve collassare a 0 in un numero finito di passi. Più precisamente, deve esistere un intero n tale che rn+1 6= 0 e rn+2 = 0 (e quindi la successione (∂ri )i∈N è in realtà una successione finita (∂ri )i∈N = (r0 , r1 , . . . , rn+1 , rn+2 = 0)). Dato che ri − qi+2 ri+1 = ri+2 , a posteriori anche gli ri sono definiti induttivamente mediante la stessa regola (A.3) che definisce xi e yi . Osserviamo che le tre successioni ri , xi e yi sono definite per i = 0, . . . , n + 2, mentre la successione dei quozienti qi è definita per ; inoltre, da ∂ (rn+1 ) < ∂ (rn ) e rn = qn+2 rn+1 segue che qn+2 6= 1, a meno che n = 0 e q2 = 1, cioè a = b. 1. Segue applicando induttivamente il teorema A.2. 2. L’equazione (A.5) è banalmente verificata per i = 0, 1. Sia i > 1 e supponiamo che l’equazione sia verificata per ogni j < i; allora xi a + yi b = (xi−2 − qi xi−1 ) a + (yi−2 − qi yi−1 ) b = (xi−2 a + yi−2 b) − qi (xi−1 a + yi−1 b) = ri−2 − qi ri−1 = ri dove la penultima equazione segue dall’ipotesi induttiva e l’ultima dalla definizione di ri in (A.4). Osserviamo che la relazione vale anche per i = n + 2, nel qual caso diventa 0 = rn+2 = xn+2 a + yn+2 b. 3. Per i = 0 essa è banalmente verificata. Sia i > 0 e supponiamo che l’equazione sia vera per i − 1; si ha: xi+1 ri − xi ri+1 = (xi−1 − qi+1 xi ) ri − xi (ri−1 − qi+1 ri ) = xi−1 ri − xi ri−1 − qi+1 (xi ri − xi ri ) = − (xi ri−1 − xi−1 ri ) i = − (−1) b = (−1) i+1 b. 4. Simile alla 3. 5. Idem. 6. Segue dalla 5. Osservazione A.4. Le proprietà 3, 4 e 5 possono anche essere ricavate nel seguente modo. Consideriamo la matrice ri xi yi Ri = ri+1 xi+1 yi+1 APPENDICE A. L’ALGORITMO EUCLIDEO 110 definita per i = 0, . . . , n + 1. Dalla regola induttiva che definisce le successioni xi , yi ed ri segue che la matrice Ri+1 si ottiene dalla matrice Ri sottraendo qi+2 volte la seconda riga alla prima e poi scambiando le righe. In termini matriciali, se per i = 0, . . . , n definiamo la matrice 0 1 Qi+2 = 1 −qi+2 allora Ri+1 = Qi+2 Ri e, per induzione, per 0 < i ≤ n + 1 si ha Ri = Qi+1 · · · Q2 R0 . (A.6) Dato che per ogni i si ha det Qi+2 = −1 e considerato che un minore 2 × 2 di Ri+1 si ottiene moltiplicando per Qi+2 il corrispondente minore 2 × 2 di Ri , ne segue che un minore 2 × 2 di Ri+1 ha determinante uguale all’opposto del determinante del relativo minore della matrice Ri . Considerato che i valori iniziali sono r x0 y0 a 1 0 R0 = 0 = r1 x1 y1 b 0 1 per induzione, o dalla formula (A.6), seguono le proprietà 3, 4 e 5. Esempio A.5. Effettuiamo il calcolo MCD (240, 140) secondo la procedura indicata nel teorema: usiamo le stesse notazioni e mettiamo le successioni in una tabella. i qi ri xi yi 0 – 240 1 0 1 – 140 0 1 2 1 100 1 −1 3 1 40 −1 2 4 2 20 3 −5 5 2 0 −7 12 Esempio A.6. Ricordiamo che l’identità di Bézout può essere calcolata in due modi. Il primo modo nasce dalla successione di divisioni successive (A.4): partendo dall’ultima equazione si ricavano a ritroso gli altri ri fino ad arrivare ad esprimere rn+1 in funzione dei soli r0 (= a) ed r1 (= b) . Il secondo modo è fornito, come già visto, dall’equazione (A.5) del teorema A.3, in cui il resto parziale ri viene calcolato, direttamente in funzione di a e b, parallelamente al calcolo delle divisioni successive. Mostriamo con un esempio in Z la differenza tra le due procedure di calcolo. Eseguiamo l’algoritmo euclideo secondo lo schema delle equazioni A.4 per i numeri 123456 e 56789. Per meglio evidenziare i resti ed il loro ruolo, scriviamo i numeri di partenza in corsivo ed i resti successivi in grassetto. APPENDICE A. L’ALGORITMO EUCLIDEO 111 La lista delle operazioni necessarie è 123456 = 2 · 56789 + 9878 56789 = 5 · 9878 + 7399 9878 = 1 · 7399 + 2479 7399 = 2 · 2479 + 2441 2479 = 1 · 2441 + 38 2441 = 64 · 38 + 9 38 = 4 · 9 + 2 9=4·2+1 2=2·1 Se ora si vuole “risalire” la successione di divisioni in modo da esprimere 1 come combinazione lineare di 123456 e 56789, si ha 1=9−4·2 = 9 − 4 · (38 − 4 · 9) = −4 · 38 + 17 · 9 = −4 · 38 + 17 · (2441 − 64 · 38) = 17 · 2441 − 1092 · 38 = 17 · 2441 − 1092 · (2479 − 1 · 2441) = −1092 · 2479 + 1109 · 2441 = −1092 · 2479 + 1109 · (7399 − 2 · 2479) = 1109 · 7399 − 3310 · 2479 = 1109 · 7399 − 3310 · (9878 − 1 · 7399) = −3310 · 9878 + 4419 · 7399 = −3310 · 9978 + 4419 · (56789 − 5 · 9878) = 4419 · 56789 − 25405 · 9878 = 4419 · 56789 − 25405 · (123456 − 2 · 56789 ) = −25405 · 123456 + 55229 · 56789 e quindi l’identità di Bézout è 1 = −25405 · 123456 + 55229 · 56789 Se invece si segue lo schema indicato nel teorema A.3, si costruisce la tabella APPENDICE A. L’ALGORITMO EUCLIDEO 112 i qi ri xi yi 0 – 123456 1 0 1 – 56789 0 1 2 2 9878 1 −2 3 5 7399 −5 11 4 1 2479 6 −13 5 2 2441 −17 37 6 1 38 23 −50 7 64 9 −1489 3237 8 4 2 5979 −12998 9 4 1 −25405 55229 10 2 0 56789 −123456 Osservazione A.7. Per calcolare l’identità di Bézout con il primo metodo è necessario memorizzare tutte le divisioni successive perché si parte dall’ultima, che esprime il MCD, e si risale fino alla prima. Con il secondo metodo è sufficiente tenere traccia solo dell’ultimo quoziente e degli ultimi due valori della successione stessa poiché per le successioni ri , xi e yi vale la regola di calcolo #i+2 = −qi+2 · #i+1 + #i e ciò basta per la formula (A.5). È evidente quindi come il secondo metodo risulti di gran lunga più efficiente e di più semplice implementazione, permettendo inoltre di sapere a priori quanto spazio sia necessario allocare per i calcoli necessari. Osserviamo anche che non è strettamente necessario procedere parallelamente al calcolo sia degli xi che degli yi : per esempio, se si procede calcolando sempre gli xi secondo la formula ricorsiva allora gli yi possono essere ricavati da ri = xi a + yi b. Nell’identità di Bézout relativa ad una coppia a, b si può sempre scegliere uno dei due coefficienti in modo che risulti essere coprimo rispetto all’altro elemento della coppia. Lemma A.8. Sia A un PID, l, b ∈ A; sia inoltre b = db0 . Se MCD (l, b0 ) = 1 allora esiste u tale che MCD (l + ub0 , b) = 1. Dimostrazione. Sia P = {p : p primo, p | d, p - l} e sia U un insieme di rappresentanti dei primi di P . Chiaramente U è un insieme finito per cui ha senso definire Y u= p p∈U (u = 1 se U = ∅). Sia p un primo che divide b. Se p | l allora p ∈ / P pertanto p - u; per ipotesi, p - b0 e quindi p - ub0 da cui p - l + ub0 . Sia ora p - l; se p - d allora p | b0 , dato che b = db0 , pertanto p - l + ub0 ; se invece p | d allora p ∈ P e pertanto p | u da cui, nuovamente, p - l + ub0 e ciò esaurisce tutti i possibili casi. APPENDICE A. L’ALGORITMO EUCLIDEO 113 Proposizione A.9. Sia A un PID, a, b ∈ A due elementi non nulli e (d) = MCD (a, b) = (a) + (b) . Si ponga a = da0 e b = db0 e sia (l0 , m0 ) una coppia tale che d = l0 a + m0 b. Allora: 1. ogni coppia (l, m) tale che d = la+mb è della forma (l0 + hb0 , m0 − ha0 ) per qualche h ∈ A e viceversa; 2. esistono λ, µ ∈ A tali che d = λa + µb e MCD (λ, b) = 1 (oppure MCD (µ, a) = 1). Dimostrazione. 1. Se l, m ∈ A sono tali che d = la + mb allora 1 = la0 + mb0 , da cui 1 = MCD (l, b0 ) = MCD (l, m) = MCD (a0 , m) = MCD (a0 , b0 ) . (A.7) Sia ora (l0 , m0 ) una qualsiasi coppia che soddisfa la relazione l0 a + m0 b = d. Vediamo che (l, m) ∈ A2 : la + mb = d = {(l0 + hb0 , m0 − ha0 ) : h ∈ A} . Se h ∈ A, allora (l0 + hb0 ) a + (m0 − ha0 ) b = l0 a + m0 b + hb0 a − ha0 b = d + hb0 a0 d − ha0 b0 d =d e quindi (l0 + hb0 , m0 − ha0 ) ∈ A2 . Viceversa, se la + mb = d allora la0 + mb0 = 1 = l0 a0 + m0 b0 da cui (l − l0 ) a0 = (m0 − m) b0 . Dato che MCD (a0 , b0 ) = 1, segue che ∃h tale che (m0 − m) = a0 h pertanto l − l0 = hb0 e quindi mb0 = 1 − la0 = 1 − (l0 + hb0 ) a0 = l0 a0 + m0 b0 − l0 a0 − hb0 a0 = m0 b0 − hb0 a0 che implica m = m0 − ha0 , cioè la coppia (l, m) è della forma (l0 + hb0 , m0 − ha0 ). 2. Fissiamo una soluzione l0 a + m0 b = d. Applicando il lemma A.8 a l0 , b = db0 otteniamo λ = l0 + ub0 con MCD (λ, b) = 1. Posto µ = m0 − ua0 , per quanto osservato λa + µb = d con l1 = l0 + ub0 , che è la tesi. Osservazione A.10. Ovviamente il ruolo di a e b è intercambiabile, però nella proposizione A.9 non è sempre possibile poter scegliere λ e µ in modo che valgano contemporaneamente MCD (λ, b) = 1 = MCD (µ, a) . Per esempio, si prenda A = Z, a = 6 e b = 10. In questo caso, d = 2, a0 = 3, b0 = 5 e l’identità di Bézout è 2 = 2 · 6 + (−1) · 10. Tutte le altre coppie (l, m) che soddisfano l’identità di Bézout sono date da l = 2 + h · 5, m = −1 − h · 3 al variare di h in Z. Ora, se h è pari allora l è pari e quindi non è coprimo con b, mentre se h è dispari allora m è pari e non è coprimo con a. In alcuni casi particolari le successioni definite nell’algoritmo euclideo godono di ulteriori proprietà. Vediamo, in dettaglio, cosa possiamo dire in modo più preciso per i casi di maggiore interesse, cioè i numeri interi ed i polinomi. Nel seguito, usiamo la notazione del teorema A.3. APPENDICE A. L’ALGORITMO EUCLIDEO A.2 114 AEE per A = Z Teorema A.11. Sia A = Z e a ≥ b > 0. 1. Per i = n + 2, . . . , 2 vale n+2 Y qh ≤ ri−2 ; h=i in particolare, Qn+2 h=2 qh ≤ a. 2. Per i > 1 i coefficienti xi hanno segno alternato ed inoltre |x1 | < |x2 | ≤ |x3 | < |x4 | < |x5 | < · · · < |xn+1 | < |xn+2 | . 3. Per i > 0 i coefficienti yi hanno segno alternato ed inoltre |y0 | < |y1 | ≤ |y2 | < |y3 | < |y4 | < · · · < |yn+1 | < |yn+2 | . 4. Per 2 ≤ i ≤ n + 2 si ha xi yi < 0. 5. Per 0 ≤ i ≤ n + 1 si ha |xi+1 | ≤ rbi . Inoltre, la disuguaglianza è stretta tranne che per b b i = 1, n + 1. In particolare, |xn+1 | < MCD(a,b) e |xn+2 | = MCD(a,b) . 6. Per 0 ≤ i ≤ n + 1 si ha |yi+1 | ≤ rai . Inoltre, la disuguaglianza è stretta tranne che per a a i = 0, n + 1. In particolare, |yn+1 | < MCD(a,b) e |yn+2 | = MCD(a,b) . 7. Per 0 ≤ i ≤ n si ha ri+2 < ri 2. Dimostrazione. 1. Per i = n + 2 non c’è niente da dimostrare. Per induzione, n+2 n+2 Y Y qh = qi qh ≤ qi ri−1 ≤ ri−2 . h=i h=i+1 2. Abbiamo che x1 = 0 x2 = x0 − q 2 x1 = 1 x3 = x1 − q3 x2 = −q3 x4 = x2 − q4 x3 = 1 + q4 q3 pertanto le prime tre disuguaglianza sono verificate. Supponiamo ora per induzione xi−1 xi < 0 e |xi−1 | < |xi |; da xi+1 = xi−1 − qi+1 xi (e dal fatto che i quozienti sono tutti positivi) segue che xi+1 ha segno opposto rispetto ad xi ed inoltre |xi+1 | = |xi−1 − qi+1 xi | = |xi−1 | + qi+1 |xi | ≥ |xi−1 | + |xi | > |xi | . 3. In questo caso, y0 = 0 y1 = 1 y2 = y0 − q2 y1 = −q2 y3 = y1 − q3 y2 = 1 + q3 q2 APPENDICE A. L’ALGORITMO EUCLIDEO 115 e le prime tre disuguaglianze sono verificate in quanto q2 6= 0 perché a ≥ b; il resto della dimostrazione è simile al punto precedente. 4. Segue da 2. e 3., osservando che x2 = 1 e y2 = −q2 . i+1 5. Per 0 ≤ i ≤ n + 1 si ha b = (−1) (xi+1 ri − xi ri+1 ). Se i < n + 1 i due addendi all’interno della parentesi hanno lo stesso segno. Da ciò, b = |xi+1 ri − xi ri+1 | = |xi+1 ri | + |xi ri+1 | = |xi+1 | ri + |xi | ri+1 e quindi |xi+1 | ri = b − |xi | ri+1 cioè ri+1 b b − |xi | ≤ . ri ri ri 6 0 per i < n + 1 e xi = 0 solo per i = 1, la disuguaglianza è stretta tranne che = |xi+1 | = Dato che ri+1 nel caso i = 1. b . Se invece In particolare, se n > 0 da rn > rn+1 = MCD (a, b), segue |xn+1 | < MCD(a,b) n = 0, allora xn+1 = x1 = 0 e MCD (a, b) = b e la formula segue banalmente. n+2 Se i = n + 1 si ha rn+2 = 0 e quindi b = (−1) xn+2 rn+1 . Poiché rn+1 = MCD (a, b), si ha la tesi. 6. Simile alla precedente. 7. Se i < n segue dalla definizione: ri = qi+2 ri+1 + ri+2 ≥ ri+1 + ri+2 > 2ri+2 . Se i = n è ovvia perché rn+2 = 0. Osservazione A.12. La proprietà 7. rafforza notevolmente la proprietà più generale che vale in ogni anello euclideo che dice che la successione dei resti è una successione strettamente decrescente: in Z tale successione deve decrescere con velocità esponenziale. Alcune delle proprietà del teorema A.11 sono peculiari al caso A = Z, altre invece sono estendibili ad ogni anello euclideo, possibilmente con qualche piccola differenza nella formulazione. AEE per A = K[X] A.3 Nel caso di un anello di polinomi alcune delle proprietà del teorema A.11 vengono perse, altre invece diventano più precise. Abbiamo visto che non è restrittivo supporre sempre deg a ≥ deg b. Teorema A.13. Sia K un campo e a, b ∈ A = K [X]. Supponiamo deg a ≥ deg b e ab 6= 0. 1. Per i = n + 2, . . . , 2 deg rn+1 + n+2 X deg qh = deg ri−2 . h=i In particolare, deg MCD (a, b) + n+2 X deg qh = deg a h=2 e deg MCD (a, b) + n+2 X h=3 deg qh = deg b. APPENDICE A. L’ALGORITMO EUCLIDEO 116 2. Per 3 ≤ i ≤ n + 2 si ha deg xi = i X deg qh = deg b − deg ri−1 . h=3 In particolare, i gradi dei coefficienti xi crescono strettamente (per i ≥ 1) e deg xn+1 < deg b − deg MCD (a, b). 3. Per 2 ≤ i ≤ n + 2 si ha deg yi = i X deg qh = deg a − deg ri−1 . h=2 In particolare, i gradi dei coefficienti yi sono una successione crescente per ogni i (strettamente per i ≥ 2). Inoltre, se a 6∼ b allora deg yn+1 < deg a − deg MCD (a, b). Osservazione A.14. Ricordiamo che j X deg qh = deg h=i j Y ! qh h=i per cui le formule del teorema esistono anche in una versione con il prodotto. Dimostrazione. 1. In ogni divisione euclidea tra polinomi a = qb + r se il quoziente è non nullo si ha deg a = deg q + deg b. In una successione di divisioni euclidee prodotte dall’algoritmo A.3 un quoziente può essere nullo solo quando deg a < deg b, che è escluso dalle nostre ipotesi pertanto, nel nostro caso, abbiamo qi 6= 0 e deg ri−2 = deg qi + deg ri−1 per ogni i = 2, . . . , n + 2. Per i = n + 2 questa è la formula della tesi. Per induzione, deg rn+1 + n+2 X deg qh = deg qi + deg rn+1 + n+2 X deg qh h=i+1 h=i = deg qi + deg ri−1 = deg (ri−2 ) essendo ri−2 = qi ri−1 + ri . I casi particolari seguono ricordando che rn+1 = MCD (a, b). 2. Si ha x1 = 0 x2 = x0 − q 2 x1 = 1 x3 = x1 − q3 x2 = −q3 x4 = x2 − q4 x3 = 1 + q4 q3 Ricordiamo che per convenzione deg 0 = −∞ e, con l’unica eventuale eccezione di q2 , tutti i quozienti hanno grado positivo perché deg ri > deg ri+1 per i > 0; questo implica che deg x2 < deg x3 < deg x4 . Inoltre, deg x4 = deg q3 + deg q4 . APPENDICE A. L’ALGORITMO EUCLIDEO 117 Pi Sia i ≥ 4 e supponiamo per induzione deg xi > deg xi−1 e che deg xi = h=3 deg qh = deg b − deg ri−1 . Da xi+1 = xi−1 − qi+1 xi e da deg qi > 0 segue che deg xi+1 > deg xi . Usando l’ipotesi induttiva e il punto 1 abbiamo deg xi+1 = deg (qi+1 xi ) = deg qi+1 + deg xi = deg qi+1 + i X deg qh h=3 = i+1 X deg qh h=3 = n+2 X n+2 X deg qh − h=3 deg qh h=i+2 = deg b − deg rn+1 − (deg ri − deg rn+1 ) = deg b − deg ri Chiaramente deg xi ≤ deg b. Per i = n + 1, si ha deg xn+1 = deg b − deg rn . Se n > 0 si ha deg MCD (a, b) = deg rn+1 < deg rn , da cui deg xn+1 < deg b − deg MCD (a, b). Nel caso “degenere” n = 0 (cioè b|a e quindi MCD (a, b) = b), si ha xn+1 = x1 = 0 ed è comunque vero che −∞ = deg x1 < deg b − deg b = 0. 3. In questo caso, y0 = 0 y1 = 1 y2 = y0 − q2 y1 = −q2 y3 = y1 − q3 y2 = 1 + q3 q2 Osserviamo che se q2 ∈ / K (i.e., deg a > deg b) allora i gradi di yi sono una successione strettamente crescente per ogni i. La dimostrazione adesso procede per induzione come nel punto 2. Per i = n + 1, si ha deg yn+1 = deg a − deg rn . Se n > 0 allora in particolare a 6∼ b e deg MCD (a, b) = deg rn+1 < deg rn e si conclude come nel punto 2. Nel caso “degenere” n = 0 (cioè b|a e quindi MCD (a, b) = b) questa volta dobbiamo distinguere due casi: deg b < deg a e deg b = deg a. Ovviamente (b|a) ∧ (deg b = deg a) ⇔ b ∼ a. Si ha yn+1 = y1 = 1 e quindi 0 = deg y1 < deg a − deg MCD (a, b) = deg a − deg b ⇔ deg b < deg a ⇔ a 6∼ b. APPENDICE A. L’ALGORITMO EUCLIDEO 118 Il teorema A.13 dice che i coefficienti xi , yi prodotti dalla successione delle divisioni che compongono l’AEE hanno grado “piccolo”, in un certo senso. Il fatto che questo grado sia piccolo garantisce che i polinomi ri , xi e yi sono sostanzialmente unici: ogni combinazione lineare di a e b di grado più piccolo di a è (multipla di) una delle combinazioni ri = xi a + yi b date dal punto 2 del teorema A.3. Teorema A.15 (unicità dei coefficienti dell’AEE). Sia deg a ≥ deg b e siano r, s, t polinomi tali che r = sa + tb con t 6= 0 e deg t < deg a − deg r. Inoltre sia i ∈ {1, . . . , n + 2} tale che deg ri ≤ deg r < deg ri−1 . Allora esiste α ∈ K [X] non nullo tale che r = αri s = αxi t = αyi . In particolare, se MCD (s, t) = 1 allora r = sa + bt è uno dei resti della successione dell’AEE (a meno di una costante). Dimostrazione. Consideriamo l’equazione tra matrici " #" # " # xi yi a ri = . s t b r Se la matrice è non singolare, cioè se xi t 6= yi s, trovando a con la regola di Cramer si ottiene " # ri yi det r t " # a= xi yi det s t da cui (xi t − yi s) a = ri t − yi r. Poiché deg (ri t − yi r) ≤ max {deg ri + deg t, deg yi + deg r} ≤ max {deg r + deg t, deg a − deg ri−1 + deg r} < max {deg a, deg a − deg ri−1 + deg ri−1 } = deg a si ha una contraddizione. Abbiamo quindi xi t = yi s. Sappiamo che MCD (xi , yi ) = 1 per cui yi |t e sia t = αyi per qualche α ∈ K [X], con α 6= 0 perché t 6= 0 da cui yi s = xi αyi . Cancellando yi abbiamo s = αxi e quindi r = sa + tb = αxi a + αyi b = α (xi a + yi b) = αri Indichiamo con (d0 , . . . , dn+1 ) la successione dei gradi dei resti che si ottengono nello svolgimento dell’algoritmo euclideo secondo le divisioni successive (A.4), cioè di = deg ri (e quindi d0 = deg a e d1 = deg b). Abbiamo che d0 ≥ d1 > d2 > · · · > dn > dn+1 ≥ 0. APPENDICE A. L’ALGORITMO EUCLIDEO 119 A volte può essere comodo considerare anche dn+2 = −∞. Per ogni ri vale ri = xi a+yi b e quindi di = deg (xi a + yi b), deg xi < d1 −di e deg yi < d0 −di . Questa proprietà caratterizza la successione dei gradi: Teorema A.16. Sia k un intero tale che 0 ≤ k ≤ d1 ≤ d0 . Allora k non compare nella successione dei gradi se, e solo se, esistono s, t ∈ K [X] tali che t 6= 0, deg s < d1 − k, deg t < d0 − k, deg (sa + tb) < k. Dimostrazione. (⇒) Supponiamo che k non compaia nella successione dei gradi. Esiste allora un indice 2 ≤ i ≤ n + 2 tale che di < k < di−1 . Poniamo s = xi e t = yi . Chiaramente t 6= 0 e deg (sa + tb) = deg (xi a + yi b) = deg ri = di < k. Inoltre, deg s = deg xi = d1 − di−1 < d1 − k 0 ≤ deg t = deg yi = d0 − di−1 < d0 − k Osserviamo che se i = n + 2 allora s = b/rn+1 e t = −a/rn+1 , con k < dn+1 e rn+2 = 0. (⇐) Siano s, t come nelle ipotesi del teorema e poniamo r = sa + tb. Dal teorema di unicità A.15 se i ∈ {1, . . . , n + 2} è tale che deg ri ≤ deg r < deg ri−1 allora esiste α ∈ K [X] non nullo tale che r = αri s = αxi t = αyi . Usando il teorema A.13 abbiamo d0 − di−1 = deg yi ≤ deg (αyi ) = deg t < n − k di ≤ deg α + di = deg (αri ) = deg r < k Messe insieme, queste equazioni implicano di < k < di−1 e quindi k non può comparire nella successione dei gradi. Questo teorema può essere riletto nel linguaggio dell’algebra lineare. Introduciamo per ciò alcune notazioni. j k Indichiamo con fg il quoziente della divisione di due polinomi e siano a, b ∈ K [X], a = au X u + · · · + a0 b = bv X v + · · · + b0 con au bv 6= 0 e u ≥ v. Sia Pd ⊂ K [X] il sottospazio vettoriale di dimensione d formato dai polinomi di grado minore di d e per 0 ≤ k ≤ v definiamo l’applicazione ϕk : Pv−k × Pu−k (s, t) In pratica, j (sa+tb) Xk k k −→ 7−→ P j u+v−2kk (sa+tb) Xk è il polinomio sa + tb privato dei suoi monomi di grado minore di k e diviso per X : se identifichiamo un polinomio con la successione dei coefficienti di modo che, per esempio, a ↔ (au , . . . , a0 ) allora (sa + tb) ↔ (sa + tb)u+v−k−1 , (sa + tb)u+v−k−2 , . . . , (sa + tb)k+1 , (sa + tb)k . k X I teoremi A.15 e A.16 possono essere riscritti come APPENDICE A. L’ALGORITMO EUCLIDEO 120 Teorema A.17. Sia k un intero tale che 0 ≤ k ≤ d1 = v = deg b ≤ d0 = u = deg a. Allora 1. k compare nella successione dei gradi per l’AEE applicato ad (a, b) ⇐⇒ ϕk è un isomorfismo. 2. Se k = di = deg ri , c è il coefficiente direttivo di ri e xi , yi sono i polinomi calcolati nell’AEE, allora i polinomi c−1 xi , c−1 yi sono l’unica soluzione di ϕk (s, t) = 1. Per avere il teorema precedente espresso in funzione di matrici piuttosto che di funzioni lineari, introduciamo la matrice di Sylvester (e alcune sue sottomatrici rilevanti) di due polinomi. Definizione A.18. La matrice di Sylvester (u + v) × (u + v) definita come au au−1 ··· 0 au au−1 . .. .. 0 . 0 · · · 0 ··· S0 (a, b) = bv bv−1 0 bv bv−1 .. . .. 0 . 0 ··· 0 | di a e b è la matrice quadrata S0 (f, g) di dimensione ··· a0 ··· .. . au b1 ··· ··· .. . bv u+v ··· au−1 b0 b1 ··· bv−1 ··· 0 . .. . .. a0 v righe . · · · .. 0 · · · · · · a0 0 ··· 0 . .. .. . . b0 u righe .. . 0 ··· · · · b1 b0 0 {z } colonne Il risultante dei polinomi a e b è l’elemento R (a, b) = det (a, b). N.B.: l’allineamento delle colonne tra la prima e la u-esima riga dipende da u; nello stesso modo, quello tra la (v + 1)-esima e la(u + v)-riga dipende da v. L’allineamento tra le righe u ed u + 1 è invece quello descritto, cioè 0 ··· 0 au au−1 · · · · · · a0 . bv bv−1 · · · b1 b0 0 ··· 0 Definiamo anche, per k = 1, . . . , v, la matrice Sk (a, b) di dimensione (u + v − 2k) × (u + v − 2k) in questo modo: dalla matrice S0 (a, b) si cancellano le righe u − k + 1, . . . , u e le righe u + v − k + 1, . . . , u + v, dopodiché si cancellano le ultime 2k colonne, cioè au au−1 · · · · · · · · · · · · a2k−v+1 .. .. 0 . a a · · · · · · . u u−1 v − k righe .. .. .. .. 0 . . . ··· ··· . 0 · · · 0 a a · · · a u u−1 k · · · · · · · · · · · · b2k−u+1 . Sk (a, b) = bv bv−1 . . .. .. 0 bv bv−1 · · · · · · u − k righe . . . . . .. .. .. . . 0 . ··· . 0 ··· 0 bv bv−1 · · · bk | {z u+v−2k colonne Il determinate di Sk (a, b) è detto sottorisultante di a e b. } APPENDICE A. L’ALGORITMO EUCLIDEO 121 Se consideriamo negli spazi vettoriali le basi standard date dalle potenze di X, allora posto s = sv−k−1 X v−k−1 + · · · + s0 e t = tu−k−1 X u−k−1 + · · · + t0 si vede facilmente che ϕk (s, t) = (sv−k−1 , . . . , s0 , tu−k−1 , . . . , t0 ) Sk (a, b) , cioè la matrice Sk (a, b) rappresenta ϕk in tali basi e quindi il teorema A.17 diventa Teorema A.19. Sia k un intero tale che 0 ≤ k ≤ d1 = v = deg b ≤ d0 = u = deg a. Allora 1. k compare nella successione dei gradi per l’AEE applicato ad (a, b) ⇐⇒ det Sk (a, b) 6= 0. 2. Se k = di = deg ri , c è il coefficiente direttivo di ri e xi = sd1 −di −1 X d1 −di −1 + · · · + s0 , yi = td0 −di −1 X d0 −di −1 + · · · + t0 sono i polinomi calcolati nell’AEE, allora c−1 (sd1 −di −1 , . . . , s0 , td0 −di −1 , . . . , t0 ) è l’unica soluzione del sistema (sv−k−1 , . . . , s0 , tu−k−1 , . . . , t0 ) Sk (a, b) = (0, . . . , 0, 1) . Corollario A.20. Il grado del massimo comun divisore di a (X) e b (X) è d se, e solo se, S0 (a, b) = . . . = Sd−1 (a, b) = 0 6= Sd (a, b) . Il caso particolare k = 0 merita di essere evidenziato: Corollario A.21. R (a, b) 6= 0 se, e solo se, MCD (a, b) = 1. Concludiamo osservando che il risultante di due polinomi gode anche di altre proprietà: per esempio, il discriminante di un polinomio è strettamente collegato al risultante tra il polinomio stesso e la sua derivata. Tali proprietà sono più in relazione con le radici dei polinomi piuttosto che con il massimo comune divisore, pertanto risultano di maggior interesse in teoria dei campi più che in teoria dei codici. Per questo motivo non approfondiamo qui queste proprietà. Appendice B Rappresentazione degli elementi dei campi finiti In questa appendice ricordiamo come rappresentare gli elementi nei campi finiti. Il teorema di struttura dei campi finiti verrà considerato noto. Quando si vuole descrivere esplicitamente gli elementi di un campo finito Fqb , dove q = pa , è necessario effettuare due scelte: la prima riguarda il sottocampo da cui si parte (cioè un qualsiasi campo intermedio Fp ⊆ K ⊆ Fqb ) e la seconda riguarda il tipo di notazione da usare. Come sottocampo di partenza generalmente, ma non sempre, scegliamo K = Fq . Per quel che riguarda la notazione ci sono essenzialmente tre notazioni che risultano utili: 1. notazione esponenziale (o moltiplicativa); 2. notazione vettoriale (o additiva); 3. base normale. La prima riflette il fatto che esiste un elemento β ∈ Fqb tale che, come gruppo moltiplicativo, F∗qb = hβi e quindi ogni elemento non nullo si scrive come β i per un unico i ∈ 0, . . . , q b − 1 . In questo caso, il polinomio minimo di β deve essere primitivo, oltre che irriducibile di grado b. La seconda invece esprime l’isomorfismo di spazi vettoriali Fqb ' Fq [X] / (m (X)), dove m (X) èPun polinomio irriducibile di grado b, pertanto ogni elemento si scrive in modo unico come b−1 i i=0 ci β dove ci ∈ Fq e β è una radice di m (X). La terza notazione è simile alla seconda: anch’essa esprime l’isomorfismo di spazi vettoriali b Fqb ' (Fq ) ma questa volta assume per ipotesi che il polinomio minimo di β, oltre che irriducibile b−1 di grado b, sia anche normale; in altre parole, i vettori β, β q ,P . . . , βq devono essere linearmente i b−1 indipendenti e ogni elemento si scrive in modo unico come i=0 ci β q dove ci ∈ Fq . Ognuna di queste notazioni ha vantaggi e svantaggi nella pratica, facilitando o meno il calcolo effettivo di alcune operazioni tra gli elementi del campo. Mostriamo, tramite un esempio, come rappresentare gli elementi di un campo finito, partendo dal sottocampo fondamentale, secondo le prime due notazioni e come utilizzare tali rappresentazioni a seconda delle operazioni algebriche che si desidera effettuare. 122 APPENDICE B. RAPPRESENTAZIONE DEGLI ELEMENTI DEI CAMPI FINITI B.1 123 Il campo F16 Il campo con 16 elementi è formato dall’insieme delle radici del polinomio X 16 −X = X 16 +X nella chiusura algebrica di F2 . Il polinomio X 16 + X si fattorizza, in F2 [X] come X 16 + X = X(X + 1)(X 2 + X + 1)(X 4 + X 3 + 1)(X 4 + X + 1)(X 4 + X 3 + X 2 + X + 1) Si ha pertanto che F16 = F2 (α) ∼ = F2 [X] / (p (X)) , dove p (X) è uno qualsiasi dei tre polinomi di quarto grado e α è una sua radice. F∗16 è un gruppo ciclico di ordine 15 pertanto è isomorfo a Z/15Z ed è quindi composto da un elemento di ordine 1, due elementi di ordine 3, quattro elementi di ordine 5 e otto elementi di ordine 15; questi ultimi sono i generatori di F∗16 , cioè i suoi elementi primitivi. Naturalmente l’elemento di ordine 1 è 1, radice di X + 1, e gli elementi di ordine 3 sono le radici di X 2 + X + 1. I restanti dodici elementi sono le radici dei tre polinomi di quarto grado; di questi tre polinomi uno non è primitivo: si tratta di X 4 + X 3 + X 2 + X + 1 e le sue quattro radici hanno ordine 5. Gli altri due polinomi sono primitivi e una qualsiasi radice è un generatore del gruppo ciclico F∗16 . Nel seguito sceglieremo come polinomio di riferimento il polinomio X 4 + X + 1 e indicheremo con α una sua radice. La notazione esponenziale, come detto, riflette il fatto che F16 = {0} ∪ F∗16 = {0} ∪ hαi: in questa notazione ogni elemento non nullo si esprime come una potenza di α con esponente compreso tra 0 e 14. Questa notazione è pratica per effettuare le moltiplicazioni; infatti basta sommare gli esponenti dei due fattori e, eventualmente, ridurre la somma modulo 15: αi · αj = αi+j mod 15 . (B.1) In virtù di questa proprietà, se u = αi l’esponente i viene chiamato logaritmo discreto di u (relativamente ad α). La notazione vettoriale invece riflette il fatto che F16 = F2 (α) = F2 [α] ∼ = F2 [X] / X 4 + X + 1 . In questa notazione ogni elemento si esprime in modo unico come combinazione lineare degli elementi 1, α, α2 ed α3 , con coefficienti in F2 . Questa notazione è pratica per effettuare le somme; la somma di due combinazioni lineari viene fatta componente per componente: (u3 α3 + u2 α2 + u1 α + u0 ) + (v3 α3 + v2 α2 + v1 α + v0 ) = = (u3 + v3 )α3 + (u2 + v2 )α2 + (u1 + v1 )α + (u0 + v0 ). Naturalmente il prodotto di due elementi può anche essere calcolato usando la notazione additiva: per trovare il risultato bisogna effettuare il prodotto ed eliminare le potenze di α di grado più grande di 3 usando (ripetutamente) la proprietà α4 = α + 1. Equivalentemente, si possono trasformare i due elementi in due polinomi di terzo grado (usando per ciò l’isomorfismo F2 (α) ∼ = F2 [X] / X 4 + X + 1 ), ridurre il prodotto dei due polinomi modulo X 4 + X + 1 e trasformare il resto in una combinazione lineare di 1, α, α2 ed α3 (con l’isomorfismo inverso). Questo procedimento è evidentemente più “costoso” di quanto sia necessario per effettuare la moltiplicazione in notazione moltiplicativa, però se due elementi sono espressi in forma additiva non richiede la conversione in forma moltiplicativa. Osserviamo, per contro, che non esiste nessuna regola pratica per effettuare la somma di due elementi espressi in notazione moltiplicativa: è sempre necessario tradurre gli elementi in APPENDICE B. RAPPRESENTAZIONE DEGLI ELEMENTI DEI CAMPI FINITI 124 notazione additiva (usando la tabella), effettuare la somma e tradurre il risultato in notazione moltiplicativa.1 La notazione additiva può essere scritta in modo più considerando il fatto che, compatto come spazio vettoriale su F2 , vale F2 [X] / X 4 + X + 1 ∼ = F42 e pertanto un elemento (u3 α3 + u2 α2 + u1 α + u0 ) può essere identificato con le sue coordinate (u3 , u2 , u1 , u0 ). Ovviamente è necessario concordare l’ordinamento con cui si scrive la base: in questo caso, la base è stata ordinata come {α3 , α2 , α, 1}. Dato che per F16 ogni vettore è formato da quattro coordinate in F2 , in questo caso particolare la notazione può essere ulteriormente compattata in una stringa di quattro numeri binari. Un’ulteriore compattazione puramente simbolica può essere effettuata considerando un vettore (u3 , u2 , u1 , u0 ) come le cifre di un numero compreso tra 0 e 15 2 espresso in notazione posizionale binaria: (u3 , u2 , u1 , u0 ) ←→ u3 23 + u2 22 + u1 2 + u0 . Naturalmente in questa notazione la somma degli elementi di F16 rappresentati dai due numeri non ha nessuna relazione con la somma dei due numeri in quanto tali: bisogna sempre tener ben presente cosa rappresenta il numero stesso. È quindi più corretto considerare questi oggetti come simboli piuttosto che numeri. Nella tabella B.1 sono riassunte tutte le precedenti notazioni. Osserviamo che se invece di scegliere la radice α di X 4 + X + 1 si sceglie un’altra radice β sempre dello stesso polinomio, le notazioni della tabella rimangono formalmente invariate, a patto di sostituire nella scrittura α con β. Di conseguenza, la tabella delle operazioni B.2 resta invariata. Se invece β è radice di un altro polinomio primitivo (in F16 l’unica altra possibilità è il polinomio X 4 + X 3 + 1), allora la tabella delle notazioni cambia e di conseguenza cambia anche la tabella delle operazioni. Per ritrovare i coniugati dei vari elementi secondo quanto visto nell’appendice C, ricordiamo che le classi 2-ciclotomiche modulo 15 sono: {0} , {1, 2, 4, 8} , {3, 6, 12, 9} , {5, 10} , {7, 14, 13, 11} . Nella tabella B.2 effettuiamo invece le operazioni in F16 usando la notazione numerica. Nella prima riga scriviamo il logaritmo discreto di ogni elemento di F16 (si osservi che il logaritmo è un numero naturale mentre i “numeri” che rappresentano gli elementi di F16 sono da interpretarsi come simboli). Questa riga può essere usata per effettuare il prodotto di due numeri espressi in notazione moltiplicativa applicando la (B.1). La commutatività delle operazioni ci permette di registrare in una singola tabella 16 × 16 tanto la somma quanto il prodotto: ordinando i simboli secondo l’ordinamento indotto dai numeri naturali di cui i simboli stessi hanno la forma, nella tabella registriamo ab quando si ha a ≤ b, mentre registriamo a + b quando si ha a > b. Sulla diagonale, cioè quando a = b, è sufficiente registrare il prodotto, dato che il calcolo della somma è banale: a + b = a + a = 2a = 0 per ogni a poiché la caratteristica del campo è 2. 1 Si può ricorrere al logaritmo di Zech, però anche in questo caso è necessario consultare una tabella precompilata. 2 Al posto dei numeri da 0 a 15 si possono alternativamente usare le cifre esadecimali 0, . . . , F APPENDICE B. RAPPRESENTAZIONE DEGLI ELEMENTI DEI CAMPI FINITI Notazione Polinomio minimo moltiplicativa polinomiale vettoriale numerica − 0 0000 0 0 X 1 1 0001 1 1 X +1 α α 0010 2 2 X4 + X + 1 α2 α2 0100 4 4 X4 + X + 1 α3 α3 1000 8 8 X4 + X3 + X2 + X + 1 α4 α+1 0011 3 3 X4 + X + 1 α5 α2 + α 0110 6 6 X2 + X + 1 α6 α3 + α2 1100 12 C X4 + X3 + X2 + X + 1 α7 α3 + α + 1 1011 11 B X4 + X3 + 1 α8 α2 + 1 0101 5 5 X4 + X + 1 α9 α3 + α 1010 10 A X4 + X3 + X2 + X + 1 α10 α2 + α + 1 0111 7 7 X2 + X + 1 α11 α3 + α2 + α 1110 14 E X4 + X3 + 1 α12 α3 + α2 + α + 1 1111 15 F X4 + X3 + X2 + X + 1 α13 α3 + α2 + 1 1101 13 D X4 + X3 + 1 α14 α3 + 1 1001 9 9 X4 + X3 + 1 Tabella B.1: Elementi di F16 125 APPENDICE B. RAPPRESENTAZIONE DEGLI ELEMENTI DEI CAMPI FINITI 126 log — 0 1 4 2 8 5 10 3 14 9 7 6 13 11 12 × + 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 3 4 5 6 7 8 9 A B C D E F 2 2 3 4 6 8 A C E 3 1 7 5 B 9 F D 3 3 2 1 5 C F A 9 B 8 D E 7 4 1 2 4 4 5 6 7 3 7 B F 6 2 E A 5 1 D 9 5 5 4 7 6 1 2 D 8 E B 4 1 D C 3 6 6 6 7 4 5 2 3 7 1 5 3 9 F E 8 2 4 7 7 6 5 4 3 2 1 6 D A 3 4 2 5 C B 8 8 9 A B C D E F C 4 F 7 A 2 9 1 9 9 8 B A D C F E 1 D 5 C 6 F 7 E A A B 8 9 E F C D 2 3 8 2 1 B 6 C B B A 9 8 F E D C 3 2 1 9 D 6 8 3 C C D E F 8 9 A B 4 5 6 7 F 3 4 8 D D C F E 9 8 B A 5 4 7 6 1 E A 7 E E F C D A B 8 9 6 7 4 5 2 3 B 5 F F E D C B A 9 8 7 6 5 Tabella B.2: Operazioni in F16 4 3 2 1 A Appendice C Campi finiti e radici dell’unità In questa appendice ricaviamo le prime proprietà algebriche del polinomio X n − 1 in Fq [X], dove q = pa , per un primo p e un intero a. Indichiamo con σp il morfismo di Frobenius definito da σp : Fp → Fp . γ 7→ γ p a Per brevità, poniamo σq = σpa di modo che σq (γ) = γ q = γ p . Per il teorema di struttura dei campi finiti, Fq = γ ∈ Fp : σq (γ) = γ . Dato che F∗q è un gruppo moltiplicativo (abeliano), ogni suo elemento ha ordine che divide q − 1 = pa − 1; in altre parole, ogni elemento non nullo è una radice (q − 1)-esima dell’unità. Se Fqb è un’estensione finita di Fq , quanto sopra vale anche per Fqb , i cui elementi non nulli sono radici q b −1-esime dell’unità. Inoltre, raggruppando insieme gli elementi coniugati si ottiene Y Y b f (X) . (C.1) Xq − X = (X − γ) = γ∈Fqb C.1 f (X)∈Fq [X] f monico f irriducibile deg f |b Coniugati ed elementi primitivi Gli elementi di F∗q non sono solo elementi che hanno ordine che divide q − 1: il teorema dell’elemento primitivo dice che F∗q è un gruppo ciclico e quindi i suoi generatori, cioè i γ tali che hγi = F∗q , sono esattamente le radici primitive (q − 1)-esime dell’unità. Nel caso particolare n = q b − 1 ogni generatore del gruppo ciclico F∗qb è una radice primitiva n-esima di 1, e viceversa. Per tale motivo questi elementi si chiamano elementi primitivi e i loro polinomi minimi si dicono polinomi primitivi. Osservazione C.1. In teoria dei campi un’estensione L/K si dice semplice se L = K (θ) per qualche θ, nel qual caso θ si dice elemento primitivo (o elemento generatore). Nel caso dei campi finiti si ha che ogni estensione finita di un campo finito è semplice, per cui esiste sempre un elemento generatore. Non succede però in generale che un elemento tale che L = K [θ] sia anche tale che hθi = L∗ . Per tale motivo, nei campi finiti la definizione di elemento primitivo viene ristretta solo a quegli elementi tali che hθi = L∗ . 127 APPENDICE C. CAMPI FINITI E RADICI DELL’UNITÀ 128 Per esempio, se consideriamo l’estensione F16 /F2 allora si ha F16 = F2 [α] = F2 [β] = F2 [γ] dove α, β e γ sono radici dei polinomi X 4 + X + 1, X 4 + X 3 + 1 e X 4 + X 3 + X 2 + X + 1 rispettivamente, però o (α) = o (β) = 15 mentre o (γ) = 5 per cui i primi due sono elementi primitivi mentre γ non lo è, pur generando F16 . Osserviamo che γ è una radice primitiva quinta dell’unità. In ogni caso, ogni elemento non nullo di un campo finito è radice dell’unità e l’ordine moltiplicativo di due elementi coniugati è lo stesso, grazie al teorema seguente. ∗ Teorema C.2. Sia γ ∈ Fp , f (X) il suo polinomio minimo su Fq e deg f (X) = b. Sia inoltre β un elemento primitivo di F [γ], γ = β m e poniamo n = o (γ). Allora: 1. F [γ] = Fqb ; n o i 2. b = deg f (X) = min i > 0 : γ q = γ ; b q −1 3. n = o (γ) = MCD(m,q b −1) ; i 4. o γ q = o (γ) per ogni i ≥ 0; i 5. le radici (distinte) di f sono γ q = σqi (γ) per i = 0, . . . , b − 1; 6. se γ è un elemento primitivo allora sono primitivi anche tutti i coniugati di γ e tutti i coniugati di γ −1 ; 7. il polinomio minimo di γ −1 è f (0) Dimostrazione. −1 f ∗ (X), dove f ∗ (X) è il polinomio reciproco di f (X). 1. Poiché deg f (X) = b si ha b = [Fq [γ] : Fq ] e quindi Fq [γ] = Fqb . i 2. Se i > 0 è tale che γ q = γ allora dal teorema di struttura γ ∈ Fqi . Dato che Fqb è la più piccola estensione di Fq che contiene γ, segue Fqb ⊂ Fqi e quindi b|i; il viceversa è ovvio. In particolare, n o i b = min i > 0 : γ q = γ . 3. Sia n l’ordine di γ. Poiché o (β) = q b − 1 e γ = β m , dal teorema di struttura dei gruppi q b −1 ciclici segue che n = MCD(m,q b −1) . 4. Si ha n = o (γ) |q b − 1 pertanto p - n e i n n o γq = = = n = o (γ) . MCD (q i , n) MCD (pai , n) 5. f (X) è un polinomio irriducibile in Fq [X] e Fq è perfetto in quanto è finito, pertanto per il criterio della derivata f (X) è separabile, cioè tutte le sue radici sono distinte. Da i σq (f (X)) = f (X q ) (che è valida in Fq [X]) segue per induzione che tutte le potenze γ q sono radici di f per ogni i ∈ N: basta quindi vedere che fra questi elementi ce ne sono b i j distinti. Vediamo più precisamente che γ q 6= γ q per 0 ≤ i < j ≤ b − 1; supponiamo che i j γ q = γ q per qualche 0 ≤ i < j ≤ b − 1, cioè 1 = γq j −q i i qj−i −1 i j−i = γ q (q −1) = γ q . APPENDICE C. CAMPI FINITI E RADICI DELL’UNITÀ 129 i D iE h ii Poiché o γ q = o (γ) si ha γ q = hγi e, in particolare, γ ∈ Fq γ q da cui Fq [γ] = h ii Fq γ q , essendo ovvia l’altra inclusione. i qj−i −1 i Per il teorema di struttura dei campi finiti, da γ q = 1 segue γ q ∈ Fqj−i e quindi h ii Fqb = Fq [γ] = Fq γ q ⊆ Fqj−i e quindi q b = Fqb ≤ Fqj−i = q j−i ≤ q b−1 una contraddizione. 6. Dato che F∗qb è un gruppo ciclico (moltiplicativo), γ è primitivo se, e solo se, oF∗b (γ) = q b −1. q Abbiamo già visto che l’ordine di un coniugato di γ coincide con l’ordine di γ, quindi γ è primitivo se, e solo se, lo è ogni suo coniugato. Poiché oF∗b (γ) = oF∗b γ −1 , si ha che γ è q q primitivo se, e solo se, γ −1 è primitivo e lo stesso vale anche per i coniugati di γ −1 . 7. Indichiamo (cfr. 3.3) con f ∗ (X) il polinomio reciproco di f (X), cioè f ∗ (X) = X b f X −1 , ∗ dove b = deg f (X). Si ha che (f (X) g (X)) = f ∗ (X) g ∗ (X) e da f (0) 6= 0 abbiamo −1 f ∗∗ (X) = f (X). Da ciò segue facilmente che f (0) f ∗ (X) è il polinomio minimo di γ −1 . C.2 Polinomi ciclotomici Studiamo ora il polinomio X n − 1 per un generico n. Se p|n, scriviamo n = ps n0 con p - n0 e si ha 0 ps , Xn − 1 = Xn − 1 pertanto le radici n-esime di 1 sono tutte e sole le radici n0 -esime, ognuna contata con molteplicità ps . In definitiva, possiamo limitarci a studiare il caso p - n, ipotesi che sarà sottintesa da ora in poi. Poniamo Gn = ζ ∈ Fp : ζ n = 1 . Da p - n segue che il polinomio X n − 1 è separabile, cioè le sue radici sono tutte distinte, vale a dire |Gn | = n e Y Y Y Y Xn − 1 = (X − ζ) = (X − ζ) = Φd (X) (C.2) ζ∈Gn d|n ζ∈Gn o(ζ)=d d|n dove con Φd (X) si indica come di consueto il polinomio ciclotomico d-esimo Y Φd (X) = (X − ζ) ∈ Z [X] . ζ∈Gn o(ζ)=d Ricordiamo che Φd (X) è irriducibile in Q [X] ma ciò non è sempre vero in caratteristica positiva. APPENDICE C. CAMPI FINITI E RADICI DELL’UNITÀ 130 ∗ Gn è un sottogruppo moltiplicativo di Fp e pertanto, per il teorema dell’elemento primitivo, è un gruppo ciclico: Gn = hαi per qualche α ∈ Gn e la (C.2) diventa Xn − 1 = n−1 Y X − αi . (C.3) i=0 D’altra parte, in Fq [X] si deve avere X n − 1 = m1 (X) · · · · · mj (X) (C.4) per degli opportuni polinomi irriducibili m1 (X) , . . . , mj (X): dobbiamo quindi capire come i fattori della (C.3) (o della (C.2)) si ricombinano per dar luogo alla fattorizzazione (C.4). Naturalmente Fq [G] = Fq [α] è un’estensione finita di Fq , pertanto Fq [α] = Fqb per qualche b. Dato che o (α) = n, in generale α non è un elemento primitivo per Fq [α]: lo è solo nel caso n = q b − 1 e quindi, in generale, le radici primitive n-esime di 1 non corrispondono agli elementi primitivi della più piccola estensione di Fq che le contiene. In altre parole, Fq [α] = Fqb ma non è detto che hαi = F∗qb : si ha hαi = F∗qb se, e solo se, n = q b − 1. Per questo motivo, questo caso particolare è generalmente detto primitivo. Il primo problema è determinare b, cioè il grado della più piccola estensione di Fq che contiene tutte le radici n-esime. Teorema C.3. Sia p un primo, q = pa e n > 0 un intero tale che p - n. Allora il campo di spezzamento di X n − 1 su Fq è Fqb dove b = oZ∗n (q). Inoltre Φn (X) si spezza come il prodotto di v = nb distinti fattori irriducibili, ognuno di grado b. ∗ Dimostrazione. Sia α una radice primitiva n-esima di 1. Considerando α come elemento di Fp , il teorema di struttura dei campi finiti implica che i α ∈ Fqi ⇔ αq = α ⇔ αq i −1 = 1. Dato che l’ordine moltiplicativo di α è n (essendo una radice primitiva n-esima dell’unità) si ha che i αq −1 = 1 ⇔ n|q i − 1 cioè Fqi contiene α se, e solo se, n divide q i −1. Essendo n fissato questo ci permette di concludere che la più piccola estensione di Fq che contiene α è Fqb dove b = min i > 0 : n | q i − 1 = min i > 0 : q i ≡ 1 (mod n) = oZ∗n (q) e quindi Fq [α]= Fqb . Dato che α èuna radice primitiva n-esima di 1, le altre radici n-esime di 1 sono date da αi : i = 0, . . . , n − 1 e sono anch’esse elementi di Fq [α] = Fqb che quindi risulta essere il campodi spezzamento di X n − 1 su Fq . Poiché b = Fqb : Fq = [Fq [α] : Fq ] e Fq [α] ∼ = Fq [X] / (ma (X)), dove mα (X) ∈ Fq [X] è il polinomio minimo di α, ne segue che mα (X) ha grado b, cioè α ha esattamente b coniugati che, per il teorema C.2, sono anch’essi radici primitive n-esime di 1. Poiché α è una generica radice primitiva n-esima dell’unita, da Y Φn (X) = (X − α) α∈Gn o(α)=n si ha la tesi raggruppando i generatori che hanno lo stesso polinomio minimo. APPENDICE C. CAMPI FINITI E RADICI DELL’UNITÀ 131 Per brevità, indichiamo con ordn (q) l’ordine di q in Z∗n . Il teorema C.2 ci dice qual è il grado del polinomio minimo di una radice n-esima dell’unità calcolando i suoi distinti coniugati e quindi il loro numero. In realtà il numero di distinti coniugati di una radice n-esima dell’unità è una proprietà puramente aritmetica del numero che esprime tale radice come potenza di una radice primitiva n-esima dell’unità. Teorema C.4. Sia p un primo, q = pa e n > 0 un intero tale che p - n. Poniamo b = ordn (q) e sia β un elemento primitivo di Fqb . Sia inoltre α = β m una radice primitiva n-esima di 1 (cioè α ha ordine moltiplicativo uguale a n). Se 0 ≤ s ≤ n − 1, allora il polinomio minimo di γ = αs ha grado u = min i : sq i ≡ s (mod n) . Dimostrazione. Poniamo q b − 1 = dn. Per il teorema di struttura dei gruppi ciclici, α è una b q b −1 Da n = q d−1 otteniamo d = radice primitiva n-esima di 1 se, e solo se, n = MCD(m,q b −1) . MCD m, q b − 1 e possiamo scrivere m = m0 d con MCD m0 , q b − 1 = 1. n o i Indichiamo con mγ (X) il polinomio minimo di γ su Fq e con u = min i > 0 : γ q = γ . 2 Dal teorema C.2, u = deg (mγ (X)) e i coniugati di γ sono γ, γ q , γ q , . . . , γ q u−1 coniugati di γ sono β ms , β msq , . . . , β msq . Poiché i γq = γ ⇔ γq ⇔β i −1 u−1 . Sostituendo, i =1 msq i −ms =1 i ⇔ msq ≡ ms (mod q b − 1) ⇔ m0 dsq i ≡ m0 ds (mod q b − 1) ⇔ dsq i ≡ ds (mod q b − 1) ⇔ dsq i ≡ ds (mod dn) ⇔ sq i ≡ s (mod n) si ha n o i u = min i > 0 : γ q = γ = min i : sq i ≡ s (mod n) . Osservazione C.5. Il caso particolare n = q b − 1 è detto primitivo perché se α è una radice primitiva n-esima dell’unità allora è anche un elemento primitivo dell’estensione Fq [α] = Fqb , cioè nel teorema si può prendere m = 1 e α = β. Grazie al teorema, se α è una radice primitiva n-esima di 1 e αs è un’altra radice n-esima dell’unità, i coniugati di αs dipendono quindi solo da s e dal suo comportamento in Zn rispetto alla moltiplicazione per q. È quindi spontanea la seguente definizione. Definizione C.6. Sia s un intero, 0 ≤ s ≤ n; la classe laterale q-ciclotomica di s modulo n è l’insieme degli interi (modulo n) Cs = s, sq, sq 2 , . . . , sq u−1 (mod n) (C.5) dove u = min i tali che sq i ≡ s (mod n) . Ovviamente si ha sempre C0 = {0} e |C1 | = ordn (q). Inoltre APPENDICE C. CAMPI FINITI E RADICI DELL’UNITÀ 132 Corollario C.7. Con la notazione precedente, se Cs è la classe laterale q-ciclotomica di s modulo n, allora |Cs | divide b. 2 u−1 Dimostrazione. Usiamo la notazione del teorema. Gli elementi αs , αsq , αsq , . . . , αsq sono i coniugati di αs , quindi |Cs | = u = [Fq [αs ] : Fq ]. Da Fq [αs ] ⊆ Fq [β] segue, per il teorema della torre, che u| [Fq [β] : Fq ] = b. n e, pur essendo legato ad s, non ha Osservazione C.8. L’ordine di αs è evidentemente MCD(s,n) un legame diretto con la classe laterale q-ciclotomica di s modulo q b − 1 e la sua cardinalità. Le classi ciclotomiche formano una partizione: Proposizione C.9. Le classi laterali q-ciclotomiche modulo n formano una partizione dell’insieme {0, 1, 2, . . . , n − 1} cioè Cr ∩ Cs 6= ∅ ⇒ Cr = Cs . Cr ∩ Cs 6= ∅ ⇒ Cr = Cs (C.6) Dimostrazione. Poiché n|q abbiamo q b = 1 (mod n) quindi se t ∈ Cr ∩ Cs allora tq i ∈ Cr e tq i ∈ Cs per ogni i. Dalla definizione di classi ciclotomiche, esistono 0 ≤ i, j ≤ b − 1 tali che t = rq i = sq j pertanto si ha r = tq b−i ∈ Cs e Cr ⊆ Cs . In modo analogo si ottiene l’inclusione opposta e quindi l’uguaglianza. Siamo ora pronti per fattorizzare il polinomio X n − 1. Teorema C.10. Sia n un intero, p - n, b = ordn (q), β un elemento primitivo di Fqb , α una radice primitiva n-esima di 1, s un intero in [0, n − 1] e Cs la classe q-ciclotomica di s modulo n. Allora il polinomio minimo di αs su Fq è Y mαs (X) = X − αi . i∈Cs Inoltre, se {s1 , . . . , sw } è un insieme di rappresentanti per le classi q-ciclotomiche modulo n, allora w Y Xn − 1 = mαsj (X) . j=1 Dimostrazione. Grazie al teorema C.4 i coniugati di αs sono n o u−1 αs , αsq , . . . , αsq = αi : i ∈ Cs da cui segue la prima formula. Partendo da Xn − 1 = Y ζ∈Gn (X − ζ) = n−1 Y (X − αs ) i=0 e usando la prima formula si ottiene la fattorizzazione di X n − 1. APPENDICE C. CAMPI FINITI E RADICI DELL’UNITÀ 133 Esempio C.11. Consideriamo p = q = 2, b = 4, n = 15 = 24 − 1. Si tratta di un caso primitivo. Le classi 2-ciclotomiche modulo 15 = 24 − 1 sono C0 = {0} , C1 = {1, 2, 4, 8} , C3 = {3, 6, 12, 9} , C5 = {5, 10} , C7 = {7, 14, 13, 11} . Sia β un elemento primitivo di F16 radice, per esempio, del polinomio X 4 +X+1, S = {0, 1, 3, 5, 7} un insieme di rappresentanti delle classi q-ciclotomiche modulo 15. Allora (ricordando che la caratteristica è 2) mβ 0 = X + 1 mβ 1 = X 4 + X + 1 mβ 3 = X 4 + X 3 + X 2 + X + 1 mβ 5 = X 2 + X + 1 mβ 7 = X 4 + X 3 + 1 e X 15 + 1 = (X + 1) X 4 + X + 1 X4 + X3 + X2 + X + 1 X2 + X + 1 X4 + X3 + 1 . Osserviamo che se scriviamo Xn − 1 = Y Φd (X) d|n allora nel nostro caso X 15 + 1 = Φ1 (X) Φ3 (X) Φ5 (X) Φ15 (X) = (X + 1) X 2 + X + 1 X 4 + X 3 + X 2 + X + 1 X 8 + X 7 + X 5 + X 4 + X 3 + 1 e Φ15 (X) = X 8 + X 7 + X 5 + X 4 + X 3 + 1 = X 4 + X + 1 X4 + X3 + 1 . Infine, se usassimo come elemento primitivo un’altra radice di X 4 +X +1, nelle formule precedenti non cambierebbe nulla mentre se usassimo una radice γ del polinomio X 4 +X 3 +1 allora si avrebbe mγ 0 = X + 1 mγ 1 = X 4 + X 3 + 1 mγ 3 = X 4 + X 3 + X 2 + X + 1 mγ 5 = X 2 + X + 1 mγ 7 = X 4 + X + 1 Esempio C.12. Consideriamo ora p = 2, q = 2a , n = 5. Questo caso non è primitivo, neanche per a = 1. Sia q = 2a , n = 5 e α una radice 5 primitiva di 1. Il polinomio X 5 − 1 = X 5 + 1 = (X + 1) X 4 + X 3 + X 2 + X + 1 ∈ F2a [X] si spezza in F2a F24 = F2m dove m = mcm (a, 4). Poiché 1 se 4 se 4 ord5 2i = = MCD (i, 4) 2 se 4 se abbiamo 3 possibilità: i≡0 i≡1 i≡2 i≡3 (mod (mod (mod (mod 4) 4) 4) 4) APPENDICE C. CAMPI FINITI E RADICI DELL’UNITÀ 134 1. MCD (a, 4) = 1: in questo caso il campo di spezzamento è F2a [α] = F24a . Si ha b = ord5 (2a ) = 4 = [F2a [α] : F2a ] e X 4 + X 3 + X 2 + X + 1 si spezza come il prodotto di cioè è irriducibile su F2a [X]. Le classi laterali q-ciclotomiche modulo 5 sono 4 4 = 1 fattori irriducibili su F2a [X], {0} , {1, 2, 3, 4} . 2. MCD (a, 4) = 2: questa volta si ha che F2a contiene F22 = F2 [γ], dove γ è radice del polinomio X 2 + X + 1 e il campo di spezzamento di X 5 + 1 è F2a [α] = F22a . Il polinomio X 4 + X 3 + X 2 + X + 1 non è irriducibile su F2a [X] ma si spezza nel prodotto di due fattori irriducibili di grado 2. Infatti, ricordando che 2|a ma a2 è dispari, si ha a 4 a q = 2a = 22 2 = 4 2 ≡ (−1) 2 = −1 ≡ 4 (mod 5). Da ciò b = ord5 (2a ) = 2 = [F2a [α] : F2a ] 2 e inoltre αq = α4 = α−1 dato che α5 = 1 e anche α2q = (αq ) = α4 ciò 2 = α8 = α3 . Usando Φ5 (X) = X 4 + X 3 + X 2 + X + 1 Y = (X + ζ) ζ∈G5 o(ζ)=5 = (X + α) X + α2 = (X + α) X + α4 X + α3 X + α4 X + α2 X + α3 = (X + α) (X + αq ) X + α2 X + α2q = mα (X) mα2 (X) = X 2 + α + α4 X + 1 X 2 + α2 + α3 + 1 2 = X 2 + α + α4 X + 1 X 2 + α + α4 + 1 dove mα (X) è il polinomio minimo di α su F2a e deve avere grado 2. D’altra parte, 2 ricordando che α è radice di Φ5 (X) si ha α4 + α3 + α2 + α + 1 = 0, cioè α + α4 = α2 + α3 = α + α4 + 1 per cui il polinomio minimo di α + α4 su F2a divide X 2 + X + 1. Ma γ ∈ F2a e in F2a [X] il polinomio X 2 +X +1 si spezza come X 2 +X +1 = (X + γ) X + γ 2 quindi (possiamo supporre che) α + α4 = γ e otteniamo infine Φ5 (X) = X 2 + γX + 1 X 2 + γ 2 + 1 che è la fattorizzazione in F2a [X]. Le classi laterali q-ciclotomiche modulo 5 sono {0} , {1, 4} , {2, 3} . 3. MCD (a, 4) = 4: questa volta α ∈ F2a , b = ord5 (2a ) = 1 e otteniamo subito lo spezzamento Φ5 (X) == (X + α) X + α2 X + α3 X + α4 . APPENDICE C. CAMPI FINITI E RADICI DELL’UNITÀ Le classi laterali q-ciclotomiche modulo 5 sono {0} , {1} , {2} , {3} , {4} . 135 Bibliografia [1] Blahut, R. E.: Algebraic codes for data transmission. Cambridge, 2003 [2] Huffman, W. C., Pless, V.: Fundamentals of error-correcting codes. Cambridge, 2003 [3] Lidl, R, Niederreiter, H.: Finite Fields. Cambridge, 1997 [4] MacWilliams, F. J., Sloane, N. J. A.: The theory of error-correcting codes. North-Holland, 1977 [5] Moon, T. K.: Error correction coding. Wiley, 2005 [6] Niesi, G.: Teoria dei codici http://www.dima.unige.it/~niesi/TdC/TdC.html [7] Pless, V.: Introduction to the theory of error-correcting codes. J. Wiley & Sons, 1998 [8] Pretzel, O.: Error-correcting codes and finite fields. Oxford, 1992 [9] van Lint, J. H.: Introduction to coding theory. Springer-Verlag, 1982 136