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 | |
---|
24 | from pyromaths.outils.Arithmetique import pgcd, factoriseTex, carrerise |
---|
25 | from pyromaths.outils.Affichage import decimaux |
---|
26 | from random import randint, shuffle |
---|
27 | |
---|
28 | premiers = [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 | |
---|
41 | def 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 | |
---|
302 | Arithmetique.description = u'Arithmétique' |
---|