def crivo(N):
    """Gera a lista de todos os primos entre 2 e N, inclusive"""
    candidatos = range(2,N+1)
    informações = [0]*len(candidatos)
    #legenda: 0 é "não sei ainda"
    #1: sei que é primo
    #2: sei que é composto

    índice_atual = 0

    #fazer passagens pela lista, obtendo informações;
    #a cada passagem, o menor número sobre o qual eu não concluí nada, na verdade, é primo
    #depois retiramos seus múltiplos, começando em seu quadrado
    while candidatos[índice_atual]**2 <= N:
        informações[índice_atual] = 1 # novo primo encontrado
        primo_atual = candidatos[índice_atual]

        #retirar seus múltiplos, a partir de seu quadrado
        for índice_composto in range(primo_atual**2 - 2, N-1,  primo_atual):
            informações[índice_composto] = 2

        #atualizar o índice_atual para começar a próxima passagem pela lista
        while informações[índice_atual] != 0:
            índice_atual += 1

    #passagens finalizadas; tudo que eu não concluí ser composto, na verdade é primo!
    primos = []
    for índice in range(N-1):
        if informações[índice] != 2:
            list.append(primos,candidatos[índice])

    return primos
        
