Testando se 91 é primo: o que acontece na prática
Pessoas encontram esse tema sempre aparecendo em fóruns de matemática, seja como piada ou como dúvida genuína. O fato é que 91 é um número primo é uma afirmação que aparece em testes de conhecimento e, mais importante, em processos de verificação de conceitos básicos de teoria dos números. Vamos direto ao ponto.
91 é um número primo
O teste de primalidade começa de forma ingênua: você divide por 2, depois por 3, depois por 5, e para quando encontra um divisor exato. Com 91, a divisão por 2 não funciona, a divisão por 3 também não funciona, a divisão por 5 não funciona. Aí muita gente para o raciocínio no 5 e conclui errado porque esquece de testar o 7. 91 dividido por 7 dá exatamente 13. O número 91 é composto, não primo. Fatoração completa: 7 × 13. O erro é comum porque o teste de Trial Division para números pequenos até 100 muitas vezes é interrompido prematuramente. A raiz quadrada de 91 é aproximadamente 9,54. Isso significa que, para provar que um número não é primo, basta testar divisores primos menores ou iguais a essa raiz. Para 91, você precisa testar 2, 3, 5 e 7. Se parar antes do 7, chega a uma conclusão errada.
Eu já vi isso acontecendo em código de programação também. Um colega meu implementou um gerador de números primos para um sistema interno que precisava gerar hashes numéricos. A função usava Trial Division com um loop que ia até a parte inteira da raiz quadrada, mas com um bug: ele calculava a raiz quadrada em float e fazia cast para int, o que em alguns casos arredondava para baixo de forma problemática quando o número era pequeno demais. O sistema passou a aceitar 91 como primo e gerou hashes colidindo em produção. O custo para corrigir foi alto porque já tínhamos registros comprometidos no banco de dados.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Como verificar corretamente a primalidade de qualquer número
O método mais direto continua sendo a divisão trial até a raiz quadrada, mas implementado com cuidado. Se você está fazendo isso manualmente para números pequenos, segue a ordem: teste divisibilidade por 2, depois por 3, depois por 5, depois por 7. Se o número testado ao quadrado for maior que o número alvo, pare. Se encontrou divisor, o número é composto. Para quem programa, há uma diferença prática enorme entre fazer Trial Division puro e usar o teste de Miller-Rabin. Trial Division para um número como 91 leva no máximo 4 divisões. Para um número de 20 dígitos, o mesmo algoritmo levaria bilhões de operações. Miller-Rabin, por outro lado, consegue determinar com alta confiança se um número grande é primo em tempo polinomial. Para números pequenos como 91, o custo de implementar Miller-Rabin não compensa, mas é útil saber que a ferramenta existe quando o problema escala.
Outro detalhe que pouca gente menciona: números perfeitos de Mersenne. Eles só existem quando o expoente é primo. Se alguém encontrar um número da forma 2^p - 1 e quiser testar se é primo, o primeiro passo é verificar se p é primo. Não adianta testar primalidade de Mersenne com expoente composto. Isso é redundância computacional desnecessária.
Parmetros que confundem iniciantes
Números primos gêmeos são pares como (11, 13) ou (17, 19) onde ambos são primos e diferem por 2. 91 não participa de nenhum par assim porque já é composto. Números primos de Sophie Germain são primos p onde 2p + 1 também é primo. Nada disso se aplica a 91 porque a base já está errada. Um erro frequente é confundir o conceito de número primo com o de número ímpar. Não todo número ímpar é primo. 91 é ímpar, mas não é primo. A interseção entre ímpares e primos é válida apenas para os que realmente passam no teste de divisibilidade. Achei uma conta online que classificava todos os ímpares até 100 como candidatos a primos antes da verificação final. O resultado mostrou que cerca de 40% dos ímpares são compostos, e muitos deles têm fatores pequenos como 7 e 13.
Se o seu objetivo é simplesmente verificar se 91 é primo, a resposta é não. Ele é composto. Se o seu objetivo é construir um sistema que verifique primalidade corretamente, preste atenção aos limites do loop de divisão, teste até a raiz quadrada com precisão, e considere algoritmos probabilísticos quando o escopo crescer. O problema do código do meu colega foi resolvido substituindo o cast de float por uma verificação explícita: o loop só para quando o divisor ao quadrado excede estritamente o número candidato.