Bibliographie Sur le WEB A propos de SageMath et Python

publicité
A
Bibliographie
Bibliographie
1. SIMON SINGH, Histoire des codes secrets, Livre de Poche, 2001
2. DIDIER MULLER, Les codes secrets décryptés, City Editions, 2007
3. DIDIER MULLER, Les 9 couronnes, Société jurassienne d’Emulation, 2009
Sur le WEB
1. Le site compagnon du polycopié :
http://www.javmath.ch
2. Ars Cryptographica :
http://www.apprendre-en-ligne.net/crypto/menu/index.html
3. La Cryptogr@phie expliquée :
http://www.bibmath.net/crypto/index.php
A propos de SageMath et Python
1. SageMathCloud, l’interface que nous utilisons :
https://cloud.sagemath.com/
2. SageMath, le site de référence en français (tutoriels,. . .) :
http://www.sagemath.org/fr/
3. Calcul mathématique avec Sage (un mode d’emploi en pdf)
http://dl.lateralis.org/public/sagebook/sagebook-web-20130530.pdf
71
A
Quelques éléments de solutions
A.1
Un doigt d’algorithmique avec SageMath
Exercice 1.1:
factorielle (40)
|815915283247897734345611269596115894272000000000
factorielle (100)
| 9 3 3 2 6 2 1 5 4 4 3 9 4 4 1 5 2 6 8 1 6 9 9 2 3 8 8 5 6 2 6 6 7 0 0 4 9 0 7 1 5 9 6 8 2 6 (...)
Exercice 1.2:
Pas de corrigé
Exercice 1.3:
def successeur ( n ):
n = n +1
return n
Exercice 1.4:
a) Il permute les 2 valeurs a et b.
b) Il s’agit de :
def mystere (a , b ):
a=a+b
b =a - b
a =a - b
return a , b
Exercice 1.5:
L1 =[]; L2 =[]; L3 =[]; L4 =[];
for i in [ -3..3]:
L1 = L1 +[ i ]
print L1
for i in [ -2..4]:
L2 = L2 +[ i ^2]
print L2
L3 = L1 + L2
print L3
for i in [0..6]:
L4 = L4 +[ L1 [ i ]+ L2 [ i ]]
print L4
I
II
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
Exercice 1.6:
a) Le pseudo-code :
M ult7 – liste vide
k–1
tant que 7 ¨ k † 60 :
ajouter 7 ¨ k dans M ult7
k “k`1
afficher M ult7
Exercice 1.7:
a) Il s’agit à nouveau de calculer la factorielle : n!
b)
def mystere ( n ):
p =1
k =1
while k < n +1:
p=p*k
k = k +1
return p
Exercice 1.8:
a) Cette fonction permet de calculer le quotient et le reste de la division de n par p
b)
def divmod (n , p ):
j =0
while n >= p :
n =n - p
j = j +1
return j , n
Exercice 1.9:
On peut par exemple proposer :
def tableau ( min , max ):
for x in [ min .. max ]:
print " si x = " ,x , " alors f ( " ,x , " )= " ,x ^3 - x ^2+2
Ce qui donnera :
tableau ( -3 ,3)
| si x = -3 alors f ( -3 )= -34
| si x = -2 alors f ( -2 )= -10
| si x = -1 alors f ( -1 )= 0
| si x = 0 alors f ( 0 )= 2
| si x = 1 alors f ( 1 )= 2
| si x = 2 alors f ( 2 )= 6
| si x = 3 alors f ( 3 )= 20
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
Exercice 1.10:
c) Elle permet de calculer
d)
III
n
ÿ
1
k!
k“0
def sommefacto ( n ):
somme =0
for k in [0.. n ]:
somme = somme +1/ factorielle ( k )
return ( somme )
e) Vous obtiendrez l’approximation d’un nombre bien connu . . . :
N ( sommefacto (6))
|2.7 1805555555556
N ( sommefacto (100))
|2.718281828459 05
Exercice 1.11:
a) On considère une première fonction monlog :
def monlog ( n ):
return log (3* n +1)
qui sera ensuite appelé dans une deuxième fonction pour donner le résultat :
def masomme ( min , max ):
somme =0
for i in [ min .. max ]:
somme = somme +1/ monlog ( i )
return N ( somme )
masomme (3 ,7)
|1.84797821242055
i
a
– 15.859914
2i ´ 1
i“5
b) Démarche comparable. On obtient :
Exercice 1.12:
a)
12
ÿ
def facto ( n ):
if n ==0:
return 1
else :
return n * facto (n -1)
b) Cette troisième façon d’obtenir n! est certainement la plus subtile, car à l’intérieur de la
fonction elle-même, la commande factorielle est appelée.
On appelle ceci une fonction récursive.
c)
def combi (n , p ):
c = facto ( n )/( facto ( p )* facto (n - p ))
return c
IV
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
Exercice 1.13:
a)
b)
def syra ( n ):
if n %2==0:
return ( n /2)
else :
return (3* n +1)
def suitesyra (N , nbre ):
Liste =[ N ]
for k in [1.. nbre ]:
Liste = Liste +[ syra ( Liste [k -1])]
return Liste
c) Pas de corrigé proposé. . . Exercice Défi
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
A.2
V
Nombres premiers
Exercice 2.1:
a) Non
b) ‚ On peut affirmer que le nombre 301 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.
‚ On ne peut par contre pas exclure que ce nombre puisse être composé de nombres premiers
plus grands que 13. Et ici 301 031 “ 59 ¨ 509. 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 contiendra effectivement
tous les nombres premiers.
Exercice 2.2:
n “ 41 nous fournit un contre-exemple, car n2 ´ n ` 41 sera alors forcément un multiple de 41.
Exercice 2.3:
fonction est_premier pnq :
pour k P r2 , n ´ 1s :
si n mod k ““ 0 :
retourner False
retourner True
def est_premier ( n ):
for k in [2.. n -1]:
if n % k ==0:
return False
return True
Exercice 2.4:
fonction est_premier2 pnq :
si n ““ 0 ou n ““ 1 :
retourner False
sinon:
si n ““ 2 :
retourner True
sinon:
?
maxi – r n ` 1s
pour k P r2 , maxis :
si n mod k ““ 0 :
retourner False
retourner True
VI
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
def est_premier2 ( n ):
if n ==0 or n ==1:
return False
else :
if n ==2:
return True
else :
maxi = int ( sqrt ( n ))+1
for k in [2.. maxi ]:
if n % k ==0:
return False
return True
Exercice 2.5:
a)
def euler ( n ):
f = n ^2 - n +41
print est_premier2 ( f )
b) Ce qui donne
euler (2)
| True
euler (40)
| True
euler (41)
| False
euler (42)
| False
c) + d) Nouvelle fonction :
def euler2 ( n ):
L =[]
for i in [0.. n ]:
f = i ^2 - i +41
if est_premier2 ( f )== False :
L = L +[ i ]
print ( L )
val =100*(101 - len ( L ))/101
print " Il y a donc " ,(101 - len ( L )) ,
" nombres premiers , soit dans : " ,
N ( val , digits =3) , " % des cas "
Ce qui donne :
euler2 (100)
|[41 , 42 , 45 , 50 , 57 , 66 , 77 , 82 , 83 , 85 , 88 , 90 , 92 , 97]
| Il y a donc 87 nombres premiers , soit dans : 86.1 % des cas
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
VII
Exercice 2.6:
a) + b) On obtient (extrait) :
crible (1000)
| [2 , 3 , 5 , 7 , 11 , 13 , ... , 983 , 991 , 997]
crible (100000)
| [2 , 3 , 5 , 7 , 11 , 13 , ... , 99971 , 99989 , 99991]
Exercice 2.7:
fonction criblepnq :
L – r0..ns
Lr1s – 0
i–2
tant que i § n :
j –i`i
tant que j § n :
Lrjs – 0
j –j`i
i–i`1
tant que i † n et Lris “ 0 :
i–i`1
M – rs
pour j de 0 jusqu’à n :
si Lrjs ‰ 0 :
M – M ` rLrjss
retourner M
Exercice 2.8:
fonction decomppnq :
Div – rs
P – criblepnq
pour j de 0 jusqu’à card pP q ´ 1 1 :
tant que n mod P rjs “ 0 :
Div – Div ` rP rjss
n – n{P rjs
retourner Div
1. card(P), c’est à dire cardinalité de l’ensemble P exprime, en mathématiques, le nombre d’éléments de
l’ensemble P . La commande SageMath correspondante est donc Len(P).
VIII
Exercice 2.9:
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
decomp (168399)
|[3 , 3 , 3 , 3 , 3 , 3 , 3 , 7 , 11]
factor (168399)
|3^7 * 7 * 11
Exercice 2.10:
is_prime (2027651281); factor (2027651281)
| False
|44021 * 46061
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:
Cette fonction permet de déterminer les n premiers nombres premiers. Par exemple :
mystere (14)
|[2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , 41 , 43]
Exercice 2.12:
Vous obtiendrez (par exemple) :
| 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 ) = 1 8 4 4 6 7 4 4 0 7 3 7 0 9 5 5 1 6 1 7 n ’ est pas premier
Actuellement, on ne connaît que 5 nombres de Fermat premiers, ceux cités ci-dessus p0 § n § 4q.
Un exemple possible de programmation SageMath :
def Fer ( n ):
for i in [0.. n ]:
k =2^(2^( i ))+1
if is_prime ( k ):
print " Fer ( " ,i , " )= " ,k , " est premier "
else :
print " Fer ( " ,i , " )= " ,k , " n ’ est pas premier "
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
IX
Exercice 2.13:
Vous obtiendrez (par exemple) :
| La
| La
| La
| La
| La
| La
conjecture
conjecture
conjecture
conjecture
conjecture
conjecture
de
de
de
de
de
de
Pagnol
Pagnol
Pagnol
Pagnol
Pagnol
Pagnol
est
est
est
est
est
est
vraie pour 1
vraie pour 3
vraie pour 5
vraie pour 7
fausse pour 9
vraie pour 11
Un exemple possible de programmation SageMath :
def Pagnol ( n ):
for i in [0.. n ]:
impair =2* i +1
pagnol = impair +( impair +2)+ impair *( impair +2)
if is_prime ( pagnol ):
print " La conjecture de Pagnol est vraie pour " , impair
else :
print " La conjecture de Pagnol est fausse pour " , impair
Exercice 2.14:
Vous obtiendrez :
| p et p +100 premiers : [3 , 7 , 13 , 31 , 37 , 67 , 73 , 79 , 97]
|p , p +100 et p +200 premiers : liste vide
Un exemple possible de programmation SageMath :
def possible ( n ):
L =[] , M =[]
for i in [2.. n ]:
if is_prime ( i ):
if is_prime ( i +100):
L = L +[ i ]
if is_prime ( i +200):
M = M +[ i ]
if len ( L )==0:
print " p et p +100 premiers : liste vide "
else :
print " p et p +100 premiers : " ,L
if len ( M )==0:
print "p , p +100 et p +200 premiers : liste vide "
else :
print "p , p +100 et p +200 premiers : " ,L
Exercice 2.15:
Je vous met au défi. . . Et si on faisait un petit concours. J’attends votre réponse par mail ;-)
Exercice 2.16:
Pas de réponse proposée. . .
X
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
A.3
Codage de César et congruence
Exercice d’intro :
‚ En 2009, le 6 décembre sera un dimanche et en 2010, un lundi. Sans tenir compte des années
bissextiles, on constate que
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 se trouvent à la suite de la donnée.
‚ 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 pmod 6q car
17 “ 2 ¨ 6 ` 5
5“0¨6`5
24 “ 4 ¨ 6 ` 0
14 “ 2 ¨ 6 ` 2
‚ Non 24 ı 14 pmod 6q car
Exercice 3.2:
Tous les entiers sont coloriés selon la séquence :
. . . – rouge – bleu – vert – rouge – bleu – vert – rouge – . . .
On partitionne ainsi les entiers en 3 familles :
t. . . , ´3, 0, 3, 6, . . . u ;
t. . . , ´2, 1, 4, 7, . . . u ;
t. . . , ´4, ´1, 2, 5, . . . u
Ce résultat se généralise quelque soit n l’entier modulo.
Exercice 3.3:
Par exemple, observons la situation modulo 3 :
…
0
1
2
…
3a
+0
3a
+1
3a
+2
3(a
+1
)+
3(a
0
+1
)+
3(a
1
…
+1
)+
2
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
ñ
80 ” 12 pmod 17q
ñ
´29 ” 5 pmod 17q
ñ
ñ
103 ” 1 pmod 17q
´122 ” 14 pmod 17q
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
XI
Exercice 3.5:
a) 1
b) 3
Exercice 3.6:
a) Il suffit de comparer 18ˆ(9)%7
c) 2
avec
d) 9
9ˆ(18)%7
b) Une fonction comme par exemple :
def equation ( n ):
for i in [0.. n ]:
if 18^( i )%7== i ^(18)%7:
print " n = " ,i , " verifie bien l ’ equation "
permet de se convaincre que n semble devoir être un multiple de 3, non multiple de 7.
Exercice 3.7:
WXTXRTXHPLILOL
“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, mi fili...
Dessin de John Leech dans :“The Comic History of Rome”
Exercice 3.8:
AVE CAESAR MORITURI TE SALUTANT
Exercice 3.9:
def cesar ( message_clair ):
message_code =[]
for lettre in message_clair :
ascii = ord ( lettre ) -65
ascii_crypt =( ascii +3)%26
lettre_crypt = chr ( ascii_crypt +65)
message_code = message_code +[ lettre_crypt ]
message_crypt = " " . join ( message_code )
return ( message_crypt )
XII
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
Exercice 3.10:
À l’aide de la fonction cesar, on obtient :
cesar ( " L E C R Y P T A G E E S T L A R T D E C O D E R U N M E S S A G E " )
| " OHFUBSWDJHHVWODUWGHFRGHUXQPHVVDJH "
Exercice 3.11:
“Il est temps de passer à autre chose”
Exercice 3.12:
def transl ( texte_clair , k ):
message_code =[]
for lettre in texte_clair :
ascii = ord ( lettre ) -65
ascii_crypt =( ascii + k )%26
lettre_crypt = chr ( ascii_crypt +65)
message_code = message_code +[ lettre_crypt ]
message_crypt = " " . join ( message_code )
return ( message_crypt )
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 :
“J’aimerais mieux être le premier dans un village que le second à Rome” (phase attribuée à César)
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.
Exercice 3.15:
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 3.2)
f) Vrai, voici le début de la preuve que je vous laisse compléter :
a ” b pmod nq ñ a “ k ¨ n ` . . .
b ” c pmod nq ñ b “ k 1 ¨ . . . ` . . .
*
ùñ a “ k ¨ n ` pk 1 ¨ . . . ` . . . q
a “ p. . . ` . . . q ¨ n ` . . . ñ a ” . . .
pmod . . . q
g) Vrai dans les 2 cas, il s’agit d’effectuer deux preuves très semblables à celle de la question
précédente.
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
XIII
Exercice 3.16:
a) 73 ` 231 525 ” 3 pmod 5q car :
73 ” 3 pmod 5q et 231 525 ” 0 pmod 5q
b) 212 ´ 414 ” 3 pmod 5q car :
212 ” 2 pmod 5q et 414 ” ´1 pmod 5q
c) 21 342 ¨ 59 ” 3 pmod 5q car :
d) 26 ” 4 pmod 5q
21 342 ” 2 pmod 5q et 59 ” 4 pmod 5q
e) 176 ” 26 pmod 5q ” 4 pmod 5q
Exercice 3.17:
a) 3527 ” 027 pmod 7q car 35 ” 0 pmod 7q ;
b) 89
35
”1
35
pmod 11q car 89 ” 1 pmod 11q ;
le reste de la division par 7 est de 0.
le reste de la division par 11 est de 1.
c) 7720 ” p´1q20 pmod 13q car 77 ” ´1 pmod 13q ; le reste de la division par 13 est de 1.
Exercice 3.18:
a) 35228 ` 84501 ” 1228 ` p´1q501 pmod 17q ” 0 pmod 17q
b) 2 ¨ 352009 ´ 3 ¨ 842010 ” 2 ¨ 12009 ´ 3 ¨ p´1q2010 pmod 17q
” 2 ´ 3 pmod 17q ” 16 pmod 17q
Exercice 3.19:
Le chiffre des unités d’un entier n est le reste de la division de n par 10.
41 5687 ” 87 pmod 10q
” 643 ¨ 8 pmod 10q
” 43 ¨ 8 pmod 10q
” 4 ¨ 8 pmod 10q
” 2 pmod 10q
Le chiffre des unités est donc 2. Efficace comme démarche. . . non ?
Exercice 3.20:
a) x ” 3 pmod 5q
b) x ” 2 pmod 5q
Exercice 3.21:
l’inverse de 4 pmod 5q est 4 pmod 5q car 4 ¨ 4 “ 16 – 1 pmod 5q.
XIV
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
Exercice 3.22:
Les tables de multiplications :
•Pour n “ 2
•Pour n “ 4
¨
0
1
2
3
¨
0
1
0
0
0
0
0
0
0
0
1
0
1
2
3
•Pour n “ 3
1
0
1
2
0
2
0
2
•Pour n “ 6
3
0
3
2
1
0
0
0
0
0
0
0
¨
0
1
2
3
4
5
0
0
0
0
¨
0
1
2
1
0
1
2
3
4
5
1
0
1
2
2
0
2
4
0
2
4
2
0
2
1
3
0
3
0
3
0
3
4
0
4
2
0
4
2
5
0
5
4
3
2
1
Exercice 3.23:
1)
2)
3)
a) x ” 0 pmod 3q
b) x ” 2 pmod 4q
a) pas de solution
b) pas de solution
si n “ 4 : ‚ 2 ¨ 2 ” 0 pmod 4q
si n “ 6 : ‚ 3 ¨ 2 ” 0 pmod 6q
‚ 2 ¨ 3 ” 0 pmod 6q
‚ 3 ¨ 4 ” 0 pmod 6q
‚ 4 ¨ 3 ” 0 pmod 6q
c) x ” 4 pmod 6q
c) x ” 0 ou x ” 3 pmod 6q
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 pmod 4q
c) x ” 5 pmod 6q
1) Il s’agit de l’observer dans la table de multiplication
correspondante.
b) x ” 0 pmod 7q
c) x ” 4 pmod 7q
1
0
1
2
3
2
0
2
0
2
3
0
3
2
1
b) pas d’inverse
d) pas d’inverse
Exercice 3.24:
2) a) x ” 6 pmod 7q
0
0
0
0
0
¨
0
1
2
3
¨
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
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
XV
Exercice 3.25:
3 est bien l’inverse de 6 modulo 17 car 6 ¨ 3 “ 18 ” 1 pmod 17q
6 ¨ x ” 9 pmod 17q
3 ¨ 6 ¨ x ” 3 ¨ 9 pmod 17q
1 ¨ x ” 27 pmod 17q
x ” 10 pmod 17q
6 ¨ x ” 11 pmod 17q
3 ¨ 6 ¨ x ” 3 ¨ 11 pmod 17q
1 ¨ x ” 33 pmod 17q
x ” 16 pmod 17q
Exercice 3.26:
2) a) x ” 4 pmod 6q
b) x ” 3 pmod 6q
3) Ce type d’équations se manipule “naturellement” par
une soustraction des deux côtés du égal.
4) a) x ” 3 pmod 6q
b) pas de solution
c) x ” 2 ou x ” 5 pmod 6q
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
XVI
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
A.4
Codage affine, algorithmes d’Euclide et Bézout
Exercice 4.1:
En effet, Le chiffre correspondant à C est 2. Comme
2 ¨ 3 ` 5 ” 11 pmod 26q
ce dernier chiffre correspond bien à la lettre L.
Exercice 4.2:
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 ?
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) Tableau de conversion :
en clair
codé
0
2
1 2 3
12 22 6
4 5
16 0
6 7 8
10 20 4
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
14 24 8 18 2 12 22 6 16 0 10 20 4 14 24 8 18
En SageMath, en considérant les clés b “ 0 et a variant de 1 à 26, on peut proposer
def tableau ( clefa ):
Liste =[]
for a in [1.. clefa ]:
for i in [0..25]:
Liste = Liste +[ a * i %26]
print " On obtient " , Liste , " pour a = " ,a
Liste =[]
e) a P t1 ; 3 ; 5 ; 7 ; 9 ; 11 ; 15 ; 17 ; 19 ; 21 ; 23 ; 25u. Contrairement aux autres, ces 12 nombres
n’ont pas de facteur commun avec 26.
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.
Exercice 4.3:
“DCFDODRGDFZG”
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
XVII
Exercice 4.4:
Une fonction possible :
def affine ( message_clair ,a , b ):
message_code =[]
for lettre in message_clair :
ascii = ord ( lettre ) -65
ascii_crypt =( a * ascii + b )%26
lettre_crypt = chr ( ascii_crypt +65)
message_code = message_code +[ lettre_crypt ]
message_crypt = " " . join ( message_code )
return ( message_crypt )
Exercice 4.5:
“HVPWDGWINDOVKVIODIVNDHQTGWVDGVIXKXVIV”
Exercice 4.6:
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 12 ¨ 26 possibilités.
Il reste à trouver visuellement parmi les 312 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 :
“BRAVOCENESTPASFACILE”
Une fonction SageMath possible :
def attaque ( message ):
for a in [1 ,3 ,5 ,7 ,9 ,11 ,15 ,17 ,19 ,21 ,23 ,25]:
for b in [0..25]:
print affine ( message ,a , b ) , " avec a = " ,a , " et b = " ,b
Cette fonction attaque appelle donc la fonction affine que vous avez programmé et utilisé dans
les exercices précédents.
Exercice 4.7:
a) 7
b) 13
c) 6
d) 15
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.
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.
XVIII
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
Exercice 4.10:
a) 21
b) 167
c) 1 les nombres 1600 et 259 sont donc premiers entre eux.
Exercice 4.11:
Oui, car le PGDC(5617, 1515) = 1
Exercice 4.12:
def reste (a , b ):
Liste =[]
reste = a % b
while reste < >0:
a=b
b = reste
Liste = Liste +[ reste ]
reste = a % b
Liste = Liste +[0]
return Liste
Exercice 4.13:
def euclide (a , b ):
reste = a % b
while reste < >0:
quotient = a // b
reste = a % b
print a , " = " , quotient , " * " ,b , " + " , reste
a=b
b = reste
print " le PGDC vaut donc " ,a
Exercice 4.14:
Il s’agit d’une fonction récursive, c’est-à-dire qu’à l’intérieur de sa programmation, elle contient
un appel à elle-même. On obtient alors :
mystere (4539 ,1958)
|89
qui correspond au PGDC des 2 nombres. Programmé dans SageMath :
def mystere (a , b ):
if b ==0:
resultat = a
else :
r=a%b
resultat = mystere (b , r )
return ( resultat )
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
XIX
Exercice 4.15:
a) algorithme d’Euclide :
383 “ 3 ¨ 127 ` 2
127 “ 63 ¨ 2 ` 1
(1)
(2)
2“2¨1`0
Le dernier reste non nul vaut bien 1
‚ 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 ¨ p383 ´ 3 ¨ 127q “ ´63 ¨ 383 ` 190 ¨ 127.
On obtient alors : u “ ´63 et v “ 190.
b) Les valeurs proposées vérifient également 383u ` 127v “ 1.
c) Le couple pu , vq obtenu à l’aide de l’algorithme d’Euclide fournit une solution de l’équation,
mais cette solution n’est pas unique.
Exercice 4.16:
a) u “ 7 et v “ ´30
b) u “ ´9 et v “ 13 puis
c) u “ 8 et v “ ´23
u1 “ ´9 ¨ 5 “ ´45 et v 1 “ 13 ¨ 5 “ 65
Exercice 4.17:
b) On utilise le même type de tableau que la partie a)
• Initialisation : 1534 “ 1 ¨ 1534 ` 0 ¨ 180
180 “ 0 ¨ 1534 ` 1 ¨ 180
Euclide
p1 ; 0q
p0 ; 1q
Reste
• 1534 “ 8 ¨ 180 ` 94 94 “ 1534 ´ 8 ¨ 180
• 180 “ 1 ¨ 94 ` 86
86 “ 180 ´ 1 ¨ 94
• 86 “ 10 ¨ 8 ` 6
6 “ 86 ´ 10 ¨ 8
• 94 “ 1 ¨ 86 ` 8
• 8“1¨6`2
• 6“3¨2`0
8 “ 94 ´ 1 ¨ 86
2“8´1¨6
reste de zéro
(1 ; 0q ´ 8p0 ; 1q
p1 ; ´8q
p1 ; ´8q ´ 1p´1 ; 9q
p2 ; ´17q
p0 ; 1q ´ 1p1 ; ´8q
p´1 ; 9q ´ 10p2 ; ´17q
p´1 ; 9q
p´21 ; 179q
p2 ; ´17q ´ 1p´21 ; 179q p23 ; ´196q
Ainsi u “ 23 et v “ ´196
c) u “ ´20 et v “ 121
d) Voici une programmation SageMath. Mais ne le regardez pas trop vite. . . Le but est que
vous programmiez vous-même cette fonction !!
XX
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
def bezout (a , b ):
U =[1 ,0]
V =[0 ,1]
i =1
reste = a % b
while reste < >0:
quotient = a // b
i = i +1
newu = U [i -2] - quotient * U [i -1]
newv = V [i -2] - quotient * V [i -1]
U = U +[ newu ]
V = V +[ newv ]
a=b
b = reste
reste = a % b
print " u = " ,U [ i ] , " et v = " ,V [ i ]
Exercice 4.18:
a) PGDC(322,17) = 1
b) PGDC(512,28) = 4
c) PGDC(1321,314) = 1
p´1q ¨ 322 ` 19 ¨ 17 “ 1
p´3q ¨ 512 ` 55 ¨ 28 “ 4
29 ¨ 1321 ` p´122q ¨ 314 “ 1
Exercice 4.19:
Soit P “ 2k l’équivalent numérique pair d’une première lettre et P 1 “ 2k 1 l’équivalent numérique
pair d’une deuxième lettre.
On obtient :
Mais aussi :
C ” 13 ¨ p2kq ` b pmod 26q c’est-à-dire C ” b pmod 26q
C 1 ” 13 ¨ p2k 1 q ` b pmod 26q c’est-à-dire C 1 ” b pmod 26q
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:
a) Il suffit de montrer que a ¨ a1 ” 1 pmod 26q. Ce qui est bien le cas ici.
b) b1 “ ´a1 ¨ b “ ´19 ¨ 22 “ ´418 ” 24 pmod 26q
c) 11 ¨ 2 ` 22 “ 44 ” 18 pmod 26q
19 ¨ 18 ` 24 “ 366 ” 2 pmod 26q
Exercice 4.21:
a) a1 “ 11 et b1 “ 19
b) Il s’agit de la lettre I.
c) “IMUSTBEGONEANDLIVEORSTAYANDDIE”
Roméo et Juliette : Act 3, Scene 5 de William Shakespeare
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
Exercice 4.22:
Il s’agit de :
XXI
“ETSIONNECONNAITPASLACLEF”
avec les clés a1 “ 17 et b1 “ 25.
Exercice 4.23:
Il s’agit de résoudre le système :
#
12 ” 4a ` b
6 ” 18a ` b
pmod 26q
pmod 26q
Vous obtiendrez les clés a “ 7 et b “ 10.
Exercice 4.24:
Il s’agissait des clés de décryptage : a1 “ 19 et b1 “ 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 ?
XXII
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
Exercice 4.25:
a) Au moins 9 fois (c’est-à-dire r17{2s ` 1)
b) Au moins rm{ns ` 1 fois
c)
def vigenere ( message , cle ):
message_code =[]
cle_code =[]
new_cle =[]
new_message =[]
# liste ascii du message
for lettre in message :
ascii = ord ( lettre ) -65
message_code = message_code +[ ascii ]
# liste ascii de la cle
for lettre in cle :
ascii = ord ( lettre ) -65
cle_code = cle_code +[ ascii ]
# adapter la taille de la cle
for i in [1.. int ( len ( message_code )/ len ( cle ))+1]:
new_cle = new_cle + cle_code
# ajouter les 2 listes et conv . en ascii
for i in [0.. len ( message_code ) -1]:
ascii =( message_code [ i ]+ new_cle [ i ])%26+65
new_message = new_message +[ chr ( ascii )]
# conversion en chaine de caracteres
Message_crypt = " " . join ( new_message )
return Message_crypt
Exercice 4.26:
Il suffit de remplacer un + par un – dans la fonction précédente.
Pour rappel : vous trouverez le lien de cet excellent site directement sur :
www.javmath.ch
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
A.5
XXIII
La cryptographie à clé publique : RSA
Exercice 5.1:
def invmod (d , n ):
if gcd (d , n ) < >1:
return " doivent etre premiers entre eux !! "
else :
e =0; i =1
while e ==0:
if i * d % n ==1:
e=i
i = i +1
return ( e )
Exercice 5.2:
a) 8
Exercice 5.3:
a) 69 car
b) 3336670
5^51%97
|69
b) 7
c) Le calcul de 123456789ˆ987654321%11 risque bien de vous faire perdre patience. . ..
N’hésitez pas à l’interrompre avec le bouton : ⌅ Stop
XXIV
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
Exercice 5.4:
On peut proposer par exemple :
def controle (p ,q ,e , M ):
if is_prime ( p ) and is_prime ( q ):
print " p et q premiers : OUI "
else :
print " p et q premiers : NON "
n=p*q
print " n : " ,n
phi_n =( p -1)*( q -1)
print " phi ( n ): " , phi_n
if gcd (e , phi_n ):
print " e et phi ( n ) premiers entre eux : OUI "
else :
print " e et phi ( n ) premiers entre eux : NON "
d = inverse_mod (e , phi_n )
print " cl é priv é e : " ,d
M_prime = power_mod (M ,e , n )
print " message code : " , M_prime
new_M = power_mod ( M_prime ,d , n )
print " message decode : " , new_M
if new_M == M :
print " Tout est en ordre ; -) "
else :
print " Il y a comme un probleme : -/ "
qui fournira :
controle (9760959751111112041 886431 ,8345523998678341256491111 ,
45879256903 ,12345678909876540106)
| p et q premiers : OUI
|n: 81460323853031154412157864943449033559900223014841
| phi ( n ): 8 1 4 6 0 3 2 3 8 5 3 0 3 1 1 5 4 4 1 2 1 5 7 8 4 6 8 3 6 9 6 5 2 8 3 7 7 0 4 4 6 9 2 4 6 3 7 3 0 0
| e et phi ( n ) premiers entre eux : OUI
| cl é priv é e : 6 1 4 2 4 9 3 1 6 5 1 8 6 6 1 7 1 4 5 0 2 6 7 5 8 9 9 9 2 1 8 0 1 7 5 6 1 2 1 6 7 4 7 5 7 4 0 1 6 7
| message code : 6 2 5 1 7 6 5 1 0 6 2 6 0 5 9 1 1 0 9 7 9 4 0 7 4 6 0 3 6 1 9 9 0 0 2 3 4 5 5 5 2 6 6 9 4 6 4 8 5
| message decode : 12 3 4 56 78 90 9876540106
| Tout est en ordre ; -)}
Exercice 5.5:
a) M 1 ” M e pmod nq “ 8341481710297804401
b) pM 1 qd pmod nq “ 12345678909876540106. (Ok ! !)
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
XXV
Exercice 5.6:
‚ p “ 11, q “ 23, Ïpnq “ 220, d “ 147
‚ 214147 ” 14 pmod 253q Ñ O
‚ 157147 ” 20 pmod 253q Ñ U
‚ 6147 ” 8 pmod 253q
Ñ
I
Exercice 5.7:
a) 1420083 ” 124 pmod 253q. La clé d, obtenue dans l’exercice précédent étant de 147, on
obtient : 124147 ” 75 pmod 253q qui ne correspond pas à ce qui est attendu !
b) On obtient les valeurs suivantes :
‚ n “ 5147 ¨ 7351 “ 37835597 ;
‚ Ïpnq “ 5146 ¨ 7350 “ 37823100 ;
‚ PGDC(37823100 ; 307) = 1 ;
‚ 142008307 ” 36481808 pmod 37835597q.
c) d “ 34743043 est l’inverse de e modulo Ïpnq et on obtient :
3648180834743043 ” 142008 pmod 37835597q.
Exercice 5.8:
a) Il s’agit de 1377 1565 508 1913
M
M 1 “ M 19 pmod 2077q
JE
238
1377
TA
494
1565
IM
220
508
EA
104
1913
b) En factorisant 2077, on obtient p “ 31 et q “ 67 donc Ïpnq “ 1980 et finalement d “ 1459.
M1
M “ pM 1 q1459 pmod 2077q
3
43
1 ¨ 26 ` 17
BR
261
21
0 ¨ 26 ` 21
AV
833
364
14 ¨ 26 ` 0
O(A)
BRAVO !!
Exercice 5.9:
Pas de corrigé.
Exercice 5.10:
Votre moyenne est 5 car :
p “ 5, q “ 11, Ïpnq “ 40, d “ 23 et finalement 2523 ” 5 pmod 55q.
XXVI
ANNEXE A. QUELQUES ÉLÉMENTS DE SOLUTIONS
Exercice 5.11:
a) 42510
d) 252210
b) 901910
e) 195810
c) 12410
b) 1107
c) 158A11
Exercice 5.12:
a) 111111112
Exercice 5.13:
a) 1010002
b) 207
Exercice 5.14:
Pas de réponse proposée
Exercice 5.15:
a) OUI26
b) 916510
Exercice 5.16:
a) 2110123 ñ 59910
c) B2612 ñ 161410
b) 110111012 ñ 22110
d) 119911 ñ 156010
Téléchargement