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

Rallye mathématique de la RéunionModifier

Sujet 2005, Exercice 2Modifier

É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 va filtrer les solutions avec les critères donnés par l'énoncé, l'un après l'autre.

IntervalleModifier

les nombres à tester sont tous les nombres entre 2800 et 2900, il y en a donc 101:

solutions=(2800..2900).to_a

puts(solutions.size)

Par 2Modifier

On ne va finalement garder que les nombres qui, pris 2 par 2, laissent 1 (soit tels que le reste de la division par 2 donne 1; on rappelle que ce reste se note par le symbole pourcent).

solutions=solutions.select{|n| n%2==1}

puts(solutions.size)

Ah! Il n'en reste plus que 50 à tester!

Par 3Modifier

Parmi ces 50, on va garder uniquement ceux qui, pris 3 par 3 aussi, laissent 1:

solutions=solutions.select{|n| n%3==1}

puts(solutions.size)

De 50, on est passé à 17.

Par 4Modifier

Ensuite on garde ceux des 17 qui, divisés par 4, laissent 1:

solutions=solutions.select{|n| n%4==1}

puts(solutions.size)

Plus que 8...

Par 5Modifier

On continue l'épuration:

solutions=solutions.select{|n| n%5==1}

puts(solutions)

Plus que deux candidats possibles !

Par 6Modifier

solutions=solutions.select{|n| n%6==1}

puts(solutions)

Pas de changement, toujours deux candidats.

Par 7Modifier

Maintenant on veut garder les nombres divisibles par 7. Le reste euclidien devra donc être nul:

solutions=solutions.select{|n| n%7==0}

puts(solutions)

Et hop! On a le nombre d'élèves!

Sujet 2007, Exercice 3Modifier

É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.

Même exercice que celui d'au-dessus:

IntervalleModifier

solutions=(40..200).to_a

puts(solutions.size)


Par 6Modifier

solutions=solutions.select{|n| n%6==2}

puts(solutions.size)

Plus que 27 nombres à tester.

Par 10Modifier

solutions=solutions.select{|n| n%10==2}

puts(solutions)

Plus que 5 nombres à tester.

Par 8Modifier

On veut que le reste dans la division par 8 soit nul:

solutions=solutions.select{|n| n%8==0}

puts(solutions)

Un seul nombre a réussi le parcours du combattant jusqu'au bout: C'est la solution au problème.