#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Pyromaths
# Un programme en Python qui permet de créer des fiches d'exercices types de
# mathématiques niveau collège ainsi que leur corrigé en LaTeX.
# Copyright (C) 2006 -- Jérôme Ortais (jerome.ortais@pyromaths.org)
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
from ..outils.Arithmetique import pgcd, ppcm, premier, factoriseTex, carrerise
from ..outils.Affichage import decimaux, decimaux_quiz
from random import randint, shuffle
premiers = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61,
67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139,
149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223,
227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293,
307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383,
389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463,
467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569,
571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647,
653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743,
751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839,
853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941,
947, 953, 967, 971, 977, 983, 991, 997] ## Liste de longueur 168
def Arithmetique():
"""Exercice de décomposition de nombres en facteurs premiers, puis de
recherche du PGCD et du PPCM, et d'applications aux fractions"""
quiz = []
### Question 1
exo = ["\\exercice", '\\begin{enumerate}', _(u"\\item Donner la décomposition") +
_(u" en facteurs premiers des nombres suivants, et préciser quand il") +
_(u" s\'agit d\'un nombre premier :\\par")]
cor = ["\\exercice*", '\\begin{enumerate}', _(u"\\item Donner la décomposition")
+ _(u" en facteurs premiers des nombres suivants, et préciser quand il")
+ _(u" s\'agit d\'un nombre premier :\\par")]
prime = premiers[randint(10,167)]
fauxpgcd = randint(1,101)
fauxpgcdfactor = factoriseTex(fauxpgcd)[0]
complementaires = [randint(6,50), randint(6,50)]
pgcdcompl = pgcd(complementaires[0], complementaires[1])
pgcdcomplfact = factoriseTex(pgcdcompl)[0]
if pgcdcompl != 1:
facteurs = pgcdcomplfact + fauxpgcdfactor
facteurs.sort()
else:
facteurs = fauxpgcdfactor
autresnombres = [randint(51,999), randint(51,999)]
listenombres = [prime, complementaires[0] * fauxpgcd, complementaires[1] *
fauxpgcd, ] + autresnombres
melange = [prime, complementaires[0] * fauxpgcd, complementaires[1] *
fauxpgcd, ] + autresnombres
shuffle(melange)
exo.append(decimaux(melange[0]) + " ; " + decimaux(melange[1]) + " ; " +
decimaux(melange[2]) + " ; " + decimaux(melange[3]) + " ; " +
decimaux(melange[4]))
quiz_nom = _(u"PGCD et PPCM: Factoriser")
quiz_exo = _(u"Écrit la décomposition en facteurs premiers des suivants ")
quiz_exo += _(u"numéros, et indique quand se traite d'un numéro premier:
\n")
quiz_exo += _(u"(les facteurs dois les écrire de mineur à majeur)
\n")
cor.append("\\begin{multicols}{2}")
for i in range(5):
cor += factoriseTex(melange[i])[1]
if len(factoriseTex(melange[i])[2]) > 1:
text_primes = _(u"~=ne~si")
else:
text_primes = _(u"~=si~ne")
quiz_exo += (_(u"$$%s$$ {1:MULTICHOICE:%s} est premier et est $$%s =$$ ") %
(decimaux_quiz(melange[i]), text_primes, decimaux_quiz(melange[i])))
for j in range(len(factoriseTex(melange[i])[2])):
if j != len(factoriseTex(melange[i])[2])-1:
quiz_exo += (u"{1:NUMERICAL:=%s}{1:NUMERICAL:=%s}$$\\cdot$$" %
tuple(factoriseTex(melange[i])[2][j]))
else:
quiz_exo += (u"{1:NUMERICAL:=%s}{1:NUMERICAL:=%s}
" %
tuple(factoriseTex(melange[i])[2][j]))
cor.append("\\end{multicols}")
quiz.append([u"cloze", [quiz_nom, quiz_exo, ""]])
### Question 2
exo.append(_(u'\\item En déduire le PGCD et le PPCM des nombres ') +
decimaux(listenombres[1]) + _(u" et ") + decimaux(listenombres[2]) +
".")
cor.append(_(u'\\item En déduire le PGCD et le PPCM des nombres ') +
decimaux(listenombres[1]) + _(u" et ") + decimaux(listenombres[2]) +
".\\par")
cor.append(_(u"D'après la question 1), on sait que les nombres ") +
decimaux(listenombres[1]) + _(u" et ") + decimaux(listenombres[2]) +
_(u" ont comme facteurs premiers communs : "))
quiz_nom = _(u"PGCD et PPCM: Calcul")
quiz_exo = (_(u"En déduire le PGCD et le PPCM des nombres ") +
decimaux_quiz(listenombres[1]) + _(" et ")
+ decimaux_quiz(listenombres[2]) + ".
\n")
for j in range(len(facteurs)):
if j == 0:
temp = "$"
if j != len(facteurs)-1:
temp += decimaux(facteurs[j]) + " , "
else:
temp += decimaux(facteurs[j]) + "$.\\par"
cor.append(temp)
cor.append(_(u"On en déduit que le PGCD des nombres ") +
decimaux(listenombres[1]) + _(u" et ") + decimaux(listenombres[2]) +
_(u" est : "))
temp = "$"
if len(facteurs) > 1:
for j in range(len(facteurs)):
if j != len(facteurs)-1:
temp += decimaux(facteurs[j]) + _(" \\times ")
else:
temp += decimaux(facteurs[j]) + " = "
temp+= decimaux(fauxpgcd * pgcdcompl) + ".$\\par"
cor.append(temp)
quiz_exo += (_(u"$$PGCD(%s\\, et\\, %s) = $${1:NUMERICAL:=%s}
\n") %
(decimaux_quiz(listenombres[1]), decimaux_quiz(listenombres[2]),
decimaux_quiz(fauxpgcd * pgcdcompl)))
vraippcm = (listenombres[1] * listenombres[2]) / (fauxpgcd * pgcdcompl)
if (listenombres[1] % listenombres[2] == 0):
cor.append(decimaux(listenombres[1]) + _(u" est un multiple de ") +
decimaux(listenombres[2]) + _(u", donc leur PPCM est directement ")
+ decimaux(listenombres[1]) + ".")
elif (listenombres[2] % listenombres[1] == 0):
cor.append(decimaux(listenombres[2]) + _(u" est un multiple de ") +
decimaux(listenombres[1]) + _(u", donc leur PPCM est directement ") +
decimaux(listenombres[2]) + ".")
else:
cor.append(_(u"Il existe plusieurs méthodes pour calculer le PPCM de ") +
decimaux(listenombres[1]) + _(u" et de ") + decimaux(listenombres[2]) +
".\\par" )
cor.append(_(u"En voici deux :"))
cor.append("\\begin{enumerate}")
cor.append(_(u"\\item On peut simplement utiliser la formule :"))
cor.append(_(u"$a \\times b = PGCD(a;~b) \\times PPCM(a;~b)$.\\par"))
cor.append(_(u"Donc : $PPCM(") + decimaux(listenombres[1]) + ";~" +
decimaux(listenombres[2]) + ") = " + "\\dfrac{" +
decimaux(listenombres[1]) + _("\\times") + decimaux(listenombres[2]) + "}{"
+ decimaux(fauxpgcd * pgcdcompl) + "} = " + decimaux(vraippcm) +
".$")
cor.append(_(u"\\item On peut aussi multiplier un nombre par les \"facteurs ")
+ _(u"complémentaires\" de l'autre.\n") + _(u"Ces \"facteurs ") +
_(u"complémentaires\" sont les facteurs qui complètent le PGCD pour ") +
_(u"former le nombre.\\par"))
temp = _(u"Comme $PGCD(") + decimaux(listenombres[1]) + ";~" +\
decimaux(listenombres[2]) + ") = " + decimaux(fauxpgcd * pgcdcompl)
if len(facteurs) > 1:
temp += " = "
for j in range(len(facteurs)):
if j != len(facteurs)-1:
temp += decimaux(facteurs[j]) + _(" \\times ")
else:
temp += decimaux(facteurs[j])
factornb1 = factoriseTex(listenombres[1])[0]
if len(factornb1) > 1:
textcompl = _(u"$, alors les \"facteurs complémentaires\" de $")
else:
textcompl = _(u"$, alors le \"facteur complémentaire\" de $")
temp += textcompl + decimaux(listenombres[1]) + " = "
for j in range(len(factornb1)):
if j != len(factornb1)-1:
temp += decimaux(factornb1[j]) + _(" \\times ")
else:
temp += decimaux(factornb1[j])
factcompl = factoriseTex(listenombres[1] / (fauxpgcd * pgcdcompl))[0]
if len(factcompl) == 1:
temp += _(u"$ est : ")
else:
temp += _(u"$ sont : ")
for j in range(len(factcompl)):
if j != len(factcompl)-1:
temp += decimaux(factcompl[j]) + " , "
else:
temp += decimaux(factcompl[j]) + ".\n"
temp += _(u"On en déduit que $PPCM(") + decimaux(listenombres[1]) + ";~" +\
decimaux(listenombres[2]) + ") = " + decimaux(listenombres[2]) +\
_(" \\times ")
for j in range(len(factcompl)):
if j != len(factcompl)-1:
temp += decimaux(factcompl[j]) + _(" \\times ")
else:
temp += decimaux(factcompl[j]) + " = "
temp += decimaux(vraippcm) + ".$"
cor.append(temp)
cor.append("\\end{enumerate}")
quiz_exo += (_(u"$$PPCM(%s\\, et\\, %s) = $${1:NUMERICAL:=%s}") %
(decimaux_quiz(listenombres[1]), decimaux_quiz(listenombres[2]),
decimaux_quiz(vraippcm)))
quiz.append([u"cloze", [quiz_nom, quiz_exo, ""]])
### Question 3
exo.append(_(u"\\item Quel est le plus petit nombre par lequel il faut ") +
_(u"multiplier ") + decimaux(autresnombres[0]) +
_(u" pour obtenir un carré parfait ?"))
cor.append(_(u" \\item Pour obtenir un carré parfait, il faut que sa ") +
_(u"décomposition en facteurs premiers ne contienne que des facteurs ")
+ _(u"apparaissant un nombre pair de fois. D'après la question 1, ") +
_(u"la décomposition en facteurs premiers de ")
+ decimaux(autresnombres[0]))
quiz_nom = _(u"PGCD et PPCM: Carré Parfait")
quiz_exo = (_(u"Quel est le mineur numéro par le qu'il est nécessaire ") +
_(u"multiplier ") + decimaux_quiz(autresnombres[0]) +
_(u" pour obtenir un carré parfait?")+" _____ ")
decompautre = factoriseTex(autresnombres[0])[1]
if len(decompautre) == 1:
cor.append(_(u" est lui-même, car c'est un nombre premier."))
else:
cor.append(_(u" est : \\par\n$") + decimaux(autresnombres[0]) + " = " +
decompautre[-2][5:-2] + ".$\\par")
cor.append(_(u"Il faut donc encore multiplier ce nombre par "))
carre = carrerise(autresnombres[0])
factsup = factoriseTex(carre)[0]
if len(factsup)==1:
cor.append(_(u" le facteur "))
else:
cor.append(_(u" les facteurs "))
for j in range(len(factsup)):
if (j != len(factsup)-1) and (j != len(factsup)-2):
cor.append(decimaux(factsup[j]) + " , ")
elif (j == len(factsup)-2):
cor.append(decimaux(factsup[j]) + _(u" et "))
else:
cor.append(decimaux(factsup[j]) + ".\\par")
cor.append(_(u"Le nombre cherché est par conséquent ") + decimaux(carre) +
_(u" et le carré parfait obtenu est ") + decimaux(carre *
autresnombres[0]) + ".")
quiz_cor = decimaux_quiz(carre,1)
quiz.append([u"numerical", [quiz_nom, quiz_exo, quiz_cor]])
### Question 4
exo.append(_(u"\\item Rendre la fraction $\\dfrac{") + decimaux(listenombres[1])
+ "}{" + decimaux(listenombres[2]) + _(u"}$ irréductible."))
quiz_nom = _(u"PGCD et PPCM: Simplification")
quiz_exo = (_(u"Simplifie la fraction $$\\frac{") + decimaux_quiz(listenombres[1])
+ "}{" + decimaux_quiz(listenombres[2]) + _(u"}$$ à son irréductible.\n"))
quiz_exo += (_(u"Réponse: $$\\frac{") + decimaux_quiz(listenombres[1])
+ "}{" + decimaux_quiz(listenombres[2]) + u"}=$$ _____ \n")
quiz_exo += _(u"(Utilise la barre \"/\" pour écrire la fraction)")
cor.append(_(u"\\item Le moyen le plus rapide de simplifier cette fraction est")
+ _(u"de diviser le numérateur et le dénominateur par leur PGCD.") +
_(u" D'après la question 2), PGCD(") + decimaux(listenombres[1]) + ";~"
+ decimaux(listenombres[2]) + ") = "
+ decimaux(fauxpgcd * pgcdcompl) + _(u", donc on obtient :\\par"))
cor.append(u"$\dfrac{" + decimaux(listenombres[1]) + _("{\\scriptstyle \\div ") +
decimaux(fauxpgcd * pgcdcompl) + "}}{" + decimaux(listenombres[2]) +
_("{\\scriptstyle \\div ") + decimaux(fauxpgcd * pgcdcompl) +
"}} = \dfrac{" + decimaux(listenombres[1] / (fauxpgcd * pgcdcompl)) +
"}{" + decimaux(listenombres[2] / (fauxpgcd * pgcdcompl)) + "}.$")
quiz_cor = (decimaux_quiz(listenombres[1] / (fauxpgcd * pgcdcompl)) + "/" +
decimaux_quiz(listenombres[2] / (fauxpgcd * pgcdcompl)))
quiz.append([u"shortanswer", [quiz_nom, quiz_exo, quiz_cor]])
### Question 5
num = [randint(6,50), randint(6,50)]
exo.append(_(u"\\item Calculer $\\dfrac{") + decimaux(num[0]) + "}{" +
decimaux(listenombres[1]) + "} + \\dfrac{" + decimaux(num[1]) + "}{" +
decimaux(listenombres[2]) + "}$.")
quiz_nom = _(u"PGCD et PPCM: Somme")
quiz_exo = (_(u"Calcule et simplifie: $$\\frac{") + decimaux_quiz(num[0]) + "}{" +
decimaux_quiz(listenombres[1]) + "} + \\frac{" + decimaux_quiz(num[1]) + "}{" +
decimaux_quiz(listenombres[2]) + "}=$$ _____ \n")
quiz_exo += _(u"(Utilise la barre \"/\" pour écrire la fraction)")
mult1 = vraippcm / listenombres[1]
mult2 = vraippcm / listenombres[2]
num1 = mult1 * num[0]
num2 = mult2 * num[1]
simplfin = pgcd(num1+num2,vraippcm)
if simplfin != 1:
simpl = _("{\\scriptstyle \\div ") + decimaux(simplfin) + "}"
result = " = \\dfrac{" + decimaux((num1+num2)/simplfin) + "}{" + \
decimaux((vraippcm)/simplfin) + "}"
quiz_cor = (decimaux_quiz((num1+num2)/simplfin) + "/" +
decimaux_quiz((vraippcm)/simplfin))
else:
simpl = ""
result = ""
cor.append(_(u"\\item Il faut mettre les fractions au même dénominateur. Grâce")
+ _(u"à la question 2), nous avons déjà un dénominateur commun : ") +
_(u"le PPCM des nombres ") + decimaux(listenombres[1]) + _(u" et ") +
decimaux(listenombres[2]) + _(u", qui est par définition le plus petit")
+ _(u"multiple commun de ces deux nombres.\\par"))
cor.append(u"$\\dfrac{" + decimaux(num[0]) + _("{\\scriptstyle \\times ") +
decimaux(mult1) + "}}{" + decimaux(listenombres[1]) +
_("{\\scriptstyle \\times ") + decimaux(mult1) + "}} + \\dfrac{" +
decimaux(num[1]) + _("{\\scriptstyle \\times ") + decimaux(mult2) + "}}{"
+ decimaux(listenombres[2]) + _("{\\scriptstyle \\times ") +
decimaux(mult2) + "}} = \\dfrac{" + decimaux(num1) + "}{" +
decimaux(vraippcm) + "} + \\dfrac{" + decimaux(num2) + "}{" +
decimaux(vraippcm) + "} = \\dfrac{" + decimaux(num1+num2) + simpl +
"}{" + decimaux(vraippcm) + simpl + "}" + result + ".$")
exo.append("\\end{enumerate}")
cor.append("\\end{enumerate}")
quiz.append([u"shortanswer", [quiz_nom, quiz_exo, quiz_cor]])
return (exo,cor,quiz)