Vous êtes sur la page 1sur 3

TD n°1 - Test Primalité

Algorithmique

Nombre premier
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é.

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 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 négative, alors N est premier, sinon il est composé.

Code Python Pseudo Code


def prem1(n) : Fonction prem1(n)
’ ’ ’Renvoie True si l’entier est premier et False sinon’ ’ ’ assert n >= 2
assert n >= 2 Pour i de 2 à n − 1
for i in range (2, n) : Si i divise n
if n%i == 0 : # n est divisible par i Retourne False
return False
Fin Pour
# On n’a pas trouvé de diviseur à l’entier n
Retourne True
return True

Remarque
La fonction renvoie une valeur booléenne, c’est-à-dire ou bien True ou bien False. On remarque
que dès qu’on trouve un diviseur d on renvoie False : l’instruction return permet à la fois de
renvoyer le résultat attendu et d’interrompre l’itération.

Remarque
Quand on divise deux entiers n et i , n%i renvoie le reste de la division euclidienne de n par i ,
n//i renvoient le quotient alors que n/i renvoie le quotient décimal.

1. Le site math93 propose la liste des 168 nombres premiers inférieurs à 1 000 et un lien vers le site compoassoe qui
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’entier n, par exemple prem(18)
doit renvoyer (False,9,2) et prem(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.

Code Python
def prem(n) :
’ ’ ’ ................ ’ ’ ’
assert n >= 2
# À compléter.
TD n°1 - Test Primalité - Algorithmique

Exercice 2. Une amélioration possible

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 × quot i ent , avec d ≤ quot i ent

Puisque on a choisi le plus petit diviseur d ; on constate alors que d × d ≤ n. Pour tester si n est 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.

Code Python Pseudo Code


def prem2(n) : Fonction prem2(n)
’ ’ ’renvoie True si l’entier est premier et False sinon’ ’ ’ assert n >= 2
assert n>= 2 # On teste si n est supérieure ou égal à 2 d ←2
d =2 Tant que · · · · · ·
while · · · · · · : # Á compléter Si d divise n
if n%d==0 :
Retourne False
return False
d = d +1 d ← d +1
# On n’a pas trouvé de diviseur Fin Tant que
return True Retourne True

4. On peut tester nos deux fonctions prem et prem2 avec 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 naturel n,

f (n) = n 2 − 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 en-
tiè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.

Code Python
def premierCompose()
i =0
while · · · · · · : # À compléter.
i = i +1
return · · · · · ·

6. La fonction g : x 7−→ x 2 − 79x + 1601 est aussi assez remarquable.


Reprendre les questions précédentes avec cette fonction et déterminer la plus petite valeur de n entière dont l’image
n’est pas un nombre premier, ... si elle existe ! On pourra cette fois utiliser une fonction premierCompose(g), de para-
mètre g .
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 fonction tableauprem(n,f ) qui donne le tableau de valeurs d’une fonction f (comme dans le TD n°1 du
thème Fonction), pour x entier variant de 0 à n, avec un test de primalité pour chacune des images et un affichage
adapté. La fonction sera de paramètres n et f .
Par exemple tableauprem(5,f ) doit renvoyer :

Code Python
def tableauprem(n, f ) : # À compléter.

Exercice 5. Complément en assignment : Une autre amélioration du Test de primalité

8. Sur le modèle de la fonction prem2(n), écrire une fonction prem3(n) qui évalue la primalité de n, en effectuant un
cas particulier avec d = 2 puis en ne testant que les diviseurs impairs, avec d = 3 puis avec d ← d + 2.

Code Python
def prem3(n) : # Á compléter
’ ’ ’renvoie True si l’entier est premier et False sinon’ ’ ’

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 importer le module, il
suffit de créer une variable t = time.time() puis avant la sortie, d’imprimer le temps écoulé avec l’instruction :
print(time.time()-t).
Tester les différentes fonctions prem1, prem2 et prem3 avec 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 \

www.math93.com / M. Duffaud 3/3