def quest_fonctions_rationnelles_sur_R():

    nomf=['f','g','h','k'][randrange(4)]
    var=['t','x'][randrange(2)]
    X=Polynome({1:1},var)
    #intervalle pour les racines entières ou fractionnaire

    rac_min=-9
    rac_max=9
    b1=b2=a1=a2=0
    while b1==0 or b2==0 or a1==0 or a2==0 or a1*(-float(b2)/a1)+b1==0 or (a1*b2/a2 - b1)==0:
        #(a1*b2/a2 - b1)==0 on teste que la racine de Q n'annule pas P donc on ne peut pas simplifier
        b1=randint(rac_min,rac_max)
        b2=randint(rac_min,rac_max)
        a1=randint(-5,5)
        a2=randint(-5,5)
    P=a1*X+b1
    Q=a2*X+b2

    borneinf=float("-inf")
    bornesup=float("+inf")
    Intervalle=[borneinf,bornesup]
    TeXintervalle="\\mathbb R"

    #dérivée
    numerateur="%s\\times%s-%s\\times%s"%(P.derive().TeX(parenthese=True),Q.TeX(parenthese=True),
                                          P.TeX(parenthese=True),Q.derive().TeX(parenthese=True))
    numerateur_simplifie=(P.derive()*Q-P*Q.derive()).simplifie()
    VI=(-Q[0]*Fractions(1)/Q[1]).simplifie()

    denominateur=u"%s^2"%(Q.TeX(parenthese=True))
    f_derivee="\\dfrac{%s}{%s}"%(numerateur,denominateur)
    f_derivee_simplifiee="\\dfrac{%s}{%s}"%(numerateur_simplifie,denominateur)

    exo=[u"\\item On considère la fonction $%s$ définie  par $%s(%s)=\\dfrac{%s}{%s}$."%(nomf,nomf,var,P,Q),
         "\\begin{enumerate}"]
    cor=[u"\\item On considère la fonction $%s$ définie  par $%s(%s)=\\dfrac{%s}{%s}$."%(nomf,nomf,var,P,Q),
         "\\begin{enumerate}"]

    exo.append(u"\\item Déterminer l'ensemble de définition $\\mathcal{D}_{%s}$ de $%s$."%(nomf,nomf))
    cor.append(u"\\item Déterminer l'ensemble de définition $\\mathcal{D}_{%s}$ de $%s$.\par"%(nomf,nomf))
    cor.append(u" La fonction rationnelle $%s$ est définie et dérivable en $%s$ si $%s\\neq0$."%(nomf,var,Q(var)))
    cor.append("\\begin{align*}\n\
            %s&=0\\\\\n\
            %s&=%s\\\\\n\
            %s&=%s\\\\\n\
            %s&=%s\n\
            \\end{align*}"%(Q,(Q-Q[0]),TeX(-Q[0]),var,TeX(-Q[0]*Fractions(1)/Q[1]),var,TeX(VI)))
    cor.append(u"On en déduit que $\\mathcal{D}_{%s}=\\mathcal{D'}_{%s}=]-\\infty~;~%s[\cup]%s~;~+\\infty[$."%\
          (nomf,nomf,TeX(VI),TeX(VI)))
    exo.append(u"\\item Déterminer $%s'(%s)$ pour tout $%s\in\\mathcal{D'}_{%s}$."%\
          (nomf,var,var,nomf))
    cor.append(u"\\item Déterminer $%s'(%s)$ pour tout $%s\in\\mathcal{D'}_{%s}$."%\
          (nomf,var,var,nomf))
    cor.append(u"$$%s'(%s)=%s=%s$$"%(nomf,var,f_derivee,f_derivee_simplifiee))
    exo.append(u"\\item Déterminer les limites de $%s$ aux bornes de $\\mathcal{D}_{%s}$."%(nomf,nomf))
    cor.append(u"\\item Déterminer les limites de $%s$ aux bornes de $\\mathcal{D}_{%s}$."%(nomf,nomf))
    limite = P[1]/Q[1]
    limite_simple = limite.simplifie()

    cor.append("$$\\lim_{%s\\to -\\infty}\\dfrac{%s}{%s}= "%(var,P,Q))

    cor.append("\\lim_{%s\\to -\\infty}\\dfrac{%s%s}{%s%s} = %s" %(var,coeffTeX(P[1]),var,coeffTeX(Q[1]),var,limite))
    if limite.n == limite_simple.n:
        cor.append("$$")
    else:
        cor.append("= %s $$"%(TeX(limite_simple)))
    cor.append("$$\\lim_{%s\\to +\\infty}\\dfrac{%s}{%s}= "%(var,P,Q))
    cor.append("\\lim_{%s\\to +\\infty}\\dfrac{%s%s}{%s%s} = %s" %(var,coeffTeX(P[1]),var,coeffTeX(Q[1]),var,limite))
    if limite.n == limite_simple.n:
        cor.append("$$")
    else:
        cor.append("= %s $$"%(TeX(limite_simple)))
    cor.append("Pour $%s=%s$, on a $%s=%s"%(var,TeX(VI),P,TeX(P(VI))))
    if P(VI)<0:
        limites=["-\\infty","+\\infty"]
        cor.append("<0$.\\\\")
    elif P(VI)>0:
        limites=["+\\infty","-\\infty"]
        cor.append(">0$.\\\\")
    else:cor.append("$.\\\\")
        #Impossible car on test (a1*b2/a2 - b1)!=0

    VIplus="\\substack{%s\\to %s\\\\%s>%s}"%(var,fTeX(VI),var,fTeX(VI))
    VImoins="\\substack{%s\\to %s\\\\%s<%s}"%(var,fTeX(VI),var,fTeX(VI))
    if Q[1]<0:
        cor.append("De plus, $%s>0$ si $%s<%s$"%(Q,var,TeX(VI)))
        cor.append("et  $%s<0$ si $%s>%s$.\\\\"%(Q,var,TeX(VI)))
        cor.append(u"$$\\lim_{%s}\\dfrac{%s}{%s}=%s $$"%(VImoins,P,Q,limites[0]))
        cor.append(u"$$\\lim_{%s}\\dfrac{%s}{%s}=%s $$"%(VIplus,P,Q,limites[1]))
    else:
        cor.append("De plus, $%s<0$ si $%s<%s$"%(Q,var,TeX(VI)))
        cor.append("et  $%s>0$ si $%s>%s$.\\\\"%(Q,var,TeX(VI)))
        cor.append(u"$$\\lim_{%s}\\dfrac{%s}{%s}=%s $$"%(VImoins,P,Q,limites[0]))
        cor.append(u"$$\\lim_{%s}\\dfrac{%s}{%s}=%s $$"%(VIplus,P,Q,limites[1]))

    exo.append(u"\\item Dresser le tableau de variations de $%s$ sur $\\mathcal{D}_{%s}$."%(nomf,nomf))
    cor.append(u"\\item Dresser le tableau de variations de $%s$ sur $\\mathcal{D}_{%s}$.\\par"%(nomf,nomf))
    if numerateur_simplifie.degre_max==0:
        cor.append(u" Comme $%s$ est un carré, il est toujours positif.\\\\"%(denominateur))
        f_xmin = TeX((P[1]/Q[1]).simplifie())
        f_xmax = f_xmin
        if numerateur_simplifie[0]<0:
            cor.append(u" De plus, $%s<0$ donc pour tout $%s$ de $I$, $%s'(%s)<0$. Ainsi, on obtient "%\
                  (numerateur_simplifie[0],var,nomf,var))
            cor.append("$$\\tabvar{")
            cor.append("\\tx{%s}&\\tx{%s}&&&\\tx{%s}&&&\\tx{%s}\\cr"%(var,TeX(Intervalle[0]),TeX(VI),TeX(Intervalle[1])))
            cor.append("\\tx{%s'(%s)}&&\\tx{-}&&\\dbt &&\\tx{-}&\\cr"%(nomf,var))
            cor.append("\\tx{%s}&\\txh{%s}&\\fd&\\txb{-\\infty}&\\dbt&\\txh{+\\infty}&\\fd&\\txb{%s}\\cr"%(nomf,f_xmin,f_xmax))
            cor.append("}$$")
        else:
            cor.append(u" De plus, $%s>0$ donc pour tout $%s$ de $I$, $%s'(%s)>0$."%\
                  (numerateur_simplifie[0],var,nomf,var))
            cor.append("$$\\tabvar{")
            cor.append("\\tx{%s}&\\tx{%s}&&&\\tx{%s}&&&\\tx{%s}\\cr"%(var,TeX(Intervalle[0]),TeX(VI),TeX(Intervalle[1])))
            cor.append("\\tx{%s'(%s)}&&\\tx{+}&&\\dbt&&\\tx{+}&\\cr"%(nomf,var))
            cor.append("\\tx{%s}&\\txb{%s}&\\fm&\\txh{+\\infty}&\\dbt&\\txb{-\\infty}&\\fm&\\txh{%s}\\cr"%(nomf,f_xmin,f_xmax))
            cor.append("}$$")
    else:
        cor.append(u" Je ne sais pas faire avec un tel numérateur $%s$."%(numerateur_simplifie))
    exo.append("\\end{enumerate}")
    cor.append("\\end{enumerate}")
    return exo,cor
def quest_variation_degre3(borneinf=float("-inf"),bornesup=float("+inf")):
    '''Question qui propose l'étude du sens de variation d'un polynôme de degré 3'''
    Intervalle=[borneinf,bornesup]
    if borneinf==float("-inf") and bornesup==float("+inf"):
        TeX_intervalle="\\mathbb R"
    else:
        TeX_intervalle="\\left[%s~;~%s\\right]"%(TeX(borneinf),TeX(bornesup))
    #intervalle pour les racines entières ou fractionnaire
    a=3*randint(1,3)
    rac_min=-9
    rac_max=9
    #denominateur maximmum pour les racines fractionnaires
    denom_max=denom1=12
    #Valeurs absolues maximales des coefficients d'un polynôme quelconque
    abs_a=6
    abs_b=10
    abs_c=10
    #X est le polynome P=x pour faciliter la construction des polynômes,
    inconnues=['x','y','z','t']
    nom_poly=['P','Q','R','S']
    var="x"
    X=Polynome({1:1},var=var)
    nomP=["f","g","h","k","p","q"][randrange(6)]
    Pprime=poly_racines_entieres(rac_min,rac_max,X,a1=a)
    P=Pprime.primitive()+randint(-abs_c,abs_c)
    P=P.simplifie()
    exo=[u"\\item Étudier le sens de variations de $%s$ définie par $%s(x)=%s$ sur $%s$." % (nomP,nomP,P(var),TeX_intervalle)]
    cor=[u"\\item Étudier le sens de variations de $%s$ définie par $%s(x)=%s$ sur $%s$." % (nomP,nomP,P(var),TeX_intervalle)]

    cor.append("\\par $%s'(x)=%s$\\\\" % (nomP,Pprime(var)))
    cor.append(u"Je dois étudier le signe de $%s'(%s)$ qui est un polynôme du second degré.\\par"%(nomP,var))

    delta,simplrac,racines,str_racines,factorisation=factorisation_degre2(Pprime,factorisation=False)
    #cor=redaction_factorisation(Pprime,nomP+"'",exo=[],cor=cor)[1]
    #cor.pop(-5)
    redaction_racines(Pprime,nomP+"'",var,cor)
    str_signe,str_valeurs,signes,ligne_valeurs=tableau_de_signe(Pprime,nomP+"'",delta,racines,cor,borneinf,bornesup,detail=True)

    #cor.append(tab_signe)


    if (delta<=0 and P[3]<0):
        cor+=u"Donc la fonction polynômiale $%s$ est décroissante sur $%s$." %(nomP,TeX_intervalle)
    elif (delta<=0 and P[3]>0):
        cor.append(u"Donc la fonction polynômiale $%s$ est croissante sur $%s$."%(nomP,TeX_intervalle))
    else:
        cor.append("On obtient ainsi le tableau de variation de $%s$."%nomP)
        [x1,x2]=racines
        #macro=[["txb","txh"],["fm","fd"]]

        var_de_P="\\tx{%s}& \\%s{\\rnode{neu0}{%s}}&&"%(nomP,["txb","txh"]["-"==signes[0]],TeX(P(ligne_valeurs[0])))
        compteur=0
        for i in range(0,len(signes)-1):
            if signes[i]=='+':
                if 0 and signes[i+1]=="+":
                    var_de_P+="&&"
                else:
                    compteur+=1
                    var_de_P+="\\txh{\\rnode{neu%s}{%s}}&&"%(compteur,TeX(P(ligne_valeurs[i+1])))
            else:
                if 0 and signes[i+1]=="-":
                    var_de_P+="&&"
                else:
                    compteur+=1
                    var_de_P+="\\txb{\\rnode{neu%s}{%s}}&&"%(compteur,TeX(P(ligne_valeurs[i+1])))
        compteur+=1
        if signes[-1]=="+":
            var_de_P+="\\txh{\\rnode{neu%s}{%s}}\\cr"%(compteur,TeX(P(ligne_valeurs[-1])))
        else:
            var_de_P+="\\txb{\\rnode{neu%s}{%s}}\\cr"%(compteur,TeX(P(ligne_valeurs[-1])))

        cor.append("$$ \\tabvar{\n %s\n %s\n %s}$$"%\
                   (str_valeurs,str_signe,var_de_P))
        for i in range(1,compteur+1):
            cor.append("\\ncline[nodesep=0.15,linewidth=0.5pt]{->}{neu%s}{neu%s}"%(i-1,i))
        if borneinf==float("-inf"):
            cor.append(u"$$\\lim_{%s\\to %s} %s= \\lim_{%s\\to %s} %s%s^3=%s $$  "%(var,"-\\infty",P,var,"-\\infty",P[3],var,TeX(P(float("-inf")))))
        if bornesup==float("+inf"):
            cor.append(u"$$\\lim_{%s\\to %s} %s= \\lim_{%s\\to %s} %s%s^3=%s  $$ "%(var,"+\\infty",P,var,"+\\infty",P[3],var,TeX(P(float("inf")))))
    return exo,cor
def quest_fonctions_rationnelles():

    nomf=['f','g','h','k'][randrange(4)]
    var=['t','x'][randrange(2)]
    X=Polynome({1:1},var)
    #intervalle pour les racines entières ou fractionnaire

    rac_min=-9
    rac_max=9
    b1=b2=a1=a2=0
    while b1==0 or b2==0 or a1==0 or a2==0:
        b1=randint(rac_min,rac_max)
        b2=randint(rac_min,rac_max)
        a1=randint(-5,5)
        a2=randint(-5,5)
    P=a1*X+b1
    Q=a2*X+b2

    borneinf=-10
    bornesup=10
    #Je veux que f soit définie et dérivable sur I=Intervalle
    if (-Q[0]/Q[1])>=borneinf and (-Q[0]/Q[1])<=bornesup:
        if ((-Q[0]/Q[1])-borneinf)<(bornesup-(-Q[0]/Q[1])):
            Intervalle=[int(round(-Q[0]/Q[1]))+1,bornesup]
        else:
            Intervalle=[borneinf,int(round(-Q[0]/Q[1]))-1]

    #dérivée
    numerateur="%s\\times%s-%s\\times%s"%(P.derive().TeX(parenthese=True),Q.TeX(parenthese=True),
                                          P.TeX(parenthese=True),Q.derive().TeX(parenthese=True))
    numerateur_simplifie=(P.derive()*Q-P*Q.derive()).simplifie()
    denominateur=u"%s^2"%(Q.TeX(parenthese=True))
    f_derivee="\\dfrac{%s}{%s}"%(numerateur,denominateur)
    f_derivee_simplifiee="\\dfrac{%s}{%s}"%(numerateur_simplifie,denominateur)
    VI=(-Q[0]*Fractions(1)/Q[1]).simplifie()
    exo=[u"\\item On considère la fonction $%s$ définie sur $I=[%s~;~%s]$ par $%s(%s)=\dfrac{%s}{%s}$."%(nomf,Intervalle[0],Intervalle[1],nomf,var,P,Q),
         "\\begin{enumerate}"]
    cor=[u"\\item On considère la fonction $%s$ définie sur $I=[%s~;~%s]$ par $%s(%s)=\dfrac{%s}{%s}$."%(nomf,Intervalle[0],Intervalle[1],nomf,var,P,Q),
         "\\begin{enumerate}"]

    exo.append(u"\\item Justifier que $%s$ est définie et dérivable sur $I$."%(nomf))
    cor.append(u"\\item Justifier que $%s$ est définie et dérivable sur $I$."%(nomf))
    cor.append(u" Pour déterminer la valeur interdite, on doit résoudre $%s=0$."%(Q(var)))
    cor.append("\\begin{align*}")
    cor.append("%s&=0\\\\"% Q)
    cor.append("%s&=%s"%((Q-Q[0]),TeX(-Q[0])))
    cor.append("\\\\")
    if Q[1]!=1:
        x0=-Q[0]*Fractions(1)/Q[1]
        x1=x0.simplifie()
        cor.append("%s&=%s"%(var,TeX(-Q[0]*Fractions(1)/Q[1])))
        cor.append("\\\\")
        if x0.denominateur!=x1.denominateur:
            cor.append("%s&=%s"%(var,TeX(x1)))
            cor.append("\\\\")
    cor.pop(-1)
    cor.append("\\end{align*}")
    cor.append(u"Or $%s$ n'est pas dans l'intervalle $[%s~;~%s]$ et comme $%s$ est un quotient de polynômes, alors $%s$ est définie et dérivable sur $I$."%\
               (TeX(VI),Intervalle[0],Intervalle[1],nomf,nomf))
    exo.append(u"\\item Déterminer $%s'(%s)$ pour tout $%s\in[%s~;~%s]$."%\
          (nomf,var,var,Intervalle[0],Intervalle[1]))
    cor.append(u"\\item Déterminer $%s'(%s)$ pour tout $%s\in[%s~;~%s]$."%\
          (nomf,var,var,Intervalle[0],Intervalle[1]))
    cor.append(u"$$%s'(%s)=%s=%s$$"%(nomf,var,f_derivee,f_derivee_simplifiee))
    exo.append(u"\\item En déduire le sens de variations de $%s$ sur $I$."%(nomf))
    cor.append(u"\\item En déduire le sens de variations de $%s$ sur $I$.\\par"%(nomf))
    if numerateur_simplifie.degre_max==0:
        cor.append(u" Comme $%s$ est un carré, il est toujours positif.\\\\"%(denominateur))
        f_xmin=TeX((Fractions(1)*P(Intervalle[0])/Q(Intervalle[0])).simplifie())
        f_xmax=TeX((Fractions(1)*P(Intervalle[1])/Q(Intervalle[1])).simplifie())
        if numerateur_simplifie[0]<0:
            cor.append(u" De plus, $%s<0$ donc pour tout $%s$ de $I$, $%s'(%s)<0$. Ainsi, on obtient "%\
                  (numerateur_simplifie[0],var,nomf,var))
            cor.append("$$\\tabvar{")
            cor.append("\\tx{%s}&\\tx{%s}&&\\tx{%s}\\cr"%(var,TeX(Intervalle[0]),TeX(Intervalle[1])))
            cor.append("\\tx{%s'(%s)}&&\\tx{-}&&\\cr"%(nomf,var))
            cor.append("\\tx{%s}&\\txh{%s}&\\fd&\\txb{%s}\\cr"%(nomf,f_xmin,f_xmax))
            cor.append("}$$")
        else:
            cor.append(u" De plus, $%s>0$ donc pour tout $%s$ de $I$, $%s'(%s)>0$."%\
                  (numerateur_simplifie[0],var,nomf,var))
            cor.append("$$\\tabvar{")
            cor.append("\\tx{%s}&\\tx{%s}&&\\tx{%s}\\cr"%(var,TeX(Intervalle[0]),TeX(Intervalle[1])))
            cor.append("\\tx{%s'(%s)}&&\\tx{+}&&\\cr"%(nomf,var))
            cor.append("\\tx{%s}&\\txb{%s}&\\fm&\\txh{%s}\\cr"%(nomf,f_xmin,f_xmax))
            cor.append("}$$")
    else:
        cor.append(u" Je ne sais pas faire avec un tel numérateur $%s$."%(numerateur_simplifie))
    exo.append("\\end{enumerate}")
    cor.append("\\end{enumerate}")
    return exo,cor