def racines_degre2(P):
    """renvoie les racines d'un polynôme de degré 2"""
    delta=int(P[1]**2-4*P[2]*P[0])
    if delta==0:
        x0=Fractions(-1,2)*P[1]/P[2]
        liste_racines=[x0.simplifie()]
        liste_str_racines=["\\dfrac{-%s}{2\\times %s}"%(pTeX(P[1]),pTeX(P[2]))]
        simplrac=[False]
    elif delta>0:
        simplrac,strx1,x1,strx2,x2=listeracines(P[2],P[1],delta,parentheses=False)
        liste_racines=[x1,x2]
        liste_str_racines=[strx1,strx2]
    else:
        simplrac=[False]
        liste_racines=liste_str_racines=[]
    return delta,simplrac,liste_racines,liste_str_racines
def redaction_racines(P,nomP,var,cor=[]):
    delta,simpl_delta,liste_racines,liste_str_racines=racines_degre2(P)
    ligne_delta=u"Je calcule $\\Delta=%s^2-4\\times %s\\times %s=%s$"%(pTeX(P[1]),pTeX(P[2]),pTeX(P[0]),TeX(delta))
    if simpl_delta[0]:
        ligne_delta+=" et $%s=%s$.\\par"%(radicalTeX(delta),simpl_delta[1])
    else:
        ligne_delta+=".\\par"
    cor.append(ligne_delta)
    if delta<0:
        cor.append("Comme $\\Delta <0$, $%s(%s)$ n'a pas de racines."%(nomP,var))
    elif delta==0:
        cor.append("Comme $\\Delta=0$, $%s(%s)$ a une seule racine $%s_0=%s=%s$.\\par"%(nomP,var,var,liste_str_racines[0],TeX(liste_racines[0])))
    else:#delta>0
        [x1,x2]=liste_racines
        cor.append("Comme $\\Delta>0$, $%s(%s)$ a deux racines :"%(nomP,var))
        if isinstance(x1,RacineDegre2):
            simplification1=simplification2=""
            x1,detail1=x1.simplifie(True)
            x2,detail2=x2.simplifie(True)
            max_len=max(len(detail1),len(detail2))
            cor.append("\\begin{align*}")
            cor.append("%s =&%s  &%s =&%s"%\
                       (liste_str_racines[0],liste_racines[0],liste_str_racines[1],liste_racines[1]))
            cor.append("\\\\")
            for i in range(0,max_len):
                if i <len(detail1):
                    cor.append("=&%s&"%(detail1[i]))
                else:
                    cor.append("&&")
                if i <len(detail2):
                    cor.append("=&%s"%(detail2[i]))
                else:
                    cor.append("& ")
                cor.append("\\\\")
            cor.pop(-1)
            cor.append("\\end{align*}")
            cor.append("Les racines de $%s$ sont $%s_1=%s$ et $%s_2=%s$.\\par"%(nomP,var,x1,var,x2))
        else:
            [strx1,strx2]=liste_str_racines
            cor.append("Les racines de $%s$ sont $%s_1=%s=%s$ et $%s_2=%s=%s$."%(nomP,var,strx1,x1,var,strx2,x2))

    return cor
def factorisation_degre2(P,factorisation=True):
    #x1=x2=0
    var=P.var
    X=Polynome({1:1},var)
    delta=int(P[1]**2-4*P[2]*P[0])
    if delta<0:
        factorisation=[]
        str_racines=[]
        racines=[]
        simplrac=[False]
    elif delta==0:
        x0=Fractions(-1,2)*P[1]/P[2]
        simplrac=[False]
        racines=[x0.simplifie()]
        str_racines=["\\dfrac{-%s}{2\\times %s}"%(pTeX(P[1]),pTeX(P[2]))]


        P0="%s-%s"%(var,pTeX(racines[0]))
        factorisation=[[P0,P0]]#non simplifiée

        if 0>racines[0]:
            P0=X-racines[0]
            factorisation.append([P0,P0])
    else:#delta>0
        simplrac,strx1,x1,strx2,x2=listeracines(P[2],P[1],delta)
        if isinstance(x1,RacineDegre2):
            x1=x1.simplifie()
            x2=x2.simplifie()
        racines=[x1,x2]
        str_racines=[strx1,strx2]
        P1="%s-%s"%(var,pTeX(x1))
        P2="%s-%s"%(var,pTeX(x2))
        factorisation=[[P1,P2]]#non simplifiée
        #Peut-on simplifier les parenthèses ?
        if x1.radicande==0 and (x1.numerateur<0 or x2.numerateur<0):
            P1=(X-x1)(var)
            P2=(X-x2)(var)
            factorisation.append([P1,P2])
    return delta,simplrac,racines,str_racines,factorisation
def listeracines(a,b,delta,parentheses=False):
    '''renvoie racsimple,simplifie,formule_x1,x_1,formule_x2,x2'''
    '''avec x_1<x_2
       si parenthese=True, renvoie deux booleens
          parenthesex1=True signifie qu'il faut mettre des parenthese autour de x1
       On suppose delta >0
       simplrac est True si racine de delta se simplifie'''
    a=int(a)
    b=int(b)
    parenthesex1=parenthesex2=True #par défaut
    #simplrac=True
    strx1="\\dfrac{-%s-\\sqrt{%s}}{2\\times %s}"%(pTeX(b),TeX(delta),pTeX(a))
    strx2="\\dfrac{-%s+\\sqrt{%s}}{2\\times %s}"%(pTeX(b),TeX(delta),pTeX(a))
    ##on a strx1<strx2
    coeff,radicande=simplifie_racine(delta)

    #x1,x2 simplifiés ont une écriture fractionnaire donc
    parenthesex1=parenthesex2=False
    if coeff==1:#delta n'a pas de facteur carré, on ne peut rien simplifier
        rac_delta=radicalTeX(delta)
        simplrac=[False]
    else:
        if radicande==1:
            rac_delta=TeX(coeff)
        else:
            rac_delta=TeX(coeff)+radicalTeX(radicande)
        simplrac=[True,rac_delta]
    x1=RacineDegre2(-b,2*a,-1,delta)
    x2=RacineDegre2(-b,2*a,1,delta)
    if b==0:
        parenthesex1=(coeff*a>0)
        parenthesex2=(coeff*a<0)
    if a<0:
        strx1,strx2,x1,x2,parenthesex1,parenthesex2=strx2,strx1,x2,x1,parenthesex2,parenthesex1
    if parentheses:
        return simplrac,strx1,x1,strx2,x2,parenthesex1,parenthesex2
    else:
        return simplrac,strx1,x1,strx2,x2