La prueba de primalidad de Solovay-Strassen , desarrollada por Robert M. Solovay y Volker Strassen en 1977, es una prueba probabilística para determinar si un número es compuesto o probablemente primo . La idea detrás de la prueba fue descubierta por MM Artjuhov en 1967 [1] (ver Teorema E en el artículo). Esta prueba ha sido reemplazada en gran medida por la prueba de primalidad de Baillie-PSW y la prueba de primalidad de Miller-Rabin , pero tiene una gran importancia histórica al mostrar la viabilidad práctica del criptosistema RSA . La prueba de Solovay-Strassen es esencialmente una prueba de primos probables de Euler-Jacobi .
Euler demostró [2] que para cualquier número primo impar p y cualquier entero a ,
donde es el símbolo de Legendre . El símbolo de Jacobi es una generalización del símbolo de Legendre a , donde n puede ser cualquier entero impar. El símbolo de Jacobi se puede calcular en tiempo O ((log n )²) utilizando la generalización de Jacobi de la ley de reciprocidad cuadrática .
Dado un número impar n, se puede contemplar si la congruencia es o no
se cumple para varios valores de la "base" a , dado que a es primo relativo a n . Si n es primo, entonces esta congruencia es verdadera para todo a . Entonces, si escogemos valores de a al azar y probamos la congruencia, entonces tan pronto como encontremos un a que no se ajuste a la congruencia, sabemos que n no es primo (pero esto no nos dice una factorización no trivial de n ). Esta base a se llama testigo de Euler para n ; es un testigo de la composición de n . La base a se llama mentiroso de Euler para n si la congruencia es verdadera mientras n es compuesto.
Para cada impar compuesto n , al menos la mitad de todas las bases
son testigos (de Euler) ya que el conjunto de mentirosos de Euler es un subgrupo propio de . Por ejemplo, para , el conjunto de mentirosos de Euler tiene orden 8 y , y tiene orden 48.
Esto contrasta con la prueba de primalidad de Fermat , para la cual la proporción de testigos puede ser mucho menor. Por lo tanto, no existen números compuestos (impares) sin muchos testigos, a diferencia del caso de los números de Carmichael para la prueba de Fermat.
Supongamos que queremos determinar si n = 221 es primo. Escribimos ( n −1)/2=110.
Seleccionamos aleatoriamente un a (mayor que 1 y menor que n ): 47. Utilizando un método eficiente para elevar un número a una potencia (mod n ) como la exponenciación binaria , calculamos:
Esto da como resultado que 221 es primo o 47 es un mentiroso de Euler para 221. Probamos otro a aleatorio , esta vez eligiendo a = 2:
Por lo tanto, 2 es un testigo de Euler para la composición de 221, y 47 era, de hecho, un mentiroso de Euler. Obsérvese que esto no nos dice nada sobre los factores primos de 221, que en realidad son 13 y 17.
El algoritmo se puede escribir en pseudocódigo de la siguiente manera:
entradas : n , un valor para probar la primalidad k , un parámetro que determina la precisión de la prueba salida : compuesto si n es compuesto, de lo contrario probablemente primorepetir k veces: Elija un número aleatorio en el rango [2, n − 1] si x = 0 o entonces devuelva compuesto , probablemente devuelva primo
Usando algoritmos rápidos para exponenciación modular , el tiempo de ejecución de este algoritmo es O( k ·log 3 n ), donde k es el número de valores diferentes de a que probamos.
Es posible que el algoritmo devuelva una respuesta incorrecta. Si el valor de entrada n es, en efecto, primo, entonces el resultado siempre será, correctamente, probablemente primo . Sin embargo, si el valor de entrada n es compuesto, entonces es posible que el resultado sea incorrectamente probablemente primo . El número n se denomina entonces pseudoprimo de Euler-Jacobi .
Cuando n es impar y compuesto, al menos la mitad de todos los a con mcd( a , n ) = 1 son testigos de Euler. Podemos demostrarlo de la siguiente manera: sean { a 1 , a 2 , ..., a m } los mentirosos de Euler y a un testigo de Euler. Entonces, para i = 1,2,..., m :
Porque se cumple lo siguiente:
Ahora sabemos que
Esto da como resultado que cada a i da un número a · a i , que también es un testigo de Euler. Por lo tanto, cada mentiroso de Euler da un testigo de Euler y, por lo tanto, el número de testigos de Euler es mayor o igual que el número de mentirosos de Euler. Por lo tanto, cuando n es compuesto, al menos la mitad de todos los a con mcd( a , n ) = 1 es un testigo de Euler.
Por lo tanto, la probabilidad de fallo es como máximo 2 − k (compárese esto con la probabilidad de fallo de la prueba de primalidad de Miller-Rabin , que es como máximo 4 − k ).
Para fines de criptografía, cuantas más bases a probemos, es decir, si elegimos un valor suficientemente grande de k , mejor será la precisión de la prueba. Por lo tanto, la probabilidad de que el algoritmo falle de esta manera es tan pequeña que el (pseudo)primo se usa en la práctica en aplicaciones criptográficas, pero para aplicaciones para las que es importante tener un primo, se debe usar una prueba como ECPP o la prueba de primalidad de Pocklington [3] que prueba la primalidad.
El límite 1/2 de la probabilidad de error de una sola ronda de la prueba de Solovay–Strassen se cumple para cualquier entrada n , pero aquellos números n para los que se alcanza (aproximadamente) el límite son extremadamente raros. En promedio, la probabilidad de error del algoritmo es significativamente menor: es menor que
para k rondas de la prueba, aplicadas a n ≤ x uniformemente aleatorio . [4] [5] El mismo límite también se aplica al problema relacionado de cuál es la probabilidad condicional de que n sea compuesto para un número aleatorio n ≤ x que ha sido declarado primo en k rondas de la prueba.
El algoritmo de Solovay-Strassen muestra que el problema de decisión COMPOSITE está en la clase de complejidad RP . [6]