Saltar al contenido

Generador de números primos simple en Python

Nuestro grupo redactor ha pasado mucho tiempo buscando la resolución a tus búsquedas, te brindamos la solución y esperamos servirte de gran apoyo.

Solución:

Hay algunos problemas:

  • ¿Por qué imprimiste el conteo cuando no se dividió por x? No significa que sea primo, solo significa que esta x en particular no la divide
  • continue pasa a la siguiente iteración del bucle, pero realmente quiere detenerlo usando break

Aquí está su código con algunas correcciones, solo imprime números primos:

import math

def main():
    count = 3
    
    while True:
        isprime = True
        
        for x in range(2, int(math.sqrt(count) + 1)):
            if count % x == 0: 
                isprime = False
                break
        
        if isprime:
            print count
        
        count += 1

Para una generación de primos mucho más eficiente, vea el tamiz de Eratóstenes, como han sugerido otros. Aquí hay una implementación agradable y optimizada con muchos comentarios:

# Sieve of Eratosthenes
# Code by David Eppstein, UC Irvine, 28 Feb 2002
# http://code.activestate.com/recipes/117119/

def gen_primes():
    """ Generate an infinite sequence of prime numbers.
    """
    # Maps composites to primes witnessing their compositeness.
    # This is memory efficient, as the sieve is not "run forward"
    # indefinitely, but only as long as required by the current
    # number being tested.
    #
    D = 
    
    # The running integer that's checked for primeness
    q = 2
    
    while True:
        if q not in D:
            # q is a new prime.
            # Yield it and mark its first multiple that isn't
            # already marked in previous iterations
            # 
            yield q
            D[q * q] = [q]
        else:
            # q is composite. D[q] is the list of primes that
            # divide it. Since we've reached q, we no longer
            # need it in the map, but we'll mark the next 
            # multiples of its witnesses to prepare for larger
            # numbers
            # 
            for p in D[q]:
                D.setdefault(p + q, []).append(p)
            del D[q]
        
        q += 1

Tenga en cuenta que devuelve un generador.

def is_prime(num):
    """Returns True if the number is prime
    else False."""
    if num == 0 or num == 1:
        return False
    for x in range(2, num):
        if num % x == 0:
            return False
    else:
        return True

>> filter(is_prime, range(1, 20))
  [2, 3, 5, 7, 11, 13, 17, 19]

Obtendremos todos los números primos hasta el 20 en una lista. Podría haber usado Tamiz de Eratóstenes pero dijiste que querías algo muy simple. 😉

re es poderoso:

import re


def isprime(n):
    return re.compile(r'^1?$|^(11+)1+$').match('1' * n) is None

print [x for x in range(100) if isprime(x)]

###########Output#############
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

valoraciones y reseñas

Recuerda difundir esta sección si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *