8 Chapitre Chapitre 8. Factorisation des entiers 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 utilisé 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 peuton 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 2. 3. 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 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 Autres algorithmes de factorisation ...................................................... 135 3.1 Méthode dite p – 1 de Pollard ...................................................... 135 3.2 Méthode de la poêle à frire .......................................................... 139 ANNEXE : quelques factorisations.................................................................. 147 Christian Vassard (IUFM Rouen) 118 Mathématiques et TI-Nspire Si le problème de la factorisation d’un entier est simple pour des nombres de taille raisonnable1, il se révèle en revanche très délicat, voire impossible à mener à son terme pour des entiers de quelques dizaines de chiffres2. 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 rapidement3. 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. © T³ France 2010 / Photocopie autorisée Factorisation des entiers 119 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 évidemment5. 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… © T³ France 2010 / Photocopie autorisée 120 Mathématiques et TI-Nspire 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 obligé 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 : © T³ France 2010 / Photocopie autorisée Factorisation des entiers 121 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. © T³ France 2010 / Photocopie autorisée 122 Mathématiques et TI-Nspire Par contre, certains entiers6 résistent envers et contre tout, même avec notre programme le plus performant, comme par exemple 2 379 126 835 648 834 186 983 062 873 057, qui possède 31 chiffres : sur une calculatrice, le calcul a été interrompu au bout de quelques minutes, sans résultat. La question est donc de savoir s’il faut persévérer ou pas : peut-on avoir une réponse dans un temps raisonnable ? Que se passe-t-il pour ce grand entier ? Le logiciel TI, et la fonction Factor7, peut venir à notre secours : Ce nombre possède comme facteur deux grands nombres premiers, chacun de 16 chiffres. Sa factorisation est-elle définitivement inaccessible à nos fonctions de factorisation par divisions successives ? That is the question... La question est de savoir combien de divisions par seconde effectue notre calculatrice pour des nombres d’une vingtaine de chiffres. La fonction test, qui effectue 10 000 « grosses » divisions avec un dividende de 32 chiffres, se déroule en… 12 secondes8. On peut donc considérer très sommairement que la calculatrice effectue en une seconde à peu près 800 divisions. Nous avons bien conscience que le résultat est très grossier : ce qui nous importe, c’est de raisonner en ordre de grandeur. 6 1020 + 2 aussi, mais dans une moindre mesure… Cet entier est plus simple mais possède 4 facteurs premiers, dont 2 et 3. La réelle difficulté est de trouver les deux autres. 7 Quand même plus d’une minute 20 seconde sur l’ordinateur… Avec l’unité nomade de très longues dizaines de minutes sans doute. Je n’ai pas essayé ! 8 Assez incroyable pour une « banale » calculatrice ! © T³ France 2010 / Photocopie autorisée Factorisation des entiers 123 Nous sommes en mesure d’estimer un ordre de grandeur, même grossier, du temps nécessaire à l’unité nomade pour factoriser n = 2 379 126 835 648 834 186 983 062 873 057 avec fact1, une de nos deux fonctions rapides. Le facteur 2 est testé : c’est quasi-immédiat. Sinon seront testés tous les nombres impairs compris entre 3 et n , soit 7,7 × 1014 divisions… … au rythme de 800 par seconde. La calculatrice mettra donc 9,6 1011 secondes, ou 1,1 107 jours soit finalement 30 569 années ! Autant dire que le problème est insurmontable, en tout cas avec l’algorithme des divisions successives. Pas la peine d’en savoir plus, nous sommes contraints de renoncer ! Quant à l’ordinateur, le mien en tout cas, plus rapide qu’une calculatrice, il demande 10 secondes pour faire 1 million de divisions, soit 100 000 divisions à la seconde : il est donc environ 125 plus rapide que la calculatrice. Il mettrait 125 fois moins de temps, c’est-à-dire à peu près deux siècles et demi ! Ce n’est pas non plus raisonnable. Autant dire que cela condamne à tout jamais la méthode des divisions successives pour des entiers à partir de 20 ou 30 chiffres. © T³ France 2010 / Photocopie autorisée 124 Mathématiques et TI-Nspire En conclusion, la méthode des divisions successives, si elle conduit imparablement en théorie au résultat attendu, demande pour des entiers finalement de taille assez modeste, des temps de traitement rédhibitoires. Il faut trouver d’autres algorithmes si l’on veut être performant pour factoriser de grands entiers. Signalons pour finir que l’on peut aussi écrire une fonction qui améliore la présentation du résultat, en regroupant les mêmes nombres premiers dans une écriture avec exposants. La structure est exactement la même que celle du programme précédent, à ceci près qu’un compteur ct compte combien de fois un facteur premier divise l’entier : si ct est strictement supérieur à 1, on utilise alors l’exposant "^" ; si ct = 1, on reprend la mise en forme précédente. Attention à ce qu’il ne se passe rien quand ct vaut 0 car la boucle est parcourue quoiqu’il arrive pour d = 2 puis pour d = 3 (c’est la raison pour laquelle n’a pas été employé if then else). La présentation est plus lisible et plus conforme à ce que l’on attend habituellement : © T³ France 2010 / Photocopie autorisée Factorisation des entiers 125 1.4 Connaissance de la forme des diviseurs La méthode des divisions successives peut, dans certains cas, rester relativement efficace lorsqu’on a affaire à des entiers dont les diviseurs premiers ont des formes précises. Ainsi les nombres de Mersenne, du type 2 p 1 avec p premier, ont des diviseurs premiers de la forme 1 + 2kp où k est un entier naturel, ce qui revient à tester dans leur cas les entiers de 2p en 2p. Gain appréciable… On peut donc écrire une fonction, qui ne peut servir qu’à factoriser les nombres de Mersenne, mais qui sera bien plus efficace que la méthode des divisions successives initiale. Il suffit d’ailleurs d’adapter la fonction fact0 que nous avons écrite au début du chapitre. On obtient assez facilement des factorisations de nombres de Mersenne, quand ils sont composés mais cela devient de plus en plus difficile dès qu’ils sont premiers. En plus, les nombres de Mersenne croissent très vite en taille ; l’avantage que l’on a à connaître la nature de leurs diviseurs premiers s’efface très vite face à la grandeur du nombre à gérer. En particulier, 283 Ŕ 1 pose un problème redoutable : il est le produit de 167 par un nombre premier de grande taille… et il a fallu interrompre le calcul… © T³ France 2010 / Photocopie autorisée 126 Mathématiques et TI-Nspire 2. La méthode de Fermat 2.1 Une lettre de Fermat En 1643, le père Mersenne met au défi Fermat de factoriser le nombre entier 100 895 598 169. Défi que nous aurions pu aisément relever avec notre TI-Nspire… les temps changent ! Fermat répond par une lettre au Père Mersenne, en proposant une méthode de factorisation, qu’il applique à un autre entier, et dont il explique le principe dans la lettre suivante. Cette lettre est extraite des Œuvres, éd.Tannery et Henry, tome II, 1894, Lettre de 1643, pp. 257-258 et est citée par l’excellent Histoire d’algorithmes, Editions Belin, 1994, page 300. Cela posé, qu'un nombre me soit donné, par exemple 2 027 651 281, on demande s'il est premier ou composé, et de quels nombres il est composé, au cas qu'il le soit. J'extrais la racine, pour connaître le moindre des dits nombres, et trouve 45 029 avec 40 440 de reste, lequel j'ôte du double plus 1 de la racine trouvée, savoir de 90 059 : reste 49 619, lequel n'est pas carré, parce qu'aucun carré ne finit par 19, et partant je lui ajoute 90 061, savoir 2 plus que 90 059 qui est le double plus 1 de la racine 45 029. Et parce que la somme 139 680 n'est pas encore carrée, comme on le voit par les finales, je lui ajoute encore le même nombre augmenté de 2, savoir 90 063, et je continue ainsi d'ajouter tant que la somme soit un carré, comme on peut voir ici. Ce qui n'arrive qu'à 1 040 400, qui est carré de 1 020, et partant le nombre donné est composé; car il est aisé, par l'inspection des dites sommes, de voir qu'il n'y a aucune qui soit nombre carré que la dernière, car les carrés ne peuvent souffrir les finales qu'elles ont, si ce n'est 499 944 qui néanmoins n'est pas carré. Pour savoir maintenant les nombres qui composent 2 027 651 281, j'ôte le nombre que j'ai premièrement ajouté, savoir 90 061, du dernier ajouté 90 081. Il reste 20, à la moitié duquel plus 2, savoir à 12, j'ajoute la racine premièrement trouvée 45 029. La somme est 45 041, auquel nombre ajoutant et ôtant 1020, racine de la dernière somme 1 040 000, on aura 46 061 et 44 021, qui sont les deux nombres plus prochains qui composent 2 027 651 281. Ce sont aussi les seuls, parce que l'un et l'autre sont premiers. 2.2 Principe de la méthode Ce texte est écrit sans aucun symbolisme algébrique, ce qui ne facilite pas sa compréhension. Essayons, avant d’entrer dans les détails, d’expliquer la démarche globale de Fermat, qui cherche à factoriser N = 2 027 651 281. Ce n’est pas le nombre proposé par le Père Mersenne 9 mais un entier sur mesure pour la méthode décrite. 9 Fermat donne la factorisation demandée par Mersenne dans une autre lettre de 1643 : « (…) je vous réponds que le dernier de ces nombres est composé et se fait du produit de ces deux : 898 423 et 112 303, qui sont premiers ». Voir http://iremp7.math.jussieu.fr/up/factorisations_de_grands_nombres.pdf. © T³ France 2010 / Photocopie autorisée Factorisation des entiers 127 L’idée de Fermat, simple et lumineuse, est de tenter d’écrire N comme une différence de deux carrés10 et de factoriser par l’identité remarquable bien connue11. Or si N = a2 Ŕ b2, alors a2 = N + b2 > N. Par conséquent a est nécessairement strictement supérieur à N . Fermat commence donc par extraire la racine carrée entière de N et trouve 45 029 avec pour reste 40 440. Autrement dit : N = 45 0292 + 40 440. « J'extrais la racine, pour connaître le moindre des dits nombres, et trouve 45 029 avec 40 440 de reste » Maintenant, il reste à tester un par un tous les nombres entiers à partir de a = 45 030 > 45 029 : il s’agit donc à chaque fois d’examiner si d = a2 Ŕ N est ou non le carré d’un entier ; si tel est le cas, une factorisation est possible. La mise en œuvre sur le tableur est classique : Dès que d a 2 N est un carré, la factorisation est immédiate : N = a2 Ŕ d = a2 Ŕ b2 = (a Ŕ b)(a + b) = (45 041 Ŕ 1 020)(45 041 + 1 020) = 44 021 × 46 061 « on aura 46 061 et 44 021, qui sont les deux nombres plus prochains qui composent 2 027 651 281 » Remarquons que les deux facteurs obtenus ne sont pas forcément premiers. On peut, si on le souhaite, appliquer sur chacun d’eux une méthode de factorisation. C’est d’autant plus facile qu’ils sont beaucoup moins grands que N. Rien que de très classique dans cette feuille de calcul. Commentons rapidement les formules utilisées. Le nombre est placé en A1 puis mémorisé dans une variable n. La cellulle A4 calcule la partie entière de la racine carrée de n et y ajoute 1 (=int(sqrt(n))+1) : c’est le point de départ de nos itérations. Cette valeur est recopiée en B2. 10 C’est donc toujours possible pour un entier impair. 11 C’est pour cela que l’on peut affirmer que 9991 = 104 Ŕ 32 = 103 × 97. © T³ France 2010 / Photocopie autorisée 128 Mathématiques et TI-Nspire En B3, on met la valeur de B2, augmentée de 1 (=b2+1), puis on recopie sur quelques dizaines de lignes : ceci donne les valeurs successives de a. Dans B3, on met =B32-n : ce sont les nombres d dont on doit tester si ce sont des carrés d’entiers. Comme plus haut, on recopie vers le bas. Le test est réalisé dans la colonne D. En D2, on saisit : =when((int(sqrt(c2)))^(2)=c2,sqrt(c2),void,void) puis on recopie vers le bas. Ne nous intéresse que le cas où le nombre est un carré… Dans ce cas, et uniquement dans ce cas, une factorisation peut être obtenue. Le premier facteur est : =when(not isvoid(d2),b2-d2,_,_) et le second =when(not isvoid(d2),b2+d2,_,_). 2.3 Améliorations de Fermat… Fermat, qui n’avait que sa plume et sa tête Ŕfort bien faite au demeurantŔ, cherche à effectuer le moins possible de calculs, comme souvent à son époque bien plus que maintenant. En particulier, il évite systématiquement les élévations au carré. Ainsi pour obtenir le premier d, celui qui correspond à a = 45 030, il s’appuie sur l’écriture : N = 45 0292 + 40 440 en remarquant que : d = 45 0302 Ŕ N = 45 0302 Ŕ 45 0292 Ŕ 40 440 = 2 × 45 029 + 1 Ŕ 40 440 soit d = 49 619… qui de plus n’est pas un carré… car il se termine par 19 ! « et trouve 45 029 avec 40 440 de reste, lequel j'ôte du double plus 1 de la racine trouvée, savoir de 90 059 : reste 49 619, lequel n'est pas carré, parce qu'aucun carré ne finit par 19 » Ensuite, à une étape donnée, on dispose de a2 et on vérifie si d = a2 Ŕ N est le carré d’un entier. À l’étape suivante, on doit vérifier cette fois que d’ = (a + 1)2 Ŕ N est le carré d’un entier. Or d’ = (a + 1)2 Ŕ N = a2 + 2a + 1 Ŕ (a2 Ŕ d) = 2a + 1 + d Ainsi la deuxième valeur de d est 49 619 + (2 × 45 030 + 1) = 139 680. « et partant je lui ajoute 90 061, savoir 2 plus que 90 059 qui est le double plus 1 de la racine 45 029 » Tenant compte des remarques qui précèdent, on peut modifier la feuille de calcul précédente pour celle qui est donnée à la page suivante. On propose d’effectuer le test un nombre de fois paramétré par la variable k de la cellule A10. En A4 figure la racine carrée entière du nombre considéré et en A6 le reste, au sens de Fermat (=n–a42). Dans la colonne B, on indique avec seq les éléments a successifs à tester. D’après les remarques de Fermat, la colonne C est égale à 2*B[]+1. On sait que D1 vaut =2*a4+1–a6 et la formule en D2 est visible sur la figure ci-après. © T³ France 2010 / Photocopie autorisée Factorisation des entiers 129 En E1, on a saisi =when((int(√(d1)))^(2)=d1,int(√(d1)),_,_), puis recopié sur 500 lignes. Enfin en F1, on tape =when(not isvoid(e1),b1,_,_) et on recopie sur le même nombre de lignes que précédemment. Contrairement aux formules précédentes, les formules ne sont pas gérées par des seq, ce qui explique la limitation à 500 qu’on indique en A10. La factorisation, si elle a été obtenue, peut être reconstituée dans les cellules A12 et A14 : en A12, on a saisi =min(E[])–min(F[]) et en A14, =min(E[])–min(F[]). Enfin, last but not least, Fermat met de côté tous les nombres dont les « finales », ici les deux derniers chiffres, ne sont pas ceux d’un carré… « car il est aisé, par l'inspection des dites sommes, de voir qu'il n'y a aucune qui soit nombre carré que la dernière, car les carrés ne peuvent souffrir les finales qu'elles ont, si ce n'est 499 944 qui néanmoins n'est pas carré » … un carré qui se termine obligatoirement par 0, 1, 4, 5, 6, 9 ou par 00, 01, 04, 09, 16, 21, 24, 25, 29, 36, 41, 44, 49, 56, 61, 64, 69, 76, 81, 84, 89, 96. Les seuls nombres d susceptibles d’être des carrés sont donc 499 944 (mais il n’en est pas un), puis 1 040 400 qui, lui, est bien le carré de 1020 et l’algorithme peut s’arrêter. « Ce qui n'arrive qu'à 1 040 400, qui est carré de 1 020 » Pour l’exemple considéré, l’algorithme est bien plus performant que celui des divisions successives (qui aurait demandé environ 22 000 divisions avant de faire apparaître le facteur 44 021) : cela est dû au fait que les deux facteurs de N sont proches de N. Mais cette feuille de calcul ne permet pas de résoudre le problème posé initialement par Mersenne à Fermat, concernant la factorisation de 100 895 598 169, même avec 500 essais : on peut craindre que les facteurs premiers soient éloignés de la racine carrée du nombre. 2.4 Des fonctions sur une TI-Nspire On peut écrire une fonction, avec pour paramètre d’entrée le nombre n que l’on cherche à factoriser. Cette fonction renvoie la factorisation de l’entier n sous forme d’une chaîne de caractères (par exemple "44021*46061"), chacun des facteurs n’étant pas forcément premier. © T³ France 2010 / Photocopie autorisée 130 Mathématiques et TI-Nspire Il faut être prudent avec int(sqrt(n)), qui recèle en fait quelques surprises. Si le calcul de la racine est mené de façon exacte, formel, même pour un grand nombre entier, des erreurs peuvent apparaître quand on en prend la partie entière. C’est ce que l’on observe en observant le détail des deux calculs suivants : Le premier calcul conduit à un résultat correct, comme le montre l’encadrement obtenu à la fin. Le deuxième est plus surprenant : l’encadrement est cette fois-ci faux et l’on comprend pourquoi lorsque l’on connaît la véritable valeur (dernière ligne). Approfondissons avec un entier un peu plus grand encore. On observe que tout se passe comme si le résultat renvoyé pour int(√()) n’était autre que son écriture décimale approchée, résultat donc entaché d’erreur lorsque l’on dépasse la capacité de la calculatrice. Par contre, la fonction intrc de la bibliothèque calculs fournit un résultat fiable pour des entiers plus grands12. En revenant à l’écriture de notre fonction, on peut signaler que le test pour vérifier qu’un nombre est un carré fonctionne sans problème, même pour un entier très grand. Une première version du programme, reprenant les idées de la première feuille de calcul, est donnée ci-après : 12 Nous verrons dans un chapitre ultérieur comment une telle fonction peut être écrite à l’aide de l’algorithme de Héron. © T³ France 2010 / Photocopie autorisée Factorisation des entiers 131 Testons cette première fonction : la TI-Nspire renvoie presque instantanément le premier résultat, c’est celui de Fermat, et le deuxième. Le troisième demande 6 secondes, et le quatrième 30 secondes, des temps très honorables par rapport à ce qu’aurait demandé la méthode des divisions successives… On peut encore améliorer le temps de calcul… en suivant les conseils de Fermat : judicieux à son époque, ils le sont toujours avec les moyens de calcul puissants du XXIe siècle. D’abord ses remarques pour le passage d’une étape à la suivante... Quelques élévations au carré inutiles épargnées… Ensuite, point n’est besoin de vérifier que d est un carré que si son dernier chiffre est 0, 1, 4, 5, 6, 9. Dans la moitié des cas, on s’épargnera ainsi un calcul assez lourd, celui de la racine carrée, quand il n’est pas nécessaire. D’autre part, on peut changer l’instruction qui teste si le nombre est un carré : on utilise fpart(sqrt(a))=0. En mode exact, cette instruction semble tout à fait convenir : On utilise cette fois une boucle Loop, Ŕdont on sort par l’instruction ExitŔ boucle qui va permettre de gérer le double test, soit le dernier chiffre, soit le calcul de la racine carré. Le dernier chiffre est testé avec mod(d,10) : si ce dernier chiffre ne peut pas être celui d’un carré, on passe directement aux valeurs suivantes de a et d ; sinon on teste effectivement si fpart(sqrt(a))=0, qui provoquera la sortie de la boucle (Exit) puis l’affichage des résultats. © T³ France 2010 / Photocopie autorisée 132 Mathématiques et TI-Nspire On obtient alors le programme suivant Les mêmes exemples que précédemment sont globalement traités en deux fois moins de temps (3 secondes pour le troisième au lieu de 6 secondes et 13 secondes au lieu de 30 pour le quatrième… le gain est appréciable). Notons qu’en testant les carrés modulo 4 Ŕ ils sont forcément congrus à 0 ou 1Ŕ plutôt que modulo 10, on gagne encore une poignée de secondes. On peut factoriser par cette méthode le nombre donné plus haut dans une remarque, à savoir 515 377 520 732 011 331 036 538 662 748 291 992 781 694 711 133. La réponse, même avec la calculatrice est donnée immédiatement. soit la factorisation "717897987691852588770277*717897987691852588770329". 2.5 Quelques questions sur cet algorithme Tout d’abord, s’arrête-t-il toujours ? La méthode est intéressante pour un entier impair. Pour un entier pair que l’on cherche à factoriser, on commence évidemment par le facteur 2, autant de fois que possible. On sait que tout nombre impair N (N > 1) s’écrit d’au moins une façon comme une différence de deux carrés. En effet : N 1 2 N 1 2 N = 2n + 1 = (n + 1)2 Ŕ n2 = 2 2 En fait cette égalité ne donne pas une factorisation intéressante de N (on récupère la factorisation triviale N = 1 × (2n + 1)). En revanche, elle garantit l’arrêt de l’algorithme, au pire, au moment où a N+1 vaudra . 2 © T³ France 2010 / Photocopie autorisée Factorisation des entiers 133 Dans le cas où l’algorithme s’arrête à ce moment, c’est que l’entier N est premier. Plus précisément, Édouard Lucas a prouvé au XIXe siècle le théorème suivant : Pour qu’un nombre impair soit premier, il faut et il suffit qu’il soit, et d’une seule manière, égal à la différence des carrés de deux nombres entiers. Démonstration Soit N un entier premier impair. Supposons-le écrit sous la forme d’une différence de deux carrés : N = x2 Ŕ y2. On en déduit une factorisation de N : N = (x Ŕ y)(x + y). Comme N est premier, on a nécessairement x Ŕ y = 1 et x + y = N, soit x = N+1 NŔ1 et y = et l’on 2 2 retrouve la décomposition indiquée plus haut. Donc N s’écrit de façon unique sous la forme d’une différence de deux carrés. Réciproquement, soit un entier impair N composé, s’écrivant sous la forme p q de façon non triviale. Mettons en évidence deux écritures de N comme différence de deux carrés. La décomposition précédente reste toujours valable. D’autre part, on peut aussi écrire N = pq = x2 Ŕ y2 en posant x = p + q et y = p Ŕ q. Cette 2 2 décomposition n’est pas la même que la première (sinon, on aurait p + q = N + 1 et p Ŕ q = N Ŕ 1, donc p = N et q = 1, mais on a supposé que ces facteurs étaient non triviaux). (Le texte de Lucas, tiré de son célèbre livre La Théorie des nombres, de 1891) Remarquons que si n est pair, l’algorithme peut : soit s’arrêter (par exemple pour 100 qui est égal à 262 Ŕ 242) soit encore ne jamais s’arrêter (par exemple pour 6, qui ne peut pas s’écrire comme différence de deux carrés). © T³ France 2010 / Photocopie autorisée 134 Mathématiques et TI-Nspire Mais ce qui nous intéresse ici, c’est la factorisation : face à un nombre pair, en divisant par 2 autant de fois que nécessaire, on se ramènera dans tous les cas à la factorisation d’un nombre impair. Combien cet algorithme demande-t-il d’étapes ? Considérons un entier N que l’on a factorisé par cette méthode : N = a2 Ŕ b2 = p × q avec p > q, p = a + b et q = a Ŕ b. On a donc a = p + q et b = p Ŕ q 2 2 N et l’on augmente à chaque fois d’une unité jusqu’à arriver à a = p + q. 2 Le nombre d’étapes est la partie entière de : On part de l’entier qui suit p N pq 1 N p2 N 2 p N N p N 2 2 p 2p 2p 2 Plus p est proche de N, plus le nombre d’étapes nécessaires est petit. C’est le cas dans les exemples que nous avons donnés13. Dans le cas contraire, le nombre d’étapes peut être beaucoup plus grand que pour les divisions successives. 2.6 Encore plus loin avec Fermat La méthode de Fermat est particulièrement efficace, on l’a remarqué, lorsque l’un des facteurs est très proche de la racine carrée de N. Peut-on s'arranger pour que ce soit le cas ? Revenons sur l’exemple proposé par Mersenne à Fermat pour la factorisation de 100 895 598 169 : il ne se factorise pas facilement avec la méthode de Fermat 14. Supposons que l’on sache qu’il s’écrit p 1 sous la forme p q , avec p < q et . On a donc 7 p q . q 7 Il n’en faut pas plus pour avancer… Considérons maintenant N 7 1 7 p q : 7N est bien un entier impair (c’est un point important), produit de deux entiers très voisins. On peut donc appliquer la méthode de Fermat : L’on obtient alors la factorisation en moins de 10 secondes ! En général, on ne connaît pas le rapport qui a été donné plus haut : rien n’interdit d’essayer différentes valeurs. Si le nombre a de nombreux facteurs, on peut en obtenir quelques-uns ainsi. L’algorithme de Lerman s’appuie sur ce principe. 13 Dont l’exemple de Fermat. 14 La calculatrice ne renvoie rien d’intéressant dans un temps raisonnable. © T³ France 2010 / Photocopie autorisée Factorisation des entiers 135 3. Autres algorithmes de factorisation 3.1 Méthode dite p – 1 de Pollard Le mathématicien britannique Pollard a mis au point cette méthode de factorisation des entiers en 1974, à peu près en même temps qu’un autre algorithme que nous étudierons juste après. L’algorithme p Ŕ 1 de Pollard fonctionne très efficacement avec des nombres de taille raisonnable, et qui plus est, il est simple à comprendre et facile à programmer. Pour toutes ces raisons, une fois épuisée la classique et éprouvée méthode des divisions successives, c’est souvent l’algorithme que l’on utilise quand on cherche à factoriser un nombre composé. Principe de l’algorithme On suppose que le nombre n à factoriser possède un facteur premier p tel que les nombres premiers divisant p Ŕ 1 soient tous petits, disons par exemple inférieurs à 10 000 (ou toute autre borne qu’on voudra bien se fixer en fonction de la puissance de son outil de calcul). Plus précisément, on supposera dans la suite que p Ŕ 1 divise 10 000!. Cette dernière condition, importante pour le fonctionnement de l’algorithme, n’est pas si souvent réalisée, d’autant moins que n devient grand. Cependant il suffit qu’elle le soit pour un des facteurs premiers de n, ce qui permet dans l’ensemble de couvrir des entiers n de taille respectable, comme le montrent les exemples qui suivent : Nous supposerons donc que n s’écrit sous la forme n = pp’, avec p entier premier tel que p Ŕ 1 divise 10 000! et p’ entier naturel quelconque. Comme on cherche à factoriser n, l’entier p, pas plus que p’, ne sont connus… © T³ France 2010 / Photocopie autorisée 136 Mathématiques et TI-Nspire L’idée de l’algorithme p Ŕ 1 de Pollard est très simple : on effectue de proche en proche le calcul modulo n de 210000! : 10000! 2 10000 1 2 3 4... 2 . En posant m mod 210000! , n , on peut écrire : 210000! qn m qpp ' m ce qui permet aussi d’affirmer que : 210000! m (mod p) (1) En d’autres termes, du fait que n est un multiple de p, on peut passer de la congruence modulo n à la congruence modulo p. Mais p étant par hypothèse un nombre premier, le petit théorème de Fermat permet d’affirmer que : 2 p 1 1(mod p) . Comme 10 000! est un multiple de p Ŕ 1, on a aussi : 210000! 1(mod p) (2) Le rapprochement des congruences (1) et (2) montre que : m 1 (mod p) d’où il ressort que p divise m Ŕ 1. Comme p divise à la fois m Ŕ 1 et n, il divise pgcd(mŔ1,n). En d’autres termes, ce pgcd, dont le calcul, faut-il le rappeler, est très efficace, fournira un facteur non trivial de n si l’on a de la chance, ou n luimême parfois, ce qui n’apporte rien… Étude avec l’application Tableur et listes Dans la pratique, il n’est pas nécessaire d’aller jusqu’à 10 000! pour obtenir un résultat. On peut à chaque étape calculer m, et le pgcd qui correspond, pour le cas échéant en déduire un facteur de n. À l’aide d’une feuille de calcul, examinons ce qui se passe sur un cas particulier pas trop grand, par exemple, 10 001 : l’entier est rentré en A1, et mémorisé dans une variable n ; dans la colonne B, on entre tous les entiers de 1 à 100 avec seq ; dans la colonne C, de C1 à C100, on effectue les calculs successifs de 2 1, puis (21)2, ((21)2)3 etc. modulo n : on peut par exemple saisir en C2 la formule15 : =mod(c1^(b2),n) ; en D2, il reste à calculer gcd(c2–1,n), puis à recopier vers le bas. Le résultat ici montre un facteur, premier, de 10 001, à savoir 73, que l’on obtient à partir de 26! . L’entier p que l’on cherche divise à la fois m Ŕ 1 = 1 168 et 10 001, donc leur pgcd qui vaut 73. Voilà mis en évidence ce qu’on cherchait, c’est-à-dire un diviseur de n. Une factorisation est donc : 10 001 = 73 137. Chacun des facteurs obtenus est bien ici premier16. 15 Le programme d’exponentiation modulaire peut être utilisé ici pour s’affranchir des limitations de la fonction mod. 16 Mais ce n’est pas obligatoire… Sinon, on recommence à partir des facteurs obtenus, plus petits, auxquels on essaie d’appliquer une méthode de factorisation… © T³ France 2010 / Photocopie autorisée Factorisation des entiers 137 On remarque aussi que la suite des pgcd (colonne D) est croissante au sens large. En effet, il est clair que si d divise mod(k!,n) et n, alors nécessairement d divise aussi mod((k+1)!,n) et n. Dans certains cas, semble-t-il rares, on peut « rater » un diviseur, comme le montre l’exemple suivant (image de gauche) ; signalons qu’en travaillant avec 3 plutôt que 2, on récupère cette fois le diviseur manquant 13 (image de droite). Écriture d’une fonction La fonction qui suit tient compte de notre étude précédente. Contrairement à ce que nous avons fait dans le tableur, on ne teste le pgcd que toutes les 10 étapes (on peut changer si nécessaire cette valeur dans le programme, soit pour l’augmenter, ou pour la diminuer, 10 semble être un compromis raisonnable). D’autre part, les calculs des puissances successives se font avec 2, mais on pourrait utiliser tout autre nombre comme 3 ou 18. Par commodité, ce nombre a été choisi pour être le © T³ France 2010 / Photocopie autorisée 138 Mathématiques et TI-Nspire deuxième argument de la fonction, le premier étant l’entier que l’on cherche à factoriser. Le code est le suivant : Testons cette fonction avec les différents nombres entiers évoqués au début du chapitre. Avec 34 563 298 729 527 654 368, on récupère dans un temps très court pas moins de 3 facteurs non triviaux qui conduisent à la factorisation complète de cet entier de 20 chiffres : Pour 1030 + 1, on récupère très rapidement les facteurs 6161, 9901, 3541 et 27961, pas tous premiers, mais notre fonction échoue à trouver un facteur à © T³ France 2010 / Photocopie autorisée 1030 1 : 6161 9901 3541 27961 Factorisation des entiers 139 Le quotient de tous ces nombres est pourtant un nombre composé… La méthode de Fermat ne donne rien… sauf si comme on l’a vu plus haut, on multiplie par 9… on peut alors considérer que la factorisation est terminée : D’autres résultats montrent l’étonnante efficacité de cette méthode, pourtant très simple, avec des temps de traitement très courts : Voici une factorisation complète de 1040 + 1 : La méthode p Ŕ 1 de Pollard induit des restrictions dans le choix des entiers qui interviennent dans le cryptage RSA : faire intervenir des nombres premiers p et q tels que p Ŕ 1, ou q Ŕ 1, possède de petits facteurs premiers est fortement contre-indiqué ! On comprend aisément pourquoi ! 3.2 Méthode de la poêle à frire … encore appelée méthode de Pollard… le même mathématicien que précédemment… Tout commence par une belle idée, si belle qu’on la dirait sortie d’un livre de philosophie : © T³ France 2010 / Photocopie autorisée 140 Mathématiques et TI-Nspire « Tout processus fini est ultimement périodique ». Mettons de côté, au moins pour aujourd’hui, les implications philosophiques de cette maxime : contentons-nous de faire de l’arithmétique… et de la cuisine en quelque sorte, s’il faut en croire le titre de la méthode… Il nous faut donc d’abord un processus : par exemple l’application définie par f(x) = x2 Ŕ 1. Pour que ce processus soit fini, nous nous placerons dans les congruences modulo 17 : plus précisément, considérons la suite définie par x0 2 xn 1 mod f xn ,17 où mod(f(xn),17) désigne comme d’habitude le reste dans la division de f xn par 17. Les premiers termes de cette suite peuvent être obtenus très facilement avec le tableur de la TINspire : soit avec les notations utilisées : x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 2 3 8 12 7 14 8 12 7 14 8 On voit apparaitre une période 8, 12, 7, 14. Le petit dessin ci-dessous explique pourquoi on parle ici de poêle à frire. x3 = 12 x2 = 8 x0 = 2 x4 = 7 x1 = 3 x5 = 14 © T³ France 2010 / Photocopie autorisée Factorisation des entiers 141 Sans entrer dans les détails, on peut dire que la périodicité résulte du célèbre principe des tiroirs : au bout d’au plus 18 itérations, peut-être moins, on peut être sûr que deux des termes de la suite (xn) sont égaux modulo 17 et la même succession de calculs va se reproduire indéfiniment. On définit aussi la notion d’épacte de la suite (xn), dont nous nous servirons dans le paragraphe suivant : Par définition, l’épacte d’une suite périodique à partir d’un certain rang est le plus petit entier m strictement positif tel que x2m = xm. Nous pouvons constater qu’elle vaut 4 dans le cas précédent. En effet : x1 x2 x2 x4 x3 x6 mais x4 = x8. La poêle dans la main… Commençons d’abord par observer ce qui se passe dans un cas où la factorisation est connue, avec par exemple N = 1 133 = 11 × 103. Nous aurons besoin de deux « poêles à frire », une première pour le nombre N = 1 133 dans /1133, et une autre pour le facteur p = 11 dans /11, donc deux suites (xn) et (yn). Nous choisirons 2 comme valeur initiale pour chacune de ces deux suites. Mais nous travaillerons cette fois avec f(x) = x2 + 1, calculé dans la colonne de gauche modulo 1133 (suite (xn)) et dans la colonne de droite modulo 11 (suite (yn)). Laissons mijoter à feu doux dans une feuille de calcul et regardons ce que l’on obtient… La poêle de gauche est grande : un « manche » de longueur 3 (les entiers 2, 5 et 26, en bleu dans le tableau), une période de longueur 14 (677, 598, 710, 1049, 259, 235, 842, 840, 875, 851, 215, 906, 545, 180 en jaune dans le tableau), l’épacte vaut 14. © T³ France 2010 / Photocopie autorisée 142 Mathématiques et TI-Nspire La poêle de droite est un modèle beaucoup plus petit : un « manche » de longueur 2 (les entiers 2 et 5), une période de 2 (4, 6), une épacte de 2. Proposition Pour tout entier naturel n, xn yn mod11 . Démonstration On peut procéder par récurrence. C’est bien sûr immédiat pour n = 0 car x0 y0 2 . Supposons la propriété vraie pour un entier arbitraire n. On peut alors écrire : xn yn mod11 . Mais alors xn1 mod xn 2 1,1133 donc xn1 xn 2 1 mod1133 donc comme 1133 est un multiple de 11, xn1 xn 2 1 mod11 . D’après l’hypothèse de récurrence, xn1 yn 2 1 mod11 soit xn1 yn1 mod11 . La propriété est bien prouvée par récurrence. N’oublions pas non plus que pour un nombre que l’on cherche à factoriser, la colonne de droite n’est pas accessible... tandis que celle donnant xn, elle, est tout à fait disponible. Intéressons-nous à ce qui se passe autour de l’épacte e = 2 de la deuxième suite (voir le cadre dans la feuille de calcul précédente). Par définition de l’épacte , on sait que l’on a y2e = ye = 4. Par conséquent : x2e 4 mod11 et xe 4 mod11 d’où l’on déduit x2e xe 0 mod11 , ce que l’on peut traduire par le fait que p = 11 divise x2e xe . On peut le vérifier dans notre exemple car 11 divise bien 598 Ŕ 26 = 572... L’information est d’importance ! Le facteur p = 11, celui qu’a priori on ne connaît pas, apparaît discrètement dans la poêle de gauche ! Certes pas directement visible : 11 se contente de diviser x2e Ŕ xe. Un peu comme s’il était un ingrédient, une pincée de sel, dans la sauce du petit plat que l’on mijote… Mais comment peut-on isoler ce diviseur, à supposer qu’on ne le connaisse pas, s’il n’est pas directement visible ? Comme p = 11 divise x2e Ŕ xe et N, il divise aussi le pgcd de x2e Ŕ xe et de N qui à ce moment est strictement supérieur à 1. Le discours que l’on tient dans ce cas particulier se généralise à un entier N quelconque et à un de ses diviseurs p, que l’on cherche à déterminer. Il est prudent, avant de lancer tout calcul, de s’assurer à l’aide du théorème de Fermat que l’entier que l’entier N est bien composé. L’étude précédente montre qu’il suffit de travailler avec x2k Ŕ xk, en commençant à k = 1. Comme on ne sait rien du moment où l’on sera à l’épacte de la deuxième suite, on teste à chaque étape si le pgcd de x2k Ŕ xk et de N est supérieur à 1 (…l’algorithme d’Euclide est très performant….). Si oui, ce pgcd lui-même est aussi un diviseur de N et nous avons un facteur de N17 ; sinon on passe à la valeur suivante de k. L’algorithme s’arrêtera donc forcément au moment de l’épacte de la deuxième suite. 17 Qui peut malheureusement être égal à n lui-même. Dans ce cas, la factorisation n’est pas intéressante… © T³ France 2010 / Photocopie autorisée Factorisation des entiers 143 Utilisons cette méthode pour tenter de factoriser l’entier N = 14 453 dans une feuille de calcul. Le pgcd de x6 Ŕ x3 et de 14 453 vaut alors 97, et celui de x28 Ŕ x14 et de 14 453 est 149 : la factorisation est complète car 14 453 = 149 × 97. Quelques remarques avant de passer à l’écriture sur la TI-Nspire de cet algorithme : sur le choix de la fonction f : pas forcément f x x 2 1 comme les exemples que nous avons vus. N’importe quel autre polynôme peut convenir, à l’exception des polynômes de degré 1 qui conduisent à des épactes souvent importantes18. Les polynômes de degré deux réalisent un bon compromis entre une épacte assez petite et des calculs modérés. le choix du premier terme : de la même façon, on pourrait choisir un autre premier terme que 2. Il faut cependant éviter 0 ou Ŕ2 qui peuvent conduire à des épactes trop longues. Écriture d’une fonction Le plus simple, c’est de définir la fonction f dans l’application Calculs. Il faudra penser à la définir, ou à la modifier, si nécessaire. On peut aussi mettre comme paramètre d’entrée le nombre n à factoriser et le premier terme de la suite (même si l’on prend souvent 2). Le code est alors le suivant : 18 Ces polynômes sont à l’inverse parfois utilisés comme générateurs de nombres aléatoires. © T³ France 2010 / Photocopie autorisée 144 Mathématiques et TI-Nspire En conservant les notations de notre exemple, on ne gère que l’évolution de la suite (xn) : la suite (yn) est en effet inaccessible dans la mesure où on ne connaît pas de factorisation de notre entier. À chaque fois que l’on avance d’une étape pour x1, on avance deux fois plus vite pour x2, d’où la double instruction pour cette dernière variable. On sait qu’au moment de l’épacte de la deuxième suite (yn) Ŕ inconnue au demeurant Ŕ, le pgcd de x2 et de x1 est supérieur à 1 : comme on ignore le moment où survient cette épacte, on teste le pgcd à chaque passage dans la boucle19. Les résultats sont satisfaisants comme le montre l’écran de calculatrice suivant. Ils sont obtenus en des temps très courts… Quelques remarques sur cet algorithme Cet algorithme renvoie-t-il toujours un diviseur strict de N ? Tout ce que l’on sait, c’est qu’il renvoie un diviseur de N strictement plus grand que 1… mais il arrive parfois, si l’on n’a pas trop de chance, que ce pgcd soit égal ... à N lui-même, ce qui ne règle en rien le problème de la factorisation de N… Ainsi par exemple, avec N = 1 591 et f(x) = x2 Ŕ 1 : Mais le problème est réglé avec f(x) = x2 + 1. 19 Heureusement que l’algorithme d’Euclide est très performant… © T³ France 2010 / Photocopie autorisée Factorisation des entiers 145 Cela arrive notamment quand N est le produit de deux nombres premiers, ayant chacun la même épacte. Dans l’exemple considéré, 1 591 est le produit des nombres premiers 37 et 43. Or il se trouve que chacun de ses deux entiers génère des suites qui ont la même épacte, à savoir 6, comme le montre la feuille de calcul suivante : Au moment de l’épacte, on saura que x2e xe est à la fois divisible par 37 et 43 donc par 1 591 ! C’est pourquoi le pgcd renvoyé est précisément 1 591. Il n’y a pas de remède, sauf à changer la fonction utilisée : ici, avec f(x) = x2 + 1, il n’y a plus de problème. Cet algorithme demande-t-il beaucoup de temps ? En fait non, car il se trouve que l’épacte de la deuxième suite apparaît assez rapidement. Des calculs ont été faits sur ordinateur qui prouvent que, pour tout nombre premier p inférieur à 106, l’épacte de la suite (xn) définie par : u0 2 2 xn 1 xn c où c 1 est inférieure à 3300. Plus précisément, on conjecture que cette épacte est, pour tout nombre premier p, inférieure ou égale à 4 p log p : personne ne l’a cependant encore prouvé, ne sachant pas par quel bout prendre le 3 manche de la poêle... L’algorithme risque par contre de tourner longtemps dans le cas où le nombre N est premier... Il est facile, et peu coûteux en temps machine, de tester au préalable si le nombre est premier ou composé : le test de Fermat fait alors l’affaire, à moindre frais. Par exemple si 2N Ŕ 1 n’est pas congru à 1 modulo N, alors N est composé. Une des plus belles réussites de cette méthode a été la factorisation en 1980 par Brent et Pollard du 8 gigantesque nombre de Fermat F8 = 22 + 1 = 2256 + 1, un entier de 78 chiffres. © T³ France 2010 / Photocopie autorisée 146 Mathématiques et TI-Nspire On savait ce nombre composé depuis quelques années déjà, sans avoir mis en évidence un des ses 10 facteurs. Brent et Pollard ont utilisé la méthode de la poêle à frire avec x0 = 3 et f(x) = x2 + 1. En deux heures d’ordinateur, ils mirent en évidence le facteur premier suivant de F8 : 1 238 926 361 552 897 On put ensuite montrer que l’autre facteur (de 62 chiffres) était premier... Épactant non ? De nombreuses méthodes de factorisation, toutes plus ingénieuses les une que les autres Ŕ nous en avons étudié quelques-unes Ŕ ont vu le jour depuis le développement des ordinateurs. D’ailleurs, on ne peut qu’être émerveillé devant les performances de la fonction Factor de notre calculatrice, en sachant la difficulté réelle qu’il y a à factoriser un nombre entier un peu grand. Le problème de la factorisation, au départ purement théorique, a revêtu depuis quelques années un intérêt stratégique accru, avec en particulier le développement de la cryptographie sur Internet. Les méthodes modernes de cryptographie sont basées sur la quasi-impossibilité qu’il y a à factoriser un nombre entier produit de deux nombres premiers, dès que ceux-ci sont suffisamment grands. Encore vaut-il mieux bien connaître les performances des principaux algorithmes de factorisations ! La méthode de Fermat par exemple nous montre qu’il serait bien imprudent de choisir les deux facteurs premiers trop proches ! Au hasard d’Internet, on peut suivre les défis des factorisations du moment, souvent liés d’ailleurs à la cryptographie RSA. Le dernier record date de mai 2005 avec la factorisation du « gigantesque » nombre RSA20020 (de 200 chiffres décimaux) : RSA210, au moment où j’écris (juillet 2010) n’est toujours pas tombé ! 20 Source Wikipedia http://fr.wikipedia.org/wiki/RSA-200. © T³ France 2010 / Photocopie autorisée Factorisation des entiers 147 ANNEXE : quelques factorisations C’est souvent la conjonction de plusieurs méthodes qui vient à bout des factorisations délicates. Pour dégrossir la recherche, il est commode d’écrire une fonction donnant les facteurs premiers « petits » Ŕ inférieurs à un entier m donné Ŕ d’un entier donné. C’est l’objet de la fonction suivante : Il ne faut pas non plus oublier les outils algébriques qui permettent sans efforts des factorisations intéressantes. Outre les classiques identités remarquables, on peut signaler : a10 1 a 2 1 a8 a 6 a 4 a 2 1 a 2 1 a 4 5a3 7a 2 5a 1 10a a3 2a 2 2a 1 2 La vérification est immédiate avec le calcul formel. © T³ France 2010 / Photocopie autorisée 2 148 Mathématiques et TI-Nspire L’intérêt de la deuxième écriture se perçoit lorsque 10a est un carré : la deuxième parenthèse est de nouveau une différence de deux carrés. Factorisation de 1090+1 On peut commencer par utiliser la formule précédente avec a = 109 ; on est bien dans le cas où 10a est un carré ! Trois facteurs apparaissent, qui vont être traités séparément : par commodité, ils ont été nommés f1(x), f2(x) et f3(x). Traitons f1(109) avec ptfact : les trois nombres qui apparaissent sont premiers. Traitons f2(109) avec ptfact : 61 et 3541 sont premiers, reste le troisième facteur, composé. Ce troisième facteur « tombe » avec la méthode de la poêle à frire. Enfin f3(109), qui tombe aussi sous la conjonction de ptfact et de poele particulièrement efficace en la matière ! © T³ France 2010 / Photocopie autorisée Factorisation des entiers 149 Bref, la factorisation de 1090 + 1 est terminée21. Alors que le factor de TI-Nspire ne donne pas le résultat, le nombre étant beaucoup trop grand ! 21 Voir aussi la factorisation que je propose de 101000 Ŕ 1, en n’utilisant que les outils de logiciel TI-NSpire et le résultat algébrique précédent à l’adresse http://www.les-mathematiques.net/phorum/read.php?5,538796,539006#msg-539006. © T³ France 2010 / Photocopie autorisée