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 bnc, 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
2 Calculs de PGCD
3. On rappelle que l’algorithme d’Euclide permet de calculer le PGCD
de deux entiers aet b, en utilisant :
— PGCD(a,b) = PGCD(b,a%b), si a%b6= 0.
— PGCD(a,b) = bsinon.
´
Ecrire une fonction r´ecursive pgcd impl´ementant l’algorithme d’Eu-
clide. Quelle est sa complexit´e ?
4. Nous allons utiliser une autre m´ethode de calcul de PGCD, bas´ee sur
la d´ecomposition en facteurs premiers.
(a) ´
Ecrire une fonction decomposition ayant un argument net qui
renvoie la liste Ldes diviseurs premiers de navec multiplicit´es. On
pourra stocker dans chaque ´el´ement de Lune liste compos´ee de
deux entiers naturels : le diviseur et sa multiplicit´e. Par exemple
decomposition(50) devra renvoyer la liste [[2, 1], [5, 2]],
puisque 50 = 21×52.
(b) En d´eduire une autre fonction pgcd2 renvoyant le PGCD de deux
entiers naturels en argument, en utilisant decomposition. Quelle
est sa complexit´e ? Comparer avec l’algorithme d’Euclide.
2
1 / 2 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !