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 | import random |
---|
25 | |
---|
26 | # |
---|
27 | # ------------------- PGCD ------------------- |
---|
28 | |
---|
29 | |
---|
30 | def tex_trouve_diviseur(a): # trouve si les nombres dans le tuple a sont divisible par 10, 2, 5, 9 ou 3 (dans cet ordre) |
---|
31 | if a[0] % 10 == 0 and a[1] % 10 == 0: |
---|
32 | return '\\nombre{' + str(a[0]) + _(u'} et \\nombre{') + str(a[1]) + \ |
---|
33 | _(u'} se terminent tous les deux par zéro donc ils sont divisibles par 10.\\par\n') + \ |
---|
34 | '\\nombre{' + str(a[0]) + _(u'} et \\nombre{') + str(a[1]) + \ |
---|
35 | _(u'} ne sont donc pas premiers entre eux') |
---|
36 | elif a[0] % 2 == 0 and a[1] % 2 == 0: |
---|
37 | return '\\nombre{' + str(a[0]) + _(u'} et \\nombre{') + str(a[1]) + \ |
---|
38 | _(u'} sont deux nombres pairs donc ils sont divisibles par 2.\\par\n') + \ |
---|
39 | '\\nombre{' + str(a[0]) + _(u'} et \\nombre{') + str(a[1]) + \ |
---|
40 | _(u'} ne sont donc pas premiers entre eux') |
---|
41 | elif a[0] % 5 == 0 and a[1] % 5 == 0: |
---|
42 | return '\\nombre{' + str(a[0]) + _(u'} et \\nombre{') + str(a[1]) + \ |
---|
43 | _(u'} se terminent tous les deux par zéro ou cinq donc ils sont divisibles par 5.\\par\n') + \ |
---|
44 | '\\nombre{' + str(a[0]) + _(u'} et \\nombre{') + str(a[1]) + \ |
---|
45 | _(u'} ne sont donc pas premiers entre eux') |
---|
46 | elif a[0] % 9 == 0 and a[1] % 9 == 0: |
---|
47 | return _(u'La somme des chiffres de \\nombre{') + str(a[0]) + \ |
---|
48 | _(u'} et celle de \\nombre{') + str(a[1]) + \ |
---|
49 | _(u'} sont divisibles par neuf donc ils sont divisibles par 9.\\par\n') + \ |
---|
50 | '\\nombre{' + str(a[0]) + _(u'} et \\nombre{') + str(a[1]) + \ |
---|
51 | _(u'} ne sont donc pas premiers entre eux') |
---|
52 | elif a[0] % 3 == 0 and a[1] % 3 == 0: |
---|
53 | return _(u'La somme des chiffres de \\nombre{') + str(a[0]) + \ |
---|
54 | _(u'} et celle de \\nombre{') + str(a[1]) + \ |
---|
55 | '} sont divisibles par trois donc ils sont divisibles par 3.\\par\n' + \ |
---|
56 | '\\nombre{' + str(a[0]) + _(u'} et \\nombre{') + str(a[1]) + \ |
---|
57 | _(u'} ne sont donc pas premiers entre eux') |
---|
58 | |
---|
59 | |
---|
60 | def valeurs_pgcd(): # creer un tuple contenant les deux nombres dont on cherche le pgcd |
---|
61 | reste = random.choice((2, 3, 5, 9, 10)) * random.choice((7, 11, 13, |
---|
62 | 17, 19, 23, 31)) |
---|
63 | diviseur = reste * random.randrange(1, 10) |
---|
64 | for dummy in range(random.randrange(2, 5)): |
---|
65 | (diviseur, reste) = (diviseur * random.randrange(1, 10) + reste, |
---|
66 | diviseur) |
---|
67 | return (diviseur, reste) |
---|
68 | |
---|
69 | |
---|
70 | def algo_euclide(a): # renvoi une liste contenant (dividende,diviseur,quotient,reste) pour chaque etape |
---|
71 | liste = [] |
---|
72 | if a[0] > a[1]: |
---|
73 | (dividende, diviseur) = (a[0], a[1]) |
---|
74 | else: |
---|
75 | (dividende, diviseur) = (a[1], a[0]) |
---|
76 | (quotient, reste) = (dividende // diviseur, dividende % diviseur) |
---|
77 | liste.append((dividende, diviseur, quotient, reste)) |
---|
78 | while reste != 0: |
---|
79 | (dividende, diviseur) = (diviseur, reste) |
---|
80 | (quotient, reste) = (dividende // diviseur, dividende % diviseur) |
---|
81 | liste.append((dividende, diviseur, quotient, reste)) |
---|
82 | return liste |
---|
83 | |
---|
84 | |
---|
85 | def simplifie_fraction_pgcd(l): # renvoie le nombre par lequel on peut simplifier la fraction et la fraction simplifiée |
---|
86 | (pgcd, n0, d0) = (l[len(l) - 1][1], l[0][0], l[0][1]) |
---|
87 | (n1, d1) = (l[0][0] // pgcd, l[0][1] // pgcd) |
---|
88 | return (n0, d0, n0, pgcd, d0, pgcd, n1, d1) |
---|
89 | |
---|
90 | |
---|
91 | def tex_algo_euclide(l): # renvoie l'ecriture au format tex de l'algorithme d'Euclide |
---|
92 | lignes = [] |
---|
93 | for i in range(len(l)): |
---|
94 | lignes.append(_('\\nombre{%s}=\\nombre{%s}\\times\\nombre{%s}+\\nombre{%s}') % |
---|
95 | l[i]) |
---|
96 | lignes.append(_(u'\\fbox{Donc le \\textsc{pgcd} de \\nombre{%s} et \\nombre{%s} est %s}.\n') % |
---|
97 | (l[0][0], l[0][1], l[len(l) - 1][1])) |
---|
98 | return lignes |
---|
99 | |
---|
100 | |
---|
101 | def tex_simplifie_fraction_pgcd(a): # renvoie l'ecriture au format tex de la simplification de la fraction |
---|
102 | return _('''\\begin{align*} |
---|
103 | \\cfrac{\\nombre{%s}}{\\nombre{%s}} &= \\cfrac{\\nombre{%s}\\div%s}{\\nombre{%s}\\div%s}\\\\\n &= \\boxed{\\cfrac{\\nombre{%s}}{\\nombre{%s}}} |
---|
104 | \\end{align*}''') % a |
---|
105 | |
---|
106 | def tex_pgcd(): |
---|
107 | nombres = valeurs_pgcd() |
---|
108 | exo = ['\\exercice'] |
---|
109 | exo.append('\\begin{enumerate}') |
---|
110 | exo.append(_(u'\\item Les nombres \\nombre{%s} et \\nombre{%s} sont-ils premiers entre eux ? ') % nombres) |
---|
111 | exo.append(_(u'\\item Calculer le plus grand commun diviseur (\\textsc{pgcd}) de \\nombre{%s} et \\nombre{%s}.') % nombres) |
---|
112 | exo.append(_(u'\\item Simplifier la fraction $\\cfrac{\\nombre{%s}}{\\nombre{%s}}$ pour la rendre irréductible en indiquant la méthode.\n') % nombres) |
---|
113 | exo.append('\\end{enumerate}') |
---|
114 | cor = ['\\exercice*'] |
---|
115 | cor.append('\\begin{enumerate}') |
---|
116 | cor.append(_(u'\\item Les nombres \\nombre{%s} et \\nombre{%s} sont-ils premiers entre eux ?\\par ') % nombres) |
---|
117 | cor.append(tex_trouve_diviseur(nombres)) |
---|
118 | cor.append(_(u'\\item Calculer le plus grand commun diviseur (\\textsc{pgcd}) de \\nombre{%s} et \\nombre{%s}.\\par') % nombres) |
---|
119 | cor.append(_(u'On calcule le \\textsc{pgcd} des nombres \\nombre{%s} et \\nombre{%s} en utilisant l\'algorithme d\'Euclide.') % nombres) |
---|
120 | l = algo_euclide(nombres) |
---|
121 | tex_liste = tex_algo_euclide(l) |
---|
122 | for i in range(len(l)): |
---|
123 | cor.append(u'\\[ %s' % tex_liste[i] + '\\] ') |
---|
124 | cor.append(tex_liste[len(l)]) |
---|
125 | cor.append(_(u'\\item Simplifier la fraction $\\cfrac{\\nombre{%s}}{\\nombre{%s}}$ pour la rendre irréductible en indiquant la méthode.') % nombres) |
---|
126 | cor.append(tex_simplifie_fraction_pgcd(simplifie_fraction_pgcd(l))) |
---|
127 | cor.append('\\end{enumerate}') |
---|
128 | return (exo, cor) |
---|
129 | |
---|
130 | tex_pgcd.description = _(u'PGCD') |
---|