En teoría de la codificación , los códigos de Bose - Chaudhuri - Hocquenghem ( códigos BCH ) forman una clase de códigos correctores de errores cíclicos que se construyen utilizando polinomios sobre un cuerpo finito (también llamado cuerpo de Galois ). Los códigos BCH fueron inventados en 1959 por el matemático francés Alexis Hocquenghem , e independientemente en 1960 por Raj Chandra Bose y DK Ray-Chaudhuri . [ 1 ] [ 2 ] [ 3 ] El nombre Bose - Chaudhuri - Hocquenghem (y el acrónimo BCH ) surge de las iniciales de los apellidos de los inventores (erróneamente, en el caso de Ray-Chaudhuri).
Una de las características clave de los códigos BCH es que, durante su diseño, se controla con precisión el número de errores de símbolo que puede corregir el código. En particular, es posible diseñar códigos BCH binarios que corrijan múltiples errores de bit. Otra ventaja de los códigos BCH es la facilidad con la que se pueden decodificar, mediante un método algebraico conocido como decodificación por síndrome . Esto simplifica el diseño del decodificador para estos códigos, utilizando hardware electrónico pequeño y de bajo consumo .
Los códigos BCH se utilizan en aplicaciones como comunicaciones por satélite, [ 4 ] reproductores de discos compactos , DVD , unidades de disco , unidades flash USB , unidades de estado sólido , [ 5 ] y códigos de barras bidimensionales .
Definición e ilustración
Códigos BCH primitivos de sentido estricto
Dado un número primo q y una potencia prima q m con enteros positivos m y d tales que d ≤ q m − 1 , se construye un código BCH primitivo en sentido estricto sobre el campo finito (o campo de Galois) GF( q ) con longitud de código n = q m − 1 y distancia al menos d mediante el siguiente método.
Sea α un elemento primitivo de GF( q m ) . Para cualquier entero positivo i , sea m i ( x ) el polinomio mínimo con coeficientes en GF( q ) de α i . El polinomio generador del código BCH se define como el mínimo común múltiplo g ( x ) = mcm( m 1 ( x ),…, m d − 1 ( x )) . Se puede observar que g ( x ) es un polinomio con coeficientes en GF( q ) y divide a x n − 1 . Por lo tanto, el código polinómico definido por g ( x ) es un código cíclico.
Ejemplo
Sea q = 2 y m = 4 (por lo tanto n = 15 ). Consideraremos diferentes valores de d para GF(16) = GF(2 4 ) basados en el polinomio reductor z 4 + z + 1 , usando el elemento primitivo α ( z ) = z . Hay catorce polinomios mínimos m i ( x ) con coeficientes en GF(2) que satisfacen
Los polinomios mínimos son
El código BCH contiene el polinomio generador
Tiene una distancia de Hamming mínima de al menos 3 y corrige hasta un error. Dado que el polinomio generador es de grado 4, este código tiene 11 bits de datos y 4 bits de suma de verificación. También se denota como: código BCH (15, 11) .
El código BCH contiene el polinomio generador
Tiene una distancia de Hamming mínima de al menos 5 y corrige hasta dos errores. Dado que el polinomio generador es de grado 8, este código tiene 7 bits de datos y 8 bits de suma de verificación. También se denota como: código BCH (15, 7) .
El código BCH contiene el polinomio generador
Tiene una distancia de Hamming mínima de al menos 7 y corrige hasta tres errores. Dado que el polinomio generador es de grado 10, este código tiene 5 bits de datos y 10 bits de suma de verificación. También se denota como: código BCH (15, 5) . (Este polinomio generador en particular tiene una aplicación práctica en la información de formato del código QR ).
El código BCH cony superior tiene el polinomio generador
Este código tiene una distancia de Hamming mínima de 15 y corrige 7 errores. Tiene 1 bit de datos y 14 bits de suma de verificación. También se denota como: código BCH (15, 1) . De hecho, este código tiene solo dos palabras clave: 000000000000000 y 111111111111111 (un código de repetición trivial ).
Códigos BCH generales
Los códigos BCH generales difieren de los códigos BCH primitivos de sentido estricto en dos aspectos.
Primero, el requisito de queser un elemento primitivo depuede relajarse. Al relajar este requisito, la longitud del código cambia deael orden del elemento
En segundo lugar, las raíces consecutivas del polinomio generador pueden ir desdeen lugar de
Definición. Fijar un campo finitodóndees una potencia prima. Elija números enteros positivos.de tal manera que yes el orden multiplicativo demódulo
Como antes, dejemosser un primitivoraíz de la unidad eny dejarsea el polinomio mínimo sobredea pesar de El polinomio generador del código BCH se define como el mínimo común múltiplo.
Nota: sicomo en la definición simplificada, entonceses 1, y el orden demóduloes Por lo tanto, la definición simplificada es, en efecto, un caso especial de la definición general.
Casos especiales
- Un código BCH conSe denomina código BCH de sentido estricto .
- Un código BCH conse llama primitivo .
El polinomio generadorde un código BCH tiene coeficientes de En general, un código cíclico sobreconcomo el polinomio generador se llama código BCH sobre El código BCH sobrey polinomio generadorcon poderes sucesivos decomo raíces es un tipo de código Reed-Solomon donde el alfabeto del decodificador (síndromes) es el mismo que el alfabeto del canal (datos y polinomio generador), todos los elementos de. [ 6 ] El otro tipo de código Reed Solomon es un código Reed Solomon de vista original que no es un código BCH.
Propiedades
El polinomio generador de un código BCH tiene grado como máximo. Además, siy, el polinomio generador tiene grado como máximo.
Un código BCH tiene una distancia de Hamming mínima al menos.
Un código BCH es cíclico.
Codificación
Dado que cualquier polinomio que sea múltiplo del polinomio generador es una palabra clave BCH válida, la codificación BCH es simplemente el proceso de encontrar algún polinomio que tenga al generador como factor.
El código BCH en sí mismo no prescribe el significado de los coeficientes del polinomio; conceptualmente, la única preocupación de un algoritmo de decodificación BCH es encontrar la palabra clave válida con la mínima distancia de Hamming a la palabra clave recibida. Por lo tanto, el código BCH puede implementarse como un código sistemático o no, dependiendo de cómo el implementador decida integrar el mensaje en el polinomio codificado.
Codificación no sistemática: El mensaje como factor
La forma más sencilla de encontrar un polinomio que sea múltiplo del generador es calcular el producto de un polinomio cualquiera por dicho generador. En este caso, el polinomio arbitrario se puede elegir utilizando los símbolos del mensaje como coeficientes.
Como ejemplo, consideremos el polinomio generador., elegido para su uso en el código binario BCH (31, 21) utilizado por POCSAG y otros. Para codificar el mensaje de 21 bits {101101110111101111101}, primero lo representamos como un polinomio sobre:
Luego, calcule (también sobre):
Por lo tanto, la palabra clave transmitida es {1100111010010111101011101110101}.
El receptor puede usar estos bits como coeficientes eny, tras corregir errores para asegurar una palabra clave válida, puede recalcular
Codificación sistemática: El mensaje como prefijo
Un código sistemático es aquel en el que el mensaje aparece textualmente en algún lugar dentro de la palabra clave. Por lo tanto, la codificación BCH sistemática implica primero incrustar el polinomio del mensaje dentro del polinomio de la palabra clave y luego ajustar los coeficientes de los términos restantes (que no son del mensaje) para asegurar quees divisible por.
Este método de codificación aprovecha el hecho de que restar el resto de un dividendo da como resultado un múltiplo del divisor. Por lo tanto, si tomamos nuestro polinomio de mensajecomo antes y multiplícalo por(para "desplazar" el mensaje para que no interfiera con el resto), podemos usar la división euclidiana de polinomios para obtener:
Aquí vemos quees una palabra clave válida. Comosiempre es de grado menor que(que es el grado de), podemos restarlo con seguridad desin alterar ninguno de los coeficientes del mensaje, por lo tanto tenemos nuestrocomo
Encima(es decir, con códigos BCH binarios), este proceso es indistinguible de agregar una verificación de redundancia cíclica , y si un código BCH binario sistemático se usa solo para fines de detección de errores, vemos que los códigos BCH son solo una generalización de las matemáticas de las verificaciones de redundancia cíclica .
La ventaja de la codificación sistemática es que el receptor puede recuperar el mensaje original descartando todo lo que sigue a la primera.coeficientes, después de realizar la corrección de errores.
Descodificación
Existen muchos algoritmos para decodificar códigos BCH. Los más comunes siguen este esquema general:
- Calcula los síndromes s j para el vector recibido.
- Determinar el número de errores t y el polinomio localizador de errores Λ(x) a partir de los síndromes.
- Calcula las raíces del polinomio de localización de errores para encontrar las localizaciones de errores X i
- Calcula los valores de error Y i en esas ubicaciones de error.
- Corrige los errores
Durante algunos de estos pasos, el algoritmo de decodificación puede determinar que el vector recibido tiene demasiados errores y no se puede corregir. Por ejemplo, si no se encuentra un valor adecuado de t , la corrección fallará. En un código truncado (no primitivo), la ubicación de un error puede estar fuera de rango. Si el vector recibido tiene más errores de los que el código puede corregir, el decodificador puede generar inadvertidamente un mensaje aparentemente válido que no es el que se envió.
Calcular los síndromes
El vector recibidoes la suma de la palabra clave correctay un vector de error desconocidoLos valores del síndrome se forman considerandocomo un polinomio y evaluándolo enPor lo tanto, los síndromes son [ 7 ]
paraa
Desdeson los ceros dede cuáles un múltiplo,Al examinar los valores del síndrome, se aísla el vector de error para poder comenzar a resolverlo.
Si no hay ningún error,a pesar deSi todos los síndromes son cero, entonces la decodificación está hecha.
Calcular el polinomio de localización del error.
Si hay síndromes distintos de cero, entonces hay errores. El decodificador necesita determinar cuántos errores hay y dónde se encuentran.
Si hay un solo error, escríbalo comodóndees la ubicación del error yes su magnitud. Entonces los dos primeros síndromes son
así que juntos nos permiten calculary proporcionar alguna información sobre(determinándolo completamente en el caso de los códigos Reed-Solomon).
Si hay dos o más errores,
No resulta inmediatamente obvio cómo empezar a resolver los síndromes resultantes para las incógnitas.y
El primer paso es encontrar, compatible con síndromes computarizados y con mínimo posiblepolinomio localizador:
Tres algoritmos populares para esta tarea son:
- Algoritmo de Peterson-Gorenstein-Zierler
- Algoritmo de Berlekamp-Massey
- Algoritmo euclidiano de Sugiyama
Algoritmo de Peterson-Gorenstein-Zierler
El algoritmo de Peterson es el paso 2 del procedimiento generalizado de decodificación BCH. El algoritmo de Peterson se utiliza para calcular los coeficientes del polinomio localizador de errores. de un polinomio
Ahora el procedimiento del algoritmo de Peterson-Gorenstein-Zierler. [ 8 ] Esperemos que tengamos al menos 2 t síndromes s c , ..., s c +2 t −1 . Sea v = t .
- Comience por generar elmatriz con elementos que son valores de síndrome
- Generar unvector con elementos
- Dejardenotamos los coeficientes polinómicos desconocidos, que vienen dados por
- Formar la ecuación matricial
- Si el determinante de la matrizSi es distinto de cero, entonces podemos encontrar la inversa de esta matriz y resolver para los valores desconocidos.valores.
- Sientonces sigue si Luego, declare un polinomio localizador de errores vacío y detenga el procedimiento de Peterson. Fin del conjunto. continuar desde el principio de la decodificación de Peterson haciendo más pequeños
- Después de tener valores de, tienes el polinomio localizador de errores.
- Detenga el procedimiento de Peterson.
Polinomio localizador de errores de factor
Ahora que tienes elpolinomio, sus raíces se pueden encontrar en la formapor fuerza bruta, por ejemplo, utilizando el algoritmo de búsqueda de Chien . Las potencias exponenciales del elemento primitivoEsto proporcionará las posiciones donde ocurren errores en la palabra recibida; de ahí el nombre de polinomio "localizador de errores".
Los ceros de Λ( x ) son α − i 1 , ..., α − i v .
Calcular valores de error
Una vez identificadas las ubicaciones de los errores, el siguiente paso consiste en determinar los valores de error en dichas ubicaciones. Estos valores se utilizan para corregir los valores recibidos en esas ubicaciones y así recuperar la palabra clave original.
Para el caso del BCH binario (con todos los caracteres legibles), esto es trivial; simplemente invertimos los bits de la palabra recibida en estas posiciones y obtenemos la palabra de código corregida. En el caso más general, los pesos de errorse puede determinar resolviendo el sistema lineal
Algoritmo de Forney
Sin embargo, existe un método más eficiente conocido como el algoritmo de Forney .
Dejar
Y el polinomio evaluador de errores [ 9 ]
Finalmente:
dónde
Que si los síndromes pudieran explicarse mediante una palabra de error, que podría ser distinta de cero solo en posiciones, entonces los valores de error son
Para los códigos BCH de sentido estricto, c = 1, por lo que la expresión se simplifica a:
Explicación del cálculo del algoritmo de Forney
Se basa en la interpolación de Lagrange y en técnicas de generación de funciones .
Considerary por simplicidad supongamosparayparaEntonces
Queremos calcular incógnitasy podríamos simplificar el contexto eliminando eltérminos. Esto conduce al polinomio evaluador de errores.
Gracias atenemos
Gracias a(el truco de interpolación de Lagrange) la suma degenera en un solo sumando para
LlegarSimplemente deberíamos deshacernos del producto. Podríamos calcular el producto directamente a partir de raíces ya calculadas.depero podríamos usar una forma más simple.
Como derivado formal
obtenemos nuevamente solo un sumando en
Así que finalmente
Esta fórmula es ventajosa cuando se calcula la derivada formal deforma
flexible:
dónde
Decodificación basada en el algoritmo euclidiano extendido
Un proceso alternativo para encontrar tanto el polinomio Λ como el polinomio localizador de errores se basa en la adaptación del algoritmo euclidiano extendido realizada por Yasuo Sugiyama . [ 10 ] La corrección de caracteres ilegibles también podría incorporarse fácilmente al algoritmo.
Dejarsean posiciones de caracteres ilegibles. Se crea un polinomio localizando estas posiciones. Establezca los valores en las posiciones ilegibles a 0 y calcule los síndromes.
Como ya hemos definido para la fórmula de Forney, dejemos
Vamos a ejecutar el algoritmo euclidiano extendido para localizar el mínimo común divisor de polinomios.y El objetivo no es encontrar el mínimo común divisor, sino un polinomio.de grado como máximoy polinomiosde tal manera que Bajo grado degarantías, quesatisfaría extendido (por) condiciones definitorias para
Definicióny utilizandoen el lugar deen la fórmula de Fourney nos dará valores de error.
La principal ventaja del algoritmo es que mientras tanto calcularequerido en la fórmula de Forney.
Explicación del proceso de decodificación
El objetivo es encontrar una palabra clave que difiera lo menos posible de la palabra recibida en posiciones legibles. Al expresar la palabra recibida como la suma de la palabra clave más cercana y la palabra de error, intentamos encontrar la palabra de error con el menor número posible de caracteres distintos de cero en posiciones legibles. Síndromerestringe la palabra de error por condición
Podríamos escribir estas condiciones por separado o podríamos crear un polinomio.
y comparar coeficientes cerca de las potenciasa
Supongamos que hay una letra ilegible en la posiciónpodríamos reemplazar un conjunto de síndromespor conjunto de síndromesdefinido por ecuaciónSupongamos que para una palabra de error todas las restricciones del conjunto originalLos síndromes se mantienen, que
Un nuevo conjunto de síndromes restringe el vector de error.
del mismo modo que el conjunto original de síndromes restringió el vector de error.Excepto la coordenadadonde tenemosunes cero, siCon el objetivo de localizar posiciones de error podríamos cambiar el conjunto de síndromes de manera similar para reflejar todos los caracteres ilegibles. Esto acorta el conjunto de síndromes en
En la formulación polinómica, el reemplazo de síndromes se establecepor síndromes establecidosconduce a
Por lo tanto,
Después de la sustitución deporSe requeriría una ecuación para los coeficientes cercanos a las potencias.
Se podría considerar la búsqueda de posiciones de error desde el punto de vista de eliminar la influencia de posiciones dadas, de manera similar a como se hace con los caracteres ilegibles. Si encontramosposiciones tales que eliminar su influencia conduce a obtener un conjunto de síndromes que consisten en todos ceros, entonces existe un vector de error con errores solo en estas coordenadas.denota el polinomio eliminando la influencia de estas coordenadas, obtenemos
En el algoritmo euclidiano, intentamos corregir como máximoerrores (en posiciones legibles), porque con un mayor número de errores podría haber más palabras clave a la misma distancia de la palabra recibida. Por lo tanto, paraEstamos buscando que la ecuación se cumpla para coeficientes cercanos a potencias que comienzan desde
En la fórmula de Forney,podría multiplicarse por un escalar dando el mismo resultado.
Podría suceder que el algoritmo euclidiano encuentrede grado superior atener un número de raíces diferentes igual a su grado, donde la fórmula de Fourney podría corregir errores en todas sus raíces, de todos modos corregir tantos errores podría ser arriesgado (especialmente sin otras restricciones en la palabra recibida). Por lo general, después de obtenerde grado superior, decidimos no corregir los errores. La corrección podría fallar en el casoTiene raíces con mayor multiplicidad o el número de raíces es menor que su grado. El fallo también podría detectarse mediante la fórmula de Forney, que devuelve un error fuera del alfabeto transmitido.
Corrige los errores
Utilizando los valores de error y la ubicación del error, corrija los errores y forme un vector de código corregido restando los valores de error en las ubicaciones de error.
Ejemplos de decodificación
Decodificación de código binario sin caracteres ilegibles
Consideremos un código BCH en GF(2 4 ) cony. (Esto se utiliza en códigos QR .) Sea el mensaje a transmitir [1 1 0 1 1] , o en notación polinómica, Los símbolos de "suma de verificación" se calculan dividiendopory tomando el resto, resultando eno [ 1 0 0 0 0 1 0 1 0 0 ] . Estos se añaden al mensaje, por lo que la palabra clave transmitida es [ 1 1 0 1 1 1 0 0 0 0 1 0 1 0 0 ] .
Ahora, imaginemos que hay dos errores de bits en la transmisión, por lo que la palabra clave recibida es [ 1 0 0 1 1 1 0 0 0 1 1 0 1 0 0 ]. En notación polinómica:
Para corregir los errores, primero calcule los síndromes. Tomandotenemosy A continuación, aplique el procedimiento de Peterson reduciendo por filas la siguiente matriz aumentada .
Debido a la fila cero, S 3×3 es singular, lo cual no sorprende ya que solo se introdujeron dos errores en la palabra clave. Sin embargo, la esquina superior izquierda de la matriz es idéntica a [ S 2×2 | C 2×1 ] , lo que da lugar a la solución. El polinomio localizador de errores resultante esque tiene ceros eny Los exponentes decorresponden a las ubicaciones de error. No es necesario calcular los valores de error en este ejemplo, ya que el único valor posible es 1.
Decodificación con caracteres ilegibles
Supongamos el mismo escenario, pero la palabra recibida tiene dos caracteres ilegibles [ 1 0 0 ? 1 1 ? 0 0 1 1 0 1 0 0 ]. Reemplazamos los caracteres ilegibles por ceros mientras creamos el polinomio que refleja sus posiciones. Calculamos los síndromesy(Usando notación logarítmica que es independiente de los isomorfismos GF(2 4 ). Para la verificación del cálculo podemos usar la misma representación para la suma que se usó en el ejemplo anterior. Descripción hexadecimal de las potencias deson consecutivamente 1,2,4,8,3,6,C,B,5,A,7,E,F,D,9 con la suma basada en xor bit a bit.)
Hagamos un polinomio de síndrome
calcular
Ejecutar el algoritmo euclidiano extendido:
Hemos llegado a un polinomio de grado como máximo 3, y como
obtenemos
Por lo tanto,
DejarNo te preocupes por esoEncuentra por fuerza bruta una raíz deLas raíces sony(después de encontrar, por ejemplo)podemos dividirpor el monograma correspondientey la raíz del monómero resultante se podía encontrar fácilmente).
Dejar
Busquemos valores de error usando la fórmula
dóndeson raíces deNosotros obtenemos
Hecho, queNo debería sorprender.
Por lo tanto, el código corregido es [ 1 1 0 1 1 1 0 0 0 0 1 0 1 0 0].
Decodificación con caracteres ilegibles con un pequeño número de errores
Vamos a mostrar el comportamiento del algoritmo para el caso con un número pequeño de errores. Sea la palabra recibida [ 1 0 0 ? 1 1 ? 0 0 0 1 0 1 0 0 ].
Nuevamente, reemplace los caracteres ilegibles por ceros mientras crea el polinomio que refleja sus posiciones. Calcular los síndromesy Crear polinomio de síndrome
Ejecutemos el algoritmo euclidiano extendido:
Hemos llegado a un polinomio de grado como máximo 3, y como
obtenemos
Por lo tanto,
DejarNo te preocupes por esoLa raíz dees
Dejar
Busquemos valores de error usando la fórmuladóndeson raíces de polinomios
Nosotros obtenemos
El hecho de queNo debería sorprender.
Por lo tanto, el código corregido es [ 1 1 0 1 1 1 0 0 0 0 1 0 1 0 0].
Citas
- ↑ Reed y Chen 1999 , pág. 189
- ↑ Hocquenghem 1959
- ↑ Bose y Ray-Chaudhuri 1960
- ↑ "Sistema de codificación del módulo de aterrizaje Phobos: software y análisis" (PDF) . Archivado (PDF) del original el 9 de octubre de 2022. Consultado el 25 de febrero de 2012 .
- ↑ Marelli, Alessia; Micheloni, Rino (2018). "Códigos BCH para unidades de estado sólido" . Inside Solid State Drives (SSDS) . Springer Series in Advanced Microelectronics. Vol. 37. pp. 369–406 . doi : 10.1007/978-981-13-0599-3_11 . ISBN 978-981-13-0598-6Consultado el 23 de septiembre de 2023 .
- ↑ Gill s.f. , pág. 3
- ↑ Lidl & Pilz 1999 , pág. 229
- ^ Gorenstein, Peterson y Zierler 1960
- ↑ Gill s.f. , pág. 47
- ^ Yasuo Sugiyama, Masao Kasahara, Shigeichi Hirasawa y Toshihiko Namekawa. Un método para resolver ecuaciones clave para decodificar códigos Goppa. Información y control, 27:87–99, 1975.
Referencias
Fuentes primarias
- Hocquenghem, A. (septiembre de 1959), "Codes correcteurs d'erreurs", Chiffres (en francés), 2 , París: 147– 156
- Bose, RC ; Ray-Chaudhuri, DK (marzo de 1960), "Sobre una clase de códigos de grupo binarios correctores de errores" (PDF) , Information and Control , 3 (1): 68–79 , Bibcode : 1960InfCo...3...68B , doi : 10.1016/s0019-9958(60)90287-4 , ISSN 0890-5401 , archivado (PDF) del original el 9 de octubre de 2022
Fuentes secundarias
- Gill, John (s.f.), Apuntes de EE387 n.º 7, Material complementario n.º 28 (PDF) , Universidad de Stanford, págs. 42-45 , archivado (PDF) del original el 9 de octubre de 2022 , consultado el 21 de abril de 2010. Al parecer, los apuntes del curso se están rehaciendo para 2012: http://www.stanford.edu/class/ee387/ Archivado el 5 de junio de 2013 en Wayback Machine.
- Gorenstein, Daniel ; Peterson, W. Wesley ; Zierler, Neal (1960), "Los códigos Bose-Chaudhuri con corrección de dos errores son cuasi-perfectos", Information and Control , 3 (3): 291–294 , doi : 10.1016/s0019-9958(60)90877-9
- Lidl, Rudolf; Pilz, Günter (1999), Álgebra abstracta aplicada (2.ª ed.), John Wiley
- Reed, Irving S .; Chen, Xuemin (1999), Error-Control Coding for Data Networks , Boston, MA: Kluwer Academic Publishers , ISBN 0-7923-8528-4
Lecturas adicionales
- Blahut, Richard E. (2003), Códigos algebraicos para la transmisión de datos (2.ª ed.), Cambridge University Press , ISBN 0-521-55374-1
- Gilbert, WJ; Nicholson, WK (2004), Álgebra moderna con aplicaciones (2.ª ed.), John Wiley
- Lin, S.; Costello, D. (2004), Codificación de control de errores: fundamentos y aplicaciones , Englewood Cliffs, NJ: Prentice-Hall
- MacWilliams, FJ; Sloane, NJA (1977), La teoría de los códigos correctores de errores , Nueva York, NY: North-Holland Publishing Company
- Rudra, Atri, CSE 545, Códigos correctores de errores: combinatoria, algoritmos y aplicaciones , Universidad de Buffalo, archivado del original el 18 de diciembre de 2012 , consultado el 11 de mayo de 2009.
- Detección y corrección de errores
- Campos finitos
- Teoría de la codificación