Si solo está interesado en x ^ n mod p, donde x y p son relativamente pequeños (digamos, encajan en el registro de 32 bits), entonces usaría un algoritmo con complejidad O (lg n), como este:
function pow(x,n,p){
if (n==0) {
return 1
- Cómo averiguar qué castillo conectar con qué otro, para que los caminos sean los menos largos
- ¿Cuál es la diferencia entre 802.11, a / b / g / ny 802.11, b / g / ny cuál es mejor?
- ¿Cómo ayuda la transformación rápida de Fourier en la multiplicación polinómica más rápida?
- Cómo resolverlo y (x) ” = h / (y (x)) ^ 2 donde h es constante
- ¿Hay alguna prueba matemática de que es imposible encontrar una ecuación (algoritmo) para generar todos los números primos?
}
half = pow(x,floor(n/2),p)
full = half * half mod p
if (n is even) {
return full
} else {
return full * x mod p
}
}
Hay muchas formas diferentes en que este algoritmo puede reformularse (por ejemplo, puede pasar x * x a la llamada recursiva, o reemplazar la recursión con iteración y escaneo de bits, etc.) y aún mantener el tiempo de ejecución O (lg n).
En mi experiencia, la operación más costosa es la operación de módulo (ya que la división solía ser 30 veces más lenta que la multiplicación), pero en algunos idiomas la operación más costosa podría ser la llamada a función, por lo que es posible que desee reescribirla usando un bucle.