Un código decodificable localmente ( LDC ) es un código de corrección de errores que permite decodificar un solo bit del mensaje original con alta probabilidad examinando (o consultando) solo una pequeña cantidad de bits de una palabra de código posiblemente corrupta . [1] [2] [3] Esta propiedad podría ser útil, por ejemplo, en un contexto donde la información se transmite a través de un canal ruidoso, y solo se requiere un pequeño subconjunto de los datos en un momento particular y no hay necesidad de decodificar todo el mensaje a la vez. Tenga en cuenta que los códigos decodificables localmente no son un subconjunto de los códigos comprobables localmente , aunque existe cierta superposición entre los dos. [4]
Las palabras clave se generan a partir del mensaje original mediante un algoritmo que introduce una cierta cantidad de redundancia en la palabra clave; por lo tanto, la palabra clave siempre es más larga que el mensaje original. Esta redundancia se distribuye a lo largo de la palabra clave y permite recuperar el mensaje original con una buena probabilidad incluso en presencia de errores. Cuanto más redundante sea la palabra clave, más resistente será a los errores y menos consultas se necesitarán para recuperar un poco del mensaje original.
Más formalmente, un código decodificable localmente codifica un mensaje de -bit en una palabra código de -bit de modo que cualquier bit del mensaje se puede recuperar con probabilidad utilizando un algoritmo de decodificación aleatorio que consulta solo bits de la palabra código , incluso si hasta ubicaciones de la palabra código han sido dañadas.
Además, un decodificador local perfectamente suave es un decodificador tal que, además de generar siempre la salida correcta dado el acceso a una palabra de código no corrupta, para cada y la consulta para recuperar el bit es uniforme sobre . [5] (La notación denota el conjunto ). De manera informal, esto significa que el conjunto de consultas necesarias para decodificar cualquier bit dado se distribuye uniformemente sobre la palabra de código.
Los decodificadores de listas locales son otro subconjunto interesante de decodificadores locales. La decodificación de listas es útil cuando una palabra de código está dañada en más de lugares, donde es la distancia mínima de Hamming entre dos palabras de código. En este caso, ya no es posible identificar exactamente qué mensaje original ha sido codificado, ya que podría haber múltiples palabras de código dentro de la distancia de la palabra de código dañada. Sin embargo, dado un radio , es posible identificar el conjunto de mensajes que codifican palabras de código que están dentro de la distancia de la palabra de código dañada. Un límite superior en el tamaño del conjunto de mensajes puede determinarse mediante y . [6]
Los códigos decodificables localmente también pueden concatenarse, donde un mensaje se codifica primero usando un esquema, y la palabra clave resultante se codifica nuevamente usando un esquema diferente. (Nótese que, en este contexto, concatenación es el término usado por los académicos para referirse a lo que usualmente se llama composición ; vea [5] ). Esto podría ser útil si, por ejemplo, el primer código tiene algunas propiedades deseables con respecto a la velocidad, pero tiene alguna propiedad indeseable, como producir una palabra clave sobre un alfabeto no binario. El segundo código puede entonces transformar el resultado de la primera codificación sobre un alfabeto no binario a un alfabeto binario. La codificación final todavía es decodificable localmente, y requiere pasos adicionales para decodificar ambas capas de codificación. [7]
La tasa de un código se refiere a la relación entre la longitud de su mensaje y la longitud de la palabra de código: , y la cantidad de consultas necesarias para recuperar 1 bit del mensaje se denomina complejidad de consulta de un código.
La tasa de un código está inversamente relacionada con la complejidad de la consulta, pero la forma exacta de este equilibrio es un importante problema abierto. [8] [9] Se sabe que no hay LDC que consulten la palabra de código en una sola posición, y que el tamaño óptimo de la palabra de código para la complejidad de la consulta 2 es exponencial en el tamaño del mensaje original. [8] Sin embargo, no hay límites inferiores estrictos conocidos para códigos con una complejidad de consulta mayor que 2. Acercándose al equilibrio desde el lado de la longitud de la palabra de código, los únicos códigos conocidos con una longitud de palabra de código proporcional a la longitud del mensaje tienen una complejidad de consulta para [8] [ necesita actualización ] También hay códigos intermedios, que tienen palabras de código polinomiales en el tamaño del mensaje original y una complejidad de consulta polilogarítmica. [8]
Los códigos decodificables localmente tienen aplicaciones en la transmisión y almacenamiento de datos, la teoría de la complejidad, las estructuras de datos, la desaleatorización, la teoría de la computación tolerante a fallos y los esquemas de recuperación de información privada. [9]
Los códigos decodificables localmente son especialmente útiles para la transmisión de datos a través de canales ruidosos. El código Hadamard (un caso especial de los códigos Reed Muller) fue utilizado en 1971 por la Mariner 9 para transmitir imágenes de Marte a la Tierra. Se eligió en lugar de un código de 5 repeticiones (donde cada bit se repite 5 veces) porque, para aproximadamente el mismo número de bits transmitidos por píxel, tenía una mayor capacidad de corrección de errores. (El código Hadamard cae bajo el paraguas general de la corrección de errores hacia adelante , y resulta ser decodificable localmente; el algoritmo real utilizado para decodificar la transmisión desde Marte fue un esquema de corrección de errores genérico.) [10]
Los LDC también son útiles para el almacenamiento de datos, en cuyo caso el medio puede corromperse parcialmente con el tiempo o el dispositivo de lectura puede sufrir errores. En ambos casos, un LDC permitirá recuperar la información a pesar de los errores, siempre que sean relativamente pocos. Además, los LDC no requieren que se decodifique todo el mensaje original; un usuario puede decodificar una parte específica del mensaje original sin necesidad de decodificarlo todo. [11]
Una de las aplicaciones de los códigos localmente decodificables en la teoría de la complejidad es la amplificación de la dureza. Si se utilizan códigos localmente decodificables con una longitud de palabra de código polinómica y una complejidad de consulta polilogarítmica, se puede tomar una función que es difícil de resolver en las entradas del peor caso y diseñar una función que es difícil de calcular en las entradas del caso promedio.
Consideremos que está limitado a entradas de longitud únicamente . Entonces podemos verlo como una cadena binaria de longitud , donde cada bit es para cada . Podemos usar un código decodificable localmente de longitud polinómica con complejidad de consulta polilogarítmica que tolera una fracción constante de errores para codificar la cadena que representa para crear una nueva cadena de longitud . Pensamos en esta nueva cadena como la definición de un nuevo problema en entradas de longitud . Si es fácil de resolver en promedio, es decir, podemos resolver correctamente en una gran fracción de entradas, entonces por las propiedades del LDC usado para codificarlo, podemos usar para calcular de manera probabilística en todas las entradas. Por lo tanto, una solución para para la mayoría de las entradas nos permitiría resolver en todas las entradas, contradiciendo nuestra suposición de que es difícil en las entradas del peor caso. [5] [8] [12]
Un esquema de recuperación de información privada permite a un usuario recuperar un elemento de un servidor que posee una base de datos sin revelar qué elemento se recupera. Una forma común de garantizar la privacidad es tener servidores separados, que no se comunican, cada uno con una copia de la base de datos. Dado un esquema apropiado, el usuario puede realizar consultas a cada servidor que individualmente no revelan qué bit está buscando el usuario, pero que en conjunto proporcionan suficiente información para que el usuario pueda determinar el bit particular de interés en la base de datos. [3] [11]
Se puede ver fácilmente que los códigos decodificables localmente tienen aplicaciones en este contexto. Un procedimiento general para producir un esquema de información privada de servidor a partir de un código decodificable localmente de consulta perfectamente uniforme es el siguiente:
Sea un LDC perfectamente uniforme que codifica mensajes de -bit en palabras de código de -bit. Como paso de preprocesamiento, cada uno de los servidores codifica la base de datos de -bit con el código , por lo que ahora cada servidor almacena la palabra de código de -bit . Un usuario interesado en obtener el bit de genera aleatoriamente un conjunto de consultas de modo que se pueda calcular a partir de utilizando el algoritmo de decodificación local para . El usuario envía cada consulta a un servidor diferente y cada servidor responde con el bit solicitado. Luego, el usuario utiliza para calcular a partir de las respuestas. [8] [11] Debido a que el algoritmo de decodificación es perfectamente uniforme, cada consulta se distribuye uniformemente sobre la palabra de código; por lo tanto, ningún servidor individual puede obtener información sobre las intenciones del usuario, por lo que el protocolo es privado mientras los servidores no se comuniquen. [11]
El código Hadamard (o Walsh-Hadamard) es un ejemplo de un código simple decodificable localmente que asigna una cadena de longitud a una palabra de código de longitud . La palabra de código para una cadena se construye de la siguiente manera: para cada , el bit de la palabra de código es igual a , donde (mod 2). Es fácil ver que cada palabra de código tiene una distancia de Hamming de con respecto a cada otra palabra de código.
El algoritmo de decodificación local tiene una complejidad de consulta de 2 y se puede decodificar todo el mensaje original con buena probabilidad si la palabra clave está dañada en menos de sus bits. Por ejemplo , si la palabra clave está dañada en una fracción de lugares, un algoritmo de decodificación local puede recuperar el bit del mensaje original con probabilidad .
Prueba: Dada una palabra clave y un índice , el algoritmo para recuperar el bit del mensaje original funciona de la siguiente manera:
Hagamos referencia al vector en que tiene 1 en la posición y 0 en el resto. Para , denota el bit único en que corresponde a . El algoritmo elige un vector aleatorio y el vector (donde denota XOR bit a bit ). El algoritmo genera (mod 2).
Corrección: Por linealidad,
Pero , simplemente necesitamos demostrarlo y con buena probabilidad.
Dado que y están distribuidos uniformemente (aunque son dependientes), el límite de unión implica que y con una probabilidad de al menos . Nota: para amplificar la probabilidad de éxito, se puede repetir el procedimiento con diferentes vectores aleatorios y tomar la respuesta mayoritaria. [13]
La idea principal detrás de la decodificación local de los códigos Reed-Muller es la interpolación polinómica . El concepto clave detrás de un código Reed-Muller es un polinomio multivariado de grado en variables. El mensaje se trata como la evaluación de un polinomio en un conjunto de puntos predefinidos. Para codificar estos valores, se extrapola un polinomio a partir de ellos, y la palabra clave es la evaluación de ese polinomio en todos los puntos posibles. En un nivel alto, para decodificar un punto de este polinomio, el algoritmo de decodificación elige un conjunto de puntos en una línea que pasa por el punto de interés . Luego, consulta la palabra clave para la evaluación del polinomio en los puntos en e interpola ese polinomio. Luego, es simple evaluar el polinomio en el punto que producirá . Esta forma indirecta de evaluación es útil porque (a) el algoritmo se puede repetir utilizando diferentes líneas a través del mismo punto para mejorar la probabilidad de corrección, y (b) las consultas se distribuyen uniformemente en la palabra clave.
Más formalmente, sea un cuerpo finito, y sean números con . El código Reed-Muller con parámetros es la función RM : que asigna cada polinomio de variable sobre de grado total a los valores de en todas las entradas en . Es decir, la entrada es un polinomio de la forma especificada por la interpolación de los valores de los puntos predefinidos y la salida es la secuencia para cada . [14]
Para recuperar el valor de un polinomio de grado en un punto , el decodificador local dispara una línea afín aleatoria a través de . Luego, elige puntos en esa línea, que utiliza para interpolar el polinomio y luego evaluarlo en el punto donde el resultado es . Para ello, el algoritmo elige un vector de manera uniforme al azar y considera la línea que pasa por . El algoritmo elige un subconjunto arbitrario de , donde , y consulta las coordenadas de la palabra de código que corresponden a los puntos para todos y obtiene valores . Luego, utiliza la interpolación polinómica para recuperar el único polinomio univariante con grado menor o igual a tal que para todos . Luego, para obtener el valor de , simplemente evalúa . Para recuperar un solo valor del mensaje original, uno elige ser uno de los puntos que define el polinomio. [8] [14]
Cada consulta individual se distribuye de manera uniforme y aleatoria sobre la palabra clave. Por lo tanto, si la palabra clave está dañada como máximo en una fracción de ubicaciones, por el límite de unión, la probabilidad de que el algoritmo muestree solo coordenadas no dañadas (y, por lo tanto, recupere correctamente el bit) es de al menos . [8] Para otros algoritmos de decodificación, consulte. [8]