Enviadas por :
Gabriel Tarela Gandini 2003,
Montevideo, UruguayDe 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.
|