Un código comprobable localmente es un tipo de código de corrección de errores en el que se puede determinar si una cadena es una palabra en ese código observando una pequeña cantidad (con frecuencia constante) de bits de la cadena. En algunas situaciones, es útil saber si los datos están dañados sin decodificarlos por completo para poder tomar las medidas adecuadas en respuesta. Por ejemplo, en la comunicación, si el receptor encuentra un código dañado, puede solicitar que se vuelvan a enviar los datos, lo que podría aumentar la precisión de dichos datos. De manera similar, en el almacenamiento de datos, estos códigos pueden permitir recuperar los datos dañados y reescribirlos correctamente.
Por el contrario, los códigos decodificables localmente utilizan una pequeña cantidad de bits de la palabra clave para recuperar de manera probabilística la información original. La fracción de errores determina la probabilidad de que el decodificador recupere correctamente el bit original; sin embargo, no todos los códigos decodificables localmente se pueden probar localmente. [1]
Claramente, cualquier palabra de código válida debe aceptarse como palabra de código, pero las cadenas que no son palabras de código podrían tener un error de solo un bit, lo que requeriría muchas pruebas (ciertamente más de un número constante). Para tener esto en cuenta, la falla de prueba solo se define si la cadena tiene un error de al menos una fracción establecida de sus bits. Esto implica que las palabras del código deben ser más largas que las cadenas de entrada, agregando algo de redundancia.
Para medir la distancia entre dos cuerdas se utiliza la distancia de Hamming
La distancia de una cadena a un código se calcula mediante
Las distancias relativas se calculan como una fracción del número de bits.
Un código se denomina -local -comprobable si existe una máquina de Turing M dado acceso aleatorio a una entrada que realiza como máximo consultas no adaptativas y satisface lo siguiente: [2]
Además, la velocidad de un código es la relación entre la longitud de su mensaje y la longitud de la palabra de código.
Sigue siendo una cuestión abierta si existen códigos de tamaño lineal que se puedan probar localmente, pero hay varias construcciones que se consideran "casi lineales": [3]
Ambos se han logrado, incluso con una complejidad de consulta constante y un alfabeto binario , como con for any . El siguiente objetivo casi lineal es lineal hasta un factor polilogarítmico ; . Nadie ha logrado aún un código linealmente comprobable que satisfaga esta restricción. [3]
En noviembre de 2021, dos preimpresiones informaron [4] [5] [6] [7] la primera construcción en tiempo polinomial de " -LTC", es decir, códigos comprobables localmente con tasa constante , distancia constante y localidad constante .
Los códigos comprobables localmente tienen mucho en común con las pruebas comprobables probabilísticamente (PCP). Esto debería ser evidente a partir de las similitudes de su construcción. En ambos, se nos dan consultas aleatorias no adaptativas en una cadena grande y si queremos aceptar, debemos hacerlo con una probabilidad de 1, y si no, debemos aceptar no más de la mitad de las veces. La principal diferencia es que los PCP están interesados en aceptar si existe un tal que . Los códigos comprobables localmente, por otro lado, aceptan si es parte del código. Muchas cosas pueden salir mal al suponer que una prueba PCP codifica un código comprobable localmente. Por ejemplo, la definición de PCP no dice nada sobre pruebas inválidas, solo entradas inválidas.
A pesar de esta diferencia, los códigos comprobables localmente y los PCP son lo suficientemente similares como para que, con frecuencia, para construir uno, un probador construya el otro sobre la marcha. [8]
Uno de los códigos de corrección de errores más famosos, el código Hadamard , es un código que se puede probar localmente. En el código Hadamard, una palabra clave x se codifica como la función lineal (mod 2). Esto requiere enumerar el resultado de esta función para cada posible y, lo que requiere exponencialmente más bits que su entrada. Para probar si una cadena w es una palabra clave del código Hadamard, todo lo que tenemos que hacer es probar si la función que codifica es lineal. Esto significa simplemente verificar si para x e y hay vectores uniformemente aleatorios (donde denota XOR bit a bit ).
Es fácil ver que para cualquier codificación válida , esta ecuación es verdadera, ya que esa es la definición de una función lineal. Sin embargo, algo más difícil es demostrar que una cadena que está -lejos de C tendrá un límite superior en su error en términos de . Un límite se encuentra mediante el enfoque directo de aproximar las probabilidades de que exactamente una de las tres sondas arroje un resultado incorrecto. Sean A, B y C los eventos de , , y que sean incorrectos. Sea E el evento de que ocurra exactamente uno de estos. Esto resulta en
Esto funciona para , pero poco después, . Con trabajo adicional, se puede demostrar que el error está limitado por
Para cualquier valor dado , esto solo tiene una probabilidad constante de falsos positivos, por lo que podemos simplemente verificar un número constante de veces para obtener la probabilidad por debajo de 1/2. [3]
El código Long es otro código con una explosión muy grande que está cerca de ser comprobable localmente. Dada una entrada (nótese que esto requiere bits para representarse), la función que devuelve el bit de la entrada, , se evalúa en todas las posibles entradas de -bit , y la palabra de código es la concatenación de estas (de longitud ). La forma de probar esto localmente con algunos errores es elegir una entrada aleatoria uniforme y establecer , pero con una pequeña posibilidad de invertir cada bit, . Acepte una función como una palabra de código si . Si es una palabra de código, esto aceptará siempre que no haya cambiado, lo que sucede con una probabilidad . Esto viola el requisito de que las palabras de código siempre se acepten, pero puede ser lo suficientemente bueno para algunas necesidades. [9]
Otros códigos comprobables localmente incluyen los códigos Reed-Muller (consulte los códigos decodificables localmente para obtener un algoritmo de decodificación), los códigos Reed-Solomon y el código corto.