Python, comprobador de números primos

Hola, estoy haciendo una función que verifica si un número es primo o no, pero me dice que 9 es primo.

def eprimo(num): if num < 2: return False if num == 2: return True else: for div in range(2,num): if num % div == 0: return False else: return True 

Volverá a partir de la primera iteración de ese bucle for si ha terminado de verificar o no. No debe regresar desde dentro del bucle a menos que el número definitivamente no sea primo. Retire el else y solo devuelva True si el bucle finaliza.

 def eprimo(num): if num < 2: return False if num == 2: return True else: for div in range(2,num): if num % div == 0: return False return True 

Nota de lado de optimización: Realmente no es necesario verificar todos los candidatos de divisor hasta el num . Solo necesitas comprobar hasta la raíz cuadrada de num .

Su bucle for sale justo después de la primera iteración cuando verifica si su número es divisible entre 2. Si su número es par, devolverá False ; De lo contrario, devolverá True .

La solución es no devolver la True inmediatamente; esperar el final de todas las iteraciones en el bucle en su lugar:

 for div in range(2, num): if num % div == 0: return False return True 

Alternativamente, use la construcción all() :

 return all(num % div != 0 for div in range(2, num)) 

En lugar de probar todos los divisores en el rango (2, num), puede extraer la prueba para los números pares y luego hacer un bucle solo en los números impares. Además, como sugiere Bill the Lizard, puedes detenerte en la raíz cuadrada de num. Esto será el doble de rápido:

 def eprimo(num): if num < 2: return False if num % 2 == 0: return num == 2 div = 3 while div * div <= num: if num % div == 0: return False div += 2 return True