Éléments de réponses: Chapitre 1
Transcription
Éléments de réponses: Chapitre 1
ELEMENTS DE REPONSES 1 Éléments de réponses: Chapitre 1 Exercice 1.1 : 2 Exercice 1.4 : sommemod:=proc(n) begin p:=0: for k from 2 to 10 do p:=p+1/(k^2+k): end_for: print(p): end_proc 815915283247897734345611269596115894272000000000 factorielle(100) 9332621544394415268169923885626670049071596 (…) Vous avez dû obtenir : Exercice 1.5 : 1 2 6 24 120 720 5040 Exercice 1.3 : a) 924 b) 9/22 dont voici le programme MuPAD : Vous avez dû obtenir : factorielle(40) Exercice 1.2 : ELEMENTS DE REPONSES a) Il s’agit d’un autre algorithme permettant de calculer n! b) Le programme MuPAD : mystere:=proc(n) begin p:=1: k:=1: while k < n+1 do p:=p*k: k:=k+1: end_while: print(p): end_proc Le pseudo-code : ← ← Remarque : On peut également proposer en 5ème ligne : while k <= n do Le programme MuPAD: sommecarre:=proc(n) begin p:=0: for k from 1 to n do p:=p+k^2: end_for: print(p): end_proc 3OCmath – Jt 2015 Exercice 1.6 : a) À la suite de la procédure récursive factorielle, proposer le calcul : factorielle(9)/(factorielle(3)*factorielle(6)) b) Il s’agit d’un calcul de dénombrement que l’on écrit souvent sous la forme C39 permettant de calculer (par exemple) le nombre de tickets gagnants pour un tiercé à 9 chevaux. 3OCmath – Jt 2015 ELEMENTS DE REPONSES Exercice 1.7 : 3 a) Cet algorithme permet d’obtenir le quotient et le reste de la division de 142 par 6. 4 Exercice 1.9 : a) Le pseudo-code : ← ← b) Programmation en MuPAD : b) Programmation en MuPAD : newmystere:=proc(n) begin p:=6: j:=0: while n>=p do n:=n-p: j:=j+1: end_while: print(j): print(n): end_proc Exercice 1.8 : ELEMENTS DE REPONSES pirate:=proc(n) begin u:=3: for k from 1 to n do u:=u-tan(u): print(float(u)): end_for: end_proc a) Il permet de calculer la racine carrée de nombres par approximations successives. b) Programmation en MuPAD : heron:=proc(n) begin a:=0: b:=n: j:=6: for i from 1 to j do a:=(a+b)/2: b:=n/a: end_for: print(float((a+b)/2)) end_proc c) heron:=proc(n) begin a:=0: b:=n: j:=6: for i from 1 to j do a:=(a+b)/2: b:=n/a: print("étape:".expr2text(i)." racine de".expr2text(n)." = " .expr2text(float(a+b)/2)) end_for: end_proc On obtient des approximations successives de π. Et si vous modifiez cette programmation afin d’obtenir les 100 premières décimales de π. Exercice 1.10 : Programmation en MuPAD : syracuse:=proc(n) begin for k from 1 to 50 do if n mod 2 =0 then n:=n/2: else n:=3*n+1: end_if: print("u(".expr2text(k).")= ".expr2text(n)): end_for: end_proc Et vous obtiendrez : "u(1) = 370" "u(2) = 185" …… "u(49) = 1" "u(50) = 4" L’algorithme proposé dans cet exercice s’appelle la méthode de Héron et permet ainsi de calculer par approximations successives la racine carrée de nombres. Elle porte le nom du mathématicien babylonien Héron d’Alexandrie (1er siècle après J-C.) 3OCmath – Jt 2015 3OCmath – Jt 2015 ELEMENTS DE REPONSES Exercice 1.12 : 5 6 ELEMENTS DE REPONSES Vous obtiendrez par exemple: [1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2] [2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4] [3, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4] ……… [10, 5, 16, 8, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2] [11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1] [999, 2998, 1499, 4498, 2249, 6748, 3374, 1687, 5062, 2531, 7594, 3797, 11392, 5696, 2848, 1424, 712, 356, 178, 89, 268, 134, 67, 202, 101, 304, 152, 76, 38, 19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4] [1000, 500, 250, 125, 376, 188, 94, 47, 142, 71, 214, 107, 322, 161, 484, 242, 121, 364, 182, 91, 274, 137, 412, 206, 103, 310, 155, 466, 233, 700, 350, 175, 526, 263, 790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167, 502, 251, 754, 377, 1132, 566] mais qu’en est-il si on continue ?? 3OCmath – Jt 2015 3OCmath – Jt 2015 ELEMENTS DE REPONSES 7 Éléments de réponses: Chapitre 2 Exercice 2.1 : 8 Exercice 2.4 : • On ne peut par contre pas exclure que ce nombre puisse être composé de nombres premiers plus grands que 13. Et ici 30'031 = 59 · 509. En traduisant ce pseudo-code dans le langage utilisé par MuPAD : Pour aller un petit peu plus loin dans cet exercice : Supposons que nous connaissions comme nombres premiers les seuls nombres 2, 3 et 5. Le procédé nous permet de calculer le nombre 2 · 3 · 5 + 1 = 31 qui est premier. On trouve d’autres nombres premiers en répétant le processus : 2 · 3 · 5 · 31 + 1 = 931. Le nombre obtenu est cette fois composé : 931 = 72 · 19 et les facteurs 7 et 19 sont premiers. Notre liste est alors 2, 3, 5, 7, 19 et 31, et l’on peut recommencer autant de fois que l’on veut. Va-t-on ainsi pouvoir générer la liste de tous les nombres premiers ? Dans l’état des connaissances actuelles, on ne sait pas si cette liste contient effectivement tous les nombres premiers. n = 41 nous fournit un contre-exemple, car n2 – n + 41 sera alors forcément un multiple de 41. Exercice 2.3 : Le pseudo-code : ← ← En traduisant ce pseudo-code dans le langage utilisé par MuPAD : premier :=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("Oui" ) : end_if: end_proc Qu’affiche cette procédure si on lui demande de tester le nombre 34 ? Comment l’expliquez-vous ? 3OCmath – Jt 2015 Le pseudo-code : ← ⎡ ⎤ ⎢ ⎥ + ⎣ ⎦ ← a) Non. b) • On peut affirmer que le nombre 30'031 = 2 · 3 · 5 · 7 · 11 · 13 + 1 ne contient pas dans sa décomposition en nombres premiers les nombres 2, 3, 5, 7, 11, 13 en reproduisant le raisonnement du théorème précédent. Exercice 2.2 : ELEMENTS DE REPONSES premier2:=proc(n) begin test:=0: for i from 2 to floor(sqrt(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: et on obtient premier2(1321) "1321 est premier" Exercice 2.5 : a) On peut, par exemple, définir une procédure euler1 qui va calculer le nième nombre d’Euler puis appeler la procédure premier2 pour qu’il teste si le nombre obtenu est premier. euler1:=proc(m) begin n:= m^2-m+41 : premier2(n) : end_proc: b) À l’aide d’une boucle, on peut tester les valeurs de p de 0 jusqu’à 100. euler2:=proc(p) begin for m from 0 to p do n:= m^2-m+41 : premier2(n) : end_for : end_proc: 3OCmath – Jt 2015 ELEMENTS DE REPONSES 9 10 c) En modifiant vos procédures : Dans la procédure premier2(n) : ne plus faire afficher de phrase. Dans la procédure euler2(p) : créer une liste L, y ajouter progressivement les valeurs de m dont le test de premier2 vaut 0. Enfin, faire afficher la liste L et faire afficher le nombre d’éléments à l’aide de la commande nops(L). Vous obtiendrez : Exercice 2.8 : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 46, 47, 48, 49, 51, 52, 53, 54, 55, 56, 58, 59, 60, 61, 62, 63, 64, 65, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 78, 79, 80, 81, 84, 86, 87, 89, 91, 93, 94, 95, 96, 98, 99, 100] Exercice 2.9 : a) Il y en a 168. b) Il y en a 9'592. c) Vous avez perdu patience ?? On peut tenter d’approximer le nombre de nombres premiers à l’aide de la loi de raréfaction des nombres premiers qui affirme que le nombre des premiers entre 1 et n est approximativement égal à Exercice 2.10 : À comparer avec Decomp(n) proposé en page 17. 2'027'651'281 = 44'021 · 46'061. Pierre de Fermat a réussi à obtenir cette factorisation en 1643. Ce résultat, qui est déjà impressionnant pour un ordinateur, l’est encore plus pour Fermat ! Exercice 2.11 : n , ce qui donne ici environ: 5'428'681. ln(n) Vous obtiendrez : "Fer(0)=3 est premier" "Fer(1)=5 est premier" "Fer(2)=17 est premier" "Fer(3)=257 est premier" "Fer(4)=65537 est premier" "Fer(5)=4294967297 n'est pas premier" "Fer(6)=18446744073709551617 n'est pas premier" Avec de la patience…, vous auriez obtenu exactement 5'761'455. Exercice 2.7 : Le pseudo-code : ← ← ← 87 valeurs sur les 101 testées qui fournissent un nombre premier. Voici la liste de ces 87 valeurs de n. Exercice 2.6 : ELEMENTS DE REPONSES Le pseudo-code : ← ← ← ← Actuellement, on ne connaît que cinq nombres de Fermat premiers, ceux cités ci-dessus (0 ≤ n ≤ 4). Un exemple possible de programmation MuPAD : fermat:=proc(n) begin for i from 0 to n do k:=2^(2^(i))+1: if isprime(k) then print("Fer(".i.")=".k." est premier"): else print("Fer(".i.")=".k." n'est pas premier") end_if: end_for : end_proc Exercice Défi : Et si on faisait un petit concours: J’attends vos propositions de réponse par mail… ;-) 1 Plus rigoureusement, il s’agirait d’utiliser le terme de cardinalité qui exprime, en mathématiques, le nombre d’élément d’un ensemble. Ici donc : ← 3OCmath – Jt 2015 3OCmath – Jt 2015 ELEMENTS DE REPONSES 11 Éléments de réponses: Chapitre 3 Ex Intro 1 : 12 Exercice 3.6 : 365 = 7 · 52 + 1 Ainsi donc, la date du 6 décembre est décalée d’un jour par année. Les réponses commentées se trouvent en page 27 du polycopié. Ex Intro 3 : Il faut imaginer la partie « à l’envers ». Quelle doit être la configuration pour être sûr de gagner au prochain coup ? et on remonte ainsi chronologiquement jusqu’à la position de départ. (utilisez des allumettes pour vous convaincre de cette stratégie) Exercice 3.1 : • Oui 17 ≡ 5 (mod 6) car 17 = 2 · 6 + 5 5 =0·6+5 b) On peut proposer, par exemple, cette procédure : equation:=proc(i) begin print("Il y a des solutions en") : for n from 1 to 100 do a:=i^n mod 7: b:=n^i mod 7: if a = b then print("n = ".n." les 2 étant congrus à ".a." (mod 7)"): end_if: end_for: end_proc En 2009, le 6 décembre sera un dimanche et en 2010, un lundi. Sans tenir compte des années bissextiles, on constate que Ex Intro 2 : ELEMENTS DE REPONSES Elle permet de se convaincre que n doit probablement être un multiple de 3 et non multiple de 7. Exercice 3.7 : • Non 24 14 (mod 6) car 24 = 4 · 6 + 0 14 = 2 · 6 + 2 Exercice 3.2 : Tous les entiers sont coloriés selon la séquence : "Toi aussi, mon fils !", ou les derniers mots de César mourant, criant à Brutus, qu'il aimait comme son propre fils, sa douloureuse surprise de le voir parmi ses assassins : quoi de plus connu ? Si connu, en fait, que nombre d'entre nous sont encore capables de le dire en latin : tu quoque, fili mi... … – rouge – bleu – vert – rouge – bleu – vert – rouge – … On partitionne ainsi les entiers en 3 familles : {…, -4, -1, 2, 5, …} ; {…, -3, 0, 3, 6, …} ; {…, -2, 1, 4, 7, …} Ce résultat se généralise quelque soit n l’entier modulo. Exercice 3.3 : Image by John Leech, from: The Comic History of Rome Par exemple, observons la situation modulo 3 : Exercice 3.8 : Lors d’une division par n, le reste de celle-ci est forcément un nombre compris entre 0 et n – 1. Ainsi quelque soit le nombre choisit, il sera congru à un nombre entier compris entre 0 et n – 1. Exercice 3.4 : a) Non car 80 = 4 · 17 + 12 b) Non car 103 = 6 · 17 + 1 c) Oui car -29 = -2 · 17 + 5 d) Non car -122 = -8 · 17 + 14 Exercice 3.5 : a) 1 Exercice 3.6 : a) Il suffit de comparer 18^9 mod 7 et 9^18 mod 7 b) 3 c) 2 ⇒ ⇒ ⇒ ⇒ Exercice 3.9 : 80 ≡ 12 (mod 17) 103 ≡ 1 (mod 17) -29 ≡ 5 (mod 17) -122 ≡ 14 (mod 17) d) 9 AVE CAESAR MORITURI TE SALUTANT Exercice 3.10 : cesar:=proc(phrase) begin chiffre:=numlib::toAscii(phrase): for i from 1 to nops(chiffre) do chiffre[i]:=((chiffre[i]-65)+3 mod 26)+65: end_for: code:=numlib::fromAscii(chiffre): print(code) end_proc cesar("LECRYPTAGEESTLARTDECODERUNMESSAGE") fournira "OHFUBSWDJHHVWODUWGHFRGHUXQPHVVDJH" 3OCmath – Jt 2015 3OCmath – Jt 2015 ELEMENTS DE REPONSES Exercice 3.11 : Exercice 3.12 : 13 "Il est temps de passer à autre chose" 14 Exercice 3.16 : transl:=proc(phrase,k) begin chiffre:=numlib::toAscii(phrase): for i from 1 to nops(chiffre) do chiffre[i]:=((chiffre[i]-65)+k mod 26)+65: end_for: code:=numlib::fromAscii(chiffre): print(code): end_proc Exercice 3.13 : "Les hommes croient en ce qu’ils désirent" (phase attribuée à César) Exercice 3.14 : Pour résoudre cet exercice, vous avez deux possibilités : soit repérer les lettres les plus fréquentes, qui correspondent aux lettres les plus fréquentes de la langue française (E, A puis S), soit tenter une attaque exhaustive, c’est-à-dire essayer toutes les clés, ce qui n’est pas long ici, puisqu’il y en a que 25. Vous obtiendrez pour la clé k = 17 : Exercice 3.17 : c) 7720 ≡ (-1)20 (mod 13) car 77 ≡ -1 (mod 13) Le reste de la division par 13 est de 1. (phase attribuée à César) Exercice 3.16 : le chiffre des unités d’un entier n est le reste de la division de n par 10. 4'5687 ≡ 87 (mod 10) ≡ (64)3 · 8 (mod 10) ≡ 43 · 8 (mod 10) ≡ 4 · 8 (mod 10) ≡ 2 (mod 10) Malgré (ou à cause de) sa simplicité, cette méthode de cryptage fut encore employée par des officiers sudistes pendant la guerre de Sécession et par l'armée russe en 1915 g) Vrai dans les 2 cas, il s’agit d’effectuer deux preuves très semblables à celle de la question précédente. a) 35228 + 84501 ≡ 1228 + (-1)501 (mod 17) ≡ 0 (mod 17) b) 2 · 352009 – 3 · 842010 ≡ 2 · 12009 – 3 · (-1)2010 (mod 17) ≡ 2 – 3 (mod 17) ≡ 16 (mod 17) Exercice 3.19 : a ≡ b (mod n) ⇒ a = k ⋅ n + … ⎫ ⎬ ⇒ a = k ⋅ n + (k'⋅… + …) b ≡ c (mod n) ⇒ b = k'⋅… + … ⎭ a = (… + …) ⋅ n + … ⇒ a ≡ … (mod…) a) 3527 ≡ 027 (mod 7) car 35 ≡ 0 (mod 7) Le reste de la division par 7 est de 0. b) 8935 ≡ 135 (mod 11) car 89 ≡ 1 (mod 11) Le reste de la division par 11 est de 1. "J’aimerais mieux être le premier dans un village que le second à Rome" a) Vrai car 471 – 11 = 460 qui est bien un multiple de 23. b) Faux car 370 – 17 = 353 qui n’est pas un multiple de 13. c) Vrai car 29 – (-121) = 150 qui est bien un multiple de 5. d) Vrai. e) Vrai. (cf. exercice 2) f) Vrai, voici le début de la preuve que je vous laisse compléter : d) 26 = 64 ≡ 4 (mod 5) 176 ≡ 26 (mod 5) ≡ 4 (mod 5) Exercice 3.18 : Exercice 3.15 : ELEMENTS DE REPONSES Le chiffre des unités est donc 2. Impressionnant… non ? Exercice 3.20 : a) x ≡ 3 (mod 5) Exercice 3.21 : l'inverse de 4 (mod 5) est: 4 (mod 5) Exercice 3.22 : Les tables de multiplication: • Pour n = 2 · 0 1 a) 73 + 23'525 ≡ 3 (mod 5) car : 73 ≡ 3 (mod 5) et 23'525 ≡ 0 (mod 5) b) 212 – 414 ≡ 3 (mod 5) car : 212 ≡ 2 (mod 5) et 414 ≡ -1 (mod 5) c) 2'342 · 59 ≡ 3 (mod 5) car : 2'342 ≡ 2 (mod 5) et 59 ≡ 4 (mod 5) 3OCmath – Jt 2015 b) x ≡ 2 (mod 5) • Pour n = 4 0 0 0 · 0 1 2 3 1 0 1 • Pour n = 3 · 0 1 2 0 0 0 0 0 0 0 0 0 1 0 1 2 3 2 0 2 0 2 3 0 3 2 1 1 0 1 2 3 4 5 2 0 2 4 0 2 4 3 0 3 0 3 0 3 4 0 4 2 0 4 2 • Pour n = 6 1 0 1 2 2 0 2 1 · 0 1 2 3 4 5 0 0 0 0 0 0 0 5 0 5 4 3 2 1 3OCmath – Jt 2015 ELEMENTS DE REPONSES Exercice 3.23 : 1) a) x ≡ 0 (mod 3) 15 b) x ≡ 2 (mod 4) c) x ≡ 0 ou x ≡ 3 (mod 6) • 2 · 3 ≡ 0 (mod 6) • 4 · 3 ≡ 0 (mod 6) 4) Il s'agit de la ligne 2 grisée, elle ne contient pas de 1 (inverse modulo) et pas de 3. Pour n = 6, les 3 lignes correspondantes à 2, 3 et 4 sont également "incomplètes". Pour n = 8, les lignes 2, 4 et 6 seront probablement incomplètes. Devinez-vous pourquoi ? Vérifiez-le en constituant le tableau. 5) a) x ≡ 3 (mod 4) c) x ≡ 5 (mod 6) Exercice 3.24 : Exercice 3.25 : 2) a) x ≡ 4 (mod 6) b) x ≡ 3 (mod 6) 3) a) x ≡ 3 (mod 6) b) pas de solution c) x ≡ 2 ou x ≡ 5 (mod 6) 3OCmath – Jt 2015 0 0 0 0 0 1 0 1 2 3 2 0 2 0 2 3 0 3 2 1 · 0 1 2 3 4 5 6 0 0 0 0 0 0 0 0 1 0 1 2 3 4 5 6 2 0 2 4 6 1 3 5 3 0 3 6 2 5 1 4 4 0 4 1 5 2 6 3 5 0 5 3 1 6 4 2 6 0 6 5 4 3 2 1 3 est bien l'inverse de 6 modulo 17 car 6 · 3 = 18 ≡ 1 (mod 17) 6 · x ≡ 9 (mod 17) |·3 3 · 6 · x ≡ 3 · 9 (mod 17) | calculs 1 · x ≡ 27 (mod 17) | calculs x ≡ 10 (mod 17) Exercice 3.26 : · 0 1 2 3 b) pas d'inverse d) pas d'inverse 1) Il s'agit de l'observer dans la table de multiplication correspondante. 2) a) x ≡ 6 (mod 7) b) x ≡ 0 (mod 7) c) x ≡ 4 (mod 7) ELEMENTS DE REPONSES c) x ≡ 4 (mod 6) 2) a) pas de solution !! b) pas de solution !! 3) si n = 4: • 2 · 2 ≡ 0 (mod 4) si n = 6: • 3 · 2 ≡ 0 (mod 6) • 3 · 4 ≡ 0 (mod 6) 16 6 · x ≡ 11 (mod 17) |·3 3 · 6 · x ≡ 3 · 11 (mod 17) | calculs 1 · x ≡ 33 (mod 17) | calculs x ≡ 16 (mod 17) • Table d'addition: + 0 1 2 3 4 5 0 0 1 2 3 4 5 1 1 2 3 4 5 0 2 2 3 4 5 0 1 3 3 4 5 0 1 2 4 4 5 0 1 2 3 5 5 0 1 2 3 4 3OCmath – Jt 2015 ELEMENTS DE REPONSES 17 18 "HVPWDGWINDOVKVIODIVNDHQTGWVDGVIXKXVIV" Éléments de réponses: Chapitre 4 Exercice 4.1 : En effet, Le chiffre correspondant à C est 2. Comme Exercice 4.6 : 2 · 3 + 5 ≡ 11 (mod 26), ce dernier chiffre correspond bien à la lettre L. Exercice 4.2 : ELEMENTS DE REPONSES Dans l’état de nos connaissances en programmation, il n’y a pas d’autres manières que de tenter une attaque exhaustive (appelé aussi attaque par force brute) en testant les 26 · 26 possibilités. Puis de trouver parmi les 676 résultats affichés, celui qui correspond à une phrase cohérente. Il s’agissait de la clé de décryptage a = 3 et b = 21 pour la phrase : a) Cette clé n’est pas bijective (one-to-one en anglais), c’est-à-dire qu’à 2 lettres différentes (par exemple A et N) correspondent une unique lettre de codage (A). Comment pourra-t-on alors définir la fonction réciproque permettant de revenir au message clair ? "BRAVOCENESTPASFACILE" Programme MuPAD : attaque:=proc(phrase) begin for a from 1 to 26 do for b from 1 to 26 do affine(phrase,a,b): print("avec a=".a." et b= ".b): end_for: end_for: end_proc b) Cette clé est bijective, il n’y a pas de risque d’ambiguïté dans la correspondance des lettres en clairs et celles codées. c) À nouveau, cette clé n’est pas bijective. À éviter donc… d) Le tableau de conversion : en clair 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 codé 2 12 22 6 16 0 10 20 4 14 24 8 18 2 12 22 6 16 0 10 20 4 14 24 8 18 En MuPAD : tableau:=proc(a,b) begin M:=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]: for i from 1 to nops(M) do M[i]:=a*M[i]+b mod 26: end_for: print(M): end_proc e) a ∈ {1 ; 3 ; 5 ; 7 ; 9 ; 11 ; 15 ; 17 ; 19 ; 21 ; 23 ; 25}. Contrairement aux autres, ces 12 nombres n’ont pas de facteur commun avec 26. En utilisant la liste établie à l’exercice 2, on peut réduire le nombre de résultats affichés à 312. Voyez-vous comment ? Je vous propose de modifier alors votre procédure attaque. Exercice 4.7 : a) 7 Exercice 4.8 : a) Oui, car le PGDC(122, 49) = 1 b) Non car le PGDC(352, 33) = 11 Exercice 4.9 : PGDC(4539, 1958) = 89. Exercice 4.3 : Exercice 4.4 : "DCFDODRGDFZG" affine:=proc(phrase,a,b) begin chiffre:=numlib::toAscii(phrase): for i from 1 to nops(chiffre) do chiffre[i]:=(a*(chiffre[i]-65)+b mod 26)+65: end_for: code:=numlib::fromAscii(chiffre): print(code): end_proc: c) 6 d) 15 La méthode par décomposition en facteurs premiers montre déjà ici ses limites. Les calculs sont relativement longs et fastidieux. La suite des éléments théoriques nous fournira un moyen beaucoup plus élégant : L’algorithme d’Euclide. f) Le nombre b agissant comme une translation, on peut toujours « revenir en arrière » par une translation de –b. g) Il y a 12 possibilités de choix pour a et 26 pour b. Ceci donne donc 12 · 26 = 312 possibilités auxquelles il est judicieux d’enlever les clés a = 1, b = 0. b) 13 Exercice 4.10 : a) 21 Exercice 4.11 : Oui, car le PGDC(5617, 1515) = 1 Exercice 4.12 : b) 167 c) 1 les nombres 1600 et 259 sont donc premiers entre eux. reste:=proc(a,b) begin r:=1:L:=[]: while r > 0 do r:=a mod b: // ou r:=a-floor(a/b)*b L:=L.[r]: a:=b: b:=r: end_while: print(L): end_proc: Exercice 4.5 : 3OCmath – Jt 2015 3OCmath – Jt 2015 ELEMENTS DE REPONSES Exercice 4.13 : Exercice 4.14 : 19 euclide:=proc(a,b) begin reste:=1:L:=[]: while reste>0 do quotient:=a div b: // ou quotient:=floor(a/b) reste:=a mod b: // ou reste:=a-quotient*b print(expr2text(a)." = ".quotient." * ".expr2text(b)." + ".reste): L:=L.[reste]: a:=b:b:=reste: end_while: print("le PGDC vaut donc ".L[nops(L)-1]): end_proc 20 ELEMENTS DE REPONSES Exercice 4.17 : • Initialisation: Euclide Il s’agit d’une procédure récursive, c’est-à-dire qu’à l’intérieur de sa programmation, elle contient un appel à elle-même. Programme MuPAD : mystere:=proc(a,b) begin if b=0 then resultat:=a else r:=a mod b: resultat:=mystere(b,r): end_if: print(resultat): end_proc 383 = 3 · 127 + 2 127 = 63 · 2 + 1 2=2·1+0 Le dernier reste non nul vaut bien 1 (1) (2) • D’après l’égalité (2), on peut écrire : 1 = 127 – 63 · 2 (3) • D’après l’égalité (1), on peut écrire : 2 = 383 – 3 · 127 que l’on substitue dans (3) Ainsi 1 = 127 – 63 · (383 – 3 · 127) = -63 · 383 + 190 · 127 Donc u = -63 et v = 190 3OCmath – Jt 2015 Reste • 1534 = 8 · 180 + 94 94 = 1534 – 8 · 180 (1 ; 0) – 8(0 ; 1) • 180 = 1 · 94 + 86 86 = 180 – 1 · 94 (0 ; 1) – 1(1 ; -8) (1 ; -8) (-1 ; 9) • 94 = 1 · 86 + 8 8 = 94 – 1 · 86 (1 ; -8) – 1(-1 ; 9) (2 ; -17) • 86 = 10 · 8 + 6 6 = 86 – 10 · 8 (-1 ; 9) – 10(2; -17) (-21 ; 179) •8=1·6+2 2=8–1·6 (2 ; -17) – (-21; 179) (23 ; -196) •6=3·2+0 reste de zéro !! d) Voici la programmation MuPAD. Mais ne le regardez pas trop vite… Le but est que vous programmiez vous-même cette procédure !! 89 Exercice 4.16 : (1 ; 0) (0 ; 1) c) u = -20 et v = 121 fournit le PGDC des 2 nombres : a) algorithme d’Euclide : 1534 = 1 · 1534 + 0 · 180 180 = 0 · 1534 + 1 · 180 Ainsi u = 23 et v = -196 mystere(4539,1958) Exercice 4.15 : b) On utilise le même type de tableau que la partie a) bezout:=proc(a,b) begin u:=[] : v:=[]: // on crée deux listes contenant les valeurs de u et v u:=u.[1] : v:=v.[0]: // 1ère initialisation u:=u.[0] : v:=v.[1]: // 2ème initialisation i:=2: reste:=1: while reste>0 do quotient:=a div b: newu:=u[i-1]-quotient*u[i]: // la nouvelle valeur de u newv:=v[i-1]-quotient*v[i]: // la nouvelle valeur de v u:=u.[newu]: v:=v.[newv] : i:=i+1: // on rajoute ces valeurs aux // listes u et v et i:=i + 1 reste:=a mod b: a:=b:b:=reste: end_while: print("u = ".expr2text(u[nops(u)-1])." et v = ".expr2text(v[nops(v)-1])): end_proc Exercice 4.18 : a) PGDC(322,17) = 1 b) PGDC(512,28) = 4 c) PGDC(1321,314) = 1 (-1) · 322 + 19 · 17 = 1 (-3) · 512 + 55 · 28 = 4 29 · 1321 + (-122) · 314 = 1 b) Les valeurs proposées vérifient également 383u + 127v = 1 c) Le couple (u, v) obtenu à l’aide de l’algorithme d’Euclide fournit une solution de l’équation, mais cette solution n’est pas unique. a) u = 7 et v = -30 b) u = -9 et v = 13 puis u' = -9 · 5 = -45 et v' = 13 · 5 = 65 c) u = 8 et v = -23 3OCmath – Jt 2015 ELEMENTS DE REPONSES Exercice 4.19 : 21 Soit P = 2k l'équivalent numérique pair d'une première lettre et P' = 2k' l'équivalent numérique pair d'une deuxième lettre. On obtient C ≡ 13 · (2k) + b (mod 26) c’est-à-dire C ≡ b (mod 26) Mais aussi C' ≡ 13 · (2k') + b (mod 26) c’est-à-dire C' ≡ b (mod 26). Ces deux lettres seront donc codées de la même façon. Et ceci sera toujours vrai quelque soit le choix de ces lettres à équivalent numérique pair. Exercice 4.20 : Exercice 4.21 : a) Il suffit de montrer que a · a' = 1. Ce qui est bien le cas ici. b) b' = -a' · b = -19 · 22 = -418 ≡ 24 (mod 26) c) 11 · 2 + 22 = 44 ≡ 18 (mod 26) 19 · 18 + 24 = 366 ≡ 2 (mod 26) a) a' = 11 et b' = 19 b) Il s'agit de la lettre I. c) "IMUSTBEGONEANDLIVEORSTAYANDDIE" Roméo et Juliette: Act 3, Scene 5 de William Shakespeare Exercice 4.22 : Il s'agit de: "ETSIONNECONNAITPASLACLEF" avec les clés a' = 17 et b' = 25 Exercice 4.23 : Il s'agit de résoudre le système: ⎧ 12 ≡ 4a + b (mod 26) ⎨ ⎩ 6 ≡ 18a + b (mod 26) Vous obtiendrez les clés a = 7 et b = 10 Exercice 4.24 : Il s’agissait des clés de décryptage : a’ = 19 et b’ = 9 Sur la tombe de Diophante, on pouvait lire: Diophante d'Alexandrie Mathématicien grec (200 – 284 env.) Passant, c'est ici le tombeau de Diophante C'est lui qui t'apprend le nombre d'années qu'il a vécu Sa jeunesse en a occupé la sixième partie Puis sa joue se couvrit d'un premier duvet pendant la douzième Il passa encore le septième de sa vie avant de prendre une épouse et, cinq ans plus tard, il eut un bel enfant qui après avoir atteint la moitié de l'âge final de son père, périt d'une mort malheureuse Son père lui survécut quatre années De tout ceci, déduis son âge Pourrez-vous résoudre cette énigme célèbre, c’est-à-dire l’âge de sa mort ? 3OCmath – Jt 2015 22 ELEMENTS DE REPONSES Exercice 4.25 : a) vigenere1:=proc(phrase) begin chiffre:=numlib::toAscii(phrase): for i from 1 to nops(chiffre) do if i mod 2 = 1 then chiffre[i]:=((chiffre[i]-65)+1 mod 26)+65: else chiffre[i]:=((chiffre[i]-65)+14 mod 26)+65: end_if: end_for: code:=numlib::fromAscii(chiffre): print(code): end b) vigenere2:=proc(phrase) begin chiffre:=numlib::toAscii(phrase): for i from 1 to nops(chiffre) do if i mod 5 = 1 then chiffre[i]:=((chiffre[i]-65)+1 mod 26)+65:end_if: if i mod 5 = 2 then chiffre[i]:=((chiffre[i]-65)+0 mod 26)+65:end_if: if i mod 5 = 3 then chiffre[i]:=((chiffre[i]-65)+1 mod 26)+65:end_if: if i mod 5 = 4 then chiffre[i]:=((chiffre[i]-65)+0 mod 26)+65:end_if: if i mod 5 = 0 then chiffre[i]:=((chiffre[i]-65)+17 mod 26)+65:end_if: end_for: code:=numlib::fromAscii(chiffre): print(code): end c) vigenere3:=proc(phrase,cle) begin nouvellecle:=[]: chiffrephrase:=numlib::toAscii(phrase): for i from 1 to nops(chiffrephrase) do chiffrephrase[i]:=chiffrephrase[i]-65 end_for: chiffrecle:=numlib::toAscii(cle): for j from 1 to nops(chiffrecle) do chiffrecle[j]:=chiffrecle[j]-65 end_for: mult:=floor(nops(chiffrephrase)/nops(chiffrecle))+1: for k from 1 to mult do nouvellecle:=nouvellecle.chiffrecle: end_for: for m from 1 to nops(chiffrephrase) do chiffrephrase[m]:=(chiffrephrase[m]+nouvellecle[m] mod 26)+65: end_for: code:=numlib::fromAscii(chiffrephrase): print(code): end_proc 3OCmath – Jt 2015 ELEMENTS DE REPONSES Exercice 4.26 : 23 24 ELEMENTS DE REPONSES Il suffit de remplacer un + par un – dans la procédure précédente. Pour rappel: vous trouverez le lien de cet excellent site directement sur: www.javmath.c.la 3OCmath – Jt 2015 3OCmath – Jt 2015 ELEMENTS DE REPONSES 25 Éléments de réponses: Chapitre 5 26 ELEMENTS DE REPONSES Exercice 5.5 : a) M’ ≡ Me (mod n) = 8341481710297804401. b) (M’)d (mod n) = 12345678909876540106. (Ok !!) Exercice 5.6 : p = 11, q = 23, ϕ(n) = 220 , d = 147. Exercice 5.1 : invmod:=proc(d,n) begin if gcd(d,n)>1 then print("Les deux nombres doivent être premiers entre eux !!"): else e:=0: i:=1: while e = 0 do if i*d mod n = 1 then e:=i: end_if: i:=i+1: end_while: print("l'inverse de ".expr2text(d)." mod ".expr2text(n)." est ". expr2text(e)): end_if end_proc Exercice 5.2 : a) 8 Exercice 5.3 : a) 69 car sur MuPad: 5^51 mod 97 fournit effectivement 69 b) 7 c) 123456789^987654 mod 11 fournit le message d'erreur: 214147 ≡ 14 (mod 253); 157147 ≡ 20 (mod 253) et 6147 ≡ 8 (mod 253). Exercice 5.7 : b) n = 5147 · 7351 = 37835597; ϕ(n) = 5146 · 7350 = 37823100; PGDC(37823100 ; 307) = 1; 142008307 ≡ 36481808 (mod 37835597). c) d = 34743043 est l'inverse de e modulo ϕ(n) et on obtient: 3648180834743043 ≡ 142008 (mod 37835597). b) 3336670 Exercice 5.8 : M’ M = (M’)1459 (mod 2077) 3OCmath – Jt 2015 TA 494 1565 IM 220 508 EA 104 1913 3 43 1 · 26 + 17 BR 261 21 0 · 26 + 21 AV 833 364 14 · 26 + 0 O(A) BRAVO !! Exercice 5.9 : Exercice 5.10 : Pas de corrigé. Votre moyenne est 5 car: p = 5, q = 11, ϕ(n) = 40, d = 23 et finalement 2523 ≡ 5 (mod 55). Et vous obtiendrez: "p premier" "q premier" "n vaut 81460323853031154412157864943449033559900223014841" "phi vaut 81460323853031154412157846836965283770446924637300" "e bien choisi" "l'inv. de e est d= 61424931651866171450267589992180175612167475740167" 6251765106260591109794074603619900234555266946485 12345678909876540106 "tout s'est bien passé" JE 238 1377 b) En factorisant 2077, on obtient p = 31 et q = 67 donc ϕ(n) = 1980 et finalement d = 1459. On peut proposer par exemple: p:=9760959751111112041886431: q:= 8345523998678341256491111: if isprime(p)then print("p premier"):end_if: if isprime(q)then print("q premier"):end_if: n:=p*q:print("n vaut ".expr2text(n)): phi:=(p-1)*(q-1):print("phi vaut ".expr2text(phi)): e:=45879256903: if gcd(e,phi)= 1 then print("e bien choisi"): end_if: d:=1/e mod phi:print("l'inv. de e est d= ".expr2text(d)): c:=12345678909876540106: crypte:=powermod(c,e,n): print(crypte): decrypte:=powermod(crypte,d,n):print(decrypte): if decrypte=c then print("tout s'est bien passé"):end_if a) Il s'agit de 1377 1565 508 1913 M M’ = M19 (mod 2077) Error: Overflow/underflow in arithmetical operation Exercice 5.4 : a) 1420083 ≡ 124 (mod 253). La clé d, obtenue dans l'exercice précédent étant de 147, on obtient: 124147 ≡ 75 (mod 253) qui ne correspond pas à ce qui est attendu ! Exercice 5.11 : a) 42510 d) 252210 b) 901910 e) 195810 c) 12410 Exercice 5.12 : a) 111111112 b) 1107 c) 158A11 Exercice 5.13 : a) 1010002 b) 207 Exercice 5.14 : Pas de réponse proposée 3OCmath – Jt 2015 ELEMENTS DE REPONSES 27 Exercice 5.15 : a) OUI26 b) 916510 Exercice 5.16 : a) 111010002 ⇔ 23210 b) 110111012 ⇔ 22110 3OCmath – Jt 2015