def sympyfy(liste_calculs): """Convertit une liste de chaînes de caractères 'liste_calculs' contenant des polynômes en liste de chaînes de caractères au format Sympy""" ls = [] for calcul in liste_calculs: if isinstance(calcul, basestring): calcul = splitting(calcul) s = "" puiss = 0 for i in range(len(calcul)): el = calcul[i] if el[:9] == "Polynome(": # Doit-on entourer ce polynôme de parenthèses ? p = eval(el) if i+1 < len(calcul): q = calcul[i+1] else: q= "" 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 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 EstNombre(el): if el[0]=="(": s += "(" + decimaux(el[1:-1]) + ")" 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: puiss = 0 s += "}" s = s.replace("\\,x", "*x") s = s.replace("\\,", "") s = s.replace("**{", "**") s = s.replace("^{", "**") s = s.replace("}", "") # s = s.replace("(", "\\left( ") # s = s.replace(")", "\\right) ") # s = s.replace("**{", "^{") # s = s.replace("*", "\\times ") # s = s.replace("/", "\\div ") if not ls or s != ls[-1]: ls.append(s) return ls
def __str__(self): """str(self) Renvoie une version LaTeX du polynôme""" var = self.var s = "" for m in self.monomes: if isinstance(m, list): if m[1] > 1: # Monôme de degré au moins 2 if m[0] == 1: s = s + "+" + var + "^{" + str(m[1]) + "}" elif m[0] == -1: s = s + "-" + var + "^{" + str(m[1]) + "}" elif m[0] > 0: s = s + "+" +decimaux(m[0], 1) + r"\," + var + "^{" + str(m[1]) + "}" else: s = s + decimaux(m[0], 1) + r"\," + var + "^{" + str(m[1]) + "}" elif m[1] == 1: # Monôme de degré 1 if m[0] == 1: s = s + "+" + var elif m[0] == -1: s = s + "-" + var elif m[0] > 0: s = s + "+" + decimaux(m[0], 1) + r"\," + var else: s = s + decimaux(m[0], 1) + r"\," + var else: # Monôme de degré 0 if m[0] < 0: s = s + decimaux(m[0], 1) else: s = s + "+" + decimaux(m[0], 1) # supprime le + en début de séquence s = s.lstrip("+") if not s: s="0" return s
def plotify(calcul): r"""**plotify**\ (*calcul*) Convertit la chaîne de caractères `calcul` contenant des polynômes une chaîne de caractères au format psplot **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 >>> Priorites3.plotify('Polynome([[Fraction(-5, 192), 4], [Fraction(2, 96), 3], [Fraction(41, 48), 2], [Fraction(-7, 12), 1], [-4, 0]], "x", False)') -5/192*x^4+2/96*x^3+41/48*x^2-7/12*x^1-4 :rtype: str """ from pyromaths.classes.PolynomesCollege import Polynome from pyromaths.classes.Fractions import Fraction from Affichage import decimaux if isinstance(calcul, basestring): calcul = splitting(calcul) s = "" puiss = 0 for i in range(len(calcul)): el = calcul[i] if el[:9] == "Polynome(": # Doit-on entourer ce polynôme de parenthèses ? p = eval(el) if i + 1 < len(calcul): q = calcul[i + 1] else: q = "" """ 3 cas : * {*,-}(2x+3) ou {*,-}(-2x) * (2x+3)*... * (2x+1)**2""" res = [] for m in p.monomes: texte = '' if isinstance(m[0], Fraction): texte = str(m[0].n) + "/" + str(m[0].d) elif isinstance(m[0], (float, int)): texte = str(m[0]) if m[1]: texte += "*x^%s" % m[1] res.append(texte) t = "+".join(res) t = t.replace("+-", "-") 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 q and q == "**"): s += "(" + t + ")" elif s and s[-1] == "+" and p.monomes[0][0] < 0: s = s[:-1] s += t else: s += t elif el[:9] == "Fraction(": # Doit-on entourer cette fraction de parenthèses ? p = el[9:-1].split(",") if len(p) == 2: texfrac = p[0] + "/" + p[1] else: raise ValueError(_(u'On ne devrait pas rencontrer de fraction non simplifiée ici')) if i + 1 < len(calcul): q = calcul[i + 1] else: q = "" if (eval(p[0]) < 0 or p[1] != "1") and q and q == "**": s += "( " + texfrac + " )" else: s += texfrac elif EstNombre(el): if el[0] == "(": s += "(" + decimaux(el[1:-1]) + ")" 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] != "": puiss = 0 s += ")" s = s.replace("**{", "^(") s = s.replace(r"\,", "*") return s
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
def traite_operation(operateur, calcul, pre, post, solution): pattern = r""" ( #groupe 0 ^\(* #le calcul est au début (aux parenthèses près) #les signes +/- font parti du groupe 2 | #ou ^.*?[\+\-]? #il y a des calculs avant, le 1er signe +/- #est un opérateur ) #fin du groupe 0 ( #groupe 1 (?: #regroupement 1 (non groupe) [\+\-]? #un éventuel signe \( #une parenthèse ouvrante [\+\-]? #un éventuel signe \d+\.?\d*(?:e[\+\-]\d+)? #on cherche un nombre avec une #éventuelle partie décimale et un #éventuel exposant \) #une parenthèse fermante | #ou [\+\-]? #un éventuel signe \d+\.?\d*(?:e[\+\-]\d+)? #on cherche un nombre avec une #éventuelle partie décimale et un #éventuel exposant | #ou \w+ #un littéral ) #fin du regroupement 1 {0} #opération (?: #regroupement 2 (non groupe) [\+\-]? #un éventuel signe \( #une parenthèse ouvrante [\+\-]? #un éventuel signe \d+\.?\d*(?:e[\+\-]\d+)? #on cherche un nombre avec une #éventuelle partie décimale et un #éventuel exposant \) #une parenthèse fermante | #ou [\+\-]? #un éventuel signe \d+\.?\d*(?:e[\+\-]\d+)? #on cherche un nombre avec une #éventuelle partie décimale et un #éventuel exposant | #ou \w+ #un littéral ) #fin du regroupement 2 ) #fin du groupe 1 (.*?)$ #tout le reste """.format(operateur) test = re.search(pattern, calcul, re.VERBOSE) while test: sous_calcul = test.groups() print(sous_calcul) print(pre, post) sous_resultat = eval(sous_calcul[1]) if isinstance(sous_resultat, list): for element in sous_resultat: solution.extend([pre + sous_calcul[0] + str(element) + sous_calcul[2] + post]) a = sous_resultat[-1] sous_resultat = 'a' elif (sous_calcul[0] and sous_calcul[0][-1] == '(') and \ (sous_calcul[2][0] and sous_calcul[2][0] == ')') and \ (post[:2] != '**' or sous_resultat > 0): #permet de supprimer les parenthèses solution.extend([pre + sous_calcul[0][:-1] + decimaux(sous_resultat, True) + sous_calcul[2][1:] + post]) else: solution.extend([pre + sous_calcul[0] + decimaux(sous_resultat, True) + sous_calcul[2] + post]) calcul = sous_calcul[0] + decimaux(sous_resultat, True) + sous_calcul[2] test = re.search(pattern, calcul, re.VERBOSE) return (calcul, pre, post, solution)
def plotify(calcul): r"""**plotify**\ (*calcul*) Convertit la chaîne de caractères `calcul` contenant des polynômes une chaîne de caractères au format psplot **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 >>> Priorites3.plotify('Polynome([[Fraction(-5, 192), 4], [Fraction(2, 96), 3], [Fraction(41, 48), 2], [Fraction(-7, 12), 1], [-4, 0]], "x", False)') '-5/192*x^4+2/96*x^3+41/48*x^2-7/12*x^1-4' :rtype: str """ from pyromaths.classes.PolynomesCollege import Polynome from pyromaths.classes.Fractions import Fraction from Affichage import decimaux if isinstance(calcul, basestring): calcul = splitting(calcul) s = "" puiss = 0 for i in range(len(calcul)): el = calcul[i] if el[:9] == "Polynome(": # Doit-on entourer ce polynôme de parenthèses ? p = eval(el) if i + 1 < len(calcul): q = calcul[i + 1] else: q = "" """ 3 cas : * {*,-}(2x+3) ou {*,-}(-2x) * (2x+3)*... * (2x+1)**2""" res = [] for m in p.monomes: texte = '' if isinstance(m[0], Fraction): texte = str(m[0].n) + "/" + str(m[0].d) elif isinstance(m[0], (float, int)): texte = str(m[0]) if m[1]: texte += "*x^%s" % m[1] res.append(texte) t = "+".join(res) t = t.replace("+-", "-") 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 q and q == "**"): s += "(" + t + ")" elif s and s[-1] == "+" and p.monomes[0][0] < 0: s = s[:-1] s += t else: s += t elif el[:9] == "Fraction(": # Doit-on entourer cette fraction de parenthèses ? p = el[9:-1].split(",") if len(p) == 2: texfrac = p[0] + "/" + p[1] else: raise ValueError(u'On ne devrait pas rencontrer de fraction non simplifiée ici') if i + 1 < len(calcul): q = calcul[i + 1] else: q = "" if (eval(p[0]) < 0 or p[1] != "1") and q and q == "**": s += "( " + texfrac + " )" else: s += texfrac elif EstNombre(el): if el[0] == "(": s += "(" + decimaux(el[1:-1]) + ")" 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] != "": puiss = 0 s += ")" s = s.replace("**{", "^(") s = s.replace(r"\,", "*") return s