Primalidad

La siguiente fórmula es un testeador de primalidad:

[Update: no había aclarado que los corchetes simbolizan la función "parte entera de"]

Para j > 1, vale 1 si j es primo, y 0 si j es compuesto.

Vi la fórmula en A Passion for Mathematics, de Clifford A. Pickover, que a su vez lo cita de Mathematical Mysteries, de Calvin Clawson.

Clawson dijo sobre ella: «Es verdaderamente asombrosa. ¿Cómo sabe si su argumento es primo o compuesto?»

Y realmente es asombrosa. Lástima que no es fácil de evaluar para valores grandes de j…

14 comentarios para “Primalidad”

  1. Alvy Dice:

    Es bastante asombrosa, pero en mi hoja de cálculo, tal vez por problemas de redondeos empieza a fallar con el 19, tampoco va nada bien con 23 ni 29.

    He intentado encontrar algo más sobre ella y no hay apenas menciones, ni en Mathworld ni otros sitios, es extraño, porque es muy simpática.

    Creo que es obvio que no puede funcionar, pero no sabría decir por qué.

  2. Marcos Dice:

    Justamente es difícil de evaluar sin tener software de precisión ilimitada; por eso es poco práctica aún si funcionara.

  3. Alvy Dice:

    Con Mathematica se podrían comprobar muchísimos números, tiene la precisión que quieras, pero la verdad es que no parece que llegue lejos, aunque está genial.

    Había algunas más sencillas de Euler que funcionaban hasta 41, pero ahora no la encuentro.

    Pero bueno, no existe una «fórmula para generar números primos» como tal, ni para comprobar su primalidad, aunque esa es muy bonita.

  4. Carlos Luna Dice:

    Pues no la conocía, pero me parece muy interesante. Permíteme que intente explicar cómo funciona:

    Bueno, básicamente se trata de mirar cuando la fórmula da 0 o 1. Esto último pasará siempre que hagamos el cos² de un múltiplo de Pi. Lo cual es equivalente a que [(j-1)! + 1] / j sea un entero.

    Así pues tenemos que si j divide (j-1)! + 1 la fórmula da 1 y esto equivale a que j sea primo porque (j-1)! + 1 no es divisible por ningún número menor que j y sin embargo es divisible por j. Si j fuese divisible por algún número menor que él (es decir, no fuese primo) ese divisor también lo sería de (j-1)! + 1, lo cual ya hemos visto que es absurdo.

    Por otro lado no veo porqué debe dar exactamente 0 si j no es primo. Yo diría que en realidad da un número entre 0 y 1. ¿Puedes revisar este dato, por favor?

    A nivel técnico basta con decir que la fórmula es elegante, pero calcular (j-1)! es tanto o más difícil que factorizar j para valores grandes de j. Maple o Mathematica pueden ser de utilidad para hacer cálculos de precisión arbitraria.

  5. Marcos Dice:

    Carlos: no aclaré que los corchetes simbolizan “parte entera”, y por eso la fórmula funciona.

    ¡Gracias por la explicación!

  6. Marcos Dice:

    Con razón me sonaba tanto el cociente. Proviene del teorema de Wilson.

  7. Marcos Dice:

    En Wikipedia se pueden ver más fórmulas que producen primos. Entre ellas figura la que comentamos.

    Claro, no se conoce ninguna que sea eficiente, pero bueno, algo es algo :)

  8. Alvy Dice:

    Carlos: sí, como han dicho arriba los corchetes redondea hacia abajo (la función INT o FLOOR en las hojas de cálculo). Estos son los 38 primeros números según mi hoja de cálculo (Numbers) que pueden tener problemas de precisión

    1 1,00000000
    2 1,00000000
    3 1,00000000
    4 0,50000000
    5 1,00000000
    6 0,75000000
    7 1,00000000
    8 0,85355339
    9 0,88302222
    10 0,90450850
    11 1,00000000
    12 0,93301270
    13 1,00000000
    14 0,95048444
    15 0,95677237
    16 0,96194478
    17 0,99999996
    18 0,97242228
    19 0,99948855
    20 0,93329875
    21 0,08760540
    22 0,40878488
    23 0,00291023
    24 0,01575514
    25 0,97156321
    26 0,84190190
    27 0,25277687
    28 0,88056184
    29 0,58641096
    30 0,02950141
    31 0,09459787
    32 0,36778865
    33 0,51342620
    34 0,86507832
    35 0,99943417
    36 0,83809606
    37 0,92329704
    38 0,97150235

    Por ej. el 6 (0,75) redondeado hacia abajo es correcto (no-primo), pero con 17 es mejor redondear el 0,999996 a 1 porque es primo. A partir de números como 19 es cuando la cosa no está tan clara, y mira 35 que es justo lo contrario (0,99943) a pesar de ser compuesto.

  9. Marcos Dice:

    Alvy: con el Mathematica funciona bien; claro que deja de ser práctica bastante rápido. Como dicen en wikipedia, hay algoritmos mucho más rápidos que testean primalidad.

  10. rafa Dice:

    Me encanta este blog, es muy interesante, pero ¿de donde coño habéis salido?
    son todos ustedes geniales.

    salu2 de un hombre de letras no numéricas.

  11. Marcos Dice:

    Rafa: el autor de este blog es uno solo (por ahora). O sea yo, Marcos :)
    ¡Gracias por visitar!

  12. Gisela Dice:

    Jaja, muy buena la fórmula! Como detalle a notar, para 23 y 31 también falla notoriamente (confiando en la tabla expuesta por Alvy), entre otros. Es una linda curiosidad. Para el que está interesado y aún no lo sabía, en el año 2004 se ha demostrado que el problema de decisión sobre la primalidad de un número pertenece a los problemas P (extendiendo: los problemas de complejidad polinomial en la longitud de la entrada, que en este caso se considera como la cantidad de dígitos del número ingresado). El algoritmo que lo muestra es el AKS, y pueden encontrarlo programado en C por lo pronto. Una de las páginas donde aparece es la siguiente:

    islab.oregonstate.edu/koc/ece575/04Project2/Halim-Chanleudfa/Report.pdf

    Saludos!

  13. Marcos Dice:

    Gracias Gisela por el dato! Respecto a los valores de la tabla, están calculados con una herramienta de precisión fija, por eso son incorrectos. Matemáticamente la fórmula funciona perfectamente (aunque no es útil en sentido práctico).

  14. Luisito Dice:

    Ya que estoy agrego mas datos respecto a lo que dijo Gisela. Lo interesante del caso es que el algoritmo fue descubierto por un grupo de ingenieros de la india, y no por matematicos. De hecho la matematica que se usa es relativamente elemental.

    El resultado tiene interes teorico principalmente. En la practica se pueden hacer algoritmos probabilisticos mucho mas rapidos. Son mas o menos como el metodo de la moneda . En estos algoritmos se realizan ciertos calculos medio al azar que declaran al numero “probablemente primo” si no aciertan a encontrar un divisor. Aunque parezca mentira, si el algoritmo esta bien pensado le acierta casi siempre y es muy rapido. Y si quedan dudas, se puede repetir el proceso todas las veces que uno quiera hasta estar suficientemente seguro.

Escribe un comentario