Christian Vassard (IUFM Rouen)
8
Chapitre
Le théorème fondamental de l’arithmétique affirme que tout entier naturel non nul et différent de 1
peut s’écrire de façon unique à l’ordre près comme produit de nombres premiers. Même ce résultat
semble acquis à partir d’Euclide, et communément utili par les mathématiciens, sa première
démonstration rigoureuse et complète figure dans les Recherches arithmétiques de Gauss, publiées en
1801.
Le problème que l’on se pose dans ce chapitre est donc le suivant : étant donné un entier naturel n,
comment peut-on obtenir sa décomposition en facteurs premiers, ou, plus simplement, comment peut-
on l’écrire de façon non triviale comment produit de deux ou plusieurs entiers naturels ?
Sommaire
Chapitre 8. Factorisation des entiers .................................................................. 117
1. La méthode des divisions successives ................................................ 118
1.1 À la main… ..................................................................................... 118
1.2 Une fonction sur la TI-Nspire ....................................................... 119
1.3 Deux fois plus vite ? ...................................................................... 120
1.4 Connaissance de la forme des diviseurs ................................... 125
2. La méthode de Fermat ............................................................................ 126
2.1 Une lettre de Fermat ..................................................................... 126
2.2 Principe de la méthode ................................................................. 126
2.3 Améliorations de Fermat… .......................................................... 128
2.4 Des fonctions sur une TI-Nspire.................................................. 129
2.5 Quelques questions sur cet algorithme ..................................... 132
2.6 Encore plus loin avec Fermat ...................................................... 134
3. Autres algorithmes de factorisation ...................................................... 135
3.1 Méthode dite p 1 de Pollard ...................................................... 135
3.2 thode de la poêle à frire .......................................................... 139
ANNEXE : quelques factorisations .................................................................. 147
Chapitre 8.
Factorisation des
entiers
118 Mathématiques et TI-Nspire
© T³ France 2010 / Photocopie autorisée
Si le problème de la factorisation d’un entier est simple pour des nombres de taille raisonnable
1
, il se
révèle en revanche très délicat, voire impossible à mener à son terme pour des entiers de quelques
dizaines de chiffres
2
. Ce n’est pas faute pourtant d’avoir un algorithme ! Encore faut-il, et c’est
l’occasion de le souligner, que l’algorithme en question retourne un résultat relativement rapidement
3
.
Voilà donc un problème, tout droit venu de la sphère « éthérée » des mathématiques pures, qui est
devenu en quelques années, notamment avec le développement d’Internet et des échanges sur la toile,
un enjeu économique et stratégique essentiel. La méthode de cryptographie RSA par exemple se
fonde sur l’impossibilité pratique de factoriser en un temps raisonnable un entier suffisamment grand
4
1. La méthode des divisions successives
1.1 À la main…
C’est celle que l’on pratique naturellement à la main, en testant a priori chaque nombre premier, l’un
après l’autre, pour savoir s’il divise le nombre entier considéré. Examinons l’exemple de 10 332 :
On balaie tous les diviseurs premiers potentiels depuis 2, en répétant si nécessaire la division pour
savoir avec quel exposant il divise le nombre. Évidemment, dans la pratique courante qui ne
s’intéresse qu’à des « petits » nombres, on utilise les célèbres critères de divisibilité (2, 3, 5 et 9 sont
élémentaires et très connus) : là, chacune des divisions a été faite par la calculatrice
1
21 = … 3 × 7… sans aucune difficulté… mais 515 377 520 732 011 331 036 538 662 748 291 992 781 694 711 133 ?
2
En juin 2007, le plus grand entier jamais factorisé est un nombre de 307 chiffres. 11 mois de calculs informatiques ont été nécessaires…
3
Pour une TI-nspire, quelques heures de fonctionnement mettent rudement les piles à l’épreuve ! Et peut-on envisager de faire fonctionner
un ordinateur ne serait-ce que 150 ans ?
4
Et bien choisi, devrions-nous ajouter... pour résister notamment aux méthodes connues de factorisation.
Factorisation des entiers 119
© T³ France 2010 / Photocopie autorisée
1.2 Une fonction sur la TI-Nspire
Pour un programme sur une calculatrice, disons une fonction sur une TI-Spire, on ne connaît pas a
priori la répartition des nombres premiers. Le plus simple est alors de tester en fait tous les nombres
entiers, certains inutilement évidemment
5
.
Par ailleurs, la valeur de n, comme on l’a vu sur notre exemple, va en diminuant à chaque diviseur
obtenu, au fur et à mesure des divisions.
Toujours dans notre exemple, le dernier nombre obtenu, 41, qui, par construction, n’est divisible par
aucun diviseur premier inférieur à 7, est lui-même premier : inutile d’aller plus loin… On peut écrire
10332 = 2 × 2 × 3 × 3 × 7 × 41 : c’est la décomposition attendue.
Deux boucles While sont imbriquées : la première pour parcourir un à un tous les diviseurs possibles,
la seconde pour « épuiser » un diviseur donné.
L’on doit aussi résoudre le problème du résultat renvoyé. Sous quelle forme se présentera-t-il ? Deux
choix simples sont possibles : une liste ou, ce qui a eu notre préférence, une chaîne de caractères (on
rappelle que "&" concatène deux chaînes et que left(chaine,p) renvoie les p caractères de gauche de
chaine). Il faut penser à chaque diviseur trouvé à ajouter à la chaîne le caractère "*", symbolisant la
multiplication.
Si la valeur de n est strictement décroissante au cours du programme, l’arrêt peut se produire de deux
façons différentes :
soit avec n = 1 (par exemple en partant de n = 32), et l’on doit renvoyer la chaîne f, sans son
dernier caractère "*" ;
soit quand n est un nombre premier lui-même, comme dans l’exemple traité ; il faut alors
penser à concaténer cette valeur avec la chaîne f.
Le code de cette fonction est donné ci-après :
5
Ainsi il est inutile de tester 4, 6, 8… quand on a épuisé le diviseur 2…
120 Mathématiques et TI-Nspire
© T³ France 2010 / Photocopie autorisée
Les résultats sont bien ceux que l’on attend, mais ils ne sont guère rapides dès que le nombre grandit
un peu. Le temps de réponse peut alors devenir beaucoup plus long, voire prohibitif, au point que l’on
soit obli d’arrêter le calcul : ainsi la factorisation du nombre de Fermat 232 + 1 demande 3,29
secondes avec une calculatrice ; pour 264 + 1, qui ne comporte que (!) 20 chiffres, j’ai renoncé au bout
de 30 minutes avec la TI-Nspire mais le logiciel a renvoyé un résultat en quelques minutes. Le logiciel
à son tour ne renvoie rien pour le nombre de Fermat suivant (appui prolongé sur F12 pour interrompre
le calcul. Quant à la dernière factorisation Ŕ elle concerne quand même un nombre de 32 chiffres
avec, c’est vrai des facteurs premiers assez petits Ŕ elle se fait en 1 minute 14 secondes à la
calculatrice.
Bref les performances sont très rapidement assez médiocres, comme on pouvait le craindre. Sauf
exception, il n’est pas question de se lancer dans la factorisation d’un nombre de quelques dizaines de
chiffres.
1.3 Deux fois plus vite ?
Des améliorations s’imposent, surtout que l’écriture, on s’en doute un peu, est bien loin d’être
optimisée. Ainsi, il n’est pas utile de tester les nombres pairs quand on a testé, et épuisé, le facteur 2 :
on peut donc à moindre frais tester 2, puis 3 et puis tous les nombres de 2 en 2. De quoi, on peut
l’espérer, gagner la moitié du temps de traitement !
La fonction suivante procède de cette façon :
Factorisation des entiers 121
© T³ France 2010 / Photocopie autorisée
Le gain en temps est important : balayant la moitié des nombres, on va globalement deux fois plus vite
avec cette nouvelle fonction, ce qui était prévisible. Ainsi la factorisation de
1032 Ŕ 1 prend cette fois 36 secondes.
On peut sans doute encore faire mieux en restreignant encore les nombres balayés. On sait qu’à
partir de 5, les nombres premiers sont de la forme 6k + 1 ou 6k + 5. Une fois les cas de 2 et 3 traités
dans une boucle à part, les diviseurs à tester sont donc tous de la forme 6k + 1 ou 6k + 5. Remarquons
que l’on passe de l’une à l’autre de ces formes en ajoutant alternativement 2 et 4 au diviseur (5,
5+2=7, 7+4=11, 11+2=13, etc.). Cela donne la fonction fact2 qui suit.
La première boucle gère, comme on l’a dit, les deux facteurs 2 et 3.
Dans la deuxième boucle, on passe en revue successivement tous les nombres impairs, 5, 7, 11, etc. de
la forme 6k + 1 et 6k + 5.
Si d divise n, comme précédemment, on regarde combien de fois c’est le cas dans une deuxième
boucle imbriquée dans la première, et on ajoute à chaque fois les caractères "d*" à la chaîne c.
On ajoute à chaque fois l’expression e + 3 qui vaut bien alternativement 2 et 4, selon que e soit égal à
Ŕ1 ou 1. La valeur de e est modifiée par une multiplication par Ŕ1 à chaque passage dans la boucle.
S’il est intéressant de mettre en œuvre ces améliorations, par souci d’efficacité, le résultat est
décevant car les performances restent à peu de choses près équivalentes à celles de la fonction
précédente. Il semble que ce que l’on gagne dans l’efficacité, on le perde dans la complexité du code.
La fonction test suivante factorise les n entiers impairs qui suivent 1010. Les tests suivants ont été
effectués avec n = 1 500 sur un ordinateur portable de type Acer :
avec fact0, cela a pris environ 100 secondes ;
avec fact1, environ 50 secondes, soit deux fois moins de temps ;
avec fact2, à peine moins de 50 secondes aussi.
1 / 33 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !