Algorithmes des nombres premiers
Definition
Nombre premier: un nombre premier est un nombre qui accepte DEUX diviseurs : uniquement lui-même et 1.
Algorithme naïf
Un test de primalité est un algorithme permettant de savoir si un nombre entier est premier.
Le test le plus simple est le suivant : pour tester N , on vérifie s’il est divisible par l’un des entiers compris au sens large entre 2 et N − 1. Si la réponse est positive (True), alors N est premier, sinon il est composé (multiple).
Les nombres 0 et 1 ne sont pas considérés comme premiers.
Pseudo code:
Fonction prem1(n):
Si n = 0 ou n = 1 alors: retourner Faux
Pour i de 2 à n − 1 faire:
Si i divise n alors:
retourne False
Fin Pour
Retourer Vrai
Questions:
- Implémenter ce pseudo code en python dans un notebook
- Déterminer le nombres d’opérations T(100) réalisées pour n = 100. On considèrera comme opérations significatives les opérations arithmétiques et les comparaisons. Les comparaisons réalisées dans l’instruction
Pour ... faire:ne seront pas comptées. Seules les instructions DANS la boucle seront considérées significatives.
Amélioration: nous allons modifier la borne supérieure dans la boucle, et diminuer le nombre d’opérations…
Soit n un entier supérieur ou égal à 2. Si n n’est pas premier, et si d est son plus petit diviseur supérieur ou égal à 2, on peut écrire : n=d×quotient, avec d≤quotient
Imaginons par exemple que l’on recherche les diviseurs de 54: Les diviseurs sont 2, 3, 6, 9, 18, 27.
Mais 18 et 27 sont egalement multiples de 2 et de 3. Donc, pour tester si un nombre est premier, il ne sera pas necessaire de tester toutes les valeurs de d. En pratique, il suffira de tester si n est divisible par des valeurs de d telles que: d×d≤n
Questions:
- Modifier le code dans une nouvelle fonction (que vous renommerez
prem2) pour que celle-ci execute le moins d’opérations possibles. (soit le plus efficace).
- Déterminer le nombre d’opérations T(100) réalisées pour n = 100.
Votre fonction, calcule t-elle bien?
- Programmer une fonction
liste_primequi utilise votre fonctionprem2pour établir la liste des nombres premiers de 0 à 100. - Faites une recherche documentaire pour trouver la liste des nombres premiers entre 0 et 100. Appelons cette liste
wiki - Programmer une fonction
comparequi détermine si tous les nombres de votre liste (donnés parprem2) font partie de cellewiki.
L’algorithme le plus efficace
L’algorithme le plus efficace est celui qui prend le moins de temps pour effectuer la même tâche.
On peut mesurer le temps d’exécution des programmes à l’aide du module time. Après avoir importé le module, il suffit de créer une variable t = time.time() que l’on mettra au debut de la fonction liste_prime.
Puis avant la sortie, d’afficher en console (print) le temps écoulé avec l’instruction : print(time.time()-t).
Tester les différentes fonctions prem1, prem2 avec les entiers premiers. Choisir une plus grande valeur pour N (10000 par exemple).
Créer vos modules de test
Vous allez maintenant realiser un test unitaire sur votre fonction prem2.
Pour faire cela, vous allez réorganiser vos fonctions dans différents fichiers, et créer des modules.
Suivre l’énoncé du TP à la page /posts/python/Python_unittest_np/
Liens
- Les nombres premiers, podcastsciences
- Comment les nombres premiers protègent vos données: loic_demeulenaere
