La fonction exponentielle croissant très rapidement, on dépasse
facilement les limites de l'arithmétique entière de la machine, et on ne
profite guère de cette accélération. Calculons plutôt
, de
façon à rester dans ces limites. Il suffit de placer un %m
après chaque opération. Voici la version récursive terminale de cette
fonction :
int expmod_fastrec_aux(int x, int y, int e, int m) { if (e == 0) { return y; } else if (e % 2 == 1) { return expmod_fastrec_aux(x, (x*y) % m, e-1, m); } else { return expmod_fastrec_aux((x*x) % m, y, e/2, m); } } int expmod_fastrec(int x, int e, int m) { return expmod_fastrec_aux(x, 1, e, m); }La version itérative s'obtient facilement par dérécursivation de cette définition récursive terminale :
int expmod_iter(int x, int e, int m) { int y = 1; while (e != 0) { if (e%2 == 1) { y = (x*y) % m; e = e-1; } else { x = (x*x) % m; e = e/2; } } return y; }
L'exponentielle modulaire s'avère utile à certaines méthodes de cryptographie.