Saltar al contenido
El bit perdido
Newsletter

Lección 10 de 11

Decodificar Reed-Solomon: recuperar borrones por interpolación

Recupera un mensaje de Reed-Solomon con borrones por interpolación de Lagrange o resolviendo un sistema, y entiende por qué un borrón cuesta la mitad que un error.

Borrador: pendiente de que lo revise el autor. Esta página no aparece en Google.

Al terminar sabrás:

  • Recuperar el polinomio con borrones usando la interpolación de Lagrange
  • Plantear la interpolación como un sistema lineal y resolverlo
  • Saber cuántos borrones se pueden recuperar y por qué no más
  • Entender por qué un borrón cuesta la mitad que un error

Si sabes multiplicar matrices, resolver un sistema de ecuaciones lineales y operar con polinomios (sumar, multiplicar, dividir), puedes seguirlo. Lo demás (aritmética módulo 2, subespacios, cuerpos finitos) se explica sobre la marcha.

En la lección anterior construimos el código [7,3,5][7,3,5] sobre F8\mathbb{F}_8: un mensaje de 3 símbolos es un polinomio de grado menor que 3 y se envía como sus valores en 7 puntos. Ahora toca recuperarlo cuando el canal estropea parte de la palabra. Empezamos por el caso fácil, los borrones: cuando en un RAID 6 se estropea un disco, el sistema sabe cuál es, y solo tiene que reconstruir lo que había. En la próxima lección veremos los errores, en los que ni siquiera sabes dónde está el daño.

La idea

Un polinomio de grado menor que kk queda fijado por kk puntos cualesquiera de su gráfica. Si sabemos qué posiciones se han perdido, nos quedamos con kk de las que sobreviven y buscamos la única curva que pasa por ellas. Eso se llama interpolación.

Hay dos formas de hacerlo. Una es una fórmula que construye la curva pieza a pieza (Lagrange). La otra es plantear un sistema lineal cuyas incógnitas son los coeficientes del polinomio, y resolverlo como siempre. Las dos dan lo mismo.

Interpolación de Lagrange

Supongamos que conocemos los valores y1,…,yky_1,\dots,y_k del polinomio ff en kk puntos distintos x1,…,xkx_1,\dots,x_k. La fórmula de Lagrange da ff directamente:

f(x)=∑i=1kyi Li(x),Li(x)=∏j≠ix−xjxi−xj.f(x) = \sum_{i=1}^{k} y_i\, L_i(x), \qquad L_i(x) = \prod_{j\neq i} \frac{x - x_j}{x_i - x_j}.

El símbolo ∑\sum es una suma y ∏\prod un producto: LiL_i multiplica las fracciones x−xjxi−xj\frac{x-x_j}{x_i-x_j} para todos los jj distintos de ii. Así, LiL_i vale 1 en xix_i y 0 en los demás xjx_j, y la suma pasa por todos los puntos. La fórmula funciona en cualquier cuerpo, también en F8\mathbb{F}_8.

Como sistema lineal. Escribe f(x)=m0+m1x+⋯+mk−1xk−1f(x) = m_0 + m_1x + \dots + m_{k-1}x^{k-1}. Cada punto conocido da una ecuación f(xi)=yif(x_i) = y_i, lineal en los coeficientes. Son kk ecuaciones con kk incógnitas, y la matriz tiene filas (1,xi,xi2,…,xik−1)(1, x_i, x_i^2, \dots, x_i^{k-1}) (en el ejemplo, k=3k=3: (1,xi,xi2)(1,x_i,x_i^2)). Es una matriz de Vandermonde, invertible porque los xix_i son distintos, así que la solución es única.

Con d=n−k+1d = n-k+1 se recuperan hasta n−kn-k borrones, porque sobreviven al menos kk posiciones. Con más no se puede: con menos de kk puntos pasan varios polinomios.

Ejemplo resuelto: 4 borrones

Seguimos con el ejemplo hilo, en F8\mathbb{F}_8 con α3=α+1\alpha^3=\alpha+1 y α7=1\alpha^7=1. Enviamos la palabra

c=(α, 1, α2, α, α2, α5, α5),c = (\alpha,\ 1,\ \alpha^2,\ \alpha,\ \alpha^2,\ \alpha^5,\ \alpha^5),

que viene del mensaje (1,α,1)(1,\alpha,1), o sea f(x)=1+αx+x2f(x)=1+\alpha x+x^2. La posición ii corresponde al punto αi−1\alpha^{i-1}.

El canal borra las posiciones 1, 2, 4 y 6 (son 4 borrones, el máximo que corrige el código). Recibimos:

r=(?, ?, α2, ?, α2, ?, α5).r = (?,\ ?,\ \alpha^2,\ ?,\ \alpha^2,\ ?,\ \alpha^5).

Quedan tres puntos de la gráfica de ff: (α2,α2)(\alpha^2,\alpha^2), (α4,α2)(\alpha^4,\alpha^2) y (α6,α5)(\alpha^6,\alpha^5). Como k=3k=3, bastan. Recuerda que en F8\mathbb{F}_8 restar es sumar.

L1L_1 (punto α2\alpha^2). El numerador es (x−α4)(x−α6)=x2+(α4+α6)x+α10=x2+α3x+α3(x-\alpha^4)(x-\alpha^6) = x^2 + (\alpha^4+\alpha^6)x + \alpha^{10} = x^2 + \alpha^3 x + \alpha^3, porque α4+α6=(α2+α)+(α2+1)=α3\alpha^4+\alpha^6 = (\alpha^2+\alpha)+(\alpha^2+1) = \alpha^3. El denominador es (α2+α4)(α2+α6)=α⋅1=α(\alpha^2+\alpha^4)(\alpha^2+\alpha^6) = \alpha \cdot 1 = \alpha. Dividir entre α\alpha es multiplicar por α−1=α6\alpha^{-1} = \alpha^6:

L1(x)=α6x2+α2x+α2.L_1(x) = \alpha^6 x^2 + \alpha^2 x + \alpha^2.

L2L_2 (punto α4\alpha^4). El numerador es (x−α2)(x−α6)=x2+(α2+α6)x+α8=x2+x+α(x-\alpha^2)(x-\alpha^6) = x^2 + (\alpha^2+\alpha^6)x + \alpha^8 = x^2 + x + \alpha, porque α2+α6=α2+(α2+1)=1\alpha^2+\alpha^6 = \alpha^2+(\alpha^2+1) = 1. El denominador es (α4+α2)(α4+α6)=α⋅α3=α4(\alpha^4+\alpha^2)(\alpha^4+\alpha^6) = \alpha\cdot\alpha^3 = \alpha^4, y su inverso es α3\alpha^3:

L2(x)=α3x2+α3x+α4.L_2(x) = \alpha^3 x^2 + \alpha^3 x + \alpha^4.

L3L_3 (punto α6\alpha^6). El numerador es (x−α2)(x−α4)=x2+(α2+α4)x+α6=x2+αx+α6(x-\alpha^2)(x-\alpha^4) = x^2 + (\alpha^2+\alpha^4)x + \alpha^6 = x^2 + \alpha x + \alpha^6. El denominador es (α6+α2)(α6+α4)=1⋅α3=α3(\alpha^6+\alpha^2)(\alpha^6+\alpha^4) = 1\cdot\alpha^3 = \alpha^3, y su inverso es α4\alpha^4:

L3(x)=α4x2+α5x+α3.L_3(x) = \alpha^4 x^2 + \alpha^5 x + \alpha^3.

La suma. f=α2L1+α2L2+α5L3f = \alpha^2 L_1 + \alpha^2 L_2 + \alpha^5 L_3. Coeficiente a coeficiente:

  • Término en x2x^2: α2α6+α2α3+α5α4=α+α5+α2=1\alpha^2\alpha^6 + \alpha^2\alpha^3 + \alpha^5\alpha^4 = \alpha + \alpha^5 + \alpha^2 = 1.
  • Término en xx: α2α2+α2α3+α5α5=α4+α5+α3=α\alpha^2\alpha^2 + \alpha^2\alpha^3 + \alpha^5\alpha^5 = \alpha^4 + \alpha^5 + \alpha^3 = \alpha.
  • Término independiente: α2α2+α2α4+α5α3=α4+α6+α=1\alpha^2\alpha^2 + \alpha^2\alpha^4 + \alpha^5\alpha^3 = \alpha^4 + \alpha^6 + \alpha = 1.

(Cada suma se hace pasando a vectores de la tabla: por ejemplo, α+α5+α2=(0,1,0)+(1,1,1)+(0,0,1)=(1,0,0)=1\alpha+\alpha^5+\alpha^2 = (0,1,0)+(1,1,1)+(0,0,1) = (1,0,0) = 1.)

Resultado: f(x)=1+αx+x2f(x) = 1 + \alpha x + x^2, el polinomio original, y el mensaje es (1,α,1)(1,\alpha,1). Para recuperar la palabra entera, evaluamos ff en los puntos borrados: f(1)=αf(1)=\alpha, f(α)=1f(\alpha)=1, f(α3)=αf(\alpha^3)=\alpha y f(α5)=α5f(\alpha^5)=\alpha^5, que son los símbolos de las posiciones 1, 2, 4 y 6.

Con otras tres posiciones cualesquiera habría salido el mismo ff: los siete valores de cc son puntos de ff, y por tres puntos pasa un solo polinomio de grado menor que 3.

Por qué un borrón vale la mitad que un error

Ante un borrón conoces la posición y solo te falta el valor: una incógnita. Ante un error te faltan las dos cosas, la posición y el valor. Cada incógnita cuesta un símbolo de redundancia, así que un borrón gasta uno y un error gasta dos. Con n−kn-k símbolos de redundancia se recuperan n−kn-k borrones, pero solo ⌊(n−k)/2⌋\lfloor (n-k)/2 \rfloor errores. Y en general, con ee errores y bb borrones, la regla es 2e+b≤n−k2e + b \le n-k.

Puedes verlo en Raya y corrige: raya la imagen hasta que el decodificador falle, y repite con la casilla «Sé dónde he dañado» activada. Con ella, los símbolos rayados pasan a ser borrones (el decodificador sabe dónde están) y aguanta aproximadamente el doble de rayas.

Ejercicios

Ejercicio 1

En F7\mathbb{F}_7 (los restos módulo 7) se usa un código de Reed-Solomon con los puntos 1,2,3,4,5,61, 2, 3, 4, 5, 6 y k=2k = 2: el mensaje es una recta f(x)=m0+m1xf(x) = m_0 + m_1x. Se recibe r=(?, 0, ?, ?, 6, ?)r = (?,\ 0,\ ?,\ ?,\ 6,\ ?). Recupera el mensaje y la palabra enviada.

Ver la solución

Sobreviven las posiciones 2 y 5: f(2)=0f(2) = 0 y f(5)=6f(5) = 6. Es decir,

m0+2m1=0,m0+5m1=6.m_0 + 2m_1 = 0, \qquad m_0 + 5m_1 = 6.

Restando, 3m1=63m_1 = 6, así que m1=2m_1 = 2. Entonces m0=−4=3m_0 = -4 = 3 (en F7\mathbb{F}_7, −4=3-4 = 3). El mensaje es (3,2)(3, 2), es decir, f(x)=3+2xf(x) = 3 + 2x.

Evaluando en los seis puntos: f(1)=5f(1) = 5, f(2)=0f(2) = 0, f(3)=2f(3) = 2, f(4)=4f(4) = 4, f(5)=6f(5) = 6, f(6)=15=1f(6) = 15 = 1. La palabra es (5,0,2,4,6,1)(5, 0, 2, 4, 6, 1). Es un código [6,2,5][6,2,5]: aguanta 6−2=46-2 = 4 borrones, justo los que había.

Ejercicio 2

En el código [7,3,5][7,3,5] del ejemplo se recibe r=(α5, ?, ?, α2, ?, α, ?)r = (\alpha^5,\ ?,\ ?,\ \alpha^2,\ ?,\ \alpha,\ ?). Recupera el mensaje resolviendo el sistema lineal (no con Lagrange).

Ver la solución

Sobreviven las posiciones 1, 4 y 6, es decir, los puntos 11, α3\alpha^3 y α5\alpha^5. Con f(x)=m0+m1x+m2x2f(x) = m_0 + m_1x + m_2x^2 y (α5)2=α10=α3(\alpha^5)^2 = \alpha^{10} = \alpha^3:

m0+m1+m2=α5,m0+α3m1+α6m2=α2,m0+α5m1+α3m2=α.\begin{aligned} m_0 + m_1 + m_2 &= \alpha^5,\\ m_0 + \alpha^3 m_1 + \alpha^6 m_2 &= \alpha^2,\\ m_0 + \alpha^5 m_1 + \alpha^3 m_2 &= \alpha. \end{aligned}

Sumamos la primera ecuación a las otras dos (en F8\mathbb{F}_8, sumar es restar), con α3+1=α\alpha^3+1 = \alpha, α6+1=α2\alpha^6+1 = \alpha^2 y α5+1=α4\alpha^5+1 = \alpha^4:

αm1+α2m2=α2+α5=α3,α4m1+αm2=α+α5=α6.\alpha m_1 + \alpha^2 m_2 = \alpha^2+\alpha^5 = \alpha^3, \qquad \alpha^4 m_1 + \alpha m_2 = \alpha+\alpha^5 = \alpha^6.

Multiplicamos la primera por α3\alpha^3: α4m1+α5m2=α6\alpha^4 m_1 + \alpha^5 m_2 = \alpha^6. Sumada a la segunda queda (α+α5) m2=0(\alpha+\alpha^5)\,m_2 = 0, es decir, α6m2=0\alpha^6 m_2 = 0, y m2=0m_2 = 0. Entonces αm1=α3\alpha m_1 = \alpha^3, así que m1=α2m_1 = \alpha^2. Y m0=α5+α2=α+1=α3m_0 = \alpha^5 + \alpha^2 = \alpha + 1 = \alpha^3.

El mensaje es (α3,α2,0)(\alpha^3, \alpha^2, 0): el del ejercicio 1 de la lección 9, cuya palabra es (α5,0,α6,α2,α4,α,1)(\alpha^5, 0, \alpha^6, \alpha^2, \alpha^4, \alpha, 1).

Ejercicio 3

Del código [7,3,5][7,3,5] solo llegan las posiciones 6 y 7 de la palabra cc del ejemplo, α5\alpha^5 y α5\alpha^5, y se sabe cuáles son: hay 5 borrones. Encuentra un polinomio de grado menor que 3, distinto de f(x)=1+αx+x2f(x) = 1 + \alpha x + x^2, que también encaje. ¿Cuántos encajan en total?

Ver la solución

El polinomio constante α5\alpha^5 vale α5\alpha^5 en todos los puntos, también en α5\alpha^5 y α6\alpha^6. Así que los mensajes (α5,0,0)(\alpha^5, 0, 0) y (1,α,1)(1, \alpha, 1) son compatibles con lo recibido, y no hay forma de saber cuál se envió.

En total encajan 8: si además se fija el valor en un tercer punto, hay un único polinomio por los tres, y ese valor se puede elegir de 8 maneras (los 8 elementos de F8\mathbb{F}_8). Por eso 5 borrones son demasiados: 5>n−k=45 > n-k = 4.

En resumen

  • Con borrones, kk símbolos que sobrevivan bastan: se interpola y se recupera el polinomio, y con él el mensaje.
  • La interpolación se hace con la fórmula de Lagrange o resolviendo un sistema lineal con matriz de Vandermonde.
  • Se recuperan hasta n−kn-k borrones; con uno más, pasan varios polinomios por lo que queda.
  • Un borrón cuesta un símbolo de redundancia y un error, dos: 2e+b≤n−k2e+b \le n-k.

Siguiente lección: Corregir errores en Reed-Solomon

Pruébalo: Raya y corrige

Para profundizar