Un nombre premier est un entier positif qui admet exactement deux diviseurs entiers et positifs distincts : \(1\) et lui-même. Ainsi :
\(0\) n'est pas premier car il est divisible par tous les entiers non nuls ;
\(1\) n'est pas premier car il n'admet que lui même comme diviseur ;
\(2\) est premier car il n'est divisible que par \(1\) et \(2\) ;
\(6\) n'est pas premier car il admet quatre diviseurs : \(1\), \(2\), \(3\) et \(6\).
Divisibilité
\(a\) est divisible par \(b\) si le reste de la division euclidienne de \(a\) par \(b\) vaut \(0\).
Avec Python l'expression a%b est alors évaluée à 0.
Cette définition permet de formuler un test de primalité simple. Considérons un nombre entier positif \(n\) :
Si \(n\) est strictement inférieur à \(2\), il n'est pas premier ;
Sinon, si \(n\) est divisible par l'un des entiers compris entre \(2\) et \(\sqrt{n}\) (inclus l'un et l'autre), alors il n'est pas premier ;
Dans le cas contraire, \(n\) est premier.
On demande d'écrire la fonction est_premier qui prend en paramètre un entier \(n\) positif ou nul et renvoie True si ce nombre est premier, False dans le cas contraire.
Deux versions, construites autour de boucles for ou while, sont proposées.
Le mot clé assert est utilisé en Python afin de vérifier que des propositions sont vraies.
Ainsi, l'instruction assert3+5*7==38 permet de vérifier que l'expression 3+5*7 est bien évaluée à 38.
Si c'est le cas, le programme continue de se dérouler normalement. Dans le cas contraire, le programme est interrompu et une erreur est signalée.
Version avec une boucle for
Une première approche consiste à utiliser une boucle for afin de parcourir tous les diviseurs potentiels de \(n\) entre \(2\) et \(\sqrt{n}\) (inclus l'un et l'autre).
La fonction permettant de calculer la racine carrée d'un nombre positif fait partie du module math. Elle est importée au début de cette version de l'exercice : frommathimportsqrt.
Attention toutefois, cette fonction renvoie toujours un nombre flottant : sqrt(5) est évalué à environ 2.23606797749979.
On peut néanmoins arrondir ce résultat à l'entier inférieur ou égal en utilisant int : int(sqrt(5)) est évalué à 2.
On rappelle de plus que l'instruction range(5,12) parcourt les entiers entre 5 (inclus) et 12 (exclu).
###(Dés-)Active le code après la ligne # Tests (insensible à la casse) (Ctrl+I)
Entrer ou sortir du mode "deux colonnes" (Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran" (Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Le calcul d'une racine carrée est coûteux. Il est possible de s'en passer en observant que si \(d\) est un entier positif tel que \(d \le \sqrt{n}\) alors on a nécessairement \(d^2 \le n\).
Cette observation permet de parcourir tous les diviseurs souhaités à l'aide d'une boucle while.
###(Dés-)Active le code après la ligne # Tests (insensible à la casse) (Ctrl+I)
Entrer ou sortir du mode "deux colonnes" (Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran" (Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)