Tamiz de Eratóstenes en Python

Manav Narula 15 febrero 2024
Tamiz de Eratóstenes en Python

La Criba de Eratóstenes es un algoritmo muy común para sacar los números primos por debajo de un número dado. Este número debe ser inferior a diez millones.

El algoritmo es simple de entender y se implementa con frecuencia en la programación. Este tutorial demostrará la implementación del algoritmo Tamiz de Eratóstenes de Python.

Comencemos por entender primero la lógica detrás de este algoritmo. Primero, escribimos todos los números entre 2 y el número proporcionado Supongamos 50.

Luego tomamos el primer número primo, 2, y marcamos todos los números mayores que su cuadrado y divisibles por 2. Luego repetimos lo mismo con el siguiente número primo, 3.

El mismo procedimiento se realiza hasta que el número primo 7 cuadrado del siguiente al 7 sea 121 y mayor que 50. Después de marcar todos los números, los valores sin marcar son los números primos hasta el 50.

La siguiente figura muestra el resultado final.

Números primos del 1 al 50 usando tamiz de eratóstenes

Usa el tamiz de Eratóstenes en Python

Primero crearemos una lista del rango requerido. Esta lista marcará True o False para el índice dado.

Inicialmente, la lista contiene todos los elementos como True. Usaremos un bucle anidado para hacer los cambios y marcar las posiciones no principales como Falsas.

Después de esto, almacenaremos las posiciones donde el valor aún es Verdadero en una nueva lista. Esta lista contiene los números primos.

def sieve_of_eratosthenes(val):
    max = val + 1
    lst = [True] * max
    for i in range(2, int(val ** 0.5 + 1)):
        if lst[i]:
            for j in range(i * i, max, i):
                lst[j] = False
    final = []
    for i in range(2, max):
        if lst[i]:
            final.append(i)
    return final


print(sieve_of_eratosthenes(100))

Producción :

[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]

Es posible realizar cambios menores en el código anterior para mejorar la complejidad del tiempo. Por ejemplo, podemos usar conjuntos o diccionarios para filtrar números no primos.

El resultado final se devuelve en una lista, pero use diccionarios o conjuntos mientras marca los números primos y no primos como True o False.

def sieveoferatosthenes_dict(n):
    max = n + 1
    d = dict()
    for i in range(2, max):
        d[i] = True

    for i in d:
        factors = range(i, max, i)
        for f in factors[1:]:
            d[f] = False
    lst = [i for i in d if d[i] == True]
    return lst


print(sieveoferatosthenes_dict(100))

Producción :

[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]

En el ejemplo anterior, usamos el diccionario d para marcar los valores como True o False para filtrar los números primos. El resultado final es una lista.

Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

Artículo relacionado - Python Algorithm