El algoritmo busca el siguiente primo a partir del número que se le ingrese y cuenta con algunos truquitos que implementé para optimizarlo casi un 70%
El Algoritmo está muy comentado para que se pueda entender.
#!/usr/bin/env python #Buscador de Numeros primos a partir de un numero dado # Juan Fernando Hernandez # Universidad de Antioquia - Matematicas Discretas # uso: python eratostenes_criba.py numero_inicial from math import sqrt import sys # Lista de primos y semaforo de llenado de lista lista_p = [2] ultimo_numero = 2 breaker = 1 # Busqueda de primos (true->primo || false->compuesto) def primo(numero): # si es divisible por la lista no es primo (Retorna falso) for i in lista_p: modulo = numero % i if (modulo == 0): return False # Se sabe que como el numero inmediatamente anterior en el bucle es # menor, todos los primos de la lista < raiz de numero actual return llenar_lista(numero) def llenar_lista(numero): global breaker global ultimo_numero raiz = long(sqrt(numero)) # Necesario para no comprobar todos los primos de la lista # se establece un breaker lista_p_len = len(lista_p) raiz_raiz = long(sqrt(raiz)) i = breaker while (i < lista_p_len): if (lista_p[i] >= raiz_raiz): breaker = i; break; i+=1 ultimo_numero += 1 while (ultimo_numero <= raiz): n = 0 while (n < breaker): # Todas las posiciones debajo de breaker modulo = ultimo_numero%lista_p[n] if (modulo == 0): break elif (n == breaker-1): lista_p.append(ultimo_numero) modulo_numero = numero%ultimo_numero if (modulo_numero == 0): return False n+=1 ultimo_numero += 1 ultimo_numero = raiz return True def main(): #n = 10000000000000000000 #Numero minimo n = long(sys.argv[1]) # Minimo numero desde el cual buscar el proximo primo while True: print "Probando primo: ", n if(primo(n)): print "Primo encontrado... " break n += 1 if __name__ == "__main__": main()
Dejo el archivo para su descarga http://pastebin.com/eYqv70q2
No hay comentarios:
Publicar un comentario