Organización de la materia
Bibliografía
- 'Computational Complexity: A Modern Approach', Arora y Barak, 2007 (Draft)
- 'Introduction To The Theory Of Computation', Sipser, 1996.
- 'The annotated Turing', Petzold, 2008.
Preámbulo
Se recomienda conocer un poco acerca de máquinas de Turing, y el resultado de la existencia de una máquina universal de Turing.
Referirse a CC:AMA, capítulo 1 en particular secciones 1.2 a 1.4.
Computabilidad
- ¿cuales son las cosas que se pueden calcular?
- "f es computable si existe un procedimiento efectivo p tal que p(x) = f(x) para todo x"
- "x ∈ ℝ es computable si existe un procedimiento efectivo p tal que p genera las decimales de x"
- "procedimiento efectivo": algo que se puede hacer en el mundo real
1936: la propuesta de Turing
Turing propuso de manera convincente un modelo de computación que llamó "computing machines".
Su forma de proponerlo era:
- describir el comportamiento y los límites de un calculador humano
- introducir la "computing machine" cómo objeto matemático
- demostrar que los dos tienen el mismo poder computacional
Resultados importantes
- las máquinas de Turing tienen una descripción finita y son enumerables
- la gran mayoría de los números reales es incomputable
- existe una máquina de Turing que puede leer la descripción de cualquier máquina de Turing, y imitar su comportamiento (máquina universal)
Años 1960: complejidad computacional
- ¿cuales son las cosas que se pueden calcular de manera eficaz?
- de manera eficaz = con recursos limitados (tiempo, memoria,...)
- ¿Cual es la dificultad intrinseca de un problema?
- ¿Hay problemas computacionalmente más difíciles que otros?
Ya sabemos medir las cosas siguientes en función de la longitud de la entrada:
- hacer benchmarks de programas
- calcular el tiempo de corrida de un algoritmo que calcula f en función de la longitud de la entrada
- ¿cómo saber si no hay mejor algoritmo para calcular f?
Como los vamos a resolver
- sí nos importa la relación entre el tamaño de la entrada (para cualquiera entrada posible) y los recursos usados para llevar a cabo un cálculo
- queremos que no importe el lenguaje de programación usado para computar
- sin embargo queremos medir o clasificar la complejidad de manera informativa
- necesitamos un modelo que:
- represente los cálculos que se hacen el el mundo real
- permite medir el costo de un cálculo
Lenguages y funciones
- Palabra (o string): x ∈ {0, 1} *
- Lenguage: L ⊆ {0, 1} * (conjunto de palabras)
- Función booleana: f: {0, 1} * ↦ {0, 1}
- f es la función característica de Lf si:
Lf = {x ∣ f(x) = 1, x ∈ {0, 1} * }
- "Computar f" = dado un x ∈ {0, 1} * , computar f(x)
- "Computar f" = "Decidir Lf"
- f es un problema de decisión
Unos lenguajes sobre {0, 1} *
- PAL = {x ∣ x es capicúa }
- ⌊x⌋ = representación de x como string binaria
- EVEN = {⌊x⌋ ∣ x es par }
- SMALLER = {⌊(x, y)⌋ ∣ x ≤ y}
- PRIMES = {⌊x⌋ ∣ x es primo }
- HAM = {⌊G⌋ ∣ G es hamiltoniano }
Los problemas de decisión no son...
...problemas de función (encontrar el x tal que...).
Sin embargo, los problemas de función suelen tener su equivalente en problemas de decisión:
- travelling salesman
- función: dada una lista de ciudades con sus distancias, encontrar el recorrido exaustivo más corto
- decisión: dada una lista de ciudades con sus distancias y una longitud l, existe un recorrido de longitud inferior a l?
Nuestras Máquinas de Turing
Tienen:
- k cintas (1 para el input, lo demas para cálculos intermedios) infinitas, siendo una successión de celdas
- un cabezal por cinta, capaz de leer, escribir y moverse
- un conjunto finito de estados internos
- una funcion de transición que describe su comportamiento
MT: un paso
En función de su estado interno activo y de los símbolos leidos por los cabezales en todas las cintas, y según la función de transición, un paso de una MT consiste en:
- escribir en las cintas
- mover cada una de sus cabezales de 0 o 1 paso (=, ←, →)
- cambiar su estado activo
Una MT es un tuple (Γ , Q, δ) con:
- un alfabeto finito Γ ⊇ {▫, ⊳ , 0, 1}
(▫ "blank", ⊳ "start")
- un conjunto finito de estados Q ⊇ {qstart, qhalt}
- una función de transición
δ: Q × Γ k − 1 ↦ Q × Γ k − 1 × {←, = , →}k
δ(qhalt, _) no está definido
- Configuración inicial:
- primera cinta: ⊳ INPUT ▫ ▫ ▫ ⋅ ⋅
- las demas: ⊳ ▫ ▫ ▫ ⋅ ⋅
- estado activo: qstart
MT que computan
Una MT computa una función f: {0, 1} * ↦ {0, 1} si, dada una configuración inicial con entrada x ∈ {0, 1} * , se detiene después de un número finito de pasos con f(x) escrito en la última cinta.
Una MT computa
f en tiempo
T(n) si su computación en cada entrada
x necesita
cómo máximo T(∣x∣) pasos.
Observación
Nos interesa la cantidad de pasos hechos por una MT, pero el número de estados internos no importa.
Resultado: una MT puede simular n "registros" (estados activos) tomando valores en los conjuntos R1, R2, . . . , Rn con un registro tomando valores en R1 × R2 × . . . × Rn.
MT indiferente
Una MT es indiferente (eng. oblivious) si los movimientos de sus cabezales sólo dependen de la longitud de sus inputs y no de los bits.
Es decir, para todos los inputs de longitud n, existe une función pos: ℕ ↦ ℕ k tal que pos(x) es la posición de los k cabezales en el paso x.
Substitución de MT
Para toda f: {0, 1} * ↦ {0, 1} y T: ℕ ↦ ℕ constructible en tiempo, si f es computable por una MT con k cintas y un alfabeto Γ en tiempo T(n), entonces es computable por:
- una MT con alfabeto {0, 1, ▫, ⊳ } en tiempo 4log∣Γ ∣(T(n))
- una MT con 2 cintas en tiempo O(T(n)2)
- una MT indiferente en tiempo O(T(n)2)
- se puede mejorar en O(T(n). log(T(n))) (Pippenger y Fischer, 1979).
Más resultados similares
Más resultados de cambio de tipo de MT con deceleración polinomial:
- pasar de cintas con k dimensiones a cintas con 1 dimensión
- pasar de memoria en acceso random a memoria en acceso secuencial
- pasar de n estadios activos (= registros) a 1 (constante, sólo aumenta el número de estados)
Linear speed-up theorem (Hartmanis y Stearns, 1965)
Si f es computable por una MT M en tiempo T(n), entonces para cualquiera constante c ≥ 1, f es computable por una MT Mʹ en tiempo T(n) / c.
- Demo:
- Mʹ maneja "word length" más grande que M
- Mʹ tiene cómo alfabeto Γ ∪ Γ m
- paso 1: comprimir cinta input en cinta nueva
- paso 2: simular m pasos de M en 6 pasos de Mʹ (4 para leer, 2 para escribir)
- eligir m = 6c
Clase de complejidad TIME
Sea T: ℕ ↦ ℕ . Un lenguaje L es en TIME(T(n)) si existe una MT que corre en tiempo c⋅T(n) (para un c > 0) y decide L.
P
Una manera formal de definir los calculos rápidos:
P = ⋃ p polinomio TIME(p(n)) = ⋃ c ≥ 1 TIME(nc)
La clase es robusta si cambiamos el tipo de MT que usamos.
Doblar el tamaño del input sólo necesita k veces más tiempo (con k constante):
- inputs de longitud n necesitan tiempo nc
- inputs de longitud 2n necesitan (2n)c = (2c)nc
Con P (y arriba), no importa (tanto) el modelo
Cuando vamos a describir algoritmos para P, no vamos a describir MMTT hasta los últimos detalles.
Cuando tenemos un algoritmo en pseudocódigo cuya complejidad podemos caracterizar, podemos decir que tenemos una MT que implementa ese mismo algoritmo, con una deceleración polinomial.
Codificación
- Tenemos que medir el tamaño de los datos manejados por las MMTT (y/o nuestros algorítmos) en bits.
- Tiene un impacto como representamos los símbolos, números, grafos, conjuntos, mátrices, etc.
- En particular, escribir un número en base binaria es exponencialmente más sucinto que en base unaria. Puede ser que un algorítmo para Lunario corra en tiempo polinomial pero su equivalente para Lbinario en tiempo exponencial!
- Buena noticia, operaciones usuales (eg + , − , . , / ) se pueden hacer en tiempo polinomial con representación binaria
Críticas de "P = problemas fáciles"
- es demasiado permisiva
- es demasiado estricta
¿Dónde está P?
- ¿todos los lenguajes están en P?
- ¿todos los lenguajes decidibles están en P?
Problemas arbitrariamente difíciles
Para toda función T: ℕ ↦ ℕ constructible en tiempo, existe un lenguaje LT decidible que no puede ser decidido por una MT corriendo en tiempo T(n).
Demostración
LT = {⌊M⌋ ∣ M es una MT y M(⌊M⌋) = 1 en T(∣⌊M⌋∣) pasos }
- LT es decidible (usar MT universal)
- LT no se puede decidir en menos de T(n) pasos
- supongamos ∃ N que decide LT en ≤ T(n) pasos.
- entonces ∃ N' (definida gracias a N) tal que:
- si input ∈ LT, corre siempre
- si input ∉ LT, se detiene y imprime 1 (en ≤ T(n) pasos)
- ¿Qué pasa con Nʹ(⌊Nʹ⌋)?
Time hierarchy theorem (Hartmanis y Stearns, 1965)
Generalización del resultado previo:
Si f,g son funciones constructibles en tiempo tales que f(n). log(f(n)) = o(g(n)), entonces
TIME(f(n)) ⊂ ≠ TIME(g(n))
En particular: TIME(nc) ⊂ ≠ TIME(nd) con c < d.
Aplicación
EXPTIME = ⋃ c ≥ 0TIME(2nc).
Consecuencia del time hierarchy theorem:
P ⊂ EXPTIME
Conclusiones
- Noción de complejidad intrinseca de un lenguaje
- Definir una clase de complejidad en tiempo de corrida de una MT, necesita no ser demasiado preciso ni demasiado impreciso
- La clase P es robusta: nos podemos olvidar del alfabeto usado, del número de cintas, de si tenemos acceso indexado a la memoria, etc.
- Lo que se viene:
- clase NP
- reducciones polinomiales
- completitud
- teorema de Cook-Levin
Referencias