• Aucun résultat trouvé

Deux fois plus vite ?

Dans le document MATHÉMATIQUES ET TI-Nspire (Page 126-132)

Annexe : les nombres hautement composés

Étape 1 : on décompose 1063 en base 2, en procédant à des divisions successives par 2

1. La méthode des divisions successives

1.3 Deux fois plus vite ?

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 :

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.

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 !

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 à

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 :

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

Dans le document MATHÉMATIQUES ET TI-Nspire (Page 126-132)