Aller au contenu principal

Module 06 · Leçon 2

Nombres premiers

180 minanalyse · pascal
Affichage du code

Ce que vous saurez faire

  • Tester si un entier est premier
  • Optimiser le test (arrêter à √n)
  • Lister les premiers jusqu'à N

Avant de commencer

7 est premier (divisible par 1 et 7 seulement). 9 = 3 × 3 ne l'est pas. Comment détecter efficacement qu'un nombre est premier ?


1. Définition et premier algorithme

Version naïve : tester tous les diviseurs de 2 à n−1.

FUNCTION EstPremier_Naive(n : integer) : boolean;
VAR i : integer;
BEGIN
  IF n < 2 THEN
    EstPremier_Naive := false
  ELSE
  BEGIN
    EstPremier_Naive := true;
    FOR i := 2 TO n - 1 DO
      IF n MOD i = 0 THEN
        EstPremier_Naive := false;
  END;
END;

Inconvénient : O(n) opérations.


2. Optimisation : s'arrêter à √n

Si n = a × b avec a ≤ b, alors a ≤ √n. Donc s'il existe un diviseur, il existe forcément un diviseur ≤ √n. On peut s'arrêter là.

DEF FN EstPremier(n : entier) : booléen
  Si n < 2 Alors EstPremier ← Faux
  Sinon
    ok ← Vrai
    i ← 2
    Tant que (i * i ≤ n) ET ok Faire
      Si n mod i = 0 Alors ok ← Faux FinSi
      i ← i + 1
    FinTantQue
    EstPremier ← ok
  FinSi
Fin EstPremier

Complexité : O(√n). Pour n = 10⁶, on teste au max 1000 valeurs au lieu de 1 000 000.


3. Liste des premiers jusqu'à N

PROCEDURE PremiersJusqu(N : integer);
VAR k : integer;
BEGIN
  FOR k := 2 TO N DO
    IF EstPremier(k) THEN
      Write(k, ' ');
  Writeln;
END;

PremiersJusqu(20) affiche : 2 3 5 7 11 13 17 19.


4. Exercices

Exercice 1facile
Est-il premier ?

Pour chacun, dire s'il est premier : 1, 2, 9, 17, 25, 29.

Voir le corrigé
  • 1 : non (par définition, n ≥ 2)
  • 2 : oui (seul premier pair)
  • 9 = 3 × 3 : non
  • 17 : oui
  • 25 = 5 × 5 : non
  • 29 : oui
Exercice 2moyen
Comptage de premiers (type bac courant)

Écrire un programme qui demande N et affiche le nombre de premiers entre 2 et N.

Voir le corrigé
PROGRAM Compte;
VAR n, k, cpt : integer;
BEGIN
  Write('N : ');
  Readln(n);
  cpt := 0;
  FOR k := 2 TO n DO
    IF EstPremier(k) THEN
      cpt := cpt + 1;
  Writeln('Nombre de premiers ≤ ', n, ' : ', cpt);
END.

Pour n = 100, résultat : 25.

Exercice 3difficile
Crible d'Ératosthène (hors bac, bonus)

Implémenter le crible d'Ératosthène : marquer dans un tableau booléen tous les multiples de chaque premier rencontré, puis afficher les positions restées vraies.

Voir le corrigé
PROGRAM Crible;
CONST N = 100;
VAR
  est_premier : ARRAY[2..N] OF boolean;
  i, j : integer;
BEGIN
  { Initialement, tous candidats }
  FOR i := 2 TO N DO
    est_premier[i] := true;

  { Marquage des multiples }
  FOR i := 2 TO N DO
    IF est_premier[i] THEN
    BEGIN
      j := i * 2;
      WHILE j <= N DO
      BEGIN
        est_premier[j] := false;
        j := j + i;
      END;
    END;

  { Affichage }
  FOR i := 2 TO N DO
    IF est_premier[i] THEN
      Write(i, ' ');
END.

Bien plus rapide que de tester chaque entier individuellement.


5. Erreurs fréquentes au bac

  • Oublier de traiter n < 2 (1, 0, négatifs ne sont pas premiers).
  • Boucle FOR i := 2 TO n au lieu de s'arrêter à √n (très lent).
  • Continuer à incrémenter i après avoir trouvé un diviseur (utiliser un drapeau ou un Sortir).

6. Quiz

Quiz (5 questions)

1

1 est-il premier ?

2

Pour tester si n est premier, on s'arrête à :

3

Combien de premiers entre 1 et 20 ?

4

L'algorithme `WHILE (i*i <= n) AND ok` est préférable à `WHILE (i <= sqrt(n)) AND ok` car :

5

Le seul premier pair est :

Bravo d'être arrivé jusqu'ici. Marquez la leçon terminée pour ancrer le progrès.