##########  TP8 - Corrige
## Cesar
# Réponse 1 à 7 #
#################

def decalage_lettre(t,d):
    i = ord(t)-97    
    i = (i+d) % 26
    return chr(i+97)

def codageCesar(txt,d):
    s=''
    for i in txt:
        s+=decalage_lettre(i,d)
    return s    
    

mot='maitrecorbeau'
mot='avecesar'
mot='lyceebellevue'
mot='ecolepolytechnique'

print(codageCesar(mot,5))
#jhtqjutqdyjhmsnvzj

def codageCesar2(txt,d):
    s=''
    for i in txt:
        if i==' ':
            s+=' '
        else :
            s+=decalage_lettre(i,d)
    return s    

mot='lycee bellevue'
mot2='ecole polytechnique'

print(codageCesar2(mot,5))
# qdhjj gjqqjazj
print(codageCesar2(mot2,5))
#jhtqj utqdyjhmsnvzj


def decodageCesar(t,d):
    return codageCesar2(t,-d)

def frequences(t):
    compteur = [0] * 26
    for lettre in t:
        i = ord(lettre)-97   
        compteur[i] += 1
    return compteur

mot='qdhjjgjqqjazj'
print(frequences(mot))
# [1, 0, 0, 1, 0, 0, 1, 1, 0, 5, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1]

def decodageAuto(t):
    tab = frequences(t)
    for i in range(len(tab)):
        valeur=tab[i]
        if valeur==max(tab):
            d = -(4-i)%26  #-(i-7)%26
            return decodageCesar(t,d)


mot = 'ecolepolytechnique'
print(codageCesar(mot,5))
#zxjgzkjgtozxcidlpz

mot='zxjgzkjgtozxcidlpz'
print(decodageAuto(mot))
# ecolepolytechnique 

## Vigenère 
print("Vigénère")         
# Réponse 8 #
#############

def codageVignere(t,c):
    resultat = ''
    for i in range(len(t)):
        d = ord(c[i%len(c)])-97
        resultat+=decalage_lettre(t[i],d)
    return resultat

print(codageVignere('ecolepolytechnique','concours'))
# gqbnsjfdahrevhziws
print(codageVignere('becunfromage','jean'))
# kichwjrbvegr

def decodageVignere(t,c):
    resultat = ''
    for i in range(len(t)):
        d = ord(c[i%len(c)])-97
        resultat+=decalage_lettre(t[i],-d)
    return resultat

print(decodageVignere('gqbnsjfdahrevhziws','concours'))
# ecolepolytechnique
print(decodageVignere('kichwjrbvegr','jean'))
# becunfromage


text = "\
maitre corbeau sur un arbre perche\
tenait en son bec un fromage\
maitre renard par l odeur alleche\
lui tint a peu pres ce langage\
he bonjour monsieur du corbeau\
que vous etes joli que vous me semblez beau\
sans mentir si votre ramage\
se rapporte a votre plumage\
vous etes le phenix des hotes de ces bois\
a ces mots le corbeau ne se sent pas de joie\
et pour montrer sa belle voix\
il ouvre un large bec laisse tomber sa proie\
le renard s en saisit et dit mon bon monsieur\
apprenez que tout flatteur\
vit aux depens de celui qui l ecoute\
cette lecon vaut bien un fromage sans doute\
le corbeau honteux et confus\
jura mais un peu tard qu on ne l y prendrait plus"

def codageVignere2(t,c):
    resultat = ''
    for i in range(len(t)):
        d = ord(c[i%len(c)])-97
        if t[i]==' ':
            resultat+=' '
        else :
            resultat+=decalage_lettre(t[i],d)
    return resultat

def decodageVignere2(t,c):
    resultat = ''
    for i in range(len(t)):
        d = ord(c[i%len(c)])-97
        if t[i]==' ':
            resultat+=' '
        else :
            resultat+=decalage_lettre(t[i],-d)
    return resultat   
     
print(codageVignere2(text,'jean'))

#veigai cbafend wue dr aekve cnvcun
#xeajmt rw woa kic hw jrbvegr
#veigai rrwerq yer y xheha elynghr
#uyi grrt n yiu cais pn paapegr
#qi bbwnoha qoabmeha hu pxvbrjy
#qhn zohb itrb noyr uur esuf vi srvflri fend
#waab qeacmr fr zogai rnvegr
#bi rnytoeci a ixxrr ypuzjke
#ixys rcis yn thrwmx qnw hbcis qn gef ksif
#j gef vstf ui cbafend re fn weac taf mi jbri
#eg ysue vsngair fj feyui vbrb
#iy xyven yn yjvgr kic yjmsfn xozkir fj trbri
#lr ainnah s rw wavbmt rc hig vsn oxr mbwwirdv
#acyveand qhn xohc jlncxeha
#zig jyx qnteab he pnpuv zyi y ngohci
#crcxe yngoa eeug kmea dr fexqatn waab hohci
#lr lsroneu uxrtrdb eg lsnsdw
#jhae mnrw ua yiu gjvd dd sn an p y cainqaeig ypuf


## pour la question 13
def decodageAutoAdapte(t):
    tab = frequences(t)
    for i in range(len(tab)):
        valeur=tab[i]
        if valeur==max(tab):
            d = -(4-i)%26  #-(i-7)%26
            return chr(97+d)
        
##text_sans_espaces        
text_sans_espaces = "\
maitre corbeau sur un arbre perche\
tenait en son bec un fromage\
maitre renard par l odeur alleche\
lui tint a peu pres ce langage\
he bonjour monsieur du corbeau\
que vous etes joli que vous me semblez beau\
sans mentir si votre ramage\
se rapporte a votre plumage\
vous etes le phenix des hotes de ces bois\
a ces mots le corbeau ne se sent pas de joie\
et pour montrer sa belle voix\
il ouvre un large bec laisse tomber sa proie\
le renard s en saisit et dit mon bon monsieur\
apprenez que tout flatteur\
vit aux depens de celui qui l ecoute\
cette lecon vaut bien un fromage sans doute\
le corbeau honteux et confus\
jura mais un peu tard qu on ne l y prendrait plus".replace(" ","")

#############
# Réponse 10 #
#############

def pgcd(a,b):
    if a<b : 
        a,b = b,a
    if a==b or b==0: 
        return a
    else :
        return pgcd(a-b,b)

#############
# Réponse 11 #
#############

def pgcdDesDistancesEntreRepetitions(t,i):
    assert i >=0 and i < len(t)-1-3
    taille = 0
    emprunte = t[i:i+3]
    for j in range(i+3,len(t)-3):
        if t[j:j+3] == emprunte:
            if taille==0:
                taille = -(j-i)
            else:
                taille = pgcd(abs(taille),j-i)
    if taille>0:
        return taille
    else:
        return 0

def longueurDeLaCle(t):
    taille = 0
    for i in range(len(t)-1-3):
        mem = pgcdDesDistancesEntreRepetitions(t,i) 
        if mem>1 and (taille>mem or taille == 0):
            taille = mem
    return taille

print(longueurDeLaCle(codageVignere(text_sans_espaces,'jean')))
print()

##############
# Réponse 12 #
##############

# len(t)-sequence

##############
# Réponse 13 #
##############

def trouver_la_cle(t):
    n = len(t)
    k = longueurDeLaCle(t)
    cle = '' 
    for i in range(k):
        cle_k = []
        for j in range(((n-1-i)//k)+1):
            cle_k+=[t[i+j*k]]
        cle+=decodageAutoAdapte(cle_k)
        print(cle)
    return cle

text2=codageVignere(text_sans_espaces ,'jean')
print(trouver_la_cle(text2))
#snjw

##############
# Réponse 14 #
##############

def decodageVigenereAuto(t):
    return decodageVignere(t,trouver_la_cle(t))

print(decodageVigenereAuto(text2))

