Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#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

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
vingt cinq plus quatre-vingt huit
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Pied de page des forums