Nella teoria dei codici , l'algoritmo di Zemor , progettato e sviluppato da Gilles Zemor, è un approccio ricorsivo a bassa complessità alla costruzione del codice. È un miglioramento rispetto all'algoritmo di Sipser e Spielman .
Zemor ha considerato una tipica classe di costruzione Sipser-Spielman di codici di espansione , in cui il grafo sottostante è grafo bipartito . Sipser e Spielman hanno introdotto una famiglia costruttiva di codici di errore lineare asintoticamente buoni insieme a un semplice algoritmo parallelo che rimuoverà sempre una frazione costante di errori. L'articolo si basa sugli appunti del corso del Dr. Venkatesan Guruswami
Costruzione del codice
L'algoritmo di Zemor si basa su un tipo di grafico espansore chiamato grafico di Tanner . La costruzione del codice è stata proposta per la prima volta da Tanner. I codici sono basati su double cover , regular expander , che è un grafo bipartito. = , dove è l'insieme dei vertici ed è l'insieme degli archi e = e = , dove e denota gli insiemi dei vertici. Sia il numero di vertici in ogni gruppo, cioè , . Il set di bordi è di dimensione = e ogni bordo in ha un punto finale in entrambi e . denota l'insieme di bordi che contengono .






















Assumiamo un ordinamento su , quindi l'ordinamento verrà eseguito su ogni bordo di per ogni . Lascia campo finito , e per una parola in , lascia che la sottoparola della parola sarà indicizzata da . Lascia che questa parola sia indicata con . Il sottoinsieme di vertici e induce ogni parola una partizione in sottoparole non sovrapposte , dove varia sugli elementi di . Per costruire un codice , considera un sottocodice lineare , che è un codice, dove , la dimensione dell'alfabeto è . Per ogni vertice , sia un ordinamento dei vertici di adiacente a . In questo codice, ogni bit è collegato a un fronte di .
















![{\displaystyle [d,r_{o}d,\delta]}](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/4bfff9d5ed5d984acc20982f5fbd9950cbdffafb)










Possiamo definire il codice come l'insieme dei vettori binari di tale che, per ogni vertice di , è una parola di codice di . In questo caso, possiamo considerare un caso speciale quando ogni arco di è adiacente esattamente ai vertici di . Significa che e costituiscono, rispettivamente, l'insieme dei vertici e l'insieme degli archi del grafo regolare .














Chiamiamo codice il codice costruito in questo modo . Per un dato grafo e un dato codice , ci sono diversi codici come ci sono diversi modi di ordinare gli archi incidenti su un dato vertice , cioè . In effetti il nostro codice consiste di tutte le parole in codice in modo tale che per tutti . Il codice è lineare in quanto viene generato da un sottocodice , che è lineare. Il codice è definito come per ogni .











![{\displaystyle [N,K,D]}](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/11254953d9037cceea0ecf219e62446c130e2ad4)





In questa figura, . Mostra il grafico e il codice .



In matrice , let è uguale al secondo autovalore più grande della matrice di adiacenza di . Qui l'autovalore più grande è . Vengono fatte due affermazioni importanti:




Rivendicazione 1

. Sia la velocità di un codice lineare costruito da un grafo bipartito i cui nodi di cifre hanno grado e i cui nodi di sottocodice hanno grado . Se un singolo codice lineare con parametri e velocità è associato a ciascuno dei nodi del sottocodice, allora




.
Prova
Sia la velocità del codice lineare, che è uguale a
Lascia che ci siano nodi di sottocodice nel grafico. Se il grado del sottocodice è , allora il codice deve avere cifre, poiché ogni nodo di cifra è connesso a degli archi nel grafico. Ogni nodo di sottocodice contribuisce con equazioni alla matrice di controllo di parità per un totale di . Queste equazioni potrebbero non essere linearmente indipendenti. Pertanto, , Poiché il valore di , cioè il nodo della cifra di questo grafo bipartito è e qui , possiamo scrivere come:














Rivendicazione 2

-
Se è il codice lineare della velocità , la lunghezza del codice a blocchi e la distanza relativa minima , e se è il grafico dell'incidenza del vertice del bordo di un grafo regolare con il secondo autovalore più grande , allora il codice ha almeno la velocità e almeno la distanza relativa minima .








Prova
Sia derivato dal grafo regolare . Quindi, il numero di variabili di is e il numero di vincoli è . Secondo Alon-Chung, se è un sottoinsieme di vertici di dimensione , allora il numero di archi contenuti nel sottografo è indotto da in è al massimo .












Di conseguenza, qualsiasi insieme di variabili avrà almeno dei vincoli come vicine. Quindi il numero medio di variabili per vincolo è:

Quindi se , allora una parola di peso relativo , non può essere una parola in codice di . La disuguaglianza è soddisfatta per . Pertanto, non può avere un codice diverso da zero di peso relativo o inferiore.







In matrice , possiamo assumere che è limitato da . Per quei valori di in cui è primo dispari, ci sono costruzioni esplicite di sequenze di grafi bipartiti regolari con un numero arbitrariamente grande di vertici tale che ogni grafo nella sequenza è un grafo di Ramanujan . Si chiama grafico Ramanujan in quanto soddisfa la disuguaglianza . Alcune proprietà di espansione sono visibili nel grafico come la separazione tra gli autovalori e . Se il grafico è un grafico Ramanujan, allora quell'espressione diventerà alla fine man mano che diventa grande.















Algoritmo di Zemor
L'algoritmo di decodifica iterativo scritto di seguito si alterna tra i vertici e in e corregge la parola in codice di in e quindi passa a correggere la parola in codice in . Qui i bordi associati a un vertice su un lato di un grafico non sono incidenti con l'altro vertice su quel lato. In effetti, non importa in quale ordine, l'insieme di nodi e vengono elaborati. L'elaborazione dei vertici può essere eseguita anche in parallelo.









Il decoder sta per un decoder che recupera correttamente con qualsiasi parola di codice con meno di errori.



Algoritmo di decodifica
Parola ricevuta:
Uscita:

For
to
do //
is the number of iterations
{ if (
is odd) // Here the algorithm will alternate between its two vertex sets.

else
Iteration
: For every
, let
// Decoding
to its nearest codeword.
}
Spiegazione dell'algoritmo
Poiché è bipartito, l'insieme dei vertici induce la partizione dell'insieme degli archi = . L'insieme induce un'altra partizione, = .







Sia il vettore ricevuto e ricordalo . La prima iterazione dell'algoritmo consiste nell'applicare la decodifica completa per il codice indotta da per ogni . Ciò significa che per sostituire, per ogni , il vettore con uno dei codici più vicini di . Poiché i sottoinsiemi di archi sono disgiunti per , la decodifica di questi sottovettori di può essere eseguita in parallelo.











L'iterazione produrrà un nuovo vettore . L'iterazione successiva consiste nell'applicare la procedura precedente a ma con sostituita da . In altre parole, consiste nel decodificare tutti i sottovettori indotti dai vertici di . Le prossime iterazioni ripetono questi due passaggi applicando alternativamente la decodifica parallela ai sottovettori indotti dai vertici di e ai sottovettori indotti dai vertici di . Nota: [Se e è il grafo bipartito completo, allora è un codice prodotto di con se stesso e l'algoritmo di cui sopra si riduce alla naturale decodifica iterativa dei codici prodotto].











Qui, il numero di iterazioni è . In generale, l'algoritmo di cui sopra può correggere una parola in codice il cui peso di Hamming non è superiore a quello per i valori di . Qui, l'algoritmo di decodifica è implementato come un circuito di dimensioni e profondità che restituisce la parola in codice dato che il vettore di errore ha un peso inferiore a .







Teorema
Se è un grafo Ramanujan di grado sufficientemente alto, per qualsiasi , l'algoritmo di decodifica può correggere gli errori, in round (dove la notazione big nasconde una dipendenza da ). Questo può essere implementato in tempo lineare su un singolo processore; sui processori ogni round può essere implementato in tempo costante.





Prova
Poiché l'algoritmo di decodifica è insensibile al valore degli archi e per linearità, possiamo assumere che la parola di codice trasmessa sia il vettore di tutti zero. Lascia che il codice ricevuto sia . Viene considerato l'insieme dei bordi che ha un valore errato durante la decodifica. Qui per valore errato intendiamo in uno qualsiasi dei bit. Sia il valore iniziale del codice, siano i valori dopo first, second . . . fasi di decodifica. Qui, , e . Qui corrisponde a quei set di vertici che non sono stati in grado di decodificare con successo il loro codice nel round. Dall'algoritmo sopra come numero di vertici non riusciti verrà corretto in ogni iterazione. Possiamo dimostrare che è una successione decrescente. In effetti, . Come stiamo assumendo, , l'equazione di cui sopra è in una sequenza geometrica decrescente . Quindi, quando , sono necessari più di round. Inoltre, e se implementiamo l' arrotondamento nel tempo, il tempo di esecuzione sequenziale totale sarà lineare.


















Svantaggi dell'algoritmo di Zemor
- È un processo lungo poiché il numero di iterazioni necessarie nell'algoritmo del decodificatore è

- L'algoritmo di decodifica di Zemor trova difficile decodificare le cancellazioni. Un modo dettagliato di come possiamo migliorare l'algoritmo è
dato dentro.
Guarda anche
Riferimenti