
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.