def tracefonc(f, i, A, B, xmin, xmax, ymin, ymax): """**tracefonc\ (*f*\ , *i*\ , *A*\ , *B*\ , *xmin*\ , *xmax*\ , *ymin*\ , *ymax*\ ) *A* est sur l'axe des ordonnées, *f* est le nom de la fonction Génère la 2e queston et sa réponse >>> from pyromaths.classes.Fractions import Fraction >>> affine.tracefonc('f', 1, (0,-2),(3,2),-4,4,-4,-4) [u'Tracer la droite repr\xe9sentative ($d_1$) de la fonction $f:x\\longmapsto \\ dfrac{4}{3}\\,x-2$.', 'On sait que $f(0)=-2$ et $f(-3)=\\dfrac{4}{3}\\times \\le ft( -3\\right) -2=\\dfrac{4\\times \\cancel{3}\\times -1}{\\cancel{3}\\times 1}- 2=-4-2=-6', '\\psdot [dotsize=4.5pt,dotstyle=x](0, -2)', '\\psdot [dotsize=4.5pt ,dotstyle=x](-3, -6.0)'] :rtype: list of string """ u = coefdir(A, B) if isinstance(u, int) or u.d == 1: x1 = decimaux(B[0]) else: B = (u.d, u.n + float(A[1])) if not dansrep(B, xmin, xmax, ymin, ymax): B = (-u.d, -u.n + float(A[1])) x1 = decimaux(str(B[0])) l = Priorites3.texify([Polynome([[u, 1], [A[1], 0]], "x")(B[0])]) l.extend(Priorites3.texify(Priorites3.priorites(Polynome([[u, 1], [A[1], 0]], "x")(B[0])))) l = [u'Tracer la droite représentative ($d_' + str(i) + '$) de la fonction $' + f + ':x\\longmapsto ' + str(Polynome([[u, 1], [A[1], 0]], "x")) + '$.', 'On sait que $' + f + '(0)=' + decimaux(str(A[1])) + '$ et $' + f + '(' + x1 + ')=' + "=".join(l) + "$.", '\\psdot [dotsize=4.5pt,dotstyle=x]' + str(A), '\\psdot [dotsize=4.5pt,dotstyle=x]' + str(B), ] return l
def id_rem(): """Génère un exercice de développement des 3 identités remarquables avec une situation piège. Dans un premier temps, on n'utilise que des nombres entiers, puis des fractions, puis l'opposé d'une expression littérale. """ l = [randrange(1, 11) for dummy in range(14)] while pgcd(l[8], l[9]) != 1 or pgcd(l[10], l[11]) != 1 or (l[9] == 1 and l[11] == 1): # On crée deux rationnels irréductibles non tous deux entiers. l = [randrange(1, 11) for dummy in range(14)] lpoly = [id_rem1(l[0], l[1]), id_rem2(l[2], l[3]), id_rem3(l[4], l[5]), id_rem4(l[6], l[7])] shuffle(lpoly) lid = [id_rem1, id_rem2, id_rem3, id_rem4] lpoly2 = [lid.pop(randrange(4))(Fraction(l[8], l[9]), Fraction(l[10], l[11]))] lpoly2.append('-' + lid.pop(randrange(3))(l[12], l[13])) shuffle(lpoly2) lpoly.extend(lpoly2) expr = [Priorites3.texify([Priorites3.splitting(lpoly[i])]) for i in range(6)] exo = ["\\exercice", u"Développer chacune des expressions littérales suivantes :"] exo.append("\\begin{multicols}{2}") exo.append('\\\\\n'.join(['$%s=%s$' % (chr(i + 65), expr[i][0]) for i in range(6)])) exo.append("\\end{multicols}") cor = ["\\exercice*", u"Développer chacune des expressions littérales suivantes :"] cor.append("\\begin{multicols}{2}") for i in range(6): dev = Priorites3.texify(Priorites3.priorites(lpoly[i])) dev.insert(0, expr[i][0]) cor.append('\\\\\n'.join(['$%s=%s$' % (chr(i + 65), dev[j]) for j in range(len(dev) - 1)])) cor.append('\\\\') cor.append('\\fbox{$%s=%s$}\\\\\n' % (chr(i + 65), dev[-1])) cor.append("\\end{multicols}") return exo, cor
def corrige(nom, fct, ant): from pyromaths.outils import Priorites3 sol = [] calc = fct(ant) res = Priorites3.priorites(calc) res = Priorites3.texify(res) sol.append(r"\par $%s\,(%s)=%s$\par" % (nom, ant, Priorites3.texify([Priorites3.splitting(calc)])[0])) sol.append('\\par\n'.join(['$%s\\,(%s)=%s$' % (nom, ant, res[j]) for j in range(len(res) - 1)])) sol.append(r'\par') sol.append('\\fbox{$%s\\,(%s)=%s$}\\\\\n' % (nom, ant, res[-1])) return sol
def corrige(nom, fct, ant): from pyromaths.outils import Priorites3 sol = [] calc = fct(ant) res = Priorites3.priorites(calc) res = Priorites3.texify(res) sol.append(r"\par $%s\,(%s)=%s$\par" % (nom, ant, Priorites3.texify([Priorites3.splitting(calc)])[0])) sol.append('\\par\n'.join( ['$%s\\,(%s)=%s$' % (nom, ant, res[j]) for j in range(len(res) - 1)])) sol.append(r'\par') sol.append('\\fbox{$%s\\,(%s)=%s$}\\\\\n' % (nom, ant, res[-1])) return sol
def factorisation(): """Génère un exercice de factorisation utilisant les identités remarquables ou la distributivité """ l = [randrange(1, 11) for dummy in range(21)] diff = [True, False, False] shuffle(diff) exo = [id_rem1, id_rem2] lexo = [exo[randrange(2)](l[0], l[1])] lexo.append(id_rem3(l[2], l[3])) lexo.append(id_rem3bis(l[4], l[5], l[6])) lexo.append(facteur_commun1(l[7:13], diff=diff.pop())) shuffle(lexo) exo = [facteur_commun2, facteur_commun3] shuffle(exo) lexo.append(exo[0](l[13:17], diff=diff.pop())) lexo.append(exo[1](l[17:21], diff=diff.pop())) exo = [ "\\exercice", u"Factoriser chacune des expressions littérales suivantes :" ] exo.append("\\begin{multicols}{2}") cor = [ "\\exercice*", u"Factoriser chacune des expressions littérales suivantes :" ] cor.append("\\begin{multicols}{2}") for i in range(len(lexo)): p = [lexo[i]] while True: fact = factoriser(p[-1]) if fact: p.append(fact) else: break p = Priorites3.texify( [Priorites3.splitting(p[j]) for j in range(len(p))]) cor.append('\\\\\n'.join( ['$%s=%s$' % (chr(i + 65), p[j]) for j in range(len(p) - 1)])) cor.append('\\\\') cor.append('\\fbox{$%s=%s$}\\\\\n' % (chr(i + 65), p[-1])) exo.append('\\\\\n'.join([ '$%s=%s$' % (chr(i + 65), Priorites3.texify([Priorites3.splitting(lexo[i])])[0]) for i in range(len(lexo)) ])) exo.append("\\end{multicols}") cor.append("\\end{multicols}") return exo, cor
def tex_answer(self): exo = [r'\exercice*'] exo.append(_(u'Donner la forme canonique des polynômes $P$ , $Q$ , $R$ et $S$ .')) noms = [r'P\,(x) &= ', r'Q\,(x) &= ', r'R\,(x) &= ', r'S\,(x) &= '] exercice = list(self.exercice) for i in range(len(exercice)): exercice[i] = Priorites3.texify(exercice[i]) exercice[i][0] = noms[i] + exercice[i][0] # [0] for j in range(1, len(exercice[i]) - 1): exercice[i][j] = r' &= ' + exercice[i][j] exercice[i][-1] = r'\Aboxed{' + noms[i] + exercice[i][-1] + r'}' tri = [] for i in range(len(exercice)): tri.append((i, len(exercice[i]))) tri = sorted(tri, key=lambda nblgn: nblgn[1]) if tri[0][0] < tri[1][0]: exercice[tri[0][0]].extend(exercice.pop(tri[1][0])) else: exercice[tri[1][0]].extend(exercice.pop(tri[0][0])) exo.append(r'\begin{align*}') for j in range(max(len(exercice[0]), len(exercice[1]), len(exercice[2]))): sol = '' for i in range(3): if j < len(exercice[i]): sol += exercice[i][j] else: sol += r'& ' if i == 2: sol += r'\\' else: sol += r' & ' exo.append(sol) exo.append(r'\end{align*}') return exo
def tex_statement(self): exo = [r'\exercice'] exo.append(_(u'Résoudre les équations :')) exo.append('\\begin{align*}') for e in self.exercice: if len(e) == 2: exo.append(Priorites3.texify([[repr(Polynome(e[0])), '*', repr(Polynome(e[1]))]])[0] + ' &= 0 & ') else: exo.append(r'\cfrac{%s}{%s} &= %s & ' % (Polynome(e[0]), Polynome(e[1]), Polynome(e[2]))) exo[-1] = exo[-1][:-3] # Suppression du dernier " &" exo.append('\\end{align*}') return exo
def tracefonc(f, i, A, B, xmin, xmax, ymin, ymax): """**tracefonc\ (*f*\ , *i*\ , *A*\ , *B*\ , *xmin*\ , *xmax*\ , *ymin*\ , *ymax*\ ) *A* est sur l'axe des ordonnées, *f* est le nom de la fonction Génère la 2e queston et sa réponse >>> from pyromaths.classes.Fractions import Fraction >>> affine.tracefonc('f', 1, (0,-2),(3,2),-4,4,-4,-4) [u'Tracer la droite repr\xe9sentative ($d_1$) de la fonction $f:x\\longmapsto \\ dfrac{4}{3}\\,x-2$.', 'On sait que $f(0)=-2$ et $f(-3)=\\dfrac{4}{3}\\times \\le ft( -3\\right) -2=\\dfrac{4\\times \\cancel{3}\\times -1}{\\cancel{3}\\times 1}- 2=-4-2=-6', '\\psdot [dotsize=4.5pt,dotstyle=x](0, -2)', '\\psdot [dotsize=4.5pt ,dotstyle=x](-3, -6.0)'] :rtype: list of string """ u = coefdir(A, B) if isinstance(u, int) or u.d == 1: x1 = decimaux(B[0]) else: B = (u.d, u.n + float(A[1])) if not dansrep(B, xmin, xmax, ymin, ymax): B = (-u.d, -u.n + float(A[1])) x1 = decimaux(str(B[0])) l = Priorites3.texify([Polynome([[u, 1], [A[1], 0]], "x")(B[0])]) l.extend( Priorites3.texify( Priorites3.priorites(Polynome([[u, 1], [A[1], 0]], "x")(B[0])))) l = [ u'Tracer la droite représentative ($d_' + str(i) + '$) de la fonction $' + f + ':x\\longmapsto ' + str(Polynome([[u, 1], [A[1], 0]], "x")) + '$.', 'On sait que $' + f + '(0)=' + decimaux(str(A[1])) + '$ et $' + f + '(' + x1 + ')=' + "=".join(l) + "$.", '\\psdot [dotsize=4.5pt,dotstyle=x]' + str(A), '\\psdot [dotsize=4.5pt,dotstyle=x]' + str(B), ] return l
def print_coef(coef): """Gère le format du coef """ if isinstance(coef, (float, int)): if coef > 0: return "+" + decimaux(coef) else: return decimaux(coef) if isinstance(coef, Fraction): if isinstance(coef.n, int) and isinstance(coef.d, int) and coef.n < 0 and coef.d > 0: return "-" + str(Fraction(-coef.n, coef.d, coef.code)) return "+" + str(coef) if isinstance(coef, str): texte = "(" + "".join(Priorites3.texify([Priorites3.splitting(coef)])) + ")" if texte[0] != "-": return "+" + texte else: return texte
def factorisation(): """Génère un exercice de factorisation utilisant les identités remarquables ou la distributivité """ l = [randrange(1, 11) for dummy in range(21)] diff = [True, False, False] shuffle(diff) exo = [id_rem1, id_rem2] lexo = [exo[randrange(2)](l[0], l[1])] lexo.append(id_rem3(l[2], l[3])) lexo.append(id_rem3bis(l[4], l[5], l[6])) lexo.append(facteur_commun1(l[7:13], diff=diff.pop())) shuffle(lexo) exo = [facteur_commun2, facteur_commun3] shuffle(exo) lexo.append(exo[0](l[13:17], diff=diff.pop())) lexo.append(exo[1](l[17:21], diff=diff.pop())) exo = ["\\exercice", u"Factoriser chacune des expressions littérales suivantes :"] exo.append("\\begin{multicols}{2}") cor = ["\\exercice*", u"Factoriser chacune des expressions littérales suivantes :"] cor.append("\\begin{multicols}{2}") for i in range(len(lexo)): p = [lexo[i]] while True: fact = factoriser(p[-1]) if fact: p.append(fact) else: break p = Priorites3.texify([Priorites3.splitting(p[j]) for j in range(len(p))]) cor.append('\\\\\n'.join(['$%s=%s$' % (chr(i + 65), p[j]) for j in range(len(p) - 1)])) cor.append('\\\\') cor.append('\\fbox{$%s=%s$}\\\\\n' % (chr(i + 65), p[-1])) exo.append('\\\\\n'.join(['$%s=%s$' % (chr(i + 65), Priorites3.texify([Priorites3.splitting(lexo[i])])[0]) for i in range(len(lexo))])) exo.append("\\end{multicols}") cor.append("\\end{multicols}") return exo, cor
def tex_statement(self): exo = [r'\exercice'] exo.append(_(u'Donner la forme canonique des polynômes $P$ , $Q$ , $R$ et $S$ .')) exo.append(r'\begin{align*}') noms = [r'P\,(x) &= ', r'Q\,(x) &= ', r'R\,(x) &= ', r'S\,(x) &= '] exercice = list(self.exercice) sol = '' for i in range(len(exercice)): exercice[i][0] = Priorites3.texify(exercice[i][0]) sol += noms[i] + exercice[i][0][0] if i < len(exercice) - 1: sol += r' & ' else: sol += r' \\ ' exo.append(sol) exo.append(r'\end{align*}') return exo
def print_coef(coef): """Gère le format du coef """ if isinstance(coef, (float, int)): if coef > 0: return "+" + decimaux(coef) else: return decimaux(coef) if isinstance(coef, Fraction): if isinstance(coef.n, int) and isinstance( coef.d, int) and coef.n < 0 and coef.d > 0: return "-" + str(Fraction(-coef.n, coef.d, coef.code)) return "+" + str(coef) if isinstance(coef, str): texte = "(" + "".join( Priorites3.texify([Priorites3.splitting(coef)])) + ")" if texte[0] != "-": return "+" + texte else: return texte
def tex_answer(self): exo = [r'\exercice*'] exo.append(_(u'Déterminer les racines des polynômes :\\par')) noms = [r'P\,(x) &= ', r'Q\,(x) &= ', r'R\,(x) &= '] r = '' question = [[], [], []] for i in range(3): p = [] m = Polynome(list(self.exercice[i])).ordonne() if factoriser('%r' % Polynome(m)): p = [factoriser('%r' % Polynome(m))] while factoriser(p[-1]): p.append(factoriser(p[-1])) if p and eval(Priorites3.splitting(p[-1])[0]).degre() > 0: tmp = Priorites3.texify([Priorites3.splitting(p[j]) for j in range(len(p))]) question[i].append('{$\\! \\begin{aligned}') question[i].append(noms[i] + str(Polynome(m, 'x')) + r'\\') question[i].append('\\\\\n'.join(['&=%s' % (tmp[j]) for j in range(len(tmp))])) question[i].append(r'\end{aligned}$}\par') lp = Priorites3.splitting(p[-1]) racines = [] for e in lp: if e[:9] == 'Polynome(': e = eval(e) if len(e) == 2: racines.append(str(Fraction(-e[1][0], e[0][0]).simplifie())) else: racines.append('0') if len(racines) > 1: question[i].append(_(u'\\underline{Les racines de $%s$ sont }\\fbox{$%s$}') % (noms[i].rstrip(r' &= '), '$}\\underline{ et }\\fbox{$'.join(racines))) elif len(racines) == 1: question[i].append(_(u'\\underline{L\'unique racine de $%s$ est }\\fbox{$%s$}') % (noms[i].rstrip(r' &= '), racines[0])) elif len(m) == 2 and m[0][1] == 2 and m[1][1] == 0 and m[0][0] * m[1][0] > 0: question[i].append('$' + noms[i] + str(Polynome(m, 'x')) + r'$\par') question[i][-1] = question[i][-1].replace('&', '') if m[1][0] > 0: question[i].append('$' + noms[i][:7] + ' \\ge %r$' % m[1][0]) else: question[i].append('$' + noms[i][:7] + ' \\le %r$' % m[1][0]) question[i].append(_(u'car un carré est toujours positif.\\par\n\\underline{$%s$ n\'a donc pas de racine.}') % (noms[i].rstrip(r' &= '))) else: question[i].append('$' + noms[i] + str(Polynome(m, 'x')) + r'\quad$') question[i][-1] = question[i][-1].replace('&', '') question[i].append(_(u'On calcule le discriminant de $%s$ avec $a=%s$, $b=%s$ et $c=%s$ :\\par\\medskip') % (noms[i].rstrip(r' &= '), m[0][0], m[1][0], m[2][0])) question[i].append(r'\begin{tabularx}{\linewidth}[t]{XXX}') question[i].append(r'{$\! \begin{aligned}') sol = [[str(m[1][0]), '**', '2', '-', '4', '*', str(m[0][0]), '*', str(m[2][0])]] sol.extend(Priorites3.priorites('%s**2-4*%s*%s' % (m[1][0], m[0][0], m[2][0]))) solTeX = Priorites3.texify(sol) for s in solTeX: question[i].append(u'\\Delta &= %s\\\\' % s) question[i].append(r'\end{aligned}$}') question[i].append(r'&') question[i].append(r'{$\! \begin{aligned}') delta = sol[-1][0] sol = [['Fraction(SquareRoot([[%s, None], [-1, %s]]),\'2*%s\')' % (-m[1][0], delta, m[0][0])]] sol.extend(Priorites3.priorites(sol[0][0])) sol = Priorites3.texify(sol) for s in sol: question[i].append(u'x_1 &= %s\\\\' % s) racines = [sol[-1]] question[i].append(r'\end{aligned}$}') question[i].append(r'&') question[i].append(r'{$\! \begin{aligned}') sol = [['Fraction(SquareRoot([[%s, None], [1, %s]]),\'2*%s\')' % (-m[1][0], delta, m[0][0])]] sol.extend(Priorites3.priorites(sol[0][0])) sol = Priorites3.texify(sol) for s in sol: question[i].append(u'x_2 &= %s\\\\' % s) racines.append(sol[-1]) question[i].append(r'\end{aligned}$}') question[i].append(r'\end{tabularx}\par') question[i].append(_(u'\\underline{Les racines de $%s$ sont }\\fbox{$%s$}') % (noms[i].rstrip(r' &= '), _('$}\\underline{ et }\\fbox{$').join(racines))) if i == 1: question.append(question[1]) if len(question) == 4: question.pop(1) if question[0][0][-6:] == r'\quad$': question[1].insert(0, r'\par\medskip\begin{tabularx}{\linewidth}[t]{XX}') question[2].insert(0, r'&') question[2].append(r'\end{tabularx}\par\medskip') else: question[0].insert(0, r'\begin{tabularx}{\linewidth}[t]{XX}') question[1].insert(0, r'&') question[1].append(r'\end{tabularx}\par\medskip') for i in range(3): exo.extend(question[i]) return exo
def tex_answer(self): exo = [r'\exercice*'] exo.append(_(u'Déterminer les racines des polynômes :\\par')) noms = [r'P\,(x) &= ', r'Q\,(x) &= ', r'R\,(x) &= '] r = '' question = [[], [], []] for i in range(3): p = [] m = Polynome(list(self.exercice[i])).ordonne() if factoriser('%r' % Polynome(m)): p = [factoriser('%r' % Polynome(m))] while factoriser(p[-1]): p.append(factoriser(p[-1])) if p and eval(Priorites3.splitting(p[-1])[0]).degre() > 0: tmp = Priorites3.texify([Priorites3.splitting(p[j]) for j in range(len(p))]) question[i].append('{$\\! \\begin{aligned}') question[i].append(noms[i] + str(Polynome(m, 'x')) + r'\\') question[i].append('\\\\\n'.join(['&=%s' % (tmp[j]) for j in range(len(tmp))])) question[i].append(r'\end{aligned}$}\par') lp = Priorites3.splitting(p[-1]) racines = [] for e in lp: if e[:9] == 'Polynome(': e = eval(e) if len(e) == 2: racines.append(str(Fraction(-e[1][0], e[0][0]).simplifie())) else: racines.append('0') if len(racines) > 1: question[i].append(_(u'\\underline{Les racines de $%s$ sont }\\fbox{$%s$}') % (noms[i].rstrip(r' &= '), '$}\\underline{ et }\\fbox{$'.join(racines))) elif len(racines) == 1: question[i].append(_(u'\\underline{L\'unique racine de $%s$ est }\\fbox{$%s$}') % (noms[i].rstrip(r' &= '), racines[0])) elif len(m) == 2 and m[0][1] == 2 and m[1][1] == 0 and m[0][0] * m[1][0] > 0: question[i].append('$' + noms[i] + str(Polynome(m, 'x')) + r'$\par') question[i][-1] = question[i][-1].replace('&', '') if m[1][0] > 0: question[i].append('$' + noms[i][:7] + ' \\geqslant %r$' % m[1][0]) else: question[i].append('$' + noms[i][:7] + ' \\leqslant %r$' % m[1][0]) question[i].append(_(u'car un carré est toujours positif.\\par\n\\underline{$%s$ n\'a donc pas de racine.}') % (noms[i].rstrip(r' &= '))) else: question[i].append('$' + noms[i] + str(Polynome(m, 'x')) + r'\quad$') question[i][-1] = question[i][-1].replace('&', '') question[i].append(_(u'On calcule le discriminant de $%s$ avec $a=%s$, $b=%s$ et $c=%s$ :\\par\\medskip') % (noms[i].rstrip(r' &= '), m[0][0], m[1][0], m[2][0])) question[i].append(r'\begin{tabularx}{\linewidth}[t]{XXX}') question[i].append(r'{$\! \begin{aligned}') if m[1][0]>0: sol = [[str(m[1][0]), '**', '2', '-', '4', '*', str(m[0][0]), '*', str(m[2][0])]] sol.extend(Priorites3.priorites('%s**2-4*%s*%s' % (m[1][0], m[0][0], m[2][0]))) else: sol = [['(', str(m[1][0]), ')', '**', '2', '-', '4', '*', str(m[0][0]), '*', str(m[2][0])]] sol.extend(Priorites3.priorites('(%s)**2-4*%s*%s' % (m[1][0], m[0][0], m[2][0]))) solTeX = Priorites3.texify(sol) for s in solTeX: question[i].append(u'\\Delta &= %s\\\\' % s) question[i].append(r'\end{aligned}$}') question[i].append(r'&') question[i].append(r'{$\! \begin{aligned}') delta = sol[-1][0] print(sol) sol = [['Fraction(SquareRoot([[%s, None], [-1, %s]]),\'2*%s\')' % (-m[1][0], delta, m[0][0])]] sol.extend(Priorites3.priorites(sol[0][0])) sol = Priorites3.texify(sol) for s in sol: question[i].append(u'x_1 &= %s\\\\' % s) racines = [sol[-1]] question[i].append(r'\end{aligned}$}') question[i].append(r'&') question[i].append(r'{$\! \begin{aligned}') sol = [['Fraction(SquareRoot([[%s, None], [1, %s]]),\'2*%s\')' % (-m[1][0], delta, m[0][0])]] sol.extend(Priorites3.priorites(sol[0][0])) sol = Priorites3.texify(sol) for s in sol: question[i].append(u'x_2 &= %s\\\\' % s) racines.append(sol[-1]) question[i].append(r'\end{aligned}$}') question[i].append(r'\end{tabularx}\par') question[i].append(_(u'\\underline{Les racines de $%s$ sont }\\fbox{$%s$}') % (noms[i].rstrip(r' &= '), _('$}\\underline{ et }\\fbox{$').join(racines))) if i == 1: question.append(question[1]) if len(question) == 4: question.pop(1) if question[0][0][-6:] == r'\quad$': question[1].insert(0, r'\par\medskip\begin{tabularx}{\linewidth}[t]{XX}') question[2].insert(0, r'&') question[2].append(r'\end{tabularx}\par\medskip') else: question[0].insert(0, r'\begin{tabularx}{\linewidth}[t]{XX}') question[1].insert(0, r'&') question[1].append(r'\end{tabularx}\par\medskip') for i in range(3): exo.extend(question[i]) return exo