Clipper 5.x

Observaciones sobre esta competencia

 

Enviadas por :
Gabriel Tarela Gandini 2003, Montevideo, Uruguay

De todas las competencias que he podido ver publicadas en la pagina esta me parece que ha sido
la mas interesante.

Los numeros primos muy ansiados en criptografia han sido siempre un gran enigma.
No tienen un patron definido como los numeros pares, por ejemplo, que siguen una secuencia muy simple.
2,4,6,8,10

Si quiero obtener un numero par dado un numero par solo le sumo dos y listo, obtengo el siguiente.
Pero los numeros primos no siguen una secuencia facil de establecer, asi que no tengo formulas exactas dado un
numero primo de encontrar el siguiente, basandome en una serie.

Debo admitir que lo unico que sabia de los numeros primos, cuando vi la propuesta en la pagina, es que estos
son divisibles solo por si mismos y la unidad ( conceptos basicos), y debo reconocer que, a pesar de los muchos
esfuerzos que puse en encontrar una formula que me determine con rapidez la primacidad de un numero, no me fue
posible encontrar un metodo eficaz para encontrar una solucion a este problema.
Desde conceptos basicos hasta explicaciones a travez de matematica compleja, en ninguno de los casos pude encontrar
una solucion "magica" al problema.

Navegando por internet llego a la conclusion de que no hay ningun metodo ( conocido hasta el momento ), que pueda
determinar con exactitud la primacidad de un numero, hay formulas que pueden establecer la primacidad de un numero
con una alta probabilidad ( un 99.5% a un 99.9% mas o menos ), pero no existe ninguna que lo pueda determinar con
exactidud.

Asi que a pesar de todas las barreras que se me presentaron decidi ir en busca de mi propia solucion, aunque esta no sea la
mas rapida, es segura y funciona.

Es que entonces, con mi poco conocimiento de las matematicas, me propuese realizar un par de experimentaciones
con la finalidad de sacar mis propias conclusiones, admito que tengo un conocimiento muy pobre en el tema.
Pero como cuando hay un problema nada me detiene en busca de una solucion, aqui va la mia.

Esta solo utiliza conceptos basicos y una matematica sencilla ( solo operaciones basicas como sumar, restar, multiplicar
y dividir ).


El desafio planteado se puede dividir en 3 areas.

1 - Realizar una funcion que sea capaz de determinar la primacidad de un numero en el menor tiempo posible.
2 - Establecer un mecanismo de control sobre la unicidad del numero encontrado ( que no se repita siempre el mismo )
3 - Establecer una secuencia aleatoria.


1 - Esta es la mas dificil y seguro el que encuentre una buena solucion a este problema sera el ganador de la competencia.

La primera funcion que hice dividia el numero entre todos los numeros mayores que 1 y menores o iguales que numero-1
la solucion mas facil y mas lenta de todas.

Desplegando los numeros primos en la pantalla pude darme cuenta de que todos terminan en 1,3,7 o 9, no hay ningun
primo que no termine en una de estas cifras.

Luego me di cuenta de otra cosa ( solo utilizando el sentido comun ), si divido el numero en cuestion entre 2
por ejemplo 1001 / 2 me da 500.5, esto quiere decir que 1001 / 500.5 me da 2, y si lo divido entre cualquier numero
mayor que 500.5 me va a dar un numero menor que dos ( ya sea 1.98,1.96,1.95,1.92,etc ).
O sea que si el numero no es divisible entre dos tampoco lo es entre un numero mayor a 500.5

Si sigo el mismo razonamiento al dividir entre 3,4,5,6,7,etc me doy cuenta que ocurre lo mismo.

Genericamente seria que si 1001 lo divido entre a ( siendo a 1,2,3,4,5,6,etc ) me da un resultado x ( 500.5,etc,etc )
Va a llegar un momento en que a y x van a ser iguales o a va a ser mayor que x.
Es aca cuando debo de dejar de dividir el numero porque si a es mayor que x el numero ya no va a ser divisible por ningun
numero, ya que a y x se invierten y realizare las mismas operaciones sin ningun resultado que me determine que el numero
en cuestion es primo.

2 - Las formas conocidas de generar un numero que no se repita es sabiendo de antemano los que ya fueron seleccionados.
Solo conozco dos formas de hacerlo: almacenar los valores en memoria o en disco. Como en clipper no puedo almacenar
en un array mas de 4.000 y tantos elementos, no puedo utilizar esta opcion, porque segun determine con mi programa
en 1.000.000 hay alrededor de 70.000 y tantos numeros primos. De manera que la unica salida era utilizar una
dbf para almacenar los numeros primos, utilizar una dbf para almacenar 70.000 y tantos numeros lleva su tiempo.

3 - Para establecer una secuencia aleatoria solo se necesita una funcion que genere numeros aleatorios asi que sera cuestion de hacer una funcion que devuelva numeros aleatorios.


Aqui va el programa que genera los primos desde el 1 hasta 1.000.000 en forma aleatoria.
El indice creado a la tabla con la clave randint() es un truquillo, otro desesperado intento por reducir los tiempos que la verdad
que son bastante grandes con esta solucion un poco casera y bastante simple.

Aca va el ejemplo, solo se necesita compliar el prg con las librerias standard del clipper 5.x y esperar ( esperar mucho... unos
40 minutos segun el equipo )

Se generara una dbf con 78.498 numeros primos ( desde 2 hasta 1.000.000 ), en forma aleratoria y unica.


Enviadas por :
Manuel Pérez Rivas, Zaragoza, España

En primer lugar darte las gracias por tu nueva formula de exponer todos los
programas, que si bien en otras competencias pueden ser demasiado extensas ,
si que seria interesante que publicaras las que consideraras mejores, ( mi
único afán es aprender un poco más de los demás).

Con respecto a la competencia pasada y ya que nos permites comentarte tus
decisiones ( que no injustas) te diré después de haber testeado los
programas mi parecer:

El programa de Darío Hernán utilizando 1.000.000 de números se me cuelga,
puede que sea un problema de mi ordenador o de tenerlo mal configurado, pero
no debería. con 500.000 números me tarda más de ocho minutos a falta de
comprobar 200.000 , es decir que tarda demasiado tiempo, con respecto a que
no utiliza bases de datos, si que las utiliza aunque solo sea para la
presentación. en definitiva que la burla a la limitación es ficticia ya que
no puede presentar los datos en pantalla y las 25 columnas que se
necesitarían para presentarlo como array no se ha conseguido y el tiempo que
tarda (una de las bases de la competencia no lo cumple) cómo ya he dicho
antes es excesivo.

El programa de Gabriel Tarela es menos vistoso que el de Darío y aunque
tarda un poco menos creo que tarda mas de 10 minutos, en definitiva un
tiempo excesivamente elevado.

El de Cesar en mi humilde opinión le sucede exactamente lo mismo, el exceso
de tiempo en la localización de los números primos.

Mi programa considero que no cumple con el requisito de generar o presentar
los números de una forma aleatoria, por lo que debo descartarlo en primer
lugar.

y para finalizar me queda el de Ángel, al que no tengo nada que oponer y
creo que desde mi humilde opinión es el que más se ha acerado a la consigna
propuesta.

espero que mi granito de arena no sirva nada más que para ayudarte en tu
laboriosa, ardua y compleja tarea

Un saludo


Enviadas por :
El Gurú.

Por un error de omición no incluí el código que realmente supera al resto de los competidores, doy fe de haberlo recibido el día 11 de Abril, y lo incluyo en este momento.

 

Esta sección sobre CA-Clipper está coordinada íntegramente por Diego Lucio D'Onofrio


la Luna del Guille o... el Guille que está en la Luna... tanto monta...

Estadísticas desde el 01/Nov/2002 23:15