Criba de Eratóstenes
Es un aloritmo que encuentra numeros primos de 2 a N, empieza con el número 2 y tacha todos los elementos que son multiplos del 2, una vez que tacho todos estos sigue el elemento que no ha sido tachado despues de dos y así sucesivamente.
Primero desarrollé la versión en secuencial del algoritmo en Python:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
numeros = [] | |
primos = [] | |
for i in range(2, 100): | |
numeros.append(i) | |
while numeros != []: | |
n = numeros[0] | |
primos.append(n) | |
n = (float(n)) | |
for j in numeros: | |
if ((j % n) == 0.0): | |
numeros.remove(j) | |
print primos |
Ejecución:
Para paralelizarla lo que intenté hacer fué que cada hilo buscara los múltiples de ciertos números en paralelo. Es decir mientras uno buscaba los múltiplos de 2 otro buscara los múltiplos de 3 y así sucesivamente.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
import threading, time | |
import math, random | |
import Queue | |
class primos(threading.Thread): | |
def __init__(self, n, q): | |
threading.Thread.__init__(self) | |
self.n = n | |
self.numeros = [] | |
self.primos = [] | |
def run(self): | |
while self.numeros != []: | |
self.n = self.numeros[0] | |
self.primos.append(self.n) | |
self.n = (float(self.n)) | |
for j in self.numeros: | |
if((j%self.n) == 0.0): | |
q.get(j) # se elimina elemento de la lista | |
q = Queue.Queue() | |
for i in range(2, 100): | |
q.put(i) | |
for i in range(q.qsize()): | |
num = q.get(i) | |
#print num | |
h = primos(100, q) #con un hilo | |
h.start() | |
h.join() | |
for i in range(q.qsize()): | |
num = q.get(i) | |
print num |
Por ahora solo, Roberto Martínez por la propuesta al uso de una herramienta útil para hacer sistemas distribuidos y Emmanuel por la explicación del uso de mpi4 de python ya que yo tenía pensado hablar de eso.
aloritmo
ResponderEliminarMuy bien. Favor de incluir todo en el Wiki ahora que otra vez funciona.