¿Cuál es la derivación de esta fórmula para calcular módulos de grandes números?

Esto se llama algoritmo de “cuadrado y multiplicación”. La idea es realmente bastante simple. Podemos construir cualquier número natural comenzando desde cero y duplicando o sumando uno repetidamente, según la representación binaria del número. Por ejemplo, 25 es 11001 en la base 2, y leer de izquierda a derecha, eso significa que comenzamos con cero, y luego:

  1. 1 significa “doblar y sumar 1”, entonces obtenemos 1;
  2. 1 significa “doblar y sumar 1”, entonces obtenemos 3;
  3. 0 significa “doble”, entonces obtenemos 6;
  4. 0 significa “doble”, entonces obtenemos 12;
  5. 1 significa “doblar y sumar 1”, por lo que obtenemos 25.

Podemos construir cualquier poder usando la cuadratura y multiplicación repetidas usando el mismo motivo. Para elevar b a la potencia 25, comenzaríamos con la unidad (que es b ^ 0) y:

  1. cuadrado y multiplicar por b, dando b ^ 1;
  2. cuadrado y multiplicar por b, dando b ^ 3;
  3. cuadrado, dando b ^ 6;
  4. cuadrado, dando b ^ 12;
  5. cuadrado y multiplicar por b, dando b ^ 25.

La función recursiva que se muestra en los detalles de la pregunta es una implementación de este algoritmo; Simplemente sucede que va de arriba hacia abajo en lugar de de abajo hacia arriba. Es decir, para calcular b ^ 12, decimos “Calcularé recursivamente b ^ 6 primero y luego lo elevaré al cuadrado”.