Chapitre 2: Nombres premiers

Transcription

Chapitre 2: Nombres premiers
NOMBRES PREMIERS
11
Chapitre 2: Nombres premiers
2.1
Quoi de plus simple qu’un nombre premier ?
Rappel : Un entier naturel est dit premier s’il est supérieur ou égal à 2 et
n’est divisible que par 1 et lui-même.
Quoi de plus simple ? : Et pourtant, ils renferment tant de mystères que les plus grands esprits
depuis des siècles n’ont toujours pas réussi à en percer tous les secrets, et
ce malgré les énormes progrès technologiques et les investissements colossaux consentis par les pouvoirs tant civils que militaires pour assurer ou
percer la confidentialité des transmissions de toutes natures qui continue
de dépendre d’une meilleure connaissance des nombres premiers, ce que
nous verrons un peu plus loin.
Qui sont-ils ? Combien sont-ils ? Où sont-ils ? À quoi servent-ils ? Nous
essaierons de donner quelques éléments de réponses à ces questions.
Mais tout d’abord, pourquoi jouent-ils un rôle si important ?
Fondamentalement, il existe deux manières d’engendrer IN :
- si on veut engendrer IN en utilisant l’addition, on s’aperçoit que le
nombre 1 nous suffit : on « fabrique » 2 en additionnant 1 avec
lui-même ; 3 en additionnant 1 avec 2, etc.
- si on veut engendrer IN en utilisant la multiplication, là, les choses
se compliquent. Pour « fabriquer » 2, il faut le créer ; même problème pour 3. On fabrique 4 en multipliant 2 avec lui-même, mais
il faut créer 5. On fabrique 6 en multipliant 3 avec 2. On crée 7.
On fabrique 8 à partir de 2. On fabrique 9 à partir de 3. On fabrique 10 à partir de 2 et 5, etc.
Les nombres que l’on est obligé de créer sont les briques nécessaires à fabriquer tous les autres. C’est bien plus compliqué que
l’addition me direz-vous, mais la multiplication est plus « puissante » et nous permet d’aller bien plus vite et plus loin.
Euclide d’Alexandrie
-325 à -265 av. J.-C.
Les nombres premiers sont donc ces éléments qui nous permettent
de fabriquer tous les autres. Un des premiers problèmes étudiés a
été de savoir s’ils peuvent tenir dans une boîte, comme les légos
dans ma chambre. Euclide à répondu à cette question il y a vingttrois siècles et la réponse est non.
Pour le prouver, nous aurons besoin d’un résultat intermédiaire :
Propriété 1 : Tout entier naturel n admet au moins un diviseur premier.
En effet, soit n est premier et il est divisible par lui-même, soit n n’est pas
premier et il admet un certain nombre de diviseurs. Appelons p le plus petit
de ces diviseurs. p est premier, car sinon p aurait un diviseur d, plus petit
que p, et qui diviserait n.
3OCmath – Jt 2015
12
NOMBRES PREMIERS
Théorème : Il y a une infinité de nombres premiers.
Raisonnons par l’absurde et supposons qu’il existe exactement n nombres
premiers qu’on nommera p1, p2, …, pn. Appelons N le nombre
N = (p1 · p2 · … · pn) + 1
Il est plus grand que tous les pi, donc il n’est pas premier. Donc, il admet
un diviseur premier p qui est un des pi, puisqu’il n’y a qu’eux. Ainsi
p divise N = p1 ⋅ p2 ⋅…⋅ pn + 1 ⎫
⎬ ⇒ p divise N − p1 ⋅ p2 ⋅…⋅ pn = 1
p divise
p1 ⋅ p2 ⋅…⋅ pn
⎭
Donc p = 1 ce qui est absurde puisqu’il est premier. Ainsi, cette contradiction nous assure qu’il ne peut exister de plus grand nombre premier. Il y a
donc une infinité et l’aventure ne fait que commencer.
Quelques records : • Le 4 février 2005, par exemple, Martin Nowak a battu le record du
plus grand nombre premier : 225 964 951 – 1 en faisant travailler plus
de 50 jours durant un Pentium 4 2,4 GHz. Cette découverte s'est
faite dans le cadre du programme GIMPS1 de recherche de grand
nombre. Novak est un chasseur de grand nombre et ophtalmologiste allemand à ses heures perdues ;-).
• Le GIMPS a pu remporter le 23 août 2008, la première récompense de 100’000 USD offerte par l'Electronic Frontier Foundation pour la découverte du premier nombre premier de plus de dix
millions de chiffres (243'112'609 – 1). Les règles de répartition de la récompense sont prévues par le GIMPS : l'internaute qui trouve le
nombre, le GIMPS, des œuvres caritatives et les autres internautes
qui participent au GIMPS et trouvent des nombres premiers.
• L'Electronic Frontier Foundation offre d'autres récompenses de
100’000, 150’000 et de 250’000 USD pour, respectivement, la découverte de nombres premiers de plus de dix millions, cent millions et un milliard de chiffres. À bon entendeur !!!
• L’actuel plus grand nombre premier, découvert en 2013 a nécessité plus de 37 jours de calculs informatiques. Grâce à lui, c’est la
troisième fois que le mathématicien Curtis Cooper découvre un
nombre premier supérieur au précédent.
Curtis Cooper
Mathématicien américain
• Records actuels :
257'885'161 – 1 formé de 17'425'170 chiffres (25.1.2013)
243'112'609 – 1 formé de 12'978'189 chiffres (23.8.2008)
242'156'667 – 1 formé de 12'837'064 chiffres (12.4.2009
1
Great Internet Mersenne Prime Search est un projet de calcul partagé où les volontaires utilisent un
logiciel pour chercher les nombres premiers de Mersenne de la forme 2p – 1, avec p premier.
3OCmath – Jt 2015
NOMBRES PREMIERS
Exercice 2.1 :
13
2·3+1=…
2·3·5+1=…
2·3·5·7+1=…
2 · 3 · 5 · 7 · 11 + 1 = … etc …
a) Peut-on affirmer que le résultat de ces calculs est forcément un
nombre premier ?
b) Considérons : 2 · 3 · 5 · 7 · 11 · 13 + 1
• Justifier qu’il n’est pas divisible par 2, 3, 5, 7, 11, 13
• Mais n’est-il pas divisible par un autre nombre premier ? (à
tester à la calculatrice)
Exercice 2.2 :
Démontrer que la proposition suivante est fausse:
"pour tout n ∈ IN, n2 – n + 41 est premier"
Indication : Pour démontrer qu’une proposition est fausse, il suffit de trouver un contreexemple, c’est-à-dire une valeur de n, ne vérifiant pas la proposition.
Exercice 2.3 :
a) Écrire le pseudo-code premier permettant de tester si un nombre
est premier.
Indication : Dans la remarque, en bas de page 5, nous avons déjà défini la fonction très
utile ici :
a mod b
qui donne le reste de la division de a par b.
Ainsi 5 est un nombre premier car :
5 mod 2, 5 mod 3, 5 mod 4 sont toujours différents de 0.
b) Vérifier votre pseudo-code "à la main" pour les nombres 6 et 7.
c) Programmer-le en MuPAD puis contrôler que la réponse de
premier(1321)
donne bien :
"Oui"
3OCmath – Jt 2015
14
2.2
NOMBRES PREMIERS
Test de primalité d’un nombre
Il est facile de vérifier de tête que 7, 13 ou 31 sont des nombres premiers. Quelle méthode adopter pour montrer que 1321 est premier ?
Premier algorithme : Essayer toutes les divisions de 1321 par D, pour D allant de 2 à
1320. Si aucune division ne tombe juste, alors on peut affirmer que
1321 est premier.
C’est probablement l’algorithme que vous avez proposé dans
l’exercice précédent.
premier1:=proc(n)
begin
test:=0:
for i from 2 to n-1 do
if n mod i = 0 then test:=1
end_if
end_for:
if test=0 then print(expr2text(n). " est premier" ):
else print(expr2text(n). " n’est pas premier"):
end_if:
end_proc:
premier1(1321)
et on obtient
"1321 est premier"
Cet algorithme peut être optimisé. Proposer 1319 calculs lorsque 36
peuvent suffire…
2ème démarche :
diviseur
quotient
2
660,5
3
440,3
4
330,3
5
264,2
6
220,2
7
188,7
8
165,1
9
146,8
10
132,1
diviseur
quotient
11
120,1
12
110,1
13
101,6
14
94,36
15
88,07
16
82,56
17
77,71
18
73,39
19
69,53
diviseur
quotient
20
66,05
21
62,90
22
60,05
23
57,43
24
55,04
25
52,84
26
50,81
27
48,93
28
47,18
diviseur
quotient
29
45,55
30
44,03
31
42,61
32
41,28
33
40,03
34
38,85
35
37,74
36
36,69
37
35,70
Le tableau semble incomplet : il resterait encore à essayer les quotients de 38 à 1320, mais cela est-il vraiment nécessaire ?
Nous observons qu’à partir de 37, les quotients sont plus petits que les
diviseurs. Aucun de ces quotients pour un diviseur supérieur à 37 ne
peut être entier puisque cela signifierait que 1321 était déjà divisible
par ce quotient. Mais aucune division par un nombre inférieur à 37 n’a
donné de quotient entier. D’où la simplification suivante :
3OCmath – Jt 2015
NOMBRES PREMIERS
15
Deuxième algorithme: Essayer2 toutes les divisions de 1321 par D, pour D allant de 2 à
[
]
1321 + 1.
Ainsi donc, nous sommes passés de 1320 divisions à 36 divisions. Ceci est un gain appréciable de temps.
Exercice 2.4 :
Traduire ce deuxième algorithme en nouveau pseudo-code, puis proposer une procédure MuPAD dont le nom est premier2.
Indication : Dans MuPAD, la fonction correspondante à
Exercice 2.5 :
n s’écrit sqrt(n).
En utilisant la procédure précédente, contrôler les affirmations au
sujet de la formule d’Euler : f (n) = n2 – n + 41
a) f (2), f (40) sont premiers, mais f (41), f (42) ne le sont pas.
b) Pour n ∈ [0 ; 100], la formule d’Euler fournit dans près de 86%
des cas un nombre premier.
c) Parmi les nombres n ∈ [0 ; 100], lesquels ne fournissent pas un
nombre premier ?
Troisième algorithme: Mais, on peut encore améliorer la méthode en essayant que les divi-
sions par les nombres premiers inférieurs à
[
]
1321 + 1, à condition
de disposer d’une liste des nombres premiers. Si vous avez une telle
liste jusqu’à 1000, cela permet de tester rapidement si un nombre
inférieur à 10002 est premier.
2
[n] est un codage exprimant la partie entière du nombre réel n et correspondant à l'entier qui lui est immédiatement inférieur ou égal. La fonction correspondante en MuPAD est floor().
3OCmath – Jt 2015
16
2.3
NOMBRES PREMIERS
Le crible d’Eratosthène
Comment créer une liste des nombres premiers ?
Le principe est ancien puisqu’il est attribué au grec Ératosthène3
On écrit les entiers de 2 à n puis on barre les multiples des nombres
premiers inférieurs à n . Les entiers restants sont premiers.
1
11
21
31
41
51
61
71
81
91
2
12
22
32
42
52
62
72
82
92
3
13
23
33
43
53
63
73
83
93
4
14
24
34
44
54
64
74
84
94
5
15
25
35
45
55
65
75
85
95
6
16
26
36
46
56
66
76
86
96
7
17
27
37
47
57
67
77
87
97
8
18
28
38
48
58
68
78
88
98
9
19
29
39
49
59
69
79
89
99
10
20
30
40
50
60
70
80
90
100
La méthode peut paraître efficace, mais elle devient inutilisable pour
une table de nombres premiers allant jusqu’à 10'000'000 par exemple.
On peut alors utiliser la procédure ci-dessous :
Erato:=proc(n)
begin
L:= []: // On crée une liste vide prévue pour les nombres à tester
for i from 1 to n do
L:=L.[1]: // ces nombres valent tous 1 au départ
end_for:
L[1]:=0:
// 1 n’est pas premier donc on le "raye" en lui associant 0
for y from 2 to floor(sqrt(n)) do
// on teste jusqu’à racine(n)
//(floor = partie entière)
ème
if(L[y]=1) then
// si le y
nombre n’est pas barré
for i from 2 to floor(n/y) do
L[i*y]:=0:
// on barre tous ses multiples
end_for:
end_if:
end_for:
P:=[ ]:
//on crée une liste vide
for i from 1 to n do
if(L[i]=1) then P:= P.[i]: // on ajoute tous les entiers non barrés
end_if:
end_for:
print(P): // on affiche la liste des entiers restants : ils sont premiers
end_proc:
3
Né 276 années avant J.C., directeur de la Bibliothèque d’Alexandrie, on lui doit aussi une approximation du
diamètre de la Terre. Devenu aveugle, il s’est laissé mourir de faim...
3OCmath – Jt 2015
NOMBRES PREMIERS
17
et on obtient :
Erato(100)
[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]
Exercice 2.6 :
Après avoir téléchargé le fichier Erato.mn sur www.javmath.ch, utilisez-la pour générer la liste des nombres premiers :
a) plus petits ou égaux à 1'000
b) plus petits ou égaux à 100'000
c) plus petits ou égaux à 100'000'000
Si vous perdez patience, vous pouvez interrompre le déroulement d’un programme
en utilisant la commande Stop du menu Notebook.
Exercice 2.7 :
Afin de bien décoder la procédure Erato, écrire le pseudo-code correspondant.
Théorème : Tout entier n supérieur à 2 admet une et une seule (à l’ordre près des
termes) décomposition en produit fini de nombres premiers.
Par exemple, 150 = 2 · 3 · 52, les facteurs premiers ne sont pas forcément
distincts. On a alors l’habitude d’écrire la décomposition sous la forme :
n = p1α1 ⋅ p2α 2 ⋅… ⋅ pnα n
Nous ne démontrons pas ce théorème, par contre, nous pouvons utiliser la procédure Erato mise au point précédemment pour décomposer
un nombre « informatiquement ». Cette procédure est téléchargeable
sur www.javmath.ch sous le nom Decomp.mn.
Decomp:=proc(n)
begin
M:=[]:
// On crée une liste vide
Erato(n):
// Liste des nbres premiers ≤ n (procédure Erato)
k:=nops(P): // nbre d’éléments de la liste créée par Erato
for j from 1 to k do
ème
while n mod P[j]=0 do
// tant que n divisible par le j
M:=M.[P[j]]:
n:=n/P[j]:
end_while:
end_for:
print(M):
end_proc:
et on obtient
Decomp(12200)
[2, 2, 2, 5, 5, 61]
3OCmath – Jt 2015
// élément de la liste P
// on ajoute à M ce diviseur premier
// on divise n par ce diviseur premier
// on affiche la liste des diviseurs premiers
18
NOMBRES PREMIERS
Pour être honnête, il existe la fonction factor qui donne directement la
décomposition d’un nombre en facteurs premiers.
factor(12200)
23 · 52 · 61
Exercice 2.8 :
Afin de bien décoder la procédure Decomp, écrire le pseudo-code
correspondant puis tester-le "à la main" avec quelques valeurs.
Exercice 2.9 :
À l’aide du pseudo-code que vous avez proposé dans l’exercice précédent, reconstituez la procédure Decomp et testez-la sur MuPAD.
Exercice 2.10 :
Vérifier que 2'027'651'281 n’est pas un nombre premier.
Factorisez-le avec: • avec la procédure Decomp;
• avec la fonction factor proposée par MuPAD.
Remarque : Vous avez dû constater que toutes les procédures proposées pour
factoriser en nombres premiers ou déterminer des nombres premiers
sont rapides au début, mais deviennent de plus en plus lente. Toutes
ces méthodes deviennent donc inefficaces avec des nombres très
grands. Estimons par exemple le nombre de divisions à effectuer
pour tester 267 – 1, qui vaut approximativement 1,47 · 1020, c’est-àdire qui s’écrit avec 21 chiffres. Sa racine carrée vaut approximativement 12'000'000'000. Il faudra donc un peu plus de 12 milliards de
divisions, certaines à dix chiffres ! Bon courage !
(F. Cole a calculé en 1903 que 267 – 1 = 193707721 · 761838257287)
Une commande bien MuPAD propose une procédure isprime(…), qui permet de contrôler
pratique : si un nombre est premier, même s’il est grand. Mais comment fonctionne-t-elle ?
2.3
Pour aller un peu plus loin
Les exercices suivants sont à réaliser en effectuant un programme sur
MuPAD après avoir écrit le pseudo-code.
Exercice 2.11 :
On appelle Fer(n) le nième nombre de Fermat qui se calcule à l’aide
de :
Fer(n) = 2 2 + 1
n
Pierre de Fermat (1601 – 1665) pensait que Fer(n) était premier pour
tout n.
Pierre de Fermat
1601-1665
Exercice Défi :
Utiliser MuPad pour montrer qu’il se trompait.
On pose A = 101! + 1. Montrer que les 100 nombres consécutifs
A + 1, A + 2, …, A +100 ne sont pas premiers.
Pouvez-vous trouver, à l’aide de MuPAD, la plus petite série de 100
nombres consécutifs dont aucun n’est premier ?
3OCmath – Jt 2015
NOMBRES PREMIERS
3OCmath – Jt 2015
19
20
NOMBRES PREMIERS
3OCmath – Jt 2015