2019-12-12 09:15:58 +01:00
import matplotlib . pyplot as plt
def tr ( texte ) :
return [ ord ( char ) - 97 for char in texte ]
def rev ( l ) :
return ' ' . join ( [ chr ( i + 97 ) for i in l ] )
# César
"""
1 : maitrecorbeau donne , en décalant de 5 : hvdomzxjmwzvp
2 : en utilisant l ' opération % (a % b) " " "
# 3:
def codageCesar ( t , d ) :
n = len ( t )
res = [ 0 for i in range ( n ) ]
for i in range ( n ) :
res [ i ] = ( t [ i ] - d ) % 26
return res
# 4:
def decodageCesar ( t , d ) :
return codageCesar ( t , - d )
# 5:
def frequences ( t0 ) :
return [ t0 . count ( i ) for i in range ( 26 ) ]
# 6:
def graphe_frequences ( t0 ) :
2019-12-12 09:50:47 +01:00
#plt.plot(list(range(1, 27)), frequences(t0), 'ro')
for i , j in enumerate ( t0 ) :
plt . bar ( i + 1 , j )
2019-12-12 09:15:58 +01:00
plt . ylabel ( ' fréquences ' )
plt . xlabel ( ' lettres ' )
plt . show ( )
# 7:
2020-01-10 13:06:43 +01:00
def Max ( l ) :
m = max ( l )
2019-12-12 09:15:58 +01:00
res = ( m , [ ] )
for i , char in enumerate ( l ) :
if char == m :
res [ 1 ] . append ( i )
return res
# 8:
def decodageAuto ( t0 ) :
codes = [ ]
2020-01-10 13:06:43 +01:00
print ( Max ( frequences ( t0 ) ) )
for c in Max ( frequences ( t0 ) ) [ 1 ] :
2019-12-12 09:15:58 +01:00
codes . append ( decodageCesar ( t0 , tr ( ' e ' ) [ 0 ] - c ) )
return codes
"""
Malgré le fait que la lettre e soit la plus fréquente en français , il est possible d ' écrire de manière compréhensible sans l ' utiliser majoritairement . Ainsi , cette méthode ne vérifie pas tant que le texte ait du sens . La fonction ne donne donc pas toujours le texte originel """
# Vigenère
# 1: On obitent 'kichwjrbvegr'
# 2:
def codageVigenere ( l , c ) :
return [ ( char + c [ i % len ( c ) ] ) % 26 for i , char in enumerate ( l ) ]
# 3: La fonction suivante détermine le pgcd de a et b. En effet, le programme s'arrête lorsque b vaut zero. C'est l'algorithme d'euclide.
def pgcd ( a , b ) :
while b :
a , b = b , a % b
return a
# 4:
2020-01-10 13:06:43 +01:00
texte = """ desfoisbonsoirlesenfantsjemecontentederepetercequejentendsparcequecestrigoloparcequemaintenantjefaispourbonetjesaispluscequejedisaisneamoinsjemeretrouveaecrireuntextesansespacessansapostrophessanscaracterespecialquelquuilsoitetcestunpeucomplexedesyretrouvercarlaponctuationestfortutileenfrancais """
2019-12-12 09:50:47 +01:00
def pgcdDesDistancesEntreRepetitions ( l , i ) :
ecarts = [ ]
sec = l [ i : i + 3 ]
2020-01-10 13:06:43 +01:00
g = i + 1
for j in range ( g , len ( l ) - 2 ) :
2019-12-12 09:50:47 +01:00
if sec == l [ j : j + 3 ] :
2020-01-10 13:06:43 +01:00
ecarts . append ( j - i )
2019-12-12 09:50:47 +01:00
print ( ecarts )
while len ( ecarts ) > 1 :
ecarts [ 0 ] = pgcd ( ecarts . pop ( 0 ) , ecarts [ 0 ] )
if ecarts :
return ecarts [ 0 ]
return 0
2020-01-10 13:06:43 +01:00
def longueurDeLaCle ( l ) :
k = 0
for i in range ( len ( l ) - 5 ) :
v = pgcdDesDistancesEntreRepetitions ( l , i )
if v :
k = pgcd ( k , v )
return k