TD n°1 - Test Primalité Algorithmique
Un nombre premier est un entier naturel qui admet exactement deux diviseurs distincts entiers et positifs (qui sont alors 1 et lui-même).
Par opposition, un nombre non nul produit de deux nombres entiers différents de 1 est dit com- posé.
Nombre premier
Thèmes
Arithmétique (nombres premiers et composés, divisibilité), tests de primalité, fonctions ren- voyant une valeur booléenne, test dans une boucle avec une fonction booléenne.
http ://www.math93.com/images/pdf/algo_Python/Td_Algorithmes_TD_Test_Primalite.pdf
Exercice 1. Un test de primalité
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 testerN, on vérifie s’il est divisible par l’un des entiers compris au sens large entre 2 etN−1. Si la réponse est négative, alors N est premier, sinon il est composé.
def prem1(n) :
’ ’ ’Renvoie True si l’entier est premier et False sinon’ ’ ’ assertn>=2
for i in range (2,n) :
ifn%i==0 :#n est divisible par i return False
#On n’a pas trouvé de diviseur à l’entier n return True
Code Python
Fonction prem1(n) assertn>=2
Pouride 2 àn−1 Faire Siidivise n Renvoyer False Fin Pour
Renvoyer True
Pseudo Code
La fonction renvoie une valeur booléenne, c’est-à-dire ou bienTrueou bienFalse. On remarque que dès qu’on trouve un diviseurd on renvoieFalse: l’instructionreturnpermet à la fois de renvoyer le résultat attendu et d’interrompre l’itération.
Remarque
Quand on divise deux entiersneti,n%i renvoie le reste de la division euclidienne denpari, n//irenvoient le quotient alors quen/irenvoie le quotient décimal.
Remarque
1. Le site math93 propose la liste des 168 nombres premiers inférieurs à 1 000 et un lien vers le sitecompoassoequi donne la liste des nombres premiers inférieurs à 1 000 milliards..
Tester l’algorithme avec des nombres premiers et des nombres composés ayant 4, 5 et 6 chiffres.
2. Modifier l’algorithme afin que la fonction renvoie aussi une décomposition de l’entiern, par exempleprem(18) doit renvoyer (False,9,2) etprem(13)doit renvoyer (True,13,1). Tester-le avec un nombre composé, produit de deux nombres premiers à 5 chiffres comme par exemple :n=28 537×28 603=816 243 811.
def prem(n) :
’ ’ ’. . . .’ ’ ’ assertn>=2
#À compléter.
Code Python
TD n°1 - Test Primalité - Algorithmique
Exercice 2. Une amélioration possible
Soitnun entier supérieur ou égal à 2.
Sinn’est pas premier, et sidest son plus petit diviseur supérieur ou égal à 2, on peut écrire : n=d×quoti ent , avecd≤quoti ent
Puisque on a choisi le plus petit diviseurd; on constate alors qued×d≤n. Pour tester sinest premier, il suffit donc de tester sa divisibilité par les entiers dont le carré est inférieur ou égal àn.
3. Compléter l’algorithme ci-dessous.
def prem2(n) :
’ ’ ’renvoie True si l’entier est premier et False sinon’ ’ ’ assert n>=2 #On teste si n est supérieure ou égal à 2
d=2
while· · · ·: #Á compléter if n%d==0 :
return False d=d+1
#On n’a pas trouvé de diviseur return True
Code Python
Fonction prem2(n) assertn>=2 d←2
Tant que· · · Faire Siddivise n
Renvoyer False d←d+1
Fin Tant que Renvoyer True
Pseudo Code
4. On peut tester nos deux fonctionspremetprem2avec un nombre premier ayant de nombreux chiffres. Vérifier l’efficacité de la fonction prem2 avec l’entier premier à 15 chiffres, découvert en 1850 par le danois, Thomas Clausen : 67280421310721 , (copier/coller : 67280421310721).
Exercice 3. Avec une fonction d’Euler
Le légendaire mathématicien suisse Léonhard EULER(1707-1783), proposait la formule suivante pour obtenir des nombres premiers : pour tout entier natureln,
f(n)=n2−n+41
Léonhard EULER(1707-1783)
5. On a vu lors du TD n°1 sur les fonctions que f renvoyait des nombres premiers pour de nombreuses valeurs entières, mais pas pour toutes.
Compléter cet algorithme afin qu’il affiche la première valeur entière dont l’image par la fonction f est un nombre composé, ainsi que son image.
On introduira une fonction sans argument,premierCompose()qu’il suffira d’appeler dans la console.
def premierCompose() i=0
while· · · ·:#À compléter.
i=i+1 return· · · ·
Code Python
6. La fonctiong : x7−→x2−79x+1601 est aussi assez remarquable.
Reprendre les questions précédentes avec cette fonction et déterminer la plus petite valeur denentière dont l’image n’est pas un nombre premier, ... si elle existe ! On pourra cette fois utiliser une fonctionpremierCom- pose(g), de paramètreg.
Remarque : On peut donc se demander s’il existe une fonction polynomiale (à coefficient entiers) donnant tous les nombres premiers ... la réponse est non, mais il vous faudra attendre un peu pour démontrer ce magnifique résultat !
www.math93.com / M. Duffaud 2/3
TD n°1 - Test Primalité - Algorithmique
Exercice 4. Complément en assignment sur repl
7. Écrire une fonctiontableauprem(n,f)qui donne le tableau de valeurs d’une fonction f (comme dans le TD n°1 du thème Fonction), pourxentier variant de 0 àn, avec un test de primalité pour chacune des images et un affichage adapté. La fonction sera de paramètresnetf.
Par exempletableauprem(5,f)doit renvoyer :
def tableauprem(n,f) :#À compléter.
Code Python
Exercice 5. Complément en assignment : Une autre amélioration du Test de primalité
8. Sur le modèle de la fonctionprem2(n), écrire une fonctionprem3(n)qui évalue la primalité den, en effectuant un cas particulier avecd=2 puis en ne testant que les diviseurs impairs, avecd=3 puis avecd←d+2.
def prem3(n) :#Á compléter
’ ’ ’renvoie True si l’entier est premier et False sinon’ ’ ’
Code Python
Complément : mesure du temps d’exécution
On peut mesurer le temps d’exécution des programme à l’aide du module time. Après avoir importé le module, il suffit de créer une variablet = time.time()puis avant la sortie, d’imprimer le temps écoulé avec l’instruction :
print(time.time()-t).
Tester les différentes fonctionsprem1, prem2 et prem3avec les entiers premiers, (on pourra cliquer sur Stop quand le temps d’exécution semble trop long ) :
Date Découvreur Nombre
1732 Leonhard Euler 6 700 417
1750 Leonhard Euler 2 147 483 647
1855 Thomas Clausen 67 280 421 310 721
1876 Édouard Lucas 170 141 183 460 469 231 731 687 303 715 884 105 727
[ Fin du devoir \
Prolongements
Nombres premiers jumeaux : Td Arithmétique n°2
Une fonction pour obtenir une liste de nombres premiers ainsi que des couples de premiers jumeaux.
www.math93.com/images/pdf/algo_Python/Td_Algorithmes_Arithmetique_TD2_Nb_Premier_Jumeaux.pdf
www.math93.com / M. Duffaud 3/3