source: pyromaths/trunk/fuentes/src/pyromaths/ex/troisiemes/arithmetique.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: 12.7 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, factoriseTex, carrerise
25from pyromaths.outils.Affichage import decimaux
26from random import randint, shuffle
27
28premiers = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61,
29        67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139,
30        149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223,
31        227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293,
32        307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383,
33        389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463,
34        467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569,
35        571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647,
36        653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743,
37        751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839,
38        853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941,
39        947, 953, 967, 971, 977, 983, 991, 997]  # # Liste de longueur 168
40
41def Arithmetique():
42    """Exercice de décomposition de nombres en facteurs premiers, puis de
43    recherche du PGCD et du PPCM, et d'applications aux fractions"""
44
45    # ## Question 1
46    exo = ["\\exercice", '\\begin{enumerate}', u"\\item Donner la décomposition" + 
47            u" en facteurs premiers des nombres suivants, et préciser quand il" + 
48            u" s\'agit d\'un nombre premier :\\par"]
49    cor = ["\\exercice*", '\\begin{enumerate}', u"\\item Donner la décomposition"
50            + u" en facteurs premiers des nombres suivants, et préciser quand il"
51            + u" s\'agit d\'un nombre premier :\\par"]
52
53    prime = premiers[randint(10, 167)]
54
55    fauxpgcd = randint(1, 101)
56    fauxpgcdfactor = factoriseTex(fauxpgcd)[0]
57
58    complementaires = [randint(6, 50), randint(6, 50)]
59    pgcdcompl = pgcd(complementaires[0], complementaires[1])
60    pgcdcomplfact = factoriseTex(pgcdcompl)[0]
61
62    if pgcdcompl != 1:
63        facteurs = pgcdcomplfact + fauxpgcdfactor
64        facteurs.sort()
65    else:
66        facteurs = fauxpgcdfactor
67
68    autresnombres = [randint(51, 999), randint(51, 999)]
69
70    listenombres = [prime, complementaires[0] * fauxpgcd, complementaires[1] * 
71            fauxpgcd, ] + autresnombres
72    melange = [prime, complementaires[0] * fauxpgcd, complementaires[1] * 
73            fauxpgcd, ] + autresnombres
74    shuffle(melange)
75
76    exo.append(decimaux(melange[0]) + " ; " + decimaux(melange[1]) + " ; " + 
77            decimaux(melange[2]) + " ; " + decimaux(melange[3]) + " ; " + 
78            decimaux(melange[4]) + " ;")
79
80    cor.append("\\begin{multicols}{2}")
81
82    for i in range(5):
83        cor += factoriseTex(melange[i])[1]
84
85    cor.append("\\end{multicols}")
86
87    # ## Question 2
88    exo.append(u'\\item En déduire le PGCD et le PPCM des nombres ' + 
89            decimaux(listenombres[1]) + " et " + decimaux(listenombres[2]) + 
90            ".")
91    cor.append(u'\\item En déduire le PGCD et le PPCM des nombres ' + 
92            decimaux(listenombres[1]) + " et " + decimaux(listenombres[2]) + 
93            ".\\par")
94
95    cor.append(u"D'après la question 1), on sait que les nombres " + 
96            decimaux(listenombres[1]) + " et " + decimaux(listenombres[2]) + 
97            " ont comme facteurs premiers communs : ")
98
99    for j in range(len(facteurs)):
100        if j == 0:
101            temp = "$"
102        if j != len(facteurs) - 1:
103            temp += decimaux(facteurs[j]) + " , "
104        else:
105            temp += decimaux(facteurs[j]) + "$.\\par"
106    cor.append(temp)
107
108    cor.append(u"On en déduit que le PGCD des nombres " + 
109            decimaux(listenombres[1]) + " et " + decimaux(listenombres[2]) + 
110            " est : ")
111    temp = "$"
112    if len(facteurs) > 1:
113        for j in range(len(facteurs)):
114            if j != len(facteurs) - 1:
115                temp += decimaux(facteurs[j]) + " \\times "
116            else:
117                temp += decimaux(facteurs[j]) + " = "
118
119    temp += decimaux(fauxpgcd * pgcdcompl) + ".$\\par"
120    cor.append(temp)
121
122    vraippcm = (listenombres[1] * listenombres[2]) / (fauxpgcd * pgcdcompl)
123
124    if (listenombres[1] % listenombres[2] == 0):
125        cor.append(decimaux(listenombres[1]) + u" est un multiple de " + 
126              decimaux(listenombres[2]) + u", donc leur PPCM est directement "
127                 + decimaux(listenombres[1]) + ".")
128    elif (listenombres[2] % listenombres[1] == 0):
129        cor.append(decimaux(listenombres[2]) + u" est un multiple de " + 
130              decimaux(listenombres[1]) + u", donc leur PPCM est directement " + 
131              decimaux(listenombres[2]) + ".")
132    else:
133        cor.append(u"Il existe plusieurs méthodes pour calculer le PPCM de " + 
134              decimaux(listenombres[1]) + " et de " + decimaux(listenombres[2]) + 
135              ".\\par")
136        cor.append(u"En voici deux :")
137        cor.append("\\begin{enumerate}")
138
139        cor.append(u"\\item On peut simplement utiliser la formule :")
140        cor.append(u"$a \\times b = PGCD(a;~b) \\times PPCM(a;~b)$.\\par")
141        cor.append(u"Donc : $PPCM(" + decimaux(listenombres[1]) + ";~" + 
142          decimaux(listenombres[2]) + ") = " + "\\dfrac{" + 
143          decimaux(listenombres[1]) + "\\times" + decimaux(listenombres[2]) + "}{"
144          + decimaux(fauxpgcd * pgcdcompl) + "} = " + decimaux(vraippcm) + 
145          ".$")
146
147        cor.append(u"\\item On peut aussi multiplier un nombre par les \"facteurs "
148          + u"complémentaires\" de l'autre.\n" + u"Ces \"facteurs " + 
149          u"complémentaires\" sont les facteurs qui complètent le PGCD pour " + 
150          u"former le nombre.\\par")
151
152        temp = u"Comme $PGCD(" + decimaux(listenombres[1]) + ";~" + \
153              decimaux(listenombres[2]) + ") = " + decimaux(fauxpgcd * pgcdcompl)
154
155        if len(facteurs) > 1:
156            temp += " = "
157            for j in range(len(facteurs)):
158                if j != len(facteurs) - 1:
159                    temp += decimaux(facteurs[j]) + " \\times "
160                else:
161                    temp += decimaux(facteurs[j])
162
163        factornb1 = factoriseTex(listenombres[1])[0]
164
165        if len(factornb1) > 1:
166            textcompl = u"$, alors les \"facteurs complémentaires\" de $"
167        else:
168            textcompl = u"$, alors le \"facteur complémentaire\" de $"
169
170        temp += textcompl + decimaux(listenombres[1]) + " = "
171
172        for j in range(len(factornb1)):
173            if j != len(factornb1) - 1:
174                temp += decimaux(factornb1[j]) + " \\times "
175            else:
176                temp += decimaux(factornb1[j])
177
178        factcompl = factoriseTex(listenombres[1] / (fauxpgcd * pgcdcompl))[0]
179
180        if len(factcompl) == 1:
181            temp += u"$ est : "
182        else:
183            temp += u"$ sont : "
184        for j in range(len(factcompl)):
185            if j != len(factcompl) - 1:
186                temp += decimaux(factcompl[j]) + " , "
187            else:
188                temp += decimaux(factcompl[j]) + ".\n"
189        temp += u"On en déduit que $PPCM(" + decimaux(listenombres[1]) + ";~" + \
190              decimaux(listenombres[2]) + ") = " + decimaux(listenombres[2]) + \
191              " \\times "
192
193        for j in range(len(factcompl)):
194            if j != len(factcompl) - 1:
195                temp += decimaux(factcompl[j]) + " \\times "
196            else:
197                temp += decimaux(factcompl[j]) + " = "
198        temp += decimaux(vraippcm) + ".$"
199        cor.append(temp)
200        cor.append("\\end{enumerate}")
201
202    # ## Question 3
203
204    exo.append(u"\\item Quel est le plus petit nombre par lequel il faut " + 
205            u"multiplier " + decimaux(autresnombres[0]) + 
206            u" pour obtenir un carré parfait ?")
207
208    cor.append(u" \\item Pour obtenir un carré parfait, il faut que sa " + 
209            u"décomposition en facteurs premiers ne contienne que des facteurs "
210            + u"apparaissant un nombre pair de fois. D'après la question 1, " + 
211            u"la décomposition en facteurs premiers de "
212            + decimaux(autresnombres[0]))
213
214    decompautre = factoriseTex(autresnombres[0])[1]
215
216    if len(decompautre) == 1:
217        cor.append(u" est lui-même, car c'est un nombre premier.")
218    else:
219        cor.append(" est : \\par\n$" + decimaux(autresnombres[0]) + " = " + 
220              decompautre[-2][5:-2] + ".$\\par")
221
222    cor.append(u"Il faut donc encore multiplier ce nombre par ")
223
224    carre = carrerise(autresnombres[0])
225    factsup = factoriseTex(carre)[0]
226
227    if len(factsup) == 1:
228        cor.append(" le facteur ")
229    else:
230        cor.append(" les facteurs ")
231
232    for j in range(len(factsup)):
233        if (j != len(factsup) - 1) and (j != len(factsup) - 2):
234            cor.append(decimaux(factsup[j]) + " , ")
235        elif (j == len(factsup) - 2):
236            cor.append(decimaux(factsup[j]) + " et ")
237        else:
238            cor.append(decimaux(factsup[j]) + ".\\par")
239
240    cor.append(u"Le nombre cherché est par conséquent " + decimaux(carre) + 
241            u" et le carré parfait obtenu est " + decimaux(carre * 
242                autresnombres[0]) + ".")
243
244    # ## Question 4
245    exo.append(u"\\item Rendre la fraction $\\dfrac{" + decimaux(listenombres[1])
246            + "}{" + decimaux(listenombres[2]) + u"}$ irréductible.")
247
248    cor.append(u"\\item Le moyen le plus rapide de simplifier cette fraction est"
249            + u"de diviser le numérateur et le dénominateur par leur PGCD." + 
250            u" D'après la question 2),  PGCD(" + decimaux(listenombres[1]) + ";~"
251            + decimaux(listenombres[2]) + ") = "
252            + decimaux(fauxpgcd * pgcdcompl) + ", donc on obtient :\\par")
253    cor.append(u"$\dfrac{" + decimaux(listenombres[1]) + "{\\scriptstyle \\div " + 
254            decimaux(fauxpgcd * pgcdcompl) + "}}{" + decimaux(listenombres[2]) + 
255            "{\\scriptstyle \\div " + decimaux(fauxpgcd * pgcdcompl) + 
256            "}} = \dfrac{" + decimaux(listenombres[1] / (fauxpgcd * pgcdcompl)) + 
257            "}{" + decimaux(listenombres[2] / (fauxpgcd * pgcdcompl)) + "}.$")
258
259    # ## Question 5
260
261    num = [randint(6, 50), randint(6, 50)]
262    exo.append(u"\\item Calculer $\\dfrac{" + decimaux(num[0]) + "}{" + 
263            decimaux(listenombres[1]) + "} + \\dfrac{" + decimaux(num[1]) + "}{" + 
264            decimaux(listenombres[2]) + "}$.")
265
266    mult1 = vraippcm / listenombres[1]
267    mult2 = vraippcm / listenombres[2]
268
269    num1 = mult1 * num[0]
270    num2 = mult2 * num[1]
271
272    simplfin = pgcd(num1 + num2, vraippcm)
273
274    if simplfin != 1:
275        simpl = "{\\scriptstyle \\div " + decimaux(simplfin) + "}"
276        result = " = \\dfrac{" + decimaux((num1 + num2) / simplfin) + "}{" + \
277              decimaux((vraippcm) / simplfin) + "}"
278    else:
279        simpl = ""
280        result = ""
281
282    cor.append(u"\\item Il faut mettre les fractions au même dénominateur. Grâce"
283            + u"à la question 2), nous avons déjà un dénominateur commun : " + 
284            u"le PPCM des nombres " + decimaux(listenombres[1]) + " et " + 
285            decimaux(listenombres[2]) + u", qui est par définition le plus petit"
286            + u"multiple commun de ces deux nombres.\\par")
287    cor.append(u"$\\dfrac{" + decimaux(num[0]) + "{\\scriptstyle \\times " + 
288            decimaux(mult1) + "}}{" + decimaux(listenombres[1]) + 
289            "{\\scriptstyle \\times " + decimaux(mult1) + "}} + \\dfrac{" + 
290            decimaux(num[1]) + "{\\scriptstyle \\times " + decimaux(mult2) + "}}{"
291            + decimaux(listenombres[2]) + "{\\scriptstyle \\times " + 
292            decimaux(mult2) + "}} = \\dfrac{" + decimaux(num1) + "}{" + 
293            decimaux(vraippcm) + "} + \\dfrac{" + decimaux(num2) + "}{" + 
294            decimaux(vraippcm) + "} = \\dfrac{" + decimaux(num1 + num2) + simpl + 
295            "}{" + decimaux(vraippcm) + simpl + "}" + result + ".$")
296
297    exo.append("\\end{enumerate}")
298    cor.append("\\end{enumerate}")
299
300    return (exo, cor)
301
302Arithmetique.description = u'Arithmétique'
Note: See TracBrowser for help on using the repository browser.