← Projetos

Tutorial

Complexidade computacional: P, NP e o problema de 1 milhão de dólares

Por que alguns problemas o computador resolve num piscar de olhos e outros levariam mais tempo que a idade do universo? Um guia sobre P, NP e a maior pergunta em aberto da computação.

Origens

Por que alguns problemas o computador resolve num piscar de olhos e outros levariam mais tempo do que a idade do universo? Essa é a pergunta da complexidade computacional, a área da ciência da computação que mede quão difícil é resolver um problema.

Antes dos computadores: Turing

Em 1936, antes mesmo de existirem computadores como os de hoje, o matemático Alan Turing imaginou uma máquina simples, capaz de executar qualquer cálculo passo a passo. Com ela, provou algo surpreendente: existem problemas que nenhum computador jamais vai resolver. O mais famoso é o problema da parada: não existe um programa capaz de olhar para qualquer outro programa e dizer, sempre, se ele vai terminar ou rodar para sempre. [20]

A carta de Gödel

Em 20 de março de 1956, o lógico Kurt Gödel escreveu uma carta ao matemático John von Neumann. Nela, perguntava quanto tempo uma máquina levaria para encontrar a prova de um teorema. Se fosse pouco, argumentava, o trabalho mental dos matemáticos em perguntas de sim ou não poderia ser feito por máquinas. Sem saber, Gödel tinha acabado de fazer a pergunta que hoje chamamos de P = NP. [18]

A área ganha nome

Em 1965, Juris Hartmanis e Richard Stearns publicaram um artigo que media o tempo dos algoritmos em função do tamanho do problema e deu nome à área: complexidade computacional. O trabalho rendeu aos dois o Prêmio Turing de 1993, o “Nobel da computação”. [14] [10] Na mesma época, Alan Cobham e Jack Edmonds propuseram uma regra que vale até hoje: um algoritmo é eficiente quando o seu tempo cresce como um polinômio, como n² ou n³, e não como uma exponencial, como 2ⁿ. [10]

Nasce a pergunta de 1 milhão de dólares

Em 1971, Stephen Cook mostrou que um problema de lógica chamado SAT é NP-completo, ou seja, um dos mais difíceis da classe NP. [17] Em 1972, Richard Karp mostrou que outros 21 problemas famosos eram tão difíceis quanto ele. [16] E, do outro lado da Cortina de Ferro, na União Soviética, Leonid Levin chegou à mesma ideia de forma independente, com publicação em 1973. [17] Em 2000, o Instituto Clay incluiu P versus NP entre os sete Problemas do Milênio, com um prêmio de 1 milhão de dólares para quem o resolver. [8]

Linha do tempo com nove marcos. 1936, Alan Turing mostra que nem tudo pode ser calculado, com o problema da parada. 1956, Kurt Gödel pergunta a von Neumann, numa carta, se achar provas pode ser automatizado. 1965, Hartmanis e Stearns medem o tempo dos algoritmos e dão nome à área. 1964 e 1965, Cobham e Edmonds propõem que tempo polinomial significa eficiente. 1971, Stephen Cook mostra que o problema SAT é NP-completo e nasce a pergunta P igual a NP. 1972, Richard Karp mostra 21 problemas NP-completos. 1973, Leonid Levin descobre o mesmo, sozinho, na União Soviética. 2000, o Instituto Clay oferece 1 milhão de dólares por uma resposta. 2002, Agrawal, Kayal e Saxena mostram que testar se um número é primo está em P.
Os principais marcos da complexidade computacional.

Classificação

Algoritmo: uma receita de bolo

Um algoritmo é uma receita: uma lista de passos que, seguidos à risca, resolvem um problema. Para comparar receitas, os cientistas não medem o tempo no relógio, que depende de cada computador. Eles contam quantos passos a receita precisa conforme o problema cresce. O tamanho do problema se chama n: o número de itens de uma lista, de cidades num mapa ou de casas num tabuleiro.

Rápido e lento: polinomial contra exponencial

Imagine um computador que faz 1 bilhão de passos por segundo. Um algoritmo que precisa de n² passos resolve um problema com 100 itens em 10 microssegundos. Um algoritmo que precisa de 2ⁿ passos levaria 40 trilhões de anos para os mesmos 100 itens, cerca de 3 mil vezes a idade do universo. A diferença não está no computador: está na receita.

Tabela de cores com o tempo necessário, num computador de 1 bilhão de passos por segundo, para algoritmos de n ao quadrado, 2 elevado a n e n fatorial passos, com n igual a 10, 20, 30, 50 e 100. n = 10: n², < 1 milissegundo; 2ⁿ, < 1 milissegundo; n!, 3,6 ms. n = 20: n², < 1 milissegundo; 2ⁿ, 1,0 ms; n!, 77 anos. n = 30: n², < 1 milissegundo; 2ⁿ, 1,1 s; n!, 10¹⁵ anos. n = 50: n², < 1 milissegundo; 2ⁿ, 13 dias; n!, 10⁴⁷ anos. n = 100: n², < 1 milissegundo; 2ⁿ, 40 trilhões de anos; n!, 10¹⁴¹ anos.
Como o tempo cresce com o tamanho do problema em três tipos de algoritmo.

Por isso a regra de Cobham e Edmonds é tão útil: algoritmos polinomiais continuam viáveis quando o problema cresce; exponenciais, não. Nem os computadores mais rápidos compensam essa explosão.

P: fácil de resolver

A classe P reúne os problemas que um computador resolve em tempo polinomial. Ordenar uma lista de nomes, achar o caminho mais curto no GPS e até testar se um número gigante é primo estão em P. Este último só foi provado em 2002, por Manindra Agrawal e dois de seus alunos, Neeraj Kayal e Nitin Saxena. [5]

NP: fácil de verificar

A classe NP reúne os problemas em que, se alguém entregar uma resposta, você consegue conferir rapidamente se ela está certa. O Sudoku é o exemplo perfeito: resolver um tabuleiro gigante pode exigir tentativas sem fim, mas conferir um tabuleiro preenchido é só olhar linhas, colunas e quadrados.

Dois painéis com um Sudoku de 4 por 4. À esquerda, resolver: o tabuleiro tem só alguns números e é preciso tentar, errar e voltar; num Sudoku gigante, as tentativas crescem de forma explosiva. À direita, verificar: o tabuleiro está completo e basta conferir que cada linha, cada coluna e cada quadrado de 2 por 2 têm os números 1, 2, 3 e 4. Embaixo: NP são os problemas cuja resposta é fácil de verificar; P, os fáceis de resolver; a pergunta P igual a NP é se, sempre que verificar é fácil, resolver também é.
Resolver exige tentativas; verificar é só conferir.

Cuidado com uma confusão comum: NP não quer dizer “não polinomial”. Quer dizer “polinomial não determinístico”, como se o computador pudesse chutar a resposta certa e só precisasse conferi-la. Todo problema de P também está em NP: quem sabe resolver rápido também sabe conferir rápido.

NP-completo e NP-difícil

Dentro de NP estão os problemas mais difíceis de todos, os NP-completos. Eles têm uma propriedade mágica: se alguém descobrir um jeito rápido de resolver um deles, todos os problemas de NP passam a ter solução rápida. Já os NP-difíceis são pelo menos tão difíceis quanto os NP-completos, mas não precisam estar em NP: alguns nem têm resposta de sim ou não, e outros, como o problema da parada, nem sequer podem ser resolvidos.

Além de NP

Há problemas comprovadamente ainda mais difíceis. Descobrir a jogada perfeita num xadrez jogado num tabuleiro n × n, que pode crescer à vontade, exige tempo exponencial: esse problema está na classe EXP. [12] E, além de todos, estão os indecidíveis, como o problema da parada de Turing.

Diagrama de conjuntos, supondo P diferente de NP. Dentro de todos os problemas, há os decidíveis, que um computador resolve mesmo que demore, e os indecidíveis, como o problema da parada, que nenhum computador resolve. Dentro dos decidíveis está EXP, tempo exponencial, com o xadrez n por n. Dentro de EXP está NP, problemas fáceis de verificar, e dentro de NP está P, fáceis de resolver, como ordenar uma lista, achar uma rota no GPS e testar se um número é primo. Na borda de NP ficam os NP-completos, como Sudoku, Campo Minado e Tetris. A região tracejada NP-difícil inclui os NP-completos e vai além de NP, com problemas pelo menos tão difíceis quanto eles, como Candy Crush e Mario.
O mapa das classes, como a maioria dos cientistas acredita que ele seja.

Seus jogos favoritos são difíceis

Os cientistas adoram provar que jogos são difíceis. Veja alguns resultados:

JogoClasseO que foi provado
SudokuNP-completoDecidir se um tabuleiro n² × n² tem solução [15]
Campo MinadoNP-completoDecidir se as pistas do tabuleiro são coerentes [7]
TetrisNP-completoMaximizar as linhas eliminadas, mesmo sabendo todas as peças que virão [9]
Candy CrushNP-difícilAtingir uma pontuação com um número fixo de jogadas [21]
Super Mario Bros.NP-difícilDecidir se dá para chegar ao fim de uma fase [6]
Xadrez n × nEXP-completoDecidir quem vence a partir de uma posição [12]

Em todos os casos, os resultados valem para versões generalizadas, com tabuleiros ou fases de qualquer tamanho. Um Sudoku 9 × 9 comum, um computador resolve num instante.

  • “NP quer dizer não polinomial”

    Realidade: NP significa polinomial não determinístico, ou seja, fácil de verificar.

  • “NP-difícil quer dizer impossível”

    Realidade: quer dizer que não se conhece atalho rápido para todos os casos. Casos pequenos ou comuns costumam ser resolvidos bem.

  • “Um computador mais rápido resolve”

    Realidade: contra um crescimento exponencial, dobrar a velocidade quase não faz diferença.

  • “O computador quântico resolve tudo”

    Realidade: os especialistas acreditam que nem ele resolve problemas NP-completos rapidamente. [2]

Relação matemática

Polinômios contra exponenciais

Toda a teoria se apoia numa comparação entre dois tipos de função. Num polinômio, o n fica na base e o expoente é fixo; numa exponencial, o n vai para o expoente:

Polinomial:   n²   n³   n¹⁰    → o expoente é fixo
Exponencial:  2ⁿ   3ⁿ   n!     → o n está no expoente (ou no fatorial)

n = 10:   n² = 100     2ⁿ = 1.024            n! = 3.628.800
n = 30:   n² = 900     2ⁿ = 1.073.741.824    n! ≈ 2,7 × 10³²

Por maior que seja o expoente de um polinômio, uma exponencial sempre acaba passando à frente. É por isso que a fronteira entre P e o resto é tão importante.

O caixeiro viajante

Um exemplo clássico: um entregador precisa visitar várias cidades e voltar ao ponto de partida pelo caminho mais curto. Com n cidades, existem (n − 1)! ÷ 2 rotas diferentes. Com 5 cidades, são 12 rotas. Com 25, são mais de 300 sextilhões: testar todas levaria cerca de 10 milhões de anos.

Mapa com seis cidades e uma rota que passa por todas e volta ao início, ao lado de uma tabela com o número de rotas possíveis, (n menos 1) fatorial dividido por 2, e o tempo para testar todas a 1 bilhão de rotas por segundo. 5 cidades: 12; instantâneo. 10 cidades: 181.440; instantâneo. 15 cidades: 43.589.145.600; 44 s. 20 cidades: 60.822.550.204.416.000; 1,9 anos. 25 cidades: 3,1 × 10²³; 9,8 milhões de anos.
O número de rotas do caixeiro viajante cresce como um fatorial.

Existem algoritmos mais espertos, que evitam testar tudo, mas todos os que conhecemos e que dão a resposta exata para qualquer mapa continuam exponenciais. A versão de sim ou não do problema (“existe uma rota com menos de X quilômetros?”) é NP-completa, parente próxima do ciclo hamiltoniano da lista de Karp. [16]

Reduções: o tradutor entre problemas

A ferramenta matemática mais importante da área é a redução. Reduzir o problema A ao problema B é criar um tradutor rápido que transforma qualquer pergunta de A numa pergunta de B com a mesma resposta. Se B for fácil, A também será. Foi assim que Karp mostrou, em 1972, que 21 problemas eram NP-completos: Karp os ligou em cadeia, como dominós, a partir do SAT. [16]

Diagrama de redução. O problema A, por exemplo Sudoku, passa por um tradutor rápido, em tempo polinomial, que o transforma no problema B, por exemplo SAT. Um solucionador de B dá a resposta, que vale para A e B. Regra: se B tiver uma solução rápida, A também terá. Embaixo, o efeito dominó de Karp, de 1972: SAT, sobre fórmulas lógicas, leva a Clique, grupo de amigos, que leva a Cobertura de vértices, vigiar todas as ruas, que leva a Ciclo hamiltoniano, visitar tudo uma vez. Moral: se um problema NP-completo tiver solução rápida, todos terão, e P será igual a NP.
Com reduções, a dificuldade passa de um problema para outro, como dominós.

Por que ninguém consegue provar?

Parece que bastaria provar que algum problema NP-completo exige tempo exponencial. Mas os matemáticos descobriram que as técnicas conhecidas não dão conta disso. Há pelo menos três “barreiras” provadas: a relativização (1975), as provas naturais (1994) e a algebrização (2008). Cada uma mostra que um tipo inteiro de argumento nunca vai resolver a questão. [4] Ou seja: para resolver P versus NP, vai ser preciso inventar matemática nova.

Relação filosófica

Criar é mais difícil que reconhecer?

Pense na diferença entre compor uma música e perceber que ela é bonita, ou entre inventar uma piada e rir dela. Reconhecer parece bem mais fácil que criar. P versus NP é a versão matemática dessa intuição. O cientista da computação Scott Aaronson escreveu: [1]

“Se P = NP, o mundo seria um lugar profundamente diferente do que costumamos imaginar. Não haveria valor especial em ‘saltos criativos’, nenhuma diferença fundamental entre resolver um problema e reconhecer a solução depois de encontrada. Todos que conseguissem apreciar uma sinfonia seriam Mozart.”

Máquinas matemáticas

Gödel já tinha percebido, em 1956, que a resposta mudaria o papel dos matemáticos: se achar provas fosse tão fácil quanto conferi-las, uma máquina poderia fazer boa parte do trabalho. [18] Hoje, programas de IA já ajudam a encontrar e checar provas, mas isso não resolve a questão: eles usam atalhos que funcionam em muitos casos, não em todos.

O que conta como conhecimento

Aaronson também defende que filósofos deveriam se importar com complexidade. Saber que uma resposta existe não é o mesmo que conseguir encontrá-la num tempo razoável. Cada posição de xadrez tem uma jogada perfeita, mas ninguém, nem computador algum, consegue calculá-la sempre. Para Aaronson, a eficiência muda perguntas antigas sobre o que significa conhecer, aprender e até pensar. [3]

Uma lei da natureza?

Há quem vá além e sugira que “problemas NP-completos são difíceis” poderia ser tratado como um princípio da física, assim como “nada viaja mais rápido que a luz”. Se nenhum sistema do universo, nem mesmo quântico, consegue resolvê-los rápido, isso diria algo sobre a própria natureza. [2]

Projeção de futuro

O que os especialistas apostam

Em 2019, o cientista da computação William Gasarch repetiu uma enquete com pesquisadores da área. Das 124 respostas, cerca de 80% disseram acreditar que P ≠ NP; entre quem mais estudou o problema, 99%. E 66% acharam que a questão será resolvida antes de 2100. [13]

Dois painéis. Se P for igual a NP, resolver seria tão fácil quanto verificar: remédios e materiais seriam projetados rapidamente e computadores achariam provas matemáticas, mas a criptografia de hoje ficaria vulnerável e a criatividade perderia o seu salto. Se P for diferente de NP, existem problemas intrinsecamente difíceis: senhas e bancos continuam protegidos, sabemos onde estão os limites, e problemas difíceis pedem atalhos, como aproximações e heurísticas. Embaixo, a enquete de 2019 com 124 respostas: cerca de 80% acham que P é diferente de NP; entre quem mais estudou o problema, 99%; e 66% acham que ele será resolvido antes de 2100.
Os dois futuros possíveis e o que os especialistas apostam.

Se P = NP

Lance Fortnow descreve esse cenário como um mundo em que quase tudo poderia ser otimizado, de rotas de entrega a remédios e materiais, e em que computadores encontrariam provas matemáticas sozinhos. O lado sombrio: a criptografia que protege senhas, bancos e mensagens depende de problemas difíceis e ficaria vulnerável se o algoritmo fosse prático. [11]

Se P ≠ NP

É o cenário mais provável. Os problemas difíceis continuam difíceis, e isso é bom para a segurança. Para enfrentá-los na prática, usamos aproximações (uma resposta boa, não perfeita) e heurísticas (atalhos que funcionam na maioria dos casos). É assim que aplicativos de entrega montam rotas todos os dias sem esperar milhões de anos.

E os computadores quânticos?

Eles não devem mudar esse quadro. Um computador quântico consegue fatorar números grandes muito rápido, com o algoritmo de Peter Shor, de 1994, o que ameaça parte da criptografia atual. Mas fatorar não é um problema NP-completo, e os especialistas acreditam que nem os computadores quânticos resolvem problemas NP-completos rapidamente. [2] Por precaução, o NIST publicou em 2024 padrões de criptografia pós-quântica, pensados para resistir também a eles. [19]

E a inteligência artificial?

A IA é ótima para achar boas respostas para problemas difíceis, como montar horários escolares ou planejar rotas, mas faz isso com heurísticas, sem garantia de acertar sempre. Ela não muda a classe de um problema. Talvez um dia ajude os matemáticos a encontrar a prova de P ≠ NP, mas, pelas barreiras que vimos, vai ser preciso uma ideia realmente nova.

Conclusão

A complexidade computacional nasceu de uma pergunta simples: quanto esforço é preciso para resolver um problema? Ela mostrou que existem problemas fáceis, difíceis e impossíveis, e que a diferença entre polinomial e exponencial vale mais do que qualquer computador novo.

P versus NP é, ao mesmo tempo, uma questão de matemática, de tecnologia e de filosofia. A resposta pode proteger ou expor os nossos segredos, dizer se a criatividade pode ser automatizada e revelar limites da própria natureza. E ela ainda está esperando alguém para encontrá-la. Quem sabe você?

Glossário essencial

Algoritmo
Lista de passos que resolve um problema, como uma receita.
Aproximação
Algoritmo que entrega uma resposta boa, com garantia de estar perto da melhor, sem ser necessariamente perfeita.
EXP
Problemas que podem ser resolvidos em tempo exponencial.
Heurística
Atalho que costuma funcionar bem na prática, mas sem garantia para todos os casos.
Indecidível
Problema que nenhum computador consegue resolver, como o problema da parada.
n
O tamanho do problema: itens de uma lista, cidades de um mapa, casas de um tabuleiro.
NP
Problemas cuja resposta, quando alguém a mostra, pode ser verificada em tempo polinomial.
NP-completo
Os problemas mais difíceis de NP: se um tiver solução rápida, todos terão.
NP-difícil
Problemas pelo menos tão difíceis quanto os NP-completos, estejam ou não em NP.
P
Problemas que podem ser resolvidos em tempo polinomial.
Redução
Tradução rápida de um problema em outro, com a mesma resposta.
SAT
Problema de decidir se uma fórmula lógica pode ser verdadeira; o primeiro NP-completo conhecido.
Tempo exponencial
Número de passos que cresce como 2ⁿ ou n!; explode rapidamente.
Tempo polinomial
Número de passos que cresce como n², n³ ou outra potência fixa de n; considerado eficiente.

Revisão rápida

1. O que é um algoritmo?

Uma lista de passos que resolve um problema, como uma receita de bolo.

2. Qual é a diferença entre P e NP?

P reúne os problemas fáceis de resolver; NP, aqueles em que é fácil verificar uma resposta pronta.

3. NP quer dizer “não polinomial”?

Não. Quer dizer “polinomial não determinístico”: fácil de verificar.

4. Por que um computador mais rápido não resolve problemas exponenciais?

Porque cada item a mais pode dobrar o tempo. Ganhar velocidade só adia um pouco a explosão.

5. O que aconteceria se alguém resolvesse rápido um problema NP-completo?

Graças às reduções, todos os problemas de NP poderiam ser resolvidos rápido, e P seria igual a NP.

6. Com 10 cidades, quantas rotas tem o caixeiro viajante?

(10 − 1)! ÷ 2 = 181.440 rotas.

7. Por que P versus NP importa para a sua senha?

A criptografia se apoia em problemas difíceis de resolver e fáceis de verificar. Se P = NP com um algoritmo prático, ela ficaria vulnerável.

8. Quem criou a ideia de problema NP-completo?

Stephen Cook, em 1971. Leonid Levin chegou à mesma ideia na União Soviética, com publicação em 1973.

↑ Voltar ao topo

Referências

  1. Aaronson, S., “Reasons to believe”, setembro de 2006, Shtetl-Optimized.
  2. Aaronson, S., “NP-complete Problems and Physical Reality”, 2005, scottaaronson.com.
  3. Aaronson, S., “Why Philosophers Should Care About Computational Complexity”, agosto de 2011, arXiv:1108.1791.
  4. Aaronson, S.; Wigderson, A., “Algebrization: A New Barrier in Complexity Theory”, 2008, scottaaronson.com.
  5. Agrawal, M.; Kayal, N.; Saxena, N., “PRIMES is in P”, 2004, Annals of Mathematics 160.
  6. Aloupis, G.; Demaine, E. D.; Guo, A.; Viglietta, G., “Classic Nintendo Games are (Computationally) Hard”, 2014, arXiv:1203.1895.
  7. Ben-Ari, M., “Minesweeper as an NP-complete problem”, 2005, ACM SIGCSE Bulletin.
  8. Clay Mathematics Institute, “P vs NP”, claymath.org.
  9. Demaine, E. D.; Hohenberger, S.; Liben-Nowell, D., “Tetris is Hard, Even to Approximate”, 2003, csail.mit.edu.
  10. Fortnow, L.; Homer, S., “A Short History of Computational Complexity”, 2003, lance.fortnow.com.
  11. Fortnow, L., “The Golden Ticket: P, NP, and the Search for the Impossible”, abril de 2013, Princeton University Press.
  12. Fraenkel, A. S.; Lichtenstein, D., “Computing a perfect strategy for n × n chess requires time exponential in n”, 1981, Journal of Combinatorial Theory A 31.
  13. Gasarch, W.; Fortnow, L., “Third Poll on P vs NP and related Questions is out now!”, março de 2019, Computational Complexity blog.
  14. Hartmanis, J.; Stearns, R. E., “On the computational complexity of algorithms”, 1965, Transactions of the AMS 117.
  15. Kendall, G.; Parkes, A.; Spoerer, K., “A Survey of NP-Complete Puzzles”, 2008, ICGA Journal.
  16. Wikipedia, “Karp’s 21 NP-complete problems”, en.wikipedia.org.
  17. Wikipedia, “Cook–Levin theorem”, en.wikipedia.org.
  18. Lipton, R. J., “The Gödel Letter”, rjlipton.com.
  19. NIST, “Post-Quantum Cryptography FIPS Approved”, agosto de 2024, csrc.nist.gov.
  20. Stanford Encyclopedia of Philosophy, “Turing Machines”, plato.stanford.edu.
  21. Walsh, T., “Candy Crush is NP-hard”, março de 2014, arXiv:1403.1911.
↑ Voltar ao topo