domingo, 1 de marzo de 2015

Números primos grandes en Arduino

Recordando algo de matemáticas podemos decir que un número primo es un número entero que sólo es divisible entre 1 y si mismo. Los números primos son importantes para el común de los mortales porque una gran parte de la seguridad en internet se basa en utilizar un algoritmo muy dificil de descifrar ya que depende de dos números primos muy grandes.
Para mortales no tan comunes , los matemáticos, los números primos son especialmente interesantes ya que no se ha encontrado un algoritmo eficaz para determinar si un número es o no primo. El único algoritmo totalmente determinístico es la criba de eratóstenes , pero este procedimiento requiere recursos inmensos de tiempo y poder de cálculo a medida que los números son mas grandes.
Para otros mortales, como los que tenemos algo que ver con informática, desde muy temprano hemos tenido que desarrollar un programa que emule la criba de eratóstenes. Inclusive se utilizan ciertos algoritmos para determinar el poder de cálculo de un procesador (benchmark).
Es por ello que siempre encontraremos a alguien gastando el tiempo en desarrollar algún programa de búsqueda de números primos para cualquier procesador que tenga entre manos. Y claro, el Arduino no va a quedar huerfano en esta tan encomiable labor !!!
Buscando en la web me encontré con la siguiente entrada en el foro de Arduino  http://forum.arduino.cc/index.php?topic=192209.0 que trata sobre la búsqueda de números primos grandes en la plataforma Arduino.
Para quien tenga unos quince minutos le recomiendo que la revisen aunque sea por encima, ya que entre otras cosas podemos ver como evoluciona el programa desarrollado por el Sr. Nick Gammon (por cierto, muy prolífico en temas de electronica y específicamente Arduino).
Como a mi esto de la teoría de números también me atrae, quise hacer un pequeño aporte.
Haciéndole unas pequeñas modificaciones al programa del Sr. Gammon logré que el programa se ejecutara en un Atmega644 a 20Mhz con una LCD donde se muestran los números primos que van siendo identificados. El programa guarda en el eeprom interno la información cada 1000 números primos, de tal forma que continúa despues de un reset o apagado.  Este número puede ser cambiado en el programa.
La primera que vez que se graba el programa en la memoria flash del micro debemos eliminar los caracteres de comentarios en las líneas 43,44 y 45 , una vez que el programa ha encontrado los primeros 1000 números primos comentamos de nuevo estas líneas y grabamos de nuevo el programa en el micro.

 
 
En la imágen podemos ver la información mostrada en la pantalla del lcd : en la primera línea tenemos el último número primo encontrado, en la segunda línea tenemos durante cuantos minutos ha estado ejecutándose el programa y el número de primos encontrados.

Una mejora al programa sería lograr que se grabaran los primos encontrados en una memoria eeprom externa o en una tarjeta de memoria. Ya veremos ...

Actualización del 09/03/2015
En la imágen podemos ver que después de 9768 minutos ( 163 horas) se han encontrado 731.696 números primos.