Un número entero positivo p es primo si tiene exactamente dos factores: 1 y p.
Teóricamente, la prueba de primalidad determinista más eficiente se debe a Lenstra y Pomerance, que se ejecuta en [matemáticas] \ tilde {O} (log ^ 6n) [/ matemáticas] [si cree la Hipótesis de Riemann Extendida, entonces el Algoritmo de Miller se ejecuta en [matemáticas] ] \ tilde {O} (log ^ 4n) [/ math]]. El artículo de Miller tiene un algoritmo [matemático] \ tilde {O} (n ^ {1/7} [/ matemático]) y el conocido algoritmo Adleman-Pomerance-Rumley se ejecuta en [matemático] O (log n ^ {O ( log log log n)}) [/ math].
Sin embargo, estos algoritmos son buenos teóricamente . En la práctica, son lentos debido a las grandes constantes ocultas por la notación [math] O [/ math]. Entonces, en la práctica, se utilizan algoritmos probabilísticos como Miller-Rabin (código de GitHub):
- En un montón binario, un nodo con índice i tiene hijos en los índices 2i + 1 y 2i + 2 (cuando la matriz es 0 indexada). ¿Cómo se deriva esta relación?
- ¿Cuál es el mejor algoritmo de búsqueda en programación?
- Cómo diseñar un algoritmo de movimiento para un robot hexápodo
- ¿Puedo leer Introducción a las estructuras de datos de Cormen como un principiante completo?
- ¿Qué depara el futuro para los algoritmos genéticos y qué tan relevantes serán en 20 años?
def miller_rabin (n, k = 10):
si n == 2:
volver verdadero
si no n & 1:
falso retorno
verificación de def (a, s, d, n):
x = pow (a, d, n)
si x == 1:
volver verdadero
para i en xrange (s – 1):
si x == n – 1:
volver verdadero
x = pow (x, 2, n)
retorno x == n – 1
s = 0
d = n – 1
mientras que d% 2 == 0:
d >> = 1
s + = 1
para i en xrange (k):
a = rango de rand (2, n – 1)
si no, marque (a, s, d, n):
falso retorno
volver verdadero