source: pyromaths/trunk/fuentes/src/pyromaths/outils/Polynomes.py @ 423

Last change on this file since 423 was 423, checked in by mabarracus, 4 years ago

add sources from pyromaths 15.10

File size: 6.3 KB
Line 
1# -*- coding: utf-8 -*-
2from pyromaths.classes.Polynome import Polynome
3from .Arithmetique import pgcd
4
5from random import randint, randrange
6# from math import *
7
8
9#--------------outils pour la class Polynome----------------------
10
11def TeX_division(dividende, diviseur):
12    '''renvoie une chaine de caractere TeX pour afficher la division en détail'''
13#     quotient = Polynome({0:0})
14    texquotient, restera = dividende / diviseur
15    reste = dividende
16    diviseur_degre = diviseur.deg
17    sauve = min(dividende.puiss + restera.puiss)
18    longueur = dividende.degre_max - sauve
19    string = "$$\\renewcommand\\arraycolsep{0cm}\n\\begin{array}{c"
20    for dummy in range(longueur):
21        string += "c"
22    string += "|c}\n"
23    string += tab_print(dividende, longueur + 1)
24    string += str(diviseur) + "\\\\\n"
25    string += "\\cline{" + str(dividende.deg + 2 - sauve) + "-" + str(dividende.deg + 2 - sauve) + "}\n"
26    i = 0
27    while reste.deg >= diviseur.deg:
28        for dummy in range(i):
29            string += " &"
30        ajout_quotient_deg = reste.deg - diviseur_degre
31        facteur = reste.dictio[max(0, reste.deg)] / diviseur.dictio[diviseur.deg]
32        ajout_quotient = Polynome({ajout_quotient_deg:facteur}, var=dividende.var)
33        soustrait_reste = ajout_quotient * diviseur
34        string += tab_print(soustrait_reste, diviseur_degre + 1 - sauve, parenthese=True)
35        for dummy in range(longueur - i - diviseur.deg + sauve):
36            string += " & "
37        if i == 0:
38            string += str(texquotient)
39        string += "\\\\\n"
40        string += "\\cline{" + str(i + 1) + "-" + str(i + diviseur.deg + 1 - sauve) + "}\n"
41        avant = reste.deg
42        reste = reste - soustrait_reste
43        delta = avant - reste.degre_max
44        for dummy in range(i):
45            string += " &"
46        i = i + delta
47#         prochain = 1
48        string += tab_print(reste, min(diviseur.deg + 1, reste.degre_max + 1) + delta - sauve, debut=delta)
49        # fait descendre les monome du dividende
50        for dummy in range(longueur - i - diviseur.deg + sauve):
51            string += " & "
52        string += "\\\\ \n"
53    string += "\\end{array}\n$$"
54
55    string += "\n On a $$" + dividende.TeX() + " = \\left(" + texquotient.TeX() + "\\right) \\times \\left(" + diviseur.TeX() + "\\right)"
56    if restera != Polynome(0):
57        if len(restera.puiss) == 1 and restera[restera.deg] > 0:  # monome
58            string += "+" + restera.TeX()
59        else:
60            string += "+\\left(" + restera.TeX() + "\\right)"
61    string += "$$"
62    return string
63def tab_print(polynome, longueur=0, parenthese=False, debut=0):
64    '''utilisé par TeX_division pour décaler le reste dans la partie gauche'''
65    degre = polynome.degre_max + debut
66    string = ''
67    if parenthese:
68        string = "-("
69        fin = ")"
70    else:
71        fin = ""
72    if polynome == 0:
73        string += "+" + str(0) + " &"
74    else:
75        for i in range(longueur):
76            k = degre - i
77            coeff = polynome.dictio.get(k, 0)
78            if coeff >= 0:
79                string += "+"
80            string += str(coeff)
81            if k != 0:
82                string += polynome.var
83            if k != 1 and k != 0:
84                string += u"^" + str(k)
85            if longueur - i == 1:
86                    string += fin
87            string += " & "
88    return string
89
90########################################################
91#
92#  construction de polynôme de degré 2
93#  X est un Polynome
94#  X=Polynome("x","x") donnera un polynome de degré 2
95#  X=Polynome("x^2",x) donnera un polynôme bicarrée
96#
97########################################################
98def poly_racines_quelconques(abs_a, abs_b, abs_c, X):
99    '''renvoie un polynome de degré 2'''
100    '''abs_a,abs_b,abs_c sont des entiers positifs majorant les valeurs absolues de a, b ,c'''
101   
102    a3 = (2 * randrange(2) - 1) * randrange(1, abs_a + 1)
103    b3 = randrange(abs_b)
104    c3 = randrange(-abs_c, abs_c)
105    return a3 * X ** 2 + b3 * X + c3
106def poly_racines_fractionnaires(rac_min, rac_max, denom1, X):
107    '''renvoie un polynome de degré2 à racines fractionnaires '''
108    '''les racines sont comprises entre rac_min et rac_max'''
109    '''denom1 majore le dénominateur des racines'''
110    while 1:
111        # pour éviter P=77x^2
112        a2 = 2 * randrange(2) - 1  # a2=-1 ou 1
113        p2facteur = [randint(1, denom1) * X - randint(rac_min, rac_max)for dummy in range(2)]
114        pol2 = a2 * p2facteur[0] * p2facteur[1]
115        if pol2[1] != 0 and pol2[0] != 0:
116            break
117    pol2 = pol2.simplifie()
118    simplifie = abs(pgcd(pgcd(int(pol2[0]), int(pol2[1])), int(pol2[2])))
119    pol2 = pol2 / simplifie
120    return pol2.simplifie()
121def poly_racines_entieres(rac_min, rac_max, X, a1=1):
122   
123    while 1:
124        p1facteur = [X - randrange(rac_min, rac_max) for dummy in range(2)]
125        pol1 = a1 * p1facteur[0] * p1facteur[1]
126        if pol1[1] != 0 or pol1[1] != 0:
127            break
128    return pol1
129
130def poly_id_remarquables(rac_min, rac_max, X):
131    '''Renvoie un polynome obtenu par une identité remarquable'''
132    '''et sgns
133         -2 => (a-b)²
134         +2 => (a+b)²
135          0 => (a-b)(a+b)'''
136    a = randint(1, 10)
137    while 1:
138        coeff = randrange(rac_min, rac_max)
139        racine = randrange(rac_min, rac_max)
140        if coeff != 0 and racine != 0:
141            break
142    sgns = [[-1, 1][randrange(2)]for dummy in range(2)]
143    p1facteur = [coeff * X + sgns[i] * racine for i in range(2)]
144    return a * p1facteur[0] * p1facteur[1], sum(sgns)   
145        # sum(sgns) permet de connaître l'identité remarquable
146        # -2 => (a-b)²
147        # +2 => (a+b)²
148        # 0 => (a-b)(a+b)
149
150#----------polynome de degré 3-------------
151def poly_degre3_racines_entieres(rac_min, rac_max, X, racines=[-2, -1, 0, 1, 2]):
152    racine_evidente = racines[randrange(len(racines))]
153    return (X - racine_evidente) * poly_racines_entieres(rac_min, rac_max, X)
154def poly_degre3_racines_fractionnaires(rac_min, rac_max, denom1, X, racines=[-2, -1, 0, 1, 2]):
155    racine_evidente = racines[randrange(len(racines))]
156    return (X - racine_evidente) * poly_racines_fractionnaires(rac_min, rac_max, denom1, X)
157def poly_degre3_racines_quelconques(abs_a, abs_b, abs_c, X, racines=[-2, -1, 0, 1, 2]):
158    racine_evidente = racines[randrange(len(racines))]
159    return (X - racine_evidente) * poly_racines_quelconques(abs_a=1, abs_b=10, abs_c=10, X=X)
160
161
Note: See TracBrowser for help on using the repository browser.