O termo "redução" possui um significado duplo crucial, dependendo do contexto:
Redução de Polinômio (Simplificação Algébrica): No campo da álgebra, "reduzir um polinômio" significa simplificar uma expressão algébrica combinando seus termos semelhantes. É um processo fundamental para tornar expressões mais concisas e fáceis de manipular.
Redução Polinomial (Complexidade Computacional): Na Teoria da Complexidade Computacional, uma "redução" é uma transformação de um problema em outro, realizada em tempo polinomial. Seu objetivo principal é comparar o "grau de dificuldade" entre diferentes problemas computacionais. Este é o conceito central quando falamos de classes de problemas como P, NP e NP-Completo, e será o foco principal deste guia, dado o material abrangente fornecido nas fontes.
Compreender essa dualidade é o primeiro passo para dominar o tema. Abordaremos ambos os aspectos, começando pela simplificação algébrica para estabelecer uma base sólida.
No ensino fundamental e médio, a "redução de polinômio" refere-se à simplificação de expressões algébricas. Para isso, é essencial entender o que são monômios e polinômios.
Monômio: Uma expressão algébrica que apresenta apenas um termo. Exemplos incluem 15x³, 6x², -9x e -12. Cada monômio é composto por:
Coeficiente: A parte numérica (ex: 15 em 15x³).
Parte Literal: As variáveis com seus expoentes (ex: x³ em 15x³).
Um monômio com coeficiente zero (ex: 0x³) é um monômio nulo, resultando em um polinômio nulo.
Um termo que não apresenta variável (letra) é chamado de termo independente (ex: -12 em 15x³ + 6x² - 9x - 12).
Polinômio: São expressões algébricas formadas pela adição e subtração de um número finito de monômios. Por exemplo, 15x³ + 6x² - 9x - 12 é um polinômio com quatro monômios.
Quando um polinômio está em sua forma reduzida (ou seja, sem monômios semelhantes), ele pode receber nomes especiais com base no número de termos:
Monômio: Um único termo (ex: 9A²x).
Binômio: Dois termos (ex: 5A³B² - 9A³B² antes da redução, ou 3x + 2y).
Trinômio: Três termos (ex: x² + 2x + 1).
Polinômio (com mais de três termos): Polinômios com quatro ou mais termos não recebem nomes especiais e são genericamente chamados de "polinômios".
A redução de um polinômio é o processo de combinar monômios semelhantes. Monômios são semelhantes quando possuem a mesma parte literal (mesmas variáveis com os mesmos expoentes).
Para reduzir um polinômio:
Identifique termos semelhantes: Observe a parte literal de cada monômio.
Agrupe termos semelhantes: Reorganize a expressão para que os termos semelhantes fiquem próximos.
Opere os coeficientes: Some ou subtraia os coeficientes dos monômios semelhantes e mantenha a parte literal.
Exemplo 1 (Adição/Subtração): Reduzir 12x² - 10x + 4 - 6x² + 14x - x.
Termos semelhantes: 12x² e -6x²; -10x, +14x e -x.
Agrupando: 12x² - 6x² - 10x + 14x - x + 4.
Operando:
(12 - 6)x² = 6x²
(-10 + 14 - 1)x = 3x (Lembre-se que -x tem coeficiente -1)
Resultado reduzido: 6x² + 3x + 4.
Exemplo 2 (Com Multiplicação/Divisão): Reduzir (2x . 4yx) + 5xy - x + (25x : 5).
Resolva as operações dentro dos parênteses primeiro:
(2x . 4yx) = 8yx²
(25x : 5) = 5x
A expressão torna-se: 8yx² + 5xy - x + 5x.
Identifique e agrupe termos semelhantes: 8yx² + 5xy + (-x + 5x).
Opere os coeficientes: (-1 + 5)x = 4x.
Resultado reduzido: 8yx² + 5xy + 4x.
O grau de um polinômio indica seu "tamanho" ou "complexidade" em relação aos expoentes de suas variáveis. Existem dois casos principais para calcular o grau:
Polinômio com a mesma variável: O grau é o maior expoente dessa variável em qualquer monômio.
Exemplo: x⁴ + 2x² - 9x + 1
Expoentes de x: 4, 2, 1 (no -9x), 0 (no +1).
O maior expoente é 4.
Grau do polinômio: 4.
Polinômio com diferentes variáveis (e já na forma reduzida):
Primeiro, calcule o grau de cada monômio separadamente: O grau de um monômio é a soma dos expoentes de suas variáveis.
Em seguida, o grau do polinômio é o maior grau encontrado entre seus monômios.
Exemplo: AB⁷ + X³Y² + XY⁷ + X²Y⁸
AB⁷: A¹B⁷ -> grau 1 + 7 = 8.
X³Y²: X³Y² -> grau 3 + 2 = 5.
XY⁷: X¹Y⁷ -> grau 1 + 7 = 9.
X²Y⁸: X²Y⁸ -> grau 2 + 8 = 10.
O maior grau entre os monômios é 10.
Grau do polinômio: 10.
Atenção: Sempre certifique-se de que o polinômio está na sua forma reduzida antes de calcular seu grau, especialmente no segundo caso.
Agora, mergulharemos no coração da Teoria da Complexidade Computacional, onde a redução polinomial é uma ferramenta poderosa para comparar a dificuldade inerente de problemas computacionais.
Uma redução de um problema Y a um problema X, denotada por Y ≤P X, significa que o problema Y é polinomialmente redutível a X.
Intuição: Significa que o problema Y não é computacionalmente mais difícil que o problema X. Se você pudesse resolver X em tempo polinomial, você também conseguiria resolver Y em tempo polinomial.
Como funciona na prática? Se você tivesse uma "caixa preta" capaz de resolver qualquer instância do problema X, você poderia resolver qualquer instância do problema Y usando um número polinomial de passos e um número polinomial de chamadas a essa caixa preta. A transformação de Y para X (e da solução de X de volta para Y) deve ser computável em tempo polinomial.
Direção da Redução: É crucial entender a direção: nós reduzimos para o problema que queremos mostrar que é o mais difícil. Se Y ≤P X, então X é pelo menos tão difícil quanto Y.
Transitividade: A relação de redução polinomial é transitiva. Isso significa que se Y ≤P X e X ≤P Z, então Y ≤P Z.
As fontes mencionam diferentes tipos de reduções, mas para a Teoria da Complexidade (especialmente NP-Completude), duas são mais proeminentes:
Redução de Turing (ou de Cook): Permite que o algoritmo de um problema chame o algoritmo do outro problema múltiplas vezes (como uma sub-rotina ou "caixa preta"). Se a redução é polinomial e o número de chamadas é polinomial, então um problema pode ser resolvido em tempo polinomial se o outro também for. É mais flexível e mais fraca (no sentido de que pode "unir" mais problemas).
Redução de Karp (ou Many-One): Um tipo mais restrito de redução, onde o algoritmo do problema original faz apenas uma única chamada ao algoritmo do problema alvo. Além disso, uma instância I do problema original Π é uma instância "SIM" se, e somente se, a instância T(I) transformada for uma instância "SIM" do problema alvo Π'. Essa é a forma de redução mais comumente usada para definir classes de complexidade como a NP-Completa.
As reduções devem ser "fáceis" de computar (tempo polinomial) em relação à complexidade dos problemas envolvidos. Se a redução fosse tão difícil quanto resolver o problema original, ela não teria utilidade em classificar a dificuldade.
A redução polinomial é a espinha dorsal da definição e interconexão das principais classes de problemas computacionais.
A Teoria da Complexidade é desenvolvida principalmente sobre problemas de decisão, que são aqueles que possuem uma resposta SIM ou NÃO. Embora muitos problemas práticos sejam de otimização (buscar o melhor valor), eles geralmente podem ser reformulados como problemas de decisão ao adicionar um parâmetro de limite (ex: "Existe um caminho de custo no máximo K?" em vez de "Encontre o caminho de custo mínimo").
Para problemas de decisão, o conceito de certificado é crucial. Um certificado é uma estrutura que "testemunha" que uma instância tem uma resposta "SIM".
Verificação em Tempo Polinomial: Para muitos problemas, mesmo que seja difícil encontrar uma solução, é relativamente fácil verificar se uma suposta solução (o certificado) é correta. Essa verificação deve ser feita em tempo polinomial.
Exemplo: Para o problema do Ciclo Hamiltoniano (HAM-CYCLE):
Entrada: Um grafo G.
Pergunta: G contém um ciclo hamiltoniano (passa por cada vértice exatamente uma vez)?
Certificado (se SIM): A sequência de vértices que forma o ciclo.
Verificação: Em tempo polinomial, você pode verificar se a sequência é uma permutação dos vértices e se todas as arestas consecutivas existem no grafo.
Classe P (Polinomial-Time): Contém os problemas de decisão que podem ser resolvidos (decididos) por um algoritmo determinístico em tempo polinomial. São considerados problemas "facilmente" computáveis.
Exemplos: Ordenação de vetores, multiplicação de matrizes, caminhos mais curtos em grafos.
Importante: Se Y ≤P X e X está em P, então Y também está em P.
Classe NP (Não-Determinística Polinomial-Time): Contém os problemas de decisão para os quais uma solução proposta (certificado) pode ser verificada por um algoritmo determinístico em tempo polinomial.
O nome "Não-Determinística" vem de modelos de computação que podem "adivinhar" ou explorar múltiplas opções simultaneamente. Se uma dessas "adivinhações" leva a uma solução válida, o problema é aceito. A complexidade não-determinística se preocupa com o número mínimo de passos para uma conclusão "Aceitar".
Relação P ⊆ NP: Todo problema que pode ser resolvido em tempo polinomial também pode ter sua solução verificada em tempo polinomial, portanto, P é um subconjunto de NP.
Classe co-NP: Contém os problemas de decisão cujas respostas "NÃO" podem ser verificadas por um algoritmo em tempo polinomial. Em outras palavras, um problema está em co-NP se seu complemento (o problema com a resposta inversa) está em NP.
Exemplo: O problema dos números primos (Primo ∈ co-NP). Se um número não é primo (é composto), seu fator (o certificado) pode ser verificado eficientemente.
Uma questão em aberto na computação é se NP = co-NP.
Esta é uma das questões mais importantes e não resolvidas da Ciência da Computação, com um prêmio de 1 milhão de dólares.
Significado: Se P = NP, isso significa que todo problema cuja solução pode ser rapidamente verificada também pode ser rapidamente resolvida. Isso teria implicações profundas para áreas como criptografia, inteligência artificial e otimização.
A crença geral: A maioria dos cientistas da computação acredita que P ≠ NP, ou seja, existem problemas em NP que não podem ser resolvidos por algoritmos em tempo polinomial.
Consequência: Se P ≠ NP, então os problemas em NP que não estão em P são considerados intratáveis no contexto clássico.
Dentro da vasta classe NP, existe um subconjunto de problemas que concentra toda a dificuldade da classe: os problemas NP-Completos.
Problema NP-Difícil (NP-Hard): Um problema X é NP-Difícil se todo problema em NP pode ser reduzido polinomialmente a X. Isso significa que X é, no mínimo, tão difícil quanto qualquer problema em NP.
Observação Importante: Um problema NP-Difícil não precisa necessariamente estar na classe NP. Por exemplo, problemas de otimização (como encontrar o caminho hamiltoniano mínimo) podem ser NP-Difíceis, mas não problemas de decisão, e, portanto, não pertencem diretamente a NP.
Problema NP-Completo (NP-Complete): Um problema X é NP-Completo se satisfaz duas condições:
X ∈ NP (Ou seja, sua solução pode ser verificada em tempo polinomial).
X ∈ NP-Difícil (Ou seja, todo problema em NP pode ser reduzido polinomialmente a X).
Os problemas NP-Completos são os "mais difíceis" na classe NP. Se um único problema NP-Completo pudesse ser resolvido em tempo polinomial, isso implicaria que P = NP, e todos os problemas em NP se tornariam resolvidos em tempo polinomial.
Equivalência Polinomial: Todos os problemas NP-Completos são polinomialmente equivalentes, o que significa que qualquer um pode ser reduzido polinomialmente a qualquer outro, e vice-versa. Isso forma uma "árvore" de reduções, onde a descoberta de um problema NP-Completo permite "ancorar" as provas de outros.
A redução polinomial é a ferramenta principal para provar que um novo problema é NP-Completo.
Para provar que um problema Π' é NP-Completo, você deve seguir dois passos essenciais:
Prove que Π' está em NP: Demonstre que um certificado para as instâncias "SIM" de Π' pode ser verificado em tempo polinomial.
Prove que Π' é NP-Difícil: Isso é feito mostrando que um problema Π que já é sabidamente NP-Completo pode ser reduzido polinomialmente a Π' (Π ≤P Π').
Passos para a redução:
Crie um algoritmo T (transformação) que receba qualquer instância de Π e a transforme em uma instância de Π'.
Prove que essa transformação T executa em tempo polinomial.
Prove que a instância original de Π é "SIM" se e somente se a instância transformada de Π' for "SIM".
Advertência Crucial: É comum e fácil cometer o erro de reduzir na direção errada! Você deve reduzir o problema NP-Completo JÁ CONHECIDO para o problema que você ESTÁ INTERESSADO em provar que é NP-Completo.
A descoberta do primeiro problema NP-Completo foi um marco fundamental. Isso foi feito independentemente por Stephen Cook (1971) e Leonid Levin (1973).
CIRCUIT-SAT (Problema de Satisfatibilidade de Circuitos): Foi o primeiro problema provado ser NP-Completo.
Definição: Dada uma descrição de um circuito lógico combinacional, existe uma atribuição de valores de entrada (0s ou 1s) que faz com que a saída do circuito seja 1 (verdadeira)?.
Prova (esboço): A prova de que CIRCUIT-SAT é NP-Difícil é complexa, mas a ideia é que a execução de qualquer algoritmo determinístico polinomial (que verifica certificados em NP) pode ser simulada por um circuito lógico em tempo polinomial. Isso significa que se você pode resolver CIRCUIT-SAT, você pode resolver qualquer problema em NP.
Uma vez que CIRCUIT-SAT foi estabelecido como NP-Completo, ele se tornou a base para provar a NP-Completude de inúmeros outros problemas através de reduções polinomialmente eficientes.
A seguir, exploraremos algumas das reduções mais famosas que estabelecem a NP-Completude de problemas cruciais. Esses exemplos são frequentemente abordados em provas e concursos.
Definição: Dada uma fórmula booleana φ com variáveis lógicas e operadores (AND, OR, NOT, etc.), existe uma atribuição de valores (Verdadeiro/Falso ou 0/1) para as variáveis que torna φ verdadeira?.
SAT ∈ NP: Sim, o certificado é a própria atribuição de valores, e a verificação (substituir e avaliar a fórmula) é polinomial.
SAT ∈ NP-Difícil (CIRCUIT-SAT ≤P SAT):
A ideia: Transformar um circuito lógico C em uma fórmula booleana f tal que C é satisfatível se e somente se f é satisfatível.
Processo: Para cada fio no circuito C (entradas, saídas de portas, etc.), cria-se uma variável booleana xᵢ. Para cada porta lógica no circuito, cria-se uma cláusula que força a variável de saída a ter o valor correto em relação às variáveis de entrada (ex: para uma porta AND com entradas x₁, x₂ e saída x₄, cria-se x₄ ↔ (x₁ ∧ x₂)). A fórmula final f é a conjunção de todas essas cláusulas de porta, mais uma cláusula que afirma que o fio de saída final do circuito deve ser verdadeiro.
Essa transformação é polinomial, provando que SAT é NP-Completo.
Definição: Uma fórmula está em 3-CNF se é uma conjunção de cláusulas, e cada cláusula é uma disjunção de exatamente 3 literais distintas (uma literal é uma variável ou sua negação). O problema é decidir se tal fórmula é satisfatível.
3-CNF-SAT ∈ NP: Similar ao SAT, verificar uma atribuição é polinomial.
3-CNF-SAT ∈ NP-Difícil (SAT ≤P 3-CNF-SAT):
A ideia: Transformar uma fórmula f_SAT (qualquer SAT) em uma f_3CNF (3-CNF-SAT) equivalente em tempo polinomial.
Processo (por etapas):
Transformação T1 (para conjunção de cláusulas com no máximo 3 variáveis): Constrói uma "árvore de avaliação" da fórmula f_SAT. Cada nó/fio na árvore é representado por uma nova variável. A fórmula f_T1 resultante é uma conjunção de cláusulas de equivalência, onde cada cláusula tem no máximo 3 variáveis.
Transformação T2 (para CNF): Substitui cada cláusula de f_T1 por uma equivalente em CNF (Forma Normal Conjuntiva). Como as cláusulas têm no máximo 3 variáveis, a tabela verdade tem tamanho constante, e a conversão para CNF (usando De Morgan, por exemplo) é polinomial.
Transformação T3 (para exatamente 3 literais por cláusula): Para cláusulas com menos de 3 literais, introduz novas variáveis e as duplica de forma inteligente para ter exatamente 3 literais, mantendo a satisfatibilidade equivalente. Por exemplo, (L1) vira (L1 ∨ p ∨ q) ∧ (L1 ∨ p ∨ ¬q) ∧ (L1 ∨ ¬p ∨ q) ∧ (L1 ∨ ¬p ∨ ¬q). (L1 ∨ L2) vira (L1 ∨ L2 ∨ q) ∧ (L1 ∨ L2 ∨ ¬q). Para cláusulas com mais de 3 literais (L1 ∨ L2 ∨ ... ∨ Lk) (k > 3), introduz variáveis auxiliares para dividi-la em várias cláusulas de 3 literais.
Todas as etapas são polinomialmente computáveis, provando que 3-CNF-SAT é NP-Completo.
Definição: Dada um grafo não-direcionado G e um inteiro k, G contém uma clique de tamanho pelo menos k? (Uma clique é um subgrafo completo, onde todos os pares de vértices estão conectados por uma aresta).
CLIQUE ∈ NP: O certificado é o conjunto de k vértices. A verificação é polinomial (checar se todos estão conectados).
CLIQUE ∈ NP-Difícil (3-CNF-SAT ≤P CLIQUE):
A ideia: Transformar uma fórmula f em 3-CNF com m cláusulas em um grafo G e um parâmetro k=m, tal que f é satisfatível se e somente se G tem uma clique de tamanho m.
Construção de G:
Para cada cláusula Cᵢ em f, crie 3 vértices no grafo G, um para cada literal da cláusula (v_i,1, v_i,2, v_i,3).
Crie uma aresta entre dois vértices u e v se eles satisfazem duas condições:
u e v vêm de cláusulas diferentes.
As literais correspondentes a u e v não são complementares (ex: não pode ser x e ¬x).
Prova da equivalência: Se f é satisfatível, existe uma atribuição que torna pelo menos uma literal verdadeira em cada cláusula. Escolhendo um vértice correspondente a uma literal verdadeira de cada cláusula, formamos um conjunto de m vértices. Por construção, esses vértices formam uma clique. Reciprocamente, se há uma clique de tamanho m em G, ela deve conter um vértice de cada cláusula. Atribuir "verdadeiro" às literais correspondentes a esses vértices da clique torna a fórmula satisfatível.
A construção é polinomial, provando a NP-Completude de CLIQUE.
Definição: Dado um grafo G e um inteiro k, G contém uma cobertura de vértices de tamanho no máximo k? (Um conjunto de vértices S é uma cobertura se toda aresta em G tem pelo menos uma de suas extremidades em S).
VERTEX COVER ∈ NP: O certificado é o conjunto de k vértices. A verificação (checar todas as arestas) é polinomial.
VERTEX COVER ∈ NP-Difícil (CLIQUE ≤P VERTEX COVER):
A ideia: Baseia-se em uma relação fundamental: Um conjunto de vértices S é uma clique em um grafo G se e somente se o conjunto de vértices remanescentes V \ S é uma cobertura de vértices no grafo complementar G'. O grafo complementar G' tem o mesmo conjunto de vértices que G, mas uma aresta existe em G' se e somente se não existia em G.
Construção: Dada uma instância 〈G, k〉 para CLIQUE, transforme-a em 〈G', |V| - k〉 para VERTEX COVER.
Prova da equivalência:
Se G tem uma clique K de tamanho k, então C = V \ K não tem arestas internas em G. Isso significa que todas as arestas em G têm pelo menos uma extremidade em C. Consequentemente, C é uma cobertura em G' de tamanho |V| - k. (Nota: A fonte tem uma pequena discrepância, indicando C como cobertura em G, mas o teorema é que V-S é VC em G complementar). A redução de Kleinberg e Tardos (Fonte 1) afirma: S é um conjunto independente se e somente se V-S é um vértice-cobertura. E Independent Set é NP-completo. A equivalência CLIQUE <=P VERTEX COVER usa o complemento do grafo. Uma clique em G é um conjunto independente em G' e vice-versa. E um conjunto independente S em um grafo é um vértice-cobertura V \ S em outro. A prova de Miyazawa ( em português) é mais clara: U é uma clique de tamanho k em G se e somente se V - U é uma cobertura de vértices de tamanho n-k em G (o complemento).
Se G' tem uma cobertura C' de tamanho |V| - k, então K' = V \ C' é um conjunto sem arestas em G' (independent set em G'). Isso significa que K' é uma clique em G de tamanho k.
Essa redução polinomial estabelece a NP-Completude de VERTEX COVER.
Definição: Dado um grafo G e um inteiro k, G contém um conjunto independente (ou estável) de tamanho pelo menos k? (Um conjunto de vértices S é independente se não há arestas entre quaisquer dois vértices em S).
INDEPENDENT SET ∈ NP: O certificado é o conjunto de k vértices. A verificação (checar ausência de arestas) é polinomial.
INDEPENDENT SET ∈ NP-Difícil (VERTEX COVER ≤P INDEPENDENT SET):
A ideia: É diretamente ligada à relação entre conjunto independente e cobertura de vértices. Um conjunto S é um conjunto independente em um grafo G se e somente se seu complemento V \ S é uma cobertura de vértices em G.
Construção: Dada uma instância 〈G, k〉 para VERTEX COVER, transforme-a em 〈G, |V| - k〉 para INDEPENDENT SET.
Prova: Se G tem uma cobertura de vértices C de tamanho k, então V \ C é um conjunto independente de tamanho |V| - k. Reciprocamente, se G tem um conjunto independente S de tamanho k, então V \ S é uma cobertura de vértices de tamanho |V| - k.
Portanto, Independent Set e Vertex Cover são equivalente difíceis.
Definição: Dado um universo U de elementos, e uma coleção S₁,..., Sm de subconjuntos de U, existe uma subcoleção de no máximo k desses conjuntos cuja união é igual a U?.
SET COVER ∈ NP: O certificado é a lista dos k conjuntos escolhidos. A verificação (checar se eles cobrem U) é polinomial.
SET COVER ∈ NP-Difícil (VERTEX COVER ≤P SET COVER):
A ideia: Transformar um problema de cobertura de vértices em um problema de cobertura de conjuntos.
Construção: Dada uma instância 〈G=(V,E), k〉 para VERTEX COVER:
Defina o universo U como o conjunto de todas as arestas de G (U = E).
Para cada vértice u ∈ V, crie um conjunto S_u que contém todas as arestas adjacentes a u.
Prova da equivalência: Se existe uma coleção de k conjuntos S_u1, ..., S_uk que cobre U, então os vértices u₁, ..., uk formam uma cobertura de vértices de tamanho k. Reciprocamente, se u₁, ..., uk é uma cobertura de vértices de tamanho k, então os conjuntos S_u1, ..., S_uk cobrem U.
A construção é polinomial, provando a NP-Completude de SET COVER.
Definição: Dado um grafo G, G contém um ciclo hamiltoniano (passa por cada vértice exatamente uma vez)?.
HAM-CYCLE ∈ NP: O certificado é a sequência de vértices do ciclo. A verificação é polinomial.
HAM-CYCLE ∈ NP-Difícil (VERTEX COVER ≤P HAM-CYCLE):
A ideia: Construir um grafo G' a partir de G e k (parâmetro de VERTEX COVER) de tal forma que G tem uma cobertura de vértices de tamanho k se e somente se G' tem um ciclo hamiltoniano. Esta redução é notoriamente complexa e envolve a construção de "widgets" (subestruturas de grafo).
Cada aresta de G é mapeada para um "widget" W_uv em G'. Os vértices de G se tornam "séries" de widgets conectados em G'. São introduzidos k vértices "seletores" que conectam as pontas dessas séries.
A complexidade de G' é polinomial no tamanho de G. Essa prova estabelece a NP-Completude de HAM-CYCLE.
Definição: Dado um grafo completo com custos nas arestas e um custo máximo k, existe um tour que visita cada cidade exatamente uma vez com custo total no máximo k?.
TSP ∈ NP: O certificado é o tour. A verificação (somar custos e checar se visita todos os vértices) é polinomial.
TSP ∈ NP-Difícil (HAM-CYCLE ≤P TSP):
A ideia: Transformar uma instância de Ciclo Hamiltoniano em uma instância de Caixeiro Viajante.
Construção: Dada uma instância G = (V,E) para HAM-CYCLE, construa uma instância (G', c, k) para TSP:
V' é o mesmo que V (as cidades são os vértices).
G' é um grafo completo sobre V (todas as cidades conectadas).
Defina a função de custo c(u,v):
c(u,v) = 0 se a aresta {u,v} existe em E (do grafo original G).
c(u,v) = 1 se a aresta {u,v} não existe em E.
Defina o custo máximo k = 0.
Prova da equivalência:
Se G tem um ciclo hamiltoniano, esse ciclo usa apenas arestas com custo 0 em G'. Portanto, G' tem um tour de custo 0.
Se G' tem um tour de custo 0, todas as arestas desse tour devem ter custo 0, o que significa que todas elas estavam presentes no grafo original G. Logo, G é hamiltoniano.
A construção é polinomial, provando a NP-Completude de TSP.
Definição: Dado um conjunto S de inteiros positivos e um inteiro t, existe um subconjunto S' ⊆ S cuja soma dos elementos é exatamente t?.
SUBSET-SUM ∈ NP: O certificado é o subconjunto S'. A verificação (somar os elementos e comparar com t) é polinomial.
SUBSET-SUM ∈ NP-Difícil (3-CNF-SAT ≤P SUBSET-SUM):
A ideia: Transformar uma fórmula φ em 3-CNF em um conjunto de números S e um alvo t tal que φ é satisfatível se e somente se um subconjunto de S soma t.
Construção: Esta é uma redução sofisticada que cria números em uma base grande (tipo base 10 ou outra) onde cada "dígito" representa uma variável ou uma cláusula.
Para cada variável xᵢ em φ, cria-se dois números vᵢ e v'ᵢ. O dígito associado a xᵢ é 1 para vᵢ e v'ᵢ, e 0 para outras variáveis. Os dígitos associados às cláusulas (Cⱼ) são 1 se a literal xᵢ ou ¬xᵢ aparece em Cⱼ.
Para cada cláusula Cⱼ, criam-se números sⱼ e s'ⱼ que só têm dígitos não-zero na coluna Cⱼ (1 ou 2, respectivamente).
O alvo t tem 1s nas colunas de variáveis e 4s nas colunas de cláusulas.
Prova da equivalência: A prova mostra que a soma dos números é construída de tal forma que "não há vai um" entre as colunas de variáveis e cláusulas, permitindo que a escolha de números em S (que somam t) corresponda diretamente à atribuição de valores (Verdadeiro/Falso) que satisfazem a fórmula.
A construção é polinomial, provando a NP-Completude de SUBSET-SUM.
Richard Karp (1972) identificou 21 problemas NP-Completos logo após Cook, solidificando a teoria. A lista inclui:
Satisfatibilidade em forma normal conjuntiva (SAT)
Programação Inteira 0-1
Clique
Empacotamento de Conjuntos
Cobertura de Vértices
Cobertura de Conjuntos
3-Satisfatibilidade (3-CNF-SAT)
Coloração de Grafos
Caminho Hamiltoniano
Problema do Caixeiro Viajante (TSP)
Partição
Mochila (Knapsack)
Conjunto Dominante
É crucial entender que as reduções polinomialmente eficientes são ferramentas teóricas poderosíssimas para classificar problemas, mas geralmente não são algoritmos práticos para resolver problemas.
Vantagem Teórica: Permitem provar que problemas são igualmente difíceis (ou que um é mais difícil que outro) e estabelecer a NP-Completude.
Desvantagem Prática:
Perda de Conhecimento de Domínio: A transformação de um problema para outro pode fazer com que se perca informações e estruturas específicas do problema original que poderiam ser exploradas por algoritmos mais diretos.
Aumento de Tamanho/Complexidade: Embora a transformação seja polinomial, a instância transformada pode ser consideravelmente maior ou mais complexa, tornando o algoritmo resultante mais lento do que uma abordagem direta para o problema original.
Algoritmos Existentes: Muitas vezes, existem algoritmos mais eficientes e diretos para um problema Y do que reduzi-lo a um problema X e resolvê-lo lá.
Alguns problemas podem parecer NP-Completos à primeira vista, mas, na verdade, têm algoritmos eficientes (estão na classe P). É importante conhecer essas "exceções" para concursos:
2-CNF-SAT (2-SAT): Similar ao 3-CNF-SAT, mas cada cláusula contém no máximo 2 literais. Embora o 3-CNF-SAT seja NP-Completo, o 2-SAT pode ser resolvido em tempo polinomial.
MAX-2-SAT: Dada uma fórmula em 2-SAT e um inteiro k, decidir se é possível satisfazer pelo menos k cláusulas. Embora 2-SAT esteja em P, o MAX-2-SAT é NP-Completo. Isso mostra que pequenas variações na definição de um problema podem alterar drasticamente sua complexidade.
Caminho Hamiltoniano em grafos orientados acíclicos: Enquanto o problema geral do Caminho Hamiltoniano é NP-Completo, em grafos orientados acíclicos (DAGs), ele pode ser resolvido em tempo polinomial.
Embora o foco principal seja a complexidade computacional, o termo "redução" continua a evoluir em campos avançados. Recentemente, surgiu um método para reduzir programas algébricos a programas polinomiais.
Programas Algébricos: Problemas de otimização ou viabilidade onde os objetivos ou restrições são funções algébricas (definidas como zeros de polinômios multivariados, podendo incluir raízes, quocientes, etc.).
A Nova Redução: O método propõe uma reformulação sistemática de programas algébricos em programas polinomiais, introduzindo apenas uma única nova variável para cada função algébrica distinta, em vez de uma variável para cada radical distinto (abordagem "ingênua").
Passos:
Encontrar um polinômio definidor: Para cada expressão radical, encontra-se um polinômio do qual ela é uma raiz.
Isolar a função algébrica: Introduzir desigualdades polinomiais adicionais para garantir que a raiz escolhida seja a que representa a função algébrica original, distinguindo-a de outras raízes do mesmo polinômio definidor.
Essa técnica é relevante porque a complexidade dos algoritmos de otimização polinomial depende crucialmente do número de variáveis. Reduzir o número de variáveis pode levar a ganhos significativos de desempenho (até 50x em exemplos testados). Isso demonstra como o conceito de "redução" continua a ser uma área ativa de pesquisa para tornar problemas computacionalmente desafiadores mais tratáveis.
Para quem se prepara para concursos públicos, o domínio da Redução Polinomial na complexidade computacional é frequentemente cobrado. Priorize os seguintes pontos:
Definições Claras:
P, NP, co-NP, NP-Difícil, NP-Completo. Entenda as definições e as relações hierárquicas entre elas (P ⊆ NP, NP-Completo ⊆ NP-Difícil).
O Problema P = NP: Entenda o que significa a pergunta e suas implicações. Saiba que é um problema em aberto.
Conceito de Certificado: Compreenda o que é um certificado e por que ele é fundamental para a classe NP.
Redução Polinomial (≤P):
Sua definição formal e intuitiva.
A propriedade de transitividade.
A diferença entre redução de Karp e Turing (e por que Karp é crucial para NP-Completude).
A direção correta da redução para provar NP-Completude (sempre de um problema conhecido NP-Completo para o novo problema).
Estratégia para Provar NP-Completude: Os dois passos (∈ NP e NP-Difícil via redução).
Problemas Clássicos NP-Completos: Conheça os principais exemplos e, idealmente, as ideias por trás de suas reduções mais famosas:
CIRCUIT-SAT (primeiro, base de tudo).
SAT e 3-CNF-SAT.
CLIQUE e VERTEX COVER (redução entre si, via grafo complementar).
INDEPENDENT SET (equivalência com VERTEX COVER).
HAM-CYCLE (Ciclo Hamiltoniano) e TSP (Caixeiro Viajante).
SUBSET-SUM (Soma de Subconjuntos).
Exceções e Casos Especiais: Lembre-se que pequenas variações podem mudar a complexidade do problema (ex: 2-SAT em P, mas MAX-2-SAT em NP-Completo).
Um problema de decisão é um tipo de problema computacional que tem uma resposta simples de SIM ou NÃO para qualquer instância dada. Por exemplo, "Este grafo contém um ciclo hamiltoniano?" é um problema de decisão.
Em problemas NP, um certificado é uma evidência ou uma solução proposta que, se a resposta para a instância for "SIM", pode ser usada para verificar a validade dessa resposta em tempo polinomial. Por exemplo, para o problema do Ciclo Hamiltoniano, o certificado seria a própria sequência de vértices que forma o ciclo.
Não. P = NP é uma das maiores questões não resolvidas na Ciência da Computação e na matemática. A maioria dos cientistas da computação acredita que P ≠ NP, mas ainda não há uma prova formal.
Um problema NP-Difícil é aquele ao qual todos os problemas em NP podem ser reduzidos polinomialmente. Isso significa que ele é pelo menos tão difícil quanto qualquer problema em NP. Um problema NP-Difícil não precisa necessariamente pertencer à classe NP.
Um problema NP-Completo é um problema que satisfaz duas condições: 1) ele está na classe NP (ou seja, sua solução pode ser verificada em tempo polinomial) E 2) ele é NP-Difícil. Os problemas NP-Completos são considerados os problemas "mais difíceis" dentro da classe NP.
As reduções polinomiais são cruciais porque permitem comparar a dificuldade relativa entre problemas computacionais. Elas são a ferramenta fundamental para:
Provar a NP-Completude: Ao reduzir um problema NP-Completo conhecido a um novo problema, podemos provar que o novo problema é NP-Completo.
Classificar Problemas: Permitem organizar os problemas em classes de complexidade e entender o quão eficientemente eles podem ser resolvidos (ou não).
Implicar Resultados: Se um problema X é polinomialmente redutível a Y, e Y é facilmente resolúvel, então X também é. Inversamente, se X é provadamente difícil, e Y é polinomialmente redutível a X, então Y também é difícil.
Não. A Enciclopédia Britannica, em uma de suas definições citadas, descreve NP-completude como "qualquer uma das classes de problemas computacionais para os quais nenhum algoritmo de solução eficiente foi encontrado". Esta é uma definição incorreta e amadora. Ela não captura a formalidade das classes de complexidade, ignora a diferença entre NP-Hardness e NP-Completude, e falha em mencionar a crucial propriedade de redutibilidade polinomial.
A Redução de Polinômio, em seu sentido mais abrangente, é um pilar da computação moderna. Desde a simples simplificação de expressões algébricas até as complexas Reduções Polinomiais na Teoria da Complexidade Computacional, este conceito nos permite organizar, classificar e, em última instância, compreender a dificuldade inerente dos problemas que tentamos resolver com computadores.
Dominar as reduções é fundamental para qualquer estudante de Ciência da Computação, e essencial para profissionais que buscam otimizar algoritmos e para candidatos que almejam sucesso em concursos públicos. Esperamos que este guia completo e didático tenha iluminado os caminhos para sua compreensão, tornando a complexidade um pouco mais simples e acessível. Continue explorando, questionando e construindo o futuro da computação!