Ayer estaba leyendo un documento que hablaba sobre los números primos y en él aparecia Euclides que dice que hay infinitos números primos (P1* P2* P3*.. *PN)+1, pero después dice que el número resultante puede ser primo o no.
Mi teoría es que si se va multiplicando una sucesión de números primos (sin repetir ninguno) que empieza desde el primer número primo y acaba en cualquier otro número primo y se le suma o resta 1 habremos conseguido un número primo; la razón es que el número que hemos conseguido al multiplicar la sucesión de números es divisible por todos los números por los cuales se ha multiplicado, pero al sumarle o restarle 1 ese número deja de ser divisible y se convierte en un número primo...
He hecho un algoritmo con java para calcular un número primo muy grande, en mi opinión es bastante eficiente pero tiene un problema, la capacidad de la mayor variable que utilizo (double) es demasiado pequeña para lo que quiero hacer, el mayor número que puedo meter es: 1.7 *10 E 308 y como quiero un numero de 10 millones de cifras para superar el record actual con eso no hago nada, he pensado en un array de double pero necesitaria espacio para 32500 numeros de unas 308 cifras cada uno y aunque luego metiese los resultados de las multiplicaciones de esos números en un archivo y hiciese las operaciones cuando mi ordenador ,que solo tiene 512 MB de RAM, se pusiese a multiplicar un número de 3 millones de cifras por uno de 308 cifras (la capacidad de un double) se me quemaria la RAM, porque ademas no es una sola operacion son operaciones muy intensas sin parar.
He estado mirando páginas web en las que bajándote un programa puedes ayudar a calcular una operacion matematica pero como estan en inglés (y yo de inglés no se mucho) no les he enviado un email para ver si me podían ayudar.
¿Por qué cambiar de algoritmo para calcular los números primos?
Pues porque el que hay ahora 2 E NP -1 (2 elevado a un numero primo, al resultado se le resta 1) el resultado que da no se sabe si es primo y hay que comprobarlo, con mi algoritmo no hay que preocuparse de si es o no primo porque (al menos teoricamente) ya he probado que siempre da números primos y os dejo esta lista con los diez primos números primos para que lo comprobéis:
La lista tendrá este formato:
multiplicación = resultado(r) solucion1(r-1) y solucion2(r+1) 2 = 2 1 y 3 2*3 = 6 5 y 7 2*3*5 = 30 29 y 31 2*3*5*7 = 210 209 y 211 2*3*5*7*11 = 2310 2309 y 2311 2*3*5*7*11*13 = 30030 30029 y 30031 2*3*5*7*11*13*17 = 510510 510509 y 510511 2*3*5*7*11*13*17*19 = 9699690 9699689 y 9699691 2*3*5*7*11*13*17*19*23 = 223092870 223092869 y 223092871 2*3*5*7*11*13*17*19*23*29 = 6469693230 6469693229 y 6469693231
El código fuente para aplicar esta idea es el siguente:
class Primo_mas_grande {
public static void main(String Args[]) {
int contador_primos;
double i,j,numero_primo, otro_contador=0;
double primos[] = new double[500];
primos[0]=3;
for(i=7, numero_primo=30/* 2*3*5*/, contador_primos=3/*ya he puesto 3 primos*/, j=1;i<=700;i+=2
/*solo cuentan los números impares*/) {
if(otro_contador==4 ) {
i+=2; /*si el número acaba en 5 se le suma 2*/
otro_contador=0;
}
otro_contador++;
for(int b=0;;b++) {
if(i%primos[b]==0) break;
if(i%primos[b] !=0 && primos[b]>(i/3)) { /*si el numero es menos del triple que otro
el numero es primo*/
contador_primos++;
primos[(int)j] = i; /*si es primo se mete en el array*/
j++;
numero_primo*=i;/*se multiplica el primo por el resultado de la multiplicaciçon de los
primos anteriores*/
break;
}
}
}
numero_primo += 1;
System.out.println("El numero primo obtenido es: "+numero_primo+ " y se ha utilizado un total de
"+contador_primos+" sin contar el 1");
}
}
/*Solo calculo los números hasta 700 porque si meto mas primos no caben en la variable numero_primo*/
Los problemas que tiene ya los he comentado, no tengo ni suficiente RAM, ni variables con capacidad suficiente ni un supercomputador para poder hacer el cálculo en un tiempo razonable.
No sabia muy bien donde poner esto, ni si es adecuado ponerlo en kriptopolis, o es algun consejo o que me digais si conoceis alguna web en castellano parecida a http://www.mersenne.org/ (su página en castellano no va) para poder pedir ayuda para calcular el algoritmo, si veis algun error en la explicación, teoria o código también os agradecería que me lo dijeseis.
Puede que publicando esto aqui alguien que puede calcular el algoritmo me lo robe, 100.000 dólares de premio son muy tentadores.
El hilo me trajo mis recuerdos...
caralfre23 Febrero 2009 - 10:11pm
¡Ay! Pues sí! este hilo me trajo a la memoria mis sueños fallidos de estudiante universitario de dedicarme a las matemáticas en mi tiempo libre y producir resultados de primera línea...(recuerden el caso de Karl Weirtrass, si es que se escribe así...)
He disfrutado mucho toda la discusión y obtengo en ganancia unos magníficos enlaces y un corazón renovado.
Pero también quiero decir algunas cosas:
Al igual que mi compañero anterior, me venía quedando estupefacto cada vez que leía que "he creado tal o cual cosa y es la mejor del mundo..." ¡juas!
¿Que no tienen cultura matemática? ¿No saben que a estas cosas se han dedicado durante siglos los grandes matemáticos del pasado y todavía no acabamos de salir de los pañales?
¿Cómo pueden tener tales pretensiones?... Al leer la biografía de los grandes Físicos y Matemáticos del pasado (los mejores 4 años y medio de mi vida), llegué a la conclusión de que habían sido grandes por su manera de pensar sencilla... Y aparte, me impresionó su modestia, pongamos por caso la comunicación que dirigieron a la academia de ciencias los esposos Curie por su descubrimiento del Polonio o la carta de Pascal a Fermat en donde le dice que él declara que busque competidores en otra parte, pues él es simplemente incapaz de resolver los problemas que Pierre le propone...
En fin, para despedirme no me queda mas que decir que el tema de los números primos está por producir ricos resultados en la investigación matemática, ahora que la tecnología comienza a brindarnos unas herramientas que si los Fermat, Euler, Gauss, Euclides etc, etc tuvieran en sus manos, nos demostrarian en cuestión de minutos que ¡no somos nada!
Un saludo y un abrazo a todos. Eso, a continuar con su ánimo y sus investigaciones sin amilanarse.
No sé ni cómo he acabado aquí
anónimo22 Febrero 2009 - 6:13pm
No sé ni cómo he acabado aquí, pero me hace mucha gracia la gente que aparece aquí diciendo que han inventado el mejor algoritmo para hacer tal o cual cosa... Yo también hago algoritmos, porque me divierte y aprendo, pero asumo que el algoritmo que me invente o bien ya está inventado, o existe uno mejor, por lo menos hasta que sepa bastantes más matemáticas... En cualquier caso, si fuera un auténtico experto en matemáticas y descubriera un algoritmo que a mi me parece óptimo, haría mil y una pruebas e investigaciones para ver si no se ha inventado antes o si no tiene algún fallo antes de venir a una página cualquiera como esta a decir que soy un genio, y entonces lo publicaría oficialmente...
En cualquier caso, la idea del artículo no estaba mal, pero muchos incluído el propio autor ya han dicho el fallo que tiene...
El que escribió lo del test de Lucas - Lehmer, jaja...
anónimo14 Diciembre 2008 - 9:23pm
Bueno, pues sólo hay dos formas sencillas y determinantes de comprobar con total seguridad si un número es primo, son la sección de primera instancia, o sea calcular los primos por debajo de la raíz y comprobar si alguno de esos lo divide y el segundo comprobar si el factorial de (p-2) dividido entre p deja de resto uno, o más formalmente;
p es primo sí y sólo sí (p-2)! ≡ 1 mod p
Otras pruebas que nos dan resultados con muchas probabilidades de que el número sea primo son el pequeño Teorema de Fermat ;
x^(p-1)≡ 1 mod p -----------> 2^112 - 1 es múltiplo de 113 ---->113 seguramente es primo
y el algoritmo más utilizado en la práctica es el test de miller-rabin que nos dice si un número de 100 a 500 cifras es primo o compuesto con una probabilidad de acierto tan alta como queramos.
Para 5^155 mod 157 te sirve la calculadora de windows, vas a ver --- científica y tienes la operación módulo justo a la derecha de la división. 5^155 mod 157 = 63 Si no en casi cualquier lenguaje de programación la operación modulo se utiliza con el símbolo %.
Como si fuera por mi este tema sería eterno en esta página tenéis los programas más potentes de factorización; http://www.asahi-net.or.jp/~KC2H-MSM/mathland/matha1/
Como calcular 5^155mod157?
anónimo12 Octubre 2008 - 1:09pm
Hola! he estado leyendo todo el hilo y me ha parecido muy interesante. Yo no soy programador y no tengo ni idea pero me gustaria saber con que soft podria hacer una operacion como esta: 5^155mod157...la calculadora del google solo me deja hasta 5^22mod157. Yo necesito la secuencia de cero a 5^P-1modP. A ver si me podeis echar una mano. Gracias
como probar ?
anónimo10 Octubre 2008 - 6:16am
Cuales son los criterios para decidir si un primo de n cantidad de digitos, lo es ?
Aparte del Teorema de Lucas...
algoritmo de factorizacion
anónimo5 Octubre 2008 - 12:22am
He diseñado el algoritmo de factorizacion mas rapido que existe, se basa en el principio de que si uno calcula el resto de un numero en modulo m y el numero y el modulo tiene el mismo factor el resto tendra el factor, y el algoritmo habra achicado el numero hasta el resto, lo unico que hay que hacer es multiplicar todos los numeros hasta la raiz de n, y calcular el modulo con el numero a factorizar. el unico probema es el tiempo en calcular el factorial cosa que he encontrado para calcular muy rapidoooooooooooo
Como alguién pidió un poco de seriedad, pues vamos...
anónimo24 Mayo 2008 - 3:59am
A mi me que tendrías que utilizar el Test de Lucas - Lehmer!!!
Lo explico aquí y a ver si ahora me dejan postear porque antes no pasé el comentario.
Se define la siguiente función;
L1=4
Ln=L(n-1)^2 - 2
Los valores que vamos obteniendo son; 4,14,194,37634 y luego comprobamos si 2^n - 1 divide a L(n-1). Por ejemplo; 2^5-1 = 31. Como 31 divide a 37634 es primo. Para números muy grandes puedes utilizar la aritmética modular, pero realizando la comprobación con L(n-2) y en lugar de tener los valores 4,14... tendrías;
L1---((4*4)^2 - 2) mod 31 = 14
L2---((14*14) - 2) mod 31 = 8
L3---((8*8) - 2 ) mod 31 = 0 (Por lo tanto 31 es primo)
Es decir, siempre tendrás números que podrás trabajar normalmente con cualquier ordenador.
Otro cantar es la cantidad de operaciones que tendrás que realizar para llegar a superar 2^32.582.567 - 1 que es el récord. Además si miras las condiciones del concurso verás que las fórmulas generadoras de grandes primos que sí existen no están permitidas
Existe una libreria en C para cáculos de precisión arbitraria
anónimo17 Mayo 2008 - 1:21pm
GNU Multiple Precision Library
Si quieres hacer cálculos de números primos tienes que hacerlo en C necesariamente. Olvídate de Java, Python o equivalentes. Funcionan muy bien pero son muy lentos para este tipo de aplicaciones (aunque para muchas otras son geniales). No he usado la libreria de la que hablo pero tiene muy buena pinta. De hecho tiene alguna función a la que se le pasa un número y te dice si es primo o no. Como es software libre puedes echarle un vistazo al código, seguro que te resulta interesante.
Otra cosa, no hagas los cálculos utilizando un double, te dará problemas. Lo apropiado es utilizar tipos de datos enteros, un long o un long long. Esta librería tiene su propio tipo de dato apropiado para ello. Suerte!
aqui podeis observar otro metodo
anónimo17 Mayo 2008 - 2:08am
estuve revisando en el internet y me toco ver esta otra teoria en la obtencion de numeros primos aqui les paso el link.
http://www.conacyt.gov.bo/convocatorias/publicaciones/LosNum...
ahi nos vemos
Cogiendo los n primeros primos
Rafagb11 Mayo 2008 - 1:00pm
Cogiendo los n primeros primos, multiplicándolos y sumando o restando uno no consigues un primo. No siempre. Lo que puedes asegurar es que ninguno de los n primos que has tomado al principio divide al número así fabricado. Lo cual no es lo mismo.
termino general para una sucesion de numeros primos
anónimo7 Mayo 2008 - 5:44pm
Yo logre deducir un termino general para una sucesion cuyos valores de An solo son primos sin importar que el valor de n sea 1,2,3...o un numero muy grande...
quisiera saber si hay alguna recompensa para esto devido a que no hay tal termino general (exepto el mio).
Muchas gracias
un poco tarde...
anónimo12 Abril 2008 - 10:13pm
Hola amigos:
entiendo que estamos a 12 de abril del 2008 y la última vez que se habló aquí fue en diciembre del 2007; lo cual hace que llegue tarde...
pero teniendo en cuenta que comenzaron a hablar en el 2005, por ende... asumo que no seré el último ya que el tema da para rato...
Recuerdo una profesora de Algebra (muy grossa) que decía que era imposible hallar un algoritmo que encuentre todos los
números primos...
en su momento no sabía nada de programación, ahora se muy poco, pero me animo a refutarle:
si bien los primos son infinitos y no existe computadora capaz de procesar infinitos datos, eso sería un impedimento a
APLICAR el algoritmo, pero no que ese algoritmo no exista...
usando el compilador Dev-c++ preparo una función que me diga si el número ingresado es o no primo.
para eso le digo que lo compare con todos los que sean menores o iguales a su mitad si, ya se que es en vano compararlo con 4,6,8... ya que todos son múltiplos de dos. lo mismo con los múltiplos de tres, cinco, siete y cada primo que vaya a pareciendo.
el algoritmo es fácilmente optimizable, pero no es a lo que apunto ahora.
luego le digo al main que tire un enorme "for" desde 2 hasta el número que yo le diga.
y que enumere cada número que la función le diga que es primo.
con eso, el algoritmo cumple con encontrar TODOS los números primos menores al que yo ingrese.
mi procesador es de 64 bits, y usando unsigned long int puedo representar hasta 18446744073709551616,
y saber cuantos primos hay menores a ese número...
insisto... la limitación no es el algoritmo sino el procesador... probándolo con mejores herramientas podrían encontrarse
números más altos...
como dijo alguien más arriba, están intentando volar hasta el sol con alas de cera...
pero si de a poco la tecnología nos permite fabricar alas más resistentes?
saludos
Ezequiel
cualquier puede calcula
anónimo8 Diciembre 2007 - 2:29am
cualquier puede calcular un numero primo mayor que el mas grande pero lo que realmente se intenta desde siempre es calcular el siguiente al ultimo mas grande. De que carajo te servira calcular un numero mucho mas grande que el mas grande conocido si por el medio te habras saltado innumerables numeros primos :?
Tengo mi propio algoritmo...
anónimo10 Octubre 2007 - 6:12am
He descubierto recientemente un algoritmo muy sencillo y "elegante" por el cual puedo en unos segundos dar con un primo mayor que cualquier primo que me plantees. Se basa en una conjetura a la que de momento no puedo dar demostración (estoy trabajando) pero no tenia ni idea de lo del premio, ¿en que consiste exactamente?.
Más que plantear un algoritmo de búsqueda (el procedimiento resulta ridiculamente sencillo, tanto que prácticamente puedo hacerlo de cabeza) te plantearía la posibilidad de que desarrolles un método para demostrar que los números que puedo proporcionarte on efectivamente primos.
por favor, ponte en contacto conmigo. Creo que podría resultar interesante y fructífero.
Mientras tanto seguiré trabajando en mi demostración.
algoritmica y metologia
anónimo18 Septiembre 2007 - 3:15pm
como resuelvo este algoritmo en codigo y en diagra de flujo
.....determinar el numero primo mayor que un numero
Un código en C bastante eficiente
anónimo5 Septiembre 2007 - 8:34am
Este código en C es bastante eficiente para calcular números primos, córrelo. Sin embargo... tengo el mismo problema que tú con los doubles. Si logra alguien hacer que C trabaje con indeterminados dígitos este código es suficiente para encontrar cualquier primo.
#include
using namespace std;
class primo {
private:
public:
long buscaprimo (long n){
int i, contador;
i=2; contador=0;
while (i>val;
cout << " " << endl;
primo a1;
int resultado;
resultado=a1.buscaprimo(val);
if (resultado==1)
cout << "El numero " << val << " es primo" << endl << endl;
else
cout << "El numero " << val << " no es primo" << endl << endl;
cout << "Por favor, haga clic en la opcion de su preferencia:" << endl;
cout << "1) Volver a intentar" << endl;
cout << "2) Terminar"<< endl;
int opcion;
cin >> opcion;
if (opcion==1){
long val;
cout << "Dame un numero: ";
cin >> val;
cout << " " << endl;
primo a1;
int resultado;
resultado=a1.buscaprimo(val);
if (resultado==1)
cout << "El numero " << val << " es primo" << endl << endl;
else
cout << "El numero " << val << " no es primo" << endl << endl;
system ("pause");
}
else{
system ("pause");
return 0;
}
}
Yo hice un algoritmo en java para calcular el Erlang B con bigIn
anónimo5 Julio 2007 - 6:08pm
Hay una clase BigInt en java que te permite almacenar numeros enteros de precision arbitraria:
http://www.cs.huji.ac.il/~noam/intro2cs2001/www/exercises/ex8/assignment...
Dios te bendiga
Si alguien sabe a donde debo enviar (Institución de evaluación) una investigacion que realice sobre buscadores tematicos basados en un arbol que descubri; del cual ya realice la programacion en algun lenguaje. Estoy seguro que este arbol y su comportamiento sirve a otras areas del conocimiento.
El algoritmo no es fiable
anónimo25 Junio 2007 - 12:12pm
La multiplicacion de varios primos, si asegura que el numero resultante es divisible por todos los primos que son multiplos de el, pro no te asegura que a sumarle o restarle uno, y todos los primos que eran multiplos dejen de serlo o por lo menos la mayoria, esto haga que sea primo al no ser posible dividirlo por los primos inferiores que antes eran multiplos de el. Un ejemplo sencillo es que al multiplicar el 5 y el 7, primos con los que es facil calcular, con los que tenemos como resultado 35, divisible entre 5 y 7, pero si le sumo 1 me da como resultado 36, el cual es divisible por 2, dando 18 el resultado, por 3, dando 12 el resultado, y por 6 dando 6 el resultado. Si al 35 le resto 1 me da como resultado 34, que dividido por 2 da 17 y dividido entre 17 da 2. Este fallo que al ser numeros pequeños hemos podido ver facilmente, con numeros mas grandes es posible que sea mas dificil verlo dando la impresion de que el numero es primo, que un numero no sea divisible entre primos no asegura que no sea divisible entre numeros compuestos.
Díficil díficil
anónimo2 Junio 2007 - 6:26pm
Hola me interesa mucho el tema de generación de primos inmensos. No se si conoceis los números de Mersenne pero por si acaso aquí os dejo el enlace. Son números del estilo 2^n - 1 y si no me equivoco 2^(32,582,657)-1 es el último número primo encontrado en Septiembre de 2006.
Yo he hecho algo con PVM y el teorema de euclides pero hacen falta del orden de miles de computadores para aproximarme a esa cifra según mis cálculos teóricos.
En fin...
Tiempos de cálculo de números primos
ildefonso4227 Septiembre 2006 - 3:10pm
Yo utilizo mis propias librerias (en Pascal) para cálculos con BigNumbers, y obtengo los tiempos siguientes:
Calculo de todos los primos entre X y X+1000:
Para X= 10 elevado a 18 (18 cifras): 7 segundos.
El ordenador es un simple Pentium a 700 Mhz
El algoritmo es el de Miller, aplicación del pequeño teorema de Fermat:
Si P es primo entonces A elevado a (P-1) módulo P es igual a 1, para todo A
Pruebo con 25 valores primos de A, y si todos dan 1, considero P primo
Mis librerias trabajan hasta con unas 500 cifras, no hay ensamblador.
La probabilidad de error (que P no sea primo y pase los 25 tests) es inferior a 1 parte en 30 millones.
Sobre demostraciones y tiempos
Hassius9 Enero 2006 - 10:35pm
Muchacho, le aconsejo que utilice demostraciones matemáticas.
No cometa el error de pensar que algo funciona porque funciona para 10,
100 o 10000 casos, debe probarlos para todos, es decir infinitos.
Si luego de haber leído el comentario del participante anterior
desea seguir su aplicación, para ganar tiempos le recomiendo
que deje el java y utilice lenguaje c (asumo que poo no tiene
relevancia en este tema)
o en el peor de los casos pascal o algo parecido,
recuerde que utilizando java
usted tiene atrás una máquina virtual que utiliza muchos recursos!!!
Si le importa la portabilidad utilice sólo ansi c!!!
Ganancia de tiempo asegurada!!!!
Otro paso mas
anónimo27 Diciembre 2005 - 5:57pm
Otra pekeña mejora ke deja los tiempo de la siguiente manera:
100.000 -> 0s
1.000.000 -> 1s
10.000.000 -> 14s
100.000.000 -> 224s (3min 44s)
1.000.000.000 -> 4.343s (1h 12min 23s)
Y esta vez me he atrevido a hacer la prueba con el valor maximo (2.147.483.646), tardando 12.219s (3h 23min 39s) en calcular los 105.097.565 primeros numeros primos.
Subo el programa pero lo continuo llamando "NumerosPrimos v2"... ya sabeis, en la segunda web de la firma en la seccion de Programas.
---------------------------------------------------------------
¿Quieres convertir tu Siemens A55 en C55 o tu A56 en C56?
Thubam
Pasito a pasito.
Thubam17 Diciembre 2005 - 5:02am
He conseguido una nueva mejora. Ahora los tiempos se han reducido a la mitad e incluso mas para calculos mayores (podeis comparar con los tiempos indicados en comentarios anteriores):
100.000.000 -> 304seg (5min 4seg)
1.000.000.000 -> 6240seg (1h 44min 0seg)
Lo he subido a la segunda web de mi firma en la seccion Programas, su nombre es "NumerosPrimos v2". Dejo la version anterior del programa por si alguien kiere comparar resultados (si lo haceis dejad vuestros comentarios por aki ;) )
-----------------------------
A55@C55 & A56@C56
Thubam
contraejemplo
pablojofre14 Junio 2006 - 7:10pm
Pablo Jofré
30031 es divisible por 59, el teorema de la infinitud de los números primos asegura que: "el producto de los primeros n primos, aumentado en una unidad (o disminuído), al que llamaremos J, no es divisible por ninguno de los n primeros primos, pero no puede asegurar que no existe numero mayor que el primo de orden n y menor que J que no lo divida. les aseguro que la distancia entre el primo de orden n y J es lo suficientemente grande para los primeros valores de J. En algún momento también caí en la "trampa".
Soys poco aplicados
remolon2 Febrero 2005 - 9:46pm
Lamento quitaros la ilusión, pero me temo
que intentais llegar al Sol con alas de cera,
como Icaro en la mitología griega.
Por favor, un poco de seriedad:
http://www.arrakis.es/~mcj/primos1.htm
Saludos
Algoritmo para obtener Números Primos Grandes en buen tiempo.
jjangel16 Enero 2005 - 8:00am
No quiero desanimar los buenos intentos que se hacen
para la obtención de números primos, me parece una idea
buena, sin embargo haces unos años, tres investigadores
de la India dieron a conocer un nuevo algoritmo deterministico que encuentra
números primos grandes en tiempo polinomial.
La información puede verse en la excelente pagina del número primo
http://www.utm.edu/research/primes/
Y en Kriptópolis :)
JoseLo16 Enero 2005 - 5:22pm
En este post de Alfonso Muñoz. Y yo mismo puse algo en este comentario aunque el tema era otro.
Un saludo.
--
Eso es una cuestión de opinión :)
Tiempo de computacion
sopadeajo12 Enero 2005 - 4:13am
Por tus datos parece, (por los 2 últimos) que el tiempo es del orden de n^(1,42),siendo n el número hasta el que se ha llegado.
Es decir ,si multiplicas por 10 el número ,tardas 10^(1,42)=26 veces más.Para llegar a un número de 20 dígitos (10^19)tardaríamos
(10^19/10^9)^(1,42)=(10^10)^1,42=1,6*10^14 veces más o sea 4.5 horas*1,6*10^14=7*10^14 horas=80.000 millones de años.
Hay programas ,como Primo de Marcel Martin que te dicen si un número de 20 dígitos es primo o no en menos de 1 minuto,pero tarda ya 7 meses para un número de 7000 dígitos y 50 años para uno de 21000 dígitos.Es el más rápido que hay para primos que no tengan ninguna forma especial.
Y es que estas cosas son de flipar.
Factores
Thubam12 Enero 2005 - 4:46am
Pues no me habia puesto a calcular cual es la funcion ke dicta el tiempo de computo para el algoritmo, asi ke te agradezco ese dato.
Tb decir ke el programita es bastante simple, y solo es capaz de trabajar con numeros hasta (2^31)-1 ya ke las variables son de tipo int (esto es pk los tipos long int y unsigned int o bien tienen el mismo rango (en el caso del tipo long) o bien a partir de un determinado valor el programa piensa ke ha comenzado de nuevo por 1 (caso del tipo unsigned)). Esto no se si es problema del compilador, librerias,... simplemente lo digo desde la experimentacion con dichos tipos.
De igual forma el algoritmo para comprobar si un numero es o no primo tiene el mismo rango de uso, y por tanto, el comprobar si el nº mayor es o no primo se hace en menos de un segundo. Claro ke esto no es nada significativo (el tiempo solo lo mido en segundos, asi ke no se cuanto se puede acercar este tiempo a 1s y cualkier tiempo menor de este sera indicado como 0s). Ademas ke tp se podria comparar 2.147.483.647 (limite superior del rango) con un numero de 100 digitos o mas...
Tambien juega un factor bastante importante la makina dnd se corra el programa, siendo los tiempos bastantes diferentes entre una makina con un micro Athlon a 1333MHz, en un Athlon XP2600+ a 1912MHz, o en un Athlon64 3000+ a 2GHz. Asi pues a medida ke la tecnologia avanza (y lo hace bastante rapido) los tiempos de computacion bajan.
Pero bueno, el caso es ke me gustaria ir un paso mas alla en la optimizacion de este algoritmo, y mejorar asi el tiempo de computo, pero ya no se me ocurre nada para dar ese paso... asi ke si alguien tiene una idea se agradece cualkier ayuda.
Mas optimizado aun
Thubam7 Enero 2005 - 6:22am
Pues eso, he retocado un poco el programa y eliminado divisiones ke no tenian ningun sentido. Como es sabido cualkier numero se puede escribir como producto de numero primos, por lo tanto toda division por un numero par y mayor de 2 es inutil y solo sirve para consumir tiempo de proceso. Eliminando estas los calculos a realizar son la mitad ke anteriormente y realmente se confirma viendo los resultados para numeros grandes, asi por ejemplo el calculo de los primos menosres de 100.000.000 antes tardaba casi 1400 segundos, mientras ke ahora tarda algo menos de 700.
Esta claro ke si kitaramos tb los multiplos de 3, los de 5, los de 7,... el proceso seria muchisimo mas rapido. Es decir, lo ideal seria dividir solo entre los primos menores ke la raiz cuadrada del numero ke estemos comprobando si es o no primo, pero para esto solo se me ocurre ir guardando cada primo calculado entre los numeros anteriores y usarlos para realizar las divisiones con cada numero, sin embargo tal cantidad de numeros se comen literalmente la memoria y el proceso es muchisimo mas lento, ni ke decir tiene si en lugar de guardarse en la RAM se guardaran en un fichero del disco duro el proceso seria tb lento y al final para numeros muy grandes tb acabaria consumiendo la memoria del sistema, al tener ke cargarse en memoria una larga lista de numeros primos.
A alguien se le ocurre alguna forma mejor (mas rapida) de realizar los calculos de los X primeros primos?? O alguna optimizacion??
Re:
Thubam7 Enero 2005 - 6:59am
Se me olvidaba decir ke se realizan la mitad de operaciones en el peor de los casos, esto es, cuando el numero es primo :p
Por si alguien kiere probar el programita lo podeis descargar de aki:
NumerosPrimos
tened en cuenta ke estais descargando un .EXE, asi ke pasadle un antivirus antes. Para ejecutarlo hacedlo desde la linea de comandos del simbolo del sistema (pk sino la ventanita se cerrara al finalizar y no podreis ver nada), podeis hacerlo escribiendo solo el nombre y se os preguntara hasta ke cifras kereis el calculo, o bien pasandole dicho numero como argumento:
C:>numerosprimos
o
C:>numerosprimos numero
para guardar los resultados en un fichero no teneis mas ke encaminar la salida al fichero ke sea (aunke asi no se mostrara nada por pantalla):
C:>numerosprimos numero >fichero
PD:Si probais el programa, decidme cuanto tiempo ha necesitado para numero=100.000.000 (si os atreveis con algun cero mas no os corteis :p ) y ke PC teneis.
Actualizacion del enlace al programita NumerosPrimos
Thubam17 Noviembre 2005 - 7:19am
El anterior enlace al programita no funciona y el nuevo enlace es este: NumerosPrimos
PD: No he actualizado el comentario antes pk ni recordaba este link, pero hoy revisando los logs vi ke habia varios intentos de acceder a este archivo...
-----------------------------
http://www.a55-c55.tk
http://www.thubam.tk
Otra pekeña mejora
Thubam12 Enero 2005 - 2:23am
Otra pekeña mejora en el programita consigue bajar algo mas los tiempos de calculo, kedando estos asi:
100.000 -> 0s
1.000.000 -> 2s
10.000.000 -> 26s
100.000.000 -> 605s (10min 5s)
1.000.000.000 -> 15.863s (4h 24min 23s)
Muy lento :-/
JoseLo15 Enero 2005 - 5:18pm
Desde 1999 está disponible el código fuente de una pequeña librería en C para sistemas típo unix que además suministra dos pequeñas utilidades de línea de comandos: una permite generar números primos hasta 1000000000000000 (10^15=mil billones), la otra es un buscador de "brechas" (secuencias de números compuestos entre dos primos consecutivos)
Los tiempos de ejecución medidos en un PII-350 para el generador de primos son:
100.000 ~ 0.05 seg
1.000.000 ~ 0.15 seg
10.000.000 ~ 1.2 seg
100.000.000 ~ 12 seg
1000.000.000 ~ 120 seg
10.000.000.000 ~ 22 minutos
Lo más importante de esto no son los tiempos de ejecución ya que la librería no usa la criba de Erastótenes y la diferencia en velocidad se debe a que el algoritmo que usa es una mejora sustancial del algoritmo del griego :)
Lo más importante es que el código fuente está disponible para que todo el mundo pueda aprender de el.
Aprender de alguien que sabe más es algo que más de uno por aquí debería poner en práctica.
bye
--
Eso es una cuestión de opinión :)
Guauuuuu!!!!
Thubam15 Enero 2005 - 6:13pm
IMPRESONANTE. Lo ke yo tardo en calcular 4.5h ese akgoritmo lo hace en 2mins, es decir 132 veces mas rapido, y sin tener en cuenta ke son tiempos de un micro a 350Mhz y los mios en una de casi 2GHz...
Yo no soi matematico ni cuento con mas conocimientos sobre los numeros primos ke los minimos ke suele tener todo el mundo, por esto la manera de calcular los primos en el algoritmo es la "estandar", es decir realizar sucesivas divisiones, aunke despues lo he ido depurando un poco y eliminando muchas divisiones inutiles (como por rjemplo todas las de los numeros pares mayore ke 2). Tb buske por Inet y solo descubri ke hay algoritmos ke calculan mediante MCD si dos numeros son primos entre si, pero este metodo conlleva un mayor numeros de divisiones asi ke es mucho mas lento... y lo de usar curvas elipticas como ke "me suena a chino".
Me encantaria ver como es el algoritmo, si pudieras poner un enlace a el te lo agradeceria bastante.
Paso a paso ...
JoseLo16 Enero 2005 - 6:41pm
... que el camino es largo.
Si lo de las curvas elípticas te suena a chino, lo de las formas cuadráticas binarias irreducibles debe sonarte a tibetano. ;D
La matemática ya no es igual que en la época de los griegos. Hoy el algoritmo de Erastótenes se enuncia en términos de la enumeración de valores de la forma cudrática binaria reducible xy. La mejora a la que me refiero en el post anterior se conoce como "criba de Atkin" y se enuncia en términos de la enumeración de valores de ciertas formas cuadráticas binarias irreducibles.
El algoritmo (tanto la criba de Erastótenes como la de Atkin) está descrito en este "paper" (PDF)
En él encontrarás un enlace a una implementación de la criba de Atkin.
Por cierto, en el post anterior se me olvidó mencionar otra pequeña utilidad de shell que permite calcular el número de primos menores que un número dado. En realidad es un test de velocidad de la librería y por eso se me pasó por alto, pero es muy útil. :)
--
Eso es una cuestión de opinión :)
Java no se compila en el sent
pardal4 Enero 2005 - 7:50pm
Java no se compila en el sentido estricto como el C por ejemplo, se compila a un codigo intermedio que luego ejecuta la maquina virtual. Pero la maquina virtual es lo bastante inteligente como para compilar el codigo que va a ejecutar y optimizarlo para tu procesador. Osea, la mayor parte del codigo es como si estubiera compilado y cargado en memoria.
Y en general es mas buena optimizando que lo que lo uno pueda conseguir escribiendo directamente en ensamblador, excepto casos muy concretos. Piensa que optimizar es complicado, tienes que colocar intrucciones agrupadas de forma que el procesador las pueda ejecutar en paralelo. Lo que a primera vista pareceria lento, en realidad se ejecuta mas rapido.
Mi consejo seria que pruebes en java, si ya estas familiarizado, iras mucho mas rapido. Que te hagas una idea de como va, la velocidad y de donde podrias ganar algo y luego intentes optimizar solo si vale la pena. Igual te llevas la sorpresa de que no ganas apenas nada.
Con los BigInteger puedes hacer cosas como almacenar numeros de centenares de digitos, multiplicarlos, dividirlos, llamar a una funcion que te dice si es primo (probable), etc. Todo eso ya esta hecho, probado y optimizado.
Por ejemplo:
BigInteger b1 = new BigInteger("8888812345678891111112");
BigInteger b2 = new BigInteger("9999912345678891111112");
Ahi puedes meter tantos digitos como quieras, en principio. Y luego hacer cosas como:
res = b1.divide( b2 );
res = b1.multiply( b2 );
b1.isProbablePrime(1); <- devuelve true/false
etc.
Es realmente facil y rapido de programar y no hay que preocuparse de lo grande que sea el numero. Para pruebas es perfecto.
Mirate la documentacion de sun, es bastante facil aunque hay que ir probando.
Actualizar tu programa para que trabaje con estos numeros es casi inmediato. Luego lo puedes dejar horas trabando hasta que te canses.
Yo tambien me he roto los cuernos un poco con estos temas.
Saludos
optimizacion
pardal4 Enero 2005 - 8:09pm
En mi anterior mesaje han volado las 3 ultimas lineas, en fin.
Una optimizacion rapida mirando un poco tu programa, es que no hace falta que lleges hasta un tercio del numero que compruebas, con llegar a la raiz cuadrada es suficiente.
Si por ejemplo el bucle esta comprovando el numero 10001, con comprovar hasta el 101 es suficiente, no hace falta ir hasta el 3000.
Si tiene un divisor entero, tendra por lo menos otro divisor. Uno de los dos ha de estar forzosamente por debajo de la raiz cuadrada del numero, puedes comprovarlo.
Esto acortara los tiempos bastante para numeros grandes.
Saludos
Re: optimizacion
Thubam4 Enero 2005 - 8:25pm
Asi mismo es como calculo los primos en mi algoritmo, pero ya podeis ver los tiempos ke va tardando cuando los numeros se van haciendo mas grandes (22-23 minutos para calcular los primeros 5.8 millones de numeros primos :p ).
Primos
Thubam4 Enero 2005 - 7:01pm
Yo tengo un par de programas para generar los X primeros numeros primos y otro para comprobar si un numero dado es o no primo. Eso si, no estan optimizados ni mucho menos (ademas ke el compilador ke uso tiene un fallo y me genera el codigo de debug aunke desactive esa opcion y el .EXE ocupa 440Kb cuando no deberia pasar de 20Kb o poco mas), y estan hecho para int (es decir ke estan bastante limitados).
El de generar los primeros primos tarda en calcular los primos:
menos de 1 segundo hasta 100.000
7 segundos hasta 1.000.000
69 segundos hasta 10.000.000
1385 segundos hasta 100.000.000
............
Estos calculos se han hecho mientras se ejecutaban otras tareas pero podeis haceros una idea de lo ke tardaria con todos los digitos ke pretendeis (aunke tb es verdad ke kitando un simple contador ke dice la cantidad de primos generados, y ke solo sirve como curiosidad, se bajan unos cuantos segundos)
Código fuente classe BigInteger
zeus544 Enero 2005 - 3:20pm
Respuesta a pardal:
Las clases que trae java no me las he mirado mucho, hace poco que estoy con java y con el colegio no he tenido tiempo de ponerme en serio con él.
La clases BigInteger suena interesante, ¿sabes donde esta el código fuente de esa clase?
Segun lo que he escuchado java no se compila del todo porque pierde sus mejores propiedades, portabilidad, seguridad, etc. Sino que se va compilando mientras se va ejecutando si es asi se pierde bastante tiempo. Con eso del codigo maquina nativo no entiendo que quieres decir, ¿pasa el código java a ensamblador y luego lo ejecuta? si hace eso mejor escribir el codigo en ensamblador, asi seguro que es mas eficiente.
Me parece que los primos mas grandes conocidos no se ha demostrado que lo son, sino que se han supuesto que lo son. Creo que lo mejor es intentar hacer una lista completa de todos los numeros primos desde el 1 hasta X haciendola crecer, eso facilitaria las cosas a los programas de criptografia que tienen que calcular numeros primos muy grandes o eso creo. De momento voy a seguir aprendiendo java y lo combinare con ensamblador y algoritmia, en cuanto pueda me pondre hacer la lista esa de numeros primos, aunque no pueda llegar muy lejos por las limitaciones de mi ordenador.
BigInteger
pardal4 Enero 2005 - 1:58pm
Has mirado la clase BigInteger (java.math.BigInteger) y compañia? Viene con el JRE estandard de java y te facilita mucho las cosas. Permite incluso generar numeros primos probables de los bits que quieras:
http://java.sun.com/j2se/1.4.2/docs/api/java/math/BigInteger.html
No sera tan eficiente como en C, pero el trabajo que te ahorra es muchisimo. Ademas hay que tener en cuenta que java compilado y cargado en la jvm se ejecuta en codigo maquina nativo.
Respecto al algoritmo, supongo que este tipo de aproximaciones ya estaran bastante trilladas. Y que pasa si coges el numero primo mas grande conocido hasta la fecha, lo multiplicas por otro primo o por si mismo y le restas uno. Supongo que el tiempo que necesitaras solo para demostrar que es primo sera brutal. Porque creo que ese es uno de los metodos usados.
Puede que algun dia lo consiga
zeus542 Enero 2005 - 10:00pm
respondo a Mithrandir666:
Puede que más adelante, cuando domine más java, aprendere ensamblador y utilizare el ensamblador para las operaciones (por su eficiencia) y Java para manejar todo lo otro.
Lo que has dicho de la clase para manejar enteros de longitud arbitraria lo tendre en cuenta la proxima vez que lo haga.
respondo a sopadeajo:
Eso de los primos gemelos a primera vista parece bastante más fácil que el número primo de 10 millones de digitos, al menos utilizando "fuerza bruta" puede que también lo intente más adelante de momento seguire aprendiendo java.
PD: Ya he comprobado que mi algoritmo no se cumple.
Java no Python si
anónimo30 Mayo 2007 - 1:46am
Estimado, he leido tus dilemas, y te propongo que trabajes con otro lenguaje de programacion
C y C++ son mas eficientes que java desde luego, pero no te permieten trabajar con numeros de tantos digitos.
Sin embargo python te permite trabajar con largos indeterminados.
si no lo crees mira un simple ejemplo mio:
>>> print pow(25,1000)
870980981621721667557619549477887229585910374270538861664349322949828885
340626741378473875079978788106556408717745512063620430237198833632508279
0824523036861101510642310297318447709123389909423848058563741972347190631
037097171023413380668241414700728236292773514839473656091148077736590843
829271858158119489111346172569156704165450765756969786882964666248393140
109267575668656408298646070204782097365838907453671672111084786993170266
671074617066361875947135006391938516720952066668786783643050569131627555
772825443192202344728299862325347122982599626872616462694211150589984160
695878009089205793496692367369138273474482983971728958032776671155797534
940527121150874216297971559649762801049039753450465677856954534268254341
852956454284242934621120533951374600285384915464962670268988864342143564
817254507584260454411083557907581652637627076370977974936091524648573492
321785474712689085955921654034206967162205440970870425343051747838142719
951184454116021190019932676989631583660352193458980692548134866635939714
653527236052218936036231623449630232267998890233331755343019458150138631
277297447700057982818129921667532664411723954458093534437165699093082974
942430071690521240520515991064485660006040292614878811004636108229416459
721345185526447158906837895065758610176983854320292100380027943225395420
207520222138666413804725767545421539197820832759366485245492231492825396
79916226305067539215087890625
eso fue solo un simple ejemplo, en realidad python trabaja con numeros tan grandes com quieras, y es realmente muy facil de usar, muy preciso, open source, y viene por defecto en las actuales distribuciones linux
prueba por ese lado seria mi consejo.
Te robo el algoritmo.Soy rico!!!!!!!
sopadeajo2 Enero 2005 - 9:28pm
El algoritmo es cojonudo y me voy corriendo a cobrar los 100000$$$$$!!!!!
Yo,que tú ,no lo hubiera puesto en Kriptópolis...
La demostración de Euclides es:
Hay infinitos números primos puesto que si fueran finitos en número n,el producto de todos ellos más 1 sería un compuesto;pero ninguno de sus factores primos podía ser p1,p2,...,pn.Luego hay al menos otros 2 números primos si pn#+1=pn*...*p1+1 no es primo o al menos uno si es primo.Y así sucesivamente,por lo que hay infinitos números primos.
De hecho hay gente que se ha dedicado a buscar primos de esta forma y la inmensa mayoría son compuestos (p#n+/-1).Los primos muy grandes de esta forma son primos de coleccionista.(aunque haberlos,haylos...)
Los primos de Mersenne son de la forma 2^p-1 con p primo.
p debe de ser ptimo,sino son compuestos.Pero que p sea primo no garantiza que 2^p-1 sea primo,por lo que se deben probar todos los primos p.Se han descubierto sólo 38 o 39 hasta 10^(6000000) (6 millones de dígitos).Un mes de computación basta para saber si un número de esta forma es primo o no,gracias a un teorema de Lucas ,y algunas cosas más.
De no haber sido por Lucas (hasta luego Lu....) se necesitarían unos 15000 millones de años (la edad estimada del Universo) para saber si son primos o no.
Por la gloria de mi madre!!!.....
Pero la tristeza no debe invadirte.Aún quedan muchas cosas.
Intenta demostrar que hay infinitos primos gemelos p y p+2:no hay por ahora ningún premio,pero te cubrirías de gloria.
El récord del mundo son 2 primos gemelos de unos 50000 dígitos descubiertos por un tal Daniel Papp con Proth.exe del gran Yves Gallot
Que lo sepas...
Saludos cordiales.
Usa aritmética entera
Mithrandir6662 Enero 2005 - 8:38pm
Aparte de que tienes que cambiar de algoritmo, deberías usar C o C++ en lugar de java, que son lenguajes mucho más eficientes.
La aritmética de coma flotante no te merece la pena por dos motivos:
- acumularás errores de precisión
- es más lenta que la aritmética entera
Deberías construirte una clase que permitiese majenar enteros de longitud arbitraria y que optimizase algunas operaciones.
Buena suerte!
Fallo en el algoritmo
zeus542 Enero 2005 - 5:25pm
No habia pensado en que cuando se multiplica una succesion de numeros primos se consigue un numero y se le suma y resta uno se consigue un numero que puede ser divisible por un numero primo mas grande que los numeros primos utilizados en la multiplicacion.
De momento he comprobado que restando 1 al resultado falla (209 es divisible entre 11), pero sumando 1 no me esta dando fallos hasta el momento.(hasta el 2311 todos son primos)
Según lo que estoy viendo el sumar o restar uno es casi aleatorio, en 2,6,30, valen los dos, en el 210 es +1, en el 2310 valen los dos, en el 30030 es -1.
Lo siento por molestaros para nada, me he precipitado a la hora de dar mi algoritmo por bueno y no he probado lo que decia.
El algoritmo soñado...
anónimo10 Octubre 2008 - 12:39pm
Hola,
si tu algoritmo devolviese siempre números primos, habrías encontrado el "santo grial" de cualquier hacker de contraseñas del mundo. Matemáticos de todas las épocas han intentado encontrar una fórmula matemática que permita, dada una secuencia finita de números primos, obtener los siguientes, sin necesidad de comprobarlos uno a uno.
Por lo tanto, es lógico que tenga algún fallo... Si encuentras el algoritmo "bueno", piensa que serás el dueño del Mundo, podras violar todas las claves de encriptación existentes en un tiempo razonable.
En fin... ¡Suerte!
Teoria mala
anónimo18 Agosto 2008 - 10:23pm
Hola amigo:
Lamento ser aguafiestas pero lo que tu planteas es errado. Los numeros que se generan a partir de la multiplicación de dicha sucesión de numeros que termina en un número primo "x", y luego sumarle uno, no son todos primos. En efecto, puede resultar que obtengas números que sean de otra naturaleza, aquellos que son divisibles por números mayores al primo "x".
Sin embargo, es correcto que todos esos números obtenidos no serán divisibles por ningún número primo menor a tu número primo "x". Es por eso porque la idea del griego si es válida, pues lo que el prueba es que si hubiese un número primo mayor que todos (es decir, que este tipo de números fuese un conjunto finito), entonces se produciría la contradicción mencionada: un número generado por dicha sucesión, por su construcción, o es primo, como tu bien dices, o si no, es divisible por un primo mayor a "x" (el número que habíamos planteado como el mayor de los primos).
El tema este de los números primos es muy interesante, y en efecto no esta claro siquiera si se puede describir una sucesión de números primos o no. El sólo hecho de probar que exista o que no exista una forma simple o cerrada de escribir dichos números es, a mi parecer, merecedora de unos cuantos dólares. Hasta hoy, el ser humano solo conoce la forma extensiva para obtener números primos, es decir, revisar uno por uno.
Saludos, Jesús Aparicio, el chisusvolador.
Fallo en +1 y -1
kikegall4 Marzo 2005 - 7:47pm
Lo siento:
2*3*5*7*11*13*17=510510
510510+1=510511=19*97*277
510510-1=510509=61*8369