Formulário de contato

Nome

E-mail *

Mensagem *

Este blog é um complemento do nosso canal no YouTube. Clique em @CanalQb para seguir e acompanhar nossos vídeos!
Imagem

Como Otimizar Algoritmo para Encontrar Primos em Intervalos Específicos


@CanalQb no YouTube


@CanalQb

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?

  1. Para cada n no intervalo [inicio, fim]:

    • Calcula o intervalo: [2^n, 2^(n+1)]

    • Busca todos os primos p dentro desse intervalo

    • Para 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

  1. Melhorar o teste de primalidade (atualmente é muito lento para números grandes).

  2. Deixar clara a condição que está sendo verificada.

  3. 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() por sympy.isprime() acelera consideravelmente, pois é uma função otimizada e usa algoritmos probabilísticos eficientes para grandes números.

  • A condição soma - fim == distancia só será satisfeita quando fim == 2 * inicio, o que pode ser checado antes de entrar no loop.


Comentários