Miembro eliminado 6516 Jorge2019
Cuando dimita Pedro SánchezEntonces cuándo acaba el plazo?
El 17 de febrero de 2025?
Cuando dimita Pedro SánchezEntonces cuándo acaba el plazo?
El 17 de febrero de 2025?
Jo, ya me parecía que tardaba mucho. Gracias!Has puesto 100 millones no?
Son 10
ABRAZOS GRATIS
@Jorge2019 y yo estabamos a punto de medirnos las pollas haciendo un reto de programación y bueno, en vez de ser entre dos pues que sea entre todos los que se animen
En este caso es generar e imprimir los primeros primos contenidos hasta el número 10.000.000 o lo que es lo mismo, los primos que hay entre el 0 y el 10.000.000
El más rápido gana, de momento eso lo dejamos para luego porque cada ordenador es un mundo y ya se verá como se hace
Y bueno, aqui tenemos una implementación a lo bruto, es O(n²) pero hace el trabajo y por lo tanto es mi primera "entrega", muy mejorable pero de eso se trata, de que haya una compentecia para darle emoción al asunto
Rust Playground
A browser interface to the Rust compiler to experiment with the languageplay.rust-lang.org
No puede ser más sencillo, literalmente coge un número y prueba a dividir entre todos los demas a partir del 2, si nadie lo divide es que es primo. Solo calcula hasta 100 porque da lo mismo 100 que 10 millones, el algoritmo es el mismo
------------------------------------------------
Trucos para detecar si un número es primo
- En vez de probar desde el 2 hasta n (o el propio número) hay una propiedad matemática que dictamina que solo es necesario probar hasta raiz de n, o lo que es lo mismo, si tengo el número 100 para ver si es primo le hago la raíz que es 10 y solo tendría que probar desde el 2 hasta el 10, me ahorro probar desde el 10 hasta el 99, un ahorro de calculo importante
- Hay otra propiedad llamada teorema fundamental de la aritmética que dice que se pueden encontrar rangos de números entre los que no hay primos, viene a ser k!+2, k! + 3,..., k!+k
! es el factorial, pongo un ejemplo, para k = 6
__ 6!+2 = 722
__ 6!+3 = 723
__ 6!+4 = 724
__ 6!+5 = 725
__ 6!+6 = 726
Con lo que en el rango de [722,726] no hay números primos, si en vez de k = 6 usamos un valor grande el rango será más grande (el rango es de k elementos) y puede ahorrar más tiempo de cálculo porque vamos eliminando opciones
-----------------------------------------------
Pues nada, espero que os animeis
mereido![]()
En la carpeta de MEGA hay dos ficheros
- reto_primos_precalculados.7z que es el que los ha precalculado en tiempo de compilación, he subido la version .exe ya que entiendo que nadie más usa Linux como yo por si alguno quiere ejecutarlo de forma cómoda. El tiempo de compilación ha sido de 6.969 segundos y el de ejecución 216ms con lo que lo que yo sabía, menos de un segundo en total de ejecución
- reto_primos_tiempo_real.7z que es el que calcula en tiempo real los valores de los primos, 1.7 segundos en total, incluye el ejecutable para windows por si alguien tiene curiosidad en probarlo por si mismo
Los tiempos que obtengais seguramente sean mejores porque tengo muy mal rendimiento I/O, cosas que pasan, unos de los SSDs (un kingston) les hace la puñeta al resto y en cuanto hay la más mínima carga de trabajo de I/O el ordenador lagea que da gusto, es un fallo conocido pero Kingston dice que lo ha solucionado con un firmware, en fin, yo era cliente fiel de la marca pero ya no, bloquea al resto y hace que escribir un archivo de mierda no sea instantáneo, no digamos si se trata de leer cosas o escribirlas
A mi no me gusta hacer asi las cosas, ¿querías el código? Pues nada, en cuanto he llegado a casa lo he creado y listo pero mal, porque de ese código pues no voy a poder explicar mucho por no decir nada, si hubiera tenido mi margen para crearlo en la nube pues sería mucho más didáctico que era la única intención por la que te dije que sí a esto, para que todo el mundo aprendiese, los ejecutables estan porque me niego a ir diciendo como se compila o solucionar los errores que se puedan ir teniendo
Por mi parte es el fin, ya he subido el código y aunque tiene margen de mejora es que no, esto ha pasado de ser algo divertido a ser una obligación y yo las obligaciones me las quito rápido de encima y por lo tanto es una buena solución, una que se que es complicado superar y acabo con esto para pasar al siguiente tema o lo que quiera
Si hay poco tiempo no es lo mio, a mi me gusta disfrutar y dar una oportunidad al resto, que sea algo interesante. Yo anoche mismo podría haber creado ambos proyectos y acabar de un plumazo con las opciones de todo el mundo pero es que no era mi idea o intención. No me divierto, yo dejé de competir a nivel nacional pese a que se me daba bien porque había un crono contando, me gusta saborear el momento yendo a mi ritmo
Joder gente llego tarde , váis a hacer más así?

Algo tiene que ver con el hilo, yo hace años, era muy muy muy muy friki con los ordenadores, andaba con los amigos con LN2 en los PCs y competiamos en una liga mundial que hay del programa SuperPi, que viene a ser algo parecido, buscar numeros primos en un tiempo, pues llegue a tener el record de España en la categoria de 1M.

Yo nunca he sido de forzar la máquina, justo lo contrario, yo hago underclock a mis ordenadores
Prefiero eficiencia y menos ruido a potencia bruta
Me alegro, cada uno disfruta a su manera de esto![]()
@JC Denton tu programa es muy rápido
puede que más rápido que mi script
pero sucede una cosa
yo he contado tanto el tiempo que tarda el script en encontrar los primos como el tiempo que tarda en imprimir los números
tu programa creo que solo cuenta el tiempo en el que imprime los números
por lo que me gustaría que me aclarases esa duda
y de tal manera necesitaría que el programa contase el tiempo que tarda en encontrar los primos
deja de mosquearte shur
siempre hemos estado de coña
perdona si se ha rozado mi alma con la tuya
solo quería arañar tus emosiones
pero eso, esto es para todos, tú y yo solo eramos dos participantes más y te dije que sin tiempos, lo podría entender si llevases esperando 2 o 3 semanas pero es que creo que no llega ni a 16 horas, tienes que relajarte un poco, tú puedes poner lo que sea y me lo tomo bien pero eso, chorradas, te puede el ansia y yo asi ni disfruto ni me lo paso bienEl ejecutable es precisamente para eso, para que no tengas que compilar nada, se compilan con "cargo run --release", cuando tengas instalado Rust descomprimes el que quieras de los dos, entras y viendo el fichero .toml te vas a la barra del explorador y escribes "cnd" + intro y luego el cargo run --release
Una vez que los compile el ejecutable esta en target -> release (o debug si no has puesto lo de --release) -> Estará el ejecutable o libreria si es que lo es
Obvia decir que los programas no contienen nada, el antivirus puede detectar lo que sea pero vamos, por eso esta el código, el que quiera puede compilarlo. Si lo compilas y lo pruebas te pasará lo mismo y si miras el código verás que no hay nada raro en el
Y como es esperable he jugado limpio, en el que es precalcular solo imprime el tiempo de main de 216 ms aunque he dicho lo que ha tardado en ser compilado, en el otro incluye el tiempo de calcular e imprimir
No se trata de rozar pero calmate coño, no seas un caga prisas, es que no habían pasado ni 24 horas. Te dije que te iba a destrozar y por lo que pudiste leer era evidente que se más que tú con lo que era muy posible, yo te estaba dejando manga ancha, voy de farolpero eso, esto es para todos, tú y yo solo eramos dos participantes más y te dije que sin tiempos, lo podría entender si llevases esperando 2 o 3 semanas pero es que creo que no llega ni a 16 horas, tienes que relajarte un poco, tú puedes poner lo que sea y me lo tomo bien pero eso, chorradas, te puede el ansia y yo asi ni disfruto ni me lo paso bien
Macho, tienes que entenderlo, la inspiración divina llega cuando llega, a veces se hace de rogar, como eres hombre de poca fe pues no lo entiendes pero es asi, las cosas llevan su tiempo
y lo que me he reído qué
a?
yo sabía que iba a perder
pero y el bañito de humildad que te has llevado qué?
a?
hemos hecho un ejercicio de mierda que hacen los chavales en sus cursos cutres
lo hice ayer cuando terminé de currar, me fui a cagar y volví al foro para meterte prisa
y las risas que me he echado metiéndote prisa que?
a?
de todas formas no cantes victoria porque no son las 00.00
aún se puede presentar otro más rápido que tú
sostaría wuapo
si te has estresao no me es mi problema shur
no te lo tomes como algo personal
![]()

Precisamente por eso no quería hacerlo, es que no han pasado ni 24 hora y ya con prisas
Hay gente que no vive por y para forear y a mi con la presión del reloj no me gusta hacer las cosas
Olvidate de mi, cuelga lo que sea a ver si está por debajo de 7 segundos que es la segunda más rápida![]()
Joder, hacía como 30 años que no programaba en BASIC... xDD
He usado PCBASIC (un intérprete-emulador de GWBasic) para redactar un pequeño programa que resuelve la cuestión. Funciona muy bien, pero que nadie me pida récords de procesamiento... xDDD
Por ejp.: Tarda 40 segundos en obtener todos los primos entre 1 y 10.000. Claro que rulando bajo un intérprete, que es una patata hecha a posta para trabajar a la velocidad de los viejos PCs de los 80...
10 CLS20 PRINT "CALCULADORA DE NUMEROS PRIMOS"30 PRINT "Calcula los números primos entre 1 y el número introducido"40 PRINT50 INPUT "Introduzca número: ",N60 CLS70 PRINT 2,80 FOR A=3 TO N STEP 290 FOR H=2 TO INT(SQR(A))100 IF A/H=INT(A/H) THEN 130110 NEXT H120 PRINT A,130 NEXT A
Lo ideal sería compilarlo. Entonces volaría... Voy a ver si existe un compilador que rule bajo Windows, y si eso pruebo.
EDITO: Acabo de comprobar que el reto era los N primeros números primos, no los primos que hay en una secuencia de N números desde el 1...
Mañana lo cambio. Es fácil.

??Más de uno con ese GOTO encubierto en la línea 10 se sacaría los ojos![]()
Le he añadido una pequeña mejora a tu código y me da este resultado:He probado con varios algoritmos
el que mejor resultado me ha dado ha sido con Eratóstenes
aquí la waina
Python:import numpy as np import math from timeit import default_timer as timer def sieve_of_eratosthenes(limit): sieve = np.ones(limit, dtype=bool) sieve[:2] = False # 0 y 1 no son primos for num in range(2, int(math.sqrt(limit)) + 1): if sieve[num]: sieve[num*num::num] = False return np.nonzero(sieve)[0] if __name__ == '__main__': LIMIT = 10_000_000 # Medir el tiempo para calcular los números primos start_time_calc = timer() primes = sieve_of_eratosthenes(LIMIT) end_time_calc = timer() calc_execution_time = end_time_calc - start_time_calc # Medir el tiempo de impresión start_time_print = timer() print(f"Números primos entre 0 y {LIMIT}:") for prime in primes: print(prime) end_time_print = timer() total_execution_time = end_time_print - start_time_calc print_execution_time = end_time_print - start_time_print # Resultados print(f"Total de numeros primos encontrados: {len(primes)}") print(f"Tiempo para calcular los numeros primos: {calc_execution_time} segundos") print(f"Tiempo para imprimir los numeros primos: {print_execution_time} segundos") print(f"Tiempo total (calculo + impresion): {total_execution_time} segundos")
Total de numeros primos encontrados: 664579
Tiempo para calcular los numeros primos: 0.01990989997284487 segundos
Tiempo para imprimir los numeros primos: 6.470142100006342 segundos
Tiempo total (calculo + impresion): 6.490053399989847 segundos

le has bajado un guebazo de tiempo a la impresiónLe he añadido una pequeña mejora a tu código y me da este resultado:
Total de números primos encontrados: 664579
Tiempo para calcular los números primos: 0.017976699999962875 segundos
Tiempo para imprimir los números primos: 2.1272690999999213 segundos
Tiempo total (calculo + impresión): 2.145247500000096 segundos
P.D.: Por cierto, enhorabuena @Jorge2019 buen código![]()
no se han hecho comprobaciones debidamentePor curiosidad ¿El tiempo de ejecución cómo lo medís? ¿Cada uno con su máquina?

Perdona que no haya puesto el código. Quedaría así:le has bajado un guebazo de tiempo a la impresión
cómo lo has hecho shur?
gracias por la felisitasión
no se han hecho comprobaciones debidamente
tampoco se han estipulado límites ni requerimientos
el reto es que no hay reto
![]()
import numpy as np
from timeit import default_timer as timer
def sieve_of_eratosthenes(limit):
sieve = np.ones(limit, dtype=bool)
sieve[:2] = False # 0 y 1 no son primos
for num in range(2, int(np.sqrt(limit)) + 1):
if sieve[num]:
sieve[num*num::num] = False
return np.nonzero(sieve)[0]
if __name__ == '__main__':
LIMIT = 10_000_000
# Medir el tiempo para calcular los números primos
start_time_calc = timer()
primes = sieve_of_eratosthenes(LIMIT)
end_time_calc = timer()
calc_execution_time = end_time_calc - start_time_calc
# Medir el tiempo de impresión
start_time_print = timer()
print(f"Números primos entre 0 y {LIMIT}:")
print(primes.tolist())
end_time_print = timer()
total_execution_time = end_time_print - start_time_calc
print_execution_time = end_time_print - start_time_print
# Resultados
print(f"Total de números primos encontrados: {len(primes)}")
print(f"Tiempo para calcular los números primos: {calc_execution_time} segundos")
print(f"Tiempo para imprimir los números primos: {print_execution_time} segundos")
print(f"Tiempo total (calculo + impresión): {total_execution_time} segundos")
no sabía tal cosaPerdona que no haya puesto el código. Quedaría así:
He quitado el bucle que había para imprimir y lo he sustituido por el método tolist() que tienen las matrices de numpy quedando al final un sólo print(primes.tolist()). Además hago todo con numpy (incluyendo la operación de la raíz cuadrada) por lo que me ahorro importar la librería math que suele ser más pesada.Python:import numpy as np from timeit import default_timer as timer def sieve_of_eratosthenes(limit): sieve = np.ones(limit, dtype=bool) sieve[:2] = False # 0 y 1 no son primos for num in range(2, int(np.sqrt(limit)) + 1): if sieve[num]: sieve[num*num::num] = False return np.nonzero(sieve)[0] if __name__ == '__main__': LIMIT = 10_000_000 # Medir el tiempo para calcular los números primos start_time_calc = timer() primes = sieve_of_eratosthenes(LIMIT) end_time_calc = timer() calc_execution_time = end_time_calc - start_time_calc # Medir el tiempo de impresión start_time_print = timer() print(f"Números primos entre 0 y {LIMIT}:") print(primes.tolist()) end_time_print = timer() total_execution_time = end_time_print - start_time_calc print_execution_time = end_time_print - start_time_print # Resultados print(f"Total de números primos encontrados: {len(primes)}") print(f"Tiempo para calcular los números primos: {calc_execution_time} segundos") print(f"Tiempo para imprimir los números primos: {print_execution_time} segundos") print(f"Tiempo total (calculo + impresión): {total_execution_time} segundos")