Equations diophantiennes

Si $x^3 + 2xy = 82$ alors $x^3 \le 82$ donc $x \le 5$.

Et $2xy \le 82$ donc $y \le 82/(2x) \le 41$

In [34]:
N= 1000
sol1= [ [x,y] for x in range(N) for y in range(N) if x**3 + 2*x*y == 82  ]
In [35]:
sol1
Out[35]:
[]

Pas de solution du tout.

Remarque si $x^3 + 2xy = 82$ alors $x^3= 82 - 2xy$ donc $x^3$ est pair donc $x$ est pair donc $x^3 +2xy$ est divisible par 4 donc 82 est divisible par 4, absurde.

In [36]:
N= 100
sol2= [ [x,y] for x in range(N) for y in range(N) if x**3 + 2*x*y == 81  ]
In [37]:
sol2
Out[37]:
[[1, 40], [3, 9]]

Deux solutions.

Fonction zéta

In [39]:
from math import pi
In [40]:
N= 1000000
s= 5
approx= sum([ 1/(n**(2*s)) for n in range(1, N)]) / (pi**(2*s))
print("1/a_", s, "vaut environ", 1/approx)
1/a_ 5 vaut environ 93554.99999999996

$1/a_1 = 6$

$1/a_2 = 90$

$1/a_3= 945$

$1/a_4= 9450$

Nombres pyramidaux

In [33]:
N= 1000
pyramide= set([ n*(n+1)*(2*n+1)//6 for n in range(1,N)])
carres= set([n**2 for n in range(1,N)])
print(pyramide.intersection(carres))
{1, 4900}

Le puzzle

Reprenons le début :

In [3]:
from itertools import product
In [4]:
prenoms= ["Mary", "Marion", "Margie", "Hilary", "Martha"]
noms= ["Brown", "Grey", "Black", "White", "Green"]
races= ["terrier", "caniche", "dalmatien", "setter", "basset"]
chiens= ["Loopsie", "Mooksie", "Smooksie", "Poopsie", "Woopsie"]
In [5]:
comb= [ [p, n, r, c] for p,n,r,c in product(prenoms, noms, races, chiens)]
In [6]:
# réponse complète
filtre1= [ [p,n,r,c] for p,n,r,c in comb if (c in ["Loopsie", "Mooksie"]) or (not n=="Brown")   ]
filtre2= [ [p,n,r,c] for p,n,r,c in filtre1 if (r!= "terrier") or (not n=="Brown")   ]
filtre3= [ [p,n,r,c] for p,n,r,c in filtre2 if (c == "Woopsie") == (r == "caniche")  ]
filtre4= [ [p,n,r,c] for p,n,r,c in filtre3 if  p != "Mary" or not(c=="Woopsie")   ]
filtre5= [ [p,n,r,c] for p,n,r,c in filtre4 if  (r=="setter") == (p=="Marion")   ]
filtre6= [ [p,n,r,c] for p,n,r,c in filtre5 if  c!="Loopsie" or not(p=="Marion")   ]
filtre7= [ [p,n,r,c] for p,n,r,c in filtre6 if  (r=="basset") == (p=="Margie")   ]
filtre8= [ [p,n,r,c] for p,n,r,c in filtre7 if  (c in ["Smooksie", "Mooksie"]) or not(r=="basset")  ]
filtre9= [ [p,n,r,c] for p,n,r,c in filtre8 if  not(p=="Hilary") or not(n=="Grey")   ]
filtre10=[ [p,n,r,c] for p,n,r,c in filtre9 if  (c in ["Poopsie", "Smooksie"]) or not(p=="Hilary")   ]
filtre11=[ [p,n,r,c] for p,n,r,c in filtre10 if  (p=="Martha") == (n=="Black")   ]
filtre12= [ [p,n,r,c] for p,n,r,c in filtre11 if  not(r=="dalmatien") or not(p=="Martha")   ]
filtre13= [ [p,n,r,c] for p,n,r,c in filtre12 if not(c=="Poopsie") or not(n=="Grey")  ]
filtre14= [ [p,n,r,c] for p,n,r,c in filtre13 if (c=="Mooksie") == (n=="White")   ]
filtre15= [ [p,n,r,c] for p,n,r,c in filtre14 if  not(p=="Marion") or not(n=="White")   ]
In [7]:
print(len(filtre15))
27
In [20]:
[ [p,n,r,c] for p,n,r,c in filtre15 if n=="Brown"]
Out[20]:
[['Mary', 'Brown', 'dalmatien', 'Loopsie']]

On voit que Mary Brown possède un dalmatien qui s'appelle Loopsie.

In [21]:
filtre16= [ [p,n,r,c] for p,n,r,c in filtre15 if (p=="Mary") == (n=="Brown")   ]
print(len(filtre16))
15
In [22]:
filtre17= [ [p,n,r,c] for p,n,r,c in filtre16 if (r=="dalmatien") == (c=="Loopsie")   ]
print(len(filtre17))
12
In [23]:
filtre18= [ [p,n,r,c] for p,n,r,c in filtre17 if (n=="Brown") == (c=="Loopsie")   ]
print(len(filtre18))
12

Ce dernier filtre était donc redondant, mais peu importe. Continuons :

In [24]:
[ [p,n,r,c] for p,n,r,c in filtre18 if n=="White"]
Out[24]:
[['Margie', 'White', 'basset', 'Mooksie']]

Donc Margie White possède un basset qui s'appelle Mooksie (puisqu'il n'y a qu'une combinaison).

In [25]:
filtre19= [ [p,n,r,c] for p,n,r,c in filtre18 if (n=="White") == (p=="Margie")   ]
print(len(filtre19))
10
In [26]:
filtre20= [ [p,n,r,c] for p,n,r,c in filtre19 if (r=="basset") == (c=="Mooksie")   ]
print(len(filtre20))
10

Voyons Mme Grey :

In [27]:
[ [p,n,r,c] for p,n,r,c in filtre20 if n=="Grey"]
Out[27]:
[['Marion', 'Grey', 'setter', 'Smooksie']]

Nous avons de nouvelles informations que nous injectons :

In [28]:
filtre21= [ [p,n,r,c] for p,n,r,c in filtre20 if (r=="setter") == (c=="Smooksie")   ]
print(len(filtre21))
7
In [29]:
filtre22= [ [p,n,r,c] for p,n,r,c in filtre21 if (p=="Marion") == (n=="Grey")   ]
print(len(filtre22))
6

Il y a encore 6 combinaisons, mais seulement 5 chiens, d'ailleurs si on regarde :

In [30]:
print(filtre22)
[['Mary', 'Brown', 'dalmatien', 'Loopsie'], ['Marion', 'Grey', 'setter', 'Smooksie'], ['Margie', 'White', 'basset', 'Mooksie'], ['Hilary', 'Green', 'terrier', 'Poopsie'], ['Martha', 'Black', 'terrier', 'Poopsie'], ['Martha', 'Black', 'caniche', 'Woopsie']]

On voit deux possibilités pour Martha Black. Mais on nous posait la question pour Mme Green, et :

In [31]:
[ [p,n,r,c] for p,n,r,c in filtre22 if n=="Green"   ]
Out[31]:
[['Hilary', 'Green', 'terrier', 'Poopsie']]

Gagné : Hilary Green possède un terrier qui s'appelle Poopsie ("ma crotte", en anglais).