Cómo implementar un algoritmo usando la recursividad para encontrar el módulo de esta serie

Hay 2 congruencias importantes que debes saber:

  • [matemáticas] (x + y + z) \ mod m = ((x \ mod m) + (y \ mod m) + (z \ mod m)) \ mod m [/ math]
  • [matemáticas] (x * y) \ mod m = ((x \ mod m) * (y \ mod m)) \ mod m [/ matemáticas]

Esto nos dice que podemos calcular cada [matemática] a ^ i \ mod m [/ matemática] por separado y sumarlas.

[matemáticas] a ^ i \ mod m = a ^ {i-1} * a \ mod m [/ matemáticas]

Entonces, podemos calcularlos iterativamente y mantener un contador con el resultado.

Sin embargo, con la entrada dada, realmente no necesitamos calcularlos todos. Podemos observar que

[matemáticas] a ^ 0 = 2 ^ 0 = 1 = 1 \ mod 7 [/ matemáticas]

[matemáticas] a ^ 1 = 2 ^ 1 = 2 = 2 \ mod 7 [/ matemáticas]

[matemáticas] a ^ 2 = 2 ^ 2 = 4 = 4 \ mod 7 [/ matemáticas]

[matemáticas] a ^ 3 = 2 ^ 3 = 8 = 1 \ mod 7 [/ matemáticas]

Y el patrón se repite con el período 3.

Entonces, el resultado es [matemáticas] ((1 + 2 + 4) * 1666 + 1 + 2) \ mod 7 [/ matemáticas].

[matemáticas] 1 + 2 + 4 = 7 [/ matemáticas] que es [matemáticas] 0 \ mod 7 [/ matemáticas]. Entonces el resultado es 3.

dado que (X * Y) mod M = ((X mod M) * (Y mod M)) mod M

y (X + Y) mod M = ((X mod M) + (Y mod M)) mod M

Creo que la recursividad debería ser:

rec (a, b) = (a + rec ((a * b) mod M, b-1)) mod M

donde el caso base es: cuando b es igual a 0, respuesta = 1