O número par que é também primo
Se você está implementando um teste de primalidade ou otimizando um algoritmo qualquer, esbarra nisso na primeira linha de código. O número par e primo ao mesmo tempo é apenas o 2. Não tem segredo, não tem exceção, não tem outro candidato. Todo resto dos números pares é composto porque é divisível por 2 e por pelo menos mais um número além de 1 e dele mesmo. Eu já vi muita gente perder tempo com validações desnecessárias por não ter isso claro desde o início. No meu caso, estava construindo uma versão otimizada do crivo de Eratosthenes para gerar primos até 10 milhões em um projeto de criptografia simples. Eu tinha colocado um loop que testava todos os números ímpares, mas esqueci de tratar o 2 separadamente. O resultado era um array que ia começar, faltando o único primo par, e isso causava off-by-one em todas as estruturas que dependiam do índice do n-ésimo primo. A correção foi trivial: inserir o 2 manualmente antes do crivo e rodar o algoritmo só nos ímpares a partir de 3.
números par e primo ao mesmo tempo: a regra prática
Em qualquer implementação, o primeiro filtro de otimização deveria ser verificar se o número é par. Se for par e diferente de 2, já descarta na hora. Se for igual a 2, retorna primo. Só a partir daí é que entra o teste de divisão por ímpares até a raiz quadrada. Isso reduz o número de operações em cerca de 50 por cento no pior caso, porque elimina metade dos candidatos sem fazer divisão nenhuma. O que poucos explicam direito é que essa propriedade tem implicações que vão além do óbvio. Por exemplo, em testes probabilísticos de primalidade como Miller-Rabin, a escolha dos bases testemunhas precisa levar em conta que o 2 é um caso à parte. Se você usar o 2 como base de teste em um número que é múltiplo de 2, o algoritmo pode dar falso negativo se não houver um cheque explícito antes. Eu já passei por isso em uma implementação que rodava em ambiente embutido com recursos limitados. A correção foi adicionar um check inicial: se n == 2 retorne true; se n % 2 == 0 retorne false. Depois disso o Miller-Rabin roda normalmente.
Outro ponto que ninguém avisa é sobre a função totiente de Euler. Como todo primo par é 2 e todo outro primo é ímpar, a fórmula para phi(p) = p - 1 funciona perfeitamente para o 2 também,Resultando em phi(2) = 1. Isso é relevante em RSA, onde a fase de geração de chave depende do cálculo de phi((p-1)*(q-1)). Se por algum motivo você estivesse iterando sobre primos e includo o 2 na contagem sem cuidado, o produto final ficaria errado. Já vi pipelines inteiros de geração de chaves falharem por esse motivo em código legado que não documentava o tratamento do 2. Uma limitação importante que vale anotar: essa propriedade só se aplica ao 2. Não existe nenhum outro número que seja simultaneamente par e primo, então soluções que tentam generalizar isso para outros contextos, como pares de primos gêmeos ou sequências especiais, não se sustentam. Se você encontrou alguém propondo um algoritmo que classifica múltiplos de 2 como primos sob alguma condição específica, desconfie. É provável que haja um erro conceitual.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Na prática, a maneira mais eficiente de lidar com isso é simplesmente não tratar isso como um problema. Tenha o 2 como caso base, trate todos os outros pares como compostos, e siga em frente. O resto da lógica do seu algoritmo fica mais limpo e você evita testes redundantes que só aumentam a complexidade sem trazer informação nova. Se quiser um exemplo concreto de implementação, aqui vai uma versão mínima em Python que eu uso como ponto de partida em qualquer projeto que precise de teste de primalidade rápido:
def is_prime(n): if n == 2: return True if n
2 or n % 2 == 0: return False for i in range(3, int(n0.5) + 1, 2): if n % i == 0: return False return True Essa função trata o número par e primo ao mesmo tempo de forma explícita no primeiro if, o que evita que qualquer lógica posterior precise se preocupar com o caso especial. Para gerar uma lista de primos até um limite N, a versão otimizada do crivo faria algo parecido, marcando todos os pares maiores que 2 como compostos de uma vez e rodando o crivo só nos ímpares restantes.
Resumindo sem resumir: o único número que é par e primo é 2. Todo o resto dos pares é composto. Trate isso no início do seu código, não no meio, e economiza bugs e tempo de execução.