Bonjour . Je vais te faire une explication à 10 points ;)
Petite explication, tu prends, tu ne prends pas ... je te la donne :
(1) RANG de la source
chaque lettre source est repérée par son rang dans l'alphabet en commençant au rang 0 pour A
A B C D E F G H I J K L M N O P
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Q R S T U V W X Y Z
16 17 18 19 20 21 22 23 24 25
En Python, on verra qu'il y a une fonction qui permet de faire ça,
Ce rang, on l'appelle x pour la suite
(2) Clé de CODAGE
On choisit 2 nombres entiers , a et b.
Cela nous permet de construire une fonction affine f(x) = ax + b
On donne x , le rang de la lettre à coder, on calcule f(x) et (presque) hop ! on obtient le rang de la lettre codée. Il nous manque une étape, car f(x) peut être supérieur à 25. Explication.
(3) Boucler sur l'ALPHABET
Par exemple : a = 3 , b = 5 f(x) = 3x+5
- Lettre source : la 2e lettre de l'alphabet : B,
- rang x = 1
- f(1) = 3 . 1 + 5 = 8
- Lettre codée de rang 8 : la 9e lettre , I
Cool. Maintenant, ça se complique :
- Lettre source : La 10e lettre de l'alphabet : J
- son rang dans NOTRE alphabet , c'est x=9
- f(9) = 3 . 9 + 5 = 32
- Lettre de rang 32 ? Non, le rang est entre 0 et 25
L'astuce ici est de REBOUCLER sur le "ruban" de l'alphabet
X Y Z A B C D E F G
23 24 25 26 27 28 29 30 31 32
23 24 25 0 1 2 3 4 5 6
Ok, on a compris que l'alphabet est "comme un ruban infini"
Si f(x) = 25 : rang 25 : Z
Si f(x) = 26 : rang (26 - 26 ) = rang 0 : A
Si f(x) = 27 : rang (27 - 26) = rang 1 : B
Si f(x) = 32 : rang (32 - 26) = rang 6 : G
J'arrête avec le suspens. Le rang final, c'est le RESTE de la division de f(x) par 26, car il y a 26 lettres dans l'alphabet.
En python, il y a un opérateur "reste" noté % qui donne ça !
si on fait r = 32 % 26 , r vaudra 6
(4) UNICITE DU CODAGE
Dans notre contexte d'un alphabet de 26 lettres, il faudra faire attention au choix de a, de façon à avoir une correspondance UNIQUE de codage. Il 'y aurait rien de pire que d'avoir par exemple codé A par E et codé L par ... E ! Le E dans le message codé ne doit correspondre qu'à une lettre, sinon, pas de décodage possible.
Les maths nous disent que le coefficient a ne doit pas avoir de diviseur commun avec 26 .
*** FIN DES EXPLICATIONS PAS DEMANDEES ***
Réponse aux questions :
(1)
f(x) = 4x + 5 E est codé par quoi ?
- Lettre source : la 5e lettre de l'alphabet : E
- rang x = 4
- f(4) = 4 fois 4 + 5 = 16 + 5 = 21
- Lettre codée de rang 21 : la 22e lettre , V
Réponse : E est codé par V
(2)
2.a) Types ?
lettre est de type "texte" car la fonction ord, comme donnée dans l'exemple, prend comme paramètre "A", qu est de type texte.
a et b sont, ligne 4 , membre d'une opération sur des nombres (multiplication addition) pour calculer reste, paramètre de chr
2.b)
La fonction crypte, complétée avec mes commentaires : def crypte (lettre , a , b) : # lettre : lettre de A.. à .. Z # a , b : fonction f(x) de codage # pour une lettre de rang x (rang de A = 1) # retour de fonction : une lettre qui code lettre
rang = ord (lettre) - ord('A') # calcule le rang de la
# lettre dans l'alphabet
# 0 pour A , 25 pour Z
reste = (a*rang + b) % 26 # reste de la division par 26 de f(x)
# f(x) = a x + b
# et x est le rang de la lettre, entre 0 et 25
return chr (reste+ord('A')) # renvoie le caractère codé
2.c) Pour vérifier 1), ajouter après crypte le programme
principal
#PROGRAMME PRINCIPAL
print ("Codage affine avec f(x) = 4x +5 ; la lettre E est codée par :" )
print (crypte ( "E", 4, 5) )
CODE
Pour coder en ligne cet exercice, cherche l'environnement "trinket python3" . Le projet est ici https://trinket.io/python3/078cfd1d75
def crypte (lettre , a , b) :
# lettre : lettre de A.. à .. Z
# a , b : fonction f(x) de codage
# pour une lettre de rang x (rang de A = 1)
# retour de fonction : une lettre qui code lettre
rang = ord (lettre) - ord('A') # calcule le rang de la
# lettre dans l'alphabet
# 0 pour A , 25 pour Z
reste = (a*rang + b) % 26 # reste de la division par 26 de f(x)
# f(x) = a x + b
# et x est le rang de la lettre, entre 0 et 25
return chr (reste+ord('A')) # renvoie le caractère codé
#PROGRAMME PRINCIPAL
print ("Codage affine avec f(x) = 4x +5 ; la lettre E est codée par :")
print (crypte ( "E", 4, 5) )
TRACES
Codage affine avec f(x) = 4x +5 ; la lettre E est codée par :
V
1 votes Thanks 2
labananedu88
Merci beaucoup !! Pour la question 2)a) alors je n’ai rien à changer sur le programme ?
Lista de comentários
Verified answer
Réponse :
Explications :
Bonjour . Je vais te faire une explication à 10 points ;)
Petite explication, tu prends, tu ne prends pas ... je te la donne :
(1) RANG de la source
chaque lettre source est repérée par son rang dans l'alphabet en commençant au rang 0 pour A
A B C D E F G H I J K L M N O P
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Q R S T U V W X Y Z
16 17 18 19 20 21 22 23 24 25
En Python, on verra qu'il y a une fonction qui permet de faire ça,
Ce rang, on l'appelle x pour la suite
(2) Clé de CODAGE
On choisit 2 nombres entiers , a et b.
Cela nous permet de construire une fonction affine f(x) = ax + b
On donne x , le rang de la lettre à coder, on calcule f(x) et (presque) hop ! on obtient le rang de la lettre codée. Il nous manque une étape, car f(x) peut être supérieur à 25. Explication.
(3) Boucler sur l'ALPHABET
Par exemple : a = 3 , b = 5 f(x) = 3x+5
- Lettre source : la 2e lettre de l'alphabet : B,
- rang x = 1
- f(1) = 3 . 1 + 5 = 8
- Lettre codée de rang 8 : la 9e lettre , I
Cool. Maintenant, ça se complique :
- Lettre source : La 10e lettre de l'alphabet : J
- son rang dans NOTRE alphabet , c'est x=9
- f(9) = 3 . 9 + 5 = 32
- Lettre de rang 32 ? Non, le rang est entre 0 et 25
L'astuce ici est de REBOUCLER sur le "ruban" de l'alphabet
X Y Z A B C D E F G
23 24 25 26 27 28 29 30 31 32
23 24 25 0 1 2 3 4 5 6
Ok, on a compris que l'alphabet est "comme un ruban infini"
Si f(x) = 25 : rang 25 : Z
Si f(x) = 26 : rang (26 - 26 ) = rang 0 : A
Si f(x) = 27 : rang (27 - 26) = rang 1 : B
Si f(x) = 32 : rang (32 - 26) = rang 6 : G
J'arrête avec le suspens. Le rang final, c'est le RESTE de la division de f(x) par 26, car il y a 26 lettres dans l'alphabet.
En python, il y a un opérateur "reste" noté % qui donne ça !
si on fait r = 32 % 26 , r vaudra 6
(4) UNICITE DU CODAGE
Dans notre contexte d'un alphabet de 26 lettres, il faudra faire attention au choix de a, de façon à avoir une correspondance UNIQUE de codage. Il 'y aurait rien de pire que d'avoir par exemple codé A par E et codé L par ... E ! Le E dans le message codé ne doit correspondre qu'à une lettre, sinon, pas de décodage possible.
Les maths nous disent que le coefficient a ne doit pas avoir de diviseur commun avec 26 .
*** FIN DES EXPLICATIONS PAS DEMANDEES ***
Réponse aux questions :
(1)
f(x) = 4x + 5 E est codé par quoi ?
- Lettre source : la 5e lettre de l'alphabet : E
- rang x = 4
- f(4) = 4 fois 4 + 5 = 16 + 5 = 21
- Lettre codée de rang 21 : la 22e lettre , V
Réponse : E est codé par V
(2)
2.a) Types ?
2.b)
La fonction crypte, complétée avec mes commentaires :
def crypte (lettre , a , b) :
# lettre : lettre de A.. à .. Z
# a , b : fonction f(x) de codage
# pour une lettre de rang x (rang de A = 1)
# retour de fonction : une lettre qui code lettre
rang = ord (lettre) - ord('A') # calcule le rang de la
# lettre dans l'alphabet
# 0 pour A , 25 pour Z
reste = (a*rang + b) % 26 # reste de la division par 26 de f(x)
# f(x) = a x + b
# et x est le rang de la lettre, entre 0 et 25
return chr (reste+ord('A')) # renvoie le caractère codé
2.c) Pour vérifier 1), ajouter après crypte le programme
principal
#PROGRAMME PRINCIPAL
print ("Codage affine avec f(x) = 4x +5 ; la lettre E est codée par :" )
print (crypte ( "E", 4, 5) )
CODE
Pour coder en ligne cet exercice, cherche l'environnement "trinket python3" . Le projet est ici https://trinket.io/python3/078cfd1d75
def crypte (lettre , a , b) :
# lettre : lettre de A.. à .. Z
# a , b : fonction f(x) de codage
# pour une lettre de rang x (rang de A = 1)
# retour de fonction : une lettre qui code lettre
rang = ord (lettre) - ord('A') # calcule le rang de la
# lettre dans l'alphabet
# 0 pour A , 25 pour Z
reste = (a*rang + b) % 26 # reste de la division par 26 de f(x)
# f(x) = a x + b
# et x est le rang de la lettre, entre 0 et 25
return chr (reste+ord('A')) # renvoie le caractère codé
#PROGRAMME PRINCIPAL
print ("Codage affine avec f(x) = 4x +5 ; la lettre E est codée par :")
print (crypte ( "E", 4, 5) )
TRACES
Codage affine avec f(x) = 4x +5 ; la lettre E est codée par :
V