Chapter 8 Códigos correctores de errores. Francesc Comellas - José Luis A. Yebra En este capı́tulo veremos una aplicación de Algebra Lineal de gran interés práctico y que sólo requiere conocimientos elementales de espacios vectoriales y aritmética módulo dos. Se trata de la codificación de datos para detectar y corregir errores. Entre los numerosos ejemplos de aplicación de la codificación citaremos la transmisión de datos entre satélites y estaciones terrestes, las comunicaciones intercontinentales y la grabación de datos en discos, ya sean estos de ordenador o musicales. Espacios Vectoriales. 8.1 Matrices. Operaciones módulo 2. Introducción El 17 de octubre de 1992 y en su seccción habitual del periódico AVUI, Ramon Solsona comentaba el programa SETI que la NASA habı́a puesto en marcha entonces para captar posibles emisiones procedentes de seres inteligentes de otros planetas de nuestra galaxia. Con su conocida ironı́a, desgrana la hipótesis de que estos seres se nos han avanzado y escribe: ‘Una cosa similar sucede en la estrella 102-GT, a la que, por algún fenómeno desconocido de la estratosfera, llega con gran nı́tidez el clamor de los estadios de fútbol. Los cientı́ficos de 102-GT apenas han podido entender algo; únicamente tres palabras: gaaal (o gueeeul o goool o guuul), aiii, fedalti (o fenalti o pedalti) y unos silbidos que ellos desprecian porque los atribuyen a interferencias. Figura 1: El satélite Voyager 2. Contrastemos este eventual hecho con las últimas imágenes transmitidas por Voyager 2 de una calidad extraordinaria. Las imágenes son de Neptuno y una de sus lunas, Tritón. Tienen 800 por 800 pı́xeles con 256 niveles de gris. Se pueden representar con 5.120.000 bits, se transmiten a 21.6 kilobits por segundo y una imagen tarda unos 100 segundos en ser emitida. Aunque cada uno de los impulsos transmitidos ha tardado unas 42 horas en viajar de Neptuno hasta la Terra, y pese a que durante todo este tiempo las señales han estado sometidas al viento Figure 8.1: Tritón, una luna de Neptuno, se encuentra a unos 4.5 1010 km de la Sagrada Familia solar y a diversas interferencias, no se ha perdido la información de ninguno de los pı́xeles. ¿Por qué los cientı́ficos de 102-GT interpretan tan mal los gritos que con perfecta nitidez se hacen al Camp Nou y en cambio nosotros, a pesar de la debilidad de las señales, recibimos con absoluta precisión una imagen muy complicada? Aparte de consideraciones sobre el carácter imaginario de una de las transmisiones, o sobre la diferente tecnologı́a empleada en ambas para emitir y recibir las señales, una diferencia esencial entre ellas es que, mientras que la primera no esta codificada para la corrección de errores, la sgunda sı́ lo está. 8.2 Códigos correctores de errores El objetivo de la codificación és la protección de la información, a fin de detectar y corregir los errores que hayan podido surgir durante su transmisión. El esquema de la Figura 2 ilustra la situación deseada en la transmisión de un mensaje con codificación. Missatge Missatge es e erf Int Inte rfer Codificació ènc ci rèn s rèncie e Interf ies Decodificació Missatge Codificat Missatge Codificat Distorsionat Figure 8.2: Codificació utòpica. Sin las etapas de codificación y decodificación el mensaje recibido serı́a una distorsión del mensaje transmitido, y por lo tanto normalmente inútil. La codificación y posterior decodificación permite recuperar exactamente el mensaje original si la distorsión es limitada. El precio que se paga es una cierta redundancia (el mensaje a transmitir será algo más largo) y un pequeño retraso debido al tiempo requerido por la codificación y la decodificación. En realidad, y sin darnos cuenta, efectuamos los procesos de codificar y decodificar más frecuentemente de lo que creemos. Por ejemplo, cuando hablamos con otras personas muchas veces repetimos partes de frases para que la conversación sea más inteligible. O bien, durante una conversación telefónica, es habitual repetir letra a letra una palabra que no se ha entendido, al estilo de: ‘P de Portugal, R de Rússia, E d’Europa, S de Suècia y O de Orense’. 32 Formulación matemática Para el estudio matemático de la codificación, consideraremos un alfabeto que tendrá únicamente dos sı́mbolos, por ejemplo el 0 y el 1, a los que llamaremos dı́gitos. A diferencia de lo que ocurre con nuestro lenguaje habitual, ahora todas las palabras que formemos con este alfabeto tendrán el mismo número de dı́gitos, n, que se denomina longitud de la palabra. Designaremos por V n al conjunto de todas las palabras diferentes de longitud n, es decir con n dı́gitos. Ası́, por ejemplo, V 3 és: V 3 = {000, 001, 010, 011, 100, 101, 110, 111} La primera idea básica para codificar consiste en utilizar como palabras válidas de nuestro mensaje, no todas las de V 3 sino únicamente las de un subconjunto C ⊂ V 3 . Una cosa similar pasa en nuestro lenguaje, pues no todas las combinaciones posibles de letras del alfabeto son palabras admitidas, como por ejemplo coxrt o zruttllm. Es precisamente este hecho el que nos permitirá detectar y corregir errores, de forma análoga a cuando en un texto vemos escrito carretpra, con lo que immediatamente somos capaces de ver que se trata de un error tipográfico y que lo que en realidad se querı́a escribir era carretera 1 . Por ejemplo, si únicamente queremos enviar las ordenes arriba, abajo, izquierda y derecha en la tabla siguiente se muestran tres posibilidades diferentes. El Código C1 = V 2 C2 = V 3 C3 = V 6 C4 = V 6 Arriba 00 000 000000 000000 Abajo 01 011 111000 001111 Izquierda 10 101 001110 110011 Derecha 11 110 110011 111100 Table 8.1: Códigos código C1 es el más corto, pero como utiliza todas las palabras de V 2 no permite corregir ningún error. Por ejemplo, si se transmite arriba (00) y se produce un error en el primer dı́gito, el mensaje recibido, 10, se interpretará como izquierda. El código C2 , sin embargo, permite detectar qualquier error que afecte a un único dı́gito. Observemos primeramente que C2 se obtiene a partir de C1 añadiendo a cada palabra un dı́gito más que se denomina dı́gito de paridad: 0 si en C1 habı́a un número par de unos y 1 si el número de unos era impar. Por ello ahora todas las palabras del código C2 tienen un número par de unos. De esta forma, si cuando se transmite una palabra se produce un error en un único dı́gito, la palabra resultante tendrá un número impar de unos y por lo tanto no pertenecerá al código C2 . Ası́ habremos detectado el error. Este código no nos permite su corrección. En la práctica, la detección (sin corrección) de errores sólo tiene sentido si el receptor puede pedir al emisor que vuelva a enviar el mensaje. Finalmente, el código C4 , el triple de largo que el C1, permite no sólo detectar errores sino incluso corregirlos (siempre y cuando sólo haya habido uno por palabra). Ello es posible gracias a que hay mucha más redundancia o, más precisamente, a que las palabras del código se diferencian entre si de tal manera que un único error se puede arreglar. A continuación entraremos en mayor detalle gracias a una formulación matemática conveniente de las ideas expresadas anteriormente. Llamaremos distancia entre dos palabras al número de dı́gitos en que difieren y distancia mı́nima de un código a la menor distancia entre sus palabras. Per ejemplo, en el código C2 la distancia entre qualquier par de palabras es 2, por tanto ésta es la distancia mı́nima del código, mientras que en el código C3 hay palabras a distancia 3, 4 y 5, por lo que la distancia mı́nima en este código es 3. 1 Es mucho menos probable que los errores sean dos y que se quisiera escribir carrera. Del contexto -redundancia adicional- podrı́amos deducirlo. 33 Ejercicio 8.1 Determinar que pares de palabras de C3 están a distancia 3, a distància 4 y a distància 5. Ejercicio 8.2 Determinar la distancia mı́nima del código C4 . Si sólo deseamos detectar errores, un código de distancia mı́nima d permite detectar hasta d − 1 errores, ya que en él al modificar menos de d dı́gitos de una palabra código la palabra que se obtiene no puede ser otra palabra código. Pero no debemos olvidar que nuestro objetivo es más ambicioso: corregir los errores. ¿Cómo? Veamos primero un ejemplo. Supongamos que estemos utilizando el código C4 y que a causa de las dichosas interferencies recibimos 001011. Basta comparar esta palabra con las del código para percatarse de que se ha producido algún error, ya que no coincide con ninguna de ellas. Se puede haber producido un error al transmitir la palabra 001111, o bien tres al transmitir la 000000 o la 110011, o incluso cinco si la palabra era 111100. Si admitimos que los errores no son muy frecuentes, lo más verosı́mil es que se haya producido un único error en la transmisión de la palabra 001111. Este sera nuestro principio de decodificación: buscar el vecino más próximo. De esta forma, un código permite corregir hasta e errores si 2e + 1 ≤ d, la distancia mı́nima del código (Figura 3). V n Paraules del codi d n Altres paraules de V d e e Figure 8.3: Un código C puede corregir e errores si su distancia mı́nima d es tal que d ≥ 2e + 1. Ejercicio 8.3 ¿Se pueden detectar y/o corregir una modificación en 1,2 y 3 dı́gitos de una palabra código de C4 ?. 8.2.1 Códigos lineales El conjunto V n puede ser visto como (Z2 )n . Si consideramos en él las operacions suma dı́gito a dı́gito módulo 2 (101100 + 001010 = 100110) y producto por un escalar (los escalares a considerar son los de Z2 es decir el 0 y el 1), entonces el conjunto V n es un espacio vectorial sobre el cuerpo Z2 . Ejercicio 8.4 Dados v = (1, 1, 0, 0, 1, 0)T y w = (0, 1, 1, 0, 1, 1)T de (Z2 )6 , determinar (a) v + w (b) −v (c) λv para todo λ ∈ Z2 . En este contexto, un código lineal es simplemente un subespacio vectorial de (Z2 )n . Ası́, C1 , C2 y C4 son códigos lineales, mientras que C3 no lo es. 34 Ejercicio 8.5 ¿Por qué C3 no es un código lineal ? El espacio (Z2 )n tiene 2n elementos y sus subespacios tienen 2k elementos, 0 ≤ k ≤ n. Mientras que la dimensión de (Z2 )n , es decir n, es la longitud del código, k recibe el nombre de dimensión del código, ya que es su dimensión como subespacio vectorial de (Z2)n . Por ejemplo, C2 que tiene 4 = 22 elementos y por tanto dimensión 2, admite como base 011 y 101 -estamos utilizando la abreviación 011 para (0, 1, 1)T -: 0(011) + 0(101) = 000 1(011) + 0(101) = 011 0(011) + 1(101) = 101 1(011) + 1(101) = 110 Trabajar con códigos lineales presenta numerosas ventajas. Una de ellas es que resulta mucho más fácil calcular su distancia mı́nima. Mientras que en general habrı́a que calcular la distancia entre todos los pares de palabras del código, para un código lineal es fácil comprobar que su distancia mı́nima es igual al número de unos de la palabra que tiene menos (sin considerar la que sólo tiene ceros). Ejercicio 8.6 Construye un código lineal de cuatro palabras de longitud 8 que pueda corregir dos errores. 8.2.2 Matriz generadora y matriz de comprobación de paridad de un código Recordemos que en un espacio vectorial de dimensión n, es habitual especificar un subespacio vectorial de dimensión k de una de las dos maneras siguientes: 1. Por medio de una base del subespacio, es decir como el conjunto de vectores que son combinación lineal de k vectores linealmente independentes del subespacio. 2. Como el nucleo de una aplicación lineal de rango n − k definida en ese espacio vectorial, es decir como el conjunto de vectores que satisfacen (n − k) equaciones lineales homogéneas e independentes. La primera se utilizará para la codificación de mensajes y la segunda para la decodificación. Codificación En el primer caso, si C está generado por g1, g2 , . . . , gk y G es la matriz k × n cuyas filas son (las coordenadas de) g1, g2 , . . . , gk , los vectores c de C se obtendrán calculando cT = (c1 , c2 , . . . , cn ) = (m1 , m2, . . . , mk )G = mT G Esta equación recibe el nombre de regla de codificación ya que permite obtener cada palabra código c a partir del mensaje m = (m1 , m2 , . . . , mk ), el cual está formado por los coeficientes de la combinación lineal c = m1 g1 + m2 g2 + . . . + mk gk . Por ejemplo, C2 podemos considerar g1 = (101) y g2 = (011), para los que se ¶ µ para el código 1 0 1 y: obtiene G = 0 1 1 µ 1 µ 0 1 (10) 0 (00) 0 1 0 1 ¶ 1 = (000) 1 ¶ 1 = (101) 1 µ 1 µ 0 1 (11) 0 (01) 0 1 0 1 ¶ 1 = (011) 1 ¶ 1 = (110) 1 35 Ahı́ se puede ver la regla de codificación: (mensaje)G = (palabra código) Por otra parte se puede observar que mientras que el mensaje a transmitir tiene k dı́gitos, la palabra código tiene n. Los n − k dı́gitos que se han añadido a los k originales constituyen la redundancia que permitirá corregir errores y se denominan genéricamente dı́gitos de paridad. Decodificación Decodificar un mensaje significa comprobarlo para determinar si ha habido errores, corregirlos en caso de haberse producido y finalmente extraer el mensaje original. Discutiremos en primer lugar la comprobación del mensaje sobre el ejemplo anterior. Sea H = (1 1 1) una matriz 1 × 3. Esta matriz tiene rango 1 y como rang(H) + dim Ker(H) = 3 resulta que dim Ker(H) = 2. Es fácil comprobar que g1 = (101) y g2 = (011) generan precisamente el nucleo de H . Basta observar que Hv es igual al número de unos que tiene el vector v módulo 2. Por ello la matriz H es conocida como matriz de comprobación de paridad. Para los vectores del código Hv vale 0. Ası́ C2 = {v ∈ (Z2 )3 | Hv = 0}. En general, H será una matriz (n − k) × n de rango (n − k) para la que se tendrá: ½ = 0 ⇔ v ∈ C es decir v es una palabra código Hv = 6= 0 ⇔ v 6∈ C es decir v no es una palabra código Por este motivo la matriz H se utilizará para decodificar los mensajes. Observese que que ahora los vectores de C aparecen como aquellos que satisfacen (n − k) ecuaciones lineales homogéneas independientes. Ejercicio 8.7 Hallar HGT . 8.2.3 Una codificación más realista Hasta ahora únicamente hemos podido codificar cuatro instrucciones. Con cuatro instrucciones ya se pueden hacer algunas cosas, pero para gobernar remotamente una nave espacial conviene añadir unas cuantas más. Ası́ que utilizaremosr los diez números del 0 al 9 y las seis instrucciones de dirección arriba, abajo, adelante, atrás, izquierda y derecha. Asignemos a cada una de estas instrucciones un número correlativo del10 al 15. A partir de los 16 números en base 2 ası́ obtenidos se generan las dieciseis palabras del código mediante la matriz generadora. G = 1 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 1 0 Ası́, por ejemplo, el código correspondiente a abajo es 0 0 0 1 1 1 1 abajo = 1110 → 10112 → (1011)G = (1011010) O bien, si quisiéramos que la nave se desplazase a la izquierda catorce unidades, deberı́amos enviar el mensaje: izquierda 1 4 = 1410 110 410 → 1110200012 01002 → 111000000011110100101 La Tabla 2, incompleta, muestra algunas de las palabras del código C(7, 4). Ejercicio 8.8 Ejercicio 8.9 Completar la tabla anterior. Codificar el siguiente mensaje: adelante 7 izquierda 13 arriba 17 36 Instrucción 0 1 2 3 4 5 6 7 8 9 arriba abajo adelante atrás izquierda derecha Valor 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Binari 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 código 0000000 0001111 0010110 0011001 0100101 0101010 0110011 1011010 1110000 1111111 Table 8.2: Palabras del código C(7, 4). Es fácil comprobar que este código tiene distancia mı́nima d = 3, por lo que permite corregir únicamente un error en cada palabra. La matriz decodificadora se puede obtenir a partir de los cuatro vectores fila de G . Se ha de verificar: Hg1 = 0 Hg2 = 0 Hg3 = 0 Hg4 = 0 0 0 Ası́ una posible matriz H (de las muchas que satisfacen estas condiciones) es 0 1 1 0 Veamos como podemos utilizarla para decodificar cada palabra recibida w corrigiendo error. 0 1 1 1 1 0 0 1 1 0 1 0 el eventual 1. Calculemos Hw. 2. Si Hw = 0 sabemos que la palabra recibida w es una palabra del código. No ha habido ningún error, por lo que bastará leer la tabla para conocer la instrucción transmitida. 3. Si Hw 6= 0, la palabra recibida w no és una palabra del código. Se ha producido algún error que ha alterado la palabra código transmitida v : ↓ε v −→ v + ε = w donde, con la hipótesis de que únicamente se ha producido un error, ε es un vector de la forma ε = (00 . . . 010 . . . 0) es decir todas sus componentes son nulas salvo una, la de lugar i, que vale 1. De esta forma v y w sólo se diferencian en el dı́gito que ocupa el lugar i, pero precisamente: Hw = H(v + ε) = Hv + Hε = Hε = h(i) (= columna i de H ) ya que v es una palabra del código. Ası́, cuando Hw 6= 0 basta buscar la columna de H que coincide con el resultado Hw para determinar el lugar i del error. Es más, con la matriz H elegida podemos observar que cada columna expresa, en base 2, el lugar que ocupa. Ası́, Hw da directamente la posición donde se ha producido el error y por tanto que dı́gito de w hay corregir. Ejemplo: 37 1 1 1 1 Si la palabra recibida es w = 1010111, se obtiene Hw = 1 y como 1102 = 610 , el error se 0 ha producido en el dı́gito sexto. En consequencia, la palabra código transmitida era v = 1010101, es decir la instrucción arriba. Ejercicio 8.10 Decodificar el siguiente mensaje: 11011111000011101011101011101100101 Ejercicio 8.11 Si en la transmisión del mensaje codificado del ejercicio 8 (que tiene 56 dı́gitos) se produjesen errores en los dı́gitos que ocupan los lugares 7, 13 y 17, ¿podrı́amos corregirlos?. ¿Por qué ? Ejercicio 8.12 ¿Y si los errores fuesen en los dı́gitos 8 y 14 ? Uso de MAPLE Para realizar los ejercicios propuestos utilizando MAPLE se ha adaptado una parte de la libreria linalg para su uso con aritmética módulo 2. También se han definido las matrices G y H del código C7,4 que se designan por G7 y H7. En el apéndice se encuentra el listado completo. Para acceder a él hay que hacer: > with(linalg):read ‘codes.m‘; Las nuevas operaciones son: add2, scalarmul2 y multiply2 cuya forma de operar es análoga a la de linalg pero módulo 2. distance(v1,v2) que calcula la distancia entre dos vectores v1 y v2. 38 Ejercicio avanzado En el marco del programa SETI, el radiotelescopio de Arecibo (Puerto Rico) de 305 m de diámetro, ha transmitido al espacio una imagen (Figura 4), codificada de una forma sencilla para que pueda ser interpretada por los seres inteligentes que eventualmente la capten. Un fragmento de esta imagen ha sido comprimido y después codificado con el código C(7, 4). Desgraciadamente, también se ha alterado alguno de los bits. El resultado es: 0111100011101011100100111100101010111110111100000 1111111001100101110101001100011101101000101001100 1011010000100101001010110011110110010101011000101 1010001101010111100101101110101101000101111100110 1001001100110010110100001001 Figura 4: ¿Qué quiere decir esto? El trozo escogido tiene 12 × 21 pı́xeles. Cada pı́xel puede tomar dos valores: negro (0) o blanco (1). La compresión del mensaje, previa a su codificación, se ha hecho ası́: Se ha considerado la imagen como si fuera una lista de 252 dı́gitos comenzando arriba a la izquierda y yendo siempre de arriba hacia abajo y de izquierda a derecha. Si el pı́xel tiene valor 1 se escribe 1, si tiene valor 0 se mira cuantos pı́xeles siguen de valor cero i se escribe 0 y cuatro bits que expresan, en binario, el número de ceros que hay en total (contando también el primero y hasta un máximo de 16). Por ejemplo, el mensaje 000000000011000000000000010 se comprimido a 010101101101100001, es decir 0 seguido de 10102 = 10, porque hay 10 ceros, después los dos 1, otro cero y 11012 = 13 (ya que después de los dos unos hay trece ceros), un 1 y finalmente 0 seguido de 00012 = 1 para indicar el último cero. Una vez comprimida, la imagen se codifica utilizando el código C(7, 4) y por tanto de cada cuatro bits se obtienen siete. Después alguno de los bits ha sido alterado. Observese que, gracias a la compresión, el mensaje final codificado solo tiene 224 bits (menos que el original, pese al incremento que supone la utilización del código corrector C(7, 4)). El ejercicio consiste en recuperar e identificar el trozo de imagen original. 39 Bibliography [GO91] Goldie, C.M. y Pinch, R.G.E. Communication Theory. Cambridge University Press, 1991; ISBN 0 521 40606 4. [GR91] Gribbin, J. Is anyone out there?. New Scientist, 25 de Maig de 1991, pp. 29-32. [HE89] Henbest, N. Neptune: Voyager’s last picture show. New Scientist, 9 de Setembre de 1989, pp. 45–48. [HE92a] Henbest, N. SETI: the search continues. New Scientist, 10 d’Octubre de 1992, pp. 12-13. [HE92b] Henbest, N. When will Earthlings see the light?. New Scientist, 12 de Desembre de 1992, p. 48. [LA86] Laeser, P.L.; McLaughlin, W.I. y Wolff, D.M. Engineering Voyager 2’s Encounter with Uranus. Scientific American, Novembre 1986, vol. 255, pp. 34–43. [SO92] Solsona, R. Ells també ens espien. AVUI, dissabte 17 d’Octubre de 1992, p. 52. 40
© Copyright 2024