Isso esta certo?

Primos da forma 6x-1 até 1000 : [5, 11, 17, 23, 29, 41, 47, 53, 59, 71, 83, 89, 101, 107, 113, 131, 137, 149, 167, 173, 179, 191, 197, 227, 233, 239, 251, 257, 263, 269, 281, 293, 311, 317, 347, 353, 359, 383, 389, 401, 419, 431, 443, 449, 461, 467, 479, 491, 503, 509, 521, 557, 563, 569, 587, 593, 599, 617, 641, 647, 653, 659, 677, 683, 701, 719, 743, 761, 773, 797, 809, 821, 827, 839, 857, 863, 881, 887, 911, 929, 941, 947, 953, 971, 977, 983]
Compostos da forma 6x-1 até 1000 : [35, 65, 77, 95, 119, 125, 143, 155, 161, 185, 203, 209, 215, 221, 245, 275, 287, 299, 305, 323, 329, 335, 341, 365, 371, 377, 395, 407, 413, 425, 437, 455, 473, 485, 497, 515, 527, 533, 539, 545, 551, 575, 581, 605, 611, 623, 629, 635, 665, 671, 689, 695, 707, 713, 725, 731, 737, 749, 755, 767, 779, 785, 791, 803, 815, 833, 845, 851, 869, 875, 893, 899, 905, 917, 923, 935, 959, 965, 989, 995]
Tempo de execução: 0.000000 segundos (verificador teste 6x-1 primo ou nao primo)

ve se vc encontram algum erro… o tempo é bom medio , rapido para essa quantidade

o ruim é que tem que salvar todos

Compostos da forma 6x-1 até 100000 :
Tempo de execução: 0.031182 segundos
nao vou postar todos os numeros , so pra vê o tempo Primos da forma 6x-1 até 10000000 :
Compostos da forma 6x-1 até 10000000 :
Tempo de execução: 29.735742 segundos

Para saber se está certo ou não temos de saber o que pretendes. Parece-me, pelos números que mostras, que queres saber todos os números primos que obedecem à fórmula 6n-1. E queres saber se o teu cálculo para 10000000 em 29segundos é bom.
Em cima do joelho fiz um método que me dá o mesmo em menos de 2 segundos…

n: 1000 Primos: 86 Compostos: 80 Tempo: 13 ms

n: 100000 Primos: 4806 Compostos: 11860 Tempo: 8 ms

n: 10000000 Primos: 332383 Compostos: 1334283 Tempo: 1250 ms

… portanto 29 segundos está longe de ser bom.

Se mostrares o que tens, podemos guiar-te no caminho certo.

No seu caso específico, acho que dá pra otimizar um pouco. Em vez de testar um a um se é primo, é mais simples calcular apenas uma vez uma lista contendo todos os números primos até o valor limite. Está cheio de algoritmos assim por aí, exemplo.

Depois, basta ver quais números estão nesta lista pré-calculada:

import time

# adaptado de https://stackoverflow.com/q/4643647
def primesbelow(N):
    #""" Input N>=6, Returns a list of primes, 2 <= p < N """
    correction = N % 6 > 1
    N = {0:N, 1:N-1, 2:N+4, 3:N+3, 4:N+2, 5:N+1}[N%6]
    sieve = [True] * (N // 3)
    sieve[0] = False
    for i in range(int(N ** .5) // 3 + 1):
        if sieve[i]:
            k = (3 * i + 1) | 1
            sieve[k*k // 3::2*k] = [False] * ((N//6 - (k*k)//6 - 1)//k + 1)
            sieve[(k*k + 4*k - 2*k*(i%2)) // 3::2*k] = [False] * ((N // 6 - (k*k + 4*k - 2*k*(i%2))//6 - 1) // k + 1)
    return [2, 3] + [(3 * i + 1) | 1 for i in range(1, N//3 - correction) if sieve[i]]

start = time.time()
limite = 10000000
smallprimeset = set(primesbelow(limite))
def isprime(n):
    # http://en.wikipedia.org/wiki/Miller-Rabin_primality_test#Algorithm_and_running_time
    if n % 2 == 0:
        return False
    return n in smallprimeset

compostos = []
primos = []
n = 5 # começa do 5 (valor de '6x - 1' quando x=1)
while n < limite:
    if isprime(n):
        primos.append(n)
    else:
        compostos.append(n)
    n += 6 # soma 6 para encontrar o próximo número na forma 6x - 1

total = time.time() - start

Neste caso, eu gerei todos os primos menores que 10000000 e converti para um set, pois a busca em um set é mais rápido que em uma lista. Depois, para cada número, basta verificar se está no set para saber se é primo.


Vale lembrar que para medir tempos com mais precisão, recomenda-se usar o módulo timeit.

import time

def primos_e_compostos_6x_menos_1_ate(n):
inicio = time.time()

# Gera candidatos da forma 6x - 1 até n
candidatos = [6 * x - 1 for x in range(1, (n + 1) // 6 + 2) if 6 * x - 1 <= n]

compostos = set()

for p in candidatos:
    if p in compostos:
        continue
    x = (p + 1) // 6
    y = 1
    while True:
        composto = (6 * (x * (6 * y + 1) - y)) - 1
        if composto > n:
            break
        compostos.add(composto)
        y += 1

primos = [num for num in candidatos if num not in compostos]
compostos_finais = sorted(compostos.intersection(candidatos))

fim = time.time()

print(f"\n✅ Primos da forma 6x - 1 até {n}:")
print(primos)

print(f"\n❌ Compostos da forma 6x - 1 até {n}:")
print(compostos_finais)

print(f"\n⏱ Tempo de execução: {fim - inicio:.4f} segundos")

Exemplo de uso

limite = 10000000
primos_e_compostos_6x_menos_1_ate(limite) o codigo é esse postei errado , postei outro
10000000 1,5 segundo @pmlm @hugokotsubo
:white_check_mark: Primos da forma 6x - 1 até 10000000:

:x: Compostos da forma 6x - 1 até 10000000:

:stopwatch: Tempo de execução: 1.4733 segundos ok so para tester minha ideia . vi que nao é melhor… so para ter base perguntei .valeu. obrigado.

Dica: para formatar o código, basta selecioná-lo e usar o botão </> do editor:

formatarcodigoguj

Isso é mais importante ainda em Python, já que os espaços definem a identação, e sem formatar corretamente fica difícil pra quem quiser copiar o seu código e testar, por exemplo.


Outra alternativa é colocar o código entre ```, podendo inclusive informar a linguagem para que o highlight fique correto. Ou seja, isso:

```python
def f():
    print('oi')

f()
```

É renderizado assim:

def f():
    print('oi')

f()

@hugokotsubo

import time

def primos_e_compostos_6x_menos_1_ate(n):
    inicio = time.time()

    # Gera candidatos da forma 6x - 1 até n
    candidatos = [6 * x - 1 for x in range(1, (n + 1) // 6 + 2) if 6 * x - 1 <= n]
    
    compostos = set()

    for p in candidatos:
        if p in compostos:
            continue
        x = (p + 1) // 6
        y = 1
        while True:
            composto = (6 * (x * (6 * y + 1) - y)) - 1
            if composto > n:
                break
            compostos.add(composto)
            y += 1

    primos = [num for num in candidatos if num not in compostos]
    compostos_finais = sorted(compostos.intersection(candidatos))

    fim = time.time()

    print(f"\n✅ Primos da forma 6x - 1 até {n}:")
    print(primos)

    print(f"\n❌ Compostos da forma 6x - 1 até {n}:")
    print(compostos_finais)

    print(f"\n⏱ Tempo de execução: {fim - inicio:.4f} segundos")

# Exemplo de uso
limite = 1000000
primos_e_compostos_6x_menos_1_ate(limite)