TP PSI : nombres premiers
Informatique Pour Tous - 2016/2017
On rappelle qu’un entier naturel est premier lorsqu’il a exactement
deux diviseurs : 1 et lui-mˆeme. Si aet bsont deux entiers, on rappelle que
a // b et a%bdonnent le quotient et le reste de la division euclidienne de
apar b, respectivement.
1 Enum´erer les nombres premiers
1. (a) ´
Ecrire une fonction diviseurs qui prend un entier naturel non
nul nen argument et renvoie la liste des diviseurs de n.
(b) ´
Ecrire une fonction premier qui prend un nombre en argument
et renvoie True si ce nombre est premier, False sinon.
(c) ´
Ecrire une fonction tous_premiers qui prend un entier naturel
nen argument et renvoie la liste de tous les nombres premiers
inf´erieurs ou ´egaux `a n.
(d) Quelle est la complexit´e dans le pire des cas de tous_premiers ?
Il faut justifier la r´eponse.
2. Le crible d’´
Eratosth`ene est un algorithme beaucoup plus efficace pour
obtenir la liste des nombres premiers inf´erieurs `a un entier n.
On part d’une liste Lde taille n+ 1 dont tous les ´el´ements sont des
bool´eens de valeur True. On modifie la valeur de L[0] et L[1] `a
False. Puis pour chaque i entre 2 et b√nc, si L[i] contient True,
alors pour chaque kmultiple de iet strictement sup´erieur `a i, on
modifie L[k] en False. On pourra ´ecrire int(x) pour calculer la
partie enti`ere d’un flottant x.
(a) ´
Ecrire une fonction eratosthene qui prend un nombre nen ar-
gument et renvoie la liste Ld´ecrite ci-dessus.
(b) En utilisant la fonction eratosthene, ´ecrire une fonction tous_premiers2
qui prend un entier naturel nen argument et renvoie la liste de
tous les nombres premiers inf´erieurs ou ´egaux `a n.
(c) Quelle est la complexit´e dans le pire des cas de tous_premiers2 ?
Comparer avec tous_premiers. Comparer experimentalement le
temps d’ex´ecution des deux fonctions : par exemple,
%timeit(tous_premiers(1000)) dans le shell de Pyzo donne le
temps d’ex´ecution moyen de tous_premiers(1000).
1