De fato, há pouca conexão. Para um entendimento completo, deixe-me explicar a conexão entre programas e circuitos .
Um programa (ou algoritmo ou máquina ) é um mecanismo para calcular uma função. Por definição, vamos assumir que a entrada é uma string binária , e a saída é uma saída booleana b . O tamanho da entrada é potencialmente ilimitado. Um exemplo é um programa que determina se a entrada é a codificação binária de um número primo.xb
Um circuito (booleano) é uma coleção de instruções para calcular alguma função finita . Podemos imaginar o circuito como um circuito elétrico ou pensá-lo como uma sequência de instruções (essa visão é chamada de programa confuso em linha reta ). Concretamente, podemos assumir que a entrada é uma string binária de comprimento n , e a saída é booleana. Um exemplo é um circuito que determina se a entrada codifica um número primo (assim como antes, somente agora a entrada deve ter o comprimento n ).x nn
Podemos converter um programa em um circuito P n que simula P em entradas de comprimento n . A sequência correspondente dos circuitos P 0 , P 1 , P 2 , ... não é arbitrária - todos eles podem ser construídos por um programa que forneceu n saídas P n . Chamamos tal sequência de um dos circuitos de um uniforme circuito (confusa, que muitas vezes pensam da sequência como um "único" circuito P n para um indefinido n ).PPnPnP0 0, P1, P2, …nPnPnn
Nem toda sequência de circuitos é uniforme. De fato, uma sequência de circuitos pode calcular todas as funções, de cadeias de caracteres a booleanas, computáveis ou não-computáveis! No entanto, na teoria da complexidade, estamos interessados em modelos não uniformes nos quais os circuitos são restritos. Por exemplo, a pergunta P = NP afirma que problemas completos de NP não podem ser resolvidos por algoritmos de tempo polinomial. Isso implica que problemas NP-completos não podem ser resolvidos por circuitos uniformes de tamanho polinomial. Além disso, é conjecturado que problemas completos de NP não possam ser resolvidos por circuitos polinomiais de tamanho sem a exigência de uniformidade .
Modelos de computação completos de Turing são modelos que realizam todas as funções computáveis (e não mais). Por outro lado, sistemas completos de portões (como AND, OR, NOT ou NAND) permitem calcular funções finitas arbitrárias usando circuitos feitos com esses portões. Tais sistemas completos podem calcular funções completamente arbitrárias usando sequências (irrestritas) de circuitos.