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):
    #plt.plot(list(range(1, 27)), frequences(t0), 'ro')
    for i, j in enumerate(t0):
        plt.bar(i+1, j)
    plt.ylabel('fréquences')
    plt.xlabel('lettres')
    plt.show()

# 7:

def Max(l):
    m=max(l)
    res=(m, [])
    for i, char in enumerate(l):
        if char == m:
            res[1].append(i)
    return res

# 8:

def decodageAuto(t0):
    codes=[]
    print(Max(frequences(t0)))
    for c in Max(frequences(t0))[1]:
        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:
texte="""desfoisbonsoirlesenfantsjemecontentederepetercequejentendsparcequecestrigoloparcequemaintenantjefaispourbonetjesaispluscequejedisaisneamoinsjemeretrouveaecrireuntextesansespacessansapostrophessanscaracterespecialquelquuilsoitetcestunpeucomplexedesyretrouvercarlaponctuationestfortutileenfrancais"""
def pgcdDesDistancesEntreRepetitions(l, i):
    ecarts=[]
    sec=l[i:i+3]
    g=i+1
    for j in range(g, len(l)-2):
        if sec==l[j:j+3]:
            ecarts.append(j-i)
    print(ecarts)
    while len(ecarts)>1:
        ecarts[0]=pgcd(ecarts.pop(0), ecarts[0])
    if ecarts:
        return ecarts[0]
    return 0

def longueurDeLaCle(l):
    k=0
    for i in range(len(l)-5):
        v=pgcdDesDistancesEntreRepetitions(l, i)
        if v:
            k=pgcd(k,v)
    return k