Nombres [Maple Math] premiers

Eric Wegrzynowski

(d'après Cours d'algèbre, M. Demazure, ed. Cassini, chap 2)

Introduction

Il existe une infinité de nombres premiers. Ce fait est bien connu depuis longtemps, puisqu'on en trouve la démonstration dans les éléments d'Euclide. Le plus grand nombre premier connu ce jour (10 XI 98) est le nombre

[Maple Math]

nombre gigantesque, puisqu'il s'écrit avec près d'un million de chiffres décimaux.

Parmi les plus grands nombres premiers connus, on en trouve plusieurs de la forme

[Maple Math]

Les nombres de cette forme sont connus sous le nom de nombres de Mersenne , en hommage à Marin Mersenne (1588-1648). Pour qu'un nombre de Mersenne soit premier, il faut que l'exposant [Maple Math] le soit aussi. La réciproque n'est malheureusement pas vraie comme le montre l'exemple :

[Maple Math]

Une particularité de ces nombres est que leur écriture en base 2 est très simple : elle ne comprend que des 1, et il y en a [Maple Math] . Nous allons nous intéresser aux nombres dont l'écriture en base 10 est identique.

Le problème

Il s'agit de rechercher quels sont les nombres premiers qui ne s'écrivent qu'avec des 1 en base 10. Par exemple, 1 n'est pas premier, 11 l'est, 111=3x37 ne l'est pas, 1111=11x101 ne l'est pas, 11111=41x271 ne l'est pas.

Nous notons [Maple Math] un nombre qui s'écrit avec [Maple Math] fois le chiffre 1 en base 10. Il est alors clair que l'on a

[Maple Math]

Cette égalité nous fournit une procédure pour générer de tels nombres :

> un := n -> (10^n - 1)/9;

[Maple Math]

> seq(un(k),k=1..10);

[Maple Math]

Remarques :

1) Il est clair que si on s'intéresse aux nombres de la forme [Maple Math] avec [Maple Math] un chiffre non nul autre que 1, aucun d'entre eux n'est premier si [Maple Math]

2) La remarque précédente est vraie dans n'importe quelle base [Maple Math] et on a

[Maple Math]

et dans le cas où [Maple Math] , on retrouve les nombres de Mersenne.

3) Les seuls entiers n inférieurs à 9973 pour lesquels [Maple Math] est premier sont : 2, 19, 23, 317, 1031.

Un premier critère

Hormis le cas où [Maple Math] , aucun des nombres [Maple Math] n'est premier si [Maple Math] est pair. En effet, lorsque [Maple Math] , [Maple Math] est divisible par 11, le quotient s'écrivant avec [Maple Math] fois le chiffre 1, en alternance avec des zéros [Maple Math] .

Plus généralement si [Maple Math] est un multiple de [Maple Math] , [Maple Math] avec [Maple Math] , [Maple Math] est divisible par [Maple Math] .

Nous obtenons donc un premier critère :

Une condition nécessaire pour que [Maple Math] soit un nombre premier est que [Maple Math] soit premier .

Cette condition n'est pas suffisante puisque 111=3x37.

Dans la suite nous testerons la primalité des nombres [Maple Math] lorsque [Maple Math] est un nombre premier inférieur à 100.

> premiers := [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97];

[Maple Math]

La recherche commence

Nous définissons une procédure de test de primalité qui teste la divisibilité de l'entier [Maple Math] par tous les entiers successifs de 1 à [Maple Math] . La procédure renvoie le plus petit diviseur autre que 1 de [Maple Math] (cette procédure ne convient pas pour [Maple Math] ).

> premier1 := proc(n)

> local k;

> k := 2;

> while n mod k<>0 and k*k<=n do k:=k+1; od;

> if n mod k = 0 then k else n fi;

> end:

> seq(premier1(k),k=1..20);

[Maple Math]

Retrouvons des résultats déjà établis :

> seq(premier1(un(k)),k=2..10);

[Maple Math]

Cherchons maintenant les nombres [Maple Math] premiers lorsque [Maple Math] est premier inférieur à 100.

> n:=7:f:=premier1(un(n));q:=un(n)/f; q*f;

[Maple Math] n'est pas premier.

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math] n'est pas premier.

> n:=11:f:=premier1(un(n));q:=un(n)/f; q*f;

[Maple Math]

[Maple Math]

[Maple Math]

> n:=13:f:=premier1(un(n));q:=un(n)/f; q*f;

> un(13)/53;

[Maple Math] n'est pas premier

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

> n:=17:debut:=time():f:=premier1(un(n));tps_de_calcul:=time()-debut;q:=un(n)/f; q*f;

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math] n'est pas premier. Le temps de calcul est long (près de 4 minutes sur un Pentium 166Mhz), cela provient de la taille du plus petit diviseur.

Ce temps de calcul aurait été encore plus long si ce nombre avait été premier. Il devient donc important de rechercher d'autres méthodes de test de primalité.

Une stratégie élaborée, mais ...

Un théorème dû à Legendre affirme que si [Maple Math] et [Maple Math] sont deux nombres premiers entre eux, et si [Maple Math] est un facteur premier de [Maple Math] qui ne divise aucun des [Maple Math] lorsque [Maple Math] divise [Maple Math] et est distinct de [Maple Math] , alors [Maple Math] divise [Maple Math] si [Maple Math] est impair.

Ce théorème s'applique parfaitement à notre problème puisque on cherche à tester la primalité de

[Maple Math]

lorsque [Maple Math] est premier impair. On a alors [Maple Math] et [Maple Math] , les facteurs premiers autres que 3 de [Maple Math] sont de la forme [Maple Math] , [Maple Math] étant un entier positif. Ainsi, si [Maple Math] est un nombre premier supérieur à 3, il faut chercher les facteurs premiers de [Maple Math] parmi les nombres de la forme [Maple Math] . D'où la procédure suivante (qui ne s'applique que pour de tels nombres) :

> premier2 := proc(n) #n est le nombre de 1 du nombre à tester

> local p,U;

> U := un(n);

> p := 2*n+1;

> while U mod p <> 0 and p*p<=U do p := p+2*n; od;

> if U mod p = 0 then p else U fi;

> end:

> premier2(5);premier2(7);premier2(11);premier2(13);

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

> debut:=time():premier2(17);tps_de_calcul:=time()-debut;

[Maple Math]

[Maple Math]

La réponse est obtenue beaucoup plus rapidement qu'avec la procédure premier1. On peut envisager de tester avec [Maple Math] .

> n:=19:debut:=time():premier2(n);tps_de_calcul:=time()-debut;

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

Le nombre [Maple Math] est premier ! Il aura fallu plus de 2h de calcul ! Si on veut tester le nombre [Maple Math] , et si celui-ci est premier, il faudra approximativement 100 fois plus longtemps pour le déterminer. Cela provient du fait qu'en rajoutant 4 chiffres 1, on multiplie le nombre par environ 10000, et sa racine carrée par 100.

Cette méthode élaborée à partir du théorème de Legendre ne nous sera d'aucun secours dès que atteindra la trentaine. Il nous faut trouver d'autres stratégies.

Fermat intervient

Le petit théorème de Fermat stipule que si [Maple Math] est un nombre premier, alors pour tout entier [Maple Math] on a (modulo [Maple Math] )

[Maple Math]

Appliqué à notre problème, cela donne : si [Maple Math] est premier, alors pour tout entier [Maple Math] on a (modulo [Maple Math] )

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

En résumé, si [Maple Math] est premier, alors pour tout entier [Maple Math] on a [Maple Math] modulo [Maple Math] . Cependant la réciproque n'est pas vraie en général. Le théorème de Fermat nous permet donc de tester la non primalité d'un nombre.

La procédure qui suit nous permet de tester la non primalité des nombres [Maple Math] , [Maple Math] étant passé en paramètre, en prenant [Maple Math] . Elle ne convient que pour [Maple Math] car alors [Maple Math] modulo [Maple Math] .

> premier3 := proc(a,n)

> local a10n, k, U;

> U := un(n);

> a10n := a;

> for k from 1 to n do

> a10n := a10n^10 mod U;

> od;

> evalb(a10n=a^10 mod U);

> end:

Vérification des résultats déjà établis :

> premier3(2,5);premier3(2,7);premier3(2,11);premier3(2,13);premier3(2,17);premier3(2,19);

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

OK ! Passons aux nombres suivants :

> for k from 9 to nops(premiers) do

> if premier3(2,premiers[k]) then

> print(1&^[premiers[k]],` est peut-être premier`);

> else

> print(1&^[premiers[k]],` n'est pas premier`);

> fi;

> od;

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

Un temps de calcul tout à fait acceptable !

Hormis pour [Maple Math] , aucun des nombres [Maple Math] , [Maple Math] premier inférieur à 100, n'est premier. De plus nous n'avons aucune certitude sur la primalité de [Maple Math] .

Nous pouvons effectuer d'autres vérifications pour le cas [Maple Math] , en prenant d'autres valeurs pour [Maple Math] .

> for a from 3 to 10 do premier3(a,23) od;

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

Ce nombre semble bien résister au critère de Fermat. Cependant, nous ne pouvons pas conclure avec certitude qu'il est premier, car il est connu que certains nombres composés contredisent systématiquement ce critère : ces nombres sont nommés nombres de Carmichael . Les nombres de Carmichael sont les nombres composés [Maple Math] , tels que, pour tout entier [Maple Math] , on a (modulo )

[Maple Math]

Le plus petit d'entre eux est 561. Le calcul qui suit prouve qu'il s'agit bien d'un nombre de Carmichael.

> s:=0:for k from 2 to 560 do s:=s+((k^561 mod 561) -k)^2 od:s;

[Maple Math]

Conclusion : nous ne savons toujours pas si [Maple Math] est premier ou non. En revanche, nous savons avec certitude qu'il n'existe que 2 ou 3 nombres [Maple Math] premiers lorsque [Maple Math] est inférieur à 100.

Probablement premier

Lorsque [Maple Math] est un nombre premier, l'égalité stipulée par le théorème de Fermat, pour tout entier [Maple Math] ,

[Maple Math]

peut encore s'écrire

[Maple Math]

En appliquant cette dernière égalité à [Maple Math] , lorsque ce nombre est premier, on obtient

[Maple Math]

[Maple Math] .

Par conséquent si [Maple Math] est premier, et si [Maple Math] n'est pas un multiple de [Maple Math] , on doit avoir [Maple Math] ou [Maple Math] .

On peut donc construire une procédure de test de primalité qui recherche l'existence d'un entier [Maple Math] tel que [Maple Math] et [Maple Math] . Si la procédure trouve un tel entier, alors [Maple Math] n'est pas premier, et cet entier est un témoin de la non primalité de [Maple Math] .

Que dire si elle n'en trouve pas ? Un théorème, dû à Rabin, affirme que si [Maple Math] est un nombre composé impair supérieur à 9, et si [Maple Math] avec [Maple Math] impair, alors il y a au plus [Maple Math] entiers compris entre 1 et [Maple Math] qui satisfont à la condition [Maple Math] ou à l'une des conditions [Maple Math] , avec [Maple Math] , ( [Maple Math] désignant le nombre d'entiers inférieurs à [Maple Math] premiers avec [Maple Math] ).

On en déduit qu'au moins [Maple Math] des entiers compris entre 1 et [Maple Math] témoignent de la non primalité de [Maple Math] .

De ce résultat, on peut concevoir une procédure qui choisit au hasard un entier [Maple Math] compris entre 2 et [Maple Math] , et qui calcule [Maple Math] . Si ce nombre est différent de 1 et -1, [Maple Math] n'est pas premier. Sinon, il est premier avec une probabilité au moins égale à [Maple Math] . Dans ce dernier cas, il suffit de recommencer l'opération pour soit trouver un témoin de la non primalité de [Maple Math] , soit conclure qu'il est premier avec une probabilité au moins égale à [Maple Math] . En recommençant éventuellement [Maple Math] fois cette opération lorsqu'on ne trouve pas de témoin de non primalité, on pourra en conclure avec une probabilité au moins égale à [Maple Math] que [Maple Math] est premier.

> premier4 := proc(k,n)

> local alea,i,a,U,t,at;

> U := un(n);

> t := 5*un(n-1);

> alea := rand(2..U-1);

> i := 1;

> a := alea();

> at := a &^t mod U;

> while (i<k) and ((at=1) or (at=U-1)) do

> i := i+1;

> a := alea();

> at := a&^t mod U;

> od;

> if (at=1 or at=U-1) then

> print(` `.U.` est probablement premier`);

> else

> print(` `.U.` n'est pas premier. Témoin `=a);

> fi;

> end:

> premier4(10,17);premier4(10,19);

[Maple Math]

[Maple Math]

> premier4(50,23);

[Maple Math]

Conclusion : le nombre [Maple Math] est premier avec une probabilité d'erreur inférieure à [Maple Math] , c'est à dire inférieure à une chance sur mille milliards de milliards de milliards. L'usage d'une telle procédure fait apparaître une nouvelle catégorie de nombres : celles des nombres probablement premiers , ou encore, en reprenant la terminologie de M. Demazure, nombres premiers à usage commercial .

Autres premiers

> premier4(50,317);

[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]

>

>

>

>