En teoría de complejidad computacional , la clase NC (por "Nick's Class") es el conjunto de problemas de decisión decidibles en tiempo polilogarítmico en una computadora paralela con un número polinomial de procesadores. En otras palabras, un problema con tamaño de entrada n está en NC si existen constantes c y k tales que se puede resolver en tiempo O ((log n ) c ) usando O ( n k ) procesadores paralelos. Stephen Cook [1] [2] acuñó el nombre "clase de Nick" en honor a Nick Pippenger , quien había realizado una extensa investigación [3] sobre circuitos con profundidad polilogarítmica y tamaño polinomial. [4]
Así como la clase P puede considerarse como los problemas tratables ( tesis de Cobham ), NC puede considerarse como los problemas que pueden resolverse eficientemente en una computadora paralela. [5] NC es un subconjunto de P porque los cálculos paralelos polilogarítmicos pueden simularse mediante cálculos secuenciales de tiempo polinomial. Se desconoce si NC = P , pero la mayoría de los investigadores sospechan que esto es falso, lo que significa que probablemente haya algunos problemas tratables que sean "inherentemente secuenciales" y no se puedan acelerar significativamente mediante el uso del paralelismo. Así como la clase NP-completa puede considerarse como "probablemente intratable", la clase P-completa , cuando se utilizan reducciones NC , puede considerarse como "probablemente no paralelizable" o "probablemente inherentemente secuencial".
Se puede suponer que la computadora paralela de la definición es una máquina de acceso aleatorio paralela ( PRAM ). Es decir, una computadora paralela con un conjunto central de memoria y cualquier procesador puede acceder a cualquier bit de memoria en tiempo constante. La definición de NC no se ve afectada por la elección de cómo la PRAM maneja el acceso simultáneo a un solo bit por parte de más de un procesador. Puede ser CRCW, CREW o EREW. Consulte PRAM para obtener descripciones de esos modelos.
De manera equivalente, NC puede definirse como aquellos problemas de decisión decidibles por un circuito booleano uniforme (que puede calcularse a partir de la longitud de la entrada, para NC, suponemos que podemos calcular el circuito booleano de tamaño n en el espacio logarítmico en n ) con profundidad polilogarítmica y un número polinomial de puertas con un fan-in máximo de 2.
RNC es una clase que extiende NC con acceso a la aleatoriedad.
Al igual que con P , mediante un ligero abuso del lenguaje, se podrían clasificar los problemas de función y los problemas de búsqueda como pertenecientes a NC . Se sabe que NC incluye muchos problemas, entre ellos
A menudo, los algoritmos para esos problemas debían inventarse por separado y no podían adaptarse de manera ingenua a partir de algoritmos bien conocidos: la eliminación gaussiana y el algoritmo euclidiano se basan en operaciones realizadas en secuencia. Se podría contrastar el sumador de acarreo de ondulación con un sumador de acarreo anticipado .
Un ejemplo de problema en NC 1 es la comprobación de paridad en una cadena de bits. [6] El problema consiste en contar el número de 1 en una cadena formada por 1 y 0. Una solución sencilla consiste en sumar todos los bits de la cadena. Como la adición es asociativa, . Aplicando recursivamente dicha propiedad, es posible construir un árbol binario de longitud en el que cada suma entre dos bits y sea expresable por medio de operadores lógicos básicos , por ejemplo mediante la expresión booleana .
NC i es la clase de problemas de decisión decidibles por circuitos booleanos uniformes con un número polinomial de puertas de como máximo dos entradas y profundidad O ((log n ) i ) , o la clase de problemas de decisión resolubles en tiempo O ((log n ) i ) en una computadora paralela con un número polinomial de procesadores. Claramente, tenemos
que forma la jerarquía NC .
Podemos relacionar las clases NC con las clases espaciales L y NL [7] y AC . [8]
Las clases NC están relacionadas con las clases AC, que se definen de manera similar, pero con puertas que tienen un abanico de entrada ilimitado. Para cada i , tenemos [5] [8]
Como consecuencia inmediata de esto, tenemos que NC = AC . [9] Se sabe que ambas inclusiones son estrictas para i = 0. [5]
De manera similar, tenemos que NC es equivalente a los problemas resolubles en una máquina de Turing alterna restringida a un máximo de dos opciones en cada paso con espacio O (log n ) y alternancias. [10]
Una de las principales preguntas abiertas en la teoría de la complejidad es si cada contención en la jerarquía NC es apropiada o no. Papadimitriou observó que, si NC i = NC i +1 para algún i , entonces NC i = NC j para todo j ≥ i , y como resultado, NC i = NC . Esta observación se conoce como colapso de la jerarquía NC porque incluso una sola igualdad en la cadena de contenciones
implica que toda la jerarquía NC "se derrumba" hasta un cierto nivel i . Por lo tanto, hay dos posibilidades:
Se cree ampliamente que (1) es el caso, aunque todavía no se ha descubierto ninguna prueba de la verdad de ninguna de las afirmaciones.
La clase especial NC 0 opera únicamente con una longitud constante de bits de entrada. Por lo tanto, se la describe como la clase de funciones definibles por circuitos booleanos uniformes con profundidad constante y entrada en abanico limitada.
Un programa de ramificación con n variables de ancho k y longitud m consta de una secuencia de m instrucciones. Cada una de las instrucciones es una tupla ( i , p , q ) donde i es el índice de la variable a comprobar (1 ≤ i ≤ n ), y p y q son funciones de {1, 2, ..., k } a {1, 2, ..., k }. Los números 1, 2, ..., k se denominan estados del programa de ramificación. El programa comienza inicialmente en el estado 1, y cada instrucción ( i , p , q ) cambia el estado de x a p ( x ) o q ( x ), dependiendo de si la i ésima variable es 0 o 1. La función que asigna una entrada a un estado final del programa se denomina rendimiento del programa (más precisamente, el rendimiento de una entrada es la función que asigna cualquier estado inicial al estado final correspondiente). El programa acepta un conjunto de valores variables cuando existe un conjunto de funciones tales que una secuencia variable está en A precisamente cuando su resultado está en F.
Una familia de programas ramificados consta de un programa ramificado con n variables para cada n . Acepta un lenguaje cuando el programa con n variables acepta el lenguaje restringido a entradas de longitud n .
Es fácil demostrar que cada lenguaje L en {0,1} puede ser reconocido por una familia de programas ramificados de ancho 5 y longitud exponencial, o por una familia de ancho exponencial y longitud lineal.
Todo lenguaje regular en {0,1} puede ser reconocido por una familia de programas de ramificación de ancho constante y número lineal de instrucciones (ya que un DFA puede convertirse en un programa de ramificación). BWBP denota la clase de lenguajes reconocibles por una familia de programas de ramificación de ancho limitado y longitud polinómica. [11]
El teorema de Barrington [12] dice que BWBP es exactamente no uniforme NC 1 . La prueba utiliza la no solubilidad del grupo simétrico S 5 . [11]
El teorema es bastante sorprendente. Por ejemplo, implica que la función mayoritaria puede calcularse mediante una familia de programas ramificados de ancho constante y tamaño polinómico, mientras que la intuición podría sugerir que para lograr un tamaño polinómico se necesita un número lineal de estados.
Un programa de ramificación de ancho constante y tamaño polinomial se puede convertir fácilmente (mediante dividir y vencer) en un circuito en NC 1 .
Por el contrario, supongamos que se da un circuito en NC 1. Sin pérdida de generalidad, supongamos que utiliza solo puertas AND y NOT.
Lema 1 — Si existe un programa de ramificación que a veces funciona como una permutación P y a veces como una permutación Q , al multiplicar por la derecha las permutaciones en la primera instrucción por α , y en la última instrucción por la izquierda por β , podemos hacer un circuito de la misma longitud que se comporta como β P α o β Q α , respectivamente.
Llamemos a un programa de ramificación que calcula α un circuito C si funciona como identidad cuando la salida de C es 0, y como α cuando la salida de C es 1.
Como consecuencia del Lema 1 y del hecho de que todos los ciclos de longitud 5 son conjugados , para cualesquiera dos 5-ciclos α , β , si existe un programa de ramificación α-que calcula un circuito C , entonces existe un programa de ramificación β-que calcula el circuito C , de la misma longitud.
Lema 2 : existen 5 ciclos γ , δ tales que su conmutador ε = γδγ −1 δ −1 es un ciclo de 5. Por ejemplo, γ = (1 2 3 4 5), δ = (1 3 5 4 2) dando ε = (1 3 2 5 4).
Ahora demostraremos el teorema de Barrington por inducción:
Supongamos que tenemos un circuito C que toma entradas x 1 ,..., x n y asumimos que para todos los subcircuitos D de C y 5-ciclos α, existe un programa de ramificación α-computando D . Demostraremos que para todos los 5-ciclos α, existe un programa de ramificación α-computando C .
Al suponer que los subcircuitos tienen programas de ramificación de modo que son α- computadores para todos los 5 ciclos α ∈ S 5 , hemos demostrado que C también tiene esta propiedad, como se requiere.
El tamaño del programa de ramificación es como máximo 4 d , donde d es la profundidad del circuito. Si el circuito tiene una profundidad logarítmica, el programa de ramificación tiene una longitud polinómica.