Adloun

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é.

ImportantLa règle à retenir

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.