
Saber si un número es primo -aquellos solo divisibles por sí mismos y por el número 1- es una tarea que en programación significa funciones recursivas. Algunas más optimizadas que otras, pero siempre terminamos en fijarnos si el número que queremos chequear es múltiplo de los números menores.
Hoy, navegando y leyendo, me encontré con algo que me sorprendió y me pareció muy curioso: como saber si un número es primo o no verificándolo con expresiones regulares.
En el 2000, en la conferencia de Perl Yet Another Perl Conference, en una charla se presentó una forma de verificar esto. Lo que hay que hacer es, primero, pasar el número que queremos verificar a una cadena de 1, donde la cantidad de 1 que aparecerán es el número que queremos verificar.
Es decir, si queremos verificar el número 7, tendremos que pasarlo a 1111111. Si queremos verificar el 15, será 111111111111111. Y luego, a esa cadena de 1, tenemos que ver si coincide con esta expresión regular:
/^1?$|^(11+?)\1+$/
Si no coincide, entonces el número es primo. Es algo muy sencillo de hacer en programación. En PHP se verifica con algo tan simple como
preg_match('/^1?$|^(11+?)\1+$/', str_repeat(1, $n))
Esta expresión se puede dividir en dos para entenderla mejor, con el signo |. La primera parte es solo para verificar si se le pasan los números 0 o 1, pues ambos no son primos pero sin esa excepción darían que sí lo son. La segunda parte es donde se produce la magia…
Lo que hace la expresión regular es primero si el número que le pasamos es de la forma 11 o alguna cadena múltiplo de esa: es decir, 11, 1111, etc. Es decir, que esté formada por onces. Si no, volverá atrás y le agregará un 1 al anterior y volverá a probar lo mismo. O sea, luego probará con 111 y cadenas con ciento onces: 111111, etc.
El siete, por ejemplo, no encaja en ninguna de estas formas. No se puede formar con el 11 ni con el 111, ni mucho menos con el 1111 (ya que luego habrá 8 unos). Si pudiese formarse con alguna cadena de unos, es porque es un múltiplo de un número anterior.
Es una forma muy original y rápida de calcular si un número es primo, sin la necesidad de crear una función que verifique matemáticamente esto. Sin embargo, en lenguajes como PHP, falla con números grandes. La razón es la incapacidad de guardar variables con muchas caractéres, lo que sucede al tratar de guardar la variable que almacena los unos de un número como, por ejemplo, un 1.000.000.
Imagen del post del comic de XKCD