PDA

Ver la Versión Completa : Problema al generar primos en Delphi


XavierAramayo
05-10-2013, 05:49:05
Hola,lo que ocurre es que cuando ejecuto mi programa genera el numero de primos que le pedi pero solamente a partir del numero ingresado,es decir,si coloco un valor de n=7, los numero que me muestra son 7 11 13 17 19 23 29, o si ingreso 4 seria 5 7 11 13, lo que yo qeria conseguir era ungresar un numero n,y que me mostrase los n primeros numeros primos pero tengo ese problema,les agradezco de antemano.

el programa es el siguiente

procedure TForm3.Button1Click(Sender: TObject);
var p,q,r,i,cp,s:integer; res:string;
j: Integer;
begin
r:=strtoint(edit1.Text);s:=r;
p:=2;cp:=0;
while cp menor s do
begin
q:=1;
for i := 2 to s-1 do
begin
if p mod i =0 then
q:=0;
end;
if q=1 then
begin
cp:=cp+1;

p:=p+1;
res:=res+' '+inttostr(p);
label1.Caption:=res;
end
else
p:=p+1;
end;

end;

end.

nlsgarcia
05-10-2013, 07:44:10
XavierAramayo,


...ingresar un número n y que me mostrase los n primeros números primos...


¡Bienvenido al Club Delphi!

Revisa este código:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

// Genera n números primos ( n <= MaxInt )
function GeneratorNumberPrime(Limit : Integer) : TStringList;
var
n,i,c : Integer;
rn : integer;
NumberPrime : TStringList;
Prime : Boolean;

begin

n := 3;
NumberPrime := TStringList.Create;
NumberPrime.Add('1');
NumberPrime.Add('2');
c := 0;

While (c <= Limit - 3) do
begin

Prime := True;
rn := Trunc(sqrt(n));

for i := 2 to rn do
begin
if (n mod i) = 0 then
begin
Prime := False;
break;
end;
end;

if Prime then
begin
NumberPrime.Add(IntToStr(n));
Inc(c);
end;

Inc(n,2);

end;

Result := TStringList.Create;
Result.Assign(NumberPrime);
NumberPrime.Free;

end;

// Genera n números primos, por defecto o error se generan 10.
procedure TForm1.Button1Click(Sender: TObject);
var
Limit : Integer;
begin
Limit := StrToIntDef(Edit1.Text,10);
ListBox1.Items.Assign(GeneratorNumberPrime(Limit));
end;

end.

El código anterior genera n números primos dado un número límite de la función generatriz, como se muestra en la siguiente imagen:

http://imageshack.us/a/img24/3883/rhg5.jpg

El ejemplo esta disponible en el link: http://terawiki.clubdelphi.com/Delphi/Ejemplos/Varios/?download=Generate+Number+Prime.rar

Espero sea útil :)

Nelson.

nlsgarcia
05-10-2013, 18:14:50
XavierAramayo,,

Continuación del Msg #2:



En matemáticas, un número primo es un número natural mayor que 1 que tiene únicamente dos divisores distintos: él mismo y el 1. Los números primos se contraponen así a los compuestos, que son aquellos que tienen algún divisor natural aparte de sí mismos y del 1. El número 1, por convenio, no se considera ni primo ni compuesto.

Tomado de: http://es.wikipedia.org/wiki/N%C3%BAmero_primo


En función de la definición anterior, el código del Msg #2 se redefine a continuación:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
Edit1: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

// Genera n Números Primos ( n <= MaxInt )
function GeneratorNumberPrime(Limit : Integer) : TStringList;
var
n,i,c : Integer;
rn : integer;
NumberPrime : TStringList;
Prime : Boolean;

begin

NumberPrime := TStringList.Create;
c := 0;
n := 2;

repeat

Prime := True;
rn := Trunc(sqrt(n));

for i := 2 to rn do
begin
if (n mod i) = 0 then
begin
Prime := False;
break;
end;
end;

if Prime then
begin
NumberPrime.Add(IntToStr(n));
Inc(c);
end;

Inc(n);

until (c = Limit);

Result := TStringList.Create;
Result.Assign(NumberPrime);
NumberPrime.Free;

end;

// Genera n números primos, por defecto o error se generan 10.
procedure TForm1.Button1Click(Sender: TObject);
var
Limit : Integer;
begin
Limit := StrToIntDef(Edit1.Text,10);
ListBox1.Items.Assign(GeneratorNumberPrime(Limit));
end;

end.

El código anterior, genera n números primos desde el 2 hasta un máximo definido como parámetro en la función generatriz, como se muestra en la siguiente imagen:

http://img543.imageshack.us/img543/8690/iirq.jpg

El ejemplo esta disponible en el link: http://terawiki.clubdelphi.com/Delphi/Ejemplos/Varios/?download=Generator_+of_+Prime_Numbers.rar

Espero sea útil :)

Nelson.

XavierAramayo
05-10-2013, 20:25:17
Muchas gracias [nlsgarcia],ya lo consegui,gracias!

Victor Luis
08-10-2013, 07:18:53
Holas...

Muy bueno el codigo de Garcia, solo que esta limitado a busquedas menores, si ponemos n=1.500.000 tardara un poco mas de 6 minutos que seria encontrar primos hasta 25 millones como limite de busqueda y si n=3.001.146 para encontrar numeros primos hasta 50.000.000 tarda mas de 20 minutos y logicamente al ir incrementando esto se demora cada vez mas. Esto sucede basicamente por 2 razones: 1) Evaluan todos los numeros naturales secuencialmente, donde se deberia no evaluar numeros que sean multiplos de 2, 3 y 5 que de hecho no son primos. 2) Evaluas si es multiplo cada numero natural desde 2 hasta la raiz cuadrada del numero en evaluacion, donde al incrementarse el numero tambien se incrementan los calculos y el tiempo se alarga de una manera exponencial 2/4/8/16/...

◘ El metodo PRI-BASE genera una secuencia base de numeros naturales donde el 50-75% son casi directamente primos, de los cuales solo hay que depurar los que no son primos. En un Rango de 1 a 50.000.000 busca y saca numeros primos en 24-27 segundos y sacar primos en un rango de 1.000.000.000 lo hace en menos de 9 minutos donde encuentra en promedio 36.500.000 nuevos numeros primos.
○ Este tiempo reducido no solo es por generar la secuencia base de numeros casi primos, sino esencialmente porque no factoriza ni realiza calculos para saber si es multiplo de numeros primos anteriores al numero ni hasta su raiz cuadrada; simplemente determina una secuencia para depurar de la base de numeros generados, eliminando los no primos y guardando los nuevos numeros primos.
► Lo que deben considerar si desean buscar numeros primos grandes, es el metodo, si evaluan para saber si es multiplo de otros primos, elproceso sera lento por los calculos, llegara un momento en que las variables no podran hacer estos calculos y necesitaran mucho espacio en su disco duro o enlazar tipo red varias computadoras para almacenar todos los numeros primos que saquen pues los necesitan para ver si es multiplo entre estos.

◘ La sugerencia esta dada, para que lo tomen en cuenta, sin desmerecer los metodos que proponen y funcionan bien hasta cierto limite; el consejo es para quienes quieran buscar numeros primos con millones de digitos.

Un saludo cordial a todos y sigan adelante...

Casimiro Notevi
08-10-2013, 10:17:09
¿Y por qué no lo explicas poniendo el código fuente de ejemplo?, así como lo has explicado queda muy "aséptico y vaporoso", pero no vemos nada tangible :)

nlsgarcia
08-10-2013, 12:39:37
Victor Luis,


...el código de Garcia...esta limitado a búsquedas menores...al incrementarse el número también se incrementan los cálculos y el tiempo se alarga de una manera exponencial...Lo que deben considerar si desean buscar números primos grandes, es el método...

...El metodo PRI-BASE genera una secuencia base de números naturales donde el 50-75% son casi directamente primos, de los cuales solo hay que depurar los que no son primos...


Gracias por tus comentarios :)

En internet conseguí esta referencia al método que sugieres PRI-BASE (http://es.answers.yahoo.com/question/index?qid=20130929220457AABhscf), al parecer la referencia es de tu autoría y en ella se da a entender que es un procedimiento nuevo que tu desarrollastes y que esperas poder patentar, Pregunto: ¿Es correcto?.

Sería muy interesante conocer más detalles de este método y si es posible ver alguna implementación del mismo, el tema de los números primos es muy importante en matemáticas y su aplicación práctica en métodos de cifrado en informática.

Nelson.

Victor Luis
09-10-2013, 09:59:55
Holas Nelson...

Respecto a lo de patentar, busque me dieran sugerencias mas claras de las que encontre y esto porque he ido revisando los metodos publicados en internet desde la criba de Eratostenes hasta los metodos y formulas matematicas que usan para determinar si un numero es o no primo.

◘ Con referencia al metodo PRI-BASE, un hermano mio me dijo una vez que los Incas de Machu-Pichu tenian un metodo con el que obtenian los numeros primos facilmente. Mi pensamiento fue que si ellos no contaban con computadoras ni formulas complejas, como lo podian hacer o tal afirmacion no era cierta.
Antes de saber de la criba de Eratostenes, encontre un metodo para sacar los supuestos primos que se ordenan en columnas, claro que hay varios por depurar. Con ese metodo reduje muchisimo el tiempo de busqueda, por ejemplo hasta el limite de 1 millon encontrar los primos que hay dividiendo y viendo si es multiplo de primos anteriores hasta la raiz cuadrada, tardaba 42 segundos. Aplicando el metodo que mencione, sacaba estos supuestos primos y solo debia depurarlos, sin analizar los demas y el tiempo se redujo a 16 segundos, optimizando un poco lo hacia entre 2-3 segundos.
No se si este metodo lo hicieron ya pero no encontre referencia alguna, de los codigos que publican la mayoria utiliza varios If Then y por referencia se que esto retarda el tiempo de proceso. En este metodo solo usaba 1 If Then que era para finalizar la busqueda.

◘ El Metodo PRI-BASE nace a razon de mejorar el anterior que mencione, donde encontre un modo de obtener los supuestos primos pero mas depurados, por eso los llamo casi primos directos, pues hay pocos por depurar y logicamente el tiempo de proceso se redujo a menos de 1 segundo para un limite de 1 millon.
Dejarlo asi llegaria a lo mismo que los otros metodos, donde uno debe tener a disposicion todos los primos encontrados para factorizar o comprobar que son divisibles. Volviendo a que los Incas no tenian computadoras, encontre la manera directa de depurar los no primos, sin recurrir a todos los primos. Cuando le mando a buscar primos en un rango de 1.000.000.000 el programa solo saca unos datos de algunos primos, entre 50 y 250 a los que llamo activados, ya que luego no necesito volver a leerlos. Esto permite no contar con una super computadora de muchisima memoria en disco duro, solo necesito un archivo de 348 MB donde estan 36 millones de primos para realizar Busquedas con rangos de hasta 1 Billon.
► Encontre una pagina donde por factorizacion evalua si el numero que uno pone es primo o no, donde todos los que fui obteniendo son primos. Baje algunos archivos de listas de primos ya verificados y coinciden con los que voy obteniendo, no conforme con esto hice un procedimiento con el metodo clasico de ver si es divisible entre primos anteriores, los compare y todos coinciden en secuencia y cantidad. Esto me da la seguridad de que el metodo funciona adecuadamente.

◘ Para complementar tu consulta sobre el Metodo PRI-BASE es que el tiempo de busqueda es casi constante y en lugar de alargarse el tiempo de proceso tiende a disminuir, ya que en cada rango buscado encuentra menor cantidad de numeros primos.
Mi Objetivo es determinar cuando ocurre este descenso, ya que hasta ahora no es constante, en ciertos rango aumenta, luego se mantiene y despues disminuye la cantidad de nuevos primos, repitiendose esto pero en forma desordenada.
Otro objetivo es obtener primos gemelos y ver su frecuencia de aparicion, para lo cual el metodo me permite identificar precisamente las posiciones de la secuencia donde estan, si ambos son primos entonces son primos gemelos.

Bueno, esos son algunos detalles del metodo y respecto a publicar el codigo, no lo veo prudente, como dije no he encontrado un metodo similar ... si alguien sabe de uno se lo agradeceria que me lo haga saber.
Con la explicacion dada sera facil que lleguen al metodo, para lo cual deben quitar se su cabeza la factorizacion y la divisibilidad de un numero entre otros primos para saber si este es o no primo. Aunque parezca ilogico, es como funciona el metodo... simple y directo.


Espero haber respondido a la consulta de Nelson... gracias

nlsgarcia
09-10-2013, 21:53:08
Victor Luis,


...encontre un modo de obtener los supuestos primos pero mas depurados, por eso los llamo casi primos directos...Cuando le mando a buscar primos en un rango de 1.000.000.000 el programa solo saca unos datos de algunos primos, entre 50 y 250 a los que llamo activados, ya que luego no necesito volver a leerlos. Esto permite no contar con una super computadora de muchísima memoria en disco duro, solo necesito un archivo de 348 MB donde están 36 millones de primos para realizar Búsquedas con rangos de hasta 1 Billon...


Pregunto: ¿Podrías explicar este punto mas detalladamente?.


...el tiempo de busqueda (Metodo PRI-BASE) es casi constante y en lugar de alargarse el tiempo de proceso tiende a disminuir, ya que en cada rango buscado encuentra menor cantidad de numeros primos. Mi Objetivo es determinar cuando ocurre este descenso, ya que hasta ahora no es constante, en ciertos rango aumenta, luego se mantiene y despues disminuye la cantidad de nuevos primos, repitiendose esto pero en forma desordenada...


Revisa esta información relacionada al comentario anterior:

... Los Rodríguez aseguran que no es que ellos hayan descubierto la manera de descifrar estos códigos, pero han podido dar orden a los números primos. "Son aleatorios, no van de uno en uno, de dos en dos, etc. Pues bien, nosotros hemos encontrado un patrón en el que están completamente ordenados"...

Tomado del link: http://www.laprovincia.es/sociedad/2011/10/26/quid-numeros-primos/410873.html



...respecto a publicar el código, no lo veo prudente, como dije no he encontrado un método similar...

Según entiendo tu método se basa en uno anterior, si te fijas todos los métodos de encriptación y de números primos son públicos (Hasta donde se, con sus excepciones de tipo militar que asumo existirán), sin embargo revisa este link, quizás te interese: http://www.mersenne.org/legal/#awards

Espero sea útil :)

Nelson.

Julián
10-10-2013, 08:52:26
Bueno, esos son algunos detalles del metodo y respecto a publicar el codigo, no lo veo prudente, como dije no he encontrado un metodo similar ... si alguien sabe de uno se lo agradeceria que me lo haga saber.
Con la explicacion dada sera facil que lleguen al metodo, para lo cual deben quitar se su cabeza la factorizacion y la divisibilidad de un numero entre otros primos para saber si este es o no primo. Aunque parezca ilogico, es como funciona el metodo... simple y directo.


A mi esto me recuerda al famoso navegador Biyubi (http://www.biyubi.com/art27.html) :D

Victor Luis
10-10-2013, 09:34:55
Holas Nelson...

Mi hermano menor es tocayo tuyo, su nombre es Nelson.

○ Revise la publicacion de los Rodriguez, donde afirman que los numeros primos son aleatorios y en eso como todos estoy de acuerdo. Ellos afirman haber encontrado un patron en el que estan ordenados... no comprendo bien a que se refieren, la criba de Eratostenes afirma que los tiene ordenados y los vemos en columnas; pero no todos son primos. En mi analisis no me he dedicado a esto porque no soy matematico, encontre muchas maneras de generar primos y descartar los no primos.
Si encontraron el patron es que hay una formula, lo que hasta donde vi, no lo veo tan posible. En la publicacion se pasan a la conjetura mayor de Goldbach, no le veo el problema pues con mi base de primos, hice un procedimiento donde si es posible que un numero par se exprese con la suma de 2 numeros primos.
10.000 59 + 9941 10.002 29 + 9973 10.004 31 + 9973 10.006 83 + 9923 10.008 41 + 9967 10.010 3 + 10007 10.012 3 + 10009 10.014 5 + 10009 10.016 7 + 10009 10.018 11 + 10007 10.020 11 + 10009 10.022 13 + 10009 10.024 17 + 10007 10.026 17 + 10009 10.028 19 + 10009 10.030 23 + 10007 10.032 23 + 10009 10.034 61 + 9973 10.036 29 + 10007 10.038 29 + 10009 10.040 3 + 10037 10.042 3 + 10039 10.044 5 + 10039 10.046 7 + 10039 10.048 11 + 10037 10.050 11 + 10039 10.052 13 + 10039 10.054 17 + 10037 10.056 17 + 10039 10.058 19 + 10039 10.060 23 + 10037 10.062 23 + 10039 10.064 3 + 10061 10.066 5 + 10061 10.068 7 + 10061 10.070 3 + 10067 10.072 3 + 10069
Ahora yo no veo la relacion de esta conjetura, el teorema de Riemann y su patron... esto me gustaria saberlo.

◘ Respecto a los puntos que pides explicarlos, complementare algo mas...
○ Si tomamos un rango de 50.000.000 donde buscar numeros primos, de hacerlo por el metodo clasico, tendriamos que revisarlos todos viendo si son divisibles entre primos anteriores.
○ Mi metodo saca de este rango 13.333.328 a 13.333.336 numeros base, a los que digo casi directos porque comprenden el 26.7% a pedurar y obtener nuevos primos, de los que aproximadamente habran 1.820.010 numeros primos buscando con este rango, donde a un principio son mas y conforme se avanza disminuye la cantidad de nuevos primos.
En porcentajes diria que de los 13.333.328 de numeros base el 13.7% son primos y en el rango de 50.000.000 el 3.6% son primos; lo cual va disminuyendo y debe haber un factor que determina esto, pero continuando la busqueda con el mismo rango, no tiende a disminuir constantemente, hay partes en que como dije anteriormente, aumenta la cantidad de primos, luego se mantiene, disminuye, se mantiene, aumenta y asi.
Esto hasta donde vi no sigue un patron, es aleatorio por lo que espreciso analizar varias busquedas y determinar esto. Mi idea es que hay un punto donde en la busqueda no habra nuevo primo, siendo este limite un punto inicial para evaluar en que rangos se presentan nuevos primos que comparando con el descenso inicial, se pueda determinar un factor o logica que indique determinar la aparicion de numeros primos.

○ Respecto al otro punto, de los 13.333.336 que genera el metodo PRI-BASE hay que depurar mas del 75% los que no son primos. Calculando si son divisibles entre otros primos, aunque se redujo bastante, se tendria que contar o disponer constantemente de los primos encontrados desde inicio, lo cual implica ordenadores de mucha memoria en disco duro y calculos que a la larga seran imposibles de realizar con variables, bueno hasta donde yo sepa.
El Metodo saca una secuencia particular de cada numero primo, a esto lo denomino primos activados, ya que en cada rango buscado, el programa ve que primos activar o sea sacar esa secuencia que no son mas de 10 datos y con estos depura los no primos de los numeros base o casi primos, quedando solo nuevos numeros primos.
Si me he dejado entender, con el metodo no necesito disponer de todos los numeros primos para encontrar nuevos primos, de modo que no se precisa mas que un ordenador con memoria suficiente para archivar los numeros primos. En mi caso guardo en cada archivo en promedio 36.000.000 de numeros primos que resulta de buscar en un rango de 1.000.0000.0000; este archivo ocupa 348 MB, donde esta cantidad de primos por archivo sirven para activar o sea sacar su secuencia para depurar para hacer busquedas de primos mas grandes y como seran cada vez menos, los archivos seran pocos, el tiempo de busqueda mas corto y esa es la base de mi metodo PRI-BASE.

◘ Seria bueno que los Rodriguez expliquen un poco mas sobre su patron y ver si usamos el mismo metodo o hablamos de lo mismo. Como podria mi metod basarse en uno anterior si no describen de que patron hablan, solo lo mencionan y no dan detalles de su logica... no es preciso que digan como; pero seria bueno que aclaren en que se basan, tan solo se pasan a la conjetura de Goldbach que no es teorema como dicen.
Revisando mis apuntes, creo que luego podre encontrar una logica que permita determinar o generar todos los numeros primos o algo mas directo y reducido que lo que hasta ahora saca mi metodo, en lugar de numeros primos base, saque numeros primos directos o la depuracion sea minima.


☼ Bueno Nelson... un gusto intercambiar criterios y gracias por la informacion buscada, lo de la pagina de mersenne esta en ingles y lo tendre que traducir; respecto a lo que dices que los numeros primos son publicos, no comprendo a que te refieres, de encriptacion se muy poco y del metodo de numeros primos tenemos el clasico, el teorema de numeros primos, la factorizacion y si Dios lo permite, encontrare los factores precisos que permitan generar numeros primos de manera directa....

Atte. Victor Luis Arteaga

Casimiro Notevi
10-10-2013, 10:25:36
A mi esto me recuerda al famoso navegador Biyubi (http://www.biyubi.com/art27.html) :DEs lo que me pareció cuando leí el primer post.

Victor Luis
10-10-2013, 12:45:17
Holas...

Gracias por las novedades que comparten, no sabia del "Nuevo Navegador Mexicano: Biyubi 5.0"

De que serviria publicar el codigo que no es largo ni complicado, si no se nota el interes de compartir criterios al respecto...

Pero si desean verlo busquenlo en Youtube con Metodo PRI-BASE


Sigan adelante con sus proyectos...

nlsgarcia
10-10-2013, 18:36:17
Victor Luis,


...Si encontraron el patrón es que hay una formula...Seria bueno que los Rodriguez expliquen un poco mas sobre su patrón...


Revisa esta información:


“Todo número primo se repite exactamente la misma cantidad de veces y en el mismo orden, dentro del patrón de las sumas de dos números primos”

Tomado del link: http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCgQFjAA&url=http%3A%2F%2Frinconmatematico.com%2Fforos%2Findex.php%3Faction%3Ddlattach%3Btopic%3D51301.0%3Bat tach%3D9368&ei=FcFWUv2hNoG69QTMzYCICQ&usg=AFQjCNG-GRpr9ftaBlYkNHr523Xp4gbJww&bvm=bv.53760139,d.eWU&cad=rja

Es de destacar que los autores de esta información no son matemáticos y no hay ninguna información académica que confirme sus resultados.


...Según entiendo tu método se basa en uno anterior...



...Como podria mi método basarse en uno anterior si no describen de que patrón hablan, solo lo mencionan y no dan detalles de su lógica...



...Antes de saber de la Criba de Eratóstenes, encontré un método para sacar los supuestos primos que se ordenan en columnas, claro que hay varios por depurar. Con ese método reduje muchisimo el tiempo de búsqueda...El Método PRI-BASE nace a razón de mejorar el anterior que mencione, donde encontré un modo de obtener los supuestos primos pero mas depurados...

Este es el origen de mi comentario.


...si te fijas todos los métodos de encriptación y de números primos son públicos (Hasta donde se, con sus excepciones de tipo militar que asumo existirán)...



...respecto a lo que dices que los números primos son públicos, no comprendo a que te refieres...


Existen varios algoritmos para el cálculo de números primos disponibles en Internet, revisa esta información:

Sieve of Eratosthenes : http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

Sieve of Atkin : http://en.wikipedia.org/wiki/Sieve_of_Atkin

Sieve of Sundaram : http://en.wikipedia.org/wiki/Sieve_of_Sundaram

Sieve theory : http://en.wikipedia.org/wiki/Sieve_theory

Lo anterior es la base de mi comentario, buscando un poco en internet se puede hallar más información al respecto.


...la pagina de mersenne esta en ingles y lo tendré que traducir...

Te sugiero usar Google Crome para la traducción automática de paginas del Ingles al Español, también es muy útil Google Translate.


...y si Dios lo permite, encontrare los factores precisos que permitan generar números primos de manera directa...

Suerte ^\||/

Espero sea útil :)

Nelson.

nlsgarcia
11-10-2013, 07:49:45
Club Delphi,

Continuación del Msg #3:

Revisen este código:

program GeneratorPrimeNumbers;

{

Cálculo de Números Primos por el Algoritmo: Criba de Eratóstenes

Esta implementación permite calcular un máximo de 87.647.246 Números Primos en un tiempo de
00:02:41:663 sobre una máquina con un Procesador Phenom II X6 1090T a 3.2 GHZ, 4 GB RAM, 3 TB HDD y
OS Windows 7 Profesional x32.

El tiempo indicado es el tiempo total del proceso desde que inicia el cálculo hasta que se genera
el archivo de 953 MB con los 87.647.246 Números Primos.

}

uses
SysUtils, Classes, Dialogs;

var
Limit, i, j: Integer;
Numbers: TBits;
F : TextFile;
NumberPrime : Integer;
TI, TF: TDateTime;

begin

repeat
try
Limit := StrToInt(InputBox('Generador de Números Primos', 'Número Primo Máximo a Calcular:', '1000'));
except
Limit := 0;
end;
until (Limit >= 2) and (Limit <= 2147483615);

TI := Now;

Numbers := TBits.Create;

try

Numbers.Size := Limit;
NumberPrime := 0;

for i := 2 to Limit do
if not Numbers then
begin
j := i * i;
while (j <= Limit) and (j > 0) do
begin
Numbers[j] := True;
Inc(j, i);
end;
end;

FileMode := fmOpenWrite;
AssignFile(F, 'NumberPrime.txt');
Rewrite(F);

for i := 2 to Limit do
if not Numbers[i] then
begin
Writeln(F, i);
Inc(NumberPrime);
end;

finally

Numbers.Free;
CloseFile(F);

end;

TF := Now - TI;

Showmessage(Format('Se Generaron %d números primos en %s',[NumberPrime,FormatDateTime('hh:mm:ss:zzz', TF)]));

end.

El código anterior [I]permite hallar todos los números primos menores que un número natural n en el rango de 2 a 2.147.483.615, por medio del algoritmo de Eratóstenes.

Espero sea útil :)

Nelson.

Victor Luis
11-10-2013, 11:27:35
Holas Nelson...

En verdad valoro tu capacidad para obtener la informacion de referencia que adjuntas, por mi parte me quedo atras y en eso te comparo con mi hermano que es ducho para buscar en internet.

Bueno.. a los temas...

○ Sobre la publicacion de los Rodriguez, no lo he leido profundamente ya que no soy matematico con trigonometria medio que me pierdo; pero es una amplia explicacion que relacionan metodos y secuencias con elementos quimicos.

◘ Lo que puedo decirte es que hay un valor casi coincidente a lo que yo manejo; pero la base de su explicacion lo podria decir con lo que se en simples palabras y responder al mismo tiempo que no tiene nada que ver con la criba de Eratostenes, es que con una cantidad de numeros primos que los denomino numeros primos origen, se obtienen los numeros base de todos los numeros primos. Te mencione que en un rango de 50 millones mi metodo saca 13.333.336 (numeros base) los que si pueden ser primos y el resto con seguridad que no son primos. Para obtener esta base se aplica un factor sobre los primos origen y sin calculos, solo con una operacion de manera directa obtengo esta base. No se si se relaciona con Goldbach y Riemann, solo que con un For-Next cargo un vector con estos numeros base para un rango de 50 millones en 3-4 segundos y su depuracion con la extraccion de numeros primos (aprox. 1.800.000) en 7-8 segundos. Creo que cuando termine de encontrar los datos que busco y necesito, mas colaboracion de un matematico se pueda obtener una formula o ecuacion que indique porque estos primos origen son la base de los demas.
○ Para complementar sobre la publicacion de los Rodriguez, no creo en una formula, sino que si hay una secuencia para generar directamente todos los numeros primos. Cuando realizaba uno de los analisis que hice, pues me venia una idea y anotaba datos a buscar, hacia calculos que ni yo recuerdo de que logica venian y terminaba a medias, eso paso con este metodo, que lo deje a medias; pero volviendolo a analizar encontre las secuencias que me faltaban y todo coincidia.
Continuando lo que decia, en un analisis, vi que hay una secuencia que permitiria generar directamente sin dificultad todos los numeros primos, lo deje a medias porque me faltaban muchos primos en mi base de datos. Solo intervienen 4 valores donde sabiendo la secuencia que exponencialmente se incrementan y al parecer aleatoriamente se disponen, se determinan los numeros primos. No soy matematico y fue un dolor de cabeza tratar de comprenderlo ademas que me faltaban muchos numeros primos en ese entonces.

◘ Te felicito por tu codigo publicado y el tiempo corto en realizarlo para el metodo de Eratostenes, diria que el numero primo 87.647.246 seria y continuaria con los siguientes
1.774.128.751 1.774.128.767 1.774.128.773 1.774.128.803 1.774.128.841
Sin que lo tomes a mal, mis busquedas las hago en miles de millones, en este caso seria casi 2.000 millones como rango, algunos de los tiempos que fui controlando para buscar por rangos son:
1.000.000.000 ... 00:21:19
5.000.000.000 ... 01:46:35
10.000.000.000 ... 03:33:10
Son tiempos de busqueda inicial antes del limite de 1 billon, estos tiempos van disminuyendo y en lo que se tarda no es en encontrar numeros primos, como dije anteriormente en un rango de 50 millones saca los primos de los numeros base entre 10-12 segundos; tarda en el proceso de archivar los numeros primos, donde cada archivo tiene alrrededor de 36 millones de numeros primos registrados.
► No he encontrado una manera directa de archivarlos y reducir este tiempo, uso archivos aleatorios; los archivos binarios no me resultaron pues no todos tiene el mismo numero de digitos y los secuenciales, me serian complicados de leerlos pues como sabes tengo que activar algunos primos para depurar y no siempre estan al inicio; mas practico lo vi usar archivos aleatorios; pero haciendo pruebas igual tardan en archivar 36 millones de numeros primos.

☼ Bueno amigo... Gracias por los links que voy a revisarlos.... Creo que malentienden mi proposito de estar en el Foro, no busco jactarme, de ser asi lo haria por otras redes sociales... Particularmente tu persona me ha dado informacion que desconocia al respecto y cuando tenga datos contundentes te los hare conocer... no tengo todas las respuestas sobre los numeros primos, solo un metodo que genera posibles numeros primos y una secuencia que me permite depurar los no primos, con lo que el tiempo de busqueda es muy reducido.

Subi una presentacion de como busca en metodo, el tiempo, la cantidad de primos encontrados y otros detalles que ya les mencione, esta en youtube solo pon en la busqueda PRI-BASE..

nlsgarcia
11-10-2013, 17:37:29
Victor Luis,


...Gracias por los links que voy a revisarlos...

^\||/

Revisa esta información:

Hallado un número primo de más de 17 millones de cifras : http://www.madrimasd.org/blogs/matematicas/2013/02/07/135694

Mayor número primo conocido : http://es.wikipedia.org/wiki/Mayor_n%C3%BAmero_primo_conocido
Espero sea útil :)

Nelson.

Victor Luis
12-10-2013, 09:03:48
Holas Nelson...

Pues si ya vi esos enlaces, donde usaron 25 ordenadores para lograr el numero primo de 17 millones de digitos, si me metiera a la competencia iria por los 100 millones de digitos. Como hay una variable que permita almacenar estas cantidades, hice unos cambios a mi programa en base al metodo, lo que me permitiria encontrar esa cantidad de digitos, claro en un determinado tiempo.

○ Por la informacion y las observaciones recibidas, he decidido desviarme un poco para tratar de encontrar dicha formula que permita obtener directamente los numeros primos y tambien, evaluar numeros grandes si son primos o no como lo hace en una pagina, busca en google con Factoris y uno de los primeros enlaces dira Factoris-Wims, esta en ingles, la cosa es que uno pone un numero e indica si es probable que sea primo o no lo es, creo usa el metodo de Muller-Rabin.. probando puse los primos encontrados y en todos indicaba que eran primos. Luego puse numeros grandes modificados por la secuencia del metodo y vi que solo te permite evaluar primos hasta 90 digitos, despues de esta cantidad solo muestra un mensaje...
Te encargaria por favor si sabes de otra pagina similar, me lo hagas saber, es interesante el metodo, aunque no es 100% segun lei, pero resulta facil verificar primos grandes. No pongo el link, ya que en el foro no me lo permiten.

◘ Respecto a tu codigo, indicaste que usaste el algoritmo de Eratostenes, hasta donde se al ordenar los numeros en columnas se medio seleccionan los numeros primos. Antes de conocer a este señor, yo obtenia mi base sumando +2 y +4 osea se forma un grupo de 2 que serian los primos gemelos

1º 2º
[5] [7] primos gemelos
* 7 resulta de sumar 5 + 2
* para ir al siguiente grupo sumas +6 al primero ó +4 al segundo del grupo anterior.
[11] resulta de sumar 5+6=11 o 7+4=11, luego sumas +2 y tiene el segundo numero del grupo
[11] [13]

○ Esto se repite constantemente y resulto ser los numeros de la criba de Eratostenes; pero comparado con mi metodo da muchos numeros base que no son primos, aproximadamente el 25% son multiplos de 5, igual cantidad son multiplos de 7, 11 y 13... No se si en tu codigo llegas a lo mismo; pero si te sirve ahi esta la referencia.
☼ Volviendo a aclararte que el metodo PRI-BASE no se basa en esto, creo que me entendieron mal o no me explique correctamente, pero dije que en mi segunda aplicacion o programa use este metodo que era parecido al de Eratostenes, buscando como reducir los numeros base con pocos no primos a depurar, encontre elmetodo que uso y analizo ahora, que tiene una logica diferente, es simple, que como le decia a una amigo, un niño de primaria podria hacerlo sin calculadora, no exagero; pero tomenlo como piensen, ya que hay quienes piensan que solo digo habladurias.

Bueno amigo espero encuentres una pagina como factoris y si sabes sobre el metodo de Muller-Rabin o sobre el test de Lucas-Lehmer me lo hagas saber aqui o a mi correo.. Gracias.

Casimiro Notevi
12-10-2013, 10:51:07
No pongo el link, ya que en el foro no me lo permiten.
Pon el link, algún moderador lo hará enlazable.

nlsgarcia
12-10-2013, 22:58:35
Victor Luis,


...si me metiera a la competencia iría por los 100 millones de dígitos... :confused:


Pregunto:

1- ¿De cuantos dígitos es el número primo más alto que has conseguido y como verificastes su primalidad?.

2- ¿Que sistema operativo usas en tus pruebas y de cuantos bits?.

3- ¿Que lenguaje utilizastes para implementar tu algoritmo?.

4- ¿Cuales son las características de hardware de la máquina que ejecuta tu algoritmo?.

5- ¿Por que no has entrado en la competencia?.


...Factoris-Wims (http://wims.unice.fr/~wims/en_tool~algebra~factor.en.phtml)...solo te permite evaluar primos hasta 90 dígitos...espero encuentres una pagina como Factoris...


Pregunto: ¿Haz considerado instalar un programa que permita probar la primalidad de un número localmente?

Revisa este link sugerido por Factoris:

PARI/GP home : http://pari.math.u-bordeaux.fr/

...si sabes sobre el método de Miller–Rabin o sobre el test de Lucas-Lehmer me lo hagas saber...


Revisa estos links:

Mersenne Primes - History, Theorems and Lists : http://primes.utm.edu/mersenne/

Test de primalidad : http://es.wikipedia.org/wiki/Test_de_primalidad

Miller–Rabin primality test : http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test

Test de Lucas-Lehmer : http://es.wikipedia.org/wiki/Test_de_Lucas-Lehmer

The Baillie-PSW primality test : http://www.trnicely.net/misc/bpsw.html

Test de primalidad AKS : http://artigos.tol.pro.br/portal/linguagem-es/Test%20de%20primalidad%20AKS

Test de primalidad, el AKS : http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&ved=0CDwQFjAD&url=http%3A%2F%2Fpaginaspersonales.deusto.es%2Fcruz.borges%2FPapers%2F06FinCarrera.pdf&ei=1JxZUp-1F9PQkQekpoGwDQ&usg=AFQjCNHGXPJql-PrdifK6Xu_4DMrmTXMKg&bvm=bv.53899372,d.eW0&cad=rja
Espero sea útil :)

Nelson.

Casimiro Notevi
13-10-2013, 00:17:49
Sin ánimo de crear polémica :D, pero me parece que mucho bla, bla, bla... pero no hay nada tangible, nada de código, documento, ninguna prueba de nada, etc.
Unicamente palabrería, que no dudo que sea correcto lo que se comenta, pero sin pruebas de nada :confused:

Victor Luis
13-10-2013, 12:56:34
Holas Nelson...

Gracias... revisare los enlaces que enviaste, respondiendo a tus preguntas:

1] Estos son los ultimos de mi anterior busqueda:
959.999.998.039 959.999.998.147 959.999.998.163 959.999.998.201 959.999.998.247 959.999.998.253 959.999.998.267 959.999.998.273 959.999.998.277 959.999.998.283 959.999.998.417 959.999.998.423 959.999.998.427 959.999.998.429 959.999.998.553 959.999.998.619 959.999.998.651 959.999.998.679 959.999.998.681 959.999.998.687 959.999.998.739 959.999.998.751 959.999.998.759 959.999.998.799 959.999.998.819 959.999.998.861 959.999.998.933 959.999.998.963 959.999.998.973 959.999.998.981 959.999.999.053 959.999.999.071 959.999.999.081 959.999.999.089 959.999.999.093 959.999.999.099 959.999.999.107 959.999.999.129 959.999.999.141 959.999.999.197 959.999.999.227 959.999.999.237 959.999.999.243 959.999.999.251 959.999.999.293 959.999.999.323 959.999.999.341 959.999.999.353 959.999.999.359 959.999.999.369 959.999.999.381 959.999.999.393 959.999.999.419 959.999.999.423 959.999.999.471 959.999.999.513 959.999.999.537 959.999.999.597 959.999.999.653 959.999.999.701 959.999.999.711 959.999.999.753 959.999.999.789 959.999.999.797 959.999.999.837 959.999.999.879 959.999.999.957 959.999.999.971 959.999.999.983 959.999.999.999
Estos los encontre usando Factoris:
1.110.000.000.023 3.810.000.000.011 3.810.000.000.013 30.810.000.000.047 30.810.000.000.067 300.810.000.000.017 300.810.000.000.077 3.000.810.000.000.013 30.008.100.000.000.007 300.081.000.000.000.019 3.000.810.000.000.000.121 30.008.100.000.000.000.029 300.081.000.000.000.000.031 3.000.810.000.000.000.000.157 30.008.100.000.000.000.000.061 300.081.000.000.000.000.000.001 3.000.810.000.000.000.000.000.029 300.810.000.000.000.000.000.000.000.247 300.810.000.000.000.000.000.000.000.000.000.017 300.810.000.000.000.000.000.000.000.000.000.000.000.151 300844950000000000000000000000000000000000000101 300844950000000000000000000000000000000000000000000031 300844950000000000000000000000000000000000000000000000000079 300844950000000000000000000000000000000000000000000000000169
300844950000000000000000000000000000000000000000000000000000000000000000000000000000000041
Como mi metodo sabe cuales son los base primos, los fui probando en Factoris y me indico que eran posibles primos ya que no encontro otros multiplos o divisores. Hasta donde se el metodo de Muller-Rabin solo es probabilistico, el metodo de Lucas-Lehmer es para primos de mersene y no comprendo a cabalidad lo que es en si, el metodo AKS indica que es mejor pero la formula o logaritmo que usa no lo he captado y no vi una pagina que use esto para verificar primos.
○ Como ya te indique anteriormente, para verificar que eran correctos los numeros primos que fui obteniendo con PRI-BASE los fui obteniendo con el metodo clasico, buscar si es multiplo de algun primo anterior hasta su raiz cuadrada, luego encontre paginas de donde se descargaban archivos de texto con numeros primos, los exporte a Excel y los compare; por ultimo los verifique con Factoris y en todos coincidian, esa es la seguridad que me dio para seguir adelante.

2] Mi equipo es Pentium-III con Windows-7 de 32 bits.

3] Probe en Delphi 7 luego en Visual Basic 6.0, este ultimo me parece mas manejable y se mas funciones por lo que uso Visual Basic. Encontre este foro o club y vi la aplicacion que adjuntaron, me parecio rapida hasta 100 mil pero al ponerlo que busque 1 millon de primos se volvio lentisimo, como dije buscar en un rango de 1.000 millones se encuentran unos 36 millones de numeros primos, mi aplicacion lo hace en 21-22 minutos, generalmente lo mandaba a buscar rangos desde 10 mil a 50 mil millones; pero en ciertos casos como ahora los busco de mil millones para sacar datos que me permitan crear unmetodo mas directo que el que uso.
○ Ayer me vino una idea y pense haberlo encontrado; pero no fue asi, solo encontre otro metodo similar a PRI-BASE, me faltan datos y eso busco, esta busqueda que pasara de 1 Billon es importante pues sacare datos que necesito. He calculado que entre los 14 a 17 billones los nuevos primos se reduciran a unos cientos, donde luego sera importante determinar los primos gemelos que aparecen y con todo esto estoy pensando mejorar mi metodo, no creo en si obtener una formula que pueda generar primos de manera directa; pero quien sabe.

4] Mi equipo es de 512 de RAM y 40 GB de disco duro, llevo mas de 1.000 archivos de numeros primos, los que voy comprimiendolos en grupos y luego los quemo en DVD, como te dije no necesito tenerlos siempre todos, hasta estas busquedas solo uso el primero, donde apenas se han activado 78.000 de los 20 millones de primos que contiene, lo que me durara para buscar rangos hasta mas de 10 billones, luego pondre el segundo archivo solamente y quitar el primero y asi continuar las busquedas.

5] Para entrar a esa competencia, me faltan evaluar unos datos y hacer tal vez algunas correcciones luego de llegar al cuatrillon, el primer dato importante son los primos desde 1 billon hasta 1 billon mil millones, buscare con rangos cortos para obtener la informacion que necesito evaluar.
Luego de esto no sera complicado llegar al cuatrillon pues como mencione el tiempo en si de buscar y sacar numeros primos en un rango de 1.000 millones es de 5-6 minutos, lo que tarda es al archivar los 36 millones de primos encontrados. Esta cantidad esta disminuyendo, ahora solo hay 35 millones, y segun veo habra un momento en que se producira un salto con una disminucion brusca de numeros primos, eso es importante para mi... Entonces del tiempo no me preocupo, se que se ira acelerando al haber pocos primos en adelante y cuando pase el cuatrillon, recien considerare estar en la competencia y determinar el tiempo en llegar a un numero primo con mas de 100 millones de digitos, claro si es que no antes logre encontrar el metodo mas directo que el que uso ahora como PRI-BASE, es eficiente y sencillo; pero creo que debe haber una logica directa de extraer los numeros primos.


Amigo Nelson, si lo miras desde mi logica verias que hay muchos valores coincidentes y que se repiten en las secuencias de los numeros primos, como no soy matematico, solo los apunto y lo dejo. Un ejemplo es que con 1 numero primo origen haciendo 2 calculos se genera los numeros primos base como lo hace mi metodo; pero son 2 calculos y al pasar el millon de digitos no se lo podra hacer pues las variables no soportan esta cantidad, por lo que por ahora me quedo con mi metodo que no tiene problema con eso y puede buscar primos infinitos... al menos hasta 100 millones de digitos.

6] No se de programas para instalar y que comprueben la primalidad de los numeros que obtengo. Como te dije ayer encontre una logica con el que haciendo un calculo selectivo me decia si es primo o no; pero resulto que era lo mismo que el metodo PRI-BASE, solo que este no necesita de los primos origen, de manera directa indica que tal numero no es primo y si fuera solo te daria entre el 50-60% de seguridad que lo es osea como lo hace Factoris pero sin ver si es multiplo de algun primo, si lo agregaria esto tal vez; pero a mi me interesa tener la base secuencial de todos los primos para encontrar el metodo directo. Por ahora y hasta donde he comprobado todo es correcto, no se si habra un fallo despues; la logica del metodo es diferente a los que he visto y tener una referencia.
Para simplificar la respuesta a tu pregunta te diria que si la Multiplicacion tiene un fallo en algun punto, si fuera asi creo que mi metodo lo tendria en algun momento dado.


Bueno Amigo.. otra vez gracias por los enlaces, los ire revisando, la informacion que compartes me hacen ver otras posibilidades de enfocar el tema de los numero primos...

Gracias...

Victor Luis
13-10-2013, 14:40:22
Holas Nelson...

Estaba revisando los enlaces que enviaste y lei sobre Riemann, que segun explican en palabras sencillas dicen que las posibilidades de saber si es primo un numero grande grande, esta en relacion al numero de digitos, osea n=digitos igual a n posibilidades. Para saber si este numero es primo
300844950000000000000000000000000000000000000000000000000000000000000000000000000000000041 que tiene 90 digitos en Factoris solo intente 11 veces y dijo que es posible primo, en otros fue casi a la primera y algunos mas de 40 intentos con la secuencia de mi metodo.

Creo haber entendido mal esto de Riemann y de ser asi, mil disculpas... espero me lo aclares si sabes de esto.... Gracias.

ecfisa
13-10-2013, 19:41:34
Hola.

Fuera de tópico, me pareció interesante leer un artículo sobre el mayor primo descubierto hasta la fecha. El logro es de un profesor de matemáticas (Curtis Cooper (http://www.math-cs.ucmo.edu/~curtisc/primes.html)), es un primo de Mersenne (http://es.wikipedia.org/wiki/N%C3%BAmero_primo_de_Mersenne) (mersenne.org (http://mersenne.org/)) y tiene nada menos que 17 millones de dígitos.

El artículo: Un matemático descubre el número primo mas grande... (http://www.abc.es/ciencia/20130206/abci-matematico-descubre-numero-primo-201302061759.html)

Saludos :)

nlsgarcia
13-10-2013, 21:33:34
Victor Luis,


...Mi equipo es Pentium-III con Windows-7 de 32 bits...512 de RAM y 40 GB de disco duro... :confused:

Es realmente notable esta configuración de hardware dado que Windows 7 requiere al menos 1 GB de RAM y para este tipo de cálculos se requiere de un mejor hardware.


...Probe en Delphi 7 luego en Visual Basic 6.0, este ultimo me parece mas manejable y se mas funciones por lo que uso Visual Basic... :confused:

Pregunto: ¿Has considerado utilizar Delphi 7 para lograr un implementación más optima de tu algoritmo?, Delphi 7 es en todos los sentidos muy superior a VB6.


...No se de programas para instalar y que comprueben la primalidad de los números que obtengo...

Revisa el link que te indique (PARI/GP home (http://pari.math.u-bordeaux.fr/)) en el Msg #20.


...no soy matemático...

Pregunto: ¿Has considerado solicitar apoyo en la escuela de matemáticas de alguna universidad de tu localidad para mejorar y validar tu método?.


...el método de Miller–Rabin solo es probabilístico...


Es correcto, pero puede ser determinístico, revisa esta información:

...The Miller–Rabin algorithm can be made deterministic by trying all possible a below a certain limit. The problem in general is to set the limit so that the test is still reliable...

Tomado de: http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test


Revisa este link :

Test de primalidad de Miller-Rabin : http://es.wikipedia.org/wiki/Test_de_primalidad_de_Miller-Rabin

...el método de Lucas–Lehmer es para primos de Mersenne...no comprendo a cabalidad lo que es en si...

Un número M es un número de Mersenne si es una unidad menor que una potencia de 2, es decir M = 2^n-1.

Revisa este link :

Número primo de Mersenne : http://es.wikipedia.org/wiki/N%C3%BAmero_primo_de_Mersenne

...el método AKS indica que es mejor...

Es correcto, dado que es un algoritmo determinista y comprueba en tiempo polinómico si un número natural es primo o compuesto.

Revisa este link :

Test de primalidad AKS : http://es.wikipedia.org/wiki/AKS

...Riemann...las posibilidades de saber si es primo un número grande...esta en relación al número de dígitos...


Revisa estos links :

Hipótesis de Riemann : http://es.wikipedia.org/wiki/Hip%C3%B3tesis_de_Riemann

La Hipótesis de Riemman para jóvenes estudiantes : http://www.lsi.upc.edu/~argimiro/mypapers/newspapers/rieman4bachi.html (http://www.lsi.upc.edu/%7Eargimiro/mypapers/newspapers/rieman4bachi.html)

...el método que uso y analizo ahora...es simple...un niño de primaria podría hacerlo sin calculadora... :confused:



...Con la explicación dada sera fácil que lleguen al metodo... :confused:



...Sin ánimo de crear polémica...no hay nada tangible...sin pruebas de nada... :confused:


Pregunto:

1- ¿Cuantas líneas efectivas tiene tu código en VB6?.

2- ¿Cuantos pasos requiere tu método para hallar un número primo?.

3- ¿Puedes describir tu algoritmo en pseudocódigo para tener una mejor idea del mismo?.

4- ¿Por que no lo publicas a nivel académico para validar el mismo?, según comentas es muy efectivo y requiere pocos recursos computacionales.

Espero sea útil :)

Nelson.

Casimiro Notevi
13-10-2013, 22:11:26
No me creo nada ;)

Victor Luis
14-10-2013, 09:45:06
Holas Nelson...

Para comenzar las ultimas intervenciones en este tema del foro, dire que inicie dando una sugerencia sobre el metodo utilizado, ya que el TEMA es "PROBLEMA AL GENERAR NUMEROS PRIMOS". Si hay un problema, lo que corresponde es orientar y sugerir alternativas de solucion y no solo poner codigo como piden y si no creen nada, pues problema de cada uno, no busco eso, solo compartir ideas. De que sirve publicar el codigo con la secuencia directa para extraer los numeros base de la criba de Eratostenes, si hay muchos no primos a depurar, necesita de todos los primos que se encuentren y a lo largo la busqueda sera eterna? es lo mismo que el metodo clasico... en si no ayudamos al problema planteado. Como les indique, modifiquen al codigo que publico Nelson, Sumen +2 y luego +4 y asi hasta el rango que quieran y de los numeros extraidos depuren los no primos sacando sus divisores primos. Con esto aceleraran el proceso y sera optimo hasta 100.000.0000.0000 luego tendran que dejar procesando dias para llegar un poco mas.

Respondiendo a tus preguntas Nelson:

◘ Se que debo actualizar mi equipo y lo hare; pero otro objetivo es demostrar que no se precisa de muchos ordenadores para buscar numeros primos, cuando busque numeros mas grandes sera notorio, ya que seguire usando un ordenador para esto.
○ Delphi 7 que instale esta en ingles y el hecho de poner punto y coma al final de cada linea y declarar correctamente las variables, que no digo que sea malo, son las razones por lo que lo pase a Visual Basic; tambien lo tengo en VBA Excel que busca en un tiempo similar al de VB. En si como no uso calculos complejos, no le veo la necesidad de programarlo en otro lenguaje, lo que por ahora me interesa es reducir el tiempo que tarda en archivar los numeros primos encontrados, si los archivo de poco a poco, tarda mas, por eso los archivo de rangos de mil millones; creo que es asi no mas por la cantidad de primos a archivar o tu que opinas al respecto...?
○ De pedir colaboracion a escuela de matematicas o en la universidad, lo haria despues de obtener y analizar los datos que necesito. Ahora ya llegue al Billon y estos sacando estos datos con busquedas de rangos menores, lo mismo hare alllegar al cuatrillon, luego de eso estara definido mi metodo. Como lo esperaba ha habido un significativo descenso de la cantidad de primos encontrados y el tiempo se ha reducido, lo que me indica que voy por buen camino.

◘ Sobre el Codigo de mi Metodo, no esta depurado para indicarte el numero de lineas y sobre los pasos son:

1º] Carga en variables el rango a buscar, en numero de ciclos a repetir los rangos y el limite para archivar los primos encontrados. Explicando un poco esto, uso un Rango de 50.000.000 osea buscara desde donde se quedo la ultima vez hasta sumado este rango; como es poco indico que repita varios ciclos, por ejemplo 20 ciclos de este rango para buscar en 1.000.000.000 como un rango global. Al mismo tiempo indico luego de cuantos ciclos debera archivar todos los primos encontrados que se van guardando en un vector, con lo que creara un archivo de numeros primos.

2º] Inicia el Proceso de Busqueda por Ciclos-Rangos.
○ Carga en un vector los numeros base a los que digo casi primos, como te indique para un rango de 50 millones sacara unos 13.333.336 numeros base, el resto son no primos.

3º] Activa Primos (asi lo digo) ve desde el ultimo primo activado y revisa cuales mas activar. Con esto me refiero a que toma el numero primo que seguiria del archivo y si se va a activar, saca del numero primo una secuencia de no mas de 10 valores con los que depurara los no primos del vector con numeros base. Si no le corresponde activar, salta al siguiente paso; como ves no preciso tener todos los primos, solo los necesarios que son cada vez pocos.

4º] Depuracion de no primos, con las secuencia depura los no primos y pone en otro vector los que son numeros primos; como te dije los almaceno para archivarlos despues, ya que esto me reduce el tiempo de archivado. Hice la prueba archivando directo los que encuentra y archivando mas cantidad, lo ideal me parecio hacerlo luego de 20 ciclos de 50 millones de rango, osea una busqueda de 1.000 millones, donde con el archivado tarda 21-22 minutos.

5º] Guarda controles de la busqueda del rango, para saber desde donde continuar la siguiente busqueda del rango. Aparte guarda una copia de la ultima busqueda por si en medio proceso hay corte de energia, de modo que restablezca los ultimos valores y reinicie la busqueda desde ahi. Eso me paso cuando por error elimine varios archivos de primos y tambien de la papelera, donde solo guarde una copia de los archivos control y tube que volver a buscar primos desde ese limite, ahora no tengo ese problema.
Tambien controla un limite definido, de modo que almacena en fracciones multiplos los nuevos primos a encontrar que tengan mas de 18-24 digitos, de modo que siga la busqueda y no tenga problemas en buscar primos de millones de digitos, todavia no he llegado ahi; pero el control y la estructura esta definida.

6º] Termina la Busqueda e informa el Tiempo del proceso y luego Actualiza los Controles de Archivos Primos y de Secuencias, para informar cual es el Ultimo primo encontrados, el Total de primos encontrados hasta esa busqueda, cuantos primos se activaron y cual el ultimo primo activado. Son datos para mi analisis posterior, los que voy anotando en cada busqueda.

Bueno eson son los pasos del programa, en si son el 2º,3º y 4º.


◘ Me pides que describa el algoritmo, lo que no comprendo a que te refieres, no tengo una formula, solo un metodo donde realizo operaciones aritmeticas, tanto para activar y depurar. Te dire que hay numeros definidos y cantidades que se repiten, que aplicados a los numeros primos origen, hacen posible sacar estos numeros base y depurar los no primos.
○ Como te dije, encontre el modo de obtener estos numeros base donde hay primos; pero no podia depurar los no primos, por lo que lo deje; pero como eran pocos para evaluar volvi a revisar mis anotaciones, hice calculos y encontre secuencias definidas de cada numero primo, hacia calculos con potencias a un principio y luego encontre otro modo simple y directo de obtener estas secuencias. Estaba a punto de ir a descansar, probe una forma mas y ahi estaban los datos, se fue el sueño, lo aplique para depurar los no primos y exporte los primos a una hoja de Excel, los compare y todos coincidian. Luego busque hasta 100 millones archivandolos y los compare con los que tenia en Excel sacados con el metodo clasico y todos coincidian; lo ultimo hice un procedimiento que revise si alguno es multiplo con primos verificados inicialmente, tardo un tiempo; pero no encontro divisores primos hasta su raiz cuadrada. Al decir primos verificados inicialmente me refiero a que si se que el 2,3,5,7 son primos, comprobando con estos obtendre los siguientes y estos seran primos verificados, eso me dio la seguridad para continuar haciendo mejoras en mi codigo.

◘ Por ultimo, a tu pregunta de publicar a nivel academico, reitero que me faltan 2 controles, en este limite del billon que estoy ahora en eso y en el limite del cuatrillon, pasado esto estara mi codigo definido, para solo buscar y realizar una mejora a mi metodo con los datos que salgan de los analisis que haga.
Ya te los hare saber amigo, pues agradesco la informacion que adjuntas...

☼ Respecto a lo que dije, que un niño de primaria podria hacerlo sin calculadora, fue sin mala intension... hablando con mi madre que no hizo secundaria, le explicaba como obtenia los numeros base, lo entendio facilmente y sin papel ni calculadora me fue diciendo los posibles primos desde la cantidad que le indicaba.
De todos modos, mis disculpas si hay quienes lo toman a mal...

Victor Luis
14-10-2013, 15:27:29
Holas Amigo Nelson...

Pues el 1º Dato que debia controlar al pasar del billon esta bien, busque en un rango de mil millones osea hasta 1.001.000.000.000 y todos los encontrados son primos, aqui dejo los ultimos 100 antes de este limite:

1.000.999.997.341 1.000.999.997.357 1.000.999.997.369 1.000.999.997.449 1.000.999.997.471 1.000.999.997.479 1.000.999.997.507 1.000.999.997.521 1.000.999.997.533 1.000.999.997.537 1.000.999.997.579 1.000.999.997.597 1.000.999.997.629 1.000.999.997.633 1.000.999.997.689 1.000.999.997.693 1.000.999.997.737 1.000.999.997.743 1.000.999.997.749 1.000.999.997.761 1.000.999.997.797 1.000.999.997.807 1.000.999.997.929 1.000.999.997.941 1.000.999.997.951 1.000.999.997.981 1.000.999.998.023 1.000.999.998.043 1.000.999.998.169 1.000.999.998.191 1.000.999.998.203 1.000.999.998.287 1.000.999.998.319 1.000.999.998.391 1.000.999.998.409 1.000.999.998.413 1.000.999.998.463 1.000.999.998.473 1.000.999.998.499 1.000.999.998.517 1.000.999.998.521 1.000.999.998.527 1.000.999.998.529 1.000.999.998.539 1.000.999.998.613 1.000.999.998.619 1.000.999.998.641 1.000.999.998.643 1.000.999.998.697 1.000.999.998.731 1.000.999.998.751 1.000.999.998.787 1.000.999.998.827 1.000.999.998.829 1.000.999.998.839 1.000.999.998.857 1.000.999.998.941 1.000.999.998.983 1.000.999.998.991 1.000.999.998.997 1.000.999.999.009 1.000.999.999.033 1.000.999.999.067 1.000.999.999.123 1.000.999.999.133 1.000.999.999.163 1.000.999.999.189 1.000.999.999.201 1.000.999.999.217 1.000.999.999.271 1.000.999.999.303 1.000.999.999.343 1.000.999.999.357 1.000.999.999.361 1.000.999.999.421 1.000.999.999.427 1.000.999.999.471 1.000.999.999.501 1.000.999.999.513 1.000.999.999.541 1.000.999.999.547 1.000.999.999.579 1.000.999.999.613 1.000.999.999.619 1.000.999.999.621 1.000.999.999.627 1.000.999.999.631 1.000.999.999.679 1.000.999.999.693 1.000.999.999.711 1.000.999.999.729 1.000.999.999.799 1.000.999.999.871 1.000.999.999.873 1.000.999.999.877 1.000.999.999.889 1.000.999.999.897 1.000.999.999.913 1.000.999.999.943 1.001.000.000.017

nlsgarcia
15-10-2013, 03:05:25
Victor Luis,


...De que sirve publicar el código con la secuencia directa para extraer los números base de la Criba de Eratóstenes, si hay muchos no primos a depurar... :confused:

No son números Primos Probables, son Números Primos, ese es el objetivo del Algoritmo de Eratóstenes (http://es.wikipedia.org/wiki/Criba_de_Erat%C3%B3stenes).

En lo personal, he hecho pruebas comparativas entre el Algoritmo de Divisiones Sucesivas, el Algoritmo de Eratóstenes y el Algoritmo de Atkin y en un rango de 2 a 500.000.000, los archivos resultantes son similares (26.355.867 Números Primos), lo que varía es el tiempo de generación. En otra prueba realizada en un rango de 2 a 2.147.483.615, el Algoritmo de Eratóstenes genero 105.097.563 Números Primos los cuales fueron probados aleatoriamente sin encontrar ningún número compuesto en la secuencia.


...y a lo largo la búsqueda sera eterna, es lo mismo que el método clásico... :confused:

El Algoritmo de Eratóstenes es muy eficiente en comparación al método de divisiones sucesivas, sin embargo hay métodos más modernos como el Algoritmo de Atkin (http://es.wikipedia.org/wiki/Criba_de_Atkin), el cual correctamente implementado tiene una eficiencia computacional superior al Algoritmo de Eratóstenes.


...no se precisa de muchos ordenadores para buscar números primos... :confused:


Depende de los objetivos a conseguir, revisa esta información:

...El proyecto GIMPS (http://www.mersenne.org/) resulta excepcionalmente eficaz en la búsqueda de grandes números primos. Fundado en 1996, ha encontrado los últimos 14 primos de Mersenne. En él participan unas 360.000 computadoras que juntas son capaces de realizar hasta 150 billones de cálculos por segundo...

Tomado de: http://www.abc.es/ciencia/20130206/abci-matematico-descubre-numero-primo-201302061759.html

...Delphi 7 que instale esta en ingles y el hecho de poner punto y coma al final de cada linea y declarar correctamente las variables, que no digo que sea malo, son las razones por lo que lo pase a Visual Basic... :confused:

Entiendo, sin embargo a futuro, quizás sean más claras las ventajas de usar un lenguaje como Delphi 7.


...el Código de mi Método, no esta depurado para indicarte el numero de lineas...Me pides que describa el algoritmo, lo que no comprendo a que te refieres, no tengo una formula, solo un método... :confused:


Entiendo tu punto de vista, sin embargo el siguiente comentario podría arrojar algo de luz sobre tu método:

...hablando con mi madre que no hizo secundaria, le explicaba como obtenía los números base, lo entendió fácilmente y sin papel ni calculadora me fue diciendo los posibles primos desde la cantidad que le indicaba...

Quizás la idea es: publicar la misma explicación para poder comprender y validar tu algoritmo, aunque entiendo que tienes tus reservas.


...de publicar a nivel académico...

Suerte ^\||/

Espero sea útil :)

Nelson.

Victor Luis
15-10-2013, 12:06:10
Holas Nelson...

Pues debo retractarme o explicar mejor lo que dije... en si me referia a la Criba de Eratostenes donde se ponen secuencialmente los numeros naturales en 6 columnas y los numeros primos estarian en la 1º y 5 columna. Revise las direcciones que adjuntaste y lei el algoritmo de Eratostenes que marcando los multiplos desde el 2, los que quedan son numeros primos y con estos se marcan sus multiplos.

○ Si cargas un vector con numeros base parecido a Eratostenes como lo indique sumando +2 y +4 comenzando desde el 5 tendras:
5_7 11_13 17_19 23_25 29_31 35_37 41_43 47_49 51_53
Como ves hay muchos no primos a depurar; pero si lo exportas a una hoja de Excel en una sola columna
5
7
11
13
17
19
23
25
29
31
35
37
41
43
47
49
53
55
59
61
65
67
71
73
77
79
83
85
89
91
95
97

Veras que hay una secuencia fija para depurar los multiplos de cada numero primo, por ejemplo inicias con el 5 comenzando desde su 5º multiplo 5x5=25 que seria el 1º y su posicion en el vector es el [8]=25, el siguiente a depurar 2º es 3 datos o filas mas abajo [11]=35.
Yo los veo como grupo de multiplos a depurar, por eso digo 1º y 2º. Los siguientes multiplos del primo estan en las filas [18] y [21], para saber esto sumo 10 filas del 1º multiplo del anterior grupo [8]+10= [18] a este le sumo 3 filas 18+3= [21] y es el 2º multiplo del grupo.
Lo mismo sucede con el numero primo 7 donde el multiplo de inicio es 7x5=35 [11] a este le sumas +5 y sera el 2º multiplo del grupo y esta en [16]. Para el siguiente grupo sumas 11+14=[25] y 25+5= [30] y asi se marcan o depurar todos sus multiplos.
○ No se si aplicaste esto en el algoritmo de Eratostenes; pero para depurar esta secuencia, cada numero primo te indica en que fila o posicion estan sus multiplos, en lugar de cargar un vector con numeros secuencialmente y marcar por ejemplo del 5 → 10,15,20,25,30,35,40,45,50,55,60,...
◘ Ese era el segundo metodo que realice luego del metodo clasico, que desde luego es mas rapido, solo usas bucles para ir depurando, pues ya sabes donde estan los multiplos de cada numero primo, incluso puedes calcular la posicion del 1º multiplo, de modo que obtienes numeros primos sin usar If_Then, con este metodo reduje el tiempo para buscar primos en un rango de 1 millon de 42 seg a 2 seg.
► Sobre este metodo no he encontrado referencias, tu me diras si es parecido al algoritmo de Eratostenes o no. Lo malo es que tarda mucho, comparando con PRI-BASE que es mas selectivo y directo, lo hace en 1/3 de tiempo que el anterior.

◘ Tomare en cuenta las recomendaciones que me das y practicare un poco mas Delphi 7 y lo de publicar mi explicacion, la verdad no se donde, pues en algunos foros, solo recibes notas que piden publicar el codigo y demas tonterias donde no hay un poco de seriedad.

◘ Sobre el avance de mi metodo, te comento que el primer dato que tenia que evaluar, esta bien y ya obtengo numeros primos mas de 1 billon y los comprobe con factoris y dejo el enlace para los que quieran verlo en Youtube...

http://www.youtube.com/watch?v=-GUMPYAqa-o&feature=youtu.be

Estos son los ultimos primos encontrados y verificados:
1039999998781
1039999998853
1039999998899
1039999998901
1039999998907
1039999998937
1039999998949
1039999998979
1039999999001
1039999999019
1039999999021
1039999999033
1039999999063
1039999999067
1039999999069
1039999999097
1039999999177
1039999999217
1039999999271
1039999999343
1039999999351
1039999999373
1039999999393
1039999999421
1039999999427
1039999999471
1039999999481
1039999999483
1039999999499
1039999999513
1039999999523
1039999999559
1039999999561
1039999999607
1039999999631
1039999999651
1039999999699
1039999999711
1039999999721
1039999999723
1039999999751
1039999999777
1039999999783
1039999999817
1039999999847
1039999999853
1039999999867
1039999999891
1039999999963
1039999999981

Casimiro Notevi
15-10-2013, 12:51:30
◘ Tomare en cuenta las recomendaciones que me das y practicare un poco mas Delphi 7 y lo de publicar mi explicacion, la verdad no se donde, pues en algunos foros, solo recibes notas que piden publicar el codigo y demas tonterias donde no hay un poco de seriedad.

Esto es un foro de programación delphi, se comparte conocimientos, trucos, etc. mediante el código fuente. Lo de las tonterías y poca seriedad, son las tuyas, que no haces más que hablar de tu maravilloso programa secreto en visual basic y nada más.

Así que, resumiendo, te aconsejo que practiques lo que criticas: menos tonterías y más seriedad, gracias.

nlsgarcia
15-10-2013, 16:47:39
Victor Luis,


...No se si aplicaste esto en el algoritmo de Eratóstenes...

Te sugiero revisar el Algoritmo de Eratóstenes.


...Sobre este método no he encontrado referencias...

Te sugiero revisar el Algoritmo de Atkin.


...y lo de publicar mi explicación, la verdad no se donde, pues en algunos foros, solo recibes notas que piden publicar el código y demás tonterías donde no hay un poco de seriedad...

En el mundo de la ciencia y a nivel profesional se requiere poder demostrar el trabajo realizado y que este pueda ser verificable y repetible por otras personas para comprobar su veracidad y efectividad. Las dudas expresadas en este foro son ciertamente válidas y justificables en todo sentido y honestamente considero poco probable una reacción diferente en otro foro de programación o matemáticas.

Si esperas poder presentar tu trabajo a nivel académico debes tener una fuerte base matemática y en computación, haber revisado los métodos publicados sobre este tema, indicar claramente en que consiste tu algoritmo, cuales son sus ventajas sobre los métodos anteriores y ser capaz de demostrar todo lo sustentado en tus afirmaciones, el mundo académico es ciertamente muy exigente en este sentido.

Te sugiero considerar todo lo comentado en este hilo y nuevamente mucha suerte en tu proyecto ^\||/

Espero sea útil :)

Nelson.

Casimiro Notevi
15-10-2013, 17:42:18
En el mundo de la ciencia y a nivel profesional se requiere poder demostrar el trabajo realizado y que este pueda ser verificable y repetible por otras personas para comprobar su veracidad y efectividad. Las dudas expresadas en este foro son ciertamente válidas y justificables en todo sentido y honestamente considero poco probable una reacción diferente en otro foro de programación o matemáticas.
Si esperas poder presentar tu trabajo a nivel académico debes tener una fuerte base matemática y en computación, haber revisado los métodos publicados sobre este tema, indicar claramente en que consiste tu algoritmo, cuales son sus ventajas sobre los métodos anteriores y ser capaz de demostrar todo lo sustentado en tus afirmaciones, el mundo académico es ciertamente muy exigente en este sentido.
Te sugiero considerar todo lo comentado en este hilo y nuevamente mucha suerte en tu proyecto ^\||/
Espero sea útil :)
Nelson.
Es justo lo que yo quería decir, pero con palabras bonitas :)

Que quede claro, Victor Luis, que no tengo nada personal contra ti, saludos.

Victor Luis
15-10-2013, 22:01:39
Holas Nelson y Casimiro...

Me disculpo ante el Foro Delphi y en especial ante ustedes... creo que me excedi un poco pero no es por el foro ni sus organizadores; pero hubo algunos comentarios que estaban fuera de lugar por otros miembros del foro, que manifestaban que publique el codigo sino no te creemos y eso va contra mi manera de ser y mi personalidad, no me conocen, espero un dia si....

○ Se que es un Foro Delphi, el primer lenguaje que aprendi fue Basic en colegio, usando los Atari computer, despues de mucho tiempo todo era diferente y aprendi Pascal y de ahi Delphi con lo que hice varias aplicaciones. Luego consegui Visual Basic y medio me perdi; por lo que empece a usar VBA Excel para hacer programas para mi Laboratorio y despues copie elcodigo a Visual Basic, modifique algo y era casi lo mismo, lo que me resulto mas sencillo....
◘ Pero sera un compromiso... Intensificare mis conocimientos en Delphi... como dice Nelson es un leguaje eficiente... eso tambien lei de Java pero medio voy por ahi...


○ Respecto a lo que dice Casimiro de compartir conocimientos y trucos y mas.... estoy de acuerdo; pero no solo mediante la publicacion de codigo fuente. Si vieron, les comparti el metodo que para mi es simplicado y mejor que Eratostenes, les indique como depurar los multiplos de la secuencia extraida con las sumas +2 +4 y que los multiplos para mi estan en grupos de 2 multiplos, estos saltos o posiciones son propias para los multiplos de cada numero primo y se repiten.
◘ Con esto Casimiro creo estar aportando al foro y al tema en cuestion del Problema al Generar Numeros Primos, el tiempo del proceso se reducira significativamente y podra hacer busquedas de numeros mas grandes... La cosa esta en que quieren el codigo fuente y por ahora no lo tengo en Delphi, pues es un metodo que lo deje de usar porque encontre otros 3 metodos mejores y el 4º fue el que uso ahora...
○ Pero si tienen alguna duda al respecto... estoy predispuesto a brindar mi colaboracion como lo hace mi amigo Nelson...


○ Sobre el ultimo comentario de Nelson dire que lo se amigo...
Gracias por recordarmelo, no soy matematico y mis conocimientos de programacion son del promedio medio o regular y es esto lo que me motiva a seguir adelante.
◘ Un dia publicare mi metodo, luego de ajustar el 2º dato que me falta al pasar el cuatrillon, veran que es verificable y repetible, lo que si no creo poder exponer una formula como los que hay, que no los entiendo; pero estoy seguro que en base a esta logica surgiran formulas e ideas que mejoren la busqueda de numeros primos... al menos esa es mi espectativa.
Por ahora no puedo hacerlo presentar un metodo que esta desarrollado hasta el 95%, soy prudente en ello pues como bien dice Nelson "el mundo académico es ciertamente muy exigente en este sentido"

◘ Bueno amigos me ausentare un tiempo breve por asuntos de trabajo y no les molestare con mis tonterias... espero les vaya bien en el desarrollo del metodo...

NOTA. (para Nelson) Mi hermano Nelson Arteaga que actualmente radica en Puno-Peru tiene acceso a mi equipo y todos mis apuntes de los analisis realizados.
○ Un favor, si sabes de donde puedo descargar un Manual de Delphi 7 en español, te lo agradeceria....

nlsgarcia
15-10-2013, 23:54:55
Victor Luis,


...donde puedo descargar un Manual de Delphi 7 en español...


La siguiente información esta en su mayoría en español con algunas excepciones en ingles.

Revisa estos Tutorials de Delphi:

Tutorial Borland Delphi : http://www.programacionfacil.com/borland_delphi/start

Lenguaje Delphi : http://es.wikibooks.org/wiki/Lenguaje_Delphi

Curso de Delphi Básico : http://terawiki.clubdelphi.com/Delphi/Manuales/?download=Curso_de_Delphi_basico_pdf_.rar

Curso de Delphi Paso a Paso : http://terawiki.clubdelphi.com/Delphi/Manuales/?download=Delphi_paso_a_paso_pdf_.zip

Delphi para Novatos : http://terawiki.clubdelphi.com/Delphi/Manuales/?download=Delphi_para_novatos__html_.zip

Delphi el Hijo de Pascal : http://terawiki.clubdelphi.com/Delphi/Manuales/?download=Delphi%2C_el_hijo_de_Pascal_pdf_.rar

Delphi al Límite : http://terawiki.clubdelphi.com/Delphi/Manuales/?download=Delphi_al_limite_pdf_.zip
Revisa estos Links:

Delphi Basics : http://www.delphibasics.co.uk/ (Excelente como referencia del lenguaje)

A Beginner's Guide to Delphi Programming : http://delphi.about.com/od/beginners/a/delphicourse.htm (Excelente site para Delphi en general)
Revisa estos libros:

La cara oculta de Delphi 4, Autor Ian Marteens : http://terawiki.clubdelphi.com/Delphi/Manuales/?download=La_Cara_Oculta_De_Delphi_4_pdf_.zip (Es un libro muy recomendado)

Borland Delphi 6 Developer's Guide, Autores: Steve Teixeira And Xavier Pacheco (Internet, es un libro avanzado en Ingles)

La Biblia de Delphi 7, Autor: Marco Cantu. (Internet, es un libro muy interesante en español)
Revisa el FTP del Club Delphi:

Delphi : http://terawiki.clubdelphi.com/Delphi/
Nota: Cuando puedas trasladar el código de tu algoritmo de VB6 a Delphi 7, los tiempos de proceso en general disminuirán de forma considerable.

Suerte ^\||/

Espero sea útil :)

Nelson.

Victor Luis
18-10-2013, 23:37:36
Holas Nelson...

Gracias, ya estoy revisando los enlaces o links que adjuntaste...

Antes de publicar el codigo y no lluevan criticas, me gustaria enviartelo a tu correo y le des una chekeada o mirada.... OK

nlsgarcia
21-10-2013, 22:27:57
Club Delphi,

Los siguientes programas son un Compendio de Cribas de Generación de Números Primos implementadas en Delphi:

Criba de Eratóstenes:

program GeneratorPrimeNumbers;

{
Cálculo de Números Primos por el Algoritmo: Criba de Eratóstenes (Versión 2).
}

uses
Windows, SysUtils, Classes, Dialogs;

var
Limit, RLimit : Integer;
i, j: Integer;
Numbers: TBits;
F : TextFile;
NumberPrime : Integer;
TI, TF: TDateTime;
Mnsj : String;

begin

repeat
try
Limit := StrToInt(InputBox('Generador de Números Primos',
'Número Primo Máximo a Calcular:', '1000'));
except
Limit := 0;
end;
until (Limit >= 2) and (Limit <= 2147483615);

TI := Now;

try

Numbers := TBits.Create;
Numbers.Size := Limit+1;
RLimit := Trunc(Sqrt(Limit));
NumberPrime := 0;

for i := 2 to RLimit do
if not Numbers then
for j := i to (Limit div i) do
Numbers[i*j] := True;

FileMode := fmOpenWrite;
AssignFile(F, 'NumberPrime.txt');
Rewrite(F);

for i := 2 to Limit do
if not Numbers[i] then
begin
// Writeln(F, Format('%.10d',[i]));
Writeln(F, i);
Inc(NumberPrime);
end;

finally

Numbers.Free;
CloseFile(F);

end;

TF := Now - TI;

ThousandSeparator := '.';
DecimalSeparator := ',';

Mnsj := Format('Con el Número %s como Límite, Se Generaron %s Números Primos en %s',
[FormatFloat('#,###,###,###,##0',Limit),
FormatFloat('#,###,###,###,##0',NumberPrime),
FormatDateTime('hh:mm:ss:zzz', TF)
]);

MessageBox(0, PChar(Mnsj), 'Algoritmo: Criba de Eratóstenes', MB_OK + MB_ICONINFORMATION);

end.

Criba de Atkin:

program GeneratorPrimeNumbers;

{
Cálculo de Números Primos por el Algoritmo: Criba de Atkin Optimizada
}

uses
Windows, SysUtils, Classes, Dialogs;

var
Limit, RLimit : LongWord;
i, j : Integer;
n,k : LongWord;
R1 : LongWord;
R2 : LongWord;
xStepsize : LongWord;
y_limit : LongWord;
s, min_y, yy : LongWord;

Numbers : TBits;
F : TextFile;
NumberPrime : LongWord;
TI, TF : TDateTime;
Msg : String;

begin

repeat
try
Limit := StrToInt(InputBox('Generador de Números Primos',
'Número Primo Máximo a Calcular:', '1000'));
except
Limit := 0;
end;
until (Limit >= 2) and (Limit <= 2147483615);

TI := Now;

Numbers := TBits.Create;

try

Numbers.Size := Limit+1;
RLimit := Trunc(Sqrt(Limit));
NumberPrime := 0;

// Inicio del cálculo de 3x^2 + y^2
xStepsize := 3;
y_limit := 0;
n := 0;
R1 := Trunc(Sqrt((Limit - 1) / 3));

i := 0;
while (i < 12 * R1) do
begin
xStepsize := xStepsize + i;
y_limit := 12 * Trunc(Sqrt(Limit - xStepsize)) - 36;
n := xStepsize + 16;
j := -12;
while(j < y_limit + 1) do
begin
n := n + j;
Numbers[n] := not Numbers[n];
Inc(j,72);
end;

n := xStepsize + 4;

j := 12;
while (j < y_limit + 1) do
begin
n := n + j;
Numbers[n] := not Numbers[n];
inc(j,72);
end;
inc(i,24);
end;
// Fin del cálculo de 3x^2 + y^2

// Inicio del cálculo de 4x^2 + y^2
xStepsize := 0;
R1 := 8 * Trunc(Sqrt((Limit - 1) / 4)) + 4;

i := 4;
while (i < R1) do
begin
xStepsize := xStepsize + i;
n := xStepsize + 1;

if (xStepsize mod 3 <> 0) then
begin
R2 := 4 * Trunc(Sqrt(Limit - xStepsize)) - 3;
j := 0;
while (j < R2) do
begin
n := n + j;
Numbers[n] := not Numbers[n];
Inc(j,8);
end;
end
else
begin
y_limit := 12 * Trunc(Sqrt(Limit - xStepsize)) - 36;
n := xStepsize + 25;
j := -24;
while (j < y_limit + 1) do
begin
n := n + j;
Numbers[n] := not Numbers[n];
Inc(j,72);
end;

n := xStepsize + 1;

j := 24;
while (j < y_limit + 1) do
begin
n := n + j;
Numbers[n] := not Numbers[n];
inc(j,72);
end;
end;
inc(i, 8);
end;
// Fin del cálculo de 4x^2 + y^2

// Inicio del cálculo de 3x^2 - y^2
xStepsize := 1;
R1 := Trunc(Sqrt(Limit/2))+1;

i := 3;
while (i < R1) do
begin
xStepsize := xStepsize + (4 * i - 4);
n := 3 * xStepsize;
s := 4;
if (n > Limit) then
begin
min_y := (Trunc(Sqrt(n - Limit)) shr 2) shl 2;
yy := min_y * min_y;
n := n - yy;
s := 4 * min_y + 4;
end
else
s := 4;

j := s;
while (j < 4 * i) do
begin
n := n - j;
if (n <= Limit) and (n mod 12 = 11) then
Numbers[n] := not Numbers[n];
Inc(j,8);
end;
inc(i,2);
end;

xStepsize := 0;
i := 2;
while (i < R1) do
begin
xStepsize := xStepsize + (4 * i - 4);
n := 3 * xStepsize;
s := 0;
if (n > Limit) then
begin
min_y := ((Trunc(Sqrt(n - Limit)) shr 2) shl 2) - 1;
yy := min_y * min_y;
n := n - yy;
s := 4 * min_y + 4;
end
else
begin
n := n - 1;
s := 0;
end;

j := s;
while(j < 4 * i) do
begin
n := n - j;
if (n <= Limit) and (n mod 12 = 11) then
Numbers[n] := not Numbers[n];
inc(j,8);
end;
inc(i,2);
end;
// Fin del cálculo de 3x^2 - y^2

i := 5;
while (i <= RLimit+1) do
begin
if Numbers[i] then
begin
k := i*i;
while (k < Limit) do
begin
Numbers[k] := False;
Inc(k,i*i);
end;
end;
Inc(i,2);
end;

FileMode := fmOpenWrite;
AssignFile(F, 'NumberPrime.txt');
Rewrite(F);

Numbers[2] := True;
Numbers[3] := True;

for i := 2 to Limit do
if Numbers[i] then
begin
Writeln(F, i);
Inc(NumberPrime);
end;

finally

Numbers.Free;
CloseFile(F);

end;

TF := Now - TI;

ThousandSeparator := '.';
DecimalSeparator := ',';

Msg := Format('Con el Número %s como Límite, Se Generaron %s Números Primos en %s',
[FormatFloat('#,###,###,###,##0',Limit),
FormatFloat('#,###,###,###,##0',NumberPrime),
FormatDateTime('hh:mm:ss:zzz', TF)
]);

MessageBox(0, PChar(Msg), 'Algoritmo: Criba de Atkin', MB_OK + MB_ICONINFORMATION);

end.

Criba de Sundaram:

program GeneratorPrimeNumbers;

{
Cálculo de Números Primos por el Algoritmo: Criba de Sundaram
}

uses
Windows, SysUtils, Classes, Dialogs;

var
Limit, RLimit : LongWord;
i, j, k : LongWord;
Numbers: TBits;
F : TextFile;
NumberPrime : LongWord;
TI, TF: TDateTime;
Mnsj : String;
maxVal : LongWord;
denominator : LongWord;
Prime : LongWord;

begin

repeat
try
Limit := StrToInt(InputBox('Generador de Números Primos',
'Número Primo Máximo a Calcular:', '1000'));
except
Limit := 0;
end;
until (Limit >= 2) and (Limit <= 2147483615);

TI := Now;

try

Numbers := TBits.Create;
k := Limit div 2;
Numbers.Size := k + 1;
NumberPrime := 0;

maxVal := 0;
denominator := 0;

i := 1;
while(i < k) do
begin
denominator := (i shl 1) + 1;
maxVal := (k - i) div denominator;
j := i;
while(j <= maxVal) do
begin
Numbers[i + j * denominator] := True;
inc(j);
end;
inc(i);
end;

FileMode := fmOpenWrite;
AssignFile(F, 'NumberPrime.txt');
Rewrite(F);
Writeln(F, 2);
Inc(NumberPrime);

Prime := 0;
i := 1;
while(i < k) do
begin
if not Numbers[i] then
begin
Prime := (i shl 1) + 1;
Writeln(F, Prime);
Inc(NumberPrime);
end;
inc(i);
end;

finally

Numbers.Free;
CloseFile(F);

end;

TF := Now - TI;

ThousandSeparator := '.';
DecimalSeparator := ',';

Mnsj := Format('Con el Número %s como Límite, Se Generaron %s Números Primos en %s',
[FormatFloat('#,###,###,###,##0',Limit),
FormatFloat('#,###,###,###,##0',NumberPrime),
FormatDateTime('hh:mm:ss:zzz', TF)
]);

MessageBox(0, PChar(Mnsj), 'Algoritmo: Sieve of Sundaram', MB_OK + MB_ICONINFORMATION);

end.

Todas las anteriores implementaciones permite calcular con el [I]Número 2.147.483.615 como cota límite, un máximo de 105.097.563 Números Primos en tiempos variables, sobre una máquina con un Procesador Phenom II X6 1090T, 4 GB RAM, 3 TB HDD y Windows 7 Profesional x32, como se muestra en la siguiente imagen a continuación:

http://img716.imageshack.us/img716/6458/ku5s.jpg

El tiempo indicado en la imagen para los diferentes algoritmos es el tiempo total de proceso desde que inicia el cálculo hasta que finaliza la generación del archivo de 1.12 GB con los 105.097.563 Números Primos, lo cual implica que la verificación de los números primos: se hace en un tiempo menor al indicado.

Espero sea útil :)

Nelson.

Victor Luis
22-10-2013, 09:30:44
Holas Nelson...

La busqueda con el algoritmo de la criba de Eratostenes veo que es muy rapido... 2 minutos 25 segundos es un buen tiempo para un rango de poco mas de 2.000 millones...

○ Mi metodo PRI-BASE lo haria en 41 minutos, aunque ya encontre la forma de archivarlos en la mitad del tiempo que lo hacia, pero como dices el tiempo de busqueda es mas corto y lo que demora es archivar millones de numeros primos.
○ Una consulta al respecto, este tiempo es constante en cada busqueda del limite de 2.147.483.615 y por qué usan esta cantidad y no un limite entero... como 2.000 o 5.000 millones ?
Pregunto porque como indique el tiempo de mi metodo es constante, se cuando terminara no importa si busco en numeros grandes de mas de 18 o 24 digitos...

◘ Queria comentarte que intente poner el codigo en Delphi y he avanzado poco, creo que profundice mas VB, no encuentro las funciones compatibles como: Erase para inicializar un array, los Exponentes como 10^6, redondear hasta ciertos decimales y la funcion Format para dar formato a los numeros con puntos de mil o con decimales y me surge la duda si podre abrir los archivos de primos como otros con los Types que declare en Delphi, caso contrario tendria que iniciar desde 0 la busqueda y lo que queria es comparar los tiempos de las busquedas actuales...

◘ Por otro lado estoy analizando un metodo de Factorizacion para evaluar si un numero grande es primo o no, es una idea que me surgio y si resulta podria implementarlo al programa y ver que depure mayor cantidad de numeros grandes en menor tiempo.


Bueno amigo, para finalizar te dire que pronto tendre mi equipo actualizado con mas GB en el disco, mayor RAM y procesador, con lo que espero realizar busquedas con rangos mas grandes y reducir el tiempo del proceso....

Suerte y Gracias por la informacion que compartes....

nlsgarcia
22-10-2013, 16:37:25
Victor Luis,


...este tiempo es constante en cada búsqueda del limite de 2.147.483.615 y por qué usan esta cantidad...



...no encuentro las funciones...Erase para inicializar un array...los Exponentes...redondear...archivos...



...estoy analizando un método de Factorización para evaluar si un numero grande es primo o no...


Te comento:

1- El tiempo de generación de números primos nunca es constante en ningún algoritmo, varia en función de la carga del computador a nivel de recursos, pero en general se mantiene con pocas variaciones. El limite de 2.147.483.615 esta fijado en función de la clase TBits, la cual tiene como tamaño máximo dicho límite, algo similar ocurre con los arrays en Delphi y C#.

2- En lo referente a las funciones equivalentes entre VB6 y Delphi 7 te sugiero revisar este link:

Delphi Basics : http://www.delphibasics.co.uk/


3- Los métodos de factorización y primalidad no son adecuados para ser incluidos en un generador de números primos, dado que los tiempos se incrementarían notablemente, como ejemplo de un método de primalidad incluyo el de Miller-Rabin realizado en C# por tener el tipo BigInteger el cual facilita el uso de números enteros de gran tamaño, adecuado para su uso en algoritmos de números primos:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Numerics;
using System.Security.Cryptography;
using System.Windows.Forms;

namespace MillerRabin
{
class Program
{

static bool IsProbablePrime(BigInteger source)
{
int certainty = 10;
if (source == 2 || source == 3)
return true;
if (source < 2 || source % 2 == 0)
return false;

BigInteger d = source - 1;
int s = 0;

while (d % 2 == 0)
{
d /= 2;
s += 1;
}

RandomNumberGenerator rng = RandomNumberGenerator.Create();
byte[] bytes = new byte[source.ToByteArray().LongLength];
BigInteger a;

for (int i = 0; i < certainty; i++)
{
do
{
rng.GetBytes(bytes);
a = new BigInteger(bytes);
}
while (a < 2 || a >= source - 2);

BigInteger x = BigInteger.ModPow(a, d, source);
if (x == 1 || x == source - 1)
continue;

for (int r = 1; r < s; r++)
{
x = BigInteger.ModPow(x, 2, source);
if (x == 1)
return false;
if (x == source - 1)
break;
}

if (x != source - 1)
return false;
}

return true;
}

static void Main(string[] args)
{

BigInteger Number;
String AuxNumber;

do
{
AuxNumber = Microsoft.VisualBasic.Interaction.InputBox("Número a Verificar Primalidad",
"Test de Primalidad MillerRabin", "");
BigInteger.TryParse(AuxNumber, out Number);
if (IsProbablePrime(Number))
MessageBox.Show("Es un Número Primo", "Test de Primalidad MillerRabin",
MessageBoxButtons.OK, MessageBoxIcon.Information);
else if (AuxNumber != "")
MessageBox.Show("Es un Número Compuesto", "Test de Primalidad MillerRabin",
MessageBoxButtons.OK, MessageBoxIcon.Information);
} while (AuxNumber != "");

}
}
}

El código anterior en C#, permite verificar la primalidad de un número por medio del algoritmo Miller-Rabin aplicado 10 veces por cada Primo Probable, a fin de garantizar su confiabilidad. Estoy revisando librerías que me permitan manejar grandes números enteros para trasladar el código a Delphi.

Pregunto: ¿Podrías explicar como manejas números enteros de 18 y 24 dígitos en VB6?

Espero sea útil :)

Nelson.

Victor Luis
23-10-2013, 05:05:57
Hola Amigo NELSON...

Realmente tienes una preparacion amplia y me quedo atras frente a vos, yo soy mas empirico y autodidacta... tengo un hermano mayor que estudio Ingenieria de Sistemas; sabe mucho pero como me conoce y dice siempre estoy queriendo descubrir la polvora, me ha enseñado algunas cosas pero la mayor parte de lo que se es por cuenta propia, pues como digo Todo se puede hacer en programacion y los programas no se equivocan, sino el programador....


◘ Respecto a lo que me comentas, de que el tiempo de generacion de numeros primos nunca es constante... no se si te refieres a la cantidad de primos encontrados lo cual es variable; pero conforme se avance esta cantidad disminuye paulatinamente. Pero si te refieres a tiempo en que se encuentran nuevos numeros primos en un rango dado, en mi caso es constante, buscando en 1.000 millones tardaba de 06:20 a 06:50 y ahora tarda entre 05:10 a 05:30 y no se si sigo mal... para mi esto es constante, no importa si busco en numeros de 12 digitos o de mas de 100 digitos, esto sigue siendo igual, claro que si aumentan o disminuyen unos segundos y eso no es constante, estoy equivocado....


◘ Referente al metodo de factorizacion, he leido un poco sobre los test de primalidad, no para copiar su metodo sino para entender hasta donde llego su logica... Es interesante por ejemplo el teorema de Fermat, la presipitacion de afirmar su descubrimiento que luego Euler comprobo las fallas o errores existentes, me falta leer mas de esa epoca; pero me pase al algoritmo AKS, el ultimo y eficiente que determina en tiempo polinominal (cosa que no me queda claro del todo) pero en una pagina indican que para la determinacion de un numero de 600 digitos emplearon unas 36 computadoras y el proceso tardo meses... su formula esta en "chino" para mi; pero ahora que avanzo y tengo mas numeros primos, se me ocurrieron dos metodos que los estoy analizando primero mediante una factorizacion directa y luego mediante una factorizacion multiple con otro enfoque, pues al evaluar numeros grandes las funciones aritmeticas no podran ser aplicadas.
☼ Se que debo estar cometiendo errores en mi expresion; pero com dije no soy matematico, es una idea que tengo, he probado unos calculos pero me falta corregirlos y ver que sea practico y lo elemental, debe ser simple, que aunque parezca ilogico es como tambien es mi metodo; pero funciona hasta ahora y ahora pude reducir el tiempo de busqueda a una (1/3) tercera parte de lo que lo hacia, por ejemplo buscar en un rango de 1.000 millones tardaba entre 21-22 min y ahora lo hace entre 7-8 min, incluido el archivado de los nuevos numeros primos, espero sea menor este tiempo luego que actualice mi equipo con mas RAM, procesador y Gigas de disco duro.

◘ Sobre tu pregunta de como manejo numeros de 18-24 digitos, es lo que pense cuando vi que mi metodo daba buenos resultados... y luego que, usando una variable Double o Decimal solo tienes para un monton de digitos; pero me cuestione si en verdad los calculos se haran de forma correcta, donde vi que desde 10 billones los ultimos digitos terminan siempre en "0" y eso me creo duda, no se, puedo estar equivocado al respecto; pero por lo simple de mi metodo, encontre un modo simple tambien, que funciona y su evaluacion final sera al pasar el cuatrillon y quintillon, donde al mismo tiempo me de datos para el analisis de la factorizacion que pienso hacer, por ahora amigo Nelson solo puedo decirte que en todo el proceso usare variables "double" y los numeros de mis calculos no pasaran de 21 a 24 digitos, osea esta variable es suficiente para mi... me preocupe por un rato e hice una verificacion inicial y esta bien.. ahora tal vez no entiendo a que te refieres con lo de "manejar numeros"... es como se hace, poner un valor a una variable y realizas calculos con ella... bueno no comprendo bien tu pregunta al respecto; pero te dije como lo estoy haciendo pero para estar seguro debo pasar con buenos resultados el cuatrillon, osea primos de mas de 24 digitos.

► Sobre el metodo de factotizacion, es una idea donde solo hice unos calculos que podrian resultar, las ecuaciones matematicas estan fuera de mi alcance, por lo que intento un metodo simple de acuerdo a mi conocimiento...

► Sobre el codigo a publicar, no avance nada, me parece ilogico pues ya mejore el rendimiento con VB; pero me dices que seria mas eficiente en Delphi... puede ser y no te contradigo, solo que como lo veo yo el tiempo se reducira y quedara estable entre 5 y maximo 6 minutos en cada busqueda de un rango de 1.000 millones, es mayor al algoritmo de Eratostenes; pero con mi equipo actualizado espero disminuya uno o dos minutos mas.


Bueno... Gracias por el enlace, esta en ingles y lo traducire... del codigo fuente que publicaste poco se de Java y peor C+, estoy actualizandome en Delphi 7, veo lo util de su compilador para evitar errores en la ejecucion, en lo que le supera a VB....
☼ Evitare no ser tan extenso; pero trato de explicarme de la forma mas clara y simple que puedo..... OK