Changement de variable
Notre objectif va être d’exprimer l’équation sous une forme de Weierstrass. Supposons que $🍍^3 + 🍓^3 = 94🍌^3$ avec $0 < 🍍, 🍓, 🍌$. On peut réécrire l’équation comme
$$ \left(\dfrac 🍍🍌\right)^3 + \left(\dfrac 🍓🍌\right)^3 = 94 $$
Tentons donc de faire le changement de variable
$$ \begin{align*} & \dfrac 🍍🍌 = u + v && \dfrac 🍓🍌 = u - v \\ \iff & u = \dfrac {🍍 + 🍓}{2🍌} && v = \dfrac {🍍 - 🍓}{2🍌} \end{align*} $$
L’équation devient alors
$$ \begin{align*} (u+v)^3 + (u-v)^3 &= 94 \\ 2u^3 + 6uv^2 &= 94. \end{align*} $$
$u$ étant nécessairement strictement positif, on peut diviser par $u^3$ :
$$ \begin{align*} 2 + \dfrac{6v^2}{u^2} &= \dfrac{94}{u^3} \\ 6 \cdot \left(\dfrac{v}{u}\right)^2 &= 94 \cdot \dfrac{1}{u^3} - 2 \\ \end{align*} $$
Idéalement, pour retrouver une forme $Y^2 = X^3 + b$, on veut égaliser le coefficient de $Y^2$ et de $X^3$. Profitons du changement de variable pour cela. En prenant
$$ \dfrac vu = \dfrac Y{6^2 \cdot 94}, \quad \dfrac 1u = \dfrac X{6 \cdot 94}, $$
on obtient :
$$ \begin{align*} 6 \cdot \left(\dfrac Y{6^2 \cdot 94}\right)^2 &= 94 \cdot \left(\dfrac X{6 \cdot 94}\right)^3 - 2 \\ \dfrac1{6^3 \cdot 94^2} \cdot Y^2 &= \dfrac1{6^3 \cdot 94^2} \cdot X^3 - 2 \\ Y^2 &= X^3 - 2 \cdot 6^3 \cdot 94^2 \\ Y^2 &= X^3 - 3,817,152. \end{align*} $$
Le changement de variable effectué est donc
$$ \begin{align*} X &= \dfrac{6 \cdot 94}{u} & Y &= \dfrac {6^2 \cdot 94 \cdot v}u \\ X &= \dfrac{2 \cdot 6 \cdot 94 \cdot 🍌}{🍍 + 🍓} & Y &= \dfrac {6^2 \cdot 94 \cdot (🍍 - 🍓)}{🍍 + 🍓} \\ X &= \dfrac{1,128 \cdot 🍌}{🍍 + 🍓} & Y &= \dfrac {3,384 \cdot (🍍 - 🍓)}{🍍 + 🍓} \\ \end{align*} $$
Courbe elliptique
Les solutions à notre équation se retrouvent alors sur la courbe elliptique $(E):~Y^2 = X^3 - 3,817,152$.
Modéliser cette courbe elliptique sur SageMath nous permet de rapidement étudier sa structure :
sage: E = EllipticCurve([0, -3817152])
sage: E.gens()
[(62511752209/2480625 : -15629405421521177/3906984375 : 1)]
N’ayant qu’un seul générateur $G$, il s’agit d’un groupe monogène Itérer sur les multiples de $G$ nous permettra donc d’énumérer l’intégralité des solutions de l’équation.
Énumérer les solutions
Depuis un point $(X, Y)$ de la courbe elliptique, nous pouvons inverser le changement de variable afin d’en extraire des solutions de l’équation de base :
$$ \begin{align*} X = \dfrac{6 \cdot 94}u &\implies u = \dfrac{564}X & Y = \dfrac{6^2 \cdot 94 \cdot v}u &\implies v = \dfrac{Y\cdot u}{3,384} \\ \dfrac 🍍🍌 &= u + v & \dfrac 🍓🍌 &= u - v \end{align*} $$
La plus petite solution engendrée par ce point se trouve en considérant $🍌$ comme le plus petit dénominateur commun. Toutes les autres solutions engendrées sont proportionnelles à cette solution, et par conséquent plus larges.
Cependant, de telles solutions peuvent ne pas satisfaire notre équation si l’un de $🍍$ ou $🍓$ est négatif. Dans ce cas, aucune proportion ne rendra $🍍, 🍓$ et $🍌$ positifs, et le point ne modélisera alors aucune solution positive à notre équation.
Étant donné que les solutions obtenues par les multiples de $G$ deviennent significativement plus grandes au fil de l’énumération, on est assuré que le premier multiple de $G$ produisant un couple $(🍍, 🍓, 🍌)$ positif sera la solution au challenge.
Mise en œuvre
E = EllipticCurve([0, -3817152])
G = E.gens()[0]
P = G
while True:
X, Y = P.xy()
u = 564 / X
v = Y * u / 3384
xz = u + v
yz = u - v
z = lcm(xz.denominator(), yz.denominator())
x = xz * z
y = yz * z
assert x^3 + y^3 == 94 * z^3
if x > 0 and y > 0:
print(f'{x = }')
print(f'{y = }')
print(f'{z = }')
break
P += G