Mathématiques avec Python et Ruby/Systèmes congruentiels en Python
Rallye mathématique de la Réunion
[modifier | modifier le wikicode]Sujet 2005, Exercice 2
[modifier | modifier le wikicode]On demande combien d'élèves il y a au total.
On peut utiliser une boucle avec plein de tests pour détecter les solutions mais aussi les ensembles. C'est ce qu'on va faire ici.
Construction de l'ensemble 2 par 2
[modifier | modifier le wikicode]On commence par construire la liste des nombres entre 2800 et 2900 tels que 2 par 2, il en reste 1: Ces nombres constituent une suite arithmétique de raison 2.
s2=[n for n in range(2800,2900) if n%2==1]
print(len(s2))
À ce stade, il y a beaucoup de candidats possibles:
{2817, 2819, 2821, 2823, 2825, 2827, 2829, 2831, 2833, 2835, 2837, 2839, 2841, 2843, 2845, 2847, 2849, 2851, 2853, 2855, 2857, 2859, 2861, 2863, 2865, 2867, 2869, 2871, 2873, 2875, 2877, 2879, 2881, 2883, 2885, 2887, 2889, 2891, 2893, 2895, 2897, 2899, 2801, 2803, 2805, 2807, 2809, 2811, 2813, 2815}
Épuration 3 par 3
[modifier | modifier le wikicode]Maintenant on va construire un ensemble analogue s3 pour les nombres tels que, 3 par 3, il en reste 1, choisis parmi les nombres de s2:
s3=[n for n in s2 if n%3==1]
print(s3)
Il en reste déjà moins:
{2881, 2851, 2821, 2887, 2857, 2827, 2893, 2863, 2833, 2899, 2869, 2803, 2839, 2809, 2875, 2845, 2815}
Cas du nombre 4
[modifier | modifier le wikicode]Cette fois-ci, dans s4 on met les nombres précédents tels que pris 4 par 4, il en reste 1:
s4=[n for n in s3 if n%4==1]
print(s4)
{2881, 2821, 2857, 2893, 2833, 2869, 2809, 2845}
Ça se précise!
Avec 5
[modifier | modifier le wikicode]Maintenant on va de 5 en 5:
s5=[n for n in s4 if n%5==1]
print(s5)
{2881, 2821}
Il ne reste que deux nombres à tester!
Avec 6
[modifier | modifier le wikicode]On pourrait les tester l'un après l'autre, mais aussi faire pareil qu'avant (on y prend goût !):
s6=[n for n in s5 if n%6==1]
print(s6==s5)
Aucun changement, toujours deux solutions:
{2881, 2821}
Dernière étape
[modifier | modifier le wikicode]Autant continuer sur la même voie:
solutions=[n for n in s6 if n%7==0]
print(solutions)
Ce qui donne la réponse (on constate qu'elle est unique) à la question de l'énoncé.
Sujet 2007, Exercice 3
[modifier | modifier le wikicode]Ce soir, veille de marché, il est perplexe.
• S’il met ses œufs dans des emballages de 6, il en reste 2.
• S’il utilise des emballages de 10, il en reste encore 2.
• Il me faudrait, dit-il, des emballages de 8 pour tout contenir exactement.
On demande combien il y a d'œufs en tout.
Par 6
[modifier | modifier le wikicode]On commence par examiner les nombres tels que, pris 6 par 6, il en reste toujours 2:
s6=[n for n in range(40,200) if n%6==2]
print(len(s6))
26 nombres à examiner, courage!
Par 10
[modifier | modifier le wikicode]s10=[n for n in s6 if n%10==2]
print(s10)
Plus que 5 nombres à examiner!
Par 8
[modifier | modifier le wikicode]solutions=[n for n in s10 if n%8==0]
print(solutions)
Comme une seule valeur de n est affichée, c'est la seule qui a réussi tous les tests, et c'est donc l'unique solution au problème.