Comment déterminez-vous le nombre d'erreurs dans l'algorithme Welch-Berlekamp?

9

Dans l'algorithme Welch-Berlekamp de décodage des codes Reed-Solomon, on donne une liste de points(ai,bi) représentant un message avec e erreurs sur le bi dans des emplacements inconnus (et e est donné à l'algorithme). La sortie est un polynôme passant par tous les points donnés à l'exception de ceux dans lesquels des erreurs se sont produites.

La méthode consiste à résoudre un système d'équations linéaires de la forme

biE(ai)=Q(ai)

pour tout iE a le degré e et Q a le degré au plus e+k . Les variables sont les coefficients de E et Q .

Pour s'assurer que E a le degré e on ajoute généralement la contrainte que le coefficient de xe est 1 au système linéaire ci-dessus. Cependant, dans la pratique, on ne sait pas nécessairement e . Une façon inefficace (mais toujours polynomiale) de résoudre ce problème consiste à essayer e pour toutes les valeurs commençant par (n+k1)/21 descendant jusqu'à ce qu'une solution soit trouvée.

Ma question est: existe-t-il un moyen plus efficace de déterminer e ? Sinon, y a-t-il une modification du système linéaire qui permet d'utiliser une borne supérieure sur e au lieu de la valeur exacte?

En particulier, je veux utiliser ce décodeur spécifique pour les codes Reed-Solomon, et non un algorithme complètement différent basé sur d'autres techniques.


En réponse à la réponse de DW, voici mon exemple de travail. Tout est fait 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]]

L'erreur se situe donc au troisième point.

Lorsque e=2 l'équation polynomiale en question est

bi(e0+e1x+e2x2)q0q1xq2x2q3x3q4x4=0

Et brancher donne le système sous forme matricielle:x=0,1,2,3,4

[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]

La dernière ligne est la contrainte que . En appliquant l'élimination gaussienne, nous obtenonse2=1

[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]

Et en choisissant 1 pour les deux variables libres, nous obtenons un vecteur de solution de

[2, 2, 1, 4, 1, 0, 1, 1]

Ce qui se traduit par

E is 2 + 2 t^1 + 1 t^2
Q is 4 + 1 t^1 + 0 t^2 + 1 t^3 + 1 t^4

Et ne divise pas Q . Notez que Q facteurs commeEQQ(t+6)(t3+2t2+2t+3)mod7

Pour j'obtiens une bonne solution:e=1

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

Notez que bien que le contre-exemple ci-dessus ait été généré par du code que j'ai écrit à partir de zéro (c'était essentiellement la première chose que j'essayais), on peut vérifier que les solutions sont valides à la main, donc même si mon code est bogué, c'est toujours un contre-exemple valide pour la revendication que l'utilisation de fonctionne.e=2

JeremyKun
la source
@DW le vecteur solution est valide. Il s'agit en fait de 1 * 2 + 1 * 1 + 4 * 1 (la dimensionnalité du vecteur solution est une car la dernière colonne de la matrice est laissée de côté). Mon du est une faute de frappe dans l'écriture ici, mais elle est correcte dans mon implémentation. Vous pouvez voir son effet, par exemple, dans la deuxième ligne du système qui utilise le point [1, 0], et les trois premières entrées sont toutes nulles car elles sont multipliées par 0. Si mon exemple n'est pas clair, je peux poster mon code sur github. Je considère que mon code est propre, mais il serait plus compliqué en raison de sa généralité. bi
JeremyKun

Réponses:

3

e

E(x)aiE(x)e

eE(x)eeE(x)e

E(x)eE(x)E(x)ne


Pour documenter le résultat de la conversation sur le "contre-exemple" dans la question:

nk+1(nk)/2n=5k=3(nk)/2=1e=1e=2

Ainsi, le contre-exemple n'est pas réellement un contre-exemple, et il ne contredit pas ma réponse ci-dessus.

DW
la source
1
nk+1(nk)/2
E(x)E(x)
n=7e=2
D'accord, cela fonctionne sur les exemples sur lesquels j'essaye. Excellent!
JeremyKun