"""
  Programa para calcular los primeros N numeros primos usando 
  el algoritmo de la criba de Eratostenes
  Autor: Antonio Carrillo Ledesma
"""


class Criba_Eratostenes:
    """
    Clase para calcular los primeros N numeros primos usando
    el algoritmo de la criba de Eratostenes
    """

    def __init__(self, n=10):
        """Constuctor"""
        if n > 0:
            self.N = n
        else:
            self.N = 1
        self.p = []  # inicializa el arreglo que contendra los primos encontrados
        # Guarda el primer primo
        self.p.append(2)
        self.np = 1
        # Empieza la busqueda de primos a partir del numero 3
        self.n = 3
        self.calcula()

    def calcula(self):
        """Calcula los N primeros primos"""
        print("Calcula de " + str(self.np) + " a " + str(self.N) + " primos ")
        # Ciclo para buscar los primeros N primos
        while self.np < self.N:
            xi = 0
            for i in self.p:
                xi += 1
                if (self.n % i) == 0:
                    break
            if xi == self.np:
                self.p.append(self.n)
                self.np += 1
            self.n += 1

    def visualiza(self, n):
        """Visualiza los n primeros primos, en caso de ser necesarios los calcula"""
        if n > self.N:
            self.N = n
            self.calcula()
        # Visualiza los primos encontrados
        print("Visualiza los primeros " + str(n) + " primos ")
        for i in range(n):
            print(self.p[i])

    def __str__(self):
        """retorna los primos calculados"""
        return "\n\n" + str(self.N) + " Primos calculados:" + str(self.p)


if __name__ == "__main__":
    # Solicita el calculo de los primeros primos
    p = Criba_Eratostenes(4)
    print(p)
    p.visualiza(1)
    p.visualiza(4)
    p.visualiza(10)
    p.visualiza(20)
    p.visualiza(5)

    print(p)
