P versus NP es la siguiente pregunta que interesa a las personas que trabajan con ordenadores y en matemáticas: ¿Cualquier problema resuelto cuya respuesta pueda ser comprobada rápidamente por un ordenador puede también ser resuelto rápidamente por un ordenador? P y NP son los dos tipos de problemas matemáticos a los que se hace referencia: Los problemas P son rápidos de resolver para los ordenadores, por lo que se consideran "fáciles". Los problemas NP son rápidos (y por tanto "fáciles") de comprobar para un ordenador, pero no son necesariamente fáciles de resolver.

En 1956, Kurt Gödel escribió una carta a John von Neumann. En esta carta, Gödel preguntaba si un determinado problema completo NP podía resolverse en tiempo cuadrático o lineal. En 1971, Stephen Cook introdujo el enunciado preciso del problema P versus NP en su artículo "The complexity of theorem proving procedures".

En la actualidad, muchos consideran este problema como el más importante de los abiertos en la ciencia de la computación. Es uno de los siete problemas del Premio del Milenio seleccionados por el Instituto de Matemáticas Clay, dotado con un premio de 1.000.000 de dólares para la primera solución correcta.

Definición formal y conceptos clave

De forma más precisa:

  • P (polynomial time): conjunto de problemas de decisión que pueden resolverse por una máquina determinista en tiempo polinómico respecto al tamaño de la entrada. Informalmente: existen algoritmos eficientes (p. ej., n, n^2, n^3, ...) que devuelven la respuesta correcta.
  • NP (nondeterministic polynomial time): conjunto de problemas de decisión cuyas soluciones, una vez propuestas, pueden verificarse en tiempo polinómico por una máquina determinista. Equivalente: pueden resolverse en tiempo polinómico por una máquina no determinista.

Un punto importante es la distinción entre resolver y comprobar. Para muchos problemas difíciles no conocemos un procedimiento rápido para hallar la solución desde cero, pero sí podemos comprobar rápidamente si una solución propuesta es válida.

NP-completo y NP-duro

Dentro de NP existe una subclase especialmente relevante: los problemas NP-completos. Un problema es NP-completo si cumple dos condiciones:

  • Está en NP.
  • Todo problema de NP se reduce a él en tiempo polinómico (es decir, cualquier problema de NP puede transformarse en una instancia de este problema de forma eficiente).

Los problemas NP-completos son, en cierto sentido, los "más difíciles" de NP: si alguno de ellos se puede resolver en tiempo polinómico, entonces P = NP y todos los problemas de NP serían eficientes. Por otro lado, un problema es NP-duro si al menos tan difícil como los problemas de NP; puede no pertenecer a NP (por ejemplo, problemas de optimización).

Ejemplos frecuentes

  • SAT (satisfiabilidad booleana): dado un enunciado booleano, ¿existe una asignación de valores que lo haga verdadero? Fue el primer problema probado NP-completo (teorema de Cook–Levin).
  • Problema del viajante (TSP) en su versión de decisión: ¿existe un recorrido de coste ≤ K que visite todas las ciudades? Es NP-completo.
  • Problemas de particionado, coloración de grafos, clique máxima, entre otros, son NP-completos en sus versiones de decisión.
  • Factorización de enteros es verificada rápidamente (si te dan los factores), por lo que está en NP, pero no se sabe si es NP-completo; además tiene importancia práctica en criptografía.

Historia breve y resultados conocidos

El trabajo de Stephen Cook (1971) y de Leonid Levin (independientemente) estableció la noción de NP-completo y demostró el estatus central de SAT. Desde entonces se han identificado cientos de problemas NP-completos mediante reducciones polinómicas.

No se ha demostrado si P = NP o P ≠ NP en el marco de la teoría de la complejidad general; es un problema abierto. Sin embargo, existen resultados parciales que separan clases en modelos restringidos (por ejemplo, teoremas de jerarquía de tiempo, límites en circuitos booleanos en casos concretos) y evidencia heurística y práctica sugiere que muchos problemas NP-completos no admiten algoritmos polinómicos eficientes.

Consecuencias de cada caso

  • Si P = NP: habría algoritmos polinómicos para todos los problemas de NP. Esto tendría un impacto inmenso: se acelerarían tareas en optimización, demostración automática de teoremas, diseño, biología computacional, etc. También pondría en riesgo muchos sistemas criptográficos actuales que dependen de la supuesta dificultad de ciertos problemas (p. ej., factorización, logaritmos discretos).
  • Si P ≠ NP: confirmaríamos formalmente que existen problemas intrínsecamente difíciles cuya solución no se puede obtener eficientemente aunque sea fácil comprobarla. Esto justificaría la búsqueda de algoritmos aproximados, heurísticos y métodos específicos que funcionen bien en casos prácticos.

Reducciones y metodología

La técnica central para mostrar que un problema es NP-completo es la reducción: demostrar que un problema ya conocido como NP-completo se transforma en el nuevo problema en tiempo polinómico. Por eso la clasificación de problemas se construye en cadena a partir de resultados fundacionales como el de Cook–Levin.

Impacto práctico

En la práctica, aunque muchos problemas son NP-completos, hay varias estrategias útiles:

  • Algoritmos exactos con mejor constante o margen exponencial que funcionan en entradas de tamaño moderado.
  • Algoritmos aproximados que garantizan soluciones cercanas al óptimo.
  • Heurísticos y métodos metaheurísticos (recocido simulado, algoritmos genéticos, búsquedas locales) que suelen funcionar bien en instancias reales.
  • Restricciones del problema que lo hacen tractable (p. ej., grafos con estructura especial, tamaños limitados de parámetro), lo que da lugar a la complejidad parametrizada.

Estado actual y conclusión

El problema P versus NP sigue siendo uno de los grandes desafíos teóricos. Su resolución tendría efectos profundos tanto teóricos como prácticos. Mientras tanto, la investigación continúa en direcciones complementarias: entender límites de cálculo, mejorar algoritmos para instancias reales, desarrollar pruebas de complejidad en modelos restringidos y estudiar impactos en áreas aplicadas como la criptografía y la optimización.

Para quien quiera profundizar, empezar por leer el trabajo de Cook y textos introductorios sobre complejidad computacional es una buena ruta: entender las definiciones formales, las máquinas de Turing deterministas y no deterministas, y el concepto de reducción polinómica es esencial para seguir el tema.