• Aucun résultat trouvé

Reconnaître si un nombre est premier

Dans le document MATHÉMATIQUES ET TI-Nspire (Page 80-84)

Annexe : les nombres hautement composés

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

1. Reconnaître si un nombre est premier

C’est évidemment la question la plus simple que l’on se pose quand on vient de donner la définition.

Les premiers nombres premiers sont archi-connus mais comment procède-t-on si l’on a affaire à un nombre plus grand, comme 1 234 567 891 ou 1 234 567 891 234 567 ? Nous excluons dans ce chapitre le recours à l’excellente fonction isprime de la calculatrice ; rien ne remplace la réflexion que l’on peut mener soi-même autour de ces problèmes fondamentaux posés par l’arithmétique.

1.1 La fonction plus petit diviseur d’un entier

 Si l’on cherche à reformuler le problème posé, un entier n est premier lorsque le plus petit diviseur strictement supérieur à 1 de n est… n lui-même. D’où l’intérêt de commencer en écrivant une fonction donnant le plus petit diviseur p strictement supérieur à 1 d’un entier n, ce que nous écrirons à l’avenir d’une notation peu répandue mais fort commode : ppd(n).

 Comment ferions-nous à la main avec un entier quelconque pour déterminer son ppd ?

On teste successivement si n est divisible par 2, puis par 3, etc. : on s’arrête dès que l’on a un diviseur.

Étudions ce qui se passe sur quelques exemples :

N 24 35 11 49 127 143

Un même calcul doit donc être effectué un certain nombre de fois : en commençant à d = 2, puis en incrémentant de 1, on doit tester si n est divisible par d (c’est-à-dire pour la calculatrice si mod(n,d)=0). Dès que c’est le cas, on renvoie la valeur de d trouvée ; sinon on poursuit et au pire, dans le cas où n est premier, on s’arrête lorsque d2 dépasse n.

 Cette démarche peut être aisément transposée sur un tableur.

L’entier à étudier est placé dans la cellule A1 et mémorisé dans une variable n. On teste tous les entiers compris entre 2 et n , que l’on peut placer dans la colonne B, avec une instruction seq. On exclut d’emblée le 1.

Dans la colonne C, on repère ceux qui divisent n s’ils existent ; sinon on met void dans la cellule.

Plutôt que recopier arbitrairement sur un certain nombre de lignes, il vaut mieux utiliser un seq, comme on l’a déjà vu dans un exemple précédent :

=seq(when(mod('n,k)=0,k,_,_),k,2,√('n))

Dans la colonne D, on supprime les nombreux void de la colonne C.

Le fait que les colonnes s’ajustent en fonction du nombre considéré nous autorise à travailler avec des entiers suffisamment grands (attention à la limitation à 2500 lignes pour le tableur). Le tableur présente cependant un défaut : il effectue tous les calculs quand bien même sait-on dès le début que le nombre considéré est un multiple de 2, par exemple.

1.2 Une fonction ppd

 La fonction nous donnera plus de souplesse : pour un multiple de 2, ou de 3, par exemple, elle doit pouvoir renvoyer une réponse rapide, quand bien même le nombre serait gigantesque.

Une boucle While s’impose puisqu’on ne sait pas a priori combien de fois on va parcourir cette boucle. Deux façons de sortir de la boucle1 : soit parce qu’on a trouvé un diviseur qui sera le ppd cherché, soit parce qu’on a dépassé n et dans ce cas, le ppd vaut n.

À l’inverse, on reste dans la boucle tant qu’on n’a pas trouvé de diviseurs (mod(n,d)0) et que d2 est inférieur ou égal à n.

Voici le code d’une première fonction ppd1, basé sur les remarques précédentes :

1 C’est souvent une bonne façon de déterminer la condition à mettre dans la boucle. On sait plus facilement quand on doit en sortir… il

Ci-dessous quelques-uns des résultats obtenus :

Mais la fonction, on s’en doute, peut encore notablement être améliorée. En effet si n est impair, il est inutile de rechercher un diviseur pair. En d’autres termes, dès qu’on sait qu’un entier n’est pas divisible par 2, pas besoin de tester s’il est divisible par 4, 6, 8, etc.

Concrètement, on peut donc au préalable tester si n est divisible par 2, puis ne plus tester que les diviseurs impairs en commençant à d = 3. Globalement, on peut espérer aller deux fois plus vite lorsqu’il faut balayer beaucoup de diviseurs, notamment quand le nombre considéré est premier2. C’est l’objet de la fonction ppd suivante :

2 20 s avec ppd1 appliquée à 10 000 000 000 037… 12 s avec ppd.

1.3 Un premier test de primalité

L’essentiel du travail est fait avec la fonction ppd précédente : n > 1 est premier si et seulement si ppd(n)=n. Le cas n = 1 doit être envisagé à part. Le code du programme est donné ci-après. On remarquera l’emploi de If Then, Elseif Then, Else et Endif, qui permet de gérer ici trois éventualités.

Testons cette fonction avec quelques entiers. Pour les petites valeurs, les réponses sont données presqu’immédiatement, ainsi d’ailleurs que pour des valeurs plus grandes, pourvu qu’elles possèdent un petit diviseur. Les cas les plus défavorables correspondent aux nombres premiers, ce qui est le cas des exemples qui suivent :

Le premier résultat est obtenu à la calculatrice en une quinzaine de secondes, le second en 48 secondes mais le troisième demande 2 minutes 33 secondes. La dégradation des performances est particulièrement rapide : pourtant le dernier nombre étudié ne possède que 12 chiffres.

1.4 Les limites d’un tel algorithme

Prouver qu’un entier n d’une cinquantaine de chiffres, disons de l’ordre de 1050 pour fixer les idées, est un nombre premier reste définitivement inaccessible à notre fonction estprem.

En effet on doit tester pour un tel nombre approximativement la moitié des entiers compris entre 1 et n, soit la bagatelle de quelque 5  1024 entiers.

On peut facilement construire un programme de test pour essayer d’estimer la rapidité de la calculatrice ou du logiciel :

Avec ma TI-Nspire modèle 2.0, et des piles chargées à bloc, l’exécution de la fonction précédente, qui calcule les restes de 1050 dans une division par les 50 000 premiers entiers, s’effectue en 35 secondes3. Bref, et même si c’est une approximation très grossière, on peut penser que pour tester 5  1024

L’ordinateur est une centaine de fois plus rapide : il exécuterait la même tâche en 1,1 × 1012 années…

on n’y gagne pas grand-chose !

Il ne suffit donc pas d’avoir un algorithme pour résoudre un problème, encore faut-il que cet algorithme s’exécute en un temps raisonnable : on conçoit que ce point puisse devenir crucial.

La fonction isprime de la calculatrice est à ce titre beaucoup plus performante que notre estprem.

Elle s’appuie sur des algorithmes incomparablement plus performants que ceux basés sur la méthode des divisions successives.

3 Et mon ordinateur ACER demande 0,35 seconde pour tester les mêmes 50 000 nombres. Plus exactement, il en teste 5 000 000 en 35 secondes. Mon ordinateur semble être approximativement 100 fois plus rapide que ma calculatrice, au moins pour ces calculs.

Dans le document MATHÉMATIQUES ET TI-Nspire (Page 80-84)