La taille d'une entrée n'est pas sa valeur
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 3 — Algorithmes, programmes et complexité
Énoncé
Le test de primalité par divisions successives fait environ divisions. Est-ce un algorithme polynomial ?
bool premier(long n) {
if (n < 2) { return false; }
for (long d = 2; d * d <= n; d = d + 1) {
if (n % d == 0) { return false; }
}
return true;
}Corrigé
Non, et c'est le piège le plus profond du chapitre.
La complexité se compte « en fonction de la taille de l'entrée ». Or la taille d'un entier n'est pas : c'est le nombre de chiffres — ou de bits — qu'il faut pour l'écrire, soit . En fonction de , l'algorithme fait
divisions : c'est exponentiel en la taille de l'entrée.
La mesure le rend palpable. Pour le plus grand nombre premier inférieur à :
n | bits | divisions | temps
1021 | 10 | 30 | < 1 ms
1048573 | 20 | 1022 | < 1 ms
1073741789 | 30 | 32766 | < 1 ms
1099511627689 | 40 | 1048574 | 0,9 ms
1125899906842597 | 50 | 33554430 | 29 ms
Dix bits de plus multiplient le travail par , exactement : . Ce n'est pas approximativement , c'est .
L'extrapolation est édifiante. Au rythme mesuré — divisions en ms, soit environ milliard par seconde —, un nombre de bits demanderait divisions, soit près de onze jours. Un nombre de bits en demanderait , soit plus longtemps que l'âge de l'univers. Les clés cryptographiques ont aujourd'hui bits ; c'est exactement là-dessus que repose leur sécurité.
Un algorithme sur les entiers est dit polynomial quand son coût est polynomial en le nombre de bits de l'entrée. Écrire n'est pas faux — c'est même la bonne façon de comparer deux algorithmes de primalité entre eux — mais cela ne dit rien sur la classe de complexité, et l'on parle alors de complexité pseudo-polynomiale. La distinction est reprise au chapitre chap:decidabilite.
Le même piège attend au chapitre chap:dynamique, avec le problème du sac à dos : sa solution en est pseudo-polynomiale, étant une valeur et non une taille.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.