'''
Segunda versión de un programa para mostrar números primos entre dos topes, alineados en 10 columnas. Sólo se testean números impares.

Para ver si un número es primo o no, se buscan divisores menores o iguales a la parte entera de su raíz cuadrada, y si no se encuentra ninguno es porque el
número es primo (corolario del Teorema Fundamental de la Aritmética).
'''

# FUNCIONES

def primo(n):
    ''' Busca divisores impares de n hasta a lo sumo la parte entera de su raíz cuadrada. '''
    tope = int(n**0.5)

    if n == 2: return True # caso especial del primer primo, que es par

    if n % 2 == 0: return False # caso especial de números pares, que son divisibles por 2 y por tanto no son primos
    
    posibleDivisor = 3 # primer divisor posible de n

    while posibleDivisor <= tope:
        if n % posibleDivisor == 0: return False
        posibleDivisor += 2 # sólo se buscan divisores impares

    return True # Si no terminó la función por encontrar un divisor dentro del ciclo repetitivo, es porque n es primo

# PROGRAMA

# Prólogo
print('BÚSQUEDA DE NÚMEROS PRIMOS EN UN INTERVALO DE ENTEROS\n')

a = int(input('Ingrese un entero positivo mayor que 1 a partir del cual buscar números primos: '))
b = int(input('Ingrese otro entero positivo mayor que el previo para el tope de búsqueda: '))

print() # salto de línea

if a == 2: # caso especial en el que se pidan primos desde el 2
    print(f'{a:10d}', end=' ')
    candidato = 3
    cantLínea = 1
else: # a>2
    if a % 2 == 0: candidato = a + 1 # si a es par, se comienza a testear el siguiente
    else: candidato = a
    cantLínea = 0

# Desarrollo
while candidato <= b:
    if primo(candidato):
        print(f'{candidato:10d}', end=' ')

        cantLínea += 1
        if cantLínea == 10:
            cantLínea = 0
            print()
        
    candidato += 2

# Epílogo
input('\n\nPulse Intro/Enter para terminar')
