Crivo De Eratostenes
O crivo de Eratóstenes é um algoritmo antigo e poderoso para encontrar todos os números primos até um limite determinado, e este guia prático vai te ensinar como entender e aplicá-lo com eficiência. Ao final, você terá dominado a lógica por trás desse método e saberá adaptá-lo para diferentes contextos de cálculo.
Resumo dos principais pontos sobre o crivo de Eratóstenes
- O crivo de Eratóstenes é um algoritmo clássico e eficiente para gerar primos até n.
- O processo funciona marcando sistematicamente os múltiplos de cada primo começando em 2.
- É importante otimizar o laço até a raiz quadrada de n para reduzir operações desnecessárias.
- O algoritmo tem complexidade de tempo O(n log log n) e uso de memória O(n).
- Versões melhoradas incluem crivo segmentado para economizar memória em grandes intervalos.
- Compreender as armadilhas comuns ajuda a evitar erros de implementação e interpretação.
O que é o crivo de Eratóstenes e como surgiu
O crivo de Eratóstenes é um método simples, mas robusto, para listar todos os números primos até um determinado inteiro positivo n. A ideia consiste em construir progressivamente uma lista de inteiros de 2 até n e ir eliminando sistematicamente os múltiplos de cada número primo encontrado, começando pelo 2. O nome remete ao matemático grego Eratóstenes de Cirene, que viveu no terceiro século a.C., embora a essência do procedimento já fosse conhecida em civilizações anteriores.
Na prática, o crivo cria uma tabela booleana inicialmente considerada verdadeira para todos os índices, exceto para 0 e 1, que não são primos. À medida que varremos os valores, ao encontrar um índice ainda marcado como primo, reconhecemos que ele é um número primo e imediatamente marcamos seus múltiplos como não primos. Esse processo de marcar elimina inteiros compostos de forma organizada, até sobrarem apenas os primos.

Por que usar o crivo de Eratóstenes em vez de testar primos individualmente
Testar cada número individualmente para primalidade, especialmente com verificação de divisores até a raiz quadrada, pode ser bastante custoso quando se lida com grandes intervalos. O crivo de Eratóstenes, por outro lado, aproveita a estrutura coletiva dos números e reutiliza informações ao marcar múltiplos, o que o torna muito mais rápido para gerar todos os primos até n. Sua eficiência se torna evidente especialmente quando n é grande, pois o algoritmo evita repetir verificações redundantes para cada candidato.
Além da velocidade, a abordagem do crivo facilita a visualização da distribuição dos primos em um determinado trecho e serve de base para adaptações mais avançadas, como o crivo segmentado, que trabalha com intervalos menores para reduzir o consumo de memória. Portanto, para problemas que exigem a lista completa de primos até um limite, o crivo de Eratóstenes é geralmente a escolha de partida.
Passo a passo para implementar o crivo de Eratóstenes
A implementação direta do crivo de Eratóstenes pode ser ensinada de forma incremental, cobrindo desde a versão básica até otimizações importantes. Compreender cada etapa ajuda a ajustar o algoritmo conforme as restrições de memória e tempo do seu projeto.

- Defina o limite n até o qual você deseja encontrar os primos e crie uma estrutura de dados para marcar os números.
- Inicialize todos os índices de 2 até n como potenciais primos, exceto 0 e 1 que são marcados como não primos.
- Comece pelo primeiro primo conhecido, que é 2, e marque todos os seus múltiplos (exceto ele próprio) como não primos.
- Avance para o próximo número ainda marcado como primo e repita o processo de marcar seus múltiplos.
- Continue esse processo até que o valor atual seja maior que a raiz quadrada de n, pois todos os compostos restantes já terão sido marcados.
- Extraia a lista de primos, percorrendo a estrutura e selecionando apenas os índices que permanecem marcados como verdadeiros.
Como otimizar o laço e reduzir o uso de memória
Embora a versão básica do crivo de Eratóstenes seja didática, existem ajustes que melhoram significativamente o desempenho e diminuem o consumo de memória. Um ponto importante é percorrer apenas até a raiz quadrada de n ao marcar múltiplos, pois qualquer composto maior que essa raiz já terá um fator menor que já foi tratado.
Outra otimização comum é tratar o número 2 como caso especial e considerar apenas ímpares a partir dele, reduzindo pela metade o espaço necessário e o número de iterações. Além disso, é possível usar estruturas de bits em vez de arrays de booleanos para economizar memória quando n é muito grande, embora isso torne o código um pouco mais complexo.
Quando o crivo precisa de uma versão segmentada
Quando n é extremamente grande, alocar uma estrutura de tamanho n pode ser inviável devido à memória disponível. Nesse cenário, surge o crivo segmentado, que divide o intervalo [2, n] em blocos menores que cabem na memória e processa cada bloco usando os primos encontrados previamente até a raiz quadrada de n.
O crivo segmentado mantém a essência do algoritmo original, mas trabalha com janelas deslizantes, reduzindo o pico de memória e permitindo calcular primos em faixas muito grandes. Implementar essa variação exige atenção adicional com o gerenciamento de blocos e a fusão dos resultados, mas compensa quando se lida com limites superiores a alguns bilhões.
Erros comuns e armadilhas na hora de implementar
É fácil encontrar desafios ao transformar a ideia do crivo de Eratóstenes em código, especialmente em detalhes que afetam a correção e a eficiência. Um erro frequente é não iniciar a marcação dos múltiplos a partir do quadrado do primo atual, em vez de começar no próprio primo, o que gera redundância sem quebrar a correção, mas prejudica a performance.
Outra armadilha comum é usar índices invertidos ou esquecer de tratar corretamente o caso de n menor que 2, resultando em listas vazias ou erros de acesso. Também é importante não extrapolar o limite ao marcar múltiplos, pois isso causará erros de índice ou consumo excessivo de memória. Testar o algoritmo com valores pequenos e depois escalar gradualmente ajuda a capturar esses problemas precocemente.

Perguntas frequentes sobre o crivo de Eratóstenes
- O crivo de Eratóstenes funciona bem para números muito grandes?
- Qual é a complexidade de tempo do algoritimo?
- É necessário otimizar sempre o crivo para usar menos memória?
- O crivo de Eratóstenes pode ser paralelizado?
O crivo básico tem limitações de memória para valores muito altos, mas pode ser adaptado com a versão segmentada, que processa trechos menores do intervalo.
A complexidade de tempo é aproximadamente O(n log log n), o que o torna bastante eficiente para gerar primos em grandes intervalos.
Depende do contexto. Para n moderado, a versão simples pode ser suficiente. Para n muito grande, otimizações como crivo segmentado e tratamento de ímpares são recomendadas.
Sim, existem abordagens que paralelizam a marcação de múltiplos ou o processamento de segmentos, embora isso introduza desafios de sincronização.

Dominar o crivo de Eratóstenes é uma excelente maneira de entender como processar números primos de forma eficiente e serve de base para algoritmos mais avançados. Ao seguir as etapas e aplicar as otimizações, você pode adaptar essa técnica para atender desde exercícios didáticos até problemas reais de processamento numérico.