Como construir e usar uma tabela de números primos na prática
Uma tabela de números primos é basicamente uma lista dos números que só são divisíveis por 1 e por eles mesmos. A primeira coisa que todo mundo tenta fazer é usar a Peneira de Eratóstenes, que é o método mais direto para gerar esses números até um determinado limite. A ideia é simples: você começa com uma lista de todos os números naturais de 2 até N, vai marcando os múltiplos de cada primo encontrado e sobram apenas os primos. Funciona bem até uns 10 milhões, depois o custo em memória e tempo começa a doer. O problema real é que a maioria das pessoas para na definição e não considera o que acontece quando você precisa consultar essa tabela repetidamente ou em produção. Eu estava gerando uma tabela de primos para um sistema de criptografia leve em C, num projeto que precisava validar chaves RSA com números abaixo de 5 milhões. O Eratóstenes puro funcionou, mas a tabela final ocupava cerca de 380 KB em disco se você guardasse todos os números em texto. Só que o gargalo não era o espaço, era a velocidade de busca. Consultar uma lista ordenada com binária era rápido, mas eu precisei de algo mais eficiente do que isso, então usei um bit array compactado em vez de guardar cada primo como string. Isso reduziu o tamanho para cerca de 620 KB no arquivo binário, mas a consulta ficou muito mais rápida porque podia calcular diretamente se um número era primo sem precisar procurar na lista.
tabela de números primos: versão prática para consulta rápida
Aqui está um exemplo de tabela dos primeiros primos, suficiente para a maioria das aplicações comuns: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997
👉 Clique no botão abaixo para saber mais sobre o assunto!
O que poucas pessoas lembram é que os primos não têm periodicidade. Você vê um grande entre 887 e 907 (18 números sem primo) e pode achar que isso é normal, mas logo depois vem um ainda maior entre 1117 e 1123, e depois entre 1327 e 1361. Se você estiver construindo uma tabela para testes de unidade ou para popular um banco de dados de validação, espere encontrar irregular. Não adianta tentar interpolar ou adivinhar onde o próximo primo vai aparecer. Outro ponto que gera confusão constante é a diferença entre testar se um número é primo e gerar uma lista completa de primos. Testar um único número grande com divisões até a raiz quadrada é viável para números abaixo de 10 dígitos, mas se você precisa de todos os primos até 100 milhões, o Eratóstenes com otimização de stride é quase 40 vezes mais rápido do que testar um por um. No meu caso, converter a abordagem de trial division para Eratóstenes com segmentação reduziu o tempo de geração de cerca de 2 horas para aproximadamente 3 minutos num machine padrão, dependendo da configuração.
Limitações importantes: a tabela de números primos clássica via Eratóstenes consome memória proporcional ao limite escolhido. Até 1 bilhão, o bit array puro já pede cerca de 120 MB. Para limites maiores, a segmented sieve é necessária, dividindo o intervalo em blocos que cabem no cache L2/L3. Se você precisa de primos acima de 10^12 para aplicações de criptografia real, esqueça a tabela pré-computada. Aí entra o Miller-Rabin ou o AKS, que são testes probabilísticos/determinísticos para números individuais, não geração de tabelas. Para quem quer baixar uma tabela pronta, existem arquivos txt e csv disponíveis em repositórios como o OEIS (A000040) e o GitHub, com ranges que vão de 2 até 4 bilhões. O formato mais comum é uma coluna única, um primo por linha. Recomendo sempre verificar a soma de verificação SHA-256 antes de confiar no arquivo, porque erros de geração surgem com frequência em tabelas grandes — especialmente nas bordas dos intervalos de segmentação, onde o limite inferior de um bloco pode não ser tratado corretamente como possível primo.
Se o seu uso é educacional ou para exercícios simples, a lista até 1000 já cobre 95% dos casos. Se for para integração em software, considere gerar a tabela programaticamente no startup do seu aplicativo em vez de embutir dados estáticos. Assim você controla a versão, evita problemas de consistência entre arquivos, e ainda consegue ajustar o limite conforme a memória disponível no ambiente de execução.