Criba de Eratóstenes hecha a base de macros

La Criba de Eratóstenes es un método para buscar números primos realmente sencillo. Escogemos un límite (un número más allá del cuál no vamos a buscar primos), y, empezando por el 2, vamos eliminando o marcando los múltiplos de los números. Si un número no ha sido marcado como múltiplo de otro, es primo, y entonces marcaremos sus múltiplos sin sobrepasar el límite.

Sieve of Eratosthenes animation.gif
«Sieve of Eratosthenes animation». Disponible bajo la licencia CC BY-SA 3.0 vía Wikimedia Commons.
Lo divertido es cuando nos ponemos a ofuscar un código que, en un primer momento, puede ser realmente sencillo. Este sería un ejemplo del tradicional Hola Mundo en C hecho a base de macros:

Un/a macro o directiva para el compilador son instrucciones no escritas, propiamente dicho, en un lenguaje de programación (aunque puedan incluirse pequeños snippets mediante macros). Son, en definitiva, directrices que el compilador seguirá antes de ponerse a compilar nuestro código fuente. En concreto, las directrices #define <a> <b> sustituirán en todo el texto identificado como código toda aparición de <a> por lo definido en <b>

Así pues, convertir un programa para que esté compuesto exclusivamente de <a> y se transforme en <b> en el preprocesado llevado a cabo por el compilador es algo relativamente sencillo. Dividimos el código en pequeños bloques <b> y les asignamos palabras <a> de manera que, al final, nos salga un texto más o menos con sentido. El siguiente código lo hice ayer por la tarde rápidamente y en algunas partes flaquea.

Esta implementación de la Criba de Eratóstenes en C no libera la memoria que reserva (será liberada con la terminación del programa), no tiene sentencia return en el main() y dicho main no queda declarado como de tipo entero, lo cuál, dependiendo de la versión de compilador usado, generará algún warning. Al margen de eso, buscará números primos menores que el 99.999.999; para ello reservará un vector de enteros, dependiendo de la máquina, 32 bits/entero * 99.999.999 enteros = memoria RAM que reservará. Si no dispones de la cantidad necesaria, o saltará un error de violación de segmento o tu SO empezará a hiperpaginar. ¡Prueba bajo tu propio riesgo!

Deja un comentario