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

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

Intervalle[modifier | modifier le wikicode]

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 2[modifier | modifier le wikicode]

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 3[modifier | modifier le wikicode]

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 4[modifier | modifier le wikicode]

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 5[modifier | modifier le wikicode]

On continue l'épuration:

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

puts(solutions)

Plus que deux candidats possibles !

Par 6[modifier | modifier le wikicode]

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

puts(solutions)

Pas de changement, toujours deux candidats.

Par 7[modifier | modifier le wikicode]

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

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

Intervalle[modifier | modifier le wikicode]

solutions=(40..200).to_a

puts(solutions.size)


Par 6[modifier | modifier le wikicode]

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

puts(solutions.size)

Plus que 27 nombres à tester.

Par 10[modifier | modifier le wikicode]

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

puts(solutions)

Plus que 5 nombres à tester.

Par 8[modifier | modifier le wikicode]

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.