TP PSI : nombres premiers

publicité
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ême. Si a et b sont deux entiers, on rappelle que
a // b et a % b donnent le quotient et le reste de la division euclidienne de
a par b, respectivement.
1
Enumérer les nombres premiers
1. (a) Écrire une fonction diviseurs qui prend un entier naturel non
nul n en argument et renvoie la liste des diviseurs de n.
(b) Écrire une fonction premier qui prend un nombre en argument
et renvoie True si ce nombre est premier, False sinon.
(c) Écrire une fonction tous_premiers qui prend un entier naturel
n en argument et renvoie la liste de tous les nombres premiers
inférieurs ou égaux à n.
(d) Quelle est la complexité dans le pire des cas de tous_premiers ?
Il faut justifier la réponse.
2. Le crible d’Ératosthène est un algorithme beaucoup plus efficace pour
obtenir la liste des nombres premiers inférieurs à un entier n.
On part d’une liste L de taille n + 1 dont tous les éléments sont des
booléens de valeur True. On modifie la√ valeur de L[0] et L[1] à
False. Puis pour chaque i entre 2 et b nc, si L[i] contient True,
alors pour chaque k multiple de i et strictement supérieur à i, on
modifie L[k] en False. On pourra écrire int(x) pour calculer la
partie entière d’un flottant x.
(a) Écrire une fonction eratosthene qui prend un nombre n en argument et renvoie la liste L décrite ci-dessus.
(b) En utilisant la fonction eratosthene, écrire une fonction tous_premiers2
qui prend un entier naturel n en argument et renvoie la liste de
tous les nombres premiers inférieurs ou égaux à n.
(c) Quelle est la complexité dans le pire des cas de tous_premiers2 ?
Comparer avec tous_premiers. Comparer experimentalement le
temps d’exécution des deux fonctions : par exemple,
%timeit(tous_premiers(1000)) dans le shell de Pyzo donne le
temps d’exécution 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 a et b, en utilisant :
— PGCD(a, b) = PGCD(b, a % b), si a % b 6= 0.
— PGCD(a, b) = b sinon.
Écrire une fonction récursive pgcd implémentant l’algorithme d’Euclide. Quelle est sa complexité ?
4. Nous allons utiliser une autre méthode de calcul de PGCD, basée sur
la décomposition en facteurs premiers.
(a) Écrire une fonction decomposition ayant un argument n et qui
renvoie la liste L des diviseurs premiers de n avec multiplicités. On
pourra stocker dans chaque élément de L une liste composée de
deux entiers naturels : le diviseur et sa multiplicité. Par exemple
decomposition(50) devra renvoyer la liste [[2, 1], [5, 2]],
puisque 50 = 21 × 52 .
(b) En déduire une autre fonction pgcd2 renvoyant le PGCD de deux
entiers naturels en argument, en utilisant decomposition. Quelle
est sa complexité ? Comparer avec l’algorithme d’Euclide.
2
Téléchargement