Como Otimizar Algoritmo para Encontrar Primos em Intervalos Específicos
Sempre crie uma frase de segurança única para jogos, testnets ou airdrops e evite usar sua carteira principal.
Seu código está bem montado para um propósito específico, mas há alguns pontos importantes a ajustar e esclarecer. Vamos revisar e melhorar passo a passo.
✅ O que seu código faz?
-
Para cada
nno intervalo[inicio, fim]:Calcula o intervalo:
[2^n, 2^(n+1)]Busca todos os primos
pdentro desse intervaloPara cada primo
p, testa uma condição personalizada:distancia = p - inicio soma = inicio + p diff = soma - fim if diff == distancia: primos_validos.append(p)
🧠 Mas o que significa essa condição?
A condição:
if (inicio + p) - fim == (p - inicio)
é equivalente a:
(p + inicio - fim) == (p - inicio)
Subtraindo p dos dois lados:
(inicio - fim) == (-inicio)
Ou seja:
inicio - fim == -inicio → 2 * inicio == fim
👉 Essa condição só será satisfeita se fim == 2 * inicio.
🔧 Melhorias no código
Melhorar o teste de primalidade (atualmente é muito lento para números grandes).
Deixar clara a condição que está sendo verificada.
Evitar percorrer todos os números em intervalos imensos.
🔁 Versão otimizada (com comentários):
import sympy # biblioteca otimizada para matemática simbólica e primos
def encontrar_primos_intervalo(inicio, fim):
primos_validos = []
for p in range(inicio, fim + 1):
if sympy.isprime(p):
distancia = p - inicio
soma = inicio + p
diff = soma - fim
print(f"p={p}, distancia={distancia}, soma={soma}, soma-fim={diff}")
if diff == distancia: # isso equivale a fim == 2 * inicio
primos_validos.append(p)
return primos_validos
inicio = int(input("Informe o valor de n (início do intervalo em potências de 2): "))
fim = int(input("Informe o valor de n (fim do intervalo em potências de 2): "))
for n in range(inicio, fim + 1):
start = 2 ** n
end = 2 ** (n + 1)
print(f'\nVerificando intervalo: [{start}, {end}] (2^{n} até 2^{n+1})')
primos = encontrar_primos_intervalo(start, end)
print(f"Primos que satisfazem a condição fim == 2 * início: {primos}")
📌 Observações finais
Se o objetivo é apenas encontrar o primeiro primo dentro de um intervalo como
[2^n, 2^{n+1}], é melhor parar o laço assim que encontrar o primeiro primo (isso economiza muito tempo).Substituir
eh_primo()porsympy.isprime()acelera consideravelmente, pois é uma função otimizada e usa algoritmos probabilísticos eficientes para grandes números.A condição
soma - fim == distanciasó será satisfeita quandofim == 2 * inicio, o que pode ser checado antes de entrar no loop.

Comentários
Comente só assim vamos crescer juntos!