Aller au contenu principal

Module 06 · Leçon 4

Décomposition en facteurs premiers et factorielle

180 minanalyse · pascal
Affichage du code

Ce que vous saurez faire

  • Décomposer un entier en produit de facteurs premiers
  • Calculer la factorielle d'un entier
  • Reconnaître les limites des entiers (overflow)

Avant de commencer

60 = 2 × 2 × 3 × 5. C'est la décomposition en facteurs premiers. Pour n! (factorielle), c'est un grand nombre vite : 10! = 3 628 800. Comment calculer et représenter ces nombres ?


1. Décomposition en facteurs premiers

Principe : on divise n par les premiers successifs (2, 3, 5, …) tant que possible. À chaque division réussie, on note le facteur.

PROCEDURE Decomposer(n : integer);
VAR p : integer;
BEGIN
  p := 2;
  Write(n, ' = ');
  WHILE n > 1 DO
  BEGIN
    WHILE n MOD p = 0 DO
    BEGIN
      Write(p);
      n := n DIV p;
      IF n > 1 THEN Write(' x ');
    END;
    p := p + 1;
  END;
  Writeln;
END;

Trace pour 60 : 60/2=30, 30/2=15, 15/3=5, 5/5=1. Affichage : 60 = 2 x 2 x 3 x 5.


2. Factorielle

n! = 1 × 2 × 3 × … × n. Cas particulier : 0! = 1.

{ Attention : retour 'longint' obligatoire car n! déborde 'integer' (16 bits)
  dès n = 8 en Turbo Pascal. Voir section 3 sur les limites de capacité. }
FUNCTION Factorielle(n : integer) : longint;
VAR
  i : integer;
  f : longint;
BEGIN
  f := 1;
  FOR i := 2 TO n DO
    f := f * i;
  Factorielle := f;
END;

Trace pour 5! : 1, 2, 6, 24, 120.


3. Limites de capacité

En Pascal standard, integer est typiquement signé sur 16 ou 32 bits.

TypeCapacitén! max
integer (16 bits)32 7677! = 5040
longint (32 bits)2 milliards12! = 479 001 600
int64 (64 bits)9 × 10¹⁸20! ≈ 2.4 × 10¹⁸

Au-delà, dépassement de capacité silencieux (le résultat tourne).

FUNCTION Factorielle(n : integer) : longint;   { ou int64 }
VAR
  i : integer;
  f : longint;
BEGIN
  f := 1;
  FOR i := 2 TO n DO
    f := f * i;
  Factorielle := f;
END;

4. Exercices

Exercice 1facile
Décomposition

Donner la décomposition en facteurs premiers de 84, 100, 360.

Voir le corrigé
  • 84 = 2 × 2 × 3 × 7
  • 100 = 2 × 2 × 5 × 5
  • 360 = 2 × 2 × 2 × 3 × 3 × 5
Exercice 2moyen
Compter les diviseurs (type bac courant)

À partir de la décomposition n = p₁^a × p₂^b × p₃^c …, on sait que n a exactement (a+1)(b+1)(c+1)… diviseurs.

Écrire une fonction NbDiviseurs(n) qui calcule ce nombre sans lister tous les diviseurs.

Voir le corrigé
FUNCTION NbDiviseurs(n : integer) : integer;
VAR p, exp, res : integer;
BEGIN
  res := 1;
  p := 2;
  WHILE n > 1 DO
  BEGIN
    exp := 0;
    WHILE n MOD p = 0 DO
    BEGIN
      exp := exp + 1;
      n := n DIV p;
    END;
    IF exp > 0 THEN
      res := res * (exp + 1);
    p := p + 1;
  END;
  NbDiviseurs := res;
END;

{ Exemple : 12 = 2²×3¹ → (2+1)(1+1) = 6 diviseurs (1,2,3,4,6,12) }
Exercice 3difficile
Coefficient binomial (hors bac, bonus)

C(n, k) = n! / (k! × (n−k)!). Calculer C(n, k) sans passer par des factorielles complètes (pour éviter l'overflow), en simplifiant au fur et à mesure.

Voir le corrigé
FUNCTION Binomial(n, k : integer) : longint;
VAR i : integer;
  res : longint;
BEGIN
  IF k > n - k THEN k := n - k;   { symétrie }
  res := 1;
  FOR i := 1 TO k DO
  BEGIN
    res := res * (n - i + 1);
    res := res DIV i;
  END;
  Binomial := res;
END;

On multiplie puis divise à chaque étape — le résultat intermédiaire reste petit.


5. Erreurs fréquentes au bac

  • Initialiser f := 0 au lieu de 1 pour la factorielle (multiplie par 0).
  • Démarrer la boucle à 1 au lieu de 2 (multiplier par 1 est inutile mais pas faux).
  • Utiliser integer pour n! quand n ≥ 8 → overflow.

6. Quiz

Quiz (5 questions)

1

La décomposition de 60 en facteurs premiers est :

2

Combien vaut 6! ?

3

Quelle initialisation correcte pour calculer une factorielle ?

4

12! avec le type `integer` (16 bits, Turbo Pascal) :

5

Si n = p^a × q^b, le nombre de diviseurs de n vaut :

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