source: pyromaths/trunk/fuentes/src/pyromaths/ex/quatriemes/puissances.py @ 1625

Last change on this file since 1625 was 1625, checked in by jrpelegrina, 5 years ago

Fix ex puissances.py of quatriemes

File size: 15.8 KB
Line 
1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3#
4# Pyromaths
5# Un programme en Python qui permet de créer des fiches d'exercices types de
6# mathématiques niveau collège ainsi que leur corrigé en LaTeX.
7# Copyright (C) 2006 -- Jérôme Ortais (jerome.ortais@pyromaths.org)
8#
9# This program is free software; you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation; either version 2 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program; if not, write to the Free Software
21# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22#
23
24from pyromaths.outils.Arithmetique import pgcd, valeur_alea
25from pyromaths.outils.Affichage import decimaux, tex_coef
26from random import choice, randrange
27import string
28
29
30def tex_proprietes_val(exp_max, nb_max, typeexo):
31    """
32    Renvoie des valeurs pour l'exercice sur les propriétés des puissances
33    @param exp_max: valeur maximale pour les exposants
34    @type exp_max: Integer
35    @param nb_max: Valeur maximale pour les nombres
36    @type nb_max: integer
37    @param typeexo: 0 : 2 exposants et 1 nombre ; 1 : 1 exposant et 2 nombres
38    @type typeexo: integer
39    """
40
41    if typeexo:
42        while 1:
43            nb1 = randrange(2, nb_max)
44            nb2 = randrange(2, nb_max)
45            exp1 = randrange(2, exp_max)
46            exp2 = exp1
47            if nb1 != nb2:
48                break
49    else:
50        while 1:
51            nb1 = randrange(2, nb_max)
52            nb2 = nb1
53            exp1 = randrange(2, exp_max)
54            exp2 = randrange(2, exp_max)
55            if exp1 != exp2:
56                break
57    return (nb1, exp1, nb2, exp2)
58
59
60def tex_proprietes():
61    exo = ["\\exercice",
62           _(u"Compléter par un nombre de la forme $a^n$ avec $a$ et $n$ entiers :"),
63           "\\begin{multicols}{4}", \\noindent%",
64           \\begin{enumerate}"]
65    cor = ["\\exercice*",
66           _(u"Compléter par un nombre de la forme $a^n$ avec $a$ et $n$ entiers :"),
67           "\\begin{multicols}{4}", \\noindent%",
68           \\begin{enumerate}"]
69    lexos = [0, 1, 2, 3, 0, 1, 2, 3]
70
71    # 0: a^n*a^p ; 1: (a^n)^p ; 2:a^n/a^p ; 3: a^n*b^n
72
73    for dummy in range(len(lexos)):
74        j = lexos.pop(randrange(len(lexos)))
75        if j == 3:
76            lval = tex_proprietes_val(12, 12, 1)
77            exo.append(_("\\item $%s^{%s} \\times %s^{%s} = \\dotfill$") % 
78                       lval)
79            cor.append(_("\\item $%s^{%s}\\times%s^{%s}=") % lval)
80            cor.append("%s^{%s}$" % (lval[0] * lval[2], lval[1]))
81        else:
82            lval = tex_proprietes_val(12, 12, 0)
83            if j == 0:
84                exo.append(_("\\item $%s^{%s}\\times%s^{%s}=\\dotfill$") % 
85                           lval)
86                cor.append(_("\\item $%s^{%s}\\times%s^{%s}=") % lval)
87                cor.append("%s^{%s}$" % (lval[0], lval[1] + lval[3]))
88            elif j == 1:
89                exo.append(_("\\item $(%s^{%s})^{%s}=\\dotfill$") % (lval[0],
90                           lval[1], lval[3]))
91                cor.append("\\item $(%s^{%s})^{%s}=" % (lval[0],
92                           lval[1], lval[3]))
93                cor.append("%s^{%s}$" % (lval[0], lval[1] * lval[3]))
94            elif j == 2:
95                while lval[1] - lval[3] < 3:
96                    lval = tex_proprietes_val(12, 12, 0)
97                exo.append(_("\\item $\\dfrac{%s^{%s}}{%s^{%s}}=\\dotfill$") % 
98                           lval)
99                cor.append("\\item $\\dfrac{%s^{%s}}{%s^{%s}}=" % 
100                           lval)
101                cor.append("%s^{%s}$" % (lval[0], lval[1] - lval[3]))
102    exo.append("\\end{enumerate}")
103    exo.append("\\end{multicols}\n")
104    cor.append("\\end{enumerate}")
105    cor.append("\\end{multicols}\n")
106    return (exo, cor)
107
108tex_proprietes.description = u'Propriétés sur les puissances'
109
110
111# ----PROPRIETES AVEC 10
112
113
114def tex_proprietes_neg_val(exp_max, nb_max, typeexo):
115    """
116    Renvoie des valeurs pour l'exercice sur les propriétés des puissances
117    @param exp_max: valeur maximale pour les exposants
118    @type exp_max: Integer
119    @param nb_max: Valeur maximale pour les nombres
120    @type nb_max: integer
121    @param typeexo: 0 : 2 exposants et 1 nombre ; 1 : 1 exposant et 2 nombres
122    @type typeexo: integer
123    """
124
125    if typeexo:
126        while 1:
127            nb1 = randrange(2, nb_max)
128            nb2 = randrange(2, nb_max)
129            exp1 = randrange(2, exp_max)
130            exp2 = exp1
131            if nb1 != nb2:
132                break
133    else:
134        while 1:
135            nb1 = randrange(2, nb_max)
136            nb2 = nb1
137            exp1 = randrange(2, exp_max)
138            exp2 = randrange(2, exp_max)
139            if exp1 != exp2:
140                break
141    return (nb1, exp1, nb2, exp2)
142
143
144def tex_proprietes_neg():
145    exo = ["\\exercice",
146           _(u"Écrire sous la forme d'une puissance de 10 puis donner l'écriture"),
147           _(u" décimale de ces nombres :"), "\\begin{multicols}{2}",
148           \\noindent%", \\begin{enumerate}"]
149    cor = ["\\exercice*",
150           _(u"Écrire sous la forme d'une puissance de 10 puis donner l'écriture"),
151           _(u" décimale de ces nombres :"), "\\begin{multicols}{2}",
152           \\noindent%", \\begin{enumerate}"]
153    lexos = [0, 1, 2, 3, 0, 1, 2, 3]
154
155    # 0: a^n*a^p ; 1: (a^n)^p ; 2:a^n/a^p
156
157    for dummy in range(len(lexos)):
158        lexp = [randrange(-6, 6) for dummy in range(2)]
159        j = lexos.pop(randrange(len(lexos)))
160
161        # FIXME : À finir
162
163        if j == 0:
164            while abs(lexp[0] + lexp[1]) > 10:
165                lexp = [randrange(-6, 6) for dummy in range(2)]
166            exo.append(_("\\item $10^{%s} \\times 10^{%s} = \\dotfill$") % 
167                       tuple(lexp))
168            cor.append(_("\\item $10^{%s}\\times 10^{%s}=") % tuple(lexp))
169            cor.append("10^{%s+%s}=" % (lexp[0], tex_coef(lexp[1],
170                       '', bpn=1)))
171            cor.append("10^{%s}=%s$" % (lexp[0] + lexp[1],
172                       decimaux(10 ** (lexp[0] + lexp[1]), 1)))
173        elif j == 1:
174            while abs(lexp[0] * lexp[1]) > 10:
175                lexp = [randrange(-6, 6) for dummy in range(2)]
176            exo.append(_("\\item $(10^{%s})^{%s}=\\dotfill$") % (lexp[0],
177                       lexp[1]))
178            cor.append("\\item $(10^{%s})^{%s}=" % tuple(lexp))
179            cor.append(_("10^{%s \\times %s}=") % (lexp[0], tex_coef(lexp[1],
180                       '', bpn=1)))
181            cor.append("10^{%s}=%s$" % (lexp[0] * lexp[1],
182                       decimaux(10 ** (lexp[0] * lexp[1]), 1)))
183        elif j == 2:
184            while abs(lexp[0] - lexp[1]) > 10:
185                lexp = [randrange(-6, 6) for dummy in range(2)]
186            exo.append(_("\\item $\\dfrac{10^{%s}}{10^{%s}}=\\dotfill$") % 
187                       tuple(lexp))
188            cor.append("\\item $\\dfrac{10^{%s}}{10^{%s}}=" % tuple(lexp))
189            cor.append("10^{%s-%s}=" % (lexp[0], tex_coef(lexp[1],
190                       '', bpn=1)))
191            cor.append("10^{%s}=%s$" % (lexp[0] - lexp[1],
192                       decimaux(10 ** (lexp[0] - lexp[1]), 1)))
193    exo.append("\\end{enumerate}")
194    exo.append("\\end{multicols}\n")
195    cor.append("\\end{enumerate}")
196    cor.append("\\end{multicols}\n")
197    return (exo, cor)
198
199tex_proprietes_neg.description = _(u'Propriétés sur les puissances de 10')
200
201
202#------------------------------------------------------------------------------
203#  Écritures scientifiques
204#------------------------------------------------------------------------------
205
206
207def val_sc():
208    while True:
209        a = randrange(10) * 1000 + randrange(10) + randrange(10) * 10 ** \
210            (randrange(2) + 1)
211        a = a * 10 ** randrange(-9, 6)
212
213        # a=randrange(1,9999)*10**randrange(-9,6)
214
215        if a >= 10 or (a < 1 and a > 0) :
216            break
217    return a
218
219
220def ecr_sc():
221    from math import log10, floor
222    exo = ["\\exercice", _(u"Compléter par le nombre qui convient :"),
223           "\\begin{multicols}{3}", \\noindent%",
224           \\begin{enumerate}"]
225    cor = ["\\exercice*",
226           _(u"Compléter par le nombre qui convient :"),
227           "\\begin{multicols}{3}", \\noindent%",
228           \\begin{enumerate}"]
229    for dummy in range(6):
230        a = val_sc()
231        exp = int(floor(log10(a)))
232        a_sc = (a * 1.) / 10 ** exp
233        s_a = decimaux(a, 1)
234        s_a_sc = decimaux(a_sc, 1)
235        if randrange(2):  # forme : a=a_sc*...
236            exo.append(_("\\item $%s=%s\\times\\dotfill$") % (s_a,
237                       s_a_sc))
238            cor.append(_("\\item $%s=%s\\times\\mathbf{10^{%s}}$") % (s_a,
239                       s_a_sc, decimaux(exp, 1)))
240        else:
241            # forme : a_sc*...=a
242            exo.append(_("\\item $%s\\times\\dotfill=%s$") % (s_a_sc,
243                       s_a))
244            cor.append(_("\\item $%s\\times\\mathbf{10^{%s}}=%s$") % (s_a_sc,
245                       decimaux(exp, 1), s_a))
246    exo.append("\\end{enumerate}")
247    exo.append("\\end{multicols}\n")
248    cor.append("\\end{enumerate}")
249    cor.append("\\end{multicols}\n")
250    return (exo, cor)
251
252ecr_sc.description = _(u'Écritures scientifiques')
253
254
255# ------------------- PUISSANCES de 10 -------------------
256
257
258def exo_puissances():
259    from math import floor, log10
260    sd = string.maketrans('.', ',')  # convertit les . en , (separateur decimal)
261    exo = ["\\exercice",
262           _(u"Calculer les expressions suivantes et donner l'écriture scientifique du résultat."),
263           "\\begin{multicols}{2}", \\noindent%"]
264    cor = ["\\exercice*",
265           _(u"Calculer les expressions suivantes et donner l'écriture scientifique du résultat."),
266           "\\begin{multicols}{2}", \\noindent%"]
267    valeurs = valeurs_puissances()
268    i = randrange(2)
269    exo.append("\\[ \\thenocalcul = %s \\]" % tex_puissances_0(valeurs[i]).translate(sd))
270    cor.append("\\[ \\thenocalcul = %s \\]" % tex_puissances_0(valeurs[i]).translate(sd))
271    cor.append("\\[ \\thenocalcul = %s \\]" % tex_puissances_1(valeurs[i]).translate(sd))
272    cor.append("\\[ \\thenocalcul = %s \\]" % tex_puissances_2(valeurs[i]).translate(sd))
273    if int(floor(log10(((valeurs[i][0] * valeurs[i][1]) * 1.) / valeurs[i][2]))) != \
274        0:
275        cor.append("\\[ \\thenocalcul = %s \\]" % tex_puissances_3(valeurs[i]).translate(sd))
276    cor.append("\\[ \\boxed{\\thenocalcul = %s} \\]" % 
277               tex_puissances_4(valeurs[i]).translate(sd))
278    exo.append("\\columnbreak\\stepcounter{nocalcul}%")
279    cor.append("\\columnbreak\\stepcounter{nocalcul}%")
280    exo.append("\\[ \\thenocalcul = %s \\]" % tex_puissances_0(valeurs[1 - 
281               i]).translate(sd))
282    cor.append("\\[ \\thenocalcul = %s \\]" % tex_puissances_0(valeurs[1 - 
283               i]).translate(sd))
284    cor.append("\\[ \\thenocalcul = %s \\]" % tex_puissances_1(valeurs[1 - 
285               i]).translate(sd))
286    cor.append("\\[ \\thenocalcul = %s \\]" % tex_puissances_2(valeurs[1 - 
287               i]).translate(sd))
288    if int(floor(log10(((valeurs[1 - i][0] * valeurs[1 - i][1]) * 1.) / 
289           valeurs[1 - i][2]))) != 0:
290        cor.append("\\[ \\thenocalcul = %s \\]" % tex_puissances_3(valeurs[1 - 
291                   i]).translate(sd))
292        cor.append("\\[ \\boxed{\\thenocalcul = %s} \\]" % 
293                   tex_puissances_4(valeurs[1 - i]).translate(sd))
294    exo.append("\\end{multicols}\n")
295    cor.append("\\end{multicols}\n")
296    return (exo, cor)
297
298exo_puissances.description = _(u'Puissances de 10')
299
300
301def tex_puissances_0(a):
302    if isinstance(a, tuple):
303        return '\\cfrac{\\nombre{%s} \\times 10^{%s} \\times \\nombre{%s} \\times 10^{%s}}{\\nombre{%s} \\times \\big( 10^{%s} \\big) ^%s}' % \
304            (a[0], a[3], a[1], a[4], a[2], a[5], a[6])
305
306
307def tex_puissances_1(a):
308    if isinstance(a, tuple):
309        if a[4] < 0:
310            return '\\cfrac{\\nombre{%s} \\times \\nombre{%s}}{\\nombre{%s}} \\times \\cfrac{10^{%s+(%s)}}{10^{%s \\times %s}}' % \
311                (a[0], a[1], a[2], a[3], a[4], a[5], a[6])
312        else:
313            return '\\cfrac{\\nombre{%s} \\times \\nombre{%s}}{\\nombre{%s}} \\times \\cfrac{10^{%s+%s}}{10^{%s \\times %s}}' % \
314                (a[0], a[1], a[2], a[3], a[4], a[5], a[6])
315
316
317def tex_puissances_2(a):
318    if isinstance(a, tuple):
319        if ((a[0] * a[1]) * 1.) / a[2] == (a[0] * a[1]) / a[2]:
320            if a[5] * a[6] < 0:
321                return '\\nombre{%s} \\times 10^{%s-(%s)}' % \
322                    verifie_type(((a[0] * a[1]) / a[2], a[3] + a[4], a[5] * 
323                                 a[6]))
324            else:
325                return '\\nombre{%s} \\times 10^{%s-%s}' % verifie_type(((a[0] * 
326                        a[1]) / a[2], a[3] + a[4], a[5] * a[6]))
327        else:
328            if a[5] * a[6] < 0:
329                return '\\nombre{%s} \\times 10^{%s-(%s)}' % \
330                    verifie_type((((a[0] * a[1]) * 1.) / a[2], a[3] + a[4],
331                                 a[5] * a[6]))
332            else:
333                return '\\nombre{%s} \\times 10^{%s-%s}' % verifie_type((((a[0] * 
334                        a[1]) * 1.) / a[2], a[3] + a[4], a[5] * a[6]))
335
336
337def tex_puissances_3(a):
338    from math import floor, log10
339    b = int(floor(log10(((a[0] * a[1]) * 1.) / a[2])))
340    if isinstance(a, tuple) and b != 0:
341        return '\\nombre{%s\\times 10^{%s} \\times 10^{%s}' % \
342            verifie_type(((((a[0] * a[1]) * 1.) / a[2]) / 10 ** b, b, (a[3] + 
343                         a[4]) - a[5] * a[6]))
344
345
346def tex_puissances_4(a):
347    from math import floor, log10
348    b = int(floor(log10(((a[0] * a[1]) * 1.) / a[2])))
349    if isinstance(a, tuple):
350        return '\\nombre{%s\\times 10^{%s}' % verifie_type(((((a[0] * 
351                a[1]) * 1.) / a[2]) / 10 ** b, (b + a[3] + a[4]) - a[5] * 
352                a[6]))
353
354
355def verifie_type(a):  # verifie si des nombres reels dans le tuple a sont en fait des nombres entiers et change leur type
356    liste = []
357    for i in range(len(a)):
358        if str(a[i]).endswith('.0'):
359            liste.append(int(a[i] + .1))
360        else:
361            liste.append(a[i])
362    return tuple(liste)
363
364
365def valeurs_puissances():  # renvoie un tuple contenant les valeurs pour les deux exercices sur les puissances
366    from math import floor, log10
367    (maxi, emax) = (10, 2)
368    while True:
369        (b1, b2) = (valeur_alea(2, maxi), valeur_alea(2, maxi))
370        (b1, b2) = (b1 / pgcd(b1, b2), b2 / pgcd(b1, b2))
371        if b1 != 1 and b2 != 1:
372            break
373    while True:
374        (n1, n2) = ((b1 * valeur_alea(2, maxi)) * 10 ** randrange(-emax,
375                    emax), (b2 * valeur_alea(2, maxi)) * 10 ** randrange(-emax,
376                    emax))
377        n3 = ((b1 * b2) * choice((2, 4, 5, 8))) * 10 ** randrange(-emax,
378                emax)
379        if int(floor(log10(((n1 * n2) * 1.) / n3))) != 0 and n1 != 1 and \
380            n2 != 1 and n3 != 1:
381            break
382    (e1, e2, e3, e4) = (valeur_alea(-10, 10), valeur_alea(-10, 10),
383                        valeur_alea(2, 10), valeur_alea(2, 5))
384    a = verifie_type((n1, n2, n3, e1, e2, e3, e4))
385    while True:
386        (b1, b2) = (valeur_alea(2, maxi), valeur_alea(2, maxi))
387        (b1, b2) = (b1 / pgcd(b1, b2), b2 / pgcd(b1, b2))
388        if b1 != 1 and b2 != 1:
389            break
390    (n1, n2) = ((b1 * valeur_alea(2, maxi)) * 10 ** randrange(-emax, emax + 
391                1), (b2 * valeur_alea(2, maxi)) * 10 ** randrange(-emax,
392                emax + 1))
393    n3 = ((b1 * b2) * choice((1, 2, 4, 5, 8))) * 10 ** randrange(-emax,
394            emax + 1)
395    (e1, e2, e3, e4) = (valeur_alea(-10, 10), valeur_alea(-10, 10),
396                        valeur_alea(-10, -2), valeur_alea(2, 5))
397    b = verifie_type((n1, n2, n3, e1, e2, e3, e4))
398    return (a, b)
Note: See TracBrowser for help on using the repository browser.