#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Pyromaths
# Un programme en Python qui permet de créer des fiches d'exercices types de
# mathématiques niveau collège ainsi que leur corrigé en LaTeX.
# Copyright (C) 2006 -- Jérôme Ortais (jerome.ortais@pyromaths.org)
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
from .fractions import tex_frac, tex_frac_quiz, simplifie, tex_decomp_prod, \
decomp_prod, produit, den_com0
from ..outils.Arithmetique import valeur_alea, signe, pgcd
import random
#
# ------------------- DEVELOPPEMENTS -------------------
def coef_opposes(a): # renvoie un tuple dont les valeurs sont les opposees de celles de a
l = []
for i in range(len(a)):
l.append(-a[i])
return tuple(l)
def dev(a): # renvoi un tuple avec les 3 coefficients du developpement
return (a[0][0] * a[1][0], a[0][0] * a[1][1] + a[0][1] * a[1][0], a[0][1] *
a[1][1])
def somme_polynomes(a, b): # renvoie un tuple dont les valeurs sont les sommes des valeurs correspondantes dans a et b
l = []
if len(a) > len(b):
long = len(a)
else:
long = len(b)
for i in range(long):
if (len(a) - i) - 1 < 0:
l.append(b[(len(b) - 1) - i])
elif (len(b) - i) - 1 < 0:
l.append(a[(len(a) - 1) - i])
else:
l.append(a[(len(a) - 1) - i] + b[(len(b) - 1) - i])
l.reverse()
return tuple(l)
def tex_coef(coef, var, bplus=0, bpn=0, bpc=0, ecu=0):
# coef est le coefficient à écrire devant la variable var
# bplus est un booleen : s'il est vrai, il faut ecrire le signe +
# bpn est un booleen : s'il est vrai, il faut mettre des parentheses autour de l'ecriture si coef est negatif.
# bpc est un booleen : s'il est vrai, il faut mettre des parentheses autour de l'ecriture si coef =! 0 ou 1 et var est non vide
if coef != 0 and abs(coef) != 1:
if var == '':
if abs(coef) >= 1000:
a = '\\nombre{%s}' % coef
else:
a = '%s' % coef
else:
if abs(coef) >= 1000:
a = '\\nombre{%s}\\,%s' % (coef, var)
else:
a = '%s\\,%s' % (coef, var)
if bplus and coef > 0:
a = '+' + a
elif coef == 1:
if var == '':
a = '1'
else:
a = '%s' % var
if bplus:
a = '+' + a
elif coef == 0:
if ecu:
a = '0'
else:
a = ''
elif coef == -1:
if var == '':
a = '-1'
else:
a = '-%s' % var
if bpn and coef < 0 or bpc and coef != 0 and coef != 1 and var != '':
a = '\\left( ' + a + '\\right)'
return a
def tex_dev0(a, bplus=0): # renvoi (a+b)², (a-b)² ou (a+b)(c+d) ou a(c+d) ou (a+b)*c
# a est de la forme ((3, 2), (3, 2)) pour (3x+2)(3x+2)
(ca, cb, cc, cd) = (a[0][0], a[0][1], a[1][0], a[1][1]) # coefficients a, b, c et d
if ca == 0 and cb == 0 or cc == 0 and cd == 0:
return '0'
elif a[0] == a[1]:
# (a+b)² ou (a-b)²
if ca == 0:
return '%s^2' % tex_coef(cb, '', bpn=1)
elif cb == 0:
return '%s^2' % tex_coef(ca, 'x', bpc=1)
else:
return '(%s%s)^2' % (tex_coef(ca, 'x'), tex_coef(cb, '',
bplus=1))
else:
# (a+b)(c+d)
if ca == 0 or cb == 0:
if cc == 0 or cd == 0:
return _('%s%s\\times %s%s') % (tex_coef(ca, 'x'), tex_coef(cb,
'', bplus=ca != 0), tex_coef(cc, 'x', bpn=1),
tex_coef(cd, '', bplus=cc != 0, bpn=1))
else:
return '%s%s\\,(%s%s)' % (tex_coef(ca, 'x'), tex_coef(cb,
'', bplus=ca != 0), tex_coef(cc, 'x'), tex_coef(cd,
'', bplus=cc != 0))
elif cc == 0 or cd == 0:
if cc == 0 and cd == 1:
return '%s%s' % (tex_coef(ca, 'x', bplus=bplus),
tex_coef(cb, '', bplus=ca != 0))
else:
return _('(%s%s)\\times %s%s') % (tex_coef(ca, 'x'),
tex_coef(cb, '', bplus=ca != 0), tex_coef(cc,
'x', bpn=1), tex_coef(cd, '', bplus=cc != 0, bpn=
1))
else:
return '(%s%s)\\,(%s%s)' % (tex_coef(ca, 'x'), tex_coef(cb,
'', bplus=1), tex_coef(cc, 'x'), tex_coef(cd, '',
bplus=1))
def tex_dev1(a, bplus=0, bpar=0, bpn=0): # renvoi le developpement (a)²+2*a*b+(b)², (a)²-2*a*b+(b)², (a)²-(b)² ou a*c+a*d+b*c+b*d
# a est de la forme ((3, 2)(3, 2)) pour (3x+2)(3x+2)
(ca, cb, cc, cd) = (a[0][0], a[0][1], a[1][0], a[1][1]) # coefficients a, b, c et d
if a[0] == a[1]: # (a+b)² ou (a-b)²
if signe(ca) == signe(cb): # (a+b)²
(ca, cb) = (abs(ca), abs(cb))
texte = _('%s^2+2\\times %s\\times %s+%s^2') % (tex_coef(ca,
'x', bpc=1), tex_coef(ca, 'x', bpn=1), tex_coef(cb,
'', bpn=1), tex_coef(cb, '', bpn=1, bpc=1))
if bpar:
return '(' + texte + ')'
else:
return texte
else:
# (a-b)²
(ca, cb) = (abs(ca), abs(cb))
texte = _('%s^2-2\\times %s\\times %s+%s^2') % (tex_coef(ca,
'x', bpc=1), tex_coef(ca, 'x', bpn=1), tex_coef(cb,
'', bpn=1), tex_coef(cb, '', bpn=1, bpc=1))
if bpar:
return '(' + texte + ')'
else:
return texte
if abs(ca) == abs(cc) and abs(cb) == abs(cd): # (a+b)(a-b) ou (a+b)(-a+b)
if ca == cc: # (a+b)(a-b)
texte = '%s^2-%s^2' % (tex_coef(ca, 'x', bpc=1), tex_coef(abs(cb),
''))
if bpar:
return '(' + texte + ')'
else:
return texte
else:
# (a+b)(-a+b)
texte = '%s^2-%s^2' % (tex_coef(cb, '', bpn=1), tex_coef(abs(ca),
'x', bpc=1))
if bpar:
return '(' + texte + ')'
else:
return texte
else:
# (a+b)(c+d)
if cc == 0 and cd == 1:
texte = '%s%s' % (tex_coef(ca, 'x', bplus=bplus), tex_coef(cb,
'', bplus=ca != 0))
if bpar:
return '(' + texte + ')'
else:
return texte
else:
texte = '%s+%s+%s+%s' % (tex_coef(ca * cc, 'x^2', bpn=bpn),
tex_coef(ca * cd, 'x', bpn=1), tex_coef(cb * cc, 'x',
bpn=1), tex_coef(cb * cd, '', bpn=1))
if bpar:
return '(' + texte + ')'
else:
return texte
def tex_developpe1(a, exo, cor): # developpe l'expression a
exo.append(u'\\[ \\thenocalcul = ' + tex_dev0(a) + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + tex_dev0(a) + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + tex_dev1(a) + '\\]')
cor.append(u'\\[ \\boxed{\\thenocalcul = ' + tex_trinome(dev(a)) + '} \\]')
quiz_txt = (u"%s$$
\n" % tex_dev0(a))
quiz_txt += (_(u"Réponse: ")+"{1:NUMERICAL:=%s}$$x^2+$${1:NUMERICAL:=%s}$$x+$${1:NUMERICAL:=%s}
\n" %
(tex_coef(dev(a)[0], '', ecu=1), tex_coef(dev(a)[1], '', ecu=1),
tex_coef(dev(a)[2], '', ecu=1)))
return quiz_txt
def tex_developpe2(a, nega, b, negb, cor, exo=None): # developpe l'expression a plus l'expression b.
quiz_txt = ""
if nega:
if negb:
if b[1][0] == 0 and b[1][1] == 1:
if exo:
exo.append(u'\\[ \\thenocalcul = ' + '-' + tex_dev0(a) + '-(' + tex_dev0(b) +
')' + '\\]')
quiz_txt = (u"-%s-(%s)$$
\n" % (tex_dev0(a), tex_dev0(b)))
cor.append(u'\\[ \\thenocalcul = ' + '-' + tex_dev0(a) + '-(' + tex_dev0(b) +
')' + '\\]')
elif a[1][0] == 0 and a[1][1] == 1:
if exo:
exo.append(u'\\[ \\thenocalcul = ' + '-(' + tex_dev0(a) + ')-' + tex_dev0(b) + '\\]')
quiz_txt = (u"-(%s)-%s$$
\n" % (tex_dev0(a), tex_dev0(b)))
cor.append(u'\\[ \\thenocalcul = ' + '-(' + tex_dev0(a) + ')-' + tex_dev0(b) + '\\]')
else:
if exo:
exo.append(u'\\[ \\thenocalcul = ' + '-' + tex_dev0(a) + '-' + tex_dev0(b) + '\\]')
quiz_txt = (u"-%s-%s$$
\n" % (tex_dev0(a), tex_dev0(b)))
cor.append(u'\\[ \\thenocalcul = ' + '-' + tex_dev0(a) + '-' + tex_dev0(b) + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + '-(' + tex_dev1(a) + ')-(' + tex_dev1(b) + ')' + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + '-(' + tex_trinome(dev(a)) + ')-(' +
tex_trinome(dev(b)) + ')' + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + tex_trinome(coef_opposes(dev(a))) +
tex_trinome(coef_opposes(dev(b)), bplus=1) + '\\]')
cor.append(u'\\[ \\boxed{\\thenocalcul = ' + tex_trinome(somme_polynomes(coef_opposes(dev(a)),
coef_opposes(dev(b)))) + '} \\]')
quiz_txt += (_(u"Réponse: ")+"{1:NUMERICAL:=%s}$$x^2+$${1:NUMERICAL:=%s}$$x+$${1:NUMERICAL:=%s}" %
(tex_coef(somme_polynomes(coef_opposes(dev(a)), coef_opposes(dev(b)))[0], '', ecu=1),
tex_coef(somme_polynomes(coef_opposes(dev(a)), coef_opposes(dev(b)))[1], '', ecu=1),
tex_coef(somme_polynomes(coef_opposes(dev(a)), coef_opposes(dev(b)))[2], '', ecu=1)))
else:
if a[1][0] == 0 and a[1][1] == 1:
if exo:
exo.append(u'\\[ \\thenocalcul = ' + '-(' + tex_dev0(a) + ')+' + tex_dev0(b) + '\\]')
quiz_txt = (u"-(%s)+%s$$
\n" % (tex_dev0(a), tex_dev0(b)))
cor.append(u'\\[ \\thenocalcul = ' + '-(' + tex_dev0(a) + ')+' + tex_dev0(b) + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + '-(' + tex_dev1(a) + ')+' + tex_dev1(b,
bpn=1) + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + '-(' + tex_trinome(dev(a)) + ')+' +
tex_trinome(dev(b)) + '\\]')
elif b[1][0] == 0 and b[1][1] == 1:
if exo:
exo.append(u'\\[ \\thenocalcul = ' + '-' + tex_dev0(a) + tex_dev0(b, bplus=
1) + '\\]')
quiz_txt = (u"-%s+%s$$
\n" % (tex_dev0(a), tex_dev0(b, bplus=1)))
cor.append(u'\\[ \\thenocalcul = ' + '-' + tex_dev0(a) + tex_dev0(b, bplus=1) + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + '-(' + tex_dev1(a) + ')' + tex_dev1(b,
bplus=1) + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + '-(' + tex_trinome(dev(a)) + ')' +
tex_trinome(dev(b), bplus=1) + '\\]')
else:
if exo:
exo.append(u'\\[ \\thenocalcul = ' + '-' + tex_dev0(a) + '+' + tex_dev0(b) + '\\]')
quiz_txt = (u"-%s+%s$$
\n" % (tex_dev0(a), tex_dev0(b)))
cor.append(u'\\[ \\thenocalcul = ' + '-' + tex_dev0(a) + '+' + tex_dev0(b) + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + '-(' + tex_dev1(a) + ')+' + tex_dev1(b,
bpn=1) + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + '-(' + tex_trinome(dev(a)) + ')' +
tex_trinome(dev(b), bplus=1) + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + tex_trinome(coef_opposes(dev(a))) +
tex_trinome(dev(b), bplus=1) + '\\]')
cor.append(u'\\[ \\boxed{\\thenocalcul = ' + tex_trinome(somme_polynomes(coef_opposes(dev(a)),
dev(b))) + '} \\]')
quiz_txt += (_(u"Réponse: ")+"{1:NUMERICAL:=%s}$$x^2+$${1:NUMERICAL:=%s}$$x+$${1:NUMERICAL:=%s}" %
(tex_coef(somme_polynomes(coef_opposes(dev(a)), dev(b))[0], '', ecu=1),
tex_coef(somme_polynomes(coef_opposes(dev(a)), dev(b))[1], '', ecu=1),
tex_coef(somme_polynomes(coef_opposes(dev(a)), dev(b))[2], '', ecu=1)))
elif negb:
if b[1][0] == 0 and b[1][1] == 1:
if exo:
exo.append(u'\\[ \\thenocalcul = ' + tex_dev0(a) + '-(' + tex_dev0(b) + ')' + '\\]')
quiz_txt = (u"%s-(%s)$$
\n" % (tex_dev0(a), tex_dev0(b)))
cor.append(u'\\[ \\thenocalcul = ' + tex_dev0(a) + '-(' + tex_dev0(b) + ')' + '\\]')
else:
if exo:
exo.append(u'\\[ \\thenocalcul = ' + tex_dev0(a) + '-' + tex_dev0(b) + '\\]')
quiz_txt = (u"%s-%s$$
\n" % (tex_dev0(a), tex_dev0(b)))
cor.append(u'\\[ \\thenocalcul = ' + tex_dev0(a) + '-' + tex_dev0(b) + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + tex_dev1(a) + '-(' + tex_dev1(b) + ')' + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + tex_trinome(dev(a)) + '-(' + tex_trinome(dev(b)) +
')' + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + tex_trinome(dev(a)) + tex_trinome(coef_opposes(dev(b)),
bplus=1) + '\\]')
cor.append(u'\\[ \\boxed{\\thenocalcul = ' + tex_trinome(somme_polynomes(dev(a), coef_opposes(dev(b)))) + '} \\]')
quiz_txt += (_(u"Réponse: ")+"{1:NUMERICAL:=%s}$$x^2+$${1:NUMERICAL:=%s}$$x+$${1:NUMERICAL:=%s}" %
(tex_coef(somme_polynomes(dev(a), coef_opposes(dev(b)))[0], '', ecu=1),
tex_coef(somme_polynomes(dev(a), coef_opposes(dev(b)))[1], '', ecu=1),
tex_coef(somme_polynomes(dev(a), coef_opposes(dev(b)))[2], '', ecu=1)))
else:
if b[1][0] == 0 and b[1][1] == 1:
if exo:
exo.append(u'\\[ \\thenocalcul = ' + tex_dev0(a) + tex_dev0(b, bplus=1) + '\\]')
quiz_txt = (u"%s%s$$
\n" % (tex_dev0(a), tex_dev0(b, bplus=1)))
cor.append(u'\\[ \\thenocalcul = ' + tex_dev0(a) + tex_dev0(b, bplus=1) + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + tex_dev1(a) + tex_dev1(b, bplus=1) + '\\]')
else:
if exo:
exo.append(u'\\[ \\thenocalcul = ' + tex_dev0(a) + '+' + tex_dev0(b) + '\\]')
quiz_txt = (u"%s+%s$$
\n" % (tex_dev0(a), tex_dev0(b)))
cor.append(u'\\[ \\thenocalcul = ' + tex_dev0(a) + '+' + tex_dev0(b) + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + tex_dev1(a) + '+' + tex_dev1(b) + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + tex_trinome(dev(a)) + tex_trinome(dev(b), bplus=1) + '\\]')
cor.append(u'\\[ \\boxed{\\thenocalcul = ' + tex_trinome(somme_polynomes(dev(a), dev(b))) + '} \\]')
quiz_txt += (_(u"Réponse: ")+"{1:NUMERICAL:=%s}$$x^2+$${1:NUMERICAL:=%s}$$x+$${1:NUMERICAL:=%s}" %
(tex_coef(somme_polynomes(dev(a), dev(b))[0], '', ecu=1),
tex_coef(somme_polynomes(dev(a), dev(b))[1], '', ecu=1),
tex_coef(somme_polynomes(dev(a), dev(b))[2], '', ecu=1)))
return quiz_txt
def tex_trinome(a, bplus=0, bpar=0): # renvoi le trinome ax²+bx+c
# bplus est un booleen : s'il est vrai, le premier terme est precede d'un signe + si son coefficient est positif.
# bpar est un booleen : s'il est vrai, ecrit des parentheses autour du trinome si deux valeurs au moins ne sont pas nulles ou si la valeur est -
texte = '%s%s%s' % (tex_coef(a[0], 'x^2', bplus=bplus), tex_coef(a[1],
'x', bplus=bplus or a[0] != 0), tex_coef(a[2],
'', bplus=bplus or a[0] != 0 or a[1] != 0))
if bpar:
v0 = 0
for i in range(3): # compte le nombre de valeurs nulles
if a[i] == 0:
v0 = v0 + 1
if v0 == 2: # une seule valeur non nulle (on suppose que les trois coef ne sont pas nuls)
if a[0] < 0 or a[1] < 0 or a[2] < 0: # le coefficient non nul est negatif, il faut donc des parentheses
return '(' + texte + ')'
else:
return texte
else:
return '(' + texte + ')'
else:
return texte
def valeurs_apb2(pyromax): # renvoie un tuple contenant ((3,5),(3,5))
a = valeur_alea(1, pyromax)
b = valeur_alea(1, pyromax)
return ((a, b), (a, b))
def valeurs_amb2(pyromax): # renvoie un tuple contenant ((3,-5),(3,-5))
a = valeur_alea(1, pyromax)
b = valeur_alea(-pyromax, -1)
return ((a, b), (a, b))
def valeurs_apbamb(pyromax): # renvoie un tuple contenant ((3,-5),(3,+5))
a = valeur_alea(1, pyromax)
b = valeur_alea(1, pyromax)
if random.randrange(2):
return ((a, -b), (a, b))
else:
return ((a, b), (a, -b))
def valeurs_distr(pyromax):
# renvoie in tuple contenant ((a,b),(c,d)) avec a != c ou b != d (en valeur
# absolue)
a = valeur_alea(-pyromax, pyromax)
b = valeur_alea(-pyromax, pyromax)
c = valeur_alea(-pyromax, pyromax)
d = valeur_alea(-pyromax, pyromax)
while abs(a) == abs(c) and abs(b) == abs(d):
c = valeur_alea(-pyromax, pyromax)
d = valeur_alea(-pyromax, pyromax)
return ((a, b), (c, d))
#
# ------------------- FACTORISATIONS -------------------
def facteur_commun(a, b): #renvoie le facteur commun et les les deux autres binomes
if a[0] == b[0]: # recherche le facteur commun et le nomme f0, f1 et f2 etant les deux autres facteurs
(f0, f1, f2) = (a[0], a[1], b[1])
elif a[0] == b[1]:
(f0, f1, f2) = (a[0], a[1], b[0])
elif a[1] == b[0]:
(f0, f1, f2) = (a[1], a[0], b[1])
elif a[1] == b[1]:
(f0, f1, f2) = (a[1], a[0], b[0])
return (f0, f1, f2)
def facteur_commun2(f, nega, negb): # renvoie (2x+3)(4x+5+6x+7) sous la forme ((2,3),(4,5),(6,7))
if nega:
if negb:
return (f[0], coef_opposes(f[1]), coef_opposes(f[2]))
else:
return (f[0], coef_opposes(f[1]), f[2])
elif negb:
return (f[0], f[1], coef_opposes(f[2]))
else:
return (f[0], f[1], f[2])
def facteur_commun3(f, nega, negb): # renvoie un tuple contenant les deux binomes finaux de la mise en facteur
if nega and negb:
return (f[0], somme_polynomes(coef_opposes(f[1]), coef_opposes(f[2])))
elif nega:
return (f[0], somme_polynomes(coef_opposes(f[1]), f[2]))
elif negb:
return (f[0], somme_polynomes(f[1], coef_opposes(f[2])))
else:
return (f[0], somme_polynomes(f[1], f[2]))
def tex_binome(a, bplus=0, bpar=0): # renvoi le binome ax+b
# bplus est un booleen : s'il est vrai, le premier terme est precede d'un signe + si son coefficient est positif.
# bpar est un booleen : s'il est vrai, ecrit des parentheses autour du binome si les deux coef ne sont pas nuls ou si le seul coef est -
texte = '%s%s' % (tex_coef(a[0], 'x', bplus=bplus), tex_coef(a[1],
'', bplus=bplus or a[0] != 0))
if bpar:
if (a[0] != 0 or a[1] < 0) and (a[1] != 0 or a[0] < 0):
texte = '(' + texte + ')'
return texte
def tex_trinome_alea(a, bplus=0): # renvoi le trinome ax²+bx+c dans le desordre
valeurs = [tex_coef(a[0], 'x^2', bplus=1), tex_coef(a[1], 'x', bplus=
1), tex_coef(a[2], '', bplus=1)]
ordre1 = []
while ordre1 == [] or ordre1 == [0, 1, 2]:
ordre0 = [i for i in range(3)]
ordre1 = [ordre0.pop(random.randrange(3 - i)) for i in range(3)]
liste = [valeurs[ordre1[i]] for i in range(3)]
if not bplus and liste[0].startswith('+'):
liste[0] = liste[0].replace('+', '', 1)
return '%s%s%s' % tuple(liste)
def tex_facteur_commun0(a): #renvoie -(2x+3)(x+5)+(2x+3)(3x+6)
if a[2]:
if a[3]:
return '-' + tex_dev0(a[0]) + '-' + tex_dev0(a[1])
else:
return '-' + tex_dev0(a[0]) + '+' + tex_dev0(a[1])
elif a[3]:
return tex_dev0(a[0]) + '-' + tex_dev0(a[1])
else:
return tex_dev0(a[0]) + '+' + tex_dev0(a[1])
def tex_facteur_commun1(f, nega, negb): # renvoie (2x+3)(-(x+5)+3x+6)
texte = tex_binome(f[0], bpar=1)
if nega or negb:
texte = texte + '\\,\\big( '
else:
texte = texte + '\\,('
if nega:
texte = texte + '-' + tex_binome(f[1], bpar=1)
else:
texte = texte + tex_binome(f[1], bpar=0)
if negb:
texte = texte + '-' + tex_binome(f[2], bpar=1)
else:
texte = texte + tex_binome(f[2], bplus=1)
if nega or negb:
texte = texte + '\\big)'
else:
texte = texte + ')'
return texte
def tex_facteur_commun2(a): # renvoie renvoie (2x+3)(-x-5+3x+6)
return tex_binome(a[0], bpar=1) + '\\,(' + tex_binome(a[1]) + \
tex_binome(a[2], bplus=1) + ')'
def tex_a2moinsb2_0(a): # renvoie 16-(2x+3)²
if a[0][0] == 0:
return '%s-%s^2' % (a[0][1] ** 2, tex_binome(a[1], bpar=1))
else:
return '%s^2-%s' % (tex_binome(a[0], bpar=1), a[1][1] ** 2)
def tex_a2moinsb2_2(a): # renvoie (4+2x+3)(4-(2x+3))
if a[0][0] == 0:
return '(%s%s)\\,\\big( %s-%s\\big)' % (tex_binome(a[0]),
tex_binome(a[1], bplus=1), tex_binome(a[0]), tex_binome(a[1],
bpar=1))
else:
return '(%s%s)\\,(%s-%s)' % (tex_binome(a[0]), tex_binome(a[1],
bplus=1), tex_binome(a[0]), tex_binome(a[1], bpar=1))
def tex_a2moinsb2_3(a): # renvoie (4+2x+3)(4-2x-3)
if a[0][0] == 0:
return '(%s%s)\\,(%s%s)' % (tex_binome(a[0]), tex_binome(a[1],
bplus=1), tex_binome(a[0]),
tex_binome(coef_opposes(a[1]), bplus=
1))
#else:
# return ''
def tex_facteur_commun(valeurs, cor, exo=None, quiz=None): # ecrit toutes les etapes de la factorisation
(a, b, nega, negb) = valeurs
f = facteur_commun(a, b)
if exo:
exo.append(u'\\[ \\thenocalcul = ' + tex_facteur_commun0(valeurs) + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + tex_facteur_commun0(valeurs) + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + tex_facteur_commun1(f, nega, negb) + '\\]')
f2 = facteur_commun2(f, nega, negb)
if nega and f2[1][0] != 0 and f2[1][1] != 0 or negb and f2[2][0] != \
0 and f2[2][0] != 0:
cor.append(u'\\[ \\thenocalcul = ' + tex_facteur_commun2(f2) + '\\]')
cor.append(u'\\[ \\boxed{\\thenocalcul = ' + tex_dev0((f2[0], somme_polynomes(f2[1], f2[2]))) + '} \\]')
quiz_txt = (_(u"Réponse: ")+"$$(%s\\,x+$${1:NUMERICAL:=%s}$$)\\cdot($$" % f2[0])
quiz_txt += (u"{1:NUMERICAL:=%s}$$x+$${1:NUMERICAL:=%s}$$)$$" % somme_polynomes(f2[1], f2[2]))
if quiz:
quiz_exo_cor = (tex_facteur_commun0(valeurs) + u"$$
\n")
quiz_exo_cor += (quiz_txt + u"
\n")
return quiz_exo_cor
return quiz_txt
def tex_a2moinsb2(valeurs, cor, exo, quiz=None): # ecrit toutes les etapes de la factorisation
if exo:
exo.append(u'\\[ \\thenocalcul = ' + tex_a2moinsb2_0(valeurs) + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + tex_a2moinsb2_0(valeurs) + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + '%s^2-%s^2' % (tex_binome(valeurs[0], bpar=1),
tex_binome(valeurs[1], bpar=1)) + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + tex_a2moinsb2_2(valeurs) + '\\]')
if valeurs[0][0] == 0:
cor.append(u'\\[ \\thenocalcul = ' + tex_a2moinsb2_3(valeurs) + '\\]')
cor.append(u'\\[ \\boxed{\\thenocalcul = ' + tex_dev0((somme_polynomes(valeurs[0], valeurs[1]),
somme_polynomes(valeurs[0], coef_opposes(valeurs[1])))) + '} \\]')
quiz_a = somme_polynomes(valeurs[0], valeurs[1])
quiz_b = somme_polynomes(valeurs[0], coef_opposes(valeurs[1]))
if quiz_a[0] == quiz_b[0]:
if quiz_a[1] > 0:
quiz_txt = (_(u"Réponse: ")+"$$(%s\\,x+%s)\\cdot($$" % quiz_a)
else:
quiz_txt = (_(u"Réponse: ")+"$$(%s\\,x%s)\\cdot($$" % quiz_a)
quiz_txt += (u"{1:NUMERICAL:=%s}$$x+$${1:NUMERICAL:=%s}$$)$$" %
somme_polynomes(valeurs[0], coef_opposes(valeurs[1])))
else:
quiz_txt = (_(u"Réponse: ")+"$$(%s\\,x+$${1:NUMERICAL:=%s}$$)\\cdot($$" %
somme_polynomes(valeurs[0], valeurs[1]))
quiz_txt += (u"{1:NUMERICAL:=%s}$$x+$${1:NUMERICAL:=%s}$$)$$" %
somme_polynomes(valeurs[0], coef_opposes(valeurs[1])))
if quiz:
quiz_exo_cor = (tex_a2moinsb2_0(valeurs) + u"$$
\n")
quiz_exo_cor += (quiz_txt + u"
\n")
return quiz_exo_cor
return quiz_txt
def valeurs_facteur_commun(pyromax): # renvoie les valeurs pour obtenir un facteur commun.
a = ((valeur_alea(-pyromax, pyromax), valeur_alea(-pyromax, pyromax)),
(valeur_alea(-pyromax, pyromax), valeur_alea(-pyromax, pyromax)))
while a[0] == a[1]: # on refuse un carre
a = ((valeur_alea(-pyromax, pyromax), valeur_alea(-pyromax,
pyromax)), (valeur_alea(-pyromax, pyromax), valeur_alea(-pyromax,
pyromax)))
if random.randrange(2) == 0:
while True:
b = (a[random.randrange(2)], (valeur_alea(-pyromax, pyromax),
valeur_alea(-pyromax, pyromax)))
if b[0] != b[1]:
break
else:
while True:
b = ((valeur_alea(-pyromax, pyromax), valeur_alea(-pyromax,
pyromax)), a[random.randrange(2)])
if b[0] != b[1]:
break
(nega, negb) = (random.randrange(2), random.randrange(2))
return (a, b, nega, negb)
def valeurs_facteur1(pyromax): # renvoie les valeurs pour obtenir un facteur commun facteur de 1
a = ((valeur_alea(-pyromax, pyromax), valeur_alea(-pyromax, pyromax)),
(valeur_alea(-pyromax, pyromax), valeur_alea(-pyromax, pyromax)))
while a[0] == a[1]: # on refuse un carre
a = ((valeur_alea(-pyromax, pyromax), valeur_alea(-pyromax,
pyromax)), (valeur_alea(-pyromax, pyromax), valeur_alea(-pyromax,
pyromax)))
b = (a[random.randrange(2)], (0, 1))
if random.randrange(2) == 1: # le 1 est dans le deuxieme terme
return (a, b, random.randrange(2), random.randrange(2))
else:
return (b, a, random.randrange(2), random.randrange(2))
def valeurs_facteurcarre(pyromax): # renvoie les valeurs pour obtenir un facteur commun au carre
a = ((valeur_alea(-pyromax, pyromax), valeur_alea(-pyromax, pyromax)),
(valeur_alea(-pyromax, pyromax), valeur_alea(-pyromax, pyromax)))
while a[0] == a[1]: # on refuse un carre
a = ((valeur_alea(-pyromax, pyromax), valeur_alea(-pyromax,
pyromax)), (valeur_alea(-pyromax, pyromax), valeur_alea(-pyromax,
pyromax)))
if random.randrange(2) == 0:
b = (a[0], a[0])
else:
b = (a[1], a[1])
if random.randrange(2) == 0: # le carre est en premier
return (b, a, 0, random.randrange(2))
else:
return (a, b, random.randrange(2), 0)
def valeurs_facteura2mb2(pyromax): # renvoie (((a,b),(a,-b)),((a,b),(c,d));nega,negb)
a = ((valeur_alea(-pyromax, pyromax), valeur_alea(-pyromax, pyromax)),
(valeur_alea(-pyromax, pyromax), valeur_alea(-pyromax, pyromax)))
while a[0] == a[1]: # on refuse un carre
a = ((valeur_alea(-pyromax, pyromax), valeur_alea(-pyromax,
pyromax)), (valeur_alea(-pyromax, pyromax), valeur_alea(-pyromax,
pyromax)))
if random.randrange(2) == 0:
a = ((abs(a[0][0]), a[0][1]), a[1])
b = (a[0], (a[0][0], -a[0][1]))
else:
a = (a[0], (abs(a[1][0]), a[1][1]))
b = (a[1], (a[1][0], -a[1][1]))
if random.randrange(2) == 0: # le a²-b² est en premier
return (b, a, 0, random.randrange(2))
else:
return (a, b, random.randrange(2), 0)
def valeurs_a2moinsb2(pyromax): # renvoie les valeurs pour obtenir a²-(bx+c)²
a = (0, valeur_alea(1, pyromax))
b = (valeur_alea(-pyromax, pyromax), valeur_alea(-pyromax, pyromax))
if random.randrange(2) == 0: # le nombre est en premier
return (a, b)
else:
return (b, a)
def factorisation0(cor, exo=None, quiz=None, valeurs=None): # factorise (ax+b)(cx+d)+(ax+b)(ex+f)
if not valeurs:
valeurs = valeurs_facteur_commun(10)
return tex_facteur_commun(valeurs, cor, exo, quiz)
def tex_factorisation1(valeurs): # renvoie la premiere etape de la factorisation 1
if valeurs[2] == 0:
siga = ''
else:
siga = '-'
if valeurs[3] == 0:
sigb = '+'
else:
sigb = '-'
if valeurs[0][1][0] == 0 and valeurs[0][1][1] == 1: # le 1 est dans la premiere partie
return '%s%s%s%s' % (siga, tex_trinome(dev(valeurs[0]), bpar=1),
sigb, tex_dev0(valeurs[1]))
else:
return '%s%s%s%s' % (siga, tex_dev0(valeurs[0]), sigb,
tex_trinome(dev(valeurs[1]), bpar=1))
def factorisation1(cor, exo=None, quiz=None, valeurs=None): # factorise (ax+b)(cx+d)+(ax+b)
if not valeurs:
valeurs = valeurs_facteur1(10)
if valeurs[2] == 0:
siga = ''
else:
siga = '-'
if valeurs[3] == 0:
sigb = '+'
else:
sigb = '-'
if valeurs[0][1][0] == 0 and valeurs[0][1][1] == 1: # le 1 est dans la premiere partie
texte = '%s%s%s%s' % (siga, tex_trinome(dev(valeurs[0]), bpar=1),
sigb, tex_dev0(valeurs[1]))
cor.append(u'\\[ \\thenocalcul = ' + texte + '\\]')
if exo:
exo.append(u'\\[ \\thenocalcul = ' + texte + '\\]')
if quiz:
quiz_exo_cor = (texte + u"$$
\n")
texte = _('%s%s\\times1%s%s') % (siga, tex_trinome(dev(valeurs[0]),
bpar=1), sigb, tex_dev0(valeurs[1]))
cor.append(u'\\[ \\thenocalcul = ' + texte + '\\]')
else:
texte = '%s%s%s%s' % (siga, tex_dev0(valeurs[0]), sigb,
tex_trinome(dev(valeurs[1]), bpar=1))
cor.append(u'\\[ \\thenocalcul = ' + texte + '\\]')
if exo:
exo.append(u'\\[ \\thenocalcul = ' + texte + '\\]')
if quiz:
quiz_exo_cor = (texte + u"$$
\n")
texte = _('%s%s%s%s\\times1') % (siga, tex_dev0(valeurs[0]), sigb,
tex_trinome(dev(valeurs[1]), bpar=1))
cor.append(u'\\[ \\thenocalcul = ' + texte + '\\]')
f = facteur_commun(valeurs[0], valeurs[1])
cor.append(u'\\[ \\thenocalcul = ' + tex_facteur_commun1(f, valeurs[2], valeurs[3]) + '\\]')
f2 = facteur_commun2(f, valeurs[2], valeurs[3])
if valeurs[2] and f2[1][0] != 0 and f2[1][1] != 0 or valeurs[3] and \
f2[2][0] != 0 and f2[2][0] != 0:
cor.append(u'\\[ \\thenocalcul = ' + tex_facteur_commun2(f2) + '\\]')
cor.append(u'\\[ \\boxed{\\thenocalcul = ' + tex_dev0((f2[0], somme_polynomes(f2[1], f2[2]))) + '} \\]')
quiz_txt = (_(u"Réponse: ")+"$$(%s\\,x+$${1:NUMERICAL:=%s}$$)\\cdot($$" % f2[0])
quiz_txt += (u"{1:NUMERICAL:=%s}$$x+$${1:NUMERICAL:=%s}$$)$$" % somme_polynomes(f2[1], f2[2]))
if quiz:
quiz_exo_cor += (quiz_txt + u"
\n")
return quiz_exo_cor
return quiz_txt
def factorisation2(cor, exo=None, quiz=None, valeurs=None): # factorise (ax+b)(cx+d)+(ax+b)²
if not valeurs:
valeurs = valeurs_facteurcarre(10)
return tex_facteur_commun(valeurs, cor, exo, quiz)
def tex_factorisation3(valeurs): # renvoie les deux premieres etapes de la factorisation 3
if valeurs[2] == 0:
nega = ''
else:
nega = '-'
if valeurs[3] == 0:
negb = '+'
else:
negb = '-'
if valeurs[0][0][0] == valeurs[0][1][0] and valeurs[0][0][1] == -valeurs[0][1][1]:
return ('%s%s%s%s' % (nega, tex_trinome(dev(valeurs[0])), negb,
tex_dev0(valeurs[1])), '%s%s%s%s' % (nega, tex_dev1(valeurs[0]),
negb, tex_dev0(valeurs[1])))
else:
return ('%s%s%s%s' % (nega, tex_dev0(valeurs[0]), negb,
tex_trinome(dev(valeurs[1]))), '%s%s%s%s' % (nega,
tex_dev0(valeurs[0]), negb, tex_dev1(valeurs[1])))
def factorisation3(cor, exo=None, quiz=None, valeurs=None): # factorise (ax+b)(cx+d)+(ax)²-b²
if not valeurs:
valeurs = valeurs_facteura2mb2(10)
textes = tex_factorisation3(valeurs)
if exo:
exo.append(u'\\[ \\thenocalcul = ' + textes[0] + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + textes[0] + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + textes[1] + '\\]')
quiz_txt = tex_facteur_commun(valeurs, cor, None, quiz)
if quiz:
quiz_exo_cor = quiz_txt
return quiz_exo_cor
return quiz_txt
def factorisation4(cor, exo=None, quiz=None, valeurs=None): #factorise 64-(x-5)²
if not valeurs:
valeurs = valeurs_a2moinsb2(10)
return tex_a2moinsb2(valeurs, cor, exo, quiz)
def factorisation5(cor, exo=None, quiz=None, valeurs=None): # factorise a²-b²
if not valeurs:
valeurs = valeurs_apbamb(10)
if valeurs[0][0] == -valeurs[1][0]:
valeurs = ((valeurs[0][0], abs(valeurs[0][1])), (valeurs[1][0],
abs(valeurs[1][1])))
else:
valeurs = ((abs(valeurs[0][0]), valeurs[0][1]), (abs(valeurs[1][0]),
valeurs[1][1]))
if exo:
exo.append(u'\\[ \\thenocalcul = ' + tex_trinome(dev(valeurs)) + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + tex_trinome(dev(valeurs)) + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + tex_dev1(valeurs) + '\\]')
cor.append(u'\\[ \\boxed{\\thenocalcul = ' + tex_dev0(valeurs) + '} \\]')
quiz_txt = (_(u"Réponse: ")+"$$(%s\\,x+%s)\\cdot($$" %
(valeurs[0][0], abs(valeurs[0][1])))
quiz_txt += (u"{1:NUMERICAL:=%s}$$x+$${1:NUMERICAL:=-%s}$$)$$" %
(valeurs[1][0], abs(valeurs[1][1])))
if quiz:
quiz_exo_cor = (tex_trinome(dev(valeurs)) + u"$$
\n")
quiz_exo_cor += (quiz_txt + u"
\n")
return quiz_exo_cor
return quiz_txt
def tex_factorisation6(valeurs): # renvoie les deux premieres etapes de la factorisation 6
if valeurs[0][0] == valeurs[0][1]: # le carre est en premier
if valeurs[3] == 0: # on insere un signe +
return (tex_trinome_alea(dev(valeurs[0])) + '+' + tex_dev0(valeurs[1]),
tex_trinome(dev(valeurs[0])) + '+' + tex_dev0(valeurs[1]))
else:
return (tex_trinome_alea(dev(valeurs[0])) + '-' + tex_dev0(valeurs[1]),
tex_trinome(dev(valeurs[0])) + '-' + tex_dev0(valeurs[1]))
else:
if valeurs[2] == 0: # on insere un signe +
return (tex_dev0(valeurs[0]) + tex_trinome_alea(dev(valeurs[1]),
bplus=1), tex_dev0(valeurs[0]) + tex_trinome(dev(valeurs[1]),
bplus=1))
else:
return ('-' + tex_dev0(valeurs[0]) + tex_trinome_alea(dev(valeurs[1]),
bplus=1), '-' + tex_dev0(valeurs[0]) + tex_trinome(dev(valeurs[1]),
bplus=1))
def factorisation6(cor, exo=None, quiz=None, valeurs=None): # factorise (ax+b)(cx+d)+2abx+a²x²+b²
if not valeurs:
valeurs = valeurs_facteurcarre(10)
textes = tex_factorisation6(valeurs)
if exo:
exo.append(u'\\[ \\thenocalcul = ' + textes[0] + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + textes[0] + '\\]')
cor.append(u'\\[ \\thenocalcul = ' + textes[1] + '\\]')
quiz_txt = tex_facteur_commun((valeurs[0], valeurs[1], valeurs[2], valeurs[3]),
cor, None, quiz)
if quiz:
quiz_exo_cor = (textes[0] + u"$$
\n")
quiz_exo_cor += (quiz_txt + u"
\n")
return quiz_exo_cor
return quiz_txt
#
# ------------------- DEV-FACT-EQUAT -------------------
def choix_exo(a): # renvoie un tuple contenant les valeurs
if a == 0:
return valeurs_facteur_commun(10)
elif a == 1:
return valeurs_facteur1(10)
elif a == 2:
return valeurs_facteurcarre(10)
elif a == 3:
return valeurs_facteura2mb2(10)
else:
return valeurs_facteurcarre(10)
def valeur_quotient(): # renvoie un tuple contenant la valeur du quotient à calculer
(a, b) = (random.randrange(-10, 1), random.randrange(1, 11))
return (a // pgcd(a, b), b // pgcd(a, b))
def tex_initial(exos, a): # renvoie l'écriture de l'expression A
if exos == 0 or exos == 2:
return tex_facteur_commun0(a)
elif exos == 1:
return tex_factorisation1(a)
elif exos == 3:
return tex_factorisation3(a)[0]
else:
return tex_factorisation6(a)[0]
def fin_fact(a): # renvoie un tuple contenant la version factorisee de a
return facteur_commun3(facteur_commun(a[0], a[1]), a[2], a[3])
def tex_equations(fact, cor): # renvoie un tuple contenant les deux binomes egaux a 0
cor.append(_(u'Nous savons que $A=%s$. Nous devons donc résoudre $%s=0$.\\par') %
(tex_dev0(fact), tex_dev0(fact)))
cor.append(_(u'Un produit de facteurs est nul signifie qu\'un des facteurs est nul. Donc :'))
cor.append(_('\\[%s=0 \\qquad\\text{ou}\\qquad %s=0\\]') % (tex_binome(fact[0]),
tex_binome(fact[1])))
eq = equations1(fact)
if not isinstance(eq, tuple):
cor.append(u"\\fbox{Esta ecuación no admite ninguna solución.}")
return (_(u"Réponse: ")+"$$x=$${1:SHORTANSWER:%100%ninguna}")
elif not isinstance(eq[0], tuple):
cor.append('\\[ %s=%s \\]' % (tex_coef(eq[1][0], 'x'), eq[1][1]))
if eq[1][0] != 1:
cor.append('\\[ x=%s \\]' % tex_frac(equations2(eq)[1]))
cor.append(_(u'\\fbox{La solution de cette équation est \\,$%s$\\,.}') %
tex_frac(equations3(eq)[1]))
return ((_(u"Réponse: ")+"$$x=$${1:SHORTANSWER:%100%")+
("%s}" % tex_frac_quiz(equations3(eq)[1],1)))
elif not isinstance(eq[1], tuple):
cor.append('\\[ %s=%s \\]' % (tex_coef(eq[0][0], 'x'), eq[0][1]))
if eq[0][0] != 1:
cor.append('\\[ x=%s \\]' % tex_frac(equations2(eq)[0]))
cor.append(_(u'\\fbox{La solution de cette équation est \\,$%s$\\,.}') %
tex_frac(equations3(eq)[0]))
return ((_(u"Réponse: ")+"$$x=$${1:SHORTANSWER:%100%")+
("%s}" % tex_frac_quiz(equations3(eq)[0],1)))
else:
cor.append(_('\\[%s=%s \\qquad\\text{ou}\\qquad %s=%s\\]') % (tex_coef(eq[0][0],
'x'), eq[0][1], tex_coef(eq[1][0], 'x'), eq[1][1]))
if eq[0][0] != 1 or eq[1][0] != 1:
cor.append(_('\\[x=%s \\qquad\\text{ou}\\qquad x=%s\\]') %
(tex_frac(equations2(eq)[0]), tex_frac(equations2(eq)[1])))
cor.append(_(u'\\fbox{Les solutions de cette équation sont \\,$%s\\,\\text{ et }\\,%s$\\,.}') %
(tex_frac(equations3(eq)[0]), tex_frac(equations3(eq)[1])))
return ((_(u"Réponse: ")+"$$x_1=$${1:SHORTANSWER:~%100%")+
("%s" % tex_frac_quiz(equations3(eq)[0],1)) + "~%100%" +
("%s}" % tex_frac_quiz(equations3(eq)[1],1)) +
_(u" et ")+"$$\\, x_2=$${1:SHORTANSWER:~%100%" +
("%s" % tex_frac_quiz(equations3(eq)[1],1)) + "~%100%" +
("%s}" % tex_frac_quiz(equations3(eq)[0],1)))
def equations1(a): #renvoie ((9,5),(3,-7)) pour pouvoir ecrire 9x=5 ou 3x=-7
if a[0][0] == 0:
if a[1][0] == 0:
return ''
else:
return ('', (a[1][0], -a[1][1]))
elif a[1][0] == 0:
return ((a[0][0], -a[0][1]), '')
else:
return ((a[0][0], -a[0][1]), (a[1][0], -a[1][1]))
def equations2(a): # renvoie ((5,9),(-7,3)) pour pouvoir ecrire x=5/9 ou x=-7/3
if not isinstance(a, tuple):
return ''
elif not isinstance(a[0], tuple):
return ('', (a[1][1], a[1][0]))
elif not isinstance(a[1], tuple):
return ((a[0][1], a[0][0]), '')
else:
return ((a[0][1], a[0][0]), (a[1][1], a[1][0]))
def equations3(a): # renvoie les solutions éventuellement simplifiée
a = equations2(a)
if not isinstance(a, tuple):
return ''
elif not isinstance(a[0], tuple):
if simplifie(a[1]):
return ('', simplifie(a[1]))
else:
return a
elif not isinstance(a[1], tuple):
if simplifie(a[0]):
return (simplifie(a[0]), '')
else:
return a
else:
if simplifie(a[0]):
if simplifie(a[1]):
return (simplifie(a[0]), simplifie(a[1]))
else:
return (simplifie(a[0]), a[1])
elif simplifie(a[1]):
return (a[0], simplifie(a[1]))
else:
return a
def developpements(expr, exos, cor): # effectue les developpements
if exos != 3 and exos != 6:
return tex_developpe2(expr[0], expr[2], expr[1], expr[3], cor, exo=None)
elif exos == 6 and expr[0][0] == expr[0][1] or exos == 3 and expr[0][0][0] == \
expr[0][1][0] and expr[0][0][1] == -expr[0][1][1]:
cor.append(u'\\[ \\thenocalcul = ' + tex_initial(exos, expr) + '\\]')
if expr[2]:
siga = '-'
else:
siga = ''
if expr[3]:
sigb = '-'
else:
sigb = ''
cor.append(u'\\[ \\thenocalcul = ' + '%s%s%s%s' % (siga, tex_trinome(dev(expr[0])),
sigb, tex_dev1(expr[1], bpar=expr[3], bplus=expr[3] -
1)) + '\\]')
if expr[2]:
a = coef_opposes(dev(expr[0]))
else:
a = dev(expr[0])
if expr[3]:
b = coef_opposes(dev(expr[1]))
else:
b = dev(expr[1])
cor.append(u'\\[ \\thenocalcul = ' + tex_trinome(a) + tex_trinome(b, bplus=1) + '\\]')
cor.append(u'\\[ \\boxed{\\thenocalcul = ' + tex_trinome(somme_polynomes(a, b)) + '} \\]')
return (u"{1:NUMERICAL:=%s}$$x^2+$${1:NUMERICAL:=%s}$$x+$${1:NUMERICAL:=%s}" %
(tex_coef(somme_polynomes(a, b)[0], '', ecu=1),
tex_coef(somme_polynomes(a, b)[1], '', ecu=1),
tex_coef(somme_polynomes(a, b)[2], '', ecu=1)))
else:
cor.append(u'\\[ \\thenocalcul = ' + tex_initial(exos, expr) + '\\]')
if expr[2]:
siga = '-'
else:
siga = ''
if expr[3]:
sigb = '-'
else:
sigb = ''
cor.append(u'\\[ \\thenocalcul = ' + '%s%s%s%s' % (siga, tex_dev1(expr[0], bpar=expr[2],
bplus=expr[2] - 1), sigb, tex_trinome(dev(expr[1]),
bpar=expr[3], bplus=expr[3] - 1)) + '\\]')
if expr[2]:
a = coef_opposes(dev(expr[0]))
else:
a = dev(expr[0])
if expr[3]:
b = coef_opposes(dev(expr[1]))
else:
b = dev(expr[1])
cor.append(u'\\[ \\thenocalcul = ' + tex_trinome(a) + tex_trinome(b, bplus=1) + '\\]')
cor.append(u'\\[ \\boxed{\\thenocalcul = ' + tex_trinome(somme_polynomes(a, b)) + '} \\]')
return (u"{1:NUMERICAL:=%s}$$x^2+$${1:NUMERICAL:=%s}$$x+$${1:NUMERICAL:=%s}" %
(tex_coef(somme_polynomes(a, b)[0], '', ecu=1),
tex_coef(somme_polynomes(a, b)[1], '', ecu=1),
tex_coef(somme_polynomes(a, b)[2], '', ecu=1)))
def version_developpee(expr): # renvoie la version developpe de A
if expr[2]:
a = coef_opposes(dev(expr[0]))
else:
a = dev(expr[0])
if expr[3]:
b = coef_opposes(dev(expr[1]))
else:
b = dev(expr[1])
return somme_polynomes(a, b)
def tex_fractions(expr, nb, cor): # repond a la question sur la valeur de x
a = version_developpee(expr)
cor.append(_(u'Nous savons que $A=%s$\\,. Donc pour $x=%s$\\, : ') %
(tex_trinome(a), tex_frac(nb)))
cor.append(u'\\[ \\thenocalcul = ' + tex_valeurx0(a, nb) + '\\]')
if nb == (0, 1):
cor.append(u'\\[ \\boxed{\\thenocalcul = ' + tex_valeurx1(a, nb) + '} \\]')
return (_(u"Réponse: ")+"{1:NUMERICAL:=%s}" % tex_valeurx1(a, nb))
else:
cor.append(u'\\[ \\thenocalcul = ' + tex_valeurx1(a, nb) + '\\]')
b = decomp_prod((a[0], 1), (nb[0] ** 2, nb[1] ** 2))[0:2]
c = decomp_prod((a[1], 1), (nb[0], nb[1]))[0:2]
a = (produit(b[0], b[1]), produit(c[0], c[1]), (a[2], 1))
if a[0][1] == a[1][1] == 1:
cor.append(u'\\[ \\boxed{\\thenocalcul = ' + tex_valeurx2(a, nb) + '} \\]')
return (_(u"Réponse: ")+"{1:NUMERICAL:=%s}" % tex_valeurx2(a, nb))
else:
cor.append(u'\\[ \\thenocalcul = ' + tex_valeurx2(a, nb) + '\\]')
cor.append(u'\\[ \\boxed{\\thenocalcul = ' + tex_valeurx3(a, nb) + '} \\]')
return ((_(u"Réponse: ")+"{1:SHORTANSWER:%100%")+
("%s}" % tex_valeurx3_quiz(a, nb)))
def tex_valeurx0(a, nb):
if nb == (0, 1):
return '%s%s%s' % (tex_coef(a[0], _('\\times %s^2') % tex_frac(nb)),
tex_coef(a[1], _('\\times %s') % tex_frac(nb),
bplus=a[0]), tex_coef(a[2], '', bplus=a[0] or
a[1]))
else:
return '%s%s%s' % (tex_coef(a[0], _('\\times\\left(%s\\right)^2') %
tex_frac(nb)), tex_coef(a[1],
_('\\times\\left(%s\\right)') % tex_frac(nb),
bplus=a[0]), tex_coef(a[2], '', bplus=a[0] or
a[1]))
def tex_valeurx1(a, nb, mood=1):
if nb == (0, 1):
return tex_coef(a[2], '', ecu=1)
elif nb[1] == 1:
return tex_coef(a[0] * nb[0] ** 2, '', ecu=mood) + tex_coef(a[1] * nb[0],
'', bplus=a[0], ecu=mood) + tex_coef(a[2], '', bplus=a[0] or a[1], ecu=mood)
else:
texte = ''
if a[0] != 0:
a0 = ((a[0], 1), (nb[0] ** 2, nb[1] ** 2))
if isinstance(decomp_prod(a0[0], a0[1])[2], tuple):
texte = tex_coef(1, tex_decomp_prod(decomp_prod(a0[0],
a0[1])), ecu=mood)
else:
texte = tex_coef(1, tex_frac(produit(a0[0], a0[1])), ecu=mood)
if a[1] != 0:
a1 = ((a[1], 1), (nb[0], nb[1]))
if isinstance(decomp_prod(a1[0], a1[1])[2], tuple):
texte = texte + tex_coef(1, tex_decomp_prod(decomp_prod(a1[0],
a1[1])), bplus=a[0], ecu=mood)
else:
texte = texte + tex_coef(1, tex_frac(produit(a1[0], a1[1])),
bplus=a[0], ecu=mood)
texte = texte + tex_coef(a[2], '', bplus=1, ecu=mood)
return texte
def tex_valeurx2(a, nb, mood=1):
if nb == (0, 1):
return '0'
else:
if a[0][1] == a[1][1] == 1:
return tex_coef(a[0][0] + a[1][0] + a[2][0], '', ecu=mood)
else:
c = den_com0(a[0], a[1])
texte = ''
if a[0][0] != 0:
texte = tex_coef(1, tex_frac((a[0][0] * c[0], a[0][1] *
c[0])), ecu=mood)
if a[1][0] != 0:
texte = texte + tex_coef(1, tex_frac((a[1][0] * c[1], a[1][1] *
c[1])), bplus=texte, ecu=mood)
if a[2][0] != 0:
texte = texte + tex_coef(1, tex_frac(((a[2][0] * a[0][1]) *
c[0], a[0][1] * c[0])), bplus=texte, ecu=mood)
return texte
def tex_valeurx3(a, nb):
if nb == (0, 1) or a[0][1] == a[1][1] == 1:
return '0'
else:
c = den_com0(a[0], a[1])
b = (a[0][0] * c[0] + a[1][0] * c[1] + (a[2][0] * a[0][1]) * c[0],
a[0][1] * c[0])
if simplifie(b):
return tex_frac(b) + '=' + tex_frac(simplifie(b))
else:
return tex_frac(b)
def tex_valeurx3_quiz(a, nb):
if nb == (0, 1) or a[0][1] == a[1][1] == 1:
return '0'
else:
c = den_com0(a[0], a[1])
b = (a[0][0] * c[0] + a[1][0] * c[1] + (a[2][0] * a[0][1]) * c[0],
a[0][1] * c[0])
if simplifie(b):
return tex_frac_quiz(simplifie(b),1)
else:
return tex_frac_quiz(b,1)
def tex_devfacteq():
exos = [0, 1, 2, 3, 6][random.randrange(5)]
expr = choix_exo(exos)
valeurx = valeur_quotient()
fact = fin_fact(expr)
exo = ['\\exercice']
tex_A = tex_initial(exos, expr)
quiz_nom = _(u"Addition avec polynôme et équation")
exo.append('Se tiene $A=%s$\\,.' % tex_A)
exo.append('\\begin{enumerate}')
exo.append(_(u'\\item Développer et réduire $A$\\,.'))
exo.append(_(u'\\item Factoriser $A$\\,.'))
exo.append(_(u'\\item Calculer $A$ pour $x=%s$\\,.') % \
tex_frac(valeurx))
exo.append(_(u"\\item Résoudre l'équation $A=0$\\,.")) # % tex_dev0(fact))
exo.append('\\end{enumerate}')
cor = ['\\exercice*']
quiz = [u"cloze"]
cor.append(_(u'On donne $A=%s$\\,.') % tex_A)
quiz_exo_cor = _(u"Se tient $$A=%s$$
\n") % tex_A
cor.append('\\begin{enumerate}')
cor.append(_(u'\\item Développer et réduire $A$\\,.'))
quiz_exo_cor += _(u"Développe et ensuite réduit l\'expression $$A$$
\n")
quiz_txt = developpements(expr, exos, cor)
quiz_exo_cor += (quiz_txt + "
\n")
cor.append(_(u'\\item Factoriser $A$\\,.'))
quiz_exo_cor += _(u"Factorise $$A$$
\n")
exec('factorisation' + str(exos) + '(cor,valeurs=expr)')
quiz_txt = eval('factorisation' + str(exos) + '(cor,valeurs=expr)')
quiz_exo_cor += (quiz_txt + "
\n")
cor.append(_(u'\\item Calculer $A$ pour $x=%s$\\,.\\par') % \
tex_frac(valeurx))
quiz_exo_cor += (_(u"Calcule $$A$$ quand $$x=%s$$
\n") %
tex_frac_quiz(valeurx))
quiz_txt = tex_fractions(expr, valeurx, cor)
quiz_exo_cor += (quiz_txt + "
\n")
cor.append(_(u"\\item Résoudre l'équation $A=0$\\,.\\par")) # % tex_dev0(fact))
quiz_exo_cor += _(u"Résout l'équation $$A=0$$
\n")
quiz_exo_cor += _(u"(Écrit son irréductible et si n'a pas de solution écrit: aucun)
\n")
quiz_txt = tex_equations(fact, cor)
quiz_exo_cor += quiz_txt
cor.append('\\end{enumerate}')
quiz.append([quiz_nom, quiz_exo_cor,""])
return (exo, cor, quiz)
def tex_developpements():
nb_exos = 4
liste_exos = (valeurs_apb2,
valeurs_amb2,
valeurs_apbamb,
valeurs_distr)
exos = []
ordre_exos = [i for i in range(nb_exos)]
for i in range(nb_exos):
a = random.randrange(nb_exos - i)
exos.append(liste_exos[ordre_exos.pop(a)](10))
exo = ['\\exercice']
exo.append(_(u'Développer et réduire les expressions suivantes.'))
exo.append('\\begin{multicols}{2}\\noindent')
cor = ['\\exercice*']
cor.append(_(u'Développer et réduire les expressions suivantes.'))
cor.append('\\begin{multicols}{2}\\noindent')
quiz = [u"cloze"]
quiz_nom = _(u"Développe et réduit: avancé")
quiz_exo_cor = _(u"Développe et réduit les suivantes expressions :
\n")
quiz_exo_cor += u'
\n' quiz_exo_cor += (u"$$1) \\; " + tex_developpe1(exos[0], exo, cor)) exo.append('\\stepcounter{nocalcul}%') cor.append('\\stepcounter{nocalcul}%') quiz_exo_cor += (u"$$2) \\; " + tex_developpe1(exos[1], exo, cor)) exo.append('\\stepcounter{nocalcul}%') cor.append('\\stepcounter{nocalcul}%') quiz_exo_cor += (u"$$3) \\; " + tex_developpe1(exos[2], exo, cor)) quiz_exo_cor += u" | \n"
exo.append('\\stepcounter{nocalcul}%')
cor.append('\\columnbreak\\stepcounter{nocalcul}%') # <-- MIO
quiz_exo_cor += (u"$$4) \\; " + tex_developpe1(exos[3], exo, cor))
exos = []
sig = [random.randrange(2) for i in range(4)]
ordre_exos = [i for i in range(nb_exos)]
for i in range(nb_exos):
a = random.randrange(nb_exos - i)
exos.append(liste_exos[ordre_exos.pop(a)](10))
exo.append('\\stepcounter{nocalcul}%')
cor.append('\\stepcounter{nocalcul}%')
quiz_exo_cor += (u"$$5) \\; " + tex_developpe2(exos[0], sig[0], exos[1], sig[1], cor, exo) + " \n") exo.append('\\stepcounter{nocalcul}%') cor.append('\\stepcounter{nocalcul}%') quiz_exo_cor += (u"$$6) \\; " + tex_developpe2(exos[2], sig[2], exos[3], sig[3], cor, exo) + " \n") exo.append('\\end{multicols}') cor.append('\\end{multicols}') # <-- MIO quiz_exo_cor += u" |
\n' for i in range(nb_exos): txt_m = eval('factorisation' + str(ordre_exos[i]) + '(cor,exo,quiz)') quiz_exo_cor += (u"$$%s) \\; " % (i+1) + txt_m) exo.append('\\stepcounter{nocalcul}%') #cor.append('\\stepcounter{nocalcul}%') # <-- MIO if i == 2: quiz_exo_cor += u" | \n" exo.append('\\end{multicols}') cor.append('\\end{multicols}') quiz_exo_cor += u" |