No algoritmo Welch-Berlekamp para decodificar códigos de Reed-Solomon, é dada uma lista de pontos representando uma mensagem com e erros na b i em locais desconhecidos (e e é dado ao algoritmo). A saída é um polinômio passando por todos os pontos fornecidos, exceto aqueles em que ocorreram erros.
O método envolve resolver um sistema de equações lineares da forma
para todo onde E tem grau e e Q tem grau no máximo e + k . As variáveis são os coeficientes de E e Q .
Para garantir que tenha o grau e, geralmente se adiciona a restrição de que o coeficiente de x e seja 1 no sistema linear acima. No entanto, na prática, não se sabe necessariamente e . Uma maneira ineficiente (mas ainda polinomial de tempo) de lidar com isso é tentar e para todos os valores que começam com ( n + k - 1 ) / 2 - 1 diminuindo até encontrar uma solução.
Minha pergunta é: existe uma maneira mais eficiente de determinar ? Como alternativa, existe uma modificação no sistema linear que permite usar um limite superior em em vez do valor exato?
Em particular, quero usar esse decodificador específico para códigos de Reed-Solomon, e não um algoritmo completamente diferente com base em outras técnicas.
Em resposta à resposta da DW, aqui está o meu exemplo de trabalho. Tudo é feito no módulo 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]]
Portanto, o erro está no terceiro ponto.
Quando a equação polinomial em questão é
E a inserção de fornece o sistema em forma de matriz:
[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]
A última linha é a restrição de que . Aplicando a eliminação gaussiana, obtemos
[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 escolhendo 1 para ambas as variáveis livres, obtemos um vetor de solução de
[2, 2, 1, 4, 1, 0, 1, 1]
O que se traduz em
E is 2 + 2 t^1 + 1 t^2
Q is 4 + 1 t^1 + 0 t^2 + 1 t^3 + 1 t^4
Para , recebo uma boa solução:
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
Observe que, embora o contra-exemplo acima tenha sido gerado pelo código que escrevi do zero (foi basicamente a primeira coisa que tentei), pode-se verificar se as soluções são válidas manualmente, portanto, mesmo que meu código esteja com erros, ainda é um contra-exemplo válido para a reivindicação que usar funciona.