Estaba leyendo CLRS y me pidió que mostrara que si es un primo de la forma y era un residuo cuadrático, entonces es una raíz cuadrada (también se puede mostrar fácilmente que es una raíz cuadrada).
Me preguntaba si usar el hecho anterior y también que sabíamos que teníamos un número de la forma (no necesariamente primo), entonces tal vez hay una prueba de primalidad diferente para (¿alguna?) usando la función de raíz cuadrada (es decir, ).
Entonces el algoritmo que pensé era el siguiente:
Elija un Residuo cuadrático (QR) (se puede hacer fácilmente al verificar si a ^ {\ frac {p-1} {2}} \ equiv 1 \ pmod p se mantiene). Una vez que tengamos un QR, calcule a ^ {k + 1} = x_a y verifique si x_a ^ 2 es igual a a . Si es cierto, entonces concluimos que a es primo. De lo contrario, elegimos un QR diferente a '\ in \ mathbb {Z} ^ * _ N y repetimos el algoritmo. Uno puede repetir este algoritmo k veces. Si después de k veces no hay éxito, concluya que el número es compuesto.
Tengo principalmente intuiciones sobre por qué es correcto pero no una prueba formal. Del primer hecho de que es una raíz cuadrada cuando es primo, debe significar que . Por lo tanto, si es un QR, entonces ese cheque pasará (la mitad del tiempo elegiremos un QR, por lo que probablemente elijamos un QR que no sea solo 1/2)
Sin embargo, si es compuesto, parece que tenemos ninguna garantía de que . Entonces, si no se mantiene, estamos seguros de que no es primo. Pero si se mantiene, entonces si es primo, tenemos razón, pero si es compuesto, podríamos estar equivocados Básicamente, ¿es posible usar la función SQRT cuando para decidir si es primo o no?
También pensé en otro algoritmo que merecía su propia pregunta: ¿calcular la raíz cuadrada de un número y tener más de 2 raíces es una forma confiable de decidir la primalidad?
fuente
Respuestas:
Permítanme comenzar con un contraejemplo donde su algoritmo da la respuesta incorrecta: es decir, donde es compuesto pero su algoritmo concluye que es primo. Supongamos que y . Entonces , entonces pasa su cheque para ser un QR. Además, y , por lo que esto pasa su segunda prueba, su algoritmo concluir que 91 es primo. Sin embargo, 91 no es primo: . Por lo tanto, su algoritmo ha llegado a una conclusión incorrecta en este caso. Esto demuestra que su algoritmo puede generar respuestas incorrectas en al menos algunos casos.N N=91 a=9 a(N−1)/2=945≡1(mod91) a a(N+1)/4=923≡81(mod91) 812≡9(mod91) 91=7×13
En realidad, hay un problema más serio con su algoritmo. No hay un número donde su algoritmo saldrá alguna vez "compuesto". Piensa que todos los números son primos. Más precisamente, para cada , su algoritmo se repetirá para siempre (tratando de encontrar un número que pase la prueba QR, en vano), o terminará y generará "primo". Entonces, su algoritmo es tan incorrecto como podría ser.N N
Puedes ver esto aplicando alguna teoría de números. Tiene una prueba de si es un QR y una segunda prueba basada en la información de raíz cuadrada. Si pasa la primera prueba, pasará la segunda.a a
Este es el por qué. Su prueba QR éxito si . Su segunda prueba tiene éxito si . Esta última es equivalente a . Pero . Por lo tanto, si , entonces (multiplicando ambos lados por ) inmediatamente vemos que debemos tener .a(N−1)/2≡1(modN) (a(N+1)/4)2≡a(modN) a(N+1)/2≡a(modN) a(N+1)/2≡a×a(N−1)/2(modN) a(N−1)/2≡1(modN) a a(N+1)/2≡a(modN)
Cada una de las pasadas de su algoritmo básicamente equivale a buscar una que pase la primera prueba, y luego verificar si pasa la segunda prueba, pero según la información previa, vemos que cualquier que pase la primera prueba estar garantizado para pasar la segunda prueba también. Por lo tanto, si el algoritmo encuentra algún valor que pase la prueba QR, la segunda prueba pasará automáticamente y el algoritmo generará "primo".k a a a
La lección que debe aprender: cada vez que piense que tiene un algoritmo que parece prometedor, vale la pena codificarlo y probarlo en algunos casos de prueba y ver si parece funcionar bien. Probarlo en algunos casos de prueba no es un sustituto de una prueba de corrección , pero puede ser una forma útil de eliminar rápidamente algún algoritmo incorrecto.
Finalmente, a su pregunta real: ¿podemos usar algo como esto para construir una prueba de primalidad? Bueno, puedes pensar que la prueba de primalidad de Miller-Rabin se basa libremente en algo como esto. Se basan en una caracterización de cómo deberían ser las raíces cuadradas de , si es primo. Si encuentra una raíz cuadrada de que no es o , puede concluir que no es primo. Sin embargo, no se limita a los números de la forma , por lo que en ese sentido es definitivamente diferente.1 N 1 1 −1 N N N=4k+3
fuente
La congruencia es verdadera para todos los primos de la forma correcta, pero también es cierta para algunos números compuestos, lo que hace que la congruencia por sí sola sea inútil como prueba de primalidad.p
Ejemplo: establezca en el número , que obviamente es compuesto y tiene la forma con . es , entonces mod produce el residuo cuadrático = . = = ; aplicando mod a eso produce . Ahora la prueba: bajo mod se supone que es la raíz cuadrada de ( ) solo si es primo, perop 15 4k+3 k=3 10000 1002 10000 15 a 10 10k+1 104 10000 p 10 p 10 a 10 p 102 = que es mod , por lo que ha pasado la prueba de la primacía. Sin embargo, sabemos que es compuesto.100 10 p p p
Esto demuestra que incluso si su método para elegir QR es perfecto, el algoritmo aún puede errar. Por ejemplo, aquí sería una forma razonable para recoger : recoger un número aleatorio , cuadrado, y llamar a el resultado (es decir, ). Entonces sabe que está garantizado que es un QR, y no hay necesidad de probarlo usando la prueba que enumeró. Si así fue como su algoritmo eligió , entonces el ejemplo anterior muestra que su algoritmo puede dar la respuesta incorrecta en algunos casos (p. Ej., , ).a r a a=r2modN a a p=15 r=5
fuente