source: pyromaths/trunk/fuentes/src/pyromaths/ex/troisiemes/pgcd.py @ 1624

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

Fix i18n in troisiemes ex

File size: 6.4 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
24import random
25
26#
27# ------------------- PGCD -------------------
28
29
30def 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
60def 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
70def 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
85def 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
91def 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
101def 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
106def 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
130tex_pgcd.description = _(u'PGCD')
Note: See TracBrowser for help on using the repository browser.