Informatique, D.S. 2 : 1 Questions de cours a) Comment fabriquer un liste t contenant 26 entrées, toutes nulles? b) Avec quel symbole obtient-on en Python le reste de la division euclidienne de a par b? c) Ecrire une fonction Rectangle qui prend comme arguments une fonction f, des nombres a,b et un entier n et qui renvoie le résultat du calcul d une valeur approchée de b a f par la méthode des rectangles en subdivisant [a, b] en n intervalles, i.e. en calculant n aires de rectangles. d) Que fait la fonction mystere suivante, qui prend en arguments deux entiers a et b? On expliquera pourquoi cette fonction s arrête et pourquoi elle fait ce qu on prétend. On précisera aussi ce que signifie la deuxième ligne du code. def mystere(a,b): if (isinstance(a,int)==false) or (isinstance(b,int)==false): # qu es aco? raise ValueError("Variables d entrées incorrectes") a=abs(a) b=abs(b) while (a!=0) and (b!=0): if a<=b: b=b-a if b<a: a=a-b if a==0: return b if b==0: return a e) Quel est l intérêt d un raise ValueError("données non correctes") par rapport à un simple print("données non correctes")? f) Ecrire une fonction maxi qui prend en entrée une liste d entiers et renvoie la valeur maximale des entiers dans cette liste et le premier indice pour lequel cette valeur maximale est atteinte. 2 Codages de Cesar et Vigenère Le but de ce problème est de s intéresser à deux méthodes historiques de codages de texte. 2.1 Préliminaire : représentation d un texte par une liste de chiffres Par commodité, dans ce qui suit, on s intéresse à un texte (chaîne de caractères) écrit seulement avec les 26 lettres de l alphabet en minuscules, sans espace (oui je sais c est un peu contraignant... cf. fin du problème). Par commodité encore, on va remplacer ce texte par une liste de nombres comme suit : on va représenter a par 0, b par 1 etc jusqu à z par 25. Question 1 (attention à bien lire le complément UTF/Python ci-dessous (verso!) avant de répondre!) On veut fabriquer une fonction represente(texte) qui prend en argument une chaîne de caractères texte formée seulement avec les caractères correspondants aux 26 lettres de l alphabet en minuscule, et qui renvoie une liste, qu on appellera t dans la déf. de la fonction, dont les entrées correspondront aux chiffres représentant chacune des lettres. Un exemple valant mieux qu un long discours : 1
CONCOURS D ADMISSION 2008 ÉCOLE POLYTECHNIQUE CONCOURS D ADMISSION 2008 ÉPREUVE D INFORMATIQUE (Durée : 2 heures) FILIÈRES MP ET PC ÉCOLE SUPÉRIEURE DE PHYSIQUE ET CHIMIE INDUSTRIELLES FILIÈRES MP ET PC L utilisation des calculatrices ÉPREUVEn est D INFORMATIQUE pas autorisée pour cette épreuve. Le langage de programmation choisi(durée par le candidat : 2 heures) doit être spécifié en tête de copie. >>> represente( abcdezyx ) [0, 1, 2, 3, 4, L utilisation 25, 24, 23] des calculatrices n est??? pas autorisée pour cette épreuve. Le langage de programmation choisi par le candidat doit être spécifié en tête de copie. Complément : une commande Python Ave Cesar essentielle (zud bdrzq) pour pouvoir faire la question 1 : En UTF, les lettres a,b,c... sont codées par les nombres 97,98, 99 etc. La commande Python??? ordon s applique cherche à crypter une chaîne un texte contenant t de longueur une lettre n composé et renvoie de caractères le numéro en minuscules UTF de cette (soit 26 lettre. lettres Par exemple di érentes) : représentés par des entiers Ave compris Cesar entre (zud 0 et bdrzq) 25 (0 $ a, 1$ b,... 25 $ z). Nous ne >>>ord( a ) tenons pas compte des éventuels espaces. On cherche à crypter un texte t de longueur n composé de caractères en minuscules (soit 26 lettres 97 Ainsi, le texte ecolepolytechnique est représenté par le tableau suivant où la première ligne di érentes) représentés par des entiers compris entre 0 et 25 (0 $ a, 1$ b,... 25 $ z). Nous ne représente le texte, la seconde les entiers correspondants, et la troisième les indices dans le tableau t. tenons Maintenant pas compte vous des pouvez éventuels vraiment espaces. faire la question 1! e c o l e p o l y t e c h n i q u e N.B. Ainsi, Dans le toute la suite après cette question, toutes les entrées sorties des algorithmes 4 texte 2 14 ecolepolytechnique 11 4 15 14 11représenté 24 19 par4 le tableau 2 7 suivant 13 où 8 la16première 20 4ligne seront, par commodité, des listes de nombres et pas des chaînes de caractères. représente 0le texte, 1 2la seconde 3 4 les5entiers 6 correspondants, 7 8 9 et 10la troisième 11 12 les13indices 14 dans 15 le16 tableau 17 t. e c o l e p o l y t e c h n i q u e 2.2 Le codage 4 2de14Cesar 11 4 15 Codage 14 11 de24césar 19 4 2 7 13 8 16 20 4 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Ce codage est le plus rudimentaire que l on puisse imaginer. Il a été utilisé par Jules César (et même auparavant) pour certaines de sescodage correspondances. de CésarLe principe est de décaler les lettres de l alphabet vers la gauche de 1 ou plusieurs positions. Par exemple, en décalant les lettres de 1 Ce codage est le plus rudimentaire que l on puisse imaginer. Il a été utilisé par Jules César (et position, le caractère a se transforme en z, leb en a,... le z en y. Le texte avecesar devient donc même auparavant) pour certaines de ses correspondances. Le principe est de décaler les lettres zudbdrzq. de l alphabet vers la gauche de 1 ou plusieurs positions. Par exemple, en décalant les lettres de 1 Question Question 1 Que donne le codage du texte maitrecorbeau utilisant un décalage 5? position, 2 : le Ecrire caractère une fonction a se transforme codagecesar(t,d) en z, leb en a, qui... prend le z en eny. arguments Le texte avecesar une listedevient t contenant donc des Question nombres dans 2 Écrire 0, 25 la fonction et un entier codagecesar(t, d et qui retourne n, d) quiune prend liste ende arguments même taille le tableau que t t, mais sa longueur n et un entier d ; et qui retourne un tableau de même taille que t contenant le texte t décalé dont zudbdrzq. les entrées sont décalées de d positions. Par Question exemple1 Que donne le codage du texte maitrecorbeau en utilisant un décalage de 5? de d positions. >>> Question codagecesar([1,2,24,0],2) Question 2 Écrire la fonction codagecesar(t, n, d) qui prend en arguments le tableau t, sa longueur 0, 22, n et24] un entier d ; et qui retourne un tableau de même taille que t contenant le texte t décalé 3 Écrire de même la fonction decodagecesar(t, n, d) prenant les mêmes arguments mais [25, qui réalise le décalage dans l autre sens. de d positions. Pour réaliser ce décodage, il faut connaître la valeur du décalage. Une manière de la déterminer Question Question 3 : 3Ecrire Écrireune de même fonction la fonction decodagecesar(t,d) prenant n, d) prenant les mêmes les mêmes arguments arguments mais mais qui réalise automatiquement le décalage dans estl autre d essayer sens. de deviner cette valeur. L approche la plus couramment employée qui réalise le décalage dans l autre sens. est de regarder la fréquence d apparition de chaque lettre dans le texte crypté. En e et, la lettre Pour réaliser ce décodage, il faut connaître la valeur du décalage. Une manière de la déterminer la plus fréquente dans un texte su samment long en français est la lettre e. automatiquement Question 4 Écrire est la fonction d essayer de deviner cette valeur. L approche la plus couramment employée frequences(t0,n) qui prend en argument un tableau t 0 de taille n est de regarder la fréquence d apparition de chaque lettre dans le texte crypté. En e et, la lettre représentant le texte crypté ; et qui retourne un tableau de taille 26 dont la case d indice i contient la plus fréquente dans un texte su samment long en français est la lettre e. le nombre d apparitions du nombre i dans t (0 6 i<26). Question Question 4 : Ecrire 4 Écrire une la fonction frequences(t0 fréquence(tc),n) qui prend en argument une tableau liste tc t 0 de contenant taille n le texte représentant crypté etlequi texte retourne crypté ; une et qui liste retourne de taille un tableau 26 dont delataille case26d indice dont la case i contient d indicelei contient nombre 1 d apparitions le nombredud apparitions i dans du nombre tc (pour i dans 0 i t < (026). 6 i<26). Par exemple : >>>tc=[25,3,4,1,4,4,2,24,25,1] 1 >>>print(frequence(tc)) [0, 2, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2] Question 5 : Ecrire une fonction decodageauto(tc) qui prend en argument une liste tc représentant le texte crypté (toujours des nombres dans 0, 25 ), et qui retourne le texte d origine en calculant la clé pour que la lettre e soit la plus fréquente dans le texte décrypté. N.B. On pourra utiliser la fonction maxi du 1. 2
Question 5 Écrire la fonction decodageauto(t0,n) qui prend en argument le tableau t 0 de taille n représentant le texte crypté ; et qui retourne le texte t d origine (en calculant la clé pour que la lettre e soit la plus fréquente dans le texte décrypté). Question 5 Écrire la fonction decodageauto(t0,n) qui prend en argument le tableau t 0 de taille n représentant le texte crypté ; et qui Codage retourne de le texte Vigenère t d origine (en calculant la clé pour que la 2.3 Codage de Vigenère lettre Au XVIème e soit lasiècle, plus fréquente Blaise de dans Vigenère le texte a modernisé décrypté). le codage de César très peu résistant de la manière suivante. Au lieu de décaler Codage toutes les de lettres Vigenère du texte de la même manière, on utilise un texte clé qui donne une suite de décalages. Au XVIème siècle, Blaise de Vigenère a modernisé le codage de César très peu résistant de la Prenons par exemple la clé concours. Pour crypter un texte, on code la première lettre en manière suivante. Au lieu de décaler toutes les lettres du texte de la même manière, on utilise un utilisant le décalage qui envoie le a sur le c (la première lettre de la clé). Pour la deuxième lettre, texte clé qui donne une suite de décalages. on prend le décalage qui envoie le a sur le o (la seconde lettre de la clé) et ainsi de suite. Pour la Prenons par exemple la clé concours. Pour crypter un texte, on code la première lettre en huitième lettre, on utilise le décalage a vers s, puis, pour la neuvième, on reprend la clé à partir utilisant le décalage qui envoie le a sur le c (la première lettre de la clé). Pour la deuxième lettre, de sa première lettre. Sur l exemple ecolepolytechnique avec la clé concours, on obtient : (la on prend le décalage qui envoie le a sur le o (la seconde lettre de la clé) et ainsi de suite. Pour la première ligne donne le texte, la seconde le texte crypté et la troisième la lettre de la clé utilisée huitième lettre, on utilise le décalage a vers s, puis, pour la neuvième, on reprend la clé à partir pour le décalage) de sa première lettre. Sur l exemple ecolepolytechnique avec la clé concours, on obtient : (la première ligne donne e c le o texte, l la e seconde p o le l texte y crypté t e et c la troisième h n i la lettre q u de e la clé utilisée pour le décalage) g q b n s j f d a h r e v h z i w s c o n c o u r s c o n c o u r s c o e c o l e p o l y t e c h n i q u e Question Question 6 : Ecrire 6 Donner une le fonction codage codagevigenere(t,c) du texte becunfromage en qui utilisant prend comme la clé dearguments codage jean. une liste g q b n s j f d a h r e v h z i w s d entiers t représentant Question 7 Écrire c le la o texte fonction n à c crypter codagevigenere(t, o u et r une s liste c d entiers n, oc, k) n qui c servant prend o u au comme r codage sarguments c et qui o retourne un tableau une liste contenant le texte crypté, qu on appellera t par la suite. t de taille n représentant le texte à crypter, et un tableau d entiers c de longueur k donnant la clé Question 6 Donner le codage du texte becunfromage en utilisant la clé de codage jean. servant au codage ; et qui retourne un tableau de taille n contenant le texte crypté t 0. 2.4 Question Suite seulement 7 Écrire la fonction pourcodagevigenere(t, ceux qui visent Maintenant, on suppose disposer d un texte t 0 n, c, l option k) qui prendinfo comme! arguments un tableau assez long crypté par la méthode de Vigenère, Si t et vous de taille on voulez n représentant veut retrouver faire cesle questions le texte texte t d origine. en à crypter, D.S Pour : assurez et un tableau cela, vous on doit que d entiers trouver tout ce c de laqui longueur clé précèdek c ayant servi est donnant juste au codage.! la clé servant au codage ; et qui retourne un tableau de taille n contenant le texte crypté t On procède en deux temps : 1) détermination de la longueur k de la clé c, 2) détermination 0. des Maintenant, on suppose disposer d un texte t lettres composant c. 0 assez long crypté par la méthode de Vigenère, et on veut retrouver le texte t d origine. Pour cela, on doit trouver la clé c ayant servi au codage. La première étape est la plus di cile. On remarque que deux lettres identiques dans t espacées On procède en deux temps : 1) détermination de la longueur k de la clé c, 2) détermination des de ` k caractères (où ` est un entier et k la taille de la clé) sont codées par la même lettre dans lettres t 0 composant c.. Mais cette condition n est pas su sante pour déterminer la longueur k de la clé c puisque des La première étape est la plus di cile. répétitions peuvent apparaître dans t 0 On remarque que deux lettres identiques dans t espacées sans qu elles existent dans t. Par exemple, les lettres t et n de ` k caractères (où ` est un entier et k la taille de la clé) sont codées par la même lettre dans sont toutes deux codées par la lettre h dans le texte crypté à partir de ecolepolytechnique avec t concours 0. Mais cette condition n est pas su sante pour déterminer la longueur k de la clé c puisque des comme clé. Pour éviter ce problème, on recherche les répétitions non pas d une lettre répétitions peuvent apparaître dans mais de séquences de lettres dans t 0 t 0 sans qu elles existent dans t. Par exemple, les lettres t et n puisque deux séquences de lettres répétées dans t, dont les sont toutes deux codées par la lettre h dans le texte crypté à partir de ecolepolytechnique avec premières lettres sont espacées par ` k caractères, sont aussi cryptées par deux mêmes séquences concours dans t 0 comme clé. Pour éviter ce problème, on recherche les répétitions non pas d une lettre. mais de séquences de lettres dans t Dans la suite de l énoncé, on ne considère 0 puisque deux séquences de lettres répétées dans t, dont les que des séquences de taille 3 en supposant que toute premières lettres sont espacées par ` k caractères, répétition d une séquence de 3 lettres dans t 0 sont aussi cryptées par deux mêmes séquences provient exclusivement d une séquence de 3 lettres dans t répétée 0. dans t. Ainsi, la distance séparant ces répétitions donne des multiples de k. Dans la suite de l énoncé, on ne considère que des séquences de taille 3 en supposant que toute La valeur de k est obtenue en prenant le PGCD de tous ces multiples. Si le nombre de répétitions répétition d une séquence de 3 lettres dans t est su sant, on a de bonnes chances d obtenir 0 provient exclusivement d une séquence de 3 lettres la valeur de k. On suppose donc que cette assertion répétée dans t. Ainsi, la distance séparant ces répétitions donne des multiples de k. est vraie. La valeur de k est obtenue en prenant le PGCD de tous ces multiples. Si le nombre de répétitions est su sant, on a de bonnes chances d obtenir la valeur de k. On suppose donc que cette assertion 2 est vraie. N.B Pour la question suivante On suppose qu on dispose déjà d une fonction pgcd(a,b) qui 2 renvoie le pgcd des entiers a et b. Question 7 : Ecrire une fonction pgcddistances(tc,i) qui prend en arguments le texte crypté tc (liste d entiers) et un entier i tels que 0 i n 2 où n est la longueur du texte, où i est l indice d une lettre dans tc, et qui retourne le pgcd des distances entre les répétitions de la séquence de 3
3 lettres (t[i],t[i+1],t[i+2]) dans la suite du texte (t[i+3],t[i+4],...,t[n-1]). Cette fonction retourne 0 s il n y a pas de répétitions. Question 8 : Ecrire la fonction longueurcle(tc) qui renvoie la longueur de la clé de codage du texte crypté tc. Question 9 : Une fois la longueur de la clé connue, trouver un algorithme permettant de retrouver chacune des lettres de la clé. 3 T.P. 7 vacances : une utilisation plus commode On voudrait utiliser les fonctions précédentes de manière beaucoup plus souple. Pour cela, on aimerait pouvoir lire un fichier texte et le transformer en fichier codé. C est possible avec les commandes d ouvertures et d écritures données au chapitre 7. Reste à savoir comment obtenir efficacement les numéros unicode d un caractère. J ai déjà parlé plus haut de ord. Il faut mentionner aussi chr() qui prend comme argument un entier et affiche le caractère unicode correspondant à cet entier >>> chr(65) A Néanmoins, il faudra délimiter les caractères qui vous autorisez à être présents dans votre texte... car le principe du codage est bien sûr qu on sait exactement combien on a de caractères. Comme il y a des trous dans le unicode (essayez print(chr(i))) pour i dans une boucle de votre choix, cela demande un peu de recherche pour savoir de quoi vous aurez vraiment besoin... 4
Corrigé du D.S. 2 1 QdC a) t=[0]*26 b) cf T.P. 6. c) Le isinstance(a,int) teste si l objet a est une instance de la classe des entiers... autrement dit si a est du type int. d) Le raise ValueError est reconnu comme une erreur par l interpréteur Python. Il permet d interrompre le déroulement d un programme qui appellerait cette fonction. e) Cf. C.R. T.P. 3 première partie. 2 Codage de César et Vigenère 2.1 Représentation d un texte par une liste de chiffre def transforme(t): l=[] for i in t: l.append(ord(i)-97) return l 2.2 Codage de César Q2 et Q3 def codagecesar(t,d): tt=[] for i in range(len(t)): tt.append((t[i]-d)%26) return tt def decodagecesar(t,d): return codagecesar(t,-d) Q4 def frequence(tc): freq=[0]*26 for lettre in tc: # on parcourt les valeurs de tc freq[lettre]+=1 # pour chaque valeur de lettre on incrémente de 1 la valeur d indice co return freq Q5 def decodageauto(tc): freq=frequence(tc) # on récupère le tableau des fréquences (max,i_max)=maxi(freq) # on va s interesser à l indice max dans freq d=(4-i_max)%26 # on définit le décalage comme l écart modulo 26 # entre 4 l indice de e et i_max, mais il ne faut pas se tromper de sens. # si i_max=2 par exemple on veut que d=2 avec la déf. donnée du codage print(d) return decodagecesar(tc,d) Un exemple : 5
>>>texte= untexteunpeulongdevracompterunemajoritedeevousnelecroyezpas >>> L=transforme(texte) >>> frequence(l) [3, 0, 2, 2, 12, 0, 1, 0, 1, 1, 0, 2, 2, 5, 5, 3, 0, 4, 2, 4, 5, 2, 0, 1, 1, 1] 2.3 Codage de Vignère Q6 def codagevignere(t,c): tr=[] for i in range(len(t)): tr.append((t[i]+c[i%len(c)])%26) return tr 6