In dem Welch-Berlekamp-Algorithmus zum Decodieren von Reed-Solomon-Codes erhält man eine Liste von Punkten die eine Nachricht mit Fehlern auf dem an unbekannten Stellen darstellen (und wird dem Algorithmus gegeben). Die Ausgabe ist ein Polynom, das alle angegebenen Punkte mit Ausnahme derjenigen durchläuft, bei denen Fehler aufgetreten sind.e b i e
Das Verfahren beinhaltet das Lösen eines Systems linearer Gleichungen der Form
für alle denen den Grad und höchstens den Grad . Die Variablen sind die Koeffizienten von und .E e Q e + k E Q.
Um sicherzustellen, dass den Grad fügt man dem obigen linearen System normalerweise die Bedingung hinzu, dass der Koeffizient von 1 ist. In der Praxis kennt man jedoch nicht unbedingt . Eine ineffiziente (aber immer noch polynomielle) Methode, um damit umzugehen, besteht darin, für alle Werte zu versuchen , beginnend mit , bis eine Lösung gefunden wird.e x e E e ( n + k - 1 ) / 2 - 1
Meine Frage ist: Gibt es eine effizientere Möglichkeit, zu bestimmen ? Gibt es alternativ eine Modifikation des linearen Systems, die es ermöglicht, anstelle des exakten Werts eine Obergrenze für verwenden?
Insbesondere möchte ich diesen speziellen Decoder für Reed-Solomon-Codes verwenden und keinen völlig anderen Algorithmus, der auf anderen Techniken basiert.
Als Antwort auf die Antwort von DW ist hier mein Arbeitsbeispiel. Alles ist modulo 7 erledigt.
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]]
Der Fehler liegt also im dritten Punkt.
Wenn die fragliche Polynomgleichung
Wenn Sie das System in Matrixform:
[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]
Die letzte Zeile ist die Einschränkung, dass . Wenn wir die Gaußsche Eliminierung anwenden, erhalten wir
[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]
Und wenn wir 1 für beide freien Variablen auswählen, erhalten wir einen Lösungsvektor von
[2, 2, 1, 4, 1, 0, 1, 1]
Was übersetzt bedeutet
E is 2 + 2 t^1 + 1 t^2
Q is 4 + 1 t^1 + 0 t^2 + 1 t^3 + 1 t^4
Und teilt . Man beachte, dass Faktoren wieQ Q ( t + 6 ) ( t 3 + 2 t 2 + 2 t + 3 )
Für bekomme ich eine gute Lösung:
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
Beachten Sie, dass das obige Gegenbeispiel zwar von Code generiert wurde, den ich von Grund auf neu geschrieben habe (es war im Grunde das erste, was ich versucht habe), man jedoch überprüfen kann, ob die Lösungen von Hand gültig sind. Selbst wenn mein Code fehlerhaft ist, ist er dennoch ein gültiges Gegenbeispiel für den Anspruch dass mit funktioniert.