def equilibre_reccurEtendue(texte, n, ind):
    res=([],0)
    if longueur(texte)<=n: #si la longueur du texte est inférieur à la longueur de la ligne
        res=([texte],0,'infini',0) #alors pas besoin de le découper, et on ignore le déséquilibre
        MEMO.add_etendue(ind,res[0],res[1],res[2],res[3])
    else :
        curr=0
        s='infini'
        longtext=longueur(texte[0:1])
        while longtext<=n:
            reccur=MEMO.get_etendue(ind+curr+1)
            if reccur==-1:
                reccur=equilibre_reccurEtendue(texte[curr+1:],n,ind+curr+1)
                MEMO.add_etendue(ind+1,reccur[0],reccur[1],reccur[2],reccur[3])
            c=reccur[2]
            l=reccur[3]
            if min(longtext,c)==longtext:
                c=longtext
            if min(longtext,l)==l:
                l=longtext                
            s1=l-c
            if min(s1,s)==s1:
                s=s1
                res=([texte[0:curr+1]]+reccur[0],s,c,l)
            curr+=1
            longtext=longueur(texte[0:curr+1])
    return res
def equilibreEtendue(texte, n):  
    global MEMO
    MEMO=Memo()
    for i in range (len(texte)-1,-1,-1):    #Pour i allant de l'indice du dernier mot au premier
        if longueur(texte[i:])<=n:
            res=([texte[i:]],0,'infini',0)
        else:
            curr=0
            deseq='infini'
            longtext=longueur(texte[i:i+1])
            while longtext<=n:
                suite=MEMO.get_etendue(i+curr+1)
                c=suite[2]
                l=suite[3]
                if min(longtext,c)==longtext:
                    c=longtext
                if min(longtext,l)==l:
                    l=longtext                
                deseq_bis=l-c
                if min(deseq,deseq_bis)==deseq_bis: #on notera que la fonction min a été surchargée pour
                                                    #considérer 'infini' comme l'infini
                    deseq=deseq_bis
                    res=([texte[i:i+curr+1]]+suite[0],deseq,c,l)
                curr+=1
                longtext=longueur(texte[i:i+curr+1])
        MEMO.add_etendue(i,res[0],res[1],res[2],res[3])
    return res
def equilibre_reccur(texte, n, ind):
    res=([],0)
    if longueur(texte)<=n: #si la longueur du texte est inférieur à la longueur de la ligne
        res=([texte],0) #alors pas besoin de le découper, et on ignore le déséquilibre
        MEMO.add(ind,res[0],res[1])
    else :
        curr=0
        s='infini'
        while longueur(texte[0:curr+1])<=n:
            reccur=MEMO.get(ind+curr+1)
            if reccur==-1:
                reccur=equilibre_reccur(texte[curr+1:],n,ind+curr+1)
                MEMO.add(ind+1,reccur[0],reccur[1])
            s1=blancLigne(texte[0:curr+1],n)+reccur[1]
            if min(s1,s)==s1:
                s=s1
                res=([texte[0:curr+1]]+reccur[0],s)
            curr+=1
    return res
def equilibreVar(texte, n):
    global MEMO
    MEMO=Memo()
    for i in range (len(texte)-1,-1,-1):    #Pour i allant de l'indice du dernier mot au premier
        if longueur(texte[i:])<=n:
            res=([texte[i:]],0)        
        else:
            curr=0
            deseq='infini'
            while longueur(texte[i:i+curr+1])<=n:
                suite=MEMO.get(i+curr+1)
                deseq_bis=variance([texte[i:i+curr+1]]+suite[0])
                if min(deseq,deseq_bis)==deseq_bis: #on notera que la fonction min a été surchargée pour
                                                    #considérer 'infini' comme l'infini
                    deseq=deseq_bis
                    res=([texte[i:i+curr+1]]+suite[0],deseq)
                curr+=1
        MEMO.add(i,res[0],res[1])
    return res