# -*- coding: utf-8 -*-
from random import randrange
from ..classes.Polynome import Fractions,Polynome, pTeX, TeX, TeX_quiz, simplifie_racine, RacineDegre2, radicalTeX, sqrt, fTeX
from ..classes.Racine import RacineDegre2
from ..outils.Polynomes import poly_racines_entieres, poly_racines_fractionnaires, poly_racines_quelconques, poly_id_remarquables,poly_degre3_racines_entieres, TeX_division, poly_degre3_racines_fractionnaires, randint
from ..outils.decimaux import decimaux, decimaux_quiz
from ..outils.Arithmetique import pgcd
Fractions=Fractions.Fractions
def exo_racines_degre2():
'''exercice recherche de racines second degré'''
exo=["\\exercice"]
cor=["\\exercice*"]
quiz=["cloze"]
#intervalle pour les racines entières ou fractionnaire
rac_min=-10
rac_max=10
#denominateur maximmum pour les racines fractionnaires
denom_max=denom1=12
#Valeurs absolues maximales des coefficients d'un polynôme quelconque
abs_a=1
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']
exo.append(_(u"Résoudre les équations suivantes :"))
cor.append(_(u"Résoudre les équations suivantes :"))
exo.append("\\begin{enumerate}")
cor.append("\\begin{enumerate}")
#Racines entières
nomP='P'
var=inconnues[randrange(4)]
X=Polynome({1:1},var)
P=poly_racines_entieres(rac_min,rac_max,X)
exo.append("\\item $%s=0$\\par"%(P(var)))
cor.append("\\item $%s=0$\\par"%(P(var)))
cor, quiz_sol = redaction_racines(P,nomP,var,cor)
quiz_nom = _(u"Équation de 2º degré: racines entières")
quiz_exo_cor = (_(u"Résout la suivante équation: $$%s=0$$
\n") % (P(var)))
quiz_exo_cor += _(u"Réponse: (Écrit 1º le mineur et utilise la barre \"/\" pour la fraction irréductible)
\n")
if isinstance(quiz_sol,unicode) or isinstance(quiz_sol,str):
quiz_exo_cor += (u"$$%s_1=$${1:SHORTANSWER:~%s100%s%s~%s100%sN*}
\n$$%s_2=$${1:SHORTANSWER:~%s100%s%s~%s100%sN*}
\n" %
(var, "%", "%", quiz_sol, "%", "%", var, "%", "%", quiz_sol, "%", "%"))
quiz_exo_cor += _(u"(Si n'est pas possible écrit \"Ne a pas\")")
else:
quiz_exo_cor += (u"$$%s_1=$${1:NUMERICAL:=%s}
\n$$%s_2=$${1:NUMERICAL:=%s}" %
(var, quiz_sol[0], var, quiz_sol[1]))
quiz.append([quiz_nom, quiz_exo_cor , ""])
#Racines fractionnaires
nomP='P'
var=inconnues[randrange(4)]
X=Polynome({1:1},var)
P=poly_racines_fractionnaires(rac_min,rac_max,denom_max,X)
exo.append("\\item $%s=0$\\par"%(P(var)))
cor.append("\\item $%s=0$\\par"%(P(var)))
cor, quiz_sol = redaction_racines(P,nomP,var,cor)
quiz_nom = _(u"Équation de 2º degré: racines rationnelles")
quiz_exo_cor = (_(u"Résout la suivante équation: $$%s=0$$
\n") % (P(var)))
quiz_exo_cor += _(u"Réponse: (Utilise la barre \"/\" pour la fraction irréductible)
\n")
if isinstance(quiz_sol,unicode) or isinstance(quiz_sol,str):
quiz_exo_cor += (u"$$%s_1=$${1:SHORTANSWER:~%s100%s%s~%s100%sN*}
\n$$%s_2=$${1:SHORTANSWER:~%s100%s%s~%s100%sN*}
\n" %
(var, "%", "%", quiz_sol, "%", "%", var, "%", "%", quiz_sol, "%", "%"))
quiz_exo_cor += _(u"(Si n'est pas possible écrit \"Ne a pas\")")
else:
quiz_exo_cor += (u"$$%s_1=$${1:SHORTANSWER:~%s100%s%s~%s100%s%s}
\n$$%s_2=$${1:SHORTANSWER:~%s100%s%s~%s100%s%s}" %
(var, "%", "%", quiz_sol[0], "%", "%", quiz_sol[1], var, "%", "%", quiz_sol[1], "%", "%", quiz_sol[0]))
quiz.append([quiz_nom, quiz_exo_cor , ""])
#Racines quelconques
nomP='P'
var=inconnues[randrange(4)]
X=Polynome({1:1},var)
P=poly_racines_quelconques(abs_a,abs_b,abs_c,X)
#P=Polynome({2:1,1:7,0:7},var)# BORRAME
exo.append("\\item $%s=0$\\par"%(P(var)))
cor.append("\\item $%s=0$\\par"%(P(var)))
quiz_sol = redaction_racines(P,nomP,var,cor)[1]
exo.append("\\end{enumerate}")
cor.append("\\end{enumerate}")
quiz_nom = _(u"Équation de 2º degré: racines quiconque")
quiz_exo_cor = (_(u"Résout la suivante équation: $$%s=0$$
\n") % (P(var)))
quiz_exo_cor += _(u"Réponse: (Écrit 1º le mineur et utilise la barre \"/\" pour la fraction irréductible)
\n")
if isinstance(quiz_sol,unicode) or isinstance(quiz_sol,str):
quiz_exo_cor += (u"$$%s_1=$${1:SHORTANSWER:~%s100%s%s~%s100%sN*}
\n$$%s_2=$${1:SHORTANSWER:~%s100%s%s~%s100%sN*}
\n" %
(var, "%", "%", quiz_sol, "%", "%", var, "%", "%", quiz_sol, "%", "%"))
quiz_exo_cor += _(u"(Si n'est pas possible écrit \"Ne a pas\")")
elif isinstance(quiz_sol[0],RacineDegre2) and quiz_sol[0].radicande > 0:
quiz_txt = []
quiz_txt.append("{1:NUMERICAL:=%s}$$-$${1:NUMERICAL:=%s}" % (quiz_sol[0].numerateur,abs(quiz_sol[0].coeff)))
quiz_txt.append("{1:NUMERICAL:=%s}$$+$${1:NUMERICAL:=%s}" % (quiz_sol[1].numerateur,abs(quiz_sol[1].coeff)))
if quiz_sol[0].denominateur == 1:
quiz_exo_cor += (u"$$%s=$$%s$$\\surd$${1:NUMERICAL:=%s}
\n" %
(var, quiz_txt[0], quiz_sol[0].radicande))
quiz_exo_cor += (u"$$%s=$$%s$$\\surd$${1:NUMERICAL:=%s}" %
(var, quiz_txt[1], quiz_sol[1].radicande))
else:
quiz_exo_cor += ("
$$%s=$$ | " % var)
quiz_exo_cor += ("%s$$\\surd$${1:NUMERICAL:=%s} | " % (quiz_txt[0], quiz_sol[0].radicande))
quiz_exo_cor += ("$$\\,;\\,%s=$$ | " % var)
quiz_exo_cor += ("%s$$\\surd$${1:NUMERICAL:=%s} | " % (quiz_txt[1], quiz_sol[1].radicande))
quiz_exo_cor += ("
|
|
")
quiz_exo_cor += ("{1:NUMERICAL:=%s} | " % quiz_sol[0].denominateur)
quiz_exo_cor += ("{1:NUMERICAL:=%s} | " % quiz_sol[1].denominateur)
quiz_exo_cor += ("
")
elif quiz_sol[0].find("/") > 0 or quiz_sol[1].find("/") > 0:
quiz_exo_cor += (u"$$%s_1=$${1:SHORTANSWER:~%s100%s%s~%s100%s%s}
\n$$%s_2=$${1:SHORTANSWER:~%s100%s%s~%s100%s%s}" %
(var, "%", "%", quiz_sol[0], "%", "%", quiz_sol[1], var, "%", "%", quiz_sol[1], "%", "%", quiz_sol[0]))
else:
quiz_exo_cor += (u"$$%s_1=$${1:NUMERICAL:=%s}
\n$$%s_2=$${1:NUMERICAL:=%s}" %
(var, quiz_sol[0], var, quiz_sol[1]))
quiz.append([quiz_nom, quiz_exo_cor , ""])
return exo,cor,quiz
def exo_factorisation_degre2():
'''exercice recherche de racines second degré'''
exo=["\\exercice"]
cor=["\\exercice*"]
quiz=["cloze"]
#intervalle pour les racines entières ou fractionnaire
rac_min=-10
rac_max=10
#X est le polynome P(x)=x pour faciliter la construction des polynômes,
inconnues=['x','y','z','t']
nom_poly=['P','Q','R','S']
exo.append(_(u"Factoriser les polynômes suivants :"))
#cor=[]u"Factoriser les polynômes suivants :"]
exo.append("\\begin{enumerate}")
cor.append("\\begin{enumerate}")
####identites remarquables
nomP=nom_poly[randrange(4)]
var=inconnues[randrange(4)]
X=Polynome({1:1},var)
P,sgns=poly_id_remarquables(rac_min,rac_max,X)#sgns=-2,0 ou 2
exo.append(_(u"\\item Factoriser $%s(%s)=%s$ à l'aide d'une identité remarquable.")% (nomP,var,P(var)))
cor.append(_(u"\\item Factoriser $%s(%s)=%s$ à l'aide d'une identité remarquable.")% (nomP,var,P(var)))
factorisation,racines,a1=factorise_identites_remarquables(P,sgns,var,racines=True)
factorise="$$%s"% P
for i in range(len(factorisation)):
factorise+="="+factorisation[i]
cor.append(factorise+"$$")
quiz_nom = _(u"Factoring de 2º degré: Identité remarquable")
quiz_exo_cor = (_(u"Factorise $$%s(%s)=%s$$ à l'aide d'une identité remarquable.
\n") % (nomP,var,P(var)))
if len(racines) == 1:
signe = "-"
if racines[0] < 0:
signe = "+"
quiz_exo_cor += (_(u"Réponse: ")+"$$%s(%s)=$${1:NUMERICAL:=%s}$$\\cdot($${1:NUMERICAL:=%s}$$%s%s$${1:NUMERICAL:=%s}$$)^2$$" %
(nomP,var,a1,racines[0].denominateur,var,signe,abs(racines[0].numerateur)))
else:
signe = ["-", "-"]
for j in range(2):
if racines[j] < 0:
signe.insert(j,"+")
quiz_exo_cor += (_(u"Réponse: ")+"$$%s(%s)=$${1:NUMERICAL:=%s}$$\\cdot($${1:NUMERICAL:=%s}$$%s%s$${1:NUMERICAL:=%s}$$)" %
(nomP,var,a1,racines[0].denominateur,var,signe[0],abs(racines[0].numerateur)))
quiz_exo_cor += (u"\\cdot($${1:NUMERICAL:=%s}$$%s%s$${1:NUMERICAL:=%s}$$)$$" %
(racines[1].denominateur,var,signe[1],abs(racines[1].numerateur)))
quiz.append([quiz_nom, quiz_exo_cor , ""])
####Racines entières
nomP=nom_poly[randrange(4)]
var=inconnues[randrange(4)]
X=Polynome({1:1},var)
P=poly_racines_entieres(rac_min,rac_max,X)
exo.append("\\item $%s(%s)=%s$"%(nomP,var,P(var)))
cor.append(_(u"\\item Factoriser $%s(%s)=%s$\\par")%(nomP,var,P(var)))
exo,cor,racines=redaction_factorisation(P,nomP,exo,cor)
quiz_nom = _(u"Factoring de 2º degré: racines entières")
quiz_exo_cor = (_(u"Factorise $$%s(%s)=%s$$
\n") % (nomP,var,P(var)))
if isinstance(racines,unicode) or isinstance(racines,str):
quiz_exo_cor += (_(u"Réponse: ")+"$$%s(%s)=$${1:SHORTANSWER:~%s100%s%s~%s100%sN*}
\n" %
(nomP,var,"%","%",racines,"%","%"))
quiz_exo_cor += _(u"(Si n'est pas possible écrit \"Ne a pas\")")
elif len(racines) == 1:
signe = "~=-~+"
if racines[0] < 0:
signe = "~=+~-"
racines[0].numerateur = abs(racines[0].numerateur)
elif racines[0] == 0:
signe = "~=+~=-"
quiz_exo_cor += (_(u"Réponse: ")+"$$%s(%s)=$${1:NUMERICAL:=%s}$$\\cdot(%s$${1:MULTICHOICE:%s}{1:NUMERICAL:=%s}$$)^2$$" %
(nomP,var,TeX_quiz(P[2]),var,signe,TeX_quiz(racines[0],mathenv=1)))
else:
signe = ["-", "~=-~+"]
if racines[0] < 0:
signe.insert(0,"+")
signe.remove("-")
racines[0].numerateur = abs(racines[0].numerateur)
if racines[1] < 0:
signe.insert(1,"~=+~-")
racines[1].numerateur = abs(racines[1].numerateur)
elif racines[1] == 0:
signe.insert(1,"~=+~=-")
quiz_exo_cor += (_(u"Réponse: ")+"$$%s(%s)=$${1:NUMERICAL:=%s}$$\\cdot(%s%s%s)" %
(nomP,var,TeX_quiz(P[2]),var,signe[0],TeX_quiz(racines[0],mathenv=1)))
quiz_exo_cor += (u"\\cdot(%s$${1:MULTICHOICE:%s}{1:NUMERICAL:=%s}$$)$$" %
(var,signe[1],TeX_quiz(racines[1],mathenv=1)))
quiz.append([quiz_nom, quiz_exo_cor , ""])
####Racines fractionnaires
nomP=nom_poly[randrange(4)]
var=inconnues[randrange(4)]
X=Polynome({1:1},var)
#denominateur maximmum pour les racines fractionnaires
denom_max=12
P=poly_racines_fractionnaires(rac_min,rac_max,denom_max,X)
exo.append("\\item $%s(%s)=%s$"%(nomP,var,P(var)))
cor.append(_(u"\\item Factoriser $%s(%s)=%s$\\par")%(nomP,var,P(var)))
exo,cor,racines=redaction_factorisation(P,nomP,exo,cor)
quiz_nom = _(u"Factoring de 2º degré: racines rationnelles")
quiz_exo_cor = (_(u"Factorise $$%s(%s)=%s$$
\n") % (nomP,var,P(var)))
if isinstance(racines,unicode) or isinstance(racines,str):
quiz_exo_cor += (_(u"Réponse: ")+"$$%s(%s)=$${1:SHORTANSWER:~%s100%s%s~%s100%sN*}
\n" %
(nomP,var,"%","%",racines,"%","%"))
quiz_exo_cor += _(u"(Si n'est pas possible écrit \"Ne a pas\")")
elif len(racines) == 1:
signe = "~=-~+"
if racines[0] < 0:
signe = "~=+~-"
racines[0].numerateur = abs(racines[0].numerateur)
elif racines[0] == 0:
signe = "~=+~=-"
quiz_exo_cor += (_(u"Réponse: ")+"$$%s(%s)=$${1:NUMERICAL:=%s}$$\\cdot(%s$${1:MULTICHOICE:%s}{1:SHORTANSWER:%s100%s%s}$$)^2$$
\n" %
(nomP,var,TeX_quiz(P[2]),var,signe,"%","%",TeX_quiz(racines[0],mathenv=1)))
else:
signe = ["-", "~=-~+"]
if racines[0] < 0:
signe.remove("-")
signe.insert(0,"+")
racines[0].numerateur = abs(racines[0].numerateur)
if racines[1] < 0:
signe.insert(1,"~=+~-")
racines[1].numerateur = abs(racines[1].numerateur)
elif racines[1] == 0:
signe.insert(1,"~=+~=-")
quiz_exo_cor += (_(u"Réponse: ")+"$$%s(%s)=$${1:NUMERICAL:=%s}$$\\cdot(%s%s%s)" %
(nomP,var,TeX_quiz(P[2]),var,signe[0],TeX_quiz(racines[0],mathenv=0)))
quiz_exo_cor += (u"\\cdot(%s$${1:MULTICHOICE:%s}{1:SHORTANSWER:%s100%s%s}$$)$$
\n" %
(var,signe[1],"%","%",TeX_quiz(racines[1],mathenv=1)))
quiz_exo_cor += _(u"(Utilise la barre \"/\" pour la fraction irréductible)")
quiz.append([quiz_nom, quiz_exo_cor , ""])
####Racines quelconques
nomP=nom_poly[randrange(4)]
var=inconnues[randrange(4)]
X=Polynome({1:1},var)
#Valeurs absolues maximales des coefficients d'un polynôme quelconque
abs_a=1
abs_b=10
abs_c=10
P=poly_racines_quelconques(abs_a,abs_b,abs_c,X)
#P=Polynome({2:-1,1:0,0:-2},var)
exo.append("\\item $%s(%s)=%s$"%(nomP,var,P(var)))
cor.append(_(u"\\item Factoriser $%s(%s)=%s$\\par")%(nomP,var,P(var)))
exo,cor,racines=redaction_factorisation(P,nomP,exo,cor)
exo.append("\\end{enumerate}")
cor.append("\\end{enumerate}")
quiz_nom = _(u"Factoring de 2º degré: racines quiconque")
quiz_exo_cor = (_(u"Factorise: $$%s(%s)=%s$$
\n") % (nomP,var,P(var)))
if isinstance(racines,unicode) or isinstance(racines,str):
quiz_exo_cor += (_(u"Réponse: ")+"$$%s(%s)=$${1:SHORTANSWER:~%s100%s%s~%s100%sN*}
\n" %
(nomP,var,"%","%",racines,"%","%"))
quiz_exo_cor += _(u"(Si n'est pas possible écrit \"Ne a pas\")")
elif len(racines) == 1:
signe = "~=-~+"
if racines[0] < 0:
signe = "~=+~-"
racines[0].numerateur = abs(racines[0].numerateur)
elif racines[0] == 0:
signe = "~=+~=-"
quiz_exo_cor += (_(u"Réponse: ")+"$$%s(%s)=$${1:NUMERICAL:=%s}$$\\cdot(%s$${1:MULTICHOICE:%s}{1:SHORTANSWER:%s100%s%s}$$)^2$$
\n" %
(nomP,var,TeX_quiz(P[2]),var,signe,"%","%",TeX_quiz(racines[0],mathenv=1)))
else:
if isinstance(racines[0],RacineDegre2) and racines[0].radicande > 0:
quiz_txt = []
quiz_txt.append("{1:NUMERICAL:=%s}$$-$${1:NUMERICAL:=%s}" % (racines[0].numerateur,abs(racines[0].coeff)))
quiz_txt.append("{1:NUMERICAL:=%s}$$+$${1:NUMERICAL:=%s}" % (racines[1].numerateur,abs(racines[1].coeff)))
if racines[0].denominateur == 1:
quiz_exo_cor += (_(u"Réponse: ")+"$$%s(%s)=$${1:NUMERICAL:=%s}$$\\cdot(%s-($$%s$$\\surd$${1:NUMERICAL:=%s}" %
(nomP,var,TeX_quiz(P[2]),var,quiz_txt[0],racines[0].radicande))
quiz_exo_cor += (u"$$))\\cdot(%s-($$%s$$\\surd$${1:NUMERICAL:=%s}$$))$$" %
(var,quiz_txt[1],racines[1].radicande))
else:
quiz_exo_cor += (_(u"Réponse: ")+"")
quiz_exo_cor += ("$$%s(%s)=$${1:NUMERICAL:=%s}$$\\cdot(%s-($$ | " % (nomP,var,TeX_quiz(P[2]),var))
quiz_exo_cor += ("%s$$\\surd$${1:NUMERICAL:=%s} | " % (quiz_txt[0], racines[0].radicande))
quiz_exo_cor += ("$$))\\cdot(%s-($$ | " % var)
quiz_exo_cor += ("%s$$\\surd$${1:NUMERICAL:=%s} | " % (quiz_txt[1], racines[1].radicande))
quiz_exo_cor += ("$$))$$ | ")
quiz_exo_cor += ("
|
|
")
quiz_exo_cor += ("{1:NUMERICAL:=%s} | " % racines[0].denominateur)
quiz_exo_cor += ("{1:NUMERICAL:=%s} | " % racines[1].denominateur)
quiz_exo_cor += ("
")
else:
signe = ["-", "~=-~+"]
if racines[0] < 0:
signe.remove("-")
signe.insert(0,"+")
racines[0].numerateur = abs(racines[0].numerateur)
if racines[1] < 0:
signe.insert(1,"~=+~-")
racines[1].numerateur = abs(racines[1].numerateur)
elif racines[1] == 0:
signe.insert(1,"~=+~=-")
quiz_exo_cor += (_(u"Réponse: ")+"$$%s(%s)=$${1:NUMERICAL:=%s}$$\\cdot(%s%s%s)" %
(nomP,var,TeX_quiz(P[2]),var,signe[0],TeX_quiz(racines[0],mathenv=0)))
quiz_exo_cor += (u"\\cdot(%s$${1:MULTICHOICE:%s}{1:SHORTANSWER:%s100%s%s}$$)$$
\n" %
(var,signe[1],"%","%",TeX_quiz(racines[1],mathenv=1)))
quiz_exo_cor += _(u"(Utilise la barre \"/\" pour la fraction irréductible)")
quiz.append([quiz_nom, quiz_exo_cor , ""])
return exo,cor,quiz
def exo_factorisation_degre3():
'''exercice de factorisation degre3'''
#intervalle pour les racines entières ou fractionnaire
rac_min=-10
rac_max=10
#denominateur maximmum pour les racines fractionnaires
denom_max=denom1=12
#Valeurs absolues maximales des coefficients d'un polynôme quelconque
abs_a=1
abs_b=10
abs_c=10
#X est le polynome P=x pour faciliter la construction des polynômes, TODO : changer l'inconnue
inconnues=['x','y','z','t']
nom_poly=['P','Q','R','S']
exo=["\\exercice",
"\\begin{enumerate}"]
cor=["\\exercice*",
"\\begin{enumerate}"]
quiz=["cloze"]
X=Polynome({1:1},var="x")
racines_quelconques=[i for i in range(-10,11)]
E=poly_degre3_racines_entieres(rac_min,rac_max,X,racines=racines_quelconques)
#E=Polynome({3:1,2:-2,1:1,0:0})
exo,cor,racines=factorisation_degre3(E,"E",exo,cor,racines=racines_quelconques)
quiz_nom = _(u"Factoring de 3º degré: racines entières")
exo_factorisation_degre3_quiz(quiz_nom,E,"E",racines,quiz)
F=poly_degre3_racines_fractionnaires(rac_min,rac_max,denom1,X)
exo,cor,racines=factorisation_degre3(F,"F",exo,cor)
quiz_nom = _(u"Factoring de 3º degré: racine entière et rationnels")
exo_factorisation_degre3_quiz(quiz_nom,F,"F",racines,quiz)
exo.append("\\end{enumerate}")
cor.append("\\end{enumerate}")
return exo,cor,quiz
def exo_factorisation_degre3_quiz(quiz_nom,E,nomE,racines,quiz):
var = E.var
quiz_exo_cor = (_(u"Factorise: $$%s(%s)=%s$$
\n") % (nomE,var,E))
if isinstance(racines,unicode) or isinstance(racines,str):
quiz_exo_cor += (_(u"Réponse: ")+"$$%s(%s)=$${1:SHORTANSWER:~%s100%s%s~%s100%sN*}
\n" %
(nomP,var,"%","%",racines,"%","%"))
quiz_exo_cor += _(u"(Si n'est pas possible écrit \"Ne a pas\")")
elif len(racines) == 2:
signe = ["-", "~=-~+"]
if racines[0] < 0:
signe.insert(0,"+")
signe.remove("-")
racines[0] = abs(racines[0])
if racines[1] < 0:
signe.insert(1,"~=+~-")
racines[1].numerateur = abs(racines[1].numerateur)
elif racines[1] == 0:
signe.insert(1,"~=+~=-")
quiz_exo_cor += (_(u"Réponse: ")+"$$%s(%s)=$${1:NUMERICAL:=%s}$$\\cdot(%s%s%s)" %
(nomE,var,TeX_quiz(E[3]),var,signe[0],TeX_quiz(racines[0],mathenv=1)))
quiz_exo_cor += (u"\\cdot(%s$${1:MULTICHOICE:%s}{1:NUMERICAL:=%s}$$)^2$$" %
(var,signe[1],TeX_quiz(racines[1],mathenv=1)))
else:
signe = ["-", "-", "-"]
for i in range(3):
if racines[i] < 0:
signe.pop(i)
signe.insert(i,"+")
if isinstance(racines[i],int):
racines[i] = abs(racines[i])
else:
racines[i].numerateur = abs(racines[i].numerateur)
if (racines[1].denominateur == 1) and (racines[2].denominateur == 1):
quiz_exo_cor += (_(u"Réponse: ")+"$$%s(%s)=$${1:NUMERICAL:=%s}$$\\cdot(%s%s$${1:NUMERICAL:=%s}$$)" %
(nomE,var,TeX_quiz(E[3]),var,signe[0],TeX_quiz(racines[0],mathenv=1)))
quiz_exo_cor += (u"\\cdot(%s%s$${1:NUMERICAL:=%s}$$)\\cdot(%s%s$${1:NUMERICAL:=%s}$$)$$
\n" %
(var,signe[1],TeX_quiz(racines[1],mathenv=1),var,signe[2],TeX_quiz(racines[2],mathenv=1)))
quiz_exo_cor += _(u"(Écrit les facteurs dans l'ordre croissant des racines)")
else:
quiz_exo_cor += (_(u"Réponse: ")+"$$%s(%s)=$${1:NUMERICAL:=%s}$$\\cdot(%s%s%s)\\cdot(%s%s$$" %
(nomE,var,TeX_quiz(E[3]),var,signe[0],TeX_quiz(racines[0],mathenv=1),var,signe[1]))
quiz_exo_cor += (u"{1:SHORTANSWER:~%s100%s%s~%s100%s%s}$$)\\cdot(%s%s$${1:SHORTANSWER:~%s100%s%s~%s100%s%s}$$)$$
\n" %
("%","%",TeX_quiz(racines[1],mathenv=1),"%","%",TeX_quiz(racines[2],mathenv=1),var,signe[2],
"%","%",TeX_quiz(racines[2],mathenv=1),"%","%",TeX_quiz(racines[1],mathenv=1)))
quiz_exo_cor += _(u"(Utilise la barre \"/\" pour la fraction irréductible)")
quiz.append([quiz_nom, quiz_exo_cor , ""])
def exo_tableau_de_signe():
#intervalle pour les racines entières ou fractionnaire
rac_min=-10
rac_max=10
#denominateur maximmum pour les racines fractionnaires
denom_max=denom1=12
#Valeurs absolues maximales des coefficients d'un polynôme quelconque
abs_a=1
abs_b=10
abs_c=10
#X est le polynome P=x pour faciliter la construction des polynômes, TODO : changer l'inconnue
inconnues=['x','y','z','t']
nom_poly=['P','Q','R','S']
borneinf=-5#float("-inf")
bornesup=5#float("inf")
var="x"
X=Polynome({1:1},var=var)
Poly=[poly_racines_entieres(rac_min,rac_max,X),
poly_racines_fractionnaires(rac_min,rac_max,denom1,X),
poly_racines_quelconques(abs_a,abs_b,abs_c,X)]
intervalles=[[0,5],[-5,5],[float("-inf"),float("inf")]]
exo=["\\exercice",
"\\begin{enumerate}"]
cor=["\\exercice*",
"\\begin{enumerate}"]
quiz=["cloze"]
nomP="P"
for i in range(len(Poly)):
P=Poly[i]
borneinf,bornesup=intervalles[i]
if borneinf==float("-inf") and bornesup==float("inf"):
TeXintervalle="\\mathbb R"
else:
if borneinf!=float("-inf"):
TeXintervalle="["
else:
TeXintervalle="]"
TeXintervalle+="%s~;~%s"%(TeX(borneinf),TeX(bornesup))
if bornesup==float("inf"):
TeXintervalle+="["
else:
TeXintervalle+="]"
exo.append(_(u"\\item Étudier le signe du polynôme $%s=%s$ sur $I=%s$.") % (nomP,P,TeXintervalle))
cor.append(_(u"\\item Étudier le signe du polynôme $%s=%s$ sur $I=%s$.\\par") % (nomP,P,TeXintervalle))
delta,simplrac,racines,str_racines,factorisation=factorisation_degre2(P,factorisation=False)
redaction_racines(P,nomP,var,cor)
signes,lignes_signes = tableau_de_signe(P,nomP,delta,racines,cor,borneinf,bornesup,detail=True)[2:4]
quiz_nom = _(u"Étude du signe")
quiz_exo_cor = (_(u"Étudier le signe du polynôme $$%s=%s\\,$$ sur $$\\,I=%s$$
\n") %(nomP,P,TeXintervalle))
quiz_exo_cor += _(u"(Utilise la barre \"/\" pour la fraction irréductible)
\n")
quiz_exo_cor += _(u"Réponse:
\n")
quiz_exo_cor += tableau_de_signe_quiz(nomP,var,signes,lignes_signes,variation=0)
quiz.append([quiz_nom, quiz_exo_cor , ""])
exo.append("\\end{enumerate}")
cor.append("\\end{enumerate}")
return exo,cor,quiz
def exo_variation():
exo=["\\exercice",
"\\begin{enumerate}"]
cor=["\\exercice*",
"\\begin{enumerate}"]
quiz = []
quest1,cor1,quiz_1=quest_fonctions_rationnelles()
quest2,cor2,quiz_2=quest_variation_degre3(borneinf=-10,bornesup=10)
exo+=quest1+quest2
cor+=cor1 + cor2
exo.append("\\end{enumerate}")
cor.append("\\end{enumerate}")
quiz.append(quiz_1)
quiz.append(quiz_2)
return exo,cor,quiz
def exo_variation_lim():
"""Étude de fonctions avec calculs de limites"""
exo=["\\exercice",
"\\begin{enumerate}"]
cor=["\\exercice*",
"\\begin{enumerate}"]
quiz = []
quest3,cor3,quiz_1=quest_variation_degre3(borneinf=float("-inf"),bornesup=float("+inf"))
quest4,cor4,quiz_2,quiz_3=quest_fonctions_rationnelles_sur_R()
exo+=quest3+quest4
cor+= cor3 +cor4
exo.append("\\end{enumerate}")
cor.append("\\end{enumerate}")
quiz.append(quiz_1)
quiz.append(quiz_2)
quiz.append(quiz_3)
return exo,cor,quiz
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}")
quiz_1 = ["cloze"]
quiz_nom = _(u"Dérivée et monotonie d'une fraction polynomiale")
quiz_exo_cor = (_(u"Calcule le numérateur de la dérivée et la monotonie de $$%s(%s)=\\frac{%s}{%s}$$ pour tout $$%s\\in[%s~;~%s]$$
\n")%\
(nomf,var,P,Q,var,Intervalle[0],Intervalle[1]))
quiz_exo_cor += (_(u"Réponse: ")+"$$%s'(%s)=\\frac{?}{%s}\\,$$ siendo $$\\,?=$$ {1:NUMERICAL:=%s}
\n" %
(nomf,var,denominateur,TeX_quiz(numerateur_simplifie,mathenv=1)))
if numerateur_simplifie[0] < 0:
signes = "-"
else:
signes = "+"
quiz_exo_cor += _(u"Table de monotonie:
\n")
quiz_exo_cor += tableau_de_signe_quiz(nomf,var,signes,[Intervalle[0],Intervalle[1]],variation=1)
quiz_1.append([quiz_nom, quiz_exo_cor, ""])
return exo,cor,quiz_1
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(_(u"Pour $%s=%s$, on a $%s=%s")%(var,TeX(VI),P,TeX(P(VI))))
if P(VI)<0:
limites=["-\\infty","+\\infty"]
cor.append("<0$.\\\\")
signe_quiz = ["~=-~+","~=+~-"]
elif P(VI)>0:
limites=["+\\infty","-\\infty"]
cor.append(">0$.\\\\")
signe_quiz = ["~=+~-","~=-~+"]
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(_(u"De plus, $%s>0$ si $%s<%s$")%(Q,var,TeX(VI)))
cor.append(_(u"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(_(u"De plus, $%s<0$ si $%s<%s$")%(Q,var,TeX(VI)))
cor.append(_(u"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]))
quiz_2 = ["cloze"]
quiz_nom = _(u"Domaine et limites d'une fraction polynomiale dans son domaine")
quiz_exo_cor = (_(u"Détermine le domaine et les limites de $$%s(%s)=\\frac{%s}{%s}$$ dans les extrémités du $$\\mathcal{D}_{%s}$$
\n")%\
(nomf,var,P,Q,nomf))
quiz_exo_cor += (_(u"Réponse: ")+"$$\\mathcal{D}_{%s}=\\mathbb{R} - \\lbrace$$ {1:SHORTANSWER:%s100%s%s} $$\\rbrace$$
\n" %
(nomf,"%","%",TeX_quiz(VI,mathenv=1)))
quiz_exo_cor += (u"$$\\lim_{\\fs{-1}%s\\to\\pm\\infty}\\frac{%s}{%s}=$${1:SHORTANSWER:%s100%s%s}"
%(var,P,Q,"%","%",TeX_quiz(limite_simple,mathenv=1)))
quiz_exo_cor += (u"$$\\;;\\;\\lim_{\\fs{-1}%s\\to%s-}\\frac{%s}{%s}=$${1:MULTICHOICE:%s}$$\\infty"
%(var,TeX_quiz(VI),P,Q,signe_quiz[0]))
quiz_exo_cor += (u"\\;;\\;\\lim_{\\fs{-1}%s\\to%s+}\\frac{%s}{%s}=$${1:MULTICHOICE:%s}$$\\infty$$
\n"
%(var,TeX_quiz(VI),P,Q,signe_quiz[1]))
quiz_exo_cor += _(u"(Utilise la barre \"/\" pour la fraction irréductible)")
quiz_2.append([quiz_nom, quiz_exo_cor, ""])
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}")
quiz_3 = ["cloze"]
quiz_nom = _(u"Dérivée et monotonie d'une fraction polynomiale dans son domaine")
quiz_exo_cor = (_(u"Calcule le numérateur de la dérivée et la monotonie de $$%s(%s)=\\frac{%s}{%s}$$ pour tout $$%s\in\\mathcal{D'}_{%s}$$
\n")%\
(nomf,var,P,Q,var,nomf))
quiz_exo_cor += (_(u"Réponse: ")+"$$%s'(%s)=\\frac{?}{%s}\\,$$ siendo $$\\,?=$$ {1:NUMERICAL:=%s}
\n" %
(nomf,var,denominateur,TeX_quiz(numerateur_simplifie,mathenv=1)))
if numerateur_simplifie[0] < 0:
signes = ["-","-"]
else:
signes = ["+","+"]
quiz_exo_cor += _(u"Table de monotonie:
\n")
quiz_exo_cor += tableau_de_signe_quiz(nomf,var,signes,[Intervalle[0],VI,Intervalle[1]],variation=1)
quiz_3.append([quiz_nom, quiz_exo_cor, ""])
return exo,cor,quiz_2,quiz_3
def coeffTeX(a):
if a==1:return ""
if a==-1:return "-"
return a
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(_(u"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")))))
quiz_2 = ["cloze"]
quiz_nom = _(u"Dérivée et monotonie d'un polynôme")
quiz_exo_cor = (_(u"Calcule la dérivée et la monotonie de $$%s$$ définie par $$%s(x)=%s\\,$$ en $$\\,%s$$
\n") %
(nomP,nomP,str(P(var)).replace('\\dfrac','\\frac'),TeX_intervalle))
quiz_exo_cor += (_(u"Réponse: ")+"$$%s'(%s)=$${1:NUMERICAL:=%s}$$%s^2+$${1:NUMERICAL:=%s}$$%s+$${1:NUMERICAL:=%s}
\n" %
(nomP,var,Pprime[2],var,Pprime[1],var,Pprime[0]))
quiz_exo_cor += _(u"Table de monotonie:
\n")
quiz_exo_cor += tableau_de_signe_quiz(nomP,var,signes,ligne_valeurs,variation=1)
quiz_2.append([quiz_nom, quiz_exo_cor, ""])
return exo,cor,quiz_2
###############################################
# #
# Fonctions étudiant les polynômes #
# #
###############################################
def tableau_de_signe(P,nomP,delta,racines,cor,borneinf=float("-inf"),bornesup=float("+inf"),detail=False):
'''Étudie le signe d'un polynôme de degré2'''
''' ne fonctionne pas si on a pas borneinf < x1< x2 0] #Ca donne bien ce qu'on veut...
signes=[]
if delta<0:
cor.append(_(u"Comme $\\Delta <0$, $%s(%s)$ ne s'annule pas et est toujours du signe de $a$")%(nomP,var))
cor.append(_(u"Ainsi "))
str_valeurs="\\tx{%s}&\\tx{%s}&& \\tx{%s}\\cr" %(var,TeX(borneinf),TeX(bornesup))
str_signe="\\tx{%s(%s)}&&\\tx{%s}&\\cr" %(nomP,var,signe_a)
signes=[signe_a]
ligne_valeurs=[borneinf,bornesup]
elif delta == 0:
cor.append(_(u"Comme $\\Delta =0$, $%s(%s)$ s'annule une seule fois pour $%s_0=%s$ et est toujours du signe de $a$.\par")%(nomP,var,var,racines[0]))
if racines[0]bornesup:
if borneinf!=float("-inf"):
intervalle="["
else:
intervalle="]"
intervalle+="%s~;~%s"%(TeX(borneinf),TeX(bornesup))
if bornesup==float("inf"):
intervalle+="["
else:
intervalle+="]"
cor.append(_(u"Or $%s$ n'est pas dans l'intervalle $%s$ donc ")%(TeX(racines[0]),intervalle))
ligne_valeurs=[borneinf,bornesup]
str_valeurs="\\tx{%s}&\\tx{%s}&& \\tx{%s}\\cr" %(var,TeX(borneinf),TeX(bornesup))
str_signe="\\tx{%s(%s)}&&\\tx{%s}&\\cr" %(nomP,var,signe_a)
signes=[signe_a]
else:
ligne_valeurs=[borneinf,racines[0],bornesup]
str_valeurs="\\tx{%s}&\\tx{%s}&& \\tx{%s}&& \\tx{%s}\\cr" %(var,TeX(borneinf),TeX(racines[0]),TeX(bornesup))
str_signe="\\tx{%s(%s)}&&\\tx{%s}&\\tx{0}&\\tx{%s}&\\cr" %(nomP,var,signe_a,signe_a)
signes=[signe_a,signe_a]
elif delta >0:
[x1,x2]=racines
cor.append(_(u"Comme $\\Delta >0$, $%s(%s)$ est du signe de $-a$ entre les racines.")%(nomP,var))
compare=[(x1<=borneinf)+(x2<=borneinf),(x2>=bornesup)+(x1>=bornesup)]
#x_x1=x_x2=sign_x1=sign_x2=""
if compare!=[0,0]:
if borneinf!=float("-inf"):
intervalle="["
else:
intervalle="]"
intervalle+="%s~;~%s"%(TeX(borneinf),TeX(bornesup))
if bornesup==float("inf"):
intervalle+="["
else:
intervalle+="]"
ligne_valeurs=[borneinf]
if compare[0]>=1 or compare[1]==2:
x_x1=sign_x1=""
else:
x_x1="&\\tx{%s}&"%(TeX(x1))
ligne_valeurs+=[x1]
sign_x1="&\\tx{%s}&\\tx{0}"%(signe_a)
signes+=[signe_a]
if 2 in compare:
entreracines="&\\tx{%s}"%(signe_a)
signes+=[signe_a]
else:
entreracines="&\\tx{%s}"%(signe_moinsa)
signes+=[signe_moinsa]
if compare[1]>=1 or compare[0]==2:
x_x2=sign_x2=""
else:
x_x2="&\\tx{%s}&"%(TeX(x2))
ligne_valeurs+=[x2]
sign_x2="&\\tx{0}&\\tx{%s}"%(signe_a)
signes+=[signe_a]
ligne_valeurs+=[bornesup]
#Ne rien dire si une racine est égale à une borne
compare=[compare[0]-(x1==borneinf)-(x2==borneinf),compare[1]-(x1==bornesup)-(x2==bornesup)]
if sum(compare)==2 :
#les deux racines sont à supprimer
cor.append(_(u"\\par Or $%s$ et $%s$ ne sont pas dans $%s$.")%(TeX(x1),TeX(x2),intervalle))
elif compare[0]==1:
cor.append(_(u"\\par Or $%s$ n'est pas dans $%s$.")%(TeX(x1),intervalle))
elif compare[1]==1:
cor.append(_(u"\\par Or $%s$ n'est pas dans $%s$.")%(TeX(x2),intervalle))
cor.append(_(u"Ainsi"))
str_valeurs="\\tx{%s}& \\tx{%s}& %s %s & \\tx{%s}\\cr"%(var,TeX(borneinf),x_x1,x_x2,TeX(bornesup))
str_signe="\\tx{%s(%s)}&%s %s %s&\\cr" %(nomP,var,sign_x1,entreracines,sign_x2)
cor.append("$$\\tabvar{")
cor.append(str_valeurs)
cor.append("%s}$$"%(str_signe))
if detail:
return str_signe,str_valeurs,signes,ligne_valeurs
def tableau_de_signe_quiz(nomP,var,signes,ligne_valeurs,variation=0):
quiz_txt = u''
quiz_txt_f1, quiz_txt_f2 = "",""
for i in range(len(signes)):
parents = ["(",")"]
if signes[i] == "+":
if variation:
signes_quiz = _(u"~=Croître~Décroît")
else:
signes_quiz = "~=+~-"
elif signes[i] == "-":
if variation:
signes_quiz = _(u"~=Décroît~Croître")
else:
signes_quiz = "~=-~+"
quiz_txt_f1 += u' -1:
ligne_valeurs[0] == "-\\infty"
else:
parents[0] = "["
if i+1 == len(signes):
if str(ligne_valeurs[i+1]).find("inf") > -1:
ligne_valeurs[i+1] == "+\\infty"
else:
parents[1] = "]"
if ((isinstance(ligne_valeurs[i],RacineDegre2) and ligne_valeurs[i].radicande > 0) or
(isinstance(ligne_valeurs[i+1],RacineDegre2) and ligne_valeurs[i+1].radicande > 0)):
quiz_txt_f1 += (u' valign=\"middle\">$$%s%s;%s%s$$ | ' %
(parents[0], TeX_quiz(ligne_valeurs[i]), TeX_quiz(ligne_valeurs[i+1]), parents[1]))
elif i == 0 and str(ligne_valeurs[0]).find("inf") > -1 and str(ligne_valeurs[1]).find("inf") > -1:
quiz_txt_f1 += (u' valign=\"middle\">$$%s%s;%s%s$$' %
(parents[0], TeX_quiz(ligne_valeurs[i]), TeX_quiz(ligne_valeurs[i+1]), parents[1]))
elif i == 0 and str(ligne_valeurs[0]).find("inf") > -1:
quiz_txt_f1 += (u' valign=\"middle\">$$%s%s;$${1:SHORTANSWER:%s100%s%s}$$%s$$' %
(parents[0], TeX_quiz(ligne_valeurs[i]), "%", "%", TeX_quiz(ligne_valeurs[i+1],1), parents[1]))
elif i+1 == len(signes) and str(ligne_valeurs[len(signes)]).find("inf") > -1:
quiz_txt_f1 += (u' valign=\"middle\">$$%s$${1:SHORTANSWER:%s100%s%s}$$;%s%s$$' %
(parents[0], "%", "%", TeX_quiz(ligne_valeurs[i],1), TeX_quiz(ligne_valeurs[i+1]), parents[1]))
else:
quiz_txt_f1 += (u' valign=\"middle\">$$%s$${1:SHORTANSWER:%s100%s%s}$$;$${1:SHORTANSWER:%s100%s%s}$$%s$$' %
(parents[0], "%", "%", TeX_quiz(ligne_valeurs[i],1), "%", "%", TeX_quiz(ligne_valeurs[i+1],1), parents[1]))
quiz_txt_f2 += u'{1:MULTICHOICE:%s} | ' % signes_quiz)
quiz_txt += u'' # Primera Fila
quiz_txt += u'$$%s$$ | ' % var)
quiz_txt += quiz_txt_f1
quiz_txt += u'
' # Segunda Fila
quiz_txt += u'$$%s(%s)$$ | ' % (nomP,var))
quiz_txt += quiz_txt_f2
quiz_txt += u'
' # Fin
return quiz_txt
def factorise_identites_remarquables(pol1,sgns,var='',racines=True):
'''Factorise un polynomes grâce aux identités remarquables'''
if var=='':
var=pol1.var
X=Polynome({1:1},var)
a1=pgcd(int(pol1[0]),pgcd(int(pol1[1]),int(pol1[2])))#du signe de a=pol1[2]
if a1!=1 or a1!=-1:
pol2=pol1/a1
else:
pol2=pol1
#coeff=coeff/int(math.sqrt(a1))
#pol2=(cx)^2 ±2× cx × b + b^2
#pol2[2]=c^2
#pol2[1]=2× cx × b
#pol2[0] = b^2
c=int(sqrt(pol2[2]))#problème d'arrondi ?
factorisation=[]
if a1!=1:
pol_temp = (pol1/a1).simplifie()
pol_temp.var = var
factorisation.append(_("%s \\times\\big[ %s \\big]")%(TeX(a1),pol_temp))
facteur2 =_("%s\\times \\big[")%(TeX(a1))
else:
facteur2 =""
if c!=1:
facteur2 +=u"(%s %s)^2"%(TeX(c),var)
else:
facteur2 +=u"%s^2"% var
if sgns:
if sgns==-2: #-2 => (a-b)²
facteur2 +=_("-2 \\times ")
else: #+2 => (a+b)²
facteur2 +=_("+2 \\times ")
if c==1:
facteur2 +=var
else:
facteur2 +=TeX(c)+var
b=int(sqrt(pol2[0]))
facteur2 +=_(" \\times %s +")%(TeX(b))
else:
#a²-b²
facteur2 +="-"
b=int(sqrt(-(pol2[0])))
facteur2 +=u"%s^2"%(TeX(b))
if a1!=1:
facteur2 +="\\big]"
factorisation.append(facteur2)
facteur3=""
if a1!=1:
facteur3 +=TeX(a1)
sgns=sgns/2
if sgns:#(cx-b)² ou (cx+b)²
liste_racines=[Fractions(-(sgns))*b/c]
facteur3 +="{(%s)}^2"%(c*X+sgns*b)
else:#(cx-b)(cx+b)
liste_racines=[Fractions(-1)*b/c,Fractions(1)*b/c]
facteur3 +="(%s)(%s)"%(c*X+b,c*X-b)
factorisation.append(facteur3)
if racines:
return factorisation,liste_racines,a1
return factorisation
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
#delta
#simplrac[0] est True si racine de Delta se simplifie, alors simplrac[1] est la racine de delta simplifiée
#liste_racines donne la liste des racines sous la forme simplifiée, sous forme numérique si possible
#liste_str_racine est la liste des racines au format TeX, non simplifié.
def listeracines(a,b,delta,parentheses=False):
'''renvoie racsimple,simplifie,formule_x1,x_1,formule_x2,x2'''
'''avec x_10
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 strx10)
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
#simplrac[0] est True si racine de Delta se simplifie, alors simplrac[1] est la racine de delta simplifiée
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 factorisation_degre3(E,nomE,exo=[],cor=[],racines=[0,1,-1,2,-2]):
'''Factorise un polynôme de degré 3 avec une racine évidente'''
var=E.var
X=Polynome({1:1},var)
racines_quiz = []
exo.append(_(u"\\item Soit $%s =%s $")%(nomE,E))
cor.append(_(u"\\item Soit $%s=%s $")%(nomE,E))
exo.append("\\begin{enumerate}")
cor.append("\\begin{enumerate}")
for x0 in racines:
if E(x0)==0:
break
if x0 in [-2,-1,0,1,2]:
exo.append(_(u"\\item Vérifier si $%s $ possède une racine évidente.")%(nomE))
else:
exo.append(_(u"\\item Vérifier que $%s$ est une racine de $%s$.")%(TeX(x0),nomE))
racines_quiz.append(x0)
exo.append(_(u"\\item Factoriser $%s $.")%(nomE))
cor.append("\\item ")
if x0==0:
degre_facteur=min(E.puiss)
#degre_facteur=1
E2=(E/(X**degre_facteur))[0]
if degre_facteur==1:
cor.append(_(u"On remarque que $%s$ peut se factoriser par $%s$ et $%s=%s\\left(%s\\right)$") %(nomE,var,nomE,var,E2))
elif degre_facteur==2:
cor.append(_(u"On remarque que $%s$ peut se factoriser par $%s^2$ et $%s=%s^2\\left(%s\\right)$")\
%(nomE,E.var,nomE,E.var,E2))
exo.append("\\end{enumerate}")
cor.append("\\end{enumerate}")
return exo,cor
else:
cor.append(_(u"Comme $%s(%s)=0$, on peut diviser $%s$ par $%s$")%(nomE,TeX(x0),nomE,X-x0))
cor.append(TeX_division(E,(X-x0))+"")
E2,reste=E/(X-x0)
cor.append(_(u"\\item On doit maintenant factoriser le polynome $%s_2=%s$\\\\")%(nomE,E2))
delta,simplrac,racines,str_racines,factorisation=factorisation_degre2(E2,factorisation=True)
racines_quiz.extend(racines)
cor=redaction_factorisation(E2,nomP=nomE+"_2",exo=[],cor=cor)[1]
cor.append("\\par")
cor.append(_(u"On en conclue donc que $%s=")%(nomE))
final=0
if x0==0:
P0=E.var
else:
P0="\\left(%s\\right)"%(X-x0)
if E[3]==-1:
cor.append("-")
elif E[3]!=1:
cor.append(TeX(E[3]))
if delta<0:
P1=factorisation[-1][0]
E_factorise=_("%s\\times%s$")%(P0,P1)
elif delta==0:
P1=factorisation[-1][0]
E_factorise=_("%s\\times{\\left(%s\\right)}^2$")%(P0,P1)
else:
P1=factorisation[-1][0]
P2=factorisation[-1][1]
E_factorise="%s\\left(%s\\right)\\left(%s\\right)$"%(P0,P1,P2)
cor.append(E_factorise)
exo.append("\\end{enumerate}")
cor.append("\\end{enumerate}")
return exo,cor,racines_quiz
#----------------- redaction ---------------------------------------------------------
def redaction_factorisation(P,nomP="P",exo=[],cor=[]):
var=P.var
delta,simpl_delta,racines,str_racines,factorisation=factorisation_degre2(P)
redaction_racines(P,nomP,var,cor)
#factorisation
if delta<0:
cor.append(_(u"On ne peut pas factoriser $%s(%s)$.")%(nomP,var))
quiz_sol = _(u"Ne a pas")
elif delta==0:
cor.append(_(u"On peut donc écrire "))
ligne_factorisation="$$%s(%s)"%(nomP,var)
for etape in factorisation:
ligne_factorisation+=" = "
if P[2]!=1:
ligne_factorisation+=_("%s \\times ")%(TeX(P[2]))
ligne_factorisation+="{\\left(%s\\right)}^2"%(etape[0])
ligne_factorisation+="$$"
cor.append(ligne_factorisation)
quiz_sol = racines
else:
cor.append(_(u"On peut donc écrire "))
ligne_factorisation="$$%s(%s)"%(nomP,var)
for etape in factorisation:
ligne_factorisation+=" = "
if P[2]!=1:
ligne_factorisation+=_("%s \\times ")%(TeX(P[2]))
if len(etape)==1:
ligne_factorisation+=etape[0]
else:
ligne_factorisation+="\\left(%s\\right)\left(%s\\right)"%(etape[0],etape[1])
ligne_factorisation+="$$"
cor.append(ligne_factorisation)
quiz_sol = racines
return exo,cor,quiz_sol
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+=_(u" et $%s=%s$.\\par")%(radicalTeX(delta),simpl_delta[1])
else:
ligne_delta+=".\\par"
cor.append(ligne_delta)
if delta<0:
cor.append(_(u"Comme $\\Delta <0$, $%s(%s)$ n'a pas de racines.")%(nomP,var))
quiz_sol = _(u"Ne a pas")
elif delta==0:
cor.append(_(u"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])))
quiz_sol = [TeX_quiz(liste_racines[0],mathenv=1), TeX_quiz(liste_racines[0],mathenv=1)]
else:#delta>0
[x1,x2]=liste_racines
cor.append(_(u"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