Nell'algoritmo Welch-Berlekamp per la decodifica dei codici Reed-Solomon, viene fornito un elenco di punti rappresentano un messaggio con errori su in posizioni sconosciute (ed viene dato all'algoritmo). L'output è un polinomio che passa attraverso tutti i punti dati tranne quelli in cui si sono verificati errori.
Il metodo prevede la risoluzione di un sistema di equazioni lineari della forma
per tutti cui ha grado e ha grado massimo . Le variabili sono i coefficienti di e .
Per garantire che ha grado uno di solito aggiunge il vincolo che il coefficiente di è 1 per il sistema lineare di cui sopra. Tuttavia, in pratica non si conosce necessariamente . Un modo inefficiente (ma ancora tempo polinomiale) di gestirlo è provare per tutti i valori che iniziano con che scende fino a trovare una soluzione.
La mia domanda è: esiste un modo più efficiente per determinare ? In alternativa, esiste una modifica al sistema lineare che consente di utilizzare un limite superiore su anziché il valore esatto?
In particolare, voglio usare questo decodificatore specifico per i codici Reed-Solomon e non un algoritmo completamente diverso basato su altre tecniche.
In risposta alla risposta di DW, ecco il mio esempio di lavoro. Tutto è fatto modulo 7.
plain message is: [2, 3, 2]
polynomial is: 2 + 3 t^1 + 2 t^2
encoded message is: [[0, 2], [1, 0], [2, 2], [3, 1], [4, 4]]
corrupted message is: [[0, 2], [1, 0], [2, 3], [3, 1], [4, 4]]
Quindi l'errore è nel terzo punto.
Quando l'equazione polinomiale in questione
E collegando ottiene il sistema in forma di matrice:
[2, 0, 0, 6, 0, 0, 0, 0, 0]
[0, 0, 0, 6, 6, 6, 6, 6, 0]
[3, 6, 5, 6, 5, 3, 6, 5, 0]
[1, 3, 2, 6, 4, 5, 1, 3, 0]
[4, 2, 1, 6, 3, 5, 6, 3, 0]
[0, 0, 1, 0, 0, 0, 0, 0, 1]
L'ultima riga è il vincolo che . Ottenendo l'applicazione dell'eliminazione gaussiana
[1, 0, 0, 0, 0, 0, 1, 4, 0]
[0, 1, 0, 0, 0, 0, 3, 3, 1]
[0, 0, 1, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 1, 0, 0, 2, 1, 0]
[0, 0, 0, 0, 1, 0, 2, 2, 5]
[0, 0, 0, 0, 0, 1, 4, 5, 2]
E selezionando 1 per entrambe le variabili libere otteniamo un vettore di soluzione
[2, 2, 1, 4, 1, 0, 1, 1]
Che si traduce in
E is 2 + 2 t^1 + 1 t^2
Q is 4 + 1 t^1 + 0 t^2 + 1 t^3 + 1 t^4
E non divide Q . Si noti che Q fattori come
Per ottengo una buona soluzione:
system is:
[2, 0, 6, 0, 0, 0, 0]
[0, 0, 6, 6, 6, 6, 0]
[3, 6, 6, 5, 3, 6, 0]
[1, 3, 6, 4, 5, 1, 0]
[4, 2, 6, 3, 5, 6, 0]
[0, 1, 0, 0, 0, 0, 1]
reduced system is:
[1, 0, 0, 0, 0, 0, 5]
[0, 1, 0, 0, 0, 0, 1]
[0, 0, 1, 0, 0, 0, 3]
[0, 0, 0, 1, 0, 0, 3]
[0, 0, 0, 0, 1, 0, 6]
[0, 0, 0, 0, 0, 1, 2]
solution is [5, 1, 3, 3, 6, 2]
Q is 3 + 3 t^1 + 6 t^2 + 2 t^3
E is 5 + 1 t^1
P(x) = 2 + 3 t^1 + 2 t^2 # this is correct!
r(x) = 0
Si noti che mentre il controesempio sopra è stato generato dal codice che ho scritto da zero (era sostanzialmente la prima cosa che ho provato), si può verificare che le soluzioni siano valide a mano, quindi anche se il mio codice è difettoso è ancora un controesempio valido per il reclamo che usando funziona.