• Aucun résultat trouvé

TD n°1 - Test Primalité Algorithmique

N/A
N/A
Protected

Academic year: 2022

Partager "TD n°1 - Test Primalité Algorithmique"

Copied!
3
0
0

Texte intégral

(1)

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

(2)

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 , avecdquoti ent

Puisque on a choisi le plus petit diviseurd; on constate alors qued×dn. 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 dd+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)=n2n+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

(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 avecdd+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

Références

Documents relatifs

[r]

[r]

[r]

[r]

Cette fonction est dérivable sur [0; +∞[ comme somme de fonctions dérivables.. Donc la propriété est vraie pour tout entier

Il n'est évidemment pas surjectif car toute image est dérivable dans l'ouvert et il existe des fonctions continues sans être dérivables.. Le spectre est inclus dans le

Il a 100 mètres de barrière à disposition et seuls les trois côtés ne jouxtant pas la rivière doivent être fermés. Quelles sont les dimensions de l’enclos pour avoir une

Propriété n°1 (Unicité et existence de la fonction exponentielle) Il existe une unique fonction f , définie et dérivable sur R , telle que