Pièce jointe « x2008.py »

Téléchargement

   1 # Conversion d'une chaîne en un tableau d'entiers
   2 # Les 26 lettres (majuscules) sont codées par les nombres de 0 à 25
   3 def conversion_chaine_tab (ch):
   4     n=len(ch)
   5     result=[0]*n
   6     for i in xrange(n):
   7         result[i]=ord(ch[i])-65
   8     return result
   9 
  10 # Fonction inverse de la précédente
  11 def conversion_tab_chaine(t):
  12     result=""
  13     n=len(t)
  14     for i in xrange(n):
  15         result=result + chr(t[i]+65)
  16     return result
  17 
  18 #                               PARTIE I
  19 
  20 # Question 1
  21 def codageCesar(t,n,d):
  22     result=[0]*n
  23     for i in xrange(n):
  24         result[i]=(t[i]-d)%26
  25     return result
  26 
  27 #Question 2
  28 def decodageCesar(t,n,d):
  29     result=[0]*n
  30     for i in xrange(n):
  31         result[i]=(t[i]+d)%26
  32     return result
  33 
  34 #Question 4
  35 def frequence(t):
  36     n=len(t)
  37     result=[0]*26
  38     for i in xrange(n):
  39         result[t[i]]=result[t[i]]+1
  40     return result
  41 
  42 # Fonction qui calcule le décalage, utilisée par la fonction decalageAuto
  43 def calcule_decalage(t):
  44     indmax=0
  45     for i in xrange(26):
  46        if t[i]>t[indmax]:
  47            indmax=i
  48     return (4-indmax)%26
  49 
  50 # Question 5
  51 def decodageAuto(t):
  52     n=len(t)
  53     f=frequence(t)
  54     d=calcule_decalage(f)
  55     result=decodageCesar(t,n,d)
  56     return result
  57 
  58 #                                PARTIE II
  59 
  60 # Question 7
  61 def codageVigenere(t,n,c,k):
  62     result=[0]*n
  63     j=0
  64     for i in xrange(n):
  65         d=-c[j]%26
  66         result[i]=(t[i]-d)%26
  67         j=(j+1)%k
  68     return result
  69 
  70 # Cette fonction permet le décodage lorsque le clé est connue
  71 def decodageVigenere(t,n,c,k):
  72     result=[0]*n
  73     j=0
  74     for i in xrange(n):
  75         d=-c[j]%26
  76         result[i]=(t[i]+d)%26
  77         j=(j+1)%k
  78     return result
  79 
  80 # Question 8
  81 def pgcd(x,y):
  82     a=x
  83     b=y
  84     while b!=0:
  85         while a>=b:
  86             a=a-b
  87         c=a
  88         a=b
  89         b=c
  90     return a
  91 
  92 # Question 9
  93 def pgcdDesDistancesEntreRepetitions(t,n,i):
  94     result=0
  95     for j in xrange(i+3,n-2):
  96         if t[i]==t[j] and t[i+1]==t[j+1] and t[i+2]==t[j+2]:
  97             result=pgcd(result,j-i)
  98     return result
  99 
 100 # Question 10
 101 def longueurDeLaCle(t,n):
 102     result=0
 103     for i in xrange(n-2):
 104         result=pgcd(result,pgcdDesDistancesEntreRepetitions(t,n,i))
 105     return result
 106 
 107 # Question 11 et 12
 108 def decodageVigenereAuto(t,n):
 109     lg=longueurDeLaCle(t,n)
 110     cle=[0]*lg
 111     for i in xrange(lg):
 112         f=[0]*26
 113         for k in xrange(i,n,lg):
 114             f[t[k]]=f[t[k]]+1
 115         indmax=0
 116         for k in xrange(26):
 117             if f[indmax]<f[k]:
 118                 indmax=k
 119         cle[i]=(indmax-4)%26
 120     return decodageVigenere(t,n,cle,lg)
 121     
 122 # Pour tester le codage de César lorsque le décalage est connu (j'ai fait en sorte que E soit la lettre la plus fréquente)
 123 def test0():
 124     x=conversion_chaine_tab("MESTRECORBEAU")
 125     d=5
 126     y=codageCesar(x,len(x),d)
 127     z=decodageCesar(y,len(y),d)
 128     print conversion_tab_chaine(z)
 129 
 130 #Pour tester le codage de César avec un décodage qui calcule le décalage
 131 def test1():
 132     x=conversion_chaine_tab("MESTRECORBEAU")
 133     d=5
 134     y=codageCesar(x,len(x),d)
 135     z=decodageAuto(y)
 136     print conversion_tab_chaine(z)
 137 
 138 # Pour tester le codage et décodage de Vigenere connaissant le texte de la clé
 139 def test2():
 140     t=conversion_chaine_tab("ECOLEPOLYTECHNIQUE")
 141     n=len(t)
 142     c=conversion_chaine_tab("CONCOURS")
 143     k=len(c)
 144     x=codageVigenere(t,n,c,k)
 145     print conversion_tab_chaine(x)
 146     y=decodageVigenere(x,n,c,k)
 147     print conversion_tab_chaine(y)
 148 
 149 # Pour tester Vigenere en calculant le texte de la clé qui a été utilisé pour le codage
 150 def test3():
 151     txt="""SOUVENTPOURSAMUSERLESHOMMESDEQUIPAGEPRENNENTDESALBATROSVASTESOISEAUXDESMERSQUISUIVENTINDOLENTSCOMPAGNONSDEVOYAGELENAVIREGLISSANTSURLESGOUFFRESAMERSAPEINELESONTILSDEPOSESSURLESPLANCHESQUECESROISDELAZURMALADROITSETHONTEUXLAISSENTPITEUSEMENTLEURSGRANDESAILESBLANCHESCOMMEDESAVIRONSTRAINERACOTEDEUXCEVOYAGEURAILECOMMEILESTGAUCHEETVEULELUINAGUERESIBEAUQUILESTCOMIQUEETLAIDLUNAGACESONBECAVECUNBRULEGUEULELAUTREMIMEENBOITANTLINFIRMEQUIVOLAITLEPOETEESTSEMBLABLEAUPRINCEDESNUEESQUIHANTELATEMPETEETSERITDELARCHERBAUDELAIRE"""
 152     print txt
 153     t=conversion_chaine_tab(txt)
 154     n=len(t)
 155     c=conversion_chaine_tab("SCUBA")
 156     k=len(c)
 157     x=codageVigenere(t,n,c,k)
 158     print
 159     print "TEXTE codé"
 160     print conversion_tab_chaine(x)
 161     print
 162     print "TEXTE décodé"
 163     y=decodageVigenereAuto(x,n)
 164     print conversion_tab_chaine(y)
 165 
 166 
 167         

Fichiers joints

Pour vous référer aux pièces jointes d'une page, utilisez attachment:filename, comme indiqué ci-dessous dans la liste de fichiers. N'utilisez pas l'URL du lien [get], car elle peut changer et donc être facilement cassée.
 All files | Selected Files: delete move to page copy to page

Vous n'êtes pas autorisé à joindre un fichier à cette page.