Die Mathematik ist die Königin der Wissenschaften und die Zahlentheorie ist die Königin der Mathematik.
Carl Friedrich Gauss

1 - Décomposition en facteurs premiers

L'ensemble des entiers naturels non nuls se note N\mathbb{N}^*, il s'agit de {1,2,3,4,5,}\{1, 2, 3, 4, 5, \cdots\}

Dans tout ce qui suit : a,b,nNa, b, n \in \mathbb{N}^*.

I] Opérations élémentaires sur N\mathbb{N}^*

Addition, soustraction, multiplication et puissance avec Python

Python3 est capable de travailler avec des entiers aussi grands que la mémoire de l'ordinateur le permet. Les opérations élémentaires respectent les priorités. La puissance s'obtient avec **.

Exemple
Calculer A=(109+7)4A = (10^9+7)^4

>>> (10**9 + 7)**4
1000000028000000294000001372000002401

La division euclidienne

On a bien b0b \neq 0, et :

a÷b(q,r)a\div b \rightarrow (q, r),
a=b×q+ra=b\times q + r, avec 0r<b0\leqslant r<b.

aa est le dividende, bb est le diviseur.
qq est le quotient, rr est le reste.

On parle de division modulo bb, (divmod en abrégé).

Exemple
410÷30410\div 30 \rightarrow quotient =13= 13, reste =20= 20,
on a bien 410=30×13+20410 = 30\times 13 + 20, et 020<300 \leqslant 20 < 30.

On dit que 410410 modulo 3030 est égal à 2020.

⚠️ Attention
410÷13410\div 13 \rightarrow quotient =30= 30 , reste =20= 20 ; est faux,
on a bien 410=13×30+20410 = 13\times 30 + 20, mais pas 020<130 \leqslant 20 < 13.

Test avec Python :

>>> 13*30 + 20 == 410
True
>>> 20 < 30
True

Avec Python3, le quotient entier de aa par bb s'obtient avec a // b,
et le reste dans cette division s'obtient avec a % b.
On peut aussi obtenir le quotient et le reste simultanément avec divmod(a, b).

Exemple, avec la situation précédente :

>>> 410 // 30
13
>>> 410 % 30
20
>>> divmod(410, 30)
(13, 20)
>>> divmod(410, 13)
(31, 7)

Exercice :

Indice : Une méthode est de calculer la puissance, puis son reste modulo 10001000.

Solution :

>>> (42**1337) % 1000)
552

Les trois derniers chiffres sont donc : 5, 5 et 2.

Ce genre de question est réellement fondamental pour les applications comme la cryptographie ; il existe des méthodes bien plus efficaces, nous les aborderons ! La sécurité (informatique, bancaire, militaire), repose en partie sur ces méthodes.

Factorielle d'un entier

Définition
On note n!=1×2×3×...×nn! = 1×2×3×...×n, la factorielle de nn.
Exemple
5!=1×2×3×4×5=1205! = 1×2×3×4×5 = 120

Avec Python, on peut la calculer en important une fonction incluse dans le module math :

>>> from math import factorial
>>> factorial(5)
120

Attention, sur la calculatrice NumWorks, la version de Python n'inclut pas factorial, on peut alors créer le script suivant :

# Version simple
def factorial(n):
    ans = 1
    for x in range(1, n+1):
        ans = ans * x
    return ans

# Version NSI, avec la récursivité
def factorial(n):
    """ Renvoie la factorielle de n
    n doit être un entier positif.
    Version récursive pour les NSI
    >>> factorial(0)
    1
    >>> factorial(5)
    120
    """
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)
Exercice
  • Avec Python, calculer A=1000!A = 1000!
  • montrer que 10300<A<10300010^{300} < A < 10^{3000} (avec et sans Python).

Indice : on pourra utiliser que 210=1024>1032^{10} = 1024 > 10^3.

Réponse :
Avec Python

>>> A = 1
>>> for x in range(1, 1001):
...     A = A * x
>>> 10**300 < A < 10**3000
True

Sans Python,

Obtenir des majorations et des minorations est une activité importante des mathématiques, cela permet d'obtenir des encadrements. Il existe de nombreuses méthodes...

Remarque complémentaire (hors programme)
Il existe une formule qui donne un meilleur encadrement de n!n!, il s'agit de la formule de Stirling.

II] Diviseurs et multiples

Dans N\mathbb{N}^*, les multiples de aa sont : a,2a,3a,4a,a, 2a, 3a, 4a, \cdots

anan est un multiple de aa, mais aussi de nn.

11×13=14311 \times 13 = 143, donc 143143 est un multiple de 1111 et de 1313.

Les multiples de 77 sont : 7,14,21,28,7, 14, 21, 28, \cdots

« kk est un diviseur de aa » équivaut à « aa est un multiple de kk ».

On note dans ce cas « kak \mid a », et on peut dire « kk divise aa ».

Dans le cas contraire, on note « kak \nmid a », et on peut dire « kk ne divise pas aa ».

Exemples :
Avec 1×143=1431 \times 143 = 143 et 11×13=14311 \times 13 = 143, on a :

143143 est un multiple de 11, et donc 11 est un diviseur de 143143.

143143 est un multiple de 1111, et donc 1111 est un diviseur de 143143.

143143 est un multiple de 1313, et donc 1313 est un diviseur de 143143.

143143 est un multiple de 143143, et donc 143143 est un diviseur de 143143.

1,11,13,1431, 11, 13, 143 sont des diviseurs de 143143.
Y en a-t-il d'autres ? Cf III]

Propriété : an    a \mid n \iff le reste dans la division de nn par aa est nul.

Exemple : avec Python3, on calcule ce reste avec n % a.

>>> 143 % 13
0
>>> 17 % 3
2
# Exemple pour les élèves aussi en NSI
for n, a in ((143, 13), (17, 3)):
    if n % a == 0:
        print(f"{n} est divisible par {a}")
    else:
        print(f"{n} n'est pas divisible par {a}")
143 est divisible par 13
17 n'est pas divisible par 3

III] Liste des diviseurs

On rappelle que aa, bb et nn sont des entiers non nuls.

Propriété : si aa est un diviseur de nn, alors na\dfrac{n}{a} est entier et aussi un diviseur de nn.

Preuve : Si aa est un diviseur de nn, alors  bN\exists\ b \in \mathbb{N}^* tel que a×b=na \times b = n, ainsi b=nab = \dfrac{n}{a} est entier et un diviseur de nn.

Propriété : Si a×b=na\times b=n, avec a<ba < b, alors a<na < \sqrt{n}.

Preuve 1 : a×a<a×b=na\times a < a\times b = n, avec \sqrt{\cdot} croissante sur R+\mathbb{R}^+, on a: a×a<n\sqrt{a×a} < \sqrt{n}, donc a<na<\sqrt{n}.

Preuve 2 : Si na<b\sqrt{n} \leqslant a < b, alors a×b>(n)2=na\times b > (\sqrt{n})^2 = n ; absurde.

Utilisation : Pour obtenir la liste des diviseurs de nn non nul, il suffit de trouver ceux inférieurs à n\sqrt{n}, d'y adjoindre leur 'binôme', et de tester éventuellement n\sqrt{n}.

Exemple 1 : Trouver la liste des diviseurs de 345345.
On va tester tous les diviseurs de 11 jusqu'à 1818. En effet, 18<345<1918<\sqrt{345} < 19.
345=1×345345 = 1\times 345
345=3×115345 = 3\times 115
345=5×69345 = 5\times 69
345=15×23345 = 15\times 23
La liste des diviseurs de 345345 est {1,3,5,15,23,69,115,345}\{1, 3, 5, 15, 23, 69, 115, 345\} , il y en a 88.

Il faut ne compter qu'une fois les diviseurs d'un carré, comme 3636 \dots

Exemple 2 : Trouver la liste des diviseurs de 3636.
On va tester tous les diviseurs de 11 jusqu'à 36=6\sqrt{36} = 6.
36=1×3636 = 1\times 36
36=2×1836 = 2\times 18
36=3×1236 = 3\times 12
36=4×936 = 4\times 9
36=6×636 = 6\times 6
La liste des diviseurs de 3636 est {1,2,3,4,6,9,12,18,36}\{1, 2, 3, 4, 6, 9, 12, 18, 36 \} , il y en a 99.

Remarques :
11 ne possède qu'un seul diviseur : lui-même. C'est le seul tel nombre.
22 possède exactement deux diviseurs : 11 et lui-même.
33 possède exactement deux diviseurs : 11 et lui-même.
44 possède exactement trois diviseurs : 11, lui-même, et 22.
55 possède exactement deux diviseurs : 11 et lui-même.

Exercice : Créer un script qui donne la somme des diviseurs d'un entier.

Réponse :

# Version spé Maths
def somme_diviseurs(n):
    S = 0
    for d in range(1, n+1):
        if n % d == 0:
            S = S + d
    return S

# Version spé NSI
def somme_diviseurs(n):
    """Renvoie la somme des diviseurs de l'entier n
    >>> somme_diviseurs(2)
    3
    >>> somme_diviseurs(6)
    12
    """
    return sum(d for d in range(1, n+1) if n%d == 0)

IV] Nombres premiers

Pour tout entier n>1n>1, on a 1×n=n1\times n = n, donc nn possède au moins deux diviseurs : 11 et lui-même.

Définition : Un nombre premier est un entier qui a exactement deux diviseurs : 11 et lui-même.

Les nombres premiers inférieurs à 2020 sont : 2,3,5,7,11,13,17,192, 3, 5, 7, 11, 13, 17, 19.

Remarque : Un entier n>1n>1 est soit premier, soit composé.
Son plus petit diviseur, excepté 11, est premier.

11 est à part, il n'est ni premier, ni composé.

Théorème : Il y a une infinité de nombres premiers.

Preuve 1 : Soit nNn \in \mathbb{N}^*, on considère N=1+n!N = 1 + n!, qui n'a aucun diviseur entre 22 et nn, donc son plus petit diviseur est supérieur à nn, il est premier. On déduit qu'il y a des nombres premiers aussi grands que l'on veut, une infinité donc.

Preuve 2 : Par l'absurde, supposons qu'il y ait un nombre fini de nombres premiers notés pip_i (pour ii de 11 à kk). On considère N=1+p1×p2×pi×pkN = 1+p_1\times p_2\times \dots p_i \dots\times p_k. On sait que 22 est premier, donc k>0k>0 et N>1N>1 qui possède alors un plus petit diviseur (hors 11) qui est un nombre premier pjp_j. Cependant le reste de la division de NN par pjp_j est 11 qui n'est donc pas un diviseur. Contradiction.

On peut créer un script qui teste la primalité d'un entier :

def is_prime(n):
    "Renvoie True si n est premier, False sinon"
    if n < 2:
        return False
    for d in range(2, n):
        if n % d == 0:
            return False
    return True

Que l'on teste :

>>> [n for n in range(20) if is_prime(n)]
[2, 3, 5, 7, 11, 13, 17, 19]

Cette méthode est lente avec des nombres nn trop grands, (comme un milliard ou plus).
Dans le pire des cas, la boucle de is_prime fait presque nn tours, donc un nombre d'opérations proportionnel à nn. On dit alors que sa compléxité temporelle est en O(n)\mathcal{O}(n).

def is_prime(n):
    """ Test de primalité
    Version améliorée ; O(√(n))
    """
    if n < 2:
        return False
    for d in range(2, n):
        if n % d == 0:
            return False
        if d * d > n:
            return True
    return True
>>> [n for n in range(10**9, 10**9+100) if is_prime(n)]
1000000007, 1000000009, 1000000021, 1000000033, 1000000087, 1000000093, 1000000097, 

Cette méthode fait, dans le pire des cas, n\sqrt{n} tours de boucle pour savoir si nn est premier. On dit alors que sa complexité temporelle est en O(n)\mathcal{O}(\sqrt{n}).

Elle sera lente pour des entiers premiers de 1818 chiffres ou plus, ou composés avec le plus petit facteur premier à 99 chiffres ou plus. Dans ces cas, elle fera plus d'un milliard d'opérations, ce qui n'est pas instantané. Elle restera rapide pour des nombres très grands qui possèdent un petit facteur premier.

Exercice

  1. Démontrer que 101!+17101!+17 est divisible par 1717.
  2. Calculer avec Python ce nombre ; est-il plus grand que 101810^{18} ?
  3. Justifier que la fonction is_prime précédente sera pourtant très rapide pour répondre avec cette entrée.
  4. Proposer un nombre très grand pour lequel la fonction pourrait être lente.

Réponse :

  1. 101!101! est divisible par 1717, c'est un des facteurs dans sa définition. 1717 est aussi divisible par 1717, et enfin leur somme l'est.
  2. factorial(101) > 10**18 renvoie True.
  3. En moins de 1717 tours de boucle, chaque tour étant rapide, on arrête le test avec cette entrée qui est divisible par 1717.
  4. Pour les nombres de la forme N!±nN! ± n, avec NN grand et nn petit (mais différent de 11) on a un facteur évident nn, donc ce nombre n'est pas premier. En revanche, avec n=1n = 1, on ne peut rien dire a priori sur N!±1N! ± 1 qui pourrait être premier, et qui certainement n'a aucun facteur premier inférieur à NN. Par exemple, le test est long pour 11!+111!+1, et encore plus pour 27!+127!+1, mais aussi 24!124!-1.

Propriété : Tout entier supérieur à 11 est produit de nombres premiers. On parle de décomposition en facteurs premiers. Elle est unique, à l'ordre près des facteurs.

Exercice : Donner la décomposition en facteurs premiers de 23252325.

On commence par chercher les petits facteurs premiers :
22 n'est pas facteur ; 33, oui. 2325=3×7752325 = 3 \times 775
On continue avec 775775 à décomposer, et on reprend par 33, puis 55, 77, 1111, ...
775=5×155775 = 5 \times 155, donc 2325=3×5×1552325 = 3 \times 5 \times 155
155=5×31155 = 5 \times 31, et on reconnait 3131 comme nombre premier. Ainsi :
2325=3×5×5×312325 = 3 \times 5 \times 5 \times 31 est la décomposition en facteurs premiers.

Pour en lire davantage : https://fr.wikipedia.org/wiki/Nombre_premier

V] PGCD, PPCM

On rappelle que aa, bb et nn sont des entiers non nuls.

On note D(a)\mathcal{D}(a) l'ensemble des diviseurs de aa, c'est un ensemble non vide et fini, aa étant le plus grand élément.

Propriété : 11 appartient à D(a)\mathcal{D}(a) et D(b)\mathcal{D}(b), ainsi leur intersection est non vide, qui est de plus une partie finie. Cette intersection possède donc un plus grand élément.

Définitions :

Exemple 1
D(9)={1,3,9}\mathcal{D}(9) = \{1, 3, 9\} et
D(14)={1,2,7,14}\mathcal{D}(14) = \{1, 2, 7, 14\}, donc
D(9)D(14)={1}\mathcal{D}(9) \cap \mathcal{D}(14) = \{1\}.
Enfin PGCD(9,14)=1\textrm{PGCD}(9, 14) = 1.

Exemple 2
Les multiples de 1212 sont : 12,24,36,48,60,7212, 24, 36, 48, 60, 72\dots
Les multiples de 1515 sont : 15,30,45,60,75,15, 30, 45, 60, 75, \dots

Ainsi PPCM(12,15)=60\textrm{PPCM}(12, 15) = 60.

Exercice
Avec cette définition,
  • Déterminer PGCD(25,35)\textrm{PGCD}(25, 35).
  • Déterminer PPCM(24,36)\textrm{PPCM}(24, 36).

⚠️ Attention, avec ces définitions, le calcul peut être très laborieux, nous verrons d'autres méthodes plus efficaces.

Réponse :

Avec la réforme des collèges, une nouvelle méthode a été enseignée en classe de troisième, mais elle est peu connue des élèves... Voici donc un rappel, ou une découverte pour certains :

Méthode : avec la décomposition en facteurs premiers.

Exemple 1 : avec les questions précédentes, on peut répondre plus vite :

Exemple 2
Avec a=27×32×7×11a = 2^7 \times 3^2 \times 7 \times 11, et b=25×34×73×13b = 2^5 \times 3^4 \times 7^3 \times 13, on a :

Remarque : On préfère connaître la décomposition en facteurs premiers, plutôt que le résultat numérique... La décomposition est une donnée plus précieuse ; réellement !!!

Propriété : PGCD(a,b)×PPCM(a,b)=ab\textrm{PGCD}(a, b) \times \textrm{PPCM}(a, b) = ab

Exemple
(25×32×7)×(27×34×73×11×13)=212×36×74×11×13(2^5\times 3^2\times 7)\times (2^7\times 3^4\times 7^3\times 11\times 13) = 2^{12} \times 3^6 \times 7^4 \times 11 \times 13

Preuve
Pour tous entiers ii et jj, on a : min(i,j)+max(i,j)=i+j\textrm{min}(i, j) + \textrm{max}(i, j) = i+j

Exercice
Avec cette méthode, calculer :
  • PGCD(62,93)\textrm{PGCD}(62, 93)
  • PPCM(55,121)\textrm{PPCM}(55, 121)

Réponse :

Exercice (type brevet)

Guillaume veut répartir la totalité de 760760 dragées au chocolat et 10451045 dragées aux amandes dans des sachets ayant la même répartition de dragées au chocolat et aux amandes.

  1. Peut-il faire 7676 sachets ? Justifier
  2. Quel nombre maximal de sachets peut-il réaliser ? Justifier
  3. Combien de dragées de chaque sorte y aura-t-il dans chaque sachet ? Justifier

Réponse :

  1. Certes 760760 est divisible par 7676, mais pas 10451045 (qui n'est même pas pair), donc on ne peut pas faire un partage homogène de la totalité. Il y aurait un reste !
  2. Avec une même répartition des sachets, et en utilisant tout, le nombre de sachets est un diviseur du nombre de dragées (chocolat et aussi amandes), de plus on veut le maximum, on cherche donc le PGCD(760,1045)\textrm{PGCD}(760, 1045).
    • 760=10×76760 = 10×76
    • 760=2×5×4×19760 = 2×5×4×19
    • 760=23×5×19760 = 2^3×5×19
    • 1045=5×2091045 = 5×209
    • 1045=5×11×191045 = 5×11×19
    • Ainsi PGCD(760,1045)=5×19=95\textrm{PGCD}(760, 1045) = 5×19 = 95
    • Guillaume pourra faire au maximum 9595 sachets équitables, sans perte.
  3. La composition d'un sachet sera de 760÷95=23=8760÷95 = 2^3 = 8 dragées au chocolat, et 1045÷95=111045÷95=11 dragées aux amandes.