Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 27-11-2014 15:40:05
- totomm
- Membre
- Inscription : 25-08-2011
- Messages : 1 093
La seconde inconnue de freddy et Barbichu
Bonjour,
Freddy a cité récemment une énigme : La seconde inconnue… datant d'avril 2009 et brillamment traitée par Barbichu.
Lien : l'énigme de l'époque
Je redonne l'énoncé de freddy puis ce bel exposé de Babichu en commentaires du programme Python qui le met en œuvre :
on donne à Sophie la somme et à Patricia le produit de deux nombres entiers tirés dans un intervalle compris entre 2 et 100.
Chacune sait que l'une a reçu seulement la somme et l'autre seulement le produit.
Patricia dit qu'elle ne peut pas répondre.
Sophie répond :" j'étais prête à parier que tu dirais cela".
Quelques secondes plus tard, Patricia dit : " Comme c'est amusant, je viens de trouver" ;
et Sophie de conclure : "c'est amusant, parce que moi aussi".
Donner la valeur des deux nombres que chacune a trouvé
J'ai pensé que ce programme était une bonne occasion de concrétiser le passage de la Logique à sa programmation.
maxn=65 # peut être mis à 101 mais l'exécution predra peut-être plus de 2 secondes...
#pour tout a et b tels que a+b=x+y et a<=b,
def pourE1(x,y):
for a in range(2,maxn):
b=x+y-a
if a<=b:
if existeP(a,b)==False:
return False
return True
#il existe (c,d) avec c<=d tel que a*b = c*d sans que a=c et b=d
def existeP(a,b):
for c in range(2,maxn):
for d in range(2,maxn):
if c<=d and a!=c and b!=d:
if a*b==c*d:
return True
return False
#il existe (z,t) dans E1 tel que (z,t) != (x,y) et z+t=x+y.
def existeS(x,y,E):
for couple in E:
if couple[0]*couple[1]!=x*y:
if couple[0]+couple[1]==x+y:
return True
return False
#pour tout (z,t) dans E2, si z*t=x*y alors (x,y) = (z,t)
def pourtoutP(x,y,E):
for couple in E:
if couple[0]*couple[1]==x*y:
if couple[0]!=x or couple[1]!=y:
return False
return True
#pour tout (z,t) dans F, si z+t=x+y alors (x,y) = (z,t)
def pourtoutS(x,y,E):
for couple in E:
if couple[0]+couple[1]==x+y:
if couple[0]!=x or couple[1]!=y:
return False
return True
#quelle que soit la façon de décomposer la somme S=x+y en a+b,
#on ne peut pas retrouver de manière unique a et b à partir de a*b.
#On ne garde donc que l'ensemble E1 des couples (x,y) (x<=y),
#tels que pour tout a et b tels que a+b=x+y et a<=b, il existe (c,d) avec c<=d
#tel que a*b = c*d sans que a=c et b=d.
E1,E2,E3,F=[],[],[],[]
for x in range(2,maxn):
for y in range(x,maxn):
if pourE1(x,y)==True:
E1.append([x,y])
print(" E1 =",E1)
#Puisque Sophie ne peut pas trouver, on ne garde que l'ensemble E2 des couples (x,y) de E1,
#tels(qu) 'il existe (z,t) dans E1 tel que (z,t) != (x,y) et z+t=x+y.
for couple in E1:
if existeS(couple[0],couple[1],E1)==True:
E2.append(couple)
print("**************************************************")
print(" E2 =",E2)
#Lorsque Patricia anonce qu'elle a trouvé, cela signifie qu'il existe un unique élément (x,y) de E2
#tel que P=x*y. Soit E3 l'ensemble des éléments (x,y) de E2 verifiant la propriété :
#pour tout (z,t) dans E2, si z*t=x*y alors (x,y) = (z,t)
for couple in E2:
if pourtoutP(couple[0],couple[1],E2)==True:
E3.append(couple)
print("**************************************************")
print(" E3 =",E3)
#Lorsqie Sophie annonce qu'elle a trouvé, cela signifie qu'il existe un unique élément (x,y) de E3
#tel que S=x+y. Soit F l'ensemble des éléments (x,y) de F verifiant la propriété :
#pour tout (z,t) dans F, si z+t=x+y alors (x,y) = (z,t)
for couple in E3:
if pourtoutS(couple[0],couple[1],E3)==True:
F.append(couple)
print("**************************************************")
print(" F =",F)
# Miracle, F ne contient que le couple (4,13), la solution existe et est unique.
Hors ligne