É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

Documents pareils