示例#1
0
def creerPolydegre2(nb_racines=2, rac_radical=True, rac_quotient=False):
    if nb_racines == 2:
        redo = True
        while redo:
            a = randrange(1, 4) * (-1) ** randrange(2)
            alpha = randrange(1, 10) * (-1) ** randrange(2)
            beta = randrange(1, 10)
            gamma = [1, randrange(1, 6)][rac_radical]
            if rac_quotient:
                den = randrange(2, 6)
                while pgcd(alpha, den) != 1 or pgcd(beta, den) != 1:
                    den = randrange(2, 6)
                alpha = Fraction(alpha, den)
                beta = Fraction(beta, den)
            b = -2 * alpha * a
            c = a * (alpha ** 2 - gamma * beta ** 2)
            if abs(c) <= 10 and c != 0 and not factoriser(repr(Polynome([[a, 2], [b, 1], [c, 0]]))): redo = False
            if c.denominator != 1:
                c = 'Fraction(%s, %s)' % (c.numerator, c.denominator)
            else:
                c = c.numerator
            if b.denominator != 1:
                b = 'Fraction(%s, %s)' % (b.numerator, b.denominator)
            else:
                b = b.numerator
        return Polynome([[a, 2], [b, 1], [c, 0]])
    elif nb_racines == 1:
        a, b = valeur_alea(-9, 9), valeur_alea(-9, 9)
        return Polynome([[a ** 2, 2], [2 * a * b, 1], [b ** 2, 0]])
    else:
        pol = [[valeur_alea(-9, 9), 2 - dummy] for dummy in range(3)]
        while pol[1][0] ** 2 - 4 * pol[0][0] * pol[2][0] >= 0:
            pol = [[valeur_alea(-9, 9), 2 - dummy] for dummy in range(3)]
        return Polynome(pol)
示例#2
0
    def __init__(self):
        val = [valeur_alea(-9, 9), valeur_alea(-9, 9)]
        val.append(Fraction(valeur_alea(-9, 9), val[0]))
        while val[2].d == 1:
            val = [valeur_alea(-9, 9), valeur_alea(-9, 9)]
            val.append(Fraction(valeur_alea(-9, 9), val[0]))

        pol = [[val[0], 2], [(-val[0] * (val[1] * val[2].d + val[2].n)) / val[2].d, 1], [(val[0] * val[1] * val[2].n) / val[2].d, 0]]
        shuffle(pol)
        exercice = [[list(pol), val[1], val[2]]]

        pol = [creerPolydegre2(nb_racines=0).monomes]
        pol.append(creerPolydegre2(nb_racines=1).monomes)
        a, b = valeur_alea(-9, 9), valeur_alea(-9, 9)
        sgn = [1, -1][randrange(2)]
        pol.append([[sgn * a ** 2, 2], [-sgn * b ** 2, 0]])
        a, b = valeur_alea(-9, 9), valeur_alea(-9, 9)
        pol.append([[a, 2], [b, 1]])
        a, b = valeur_alea(-9, 9), valeur_alea(-9, 9)
        while abs(pgcd(a, b)) != 1:
            a, b = valeur_alea(-9, 9), valeur_alea(-9, 9)
        pol.append([[a, 2], [b, 0]])
        pol.pop(randrange(1, len(pol)))
        pol.pop(randrange(1, len(pol)))
        pol.pop(randrange(1, len(pol)))
        shuffle(pol)
        exercice.append(pol)

        self.exercice = exercice
示例#3
0
    def __init__(self):
        pol = [[valeur_alea(-9, 9), 2 - dummy] for dummy in range(3)]
        while pol[1][0] ** 2 - 4 * pol[0][0] * pol[2][0] >= 0:
            pol = [[valeur_alea(-9, 9), 2 - dummy] for dummy in range(3)]
        exercice = [list(pol)]

        val = [valeur_alea(-9, 9), valeur_alea(-9, 9)]
        val.append(Fraction(valeur_alea(-9, 9), val[0]))
        while val[2].d == 1:
            val = [valeur_alea(-9, 9), valeur_alea(-9, 9)]
            val.append(Fraction(valeur_alea(-9, 9), val[0]))
        sgn = -val[0] / abs(val[0])
        pol = [[val[0], 2], [(-val[0] * (val[1] * val[2].d + val[2].n)) / val[2].d, 1], [(val[0] * val[1] * val[2].n) / val[2].d, 0]]
        shuffle(pol)
        exercice.append([pol, val[1], val[2]])

        val = [sgn * valeur_alea(-9, 9), valeur_alea(-9, 9)]
        val.append(Fraction(valeur_alea(-9, 9), val[0]).simplifie())
        while isinstance(val[2], int) or val[2].d == 1:
            val = [sgn * valeur_alea(-9, 9), valeur_alea(-9, 9)]
            val.append(Fraction(valeur_alea(-9, 9), val[0]))
        pol = [[val[0], 2], [(-val[0] * (val[1] * val[2].d + val[2].n)) / val[2].d, 1], [(val[0] * val[1] * val[2].n) / val[2].d, 0]]
        shuffle(pol)
        exercice.append([pol, val[1], val[2]])

        self.exercice = exercice
示例#4
0
 def id_rem(self, a, b, sgn):
     etapes = [['Polynome("%sx%s%s")' % (a, sgn, b), '**', '2']]
     if a != 1:
         etapes.append(['(', '%s' % a, '*', 'Polynome("x%sFraction(%s, %s)")' % (sgn, b, a), ')', '**', '2' ])
         frac = Fraction(b, a).simplifie()
         etapes.append(['%s' % (a ** 2), '*', 'Polynome("x%s%r")' % (sgn, frac), '**', '2'])
     return etapes
示例#5
0
    def __init__(self):
        m = [[1, 2], [2 * randrange(1, 10) * (-1) ** randrange(2), 1], [randrange(1, 10) * (-1) ** randrange(2), 0]]
        pol = [[['Polynome(%s, "x", details=0)' % m]]]
        pol[0].extend(self.resolution(m))
        m = [[1, 2], [(2 * randrange(1, 6) + 1) * (-1) ** randrange(2), 1], [randrange(1, 10) * (-1) ** randrange(2), 0]]
        pol.append([['Polynome(%s, "x", details=0)' % m]])
        pol[1].extend(self.resolution(m))
        a, b = randrange(1, 10), randrange(1, 10)
        m = [[a ** 2, 2], [2 * a * b * (-1) ** randrange(2), 1], [b ** 2, 0]]
        pol.append([['Polynome(%s, "x", details=0)' % m]])
        if m[1][0] < 0: pol[2].extend(self.id_rem(a, b, '-'))
        else: pol[2].extend(self.id_rem(a, b, '+'))
        m = [[randrange(2, 6) * (-1) ** randrange(2), 2], [randrange(1, 10) * (-1) ** randrange(2), 1], [randrange(1, 10) * (-1) ** randrange(2), 0]]
        pol.append([['Polynome(%s, "x", details=0)' % m]])
        fracb = Fraction(m[1][0], m[0][0]).simplifie()
#        if fracb.d == 1: fracb = fracb.n
        fracc = Fraction(m[2][0], m[0][0]).simplifie()
#        if fracc.d == 1: fracc = fracc.n
        pol[3].append(['%s' % m[0][0], '*', '(', 'Polynome(%s, "x", details=0)' % [[1, 2], [fracb, 1], [fracc, 0]], ')'])
        pol[3].extend(self.resolution([[1, 2], [fracb, 1], [fracc, 0]], ['%s' % m[0][0], '*', '('], [')']))
        shuffle(pol)
        self.exercice = pol
示例#6
0
    def __init__(self):
        [a, b, c, d] = [randrange(-5, 6) for dummy in range(4)]
        while a == 0 or c == 0 or a ** 2 * d - a * b * c + c ** 2 < 0 or carrerise(a ** 2 * d - a * b * c + c ** 2) != 1:
            [a, b, c, d] = [randrange(-5, 6) for dummy in range(4)]
        p1 = str(Polynome([[a, 1], [b, 0]], "m"))
        p2 = str(Polynome([[c, 1], [d, 0]], "m"))
        pol = [Polynome([[1, 2], [p1, 1], [p2, 0]]), randrange(3)]
        exercice = [list(pol)]

        v = [randrange(-4, 5) for dummy in range(6)]
        while v[0] == 0 or v[2] == v[4] == 0 or reduce(lambda x, y: x * y, v) != 0 or v[2] == v[3] == 0 or v[4] == v[5] == 0:
            v = [randrange(-4, 5) for dummy in range(6)]
        lp = [str(Polynome([[v[2 * i] / pgcd(v[2 * i], v[2 * i + 1]), 1], [v[2 * i + 1] / pgcd(v[2 * i], v[2 * i + 1]), 0]], "a")) for i in range(3)]
        pol = Polynome([[lp[0], 2], [lp[1], 1], [lp[2], 0]])
        vi = Fraction(-v[1], v[0])
        racine = randrange(-4, 5)
        while racine == vi or racine == 0:
            racine = randrange(-4, 5)
        if vi.d == 1 : vi = str(vi.n)
        else: vi = str(vi)
        exercice.append([list(pol), vi, racine])
        self.exercice = exercice
示例#7
0
 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
示例#8
0
def effectue_calcul(calcul):
    """**effectue_calcul**\ (*calcul*)

    Effectue une étape du calcul en respectant les priorités

    :param calcul: le calcul à traiter
    :type calcul: list

    >>> from pyromaths.outils import Priorites3
    >>> Priorites3.effectue_calcul(['-5', '-', '(', '(-6)', '-', '1', '+', '(-3)', ')', '*', '(-1)'])
    ['-5', '-', '(', '-7', '-', '3', ')', '*', '(-1)']
    >>> Priorites3.effectue_calcul(['-5', '-', '(', '-7', '-', '3', ')', '*', '(-1)'])
    ['-5', '-', '-10', '*', '(-1)']
    >>> Priorites3.effectue_calcul(['-5', '-', '-10', '*', '(-1)'])
    ['-5', '-', '10']
    >>> Priorites3.effectue_calcul(['-5', '-', '10'])
    ['-15']
    >>> Priorites3.effectue_calcul(['-', 'Polynome("x-1")', '*', '2'])
    ['-', '(', 'Polynome([[2, 1]], "x", 0)', '+', 'Polynome([[-2, 0]], "x", 0)', ')']
    >>> Priorites3.effectue_calcul(['4', '*', 'Polynome("x+1")', '**', '2'])
    ['4', '*', '(', 'Polynome([[1, 1]], "x", 0)', '**', '2', '+', '2', '*', 'Polynome([[1, 1]], "x", 0)', '*', 'Polynome([[1, 0]], "x", 0)', '+', 'Polynome([[1, 0]], "x", 0)', '**', '2', ')']

    :rtype: list
    """
    from pyromaths.classes.PolynomesCollege import Polynome
    from pyromaths.classes.Fractions import Fraction
    from pyromaths.classes.SquareRoot import SquareRoot
    serie = (recherche_parentheses, recherche_puissance, recherche_produit,
            recherche_neg, recherche_somme)
    result, post, break_somme = [], "", False
    for recherche in serie:
        if break_somme and recherche == recherche_somme: break
        if calcul: test = recherche(calcul)
        else: test = None
        while test:
            pre = calcul[:test[0]]
            calc = calcul[test[0]:test[1]]
            post = calcul[test[1]:]
            # On essaie d'utiliser les priorités sur la première partie du
            # calcul pour raccourcir la résolution de l'expression
            if test != recherche_neg and pre:
                # Si on simplifie les écritures, on n'essaie pas les sommes
                tmp = effectue_calcul(pre)
                if tmp and result and result[-1] not in "+-**/(" and tmp[0][0]\
                    not in "+-*/)":
                    # un signe + si l'expression en a besoin
                    result.append("+")
                # On ajoute le résultat ou l'expression
                if tmp: result.extend(tmp)
                else: result.extend(pre)
            else:
                result.extend(pre)
            if recherche == recherche_parentheses:
                # On supprime les parenthèses autour de l'expression
                calc = calc[1:-1]
                # On réduit directement les calculs numériques dans une
                # expression littérale
                "Effectue les calculs entre parenthèses et remet les parenthèses si l'expression est de longueur supérieure à 1"
                sol = effectue_calcul(calc)
                if len(sol) > 1:
                    sol.insert(0, "(")
                    sol.append(")")
                elif sol and isinstance(eval(sol[0]), (int, float, Fraction)) and post and post[0] == "*" and \
                        _('Polynome(') in post[1] and len(eval(post[1])) == 1 and eval(post[1])[0][0] == 1:
                            # Sans doute une factorisation de sommes de polynômes
                            sol = [repr(eval(sol[0]) * eval(post[1]))]
                            post = post[2:]
                            # Suppression des parenthèses autour de ((9.0-80.0)*Polynome("x")) devenu (Polynome("-71.0x"))
                            if post and result and post[0] == ")" and result[-1] == "(" :
                                result, post = result[:-1], post[1:]

            else:
                if recherche == recherche_somme:
                    # Permet les cas 1 + Fraction(1, 2) + 1
                    # ou 3 + Polynome("5x") + 4
                    frac, poly, nombres = False, False, []
                    for i in range(0, len(calc), 2):
                        nombres.append(eval(calc[i]))
                        if isinstance(nombres[-1], Fraction): frac = True
                        elif isinstance(nombres[-1], Polynome): poly, var, details = True, nombres[-1].var, nombres[-1].details
                    if poly: nombres = [(Polynome([[i, 0]], var, details) , i)[isinstance(i, Polynome)] for i in nombres]
                    elif frac: nombres = [(Fraction(i, 1), i)[isinstance(i, Fraction)] for i in nombres]
                    if poly: classe = Polynome
                    elif frac: classe = Fraction
                    if poly or frac:
                        if calc[1] == '+': operation = classe.__add__
                        else: operation = classe.__sub__
                        if isinstance(nombres[0], (int, float)):
                            sol = operation(classe(nombres[0]), *nombres[1:])
                        else:
                            sol = operation(nombres[0], *nombres[1:])
                    else: sol = eval("".join(calc))
                elif recherche == recherche_produit and calc[1] == "*":
                    frac, poly, nombres = False, False, []
                    for i in range(0, len(calc), 2):
                        nombres.append(eval(calc[i]))
                        if isinstance(nombres[-1], Fraction): frac = True
                        elif isinstance(nombres[-1], Polynome): poly, var, details = True, nombres[-1].var, nombres[-1].details
                    if poly: nombres = [(Polynome([[i, 0]], var, details) , i)[isinstance(i, Polynome)] for i in nombres]
                    elif frac: nombres = [(Fraction(i, 1), i)[isinstance(i, Fraction)] for i in nombres]
                    if poly: classe = Polynome
                    elif frac: classe = Fraction
                    if poly or frac:
                        if isinstance(nombres[0], (int, float)):
                            sol = classe.__mul__(classe(nombres[0]), *nombres[1:])
                        else:
                            sol = classe.__mul__(nombres[0], *nombres[1:])
                    else: sol = eval("".join(calc))
                elif recherche == recherche_puissance:
                    sol = eval('(' + calc[0] + ')**' + calc[2])
                else:
                    sol = eval("".join(calc))
                if isinstance(sol, basestring): sol = splitting(sol)
                elif isinstance(sol, (int, float)): sol = [str(sol)]
                elif isinstance(sol, (Polynome, Fraction, SquareRoot)): sol = [repr(sol)]
                else :
                    raise ValueError(_(u"Le résultat %s a un format inattendu") % sol)
            if recherche == recherche_neg and (pre or result):
                # Ajoute le "+" ou sépare le "-":
                # "1-(-9)" => "1 + 9" et "1+(-9)" => "1 - 9"
                if sol[0][0] == "-": sol = ["-", sol[0][1:]]
                else: sol = ["+", sol[0]]
            #===================================================================
            # if recherche == recherche_produit and len(sol) > 1:
            #     # Ajoute les parenthèses si produit précédé d'un "-" ou "*"
            #     # ou suivi d'un "*"
            #===================================================================
            if len(sol) > 1 and sol[0] != "(" and sol[-1] != ")":
                # Ajoute les parenthèses si le résultat est précédé d'un "-" ou "*"
                # ou suivi d'un "*"
                if (result and result[-1] in "*-") or (pre and pre[-1] in "*-") or (post and post[0] == "*"):
                    sol.insert(0, "(")
                    sol.append(")")
            # Si @sol est négatif et @result se termine par un "+", on l'enlève
            if result and result[-1] == "+" and sol and sol[0][0] == "-":
                    result[-1] = "-"
                    sol[0] = sol[0].lstrip("-")
            result.extend(sol)
            calcul = post
            if calcul: test = recherche(calcul)
            else: test = None
            if post and recherche == recherche_neg: break_somme = True
    result.extend(post)
    if not result: result = calcul
    return result
示例#9
0
def texify(liste_calculs):
    r"""**texify**\ (*liste_calculs*)

    Convertit la liste de chaînes de caractères `liste_calculs` contenant
    des polynômes en liste de chaînes de caractères au format TeX

    **TODO :** intégrer cela dans :mod:`outils.Affichage` et gérer l'ensemble des
    classes de Pyromaths.

    :param calcul: le calcul à traiter
    :type calcul: string

    >>> from pyromaths.outils import Priorites3
    >>> from pyromaths.classes.PolynomesCollege import Polynome
    >>> l = [['4', '+', '5', '-', '6'], ['9', '-', '6'], ['3']]
    >>> Priorites3.texify(l)
    ['4+5-6', '9-6', '3']
    >>> Priorites3.texify(Priorites3.priorites('(-7)+8-Polynome([[-4, 1], [-9, 2], [-5, 0]], "x")'))
    ['1-\\left( -4\\,x-9\\,x^{2}-5\\right) ', '1+4\\,x+9\\,x^{2}+5', '9\\,x^{2}+4\\,x+6']
    >>> Priorites3.texify([['Fraction(5,6)', '**', '2']])
    ['\\left(  \\dfrac{5}{6} \\right) ^{2}']

    :rtype: list
    """
    from pyromaths.classes.PolynomesCollege import Polynome
    from pyromaths.classes.Fractions import Fraction
    from pyromaths.classes.SquareRoot import SquareRoot
    from Affichage import decimaux
    ls = []
    enluminures = {'indice': r'_{', 'cancel':r'\cancel{'}
    isEnlumine = {'indice': False, 'cancel':False}
    for calcul in liste_calculs:
        if isinstance(calcul, basestring): calcul = splitting(calcul)
        s = ""
        puiss = 0
        for index in range(len(calcul)):
            el = calcul[index]
            for cle in isEnlumine.keys():
                if isEnlumine[cle] and (not isinstance(el, list) or el[1] != cle):
                    s += '}'
                    isEnlumine[cle] = False
            if isinstance(el, list):
                if not isEnlumine[el[1]]:
                    s += enluminures[el[1]]
                    isEnlumine[el[1]] = True
                el = el[0]
            if el[:9] == "Polynome(":
                # Doit-on entourer ce polynôme de parenthèses ?
                p = eval(el)
                if index + 1 < len(calcul): q = calcul[index + 1]
                else: q = ""
                """ 3 cas :
                * {*,-}(2x+3) ou {*,-}(-2x)
                * (2x+3)*...
                * (2x+1)**2"""
                if (s and s[-1] in "*-" and (len(p) > 1 or p.monomes[0][0] < 0)) \
                    or (q and q == "*" and len(p) > 1) \
                    or ((len(p) > 1 or (p.monomes[0][0] != 1 and p.monomes[0][1] > 0) or \
                         p.monomes[0][0] < 0 or \
                         (p.monomes[0][0] != 1 and isinstance(p.monomes[0][0], Fraction) and p.monomes[0][0].d != 1)) and q and q == "**"):
                    s += "(" + str(p) + ")"
                elif s and s[-1] == "+" and p.monomes[0][0] < 0:
                    s = s[:-1]
                    s += str(p)
                else:
                    s += str(p)
            elif el[:9] == "Fraction(":
                # Doit-on entourer cette fraction de parenthèses ?
                p = splitting(el[9:-1])
                # Gère le cas ou la fraction comprend des objets SquareRoot
                t = [""]
                for i in range(len(p)):
                    if p[i] == ',': t.append("")
                    else: t[-1] += p[i]
                p = t
                if len(p) == 2:
                    # texfrac = str(Fraction(eval(p[0]), eval(p[1])))
                    texfrac = str(Fraction(p[0], p[1]))
                else:
                    texfrac = str(Fraction(p[0], p[1], p[2]))
                if index + 1 < len(calcul): q = calcul[index + 1]
                else: q = ""
                if (eval(p[0]) < 0 or p[1] != "1") and q == "**":
                    s += "( " + texfrac + " )"
                else:
                    s += texfrac
            elif el[:11] == "SquareRoot(":
                p = eval(el)
                if index + 1 < len(calcul): q = calcul[index + 1]
                else: q = ""
                """ 3 cas :
                * {*,-}(2x+3) ou {*,-}(-2x)
                * (2x+3)*...
                * (2x+1)**2"""
                if (s and s[-1] in "*-" and (len(p) > 1 or p[0][0] < 0)) \
                    or (q and q == "*" and len(p) > 1) \
                    or ((len(p) > 1 or (p[0][0] != 1 and p[0][1] > 0) or \
                         p[0][0] < 0 or \
                         (p[0][0] != 1 and isinstance(p[0][0], Fraction) and p[0][0].d != 1)) and q and q == "**"):
                    s += "(" + str(p) + ")"
                elif s and s[-1] == "+" and p[0][0] < 0:
                    s = s[:-1]
                    s += str(p)
                else:
                    s += str(p)
            elif EstNombre(el):
                if index + 1 < len(calcul): q = calcul[index + 1]
                else: q = ""
                if el[0] == "(": s += "(" + decimaux(el[1:-1]) + ")"

                elif el[0] == '-' and ((s and s[-1] in "+/*-") \
                    or (q and q == "**")):
                    s += "(" + decimaux(el) + ")"

                else: s += decimaux(el)
            elif el == "**":
                s += "**{"
                puiss = 1
            elif el == "(":
                if puiss: puiss += 1
                s += "("
            elif el == ")":
                if puiss: puiss -= 1
                s += ")"
            else :
                # "+", "-", "*", "/"
                s += el
            if puiss == 1 and s[-1] != r"{":
                puiss = 0
                s += "}"
        for cle in isEnlumine.keys():
            if isEnlumine[cle] and (not isinstance(el, list) or el[1] != cle):
                s += '}'
        s = s.replace("**{", "^{")
        s = s.replace("(", "\\left( ")
        s = s.replace(")", "\\right) ")
        s = s.replace("\\left\\left", "\\left ")
        s = s.replace("\\right\\right", "\\right ")
        s = s.replace("*", "\\times ")
        s = s.replace("/", "\\div ")
        if not ls or s != ls[-1]:
            ls.append(s)
    return ls
示例#10
0
def coefdir(A, B):
    # donne le coefficient directeur x/y sous forme de liste [x,y]
    # Si y=1 on ecrira x sinon on écrira la fraction x/y
    return Fraction.simplifie(Fraction(B[1] - A[1], B[0] - A[0]))
示例#11
0
文件: proba.py 项目: Azixx/pyromaths
def proba(exo, cor):
    couleur = ['bleue', 'rouge', 'jaune', 'verte', 'marron', 'orange']
    initiale = ['B', 'R', 'J', 'V', 'M', 'O']
    # Choix des 3 couleurs et du nombre de boule
    rg = random.randrange(0, 4)
    c1, i1, n1 = couleur[rg], initiale[rg], random.randrange(
        1, 6)  # 1ere couleur, son initiale et le nombre
    # 2e couleur diférente de la première
    rg2 = (rg + random.randrange(1, 5)) % 6
    c2, i2, n2 = couleur[rg2], initiale[rg2], random.randrange(1, 6)
    # 3e couleur différente des précédentes
    c3, i3, n3 = couleur[(rg2 + 1) % 6], initiale[(rg2 + 1) %
                                                  6], random.randrange(1, 6)
    if n1 > 1:
        plur1 = "s"
    else:
        plur1 = ""
    if n2 > 1:
        plur2 = "s"
    else:
        plur2 = ""
    if n3 > 1:
        plur3 = "s"
    else:
        plur3 = ""
    exos = [
        u"Dans une urne, il y a %s boule%s %s%s (%s), %s boule%s %s%s (%s) et %s boule%s %s%s (%s), indiscernables au toucher. On tire successivement et sans remise deux boules."
        % (n1, plur1, c1, plur1, i1, n2, plur2, c2, plur2, i2, n3, plur3, c3,
           plur3, i3), "\\begin{enumerate}",
        u"\\item Quelle est la probabilité de tirer une boule %s au premier tirage ?"
        % c2,
        u"\\item Construire un arbre des probabilités décrivant l'expérience aléatoire.",
        u"\\item Quelle est la probabilité que la première boule soit %s et la deuxième soit %s ?"
        % (c3, c2),
        u"\\item Quelle est la probabilité que la deuxième boule soit %s ?" %
        c1, "\\end{enumerate}"
    ]
    tot = n1 + n2 + n3
    # calculs intermédiaires pour la question 4
    p41 = "\\dfrac{%s}{%s}\\times \\dfrac{%s}{%s}+" % (n1, tot, n1 - 1,
                                                       tot - 1)
    p42 = "\\dfrac{%s}{%s}\\times \\dfrac{%s}{%s}+" % (n2, tot, n1, tot - 1)
    p43 = "\\dfrac{%s}{%s}\\times \\dfrac{%s}{%s}=" % (n3, tot, n1, tot - 1)

    result4 = "\\dfrac{%s}{%s}" % (n1 * (n1 - 1 + n2 + n3), tot * (tot - 1)
                                   )  # resultat non simplifié de la question 4
    cors = [u"Dans une urne, il y a %s boule%s %s%s (%s), %s boule%s %s%s (%s) et %s boule%s %s%s (%s), indiscernables au toucher. On tire successivement et sans remise deux boules." % (n1, plur1, c1, plur1, i1, n2, plur2, c2, plur2, i2, n3, plur3, c3, plur3, i3),

         "\\begin{enumerate}",
         u"\\item Quelle est la probabilité de tirer une boule %s au premier tirage ?\\par " % c2,
         "Il y a %s boules dans l'urne dont %s boule%s %s%s. \\par" % (tot, n2, plur2, c2, plur2),
         u" La probabilité de tirer une boule %s au premier tirage est donc $\\dfrac{%s}{%s}$." % (c2, n2, tot),
         u"\\item Construire un arbre des probabilités décrivant l'expérience aléatoire.\\\ [0,3cm] ",
         "\\psset{unit=1 mm}",
         "\\psset{linewidth=0.3,dotsep=1,hatchwidth=0.3,hatchsep=1.5,shadowsize=1,dimen=middle}",
         "\\psset{dotsize=0.7 2.5,dotscale=1 1,fillcolor=black}",
         "\\psset{arrowsize=1 2,arrowlength=1,arrowinset=0.25,tbarsize=0.7 5,bracketlength=0.15,rbracketlength=0.15}",
         "\\begin{pspicture}(0,0)(80,53)",
         "\\psline(0,3)(10,23)",
         "\\psline(10,3)(10,23)",
         "\\psline(20,3)(10,23)",
         "\\psline(30,3)(40,23)",
         "\\psline(40,3)(40,23)",
         "\\psline(50,3)(40,23)",
         "\\psline(60,3)(70,23)",
         "\\psline(80,3)(70,23)",
         "\\psline(70,3)(70,23)",
         "\\psline(15,28)(40,53)",
         "\\psline(40,53)(65,28)",
         "\\psline(40,53)(40,28)",
         "\\rput(20,40){$\\dfrac{%s}{%s}$} \\rput(37,40){$\\dfrac{%s}{%s}$} \\rput(60,40){$\\dfrac{%s}{%s}$}" % (n1, tot, n2, tot, n3, tot),
         "\\rput(10,26){%s} \\rput(40,26){%s} \\rput(70,26){%s}" % (i1, i2, i3),
         "\\rput(0,10){$\\dfrac{%s}{%s}$} \\rput(7,10){$\\dfrac{%s}{%s}$} \\rput(20,10){$\\dfrac{%s}{%s}$}" % (n1 - 1, tot - 1, n2, tot - 1, n3, tot - 1),
         "\\rput(0,0){%s} \\rput(10,0){%s} \\rput(20,0){%s}" % (i1, i2, i3),
         "\\rput(30,10){$\\dfrac{%s}{%s}$} \\rput(37,10){$\\dfrac{%s}{%s}$} \\rput(50,10){$\\dfrac{%s}{%s}$}" % (n1, tot - 1, n2 - 1, tot - 1, n3, tot - 1),
         "\\rput(30,0){%s} \\rput(40,0){%s} \\rput(50,0){%s}" % (i1, i2, i3),
         "\\rput(60,10){$\\dfrac{%s}{%s}$} \\rput(67,10){$\\dfrac{%s}{%s}$} \\rput(80,10){$\\dfrac{%s}{%s}$}" % (n1, tot - 1, n2, tot - 1, n3 - 1, tot - 1),
         "\\rput(60,0){%s} \\rput(70,0){%s} \\rput(80,0){%s}" % (i1, i2, i3),
         "\\end{pspicture}",
         "\\vspace{0.3cm}",
         u"\\item Quelle est la probabilité que la première boule soit %s et la deuxième soit %s ?\\par" % (c3, c2),
         u"On note $(\\mathrm %s~,~\\mathrm %s)$ l'évènement: \\og{}la première boule tirée est %s et la deuxième tirée est %s\\fg{} et " % (i3,i2,c3,c2),
         u"on utilise l'arbre construit précédemment.\\par",
         "$p\\,(\\mathrm %s~,~\\mathrm %s)=%s \\times %s = %s$\\par" % \
                (i3, i2, str(Fraction(n3, tot)),
                 str(Fraction(n2, tot - 1)),
                 str(Fraction(n3 * n2, tot * (tot - 1)))),
         u"La probabilité que la première boule soit %s et la deuxième soit %s est égale à $\\dfrac{%s}{%s}$." % (c3, c2, n3 * n2, tot * (tot - 1)),
         u"\\item Quelle est la probabilité que la deuxième boule soit %s ?\\par" % c1,
         u"On note $(?~,~\\mathrm %s)$ l'évènement: \\og{}la deuxième boule tirée est %s\\fg{}. \\par" % (i1, c1),
         "$p\\,(?~,~\\mathrm %s)=p\\,(\\mathrm %s~,~\\mathrm %s)+p\\,(\\mathrm %s~,~\\mathrm %s)+p\\,(\\mathrm %s~,~\\mathrm %s)=" % (i1, i1, i1, i2, i1, i3, i1) + p41 + p42 + p43 + result4 + "$",
         "\\end{enumerate}"]
    for st in exos:
        exo.append(st)
    for st in cors:
        cor.append(st)
示例#12
0
def TeX(nombre, parenthese=False, terme=False, fractex="\\dfrac"):
    r"""**TeX**\ (*nombre*\ [, *parenthese*\ [, *terme*\ [, *fractex*\ ]]])

    Permet l'affichage de nombres au format TeX. Fait en partie double emploi avec tex_coef. Permet

    * d'écrire un nombre (décimal, rationnel ou radical) au format TeX
    * d'écrire l'infini au format TeX
    * d'ajouter un `+` devant `3` pour écrire `+3` avec `terme`
    * de mettre des parenthèses autour de `3` avec `parenthese`
    * de changer la commande d'écriture des fractions en TeX avec fractex

    :param nombre: est le nombre à écrire
    :type nombre: integer, Fractions, RacineDegre2
    :param parenthese: si vrai, il faut écrire des parenthèses autour de `nombre`
    :type parenthese: boolean
    :param terme: Ajoute un `+` devant nombre s'il est positif.
    :type terme: boolean
    :param fractex: commande à utiliser pour créer une fraction sous TeX
    :type fractex: string

    >>> from pyromaths.outils import Affichage
    >>> from pyromaths.classes.Fractions import Fraction
    >>> Affichage.TeX(Fraction(7,3)).strip()
    \dfrac{7}{3}
    >>> Affichage.TeX(Fraction(7,3),fractex='\\frac').strip()
    \frac{7}{3}

    :rtype: string
    """
    strTeX = finTeX = ""

    # Affichage simplifié des racines ou fractions
    if isinstance(nombre, Racine.RacineDegre2) and nombre.radicande == 0:
        # Affiche la RacineDegre2 comme une Fractions
        nombre = Fraction(nombre.numerateur, nombre.denominateur)
    if isinstance(nombre, Fraction) and nombre.d == 1:
        # Affiche la Fractions comme un entier
        nombre = nombre.n
    # parentheses des fractions
    if parenthese and (
        isinstance(nombre, Racine.RacineDegre2)
                       and nombre.denominateur == 1 and (nombre.numerateur or nombre.coeff < 0)
        # RacineDegre2 avec radicande nécessairement grâce au tri
        or isinstance(nombre, Fraction) and nombre.n < 0
        or isinstance(nombre, int) and nombre < 0
        or isinstance(nombre, float) and nombre < 0):
        strTeX = "\\left("
        finTeX = "\\right)"
    elif terme and (isinstance(nombre, Racine.RacineDegre2) and
                        (nombre.d != 1 or (nombre.n > 0 or nombre.n == 0 and nombre.coeff >= 0))
                    or nombre >= 0) :
        strTeX = "+"
        finTeX = ""

    # #Affichage
    if isinstance(nombre, (int, float)) and nombre == float("inf"):
        return "+\\infty "
    elif isinstance(nombre, (int, float)) and nombre == float("-inf"):
        return "-\\infty "
    elif isinstance(nombre, int) or isinstance(nombre, float):
        return strTeX + decimaux(nombre) + finTeX
    elif isinstance(nombre, Fraction):
        if nombre.n < 0:
            strTeX += "-" + fractex + "{" + decimaux(-nombre.n) + "}{" + decimaux(nombre.d) + "} "
        else:
            strTeX += fractex + "{" + decimaux(nombre.n) + "}{" + decimaux(nombre.d) + "} "
        strTeX += finTeX
        return strTeX
    elif isinstance(nombre, Racine.RacineDegre2):
        return strTeX + str(nombre) + finTeX
    else:
        return strTeX + str(nombre) + finTeX
示例#13
0
文件: affine.py 项目: Azixx/pyromaths
def exprfonc(f, i, A, B):
    # Génère la 3e question.
    # A est sur l'axe des ordonnées, f est le nom de la fonction
    u = coefdir(A, B)
    if isinstance(u, int): u = Fraction(u, 1)
    Polynome([[u, 1], [A[1], 0]], "x")(B[0])
    #===========================================================================
    # if A[1] >= 0:
    #     b = '+' + decimaux(str(A[1]))
    # else:
    #     b = decimaux(str(A[1]))
    # if u.d == 1:
    #     coef = decimaux(str(u.n))
    #     if u.n == -1:
    #         coef = '-'  # utilisé dans l'expression de la fonction
    #     if u.n == 1:
    #         coef = ''
    #     coefres = decimaux(str(u.n))  # résultat utilisé pour a
    # else:
    #     if u.n > 0:
    #         coef = '\\dfrac{' + decimaux(str(u.n)) + '}{' + decimaux(str(u.d)) + '}'
    #     else:
    #         coef = '-\\dfrac{' + decimaux(str(abs(u.n))) + '}{' + decimaux(str(u.d)) + '}'
    #     coefres = coef
    #===========================================================================

    if A[1] - B[1] > 0:
        deltay = '+' + decimaux(str(A[1] - B[1]))
    else:
        deltay = decimaux(str(A[1] - B[1]))
    if A[0] - B[0] > 0:
        deltax = '+' + decimaux(str(A[0] - B[0]))
    else:
        deltax = decimaux(str(A[0] - B[0]))

    if float(B[0]) < 0:
        mid11 = float(B[0]) - 0.75
        mid12 = float((B[1] + A[1])) / 2  # milieu de la flèche verticale
    else:
        mid11 = float(B[0]) + 0.75
        mid12 = float((B[1] + A[1])) / 2
    if float(B[0]) * float(u.d / u.n) > 0:
        mid21 = float((A[0] + B[0])) / 2
        mid22 = A[1] - 0.6  # milieu de la flèche horizontale
    else:
        mid21 = float((A[0] + B[0])) / 2
        mid22 = A[1] + 0.5
    if mid12 < 0 and mid12 > -0.8:
        mid12 = -1
    if mid12 >= 0 and mid12 < 0.5:
        mid12 = 0.5
    if mid11 < 0 and mid11 > -0.8:
        mid11 = -1
    if mid11 >= 0 and mid11 < 0.5:
        mid11 = 0.5
    if mid21 < 0 and mid21 > -0.8:
        mid21 = -1
    if mid21 >= 0 and mid21 < 0.5:
        mid21 = 0.5
    if mid22 < 0 and mid22 > -0.8:
        mid22 = -1
    if mid22 >= 0 and mid22 < 0.5:
        mid22 = 0.5
    mid1 = (mid11, mid12)
    mid2 = (mid21, mid22)
    l = [
        u'Déterminer l\'expression de la fonction $' + f +
        u'$ représentée ci-contre par la droite ($d_' + str(i) + '$).',
        u'On lit l\'ordonnée à l\'origine et le coefficient de la fonction affine sur le graphique.\\\ ',
        '$' + f + '(x)=a\\,x+b$ ' + 'avec $b=' + decimaux(str(A[1])) +
        '$ et $a=' + '\\dfrac{' + deltay + '}{' + deltax + '}=' + str(u) +
        '$.\\\ ', 'L\'expression de la fonction $' + f + '$ est $' + f +
        '(x)=' + str(Polynome([[u, 1], [A[1], 0]], "x")) + '$.',
        doublefleche(B, (B[0], A[1])),
        doublefleche((B[0], A[1]),
                     A), '\\rput' + str(mid1) + '{(' + deltay + ')}',
        '\\rput' + str(mid2) + '{(' + deltax + ')}'
    ]

    return l
示例#14
0
文件: affine.py 项目: Azixx/pyromaths
def coefdir(A, B):
    # donne le coefficient directeur x/y sous forme de liste [x,y]
    # Si y=1 on ecrira x sinon on écrira la fraction x/y
    return Fraction.simplifie(Fraction(B[1] - A[1], B[0] - A[0]))