Mathématiques avec Python et Ruby/Systèmes congruentiels en Python

Un livre de Wikilivres.

Rallye mathématique de la Réunion[modifier | modifier le wikicode]

Sujet 2005, Exercice 2[modifier | modifier le wikicode]

Énoncé
Pour organiser une grande manifestation sportive, le professeur d’éducation physique doit rassembler sur le stade un important groupe d’élèves. Le nombre d’élèves est compris entre 2 800 et 2 900. Il en profite pour leur faire remarquer que, regroupés par 2, puis par 3, puis par 4, puis par 5, puis par 6, il en reste toujours 1 ; mais, ô miracle, en se regroupant par 7, il ne reste personne.

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]

Énoncé
Chaque semaine, Jean ramasse entre 40 et 200 œufs qu’il va vendre au marché.

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.