Anda di halaman 1dari 10

1

Completude NP
A questão: P = N P ?

Discutimos agora as relações entre as classes P e NP, já definidas. Inicialmente temos:

Lema 1: P ⊆ N P

Prova: seja Χ ∈ P um problema de decisão, então existe um algoritmo ∆ que representa a solução de
Χ, em tempo polinomial. Então, em particular, ∆ pode ser utilizado como algoritmo de
reconhecimento para uma justificativa à resposta SIM de Χ. Logo, Χ ∈ NP.

A pergunta natural seguinte seria P ≠ NP ? Ou seja, existe algum problema na classe NP que seja
intratável? Ou, caso contrário, todo problema em NP admite necessariamente algoritmo polinomial?
Isto é, a exigência do que uma justificativa SIM pode ser reconhecida em tempo polinomial é
suficiente para garantir a existência de um algoritmo polinomial para Χ?

Até o momento não se conhece a resposta a essa pergunta. Todas as evidências apontam na
direção P ≠ NP. O principal argumento para se formular essa conjectura é que a classe NP
incorpora um conjunto enorme de problemas, para os quais inúmeros pesquisadores têm
desenvolvido esforços para elaborar algoritmo eficientes. E apesar desses esforços contínuos
não foi possível a formulação de algoritmos polinomiais para qualquer deles. Os problemas desse
conjunto pertencem então a NP – P, o que conduz à conjectura P ≠ NP.

Outra questão, quão complexo pode ser um problema da classe NP. Ou seja, admitindo que P ≠ NP,
seria possível ao menos resolver em tempo exponencial, todo problema da classe NP? O lema a seguir
responde afirmativamente a esta pergunta:

Lema 2: seja Χ ∈ NP um problema de decisão. Então uma resposta SIM ou


NÃO para Χ pode ser obtida em tempo exponencial

Prova: se Χ ∈ NP então existe um algoritmo ∆ que reconhece se é verdadeira uma justificativa J a


resposta SIM a Χ, tal que ∆ é polinomial no tamanho da entrada de Χ. Seja k o tamanho de J que é
necessariamente também polinomial com a entrada de Χ. Ora, J é escrita através de uma seqüência
apropriada que contém letras, números ou símbolos especiais. Obviamente, existe um conjunto C, de
cardinalidade fixa, que contém os elementos que podem compor J. A idéia então é considerar todas
as seqüências possíveis que podem corresponder ou não a uma justificativa, a ser reconhecida como
verdadeira.

Se houver uma justificativa reconhecida como tal, então obviamente Χ possui solução SIM. Se
todas as justificativas forem reconhecidas como falsas então Χ possui resposta NÃO. O número
total dessas seqüências é {C}k. O reconhecimento de cada seqüência é polinomial no tamanho Χ. Isso
prova o lema.

Complementos de problemas

Como mencionado, a definição da classe NP exige que a justificativa SIM deva ser reconhecida em
tempo polinomial, enquanto nada se exige da justificativa NÃO. Esse fato sugere a possibilidade de
se inverter os papéis desempenhados pelas mesmas, o que conduz a uma nova classe de problemas.
Assim sendo, define-se a classe Co-NP como sendo aquela que compreende todos os problemas de
decisão Χ, tais que existe uma justificativa à resposta NÃO, cujo passo de reconhecimento
corresponda a um algoritmo polinomial no tamanho da entrada de Χ.
2
Completude NP
Por analogia, define-se o complemento Χ de um problema de decisão X como sendo o problema de
decisão cujo objetivo é o complemento da decisão do Χ. Ou seja, Χ e Χ possuem SIM e NÃO
trocados. Isto é, a resposta ao problema X é SIM se e somente se a resposta a X for NÃO.

Uma conseqüência direta dessa definições é que a classe Co-NP compreende exatamente os
complementos dos problemas da classe NP, isto é, Χ ∈ NP se e somente se Χ ∈ Co-NP.

Pode-se formular para a classe Co-NP um lema semelhante ao primeiro que apresentamos, ou seja, é
imediato verificar que P ⊆ Co-NP. Assim sendo, se um problema de decisão Χ admitir solução
polinomial, então obviamente Χ ∈ P e Χ ∈ ( NP ∩ Co-NP). Por outro lado, existem problemas
que sabidamente pertencem a classe NP, mas que se desconhece a pertinência ou não a classe NP de
seus complementos. Considerando esses últimos e trocando NP por Co-NP, é possível, por analogia,
construir exemplos de problemas da classe Co-NP, mas cuja pertinência ou não a Co-NP de seus
complementos seja desconhecida. Também há exemplos de problemas Χ para os quais se desconhece
a pertinência ou não a classe NP, tanto de Χ quanto do complemento Χ. Como exemplo considere o
problema clique, que vimos anteriormente. Seu complemento é o problema clique:

problema: clique
dados: um grafo G(V, E) e um inteiro k > 0
decisão: G possui uma clique de tamanho ≥ k ?

Já foi observado que clique ∈ NP. Para que clique também pertença a essa classe, seria necessária a
existência de um algoritmo que reconhecesse em tempo polinomial com o tamanho de G, uma
conveniente justificativa SIM à pergunta formulada na decisão acima. Observe que esta pergunta á
equivalente à seguinte questão: “todas as cliques de G possuem tamanho < k ?”. Uma justificativa
óbvia para a mesma consiste em listar todas as cliques de G. O algoritmo de reconhecimento
consiste em certificar que todas as cliques de G foram listadas e em computar o tamanho de cada
uma, comparando-o com k. Contudo, como também já foi observado, o número de cliques pode ser
exponencial no número de vértices do grafo. Logo, esse processo é de complexidade também
exponencial, o que o invalida. Por outro lado, não é conhecido algoritmo alternativo para tal
reconhecimento, que seja polinomial no tamanho do grafo. Mas tampouco se conhece qualquer prova
de sua não existência. Conseqüentemente, não é sabido clique ∈ NP.

Um exemplo de problema X para o qual é desconhecida a pertinência a NP tanto de X, quanto de X é


o clique máxima. Exemplos do caso oposto (isto é, de problemas X tais que X e X ambos pertencem a
NP) são inúmeros. Como foi mencionado, P ⊆ NP e P ⊆ Co-NP. Logo, qualquer problema X ∈ P satisfaz
X ∈ NP e X ∈ NP. Há porém, problemas X, tais que é desconhecido se X ∈ P, mas sabe-se que ambos
X, X ∈ NP. Um exemplo deste caso é o problema dos números compostos:

problema: números compostos


dados: um número inteiro k > 0
decisão: existem inteiros o, q >1 tais que k = p*q
?

É imediato verificar que números compostos ∈ NP. Para tanto, basta observar que o passo de
exibição de uma justificativa SIM consiste em listar os inteiros p e q. O passo de reconhecimento
corresponde, então, a efetuar o produto p*q e compará-lo com k. Por outro lado, o complemento de
números compostos é o seguinte:
3
Completude NP

problema: números compostos (números primos)


dados: um número inteiro k > 0
decisão: k é primo?

Embora não seja trivial, é conhecido um algoritmo que reconhece uma justificativa SIM para esse
problema, em tempo polinomial com a entrada. Isto permite concluir que o mesmo pertence à classe
NP. Contudo, não se conhece, até o momento, algoritmo que possa resolver o problema em tempo
polinomial. Em resumo, ambos números compostos e números primos pertencem a classe NP. Contudo,
não é sabido se pertencem ou não a classe P. Conclui-se que as seguintes questões não foram
resolvidas até o momento:
i. NP = Co-NP ?
ii. P = NP ∩ Co-NP ?

Observe que as expressões (i) e (ii) não são independentes da questão P = NP ?

De fato, se P = NP então necessariamente NP = Co-NP e portanto ambas (i) e (ii) possuem resposta
SIM. Contudo, outras combinações são também possíveis.

Conjectura-se que de fato NP ≠ Co-NP e P ≠ NP ∩ Co-NP, como vemos na ilustração abaixo:

Redução Polinomial

Sejam os problemas de decisão Χ1(D1, Q1) e Χ2(D2, Q2). Suponha que seja conhecido um algoritmo A2
para resolver o Χ2. Se for possível transformar o problema Χ1 em Χ2 e sendo conhecido um processo
de transformar a solução de Χ2 numa solução de Χ1, então o algoritmo A2 pode ser utilizado para
resolver o problema Χ1. Observe que como o objetivo consiste em resolver Χ1, através de A2, o que
se supõe dado é uma instância de Χ1 para a qual se deseja conhecer a resposta. A partir da instância
I1 ∈ D1, elabora-se a instância I2 ∈ D2. Aplica-se então o algoritmo A2 para resolver Χ2. O retorno
ao problema Χ1 é realizado através da transformação da solução de Χ2 para a de Χ1. Se a
transformação de Χ1 em Χ2, bem como a da solução de Χ2 na de Χ1. Se a transformação de Χ1 em Χ2
bem como o da solução de Χ2 na de Χ1 puder ser realizada em tempo polinomial, então diz-se, que
existe uma redução polinomial de Χ1 em Χ2, e que Χ1 é redutível em Χ2.

Formalmente uma redução polinomial de um problema de decisão X1(D1, Q1) problema de decisão
X2(D2, Q2) é uma função f: d1 → d2 tal que as seguintes condições são satisfeitas:
i. pode ser computada em tempo polinomial, e
ii. para cada instância I ∈ D1 do problema X1 possui resposta SIM se e somente se X2(f(I))
também o possuir
4
Completude NP
Esquematizando temos:

Redução algoritmo solução redução solução


X1 X2 para para
polinomial A2 X2 polinomial X1

Note as transformações de maior interesse são precisamente as polinomiais. Isto ocorre porque elas
preservam a natureza (polinomial ou não) do algoritmo A2 do problema X2, quando utilizado para
resolver X1. Dessa forma se o algoritmo A2 for polinomial e se existir a redução polinomial, então X1
também pode ser resolvido em tempo polinomial. Denota-se Χ1 α Χ2 para indicar que X1 pode ser
reduzido em X2. Note ainda que a relação α é transitiva ( isto é, Χ1 α Χ2 e Χ2 α Χ3 ⇒ Χ1 α Χ3).

Para ilustrar um processo simples de redução polinomial, considere como X1 e X2, respectivamente os
problemas clique e conjunto independente de vértices, apresentados anteriormente. A instância I de
clique consiste de um grafo G (V, E) de um inteiro k > 0. Para obter a instância f(I) de conjunto
independente, considera-se o grafo complemento G de G e o mesmo inteiro k. É então evidente que f
é uma redução polinomial porque:
i. G pode ser obtido a partir de G, em tempo polinomial, e
ii. G possui uma clique de tamanho ≥ k se e somente se G possui um conjunto
independente de vértices de tamanho ≥ k

Portanto, se existir um algoritmo A2 que resolve conjunto independente em tempo polinomial, então
este algoritmo pode ser utilizado para resolver clique também em tempo polinomial. Então clique
conjunto α conjunto independente. Observe que quando Χ1 α Χ2 a transformação f deve ser aplicada
sobre uma instância I genérica de Χ1. A instância que se obtém de Χ2 contudo é particular, pois é
fruto da redução particular f utilizada. Assim sendo, de certa forma, Χ2 pode ser considerado como
um problema de dificuldade maior ou igual a Χ1. Pois que, mediante f, um algoritmo que resolve a
instância particular de Χ2, obtida através de f, resolve também a instância de X1 dada.

Considere agora dois problemas Χ1 e Χ2, tais que Χ1 α Χ2 e Χ2 α Χ1. Então Χ1 e Χ2 são denominados
problemas equivalentes. Segue-se que, segundo a observação acima, dois problemas equivalentes são
de idêntica dificuldade (no que se refere à existência ou não de algoritmo polinomial para resolvê-
los). Note que quando Χ1 α Χ2, a particularização de Χ2 construída pela transformação f é
equivalente ao problema geral Χ1. Isto é, representado por f(D1) o conjunto imagem de f: D1 → D2, o
problema Χ1(D1, Q1) é equivalente à particularização ( f(D1), Q2), do problema Χ2(D2, Q2), como
ilustramos a seguir:

Reduções polinomiais de linguagens

Uma redução polinomial de alguma linguagem L1 sobre um alfabeto Σ1, para outra linguagem L2 sobre
um alfabeto Σ2, é uma função f: Σ*1 → Σ*2 que pode ser computada por máquina de Turing em tempo
polinomial, para a qual w ∈ L1 se somente se f(w) ∈ L2 para cada w ∈ Σ*1.

Se há uma redução polinomial de uma linguagem L1 para uma linguagem L2, dizemos que L1 reduz para
L2 e escrevemos L1 α L2.
5
Completude NP
Teorema: se L1 α L2 e L2 está em P, então L1 está em P.

Prova: desde que L1 α L2, há uma redução polinomial f de L1 para L2 que pode ser computada por
alguma máquina de Turing Mf em tempo polinomial. Em particular, há um polinômio p(x) tal que Mf
computa f(w) em tempo p(|w|) para cada w ∈ L1. Por outro lado, o comprimento de f(|w|) não pode
ser maior que p(|w|) + |w| ( Mf não pode escrever mais que p(|w|) símbolos em p(|w|) passos;
portanto a saída de Mf quando é dada entrada w, não será maior que p(|w|) mais o comprimento da
entrada original |w|). Agora seja M2 uma máquina de Turing que aceita L2 em tempo polinomial.
Então, há um polinômio q(x) tal que M2 aceita cada v em L2 em até q(|v|) passos. Entretanto a
máquina composta → M1M2 aceita cada w ∈ L1 em até p(|w|) + q(p(|w|) + |w|) passos, que é um
polinômio em |w| como requerido. Assim, → M1M aceita L1 em tempo polinomial, e L está em P.

A maior aplicação desse teorema é usá-lo como ferramenta para mostrar que certas linguagens
estão em P. se podemos mostrar que existe uma redução polinomial de alguma linguagem L1 para
outra linguagem L2, então podemos provar que ambas as linguagens estão em P apenas mostrando que
L está em P. Assim concluímos que estas reduções providenciam um meio de atacar a classificação
de mais que um problema ao mesmo tempo.

O teorema provado acima é o teorema de S. A. Cook que identifica uma linguagem (um problema de
decisão) na classe NP para o qual qualquer outra linguagem em NP pode ser reduzida por alguma
redução polinomial.

Vamos adotar uma notação para apresentar o problema da satisfabilidade:


ƒ primeiro considere um conjunto V = {v1, v2, ..., vn} de variáveis Booleanas (ou lógicas) e defino uma
“atribuição de verdade” para V como uma função de V no conjunto {verdadeiro = v, falso = f}, e
ainda que a representação da negação de uma variável vi será vi.
ƒ assim se a atribuição de verdade associa a vi o valor 1, então vi será 0, e vice versa.
ƒ variáveis e suas negações são chamados de literais.
ƒ definimos uma condição sobre V para um conjunto não vazio de literais associado com V. se a
condição contem dois ou mais literais, prevemos uma conexão entre eles com as palavras “ou”
como “v1 ou v3 ou v4”.
ƒ uma condição é dita ser satisfeita por uma atribuição de verdade se ao menos um dos literais é
verdade sob aquela atribuição.

Podemos agora apresentar o problema de decisão associado com o teorema de Cook:

Dado um conjunto V de variáveis e uma coleção de condições sobre V, há uma atribuição de verdade
que satisfaça as condições?

Esse problema é conhecido como o problema da satisfabilidade (ou apenas SAT). Podemos codificar
qualquer instância de SAT como uma cadeia simples, considerando { v1, v2, ..., vn} o conjunto de
variáveis, denotando cada literal por uma cadeia de comprimento m de acordo com o esquema:
ƒ cada literal vi é representado por uma cadeia de 0’s exceto para p (positivo) na i-ésima posição;
ƒ cada literal vi é representado por uma cadeia de 0’s exceto por um n (negativo) na i-ésima
posição.
Então cada condição é representada por uma lista de literais, separados por “/”. Finalmente toda a
instância do SAT é representada por uma lista dessas condições nas quais cada condição é colocada
6
Completude NP
entre “( )” a instância do SAT contendo variáveis v1, v2 e v3 e condições “v1 ou v2”, “v2 ou v3” e “v1 ou
v3 ou v2” seria representada pela cadeia:
(p00/0n0)(0p0/00p)(n00/00n/0p0)

Denotaremos a linguagem que consiste daquelas cadeias representando instâncias de SAT que tem
satisfeito as atribuições de verdade como LSAT. Portanto,
(p00/0n0)(0p0/00p)(n00/00n/0p0)

está em LSAT porque a instância correspondente de SAT pode ser satisfeita pela atribuição de
verdade que associa v1 a f, v2 a f e v3 a v. A cadeia
(0p0/00p)(00n/0p0/n00)(p00/0n0)

também está em LSAT desde que representa a mesma instância de SAT como a cadeia anterior. Más,
a cadeia
(p00/0p0)(n00/0p0)(p00/0n0)(n00/0n0)

não está em LSAT desde que nenhuma atribuição satisfaz “v1 ou v2”, “v1 ou v2”, “v1 ou v2” e “v1 ou v2”
simultaneamente.

Vamos agora apresentar as “atribuições de verdade” por cadeias de p’s e n’s nas quais um p na i-
ésima posição indica que a variável vi é verdadeira que um n na i-ésima posição indica que vi é falsa.
Então para testar se uma instância codificada de SAT satisfaz ou não determinada atribuição,
meramente lemos a cadeia que representa a instância do problema da esquerda para a direita
enquanto verificamos cada condição para ver se contem um literal em que p ou n correspondem a
posição na “atribuição de verdade”, observe a ilustração a seguir:

Baseando nessa técnica construímos uma máquina de Turing não-determinística que aceita LSAT em
um tempo polinomial. Vamos empregar uma máquina de Turing de duas fitas que poderia:
1. iniciar cada computação verificando que sua entrada representando uma coleção de
condições,
2. escrever, de forma não-determinística, uma cadeia de p’s e n’s de comprimento igual ao
número de variáveis nas condições sob a fita 2, e
3. mover a cabeça do fita 1 através da entrada enquanto testa para verificar a atribuição de
verdade da fita 2 satisfaz as condições que estão sendo lidas.
7
Completude NP
Ilustramos a seguir o processo:

configuração inicial fita 1: ∆(p00)/0n0)(0p0/00p)(n00/00n/0p0)∆∆ ...


fita 2: ∆∆∆ ...
escreve atribuição fita 1: ∆(p00)/0n0)(0p0/00p)(n00/00n/0p0)∆∆ ...
na fita 2 fita 2: ∆nnp∆∆ ...
primeira condição fita 1: ∆(p00)/0n0)(0p0/00p)(n00/00n/0p0)∆∆ ...
é satisfeita fita 2: ∆nnp∆∆ ...
segunda condição fita 1: ∆(p00)/0n0)(0p0/00p)(n00/00n/0p0)∆∆ ...
é satisfeita fita 2: ∆nnp∆∆ ...
terceira condição fita 1: ∆(p00)/0n0)(0p0/00p)(n00/00n/0p0)∆∆ ...
é satisfeita fita 2: ∆nnp∆∆ ...
máquina pára tendo todas fita 1: ∆(p00)/0n0)(0p0/00p)(n00/00n/0p0)∆∆ ...
condições satisfeitas fita 2: ∆nnp∆∆ ...

esse processo pode ser implantado de forma que a complexidade de tempo das computações de
aceitação são limitadas por uma função polinomial do comprimento da cadeia de entrada. Concluímos
que LSAT está em NP, podemos agora apresentar e provar o teorema de Cook:

Se L é qualquer linguagem em NP, então L α LSAT

Na prova deste teorema, consideramos uma máquina de Turing não-determinística M e um polinômio


p(x) tal que para cada w ∈ L, M aceita w em até p(|w|) passos. Em adição assumimos que M não tem
uma terminação anormal como salientamos em teorema anterior.

Construímos uma redução polinomial f de L para LSAT baseado na estrutura de M. Mais


precisamente, para cada w ∈ L, f(w) será uma coleção de condições que podem ser simultaneamente
satisfeitas se e somente se há uma computação pela qual M aceita w. As condições em f(w) serão
designadas para representar as seguintes possibilidades:
1. A qualquer tempo durante a computação a máquina M está em um e somente um estado, a
cabeça da fita está sobre somente uma célula e cada célula da fita contem somente um
símbolo;
2. A máquina começa sua computação de um estado inicial, com sua cabeça de fita sobre a
célula mais à esquerda que contem um branco (∆) seguido da cadeia de entrada w, seguida
de brancos;
3. A cada passo da computação, a posição da cabeça de fita no estado corrente e a fita contem
mudanças de acordo com o programa da máquina;
4. A computação alcança um estado de parada da máquina

Um conjunto de condições que represente essas possibilidades poderá ser satisfeito se e somente
se w é uma cadeia em L(M). Portanto para definir f(w) precisamos transladar essas possibilidades
para dentro das condições.
8
Completude NP
Desde a descoberta desse teorema, muitas linguagens em NP tem sido encontradas para possuir as
mesmas propriedades que LSAT. Existe atualmente um grande número de linguagens em NP que são
conhecidas para ser reduzidas polinomialmente em qualquer outra linguagem em NP, essas linguagens
são ditas NP completas.

A classificação de linguagens NP completas é um importante tópico da pesquisa atual. Se qualquer


uma dessas linguagens pode ser aceita por uma máquina de Turing determinística em tempo
polinomial, então NP deve ser igual a P, e muitos problemas que parecem consumir tanto tempo que
são intratáveis, poderão ser mostrados tratáveis. conseqüentemente, se qualquer linguagem em NP
pode ser mostrada fora de P, então toda as linguagens NP completas devem também estar fora de P,
e sabemos que a pesquisa continua por soluções mais eficientes. Em contrapartida reforçamos uma
vez mais o conceito da classe P, que consiste das linguagens que podem ser aceitas em um tempo
polinomial por uma máquina de Turing, e intuitivamente podemos considerar que é a classe de
problemas que tem uma solução computacional prática.

Problema NP - Completo

Observe que é possível utilizar a relação α para dividir NP em classes de problemas equivalentes
entre si. Obviamente, os problemas pertencentes a P formam uma dessas classes. E, nesse sentido,
podem ser considerados como os de “menor dificuldade” em NP. Em contrapartida, existe outra
classe de problemas equivalentes entre si, que correspondem aos de “maior dificuldade” dentre
todos em NP. Os problemas dessa nova classe são denominados NP-completo, cuja definição é a
seguinte:

Um problema de decisão X é denominado NP-completo quando as seguintes condições forem ambas


satisfeitas:
i. X ∈ NP
ii. Todo problema de decisão X’ ∈ NP satisfaz X’ α X.

Observe que (ii) implica que todo problema da classe NP pode ser transformado polinomialmente no
problema X NP-completo. Isto é, se um problema NP-completo X puder ser resolvido em tempo
polinomial então todo problema de NP admite também um algoritmo polinomial (e conseqüentemente,
nesta hipótese, P = NP). E também reciprocamente. Vale pois, X ∈ P se e somente se P = NP. Isto
justifica o fato de que a classe NP-completo corresponde aos problemas de maior dificuldade dentre
os pertencentes a NP.

Caso somente a condição (ii) da definição acima, seja considerada (não importando se (i) é ou não
satisfeita), o problema X é denominado NP-difícil. conseqüentemente, a “dificuldade” de um
problema NP-difícil é maior ou igual a de um NP-completo.

Nossa atenção agora deve voltar-se para a identificação de problemas que pertencem a NP-
completo. Como a única informação que dispomos é a definição da classe, o processo de identificação
de tais problemas envolveria a aplicação da mesma. Contudo, esbarra-se numa dificuldade. A
condição (ii) da definição requer que seja provado que todo problema de NP pode ser
polinomialmente transformado no problema candidato a pertencer à classe NP-completo. Esta tarefa
seria por demais árdua para ser aplicada a cada possível candidato a NP-completo. O lema a seguir
contorna essa questão:

Lema 3: sejam X1 , X2 problemas de decisão ∈ NP. Se X1 é NP-completo e Χ1 α Χ2


então Χ2 é também NP-completo
9
Completude NP
Prova: como Χ2 ∈ NP, para mostrar que Χ2 é NP-completo, basta provar que Χ’ α Χ2, para todo X’∈
NP. Como X1 é NP-completo, então necessariamente X’α Χ1. Como Χ1 α Χ2, por transitividade tem-se
Χ’ α Χ2.

Esse lema, por sinal simples, é muito poderoso. Como conseqüência, para provar que um certo
problema X é NP-completo, ao invés de utilizar a mencionada condição (ii) da definição (que exige
uma prova de que todo problema X’∈ NP é polinomialmente transformável em X), basta, demonstrar
que um problema NP-completo é polinomialmente redutível em X. Em suma, para mostrar que um
problema X é NP-completo é suficiente provar que:
i. X ∈ NP, e
ii. um problema sabidamente NP-completo X’ é tal que X’ α X.

Observe que se apenas (ii) for realizado, então X é NP-difícil, mas não necessariamente NP-
completo. Contudo, para que este esquema de prova possa ser utilizado, é necessário escolher algum
problema X’ que seja sabidamente NP-completo. Portanto, para se identificar algum primeiro
problema desta classe, o processo acima não se aplica. Essa primeira identificação é dada pelo
teorema a seguir:

Teorema: o problema da satisfabilidade é NP-completo

A prova deste teorema, um tanto longa (não será apresentada), consiste de uma transformação
polinomial genérica, de um problema da classe NP em satisfabilidade.

Uma vez identificado um primeiro membro da classe NP-completo, o reconhecimento de outros


problemas da classe pode ser realizado da maneira mais simples, através da aplicação do processo
acima citado. Assim sendo, tem-se:

Lema 4: o problema clique é NP-completo.

Prova: os dados de clique são um grafo e um inteiro positivo. Seja C uma clique do grafo. Pode-se
reconhecer se C é uma clique e computar o seu tamanho, em tempo polinomial no tamanho da entrada
de clique. Logo clique ∈ NP. É necessário agora verificar que algum problema NP-completo pode ser
polinomialmente redutível em clique. Seja então uma instância genérica de satisfabilidade. Esta é
constituída de uma expressão booleana E na fnc, compreendendo as cláusulas L1, L2, .. , Lp. a questão
de decidir se um certo grafo G (V, E) possui ou não uma clique de tamanho ≥ p. O grafo G é
construído, a partir da expressão E, da seguinte maneira. Existe um vértice diferente em G, para
cada ocorrência de literal de G. Existe uma aresta diferente (vi, vj) em G, para cada par de literais
bi, bj de E, tais que bi ≠ bj , e bi, bj ocorrem em cláusulas diferentes de E. Como decorrência, cada
aresta (vi, vj) ocorrem de G é tal que os literais bi, bj, correspondentes em E, estão em cláusulas
diferentes e podem assumir o valor verdadeiro simultaneamente. E reciprocamente. Logo, uma clique
de G com p vértices corresponde em E, a p literais, um em cada cláusula, os quais podem assumir o
valor verdadeiro simultaneamente. E reciprocamente. Portanto, decidir se E é satisfazível é um
problema equivalente a decidir se G possui uma clique de tamanho ≥ p, vide ilustração a seguir.

Para completar a prova basta observar que a construção de G pode ser facilmente realizada em
tempo polinomial com o tamanho da expressão E.
10
Completude NP
Transformação da prova do lema 4

E = (b1 ∨ b2 ) ∧ ( b1 ∨ b2 ∨ b3) ∧( b1 ∨ b2 ∨ b3 )

Lema 5: o problema conjunto independente de vértices é NP-completo.

Quando apresentamos a classe NP, provamos que conjunto independente ∈ NP. Na seção anterior,
verificamos que clique conjunto α conjunto independente. Sabe-se que pelo lema 4, que clique é NP-
completo. Logo, conjunto independente de vértices é NP-completo. Empregando o mesmo raciocínio,
poderemos provar que problemas pertencentes a NP são NP-completo.

Naturalmente a lista de tais problemas NP-completo tem centenas de problemas apontados na


literatura em diversas áreas: grafos, teoria dos números, lógica, construção de software,
programação matemática e muitas outras. Nesse conjunto, encontram-se alguns problemas para os
quais há muitos anos tenta-se desenvolver algoritmos eficientes, sem ter logrado sucesso até o
momento. O resultado infrutífero dessas tentativas, bem como o grande número de problemas da
lista, constituem indícios importantes da possível correção da afirmativa: P ≠ NP.