La máquina de Turing es un modelo matemático que consiste o se comporta como un autómata finito siendo capaz de implementar cualquier problema matemático expresado a través de un algoritmo y esto lo hace muy simple debido a que manipula símbolos sobre una tira de cinta siguiendo una serie de reglas y es muy potente ya que puede adaptarse y simular la lógica de cualquier algoritmo de computador. La máquina de Turing está compuesta por una cinta que se divide en espacios de trabajo o celdas que se comportan como memoria, un cabezal que es capaz de leer y escribir símbolos en la cinta y moverla de celda en celda a derecha e izquierda, un registro de estado, y una tabla finita de instrucciones o tabla de acción. Aunque la máquina de Turing es considerada como un autómata es muchísimo más superior que el autómata finito o que el autómata con pila puesto que la máquina de Turing es un autómata con la capacidad de reconocer lenguajes formales de acuerdo a la jerarquía de Chomsky Existen diversos tipos de máquinas de Turing: con movimiento stay, con cinta infinita a ambos lados, con cinta multipista, multicinta, determinista y no determinista y la Máquina de Turing Cuántica En resumen, una máquina de Turing es un dispositivo que transforma un INPUT en un OUTPUT, ambos formados por un código binario de unos y ceros. Este modelo está formado por un alfabeto de entrada y uno de salida, un símbolo especial llamado blanco, un conjunto de estados finitos y un conjunto de transiciones entre dichos estados. Su funcionamiento se basa en una función de transición, que recibe un estado inicial y una cadena de caracteres pertenecientes al alfabeto de entrada. Funcionamiento La máquina va leyendo una celda de la cinta en cada paso, borrando el símbolo en el que se encuentra posicionado su cabezal y escribiendo un nuevo símbolo perteneciente al alfabeto de salida para luego desplazar el cabezal a la izquierda o a la derecha. Esto se repite según se indique en la función de transición, para finalmente detenerse en un estado final o de aceptación representado así la salida Problemas de Complejidad Problema computacional Un problema computacional es una deseada relación entre una entrada y una salida. Un algoritmo resuelve un problema computacional si logra producir la relación deseada. Los recursos comúnmente estudiados en complejidad computacional son: – El tiempo: mediante una aproximación al número de pasos de ejecución que un algoritmo emplea para resolver un problema. – El espacio: mediante una aproximación a la cantidad de memoria utilizada para resolver el problema. Los problemas polinómicos y no polinómicos se basan en el estudio del tiempo de ejecución un algoritmo Problemas No polinómicos (NP) Los problemas no polinómicos son el conjunto de problemas que pueden ser resueltos en tiempo polinómico por una máquina de Turing no determinista. Los problemas NP están compuestos por los problemas que tienen un certificado sucinto (también llamado testigo polinómico) para todas las instancias cuya respuesta es un SÍ. La única forma de que tengan un tiempo polinomial es realizando una etapa aleatoria, incluyendo el azar de alguna manera para elegir una posible solución, y entonces en etapas posteriores comprueba si esa solución es correcta.
NP representa una frontera de la tratabilidad. Los problemas que no
pertenecen a NP son claramente intratables; si un problema no se puede verificar de una forma eficiente, parece lógico pensar que su resolución será intratable. Problemas polinómicos (P) Los problemas polinómicos son el conjunto de problemas concretos de decisión para los cuales existe un algoritmo que lo resuelve en tiempo polinomial; es decir los problemas P suelen problemas computacionales que son eficientemente resolubles o tratables