Devoir Maison sur feuille : nombres premiers. Pour le 9 janvier.

Devoir Maison sur feuille : nombres premiers.
Pour le 9 janvier.
Informatique Pour Tous - 2016/2017
Si vous ne l’avez pas d´ej`a fait, et si vous en avez la possibilit´e, il est fortement conseill´e de
t´el´echarger Pyzo, en allant sur http://test.pyzo.org/downloads.html. Si par exemple vous
avez Windows, vous pouvez t´el´echarger win64.zip, dezipper et ensuite ex´ecuter pyzo.exe dans le
dossier d´ezipp´e. Vous pourrez ainsi tester vos r´eponses dans Pyzo. Le DM doit cependant ˆetre
rendu ´ecrit, sur papier.
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. (a) ´
Ecrire une fonction divise qui prend deux entiers naturels a, b en arguments avec a
non nul et renvoie True si adivise b,False sinon.
(b) ´
Ecrire une fonction diviseurs qui prend un entier naturel non nul nen argument et
renvoie la liste des diviseurs de n.
(c) ´
Ecrire une fonction premier qui prend un nombre en argument et renvoie True si ce
nombre est premier, False sinon.
(d) ´
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.
(e) Quelle est la complexit´e dans le pire des cas de tous_premiers ? On admettra que
les op´erations a // b et a%bde python ont chacune une complexit´e O(ln(a)).
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. A la fin, L[i] ´egal True si iest premier, False sinon. 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 argument 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. Si vous avez acc`es `a Pyzo, vous pouvez comparer experimentalement
le temps d’ex´ecution des deux fonctions : par exemple, ´ecrire
1
%timeit(tous_premiers(1000)) dans le shell donne le temps d’ex´ecution moyen de
tous_premiers(1000).
3. Nous nous ineressons maintenant au calcul du PGCD en Python. On rappelle l’algo-
rithme d’Euclide permettant de calculer le PGCD de deux entiers aet b, o`u a>b:
Tant que b > 0 :
r= reste de la division de apar b
a=b
b=r
Renvoyer a
(a) ´
Ecrire une fonction pgcd impl´ementant l’algorithme d’Euclide en python.
(b) Montrer que l’algorithme d’Euclide a pour complexit´e dans le pire des cas O((ln(a))2).
Pour cela on pourra d’abord montrer (ou admettre) que, si riest la suite des restes
(o`u r0est le premier reste), ri+2 < ri/2.
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 L
une 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 arguments, en utilisant decomposition. Quelle est sa complexit´e ? Comparer avec
l’algorithme d’Euclide.
(c) ´
Ecrire aussi une fonction ppcm renvoyant le PPCM de deux entiers naturels en argu-
ments.
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 !