Nous avons mis au point sur le modèle du crible d'Eratosthène une méthode permettant de tester si un entier est premier ou non. Cela marche assez bien pour des petits nombres, mais cette méthode devient impraticable s'il s'agit de tester un entier d'une centaine de chiffres. Nous allons nous occuper dans cette section de deux problèmes imbriqués : d'une part trouver des méthodes permettant de vérifier rapidement si un nombre est premier et d'autre part réfléchir à d'éventuelles méthodes permettant de « fabriquer » des nombres premiers aussi grands que l'on veut.
« A thing of beauty is a joy for ever. Its loveliness increases; it will never Pass into nothingness » écrivait John Keats 217 ans après la naissance de Pierre de Fermat, dont le Petit Théorème demeure un joyau de la théorie des nombres, malgré les innombrables découvertes effectuées depuis dans ce domaine. S'il est qualifié de petit, c'est qu'une conjecture célèbre du même Fermat, restée indémontrée pendant des siècles, s'est accaparée le titre de Grand Théorème de Fermat.
Dans la marge d'un manuscrit, Fermat prétendait en avoir trouvé la démonstration mais manquer de place pour l'écrire. Il a pourtant fallu attendre 1995 pour qu'Andrew Wiles le démontre en utilisant des outils surpuissants : l'entêtement d'une multitude de chercheurs a abouti à la démonstration de ce théorème, mais surtout a permis de développer d'importants outils en théorie des nombres. Quant à lui trouver des applications, le problème reste ouvert.
Au contraire, notre petit théorème, bien moins « médiatique » et à la démonstration abordable, a eu de très nombreuses et importantes conséquences : nous allons en étudier quelques-unes.
Mais tout d'abord, comment l'idée de son théorème est venu à l'esprit de l'ami Pierre ?
Au cours de ses nombreuses recherches, Fermat s'est intéressé aux nombres de Mersenne2 qui sont les nombres de la forme , avec
un entier premier. On savait déjà que
était composé
Il sauta aux yeux de Fermat qui vivait parmi les entiers, que
en observant
ce qui lui mit la puce à l'oreille
pour observer que
dans
. Qu'en dire ? Que le plus petit diviseur premier d'un nombre composé
est de la
forme
?
Le problème, c'est que
, et donc, ça ne marche pas. D'ailleurs, ce n'est pas ce qui attira
l'attention de Fermat. Il remarqua en effet que dans
, non seulement
mais aussi
. De même dans
,
et
. Il conjectura donc que tout diviseur premier de
est congru à 1 modulo
.
Mais l'ami Pierre ne s'arrêta pas là. On a
, mais on a le même résultat avec
,
, etc. De même,
,
,...,
, etc. sont tous congrus à 1 modulo 89. Et puis
,
, etc. sont congrus à 1 modulo 47 et
enfin
,...,
, etc. sont aussi tous congrus à 1 modulo
.
Oui, et alors. Et bien, pour ces quatre nombres premiers, on a
, mais surtout, dans chaque cas, l'un de ces
est
.
En bref, pour les nombres premiers 23, 89, 47 et 178481, on a
. Est-ce vrai pour
les entiers ? Nous qui avons
un bel ordinateur, menons une petite enquête :
fer:=proc(a,n) local k;
begin
for k from 1 to n do
[ithprime(k),pmod(a,ithprime(k)-1,ithprime(k))]; # ithprime(k) donne le kème nb premier
end_for; end_proc:
fer(3,15);
Occupons nous maintenant du théorème lui-même, énoncé pour la première fois par Fermat en 1640 dans une lettre adressée au fameux Frère Marin Mersenne.
Comme d'habitude, Fermat affirma avoir la démonstration mais ne pas avoir la place de l'écrire à son correspondant3
Il existe de très nombreuses démonstrations de ce théorème. Nous en verrons trois, une maintenant, une à titre d'exercice et une comme cas particulier d'un théorème plus général, le théorème d'Euler.
La plus rapide consiste à montrer que
est congru à
modulo
puis
d'en déduire le résultat. Nous aurons besoin d'établir deux petites propriétés4.
Considérons donc les multiples successifs de jusqu'à
et appelons
le reste de la division de
par
.
Et maintenant...une petite illustration MuPAD, évidemment...
On utilisera la fonction n mod d qui renvoie le reste de la division de n par d.
2^(97-1) mod 97;
Choisissons maintenant un nombre premier quelconque grâce à la fonction nextprime
p:=nextprime(10^20);
100000000000000000039
puis un nombre entier quelconque inférieur à
random();
321110693270
calculons modulo
a^(p-1) mod p;
C'est trop gros : serions-nous donc encore une fois condamnés aux petits nombres ? Eh bien non, il est temps d'utiliser notre cerveau ! Et aussi l'algorithme d'exponentiation rapide vu précédemment.
pmod:=proc(a,n,p)
local B,A;
begin
A:=a mod p:
B:=1; # Pour simplifier car on travail modulo p
while n<>0 do
if n mod 2=0
then A:=(A*A mod p); n:=n/2 # si n pair, on élève au carré et on divise la puissance par 2
else B:=(B*A mod p); n:=n-1 # sinon, on enlève une puissance pour obtenir une puissance paire
end_if
end_while;
B
end_proc:
Cette fois-ci on a la réponse, et en plus, instantanément !
pmod(321110693270,100000000000000000039-1,100000000000000000039);
1
Comme quoi, quand on arrive aux limites des possibilités calculatoires d'un ordinateur, rien ne vaut un bon cerveau.
C'est bien joli tout ça, amis à quoi ça peut servir ?
Prenons un grand nombre, assez compliqué pour avoir l'air premier, par exemple
n:=10^100*random()^3+32!+32*random()+13;
n:=17416995007052249019952126647441817600000000000000000000000000000000000000
0000000000000000000000000
0263130836933693530167241908282577229
Est-ce que ce nombre de 136 chiffres est premier ? Si tel est le cas, alors
5
Jetons donc un coup d'œil
pmod(2,n-1,n);
10929185996403668155132301645171677938973308556359031603915090554003250963
7112385597262131870063544874
4642860847610628382268616793816279
Ouh la la, ça ne fait pas 1 ! Donc n'est pas premier, et la réponse a été donnée immédiatement, en quelques mili-secondes ! C'est
quand même assez fort : on arrive, grâce au petit théorème de Fermat, à montrer qu'un entier de 136 chiffres pris au hasard
n'est pas premier6.
Maintenant, que se passe-t-il si le résultat est effectivement 1 ? Cela fait-il de un nombre premier ?
Par exemple, vérifiez que
, et pourtant
. On dit que 341 est
.
Voici un petit programme pour trouver les premiers nombres pseudo premiers :
pseudo:=proc(a,n) local i,L;
begin
L:=[];
for i from 3 to n step 2 do if not(isprime(i)) and pmod(a,i-1, i)=1 then L:=L.[i];
end_if; end_for:
L;
end_proc:
pseudo(2,2000);
pseudo(3,3000);
Pour des nombres
plus grands, il n'est pas facile de savoir s'ils sont réellement premiers. Puisqu'on ne sait pas a priori s'ils le sont, on les appelle
des nombres probablement premiers de base . Certains sont PP d'une seule base. Par exemple
pmod(2,340,341)
pmod(3,340,341);
Ainsi, nous pouvons multiplier les bases pour éliminer les candidats. Malheureusement, il existe encore une infinité de nombres qui sont PP dans toutes les bases ,tout en étant composés :
Pour se donner un ordre de grandeur, il y a un peu plus d'un million de nombres premiers inférieurs à 25 milliards, mais seulement
pseudo premiers et parmi eux
nombres de Carmichael. C'est peu, mais c'est toujours trop !
Malheureusement, les choses se compliquent un peu par la suite et nous devons jeter l'éponge à notre niveau faute d'outils algébriques.
Nous pouvons seulement démontrer quelques lemmes menant à des tests fort puissants mais pour l'instant hors d'atteinte.