En teoría de codificación , un código cíclico es un código de bloques , donde los desplazamientos circulares de cada palabra de código dan otra palabra que pertenece al código. Son códigos de corrección de errores que tienen propiedades algebraicas que son convenientes para la detección y corrección eficiente de errores .
Sea un código lineal sobre un campo finito (también llamado campo de Galois ) de longitud de bloque . se denomina código cíclico si, para cada palabra de código de , la palabra en obtenida mediante un desplazamiento cíclico a la derecha de los componentes es nuevamente una palabra de código. Debido a que un desplazamiento cíclico a la derecha es igual a desplazamientos cíclicos a la izquierda, un código cíclico también puede definirse mediante desplazamientos cíclicos a la izquierda. Por lo tanto, el código lineal es cíclico precisamente cuando es invariante bajo todos los desplazamientos cíclicos.
Los códigos cíclicos tienen algunas restricciones estructurales adicionales. Se basan en campos de Galois y, debido a sus propiedades estructurales, son muy útiles para el control de errores. Su estructura está estrechamente relacionada con los campos de Galois, por lo que los algoritmos de codificación y decodificación de códigos cíclicos son computacionalmente eficientes.
Los códigos cíclicos pueden vincularse a ideales en ciertos anillos. Sea un anillo polinomial sobre el cuerpo finito . Identifique los elementos del código cíclico con polinomios en tales que se asigna al polinomio : por lo tanto, la multiplicación por corresponde a un desplazamiento cíclico. Entonces es un ideal en , y por lo tanto principal , ya que es un anillo ideal principal . El ideal es generado por el único elemento mónico en de grado mínimo, el polinomio generador . [1] Este debe ser un divisor de . De ello se deduce que todo código cíclico es un código polinomial . Si el polinomio generador tiene grado, entonces el rango del código es .
El idempotente de es una palabra de código tal que (es decir, es un elemento idempotente de ) y es una identidad para el código, es decir para cada palabra de código . Si y son coprimos , dicha palabra siempre existe y es única; [2] es un generador del código.
Un código irreducible es un código cíclico en el que el código, como ideal, es irreducible, es decir, es mínimo en , de modo que su polinomio de verificación es un polinomio irreducible .
Por ejemplo, si y , el conjunto de palabras de código contenidas en el código cíclico generado por es precisamente
Corresponde al ideal en generado por .
El polinomio es irreducible en el anillo de polinomios y, por lo tanto, el código es un código irreducible.
El idempotente de este código es el polinomio , correspondiente a la palabra código .
Ejemplos triviales de códigos cíclicos son el propio código y el código que contiene únicamente la palabra clave cero. Estos corresponden a los generadores y respectivamente: estos dos polinomios deben ser siempre factores de .
Sobre el código de bit de paridad , que consta de todas las palabras de peso par, corresponde al generador . Nuevamente sobre esto siempre debe ser un factor de .
Antes de profundizar en los detalles de los códigos cíclicos, primero analizaremos los códigos cuasiciclicos y acortados, que están estrechamente relacionados con los códigos cíclicos y todos ellos pueden convertirse entre sí.
Códigos cuasicíclicos: [ cita requerida ]
Un código cuasicíclico es un código de bloque lineal tal que, para algún que es coprimo con , el polinomio es un polinomio de palabra de código siempre que es un polinomio de palabra de código.
Aquí, el polinomio de palabra de código es un elemento de un código lineal cuyas palabras de código son polinomios que son divisibles por un polinomio de longitud más corta llamado polinomio generador . Cada polinomio de palabra de código se puede expresar en la forma , donde es el polinomio generador. Cualquier palabra de código de un código cíclico se puede asociar con un polinomio de palabra de código, es decir, . Un código cuasicíclico con igual a es un código cíclico.
Códigos abreviados:
Un código lineal se denomina código cíclico acortado apropiado si se puede obtener eliminando posiciones de un código cíclico.
En los códigos abreviados, se eliminan los símbolos de información para obtener una longitud de bloque deseada menor que la longitud de bloque de diseño. Por lo general, se supone que los símbolos de información que faltan están al principio de la palabra de código y se consideran 0. Por lo tanto, − es fijo y luego se reduce, lo que finalmente disminuye a . No es necesario eliminar los símbolos iniciales. Dependiendo de la aplicación, a veces las posiciones consecutivas se consideran 0 y se eliminan.
No es necesario transmitir todos los símbolos que se eliminan y, en el extremo receptor, se pueden volver a insertar. Para convertir un código cíclico en un código abreviado, establezca los símbolos en cero y elimínelos de cada palabra de código. Cualquier código cíclico se puede convertir en códigos cuasicíclicos eliminando cada símbolo th donde es un factor de . Si los símbolos eliminados no son símbolos de verificación, entonces este código cíclico también es un código abreviado.
Los códigos cíclicos se pueden utilizar para corregir errores , como los códigos Hamming , ya que los códigos cíclicos se pueden utilizar para corregir errores simples. Asimismo, también se utilizan para corregir errores dobles y errores de ráfaga. Todos los tipos de corrección de errores se tratan brevemente en las siguientes subsecciones.
El código Hamming (7,4) tiene un polinomio generador . Este polinomio tiene un cero en el campo de extensión de Galois en el elemento primitivo , y todas las palabras de código satisfacen . Los códigos cíclicos también se pueden utilizar para corregir errores dobles en el campo . La longitud de bloque será igual a y los elementos primitivos y como ceros en el porque estamos considerando el caso de dos errores aquí, por lo que cada uno representará un error.
La palabra recibida es un polinomio de grado dado como
donde puede tener como máximo dos coeficientes distintos de cero correspondientes a 2 errores.
Definimos el polinomio síndrome como el resto del polinomio al dividirlo por el polinomio generador, es decir
como .
Sean los elementos del campo y los dos números de ubicación del error. Si solo se produce un error, entonces es igual a cero y si no se produce ninguno, ambos son cero.
Sea y .
Estos elementos de campo se denominan "síndromes". Ahora bien, como es cero en los elementos primitivos y , podemos escribir y . Si, por ejemplo, se producen dos errores, entonces
y .
Y estos dos pueden considerarse como dos pares de ecuaciones con dos incógnitas y, por lo tanto, podemos escribir
y .
Por lo tanto, si los dos pares de ecuaciones no lineales se pueden resolver, se pueden utilizar códigos cíclicos para corregir dos errores.
El código Hamming(7,4) puede escribirse como un código cíclico sobre GF(2) con generador . De hecho, cualquier código Hamming binario de la forma Ham(r, 2) es equivalente a un código cíclico, [3] y cualquier código Hamming de la forma Ham(r,q) con r y q-1 primos entre sí también es equivalente a un código cíclico. [4] Dado un código Hamming de la forma Ham(r,2) con , el conjunto de palabras de código pares forma un código cíclico. [5]
Un código cuya distancia mínima es al menos 3, tiene una matriz de comprobación cuyas columnas son todas distintas y no nulas. Si una matriz de comprobación para un código binario tiene filas, entonces cada columna es un número binario de 0 a 100 bits. Hay columnas posibles. Por lo tanto, si una matriz de comprobación de un código binario con al menos 3 tiene filas, entonces solo puede tener columnas, no más que eso. Esto define un código, llamado código Hamming.
Es fácil definir códigos de Hamming para alfabetos grandes de tamaño . Necesitamos definir una matriz con columnas linealmente independientes. Para cualquier palabra de tamaño habrá columnas que sean múltiplos entre sí. Por lo tanto, para obtener independencia lineal, se elegirán como columnas todas las tuplas distintas de cero con uno como el elemento distinto de cero más alto. Entonces, dos columnas nunca serán linealmente dependientes porque tres columnas podrían ser linealmente dependientes con la distancia mínima del código como 3.
Por lo tanto, hay columnas distintas de cero con un elemento distinto de cero como el más alto. Por lo tanto, un código Hamming es un código.
Ahora bien, para los códigos cíclicos, sea elemento primitivo en , y sea . Entonces y por lo tanto es un cero del polinomio y es un polinomio generador para el código cíclico de longitud de bloque .
Pero para , . Y la palabra recibida es un polinomio de grado dado como
donde, o donde representa las ubicaciones de los errores.
Pero también podemos utilizar como elemento de para indexar la ubicación del error. Debido a que , tenemos y todas las potencias de desde hasta son distintas. Por lo tanto, podemos determinar fácilmente la ubicación del error desde a menos que represente que no hay error. Por lo tanto, un código de Hamming es un código de corrección de errores único sobre con y .
Según el concepto de distancia de Hamming , un código con una distancia mínima puede corregir cualquier error. Pero en muchos canales, el patrón de error no es muy arbitrario, sino que se produce en segmentos muy cortos del mensaje. Este tipo de errores se denominan errores de ráfaga . Por lo tanto, para corregir dichos errores, obtendremos un código más eficiente y de mayor velocidad debido a las menores restricciones. Los códigos cíclicos se utilizan para corregir errores de ráfaga. De hecho, los códigos cíclicos también pueden corregir errores de ráfaga cíclicos junto con errores de ráfaga. Los errores de ráfaga cíclicos se definen como
Una ráfaga cíclica de longitud es un vector cuyos componentes distintos de cero se encuentran entre componentes (cíclicamente) consecutivos, el primero y el último de los cuales son distintos de cero.
En forma polinómica, la ráfaga cíclica de longitud se puede describir como un polinomio de grado con coeficiente distinto de cero . Aquí se define el patrón y se define el punto de inicio del error. La longitud del patrón se da por deg . El polinomio de síndrome es único para cada patrón y se da por
Un código de bloque lineal que corrige todos los errores de ráfaga de longitud o menos debe tener al menos símbolos de verificación. Demostración: Porque cualquier código lineal que pueda corregir un patrón de ráfaga de longitud o menos no puede tener una ráfaga de longitud o menos como palabra de código porque si la tuviera, una ráfaga de longitud podría cambiar la palabra de código a un patrón de ráfaga de longitud , que también podría obtenerse al hacer un error de ráfaga de longitud en todas las palabras de código cero. Ahora, cualesquiera dos vectores que no sean cero en los primeros componentes deben ser de diferentes coconjuntos de una matriz para evitar que su diferencia sea una palabra de código de ráfagas de longitud . Por lo tanto, el número de tales coconjuntos es igual al número de tales vectores que son . Por lo tanto, al menos coconjuntos y, por lo tanto, al menos símbolo de verificación.
Esta propiedad también se conoce como límite de Rieger y es similar al límite de Singleton para la corrección de errores aleatorios.
En 1959, Philip Fire [6] presentó una construcción de códigos cíclicos generados por un producto de un binomio y un polinomio primitivo. El binomio tiene la forma de algún entero impar positivo . [7] El código Fire es un código de corrección de errores de ráfaga cíclica sobre el polinomio generador
donde es un polinomio primo con grado no menor que y no divide a . La longitud del bloque del código de incendio es el entero más pequeño tal que divide a .
Un código de incendios puede corregir todos los errores de ráfaga de longitud t o menor si no aparecen dos ráfagas y en el mismo conjunto. Esto se puede demostrar por contradicción. Supongamos que hay dos ráfagas distintas de cero y de longitud o menor y están en el mismo conjunto del código. Por lo tanto, su diferencia es una palabra de código. Como la diferencia es un múltiplo de , también es un múltiplo de . Por lo tanto,
.
Esto demuestra que es un múltiplo de , por lo que
para algunos . Ahora bien, como es menor que y es menor que entonces es una palabra clave. Por lo tanto,
.
Dado que el grado es menor que el grado de , no se puede dividir . Si no es cero, entonces tampoco se puede dividir, ya que es menor que y por definición de , divide por un número no menor que . Por lo tanto , y es igual a cero. Eso significa que ambas ráfagas son iguales, contrariamente a la suposición.
Los códigos de incendios son los mejores códigos de corrección de ráfagas únicas con una tasa alta y se construyen analíticamente. Tienen una tasa muy alta y cuando y son iguales, la redundancia es mínima y es igual a . Al usar múltiples códigos de incendios, también se pueden corregir errores de ráfagas más largas.
Para la detección de errores se utilizan ampliamente códigos cíclicos, denominados códigos de redundancia cíclica .
Las aplicaciones de la transformada de Fourier están muy extendidas en el procesamiento de señales. Pero sus aplicaciones no se limitan únicamente a los campos complejos; las transformadas de Fourier también existen en el campo de Galois . Los códigos cíclicos que utilizan la transformada de Fourier se pueden describir en un entorno más cercano al procesamiento de señales.
Transformada de Fourier sobre cuerpos finitos
La transformada de Fourier discreta de un vector viene dada por un vector donde,
= donde,
donde exp( ) es una raíz ésima de la unidad. De manera similar, en el cuerpo finito, la raíz ésima de la unidad es un elemento de orden . Por lo tanto
Si es un vector sobre , y es un elemento de de orden , entonces la transformada de Fourier del vector es el vector y los componentes están dados por
= donde,
Aquí está el índice de tiempo , es la frecuencia y es el espectro . Una diferencia importante entre la transformada de Fourier en un campo complejo y un campo de Galois es que el campo complejo existe para cada valor de mientras que en el campo de Galois existe solo si divide . En el caso de los campos de extensión, habrá una transformada de Fourier en el campo de extensión si divide para algún . En el campo de Galois, el vector del dominio del tiempo está sobre el campo, pero el espectro puede estar sobre el campo de extensión .
Cualquier palabra de código de código cíclico de longitud de bloque puede representarse mediante un polinomio de grado como máximo . Su codificador puede escribirse como . Por lo tanto, en el dominio de la frecuencia, el codificador puede escribirse como . Aquí, el espectro de la palabra de código tiene un valor en pero todos los componentes en el dominio del tiempo son de . Como el espectro de datos es arbitrario, la función de es especificar aquellos donde será cero.
Por tanto, los códigos cíclicos también pueden definirse como
Dado un conjunto de índices espectrales, , cuyos elementos se denominan frecuencias de control, el código cíclico es el conjunto de palabras en cuyo espectro es cero en los componentes indexados por . Cualquier espectro de este tipo tendrá componentes de la forma .
Por lo tanto, los códigos cíclicos son vectores en el campo y el espectro dado por su transformada de Fourier inversa se encuentra sobre el campo y está restringido a ser cero en ciertos componentes. Pero todo espectro en el campo y cero en ciertos componentes puede no tener transformadas inversas con componentes en el campo . Dicho espectro no puede usarse como códigos cíclicos.
A continuación se muestran algunos límites en el espectro de códigos cíclicos.
Si es un factor de para algún . El único vector en peso o menos que tiene componentes consecutivos de su espectro iguales a cero es un vector todo-cero.
Si es un factor de para algún , y un entero que es coprimo con . El único vector en de peso o menos cuyos componentes espectrales son iguales a cero para , donde y , es el vector de todos los ceros.
Si es un factor de para algunos y . El único vector en de peso o menos cuyos componentes espectrales son iguales a cero para , donde y toma al menos valores en el rango , es el vector todo cero.
Cuando el primo es un residuo cuadrático módulo el primo existe un código de residuo cuadrático que es un código cíclico de longitud , dimensión y peso mínimo al menos sobre .
Un código constacíclico es un código lineal con la propiedad de que para alguna constante λ si ( c 1 ,c 2 ,..., c n ) es una palabra de código entonces también lo es ( λ c n ,c 1 ,..., c n -1 ). Un código negacíclico es un código constacíclico con λ=-1. [8] Un código cuasicíclico tiene la propiedad de que para algún s , cualquier desplazamiento cíclico de una palabra de código por s lugares es nuevamente una palabra de código. [9] Un código doble circulante es un código cuasicíclico de longitud par con s =2. [9] Los códigos cuasi-trenzados y los códigos multi-trenzados son generalizaciones adicionales de los códigos constacíclicos . [10] [11]
Este artículo incorpora material del código cíclico en PlanetMath , que se encuentra bajo la licencia Creative Commons Attribution/Share-Alike License .