Le test de primalité naïf est-il polynomial ?
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 31 — Décidabilité et classes de complexité
Énoncé
On teste si est premier en essayant tous les diviseurs jusqu'à .
- Quelle est la complexité de cet algorithme en fonction de ?
- En fonction de la taille de l'entrée ?
- Conclure.
Corrigé
1. L'algorithme fait divisions. C'est très peu devant — on serait tenté d'appeler cela « rapide ».
2. L'entrée est l'entier , écrit en binaire : sa taille est bits. Donc et
L'algorithme est exponentiel en la taille de l'entrée.
3. Le tableau rend la chose palpable, et les temps sont mesurés :
| Taille | Divisions | Temps mesuré | |
|---|---|---|---|
| bits | s | ||
| bits | s | ||
| bits | s | ||
| bits | s (extrapolé) |
Treize bits de plus multiplient le temps par quatre-vingt-dix. Une clé cryptographique fait bits : l'algorithme demanderait divisions.
Ce que l'exercice enseigne. « Polynomial » ne se juge jamais sur la valeur des nombres, toujours sur leur écriture. La faute est d'autant plus facile que a l'air modeste. Le test de primalité est dans — l'algorithme AKS, de 2002, est polynomial en —, mais ce n'est pas celui-là qui le prouve.
C'est exactement le défaut annoncé par le chapitre chap:dynamique pour le sac à dos, et il resurgit ici sur un algorithme que tout le monde croit connaître.
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.