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 : ‚ si on veut engendrer 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 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 Legos dans la chambre d’un enfant. Euclide a répondu à cette question il y a vingt-trois siècles et la réponse est non. Pour le prouver, nous aurons besoin d’un résultat intermédiaire : 13 14 CHAPITRE 2. NOMBRES PREMIERS Proposition: Tout entier naturel n admet au moins un diviseur premier. Preuve: 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. Théorème: Il y a une infinité de nombres premiers. Preuve: Raisonnons par l’absurde et supposons qu’il existe exactement n nombres premiers qu’on nommera p1 , p2 , . . ., pn . Appelons N le nombre N “ pp1 ¨ p2 ¨ . . . ¨ pn q ` 1 Il est plus grand que tous les pi , donc il n’est pas premier. Ainsi, il admet un diviseur premier p qui est un des pi , puisqu’il n’y a qu’eux. Nous avons alors : * p divise N “ p1 ¨ p2 ¨ . . . ¨ pn ` 1 ùñ p divise N ´p1 ¨. . .¨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, Martin Nowak a battu le record du plus 1 1 grand nombre premier connu alors : 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 GIMPS 1 de recherche de grand nombre. Nowak 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 1 1 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 oeuvres 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 ! ! ! 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. CHAPITRE 2. NOMBRES PREMIERS 15 ‚ L’actuel plus grand nombre premier connu : 274 207 281 ´ 1 1 Curtis Cooper Mathématicien américain Exercice 2.1 1 formé de 22’338’618 chiffres fut découvert le 17 septembre 2015. Un bug ayant empêché le logiciel d’envoyer l’e-mail alertant de la découverte, ce n’est que le 7 janvier 2016, après une maintenance de routine, que le record a pu être officialisé. Grâce à lui, c’est la quatrième fois que le mathématicien Curtis Cooper découvre un nombre premier supérieur au précédent. 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 au moins un autre nombre premier ? (à tester à la calculatrice) Exercice 2.2 Démontrer que la proposition suivante est fausse : @n P , n2 ´ n ` 41 est un nombre premier Indication : Pour démontrer qu’une proposition est fausse, il suffit de trouver un contre-exemple, c’est-à-dire une valeur (naïve ?) de n, ne vérifiant pas la proposition. Exercice 2.3 a) Écrire le pseudo-code est_premier permettant de tester si un nombre est premier. Indication : Dans la remarque, en bas de page 8, nous avons déjà défini la fonction 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 SageMath puis contrôler que vous obtenez : est_premier (1321) | True est_premier (1322) | False 16 CHAPITRE 2. NOMBRES PREMIERS 2.2 Test de primalité d’un nombre Question: 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 un algorithme semblable à celui que vous avez proposé dans l’exercice précédent. def est_premier ( p ): if p ==0 or p ==1: return False else : if p ==2: return True else : for k in [2.. p -1]: if p % k ==0: return False return True On obtient alors : est_premier (1321) | True Cet algorithme peut être optimisé. Proposer 1319 calculs lorsque 36 peuvent suffire. . . 2e démarche: Observons les tableaux suivants : diviseur 2 3 4 5 6 7 8 9 10 quotient 660,5 440,3 330,3 264,2 220,2 188,7 165,1 146,8 132,1 diviseur 11 12 13 14 15 16 17 18 19 quotient 120,1 110,1 101,6 94,36 88,07 82,56 77,71 73,39 69,53 diviseur 20 21 22 23 24 25 26 27 28 quotient 66,05 62,90 60,05 57,43 55,04 52,84 50,81 48,93 47,18 diviseur 29 30 31 32 33 34 35 36 37 quotient 45,55 44,03 42,61 41,28 40,03 38,85 37,74 36,69 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 : CHAPITRE 2. NOMBRES PREMIERS 17 2 Deuxième algorithme: Essayer “? ‰ 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 un nouveau pseudo-code, puis proposer une fonction SageMath dont le nom est est_premier2. ? Indication : la fonction correspondante à n s’écrit sqrt(n). Exercice 2.5 Leonard Euler proposa une formule permettant de générer une multitude de nombres premiers : f pnq “ n2 ´ n ` 41 nP a) Proposer une fonction euler(n) qui, appelant la fonction est_premier2(n), permet de vérifier la formule d’Euler pour la valeur de n proposée. b) Vérifier que f p2q, f p40q sont premiers, mais f p41q, f p42q ne le sont pas. En modifiant votre fonction : Leonard Euler (1601-1665) c) Montrer que pour n P r0 ; 100s, la formule d’Euler fournit dans près de 86% des cas un nombre premier. d) Parmi les nombres n P r0 ; 100s, lesquels ne fournissent pas un nombre premier ? Troisième algorithme: On peut encore améliorer la méthode en “?essayant ‰ que les divisions 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. Observons ceci à la page suivante. 2. rns 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 Python est int(). 18 2.3 CHAPITRE 2. NOMBRES PREMIERS Le crible d’Ératosthène Comment créer une liste des nombres premiers ? Le principe est ancien puisqu’il est attribué au grec Ératosthène 3 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 à la main, mais elle devient inutilisable pour une table de nombres premiers allant jusqu’à 10’000 (par exemple). On peut alors utiliser la procédure SageMath ci-dessous : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 def crible ( n ) : L = [0.. n ] L [1] = 0 # L [1]=0 , car 1 n ’ est pas un nombre premier i = 2 # on commence avec le nombre i =2 while i <= n : j = i + i while j <= n : L[j] = 0 # multiples de i remplace par 0 j = j + i i = i + 1 # considerer le nombre i suivant while i < n and L [ i ] == 0 : # tant qu ’ il est nul i = i + 1 # passer au suivant M = [] # liste vide qui contiendra les nbres premiers for j in [0.. n ]: if L [ j ] <> 0: # si le nombre est pas nul M = M + [ L [ j ]] # l ’ ajouter a la liste return M 3. Né 276 années av. 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... CHAPITRE 2. NOMBRES PREMIERS 19 et on obtient : crible (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 crible.sagews sur www.javmath.ch, importer ce fichier sur votre environnement et utilisez-le 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’une fonction (d’une procédure) en utilisant la commande ⌅ Stop du menu situé en haut de la page web ou en rechargeant la page avec Exercice 2.7 Théorème: Restart . Afin de bien décoder la fonction crible, écrire le pseudo-code correspondant. Tester votre pseudo-code pour n “ 7 en observant le contenu de la liste L en cours de calculs. 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 “ p–1 1 ¨ p–2 2 ¨ . . . ¨ p–nn Nous ne démontrons pas ce théorème, par contre, nous pouvons utiliser la fonction crible mise au point précédemment pour décomposer un nombre « informatiquement ». Cette fonction est téléchargeable sur www.javmath.ch sous le nom Decomp.sagews. def decomp ( n ): Div = [] P = crible ( n ) # P contient la liste des nbres prem . <= n for j in [0.. len ( P ) -1]: while n % P [ j ]==0: # tant que n divisible par l ’ element j de P Div = Div + [ P [ j ]] # on ajoute a Div ce div . premier n = n / P[j] # on divise n par ce div . premier return Div 20 CHAPITRE 2. NOMBRES PREMIERS et on obtient : decomp (12200) | [2 , 2 , 2 , 5 , 5 , 61] Pour être honnête, il existe la fonction factor qui donne directement la décomposition d’un nombre en facteurs premiers. factor (12200) | 2^3 * 5^2 * 61 Exercice 2.8 Afin de bien décoder la fonction decomp, écrire le pseudo-code correspondant puis testez-le “à la main” avec quelques valeurs. Exercice 2.9 a) À l’aide du pseudo-code que vous avez proposé dans l’exercice précédent, reconstituez la fonction decomp et testez-la sur SageMath. b) 168’399 n’étant pas un nombre premier, factorisez-le avec avec votre fonction decomp puis avec la fonction factor proposée par SageMath. Remarque: Vous avez dû constater que toutes les fonctions proposées pour factoriser en nombres premiers ou déterminer des nombres premiers sont rapides au début, mais deviennent inefficaces avec des grands nombres. Estimons le nombre de divisions à effectuer pour tester 267 ´ 1, qui vaut approximativement 1,47 ¨ 1020 . On constate qu’il 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 nouvelle commande: SageMath propose une fonction is_prime(. . .), qui permet de contrôler si un nombre est premier, et ceci même s’il est grand. is_prime (2^67 -1) | False N’hésitez pas à l’utiliser pour les exercices qui suivent. Exercice 2.10 Vérifier que 2’027’651’281 n’est pas un nombre premier. Factorisez-le. CHAPITRE 2. NOMBRES PREMIERS Exercice 2.11 21 À quoi correspond la fonction suivante ? def mystere ( n ): Liste =[] i =2 while len ( Liste ) < n : if is_prime ( i ): Liste = Liste + [ i ] i = i + 1 return Liste 2.4 Pour aller un peu plus loin Les exercices suivants sont à réaliser en effectuant une ou plusieurs fonctions sur SageMath après avoir écrit et contrôlé votre pseudocode. Exercice 2.12 On appelle F erpnq le ne nombre de Fermat qui se calcule à l’aide de : n F erpnq “ 22 ` 1 Pierre de Fermat, mathématicien français, pensait que F erpnq était premier pour tout n P . Montrer qu’il se trompait. Pierre de Fermat (1601-1665) Exercice 2.13 Dans un inédit de Marcel Pagnol, celui-ci affirme que le nombre : N “ n ` pn ` 2q ` npn ` 2q est premier si n est impair. Qu’en pensez-vous ? Exercice 2.14 Est-il possible de trouver un nombre premier p tel que p ` 100 et p ` 200 soient aussi premiers ? Exercice 2.15 On pose A “ 101! ` 1. a) Montrer que les 100 nombres consécutifs A ` 1, A ` 2, . . ., A ` 100 ne sont pas premiers. b) Pouvez-vous trouver, à l’aide de SageMath, la plus petite série de 100 nombres consécutifs dont aucun n’est premier ? 22 CHAPITRE 2. NOMBRES PREMIERS Exercice 2.16 Pour tout entier naturel n, on pose Mn “ 2n ´ 1 appelé nombres de Mersenne en l’honneur de l’abbé Marin Mersenne. Celui-ci est l’auteur de la proposition suivante : Si Mn est premier alors n aussi Marin Mersenne (1601-1665) qu’il aurait par ailleurs démontrée. Il fournit également une liste des nombres premiers « de Mersenne » jusqu’à l’exposant 257, qui se révélera fausse : elle incluait par erreur 67 et 257, et omettait 61, 89 et 1077. À l’aide de SageMath : a) Établir la liste des entiers 1 § n § 1000 pour lesquels Mn est premier. b) Montrer que si n n’est pas premier alors Mn non plus. c) Que peut-on alors en déduire ? d) Calculer M67 . Est-il premier ? (Ce résultat fut obtenu en 1903 par Nelson Cole après 20 ans de travail à la main.) e) La proposition suivante : Si n est premier alors Mn aussi. est-elle exacte ? Voici encore quelques informations à propos des premiers de Mersenne : ‚ Le 8e nombre de Mersenne premier a été découvert en 1772 par Euler. ‚ La liste des 12 premiers nombres de Mersenne premiers a été définitivement établie en 1947. ‚ L’arrivée des ordinateurs a permis d’accélérer les découvertes. Comme déjà mentionné, le record actuel est établi avec le nombre M74207281 . Vous pouvez télécharger un fichier contenant les chiffres de ce nombre sur http://www.mersenne.org. Ne vous avisez pas d’imprimer ce fichier, car il vous faudrait près de 6’000 pages entièrement remplies.