Encontrar todos os divisores de um número não é tão simples quanto parece
A maioria das pessoas tenta dividir o número por 1, 2, 3, 4 e vai até a metade. Funciona para números pequenos, mas em algum momento você vai se deparar com um número como 98280 e perceber que testar divisores manualmente é inviável. O problema é que esse tipo de abordagem escala mal. Números grandes aparecem com frequência em problemas de criptografia, teoria dos números aplicada e até em programação competitiva. A técnica correta depende da fatoração em primos. Se você tem a decomposição kanonika do número, encontrar o numero de divisores de um numero vira uma questão de multiplicar expoentes mais um. Mas o trabalho real está em chegar até essa fatoração de forma eficiente.
Como calcular o numero de divisores de um numero
Pegue o número n e decomponha-o em fatores primos: n = p1^a1 * p2^a2 * ... * pk^ak. O total de divisores positivos é simplesmente (a1 + 1) * (a2 + 1) * ... * (ak + 1). A lógica é que cada divisor pode conter o primo p1 com qualquer expoente de 0 a a1, o mesmo valendo para os demais primos, e todas as combinações são válidas. Vamos com um exemplo concreto. 60 = 2^2 * 3^1 * 5^1. O numero de divisores de um numero calculado assim seria (2+1)*(1+1)*(1+1) = 3*2*2 = 12. Os divisores são 1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60. Confere.
Agora o ponto onde a teoria encontra a realidade: fatorar números grandes é o gargalo. Para números até 10^12, trial division otimizada com primos até a raiz quadrada ainda funciona. Passei uma tarde inteira corrigindo um bug em que meu código falhava silenciosamente para números com fator primo maior que 10^6. O problema era que eu só testava divisores até 10^6 antes de assumir que o resto era primo. Numérica como 999999999989 tem um fator primo dessa magnitude e meu algoritmo retornava 4 divisores em vez de 2. A solução foi simple, mas demorou pra encontrar: rodar trial division até a raiz quadrada do número restante a cada passo, e só então declarar o resto como primo. Isso garante que fatores primos grandes sejam capturados corretamente.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Detalhes que passam despercebidos
Um detalhe que muita gente esquece: o numero de divisores de um numero inclui sempre 1 e o próprio número. Não existe atalho pra excluir esses casos sem modificar a fórmula. Se você precisa de divisores próprios (excluindo o número em si), basta subtrair 1 do resultado. Outro ponto importante é que números perfeitos, amigáveis e outras classes especiais têm propriedades relacionadas aos divisores, mas calcular o numero de divisores de um numero por si só não revela essas classificações. A função d(n) ou tau(n) é apenas o contador. Saber que um número tem 12 divisores não diz se ele é abundante, deficiente ou perfeito. Isso requer somar os divisores, não apenas contá-los.
Se o seu objetivo é apenas listar todos os divisores de um número específico sem fatoração prévia, existe uma abordagem mais direta: itere de 1 até a raiz quadrada de n. Para cada i que divide n exatamente, ambos i e n/i são divisores. Isso gera os divisores em pares ordenados. Para n = 36, você testa 1, 2, 3, 4, 5, 6. Quando i = 6, i == n/i, então conta como um único divisor. Resultado: 1, 36, 2, 18, 3, 12, 4, 9, 6. Total de 9 divisores, o que bate com a fatoração 2^2 * 3^2 -> (2+1)*(2+1) = 9. Esse método de varredura até a raiz quadrada é mais lento que usar a fatoração quando você precisa calcular o numero de divisores de um numero repetidamente, como num projeto que envolve múltiplos valores. Mas para um número isolado, é perfeitamente viável e evita a complexidade de implementar um algoritmo de fatoração.
Limitações e quando parar de usar isso
O método de fatoração por trial division tem um limite prático em torno de 10^14. Acima disso, o tempo de execução cresce exponencialmente. Se você trabalha com números de 20 dígitos ou mais, precisa de algoritmos como Pollard's rho ou o Quadratic Sieve. Trial division simplesmente não escala. Para uso geral em programação, uma função em Python que implementa a fatoração com otimização de 2 e ímpares resolve a maioria dos casos reais. A complexidade é O(sqrt(n)) no pior cenário, mas na prática, com números aleatórios, os fatores primos pequenos reduzem n rapidamente e o resto é testado uma única vez.
Não tente aplicar essa abordagem em contexts onde a segurança depende da dificuldade de fatoração. Números RSA com 2048 bits não são fatoráveis por nenhum método convencional com a tecnologia atual. Calcular o numero de divisores de um numero nesse escala é computacionalmente impraticável e essa é exatamente a propriedade que protege a infraestrutura de comunicação moderna. Se você precisa processar milhares de números com frequência, considere pré-computar uma tabela de menores divisores primos (sieve de Eratosthenes otimizado) até um limite razoável. Com uma sieve até 10^7, você consegue fatorar qualquer número até 10^14 dividindo sucessivamente pelos primos da tabela. O tempo de fatoração cai de segundos para milissegundos por número, dependendo da implementação.