Le but de cette page de calcul est de montrer comment on peut résoudre, grâce à Tartaglia, une équation cubique qui a exactement une solution réelle. Commençons par une équation explicite qu'on voudrait résoudre dans $\mathbf R$: $x^3+x+1=0$. Une petite étude de la fonction $y=x^3+x+1$ montre que cette équation possède bien une seule racine réelle. Voici le graphe de la fonction:

{{{id=1| plot(x^3+x+1,(x,-3,3)) /// }}}

On commence par substituer $x=u+v$ dans l'expression $x^3+x+1$. Ici, on se heurte à une petite particularité de sage. Avant de pouvoir utiliser des inconnues comme $u$ et $v$, il faut les déclarer. Ca se fait en effectuant la procédure $\mathtt{var}$ sur la chaîne de caractères $\mathtt{'u'}$, comme ceci:

{{{id=4| var('u') /// u }}}

...et de même pour $v$:

{{{id=6| var('v') /// v }}}

Maintenant on est prêt pour la substitution de $u+v$ pour $x$:

{{{id=8| (x^3+x+1).subs(x=u+v) /// (u + v)^3 + u + v + 1 }}}

Remarquons qu'on voit ici le caractère objet-orienté de python, le langage de programmation sur lequel sage est basé. Des objets comme $\mathtt{x^3+x+1}$ possèdent des méthodes comme $\mathtt{subs()}$. On évalue une méthode en un objet en écrivant $\mathtt{objet.méthode}$. Ici, cela donne $\mathtt{(x^3+x+1).subs(x=u+v)}$ car la méthode $\mathtt{subs()}$ prend l'argument $\mathtt{x=u+v}$. Bref,  on développe l'expression ci-dessus, et on obtient:

{{{id=3| _.expand() /// u^3 + 3*u^2*v + 3*u*v^2 + v^3 + u + v + 1 }}}

Remarquons que le signe $\mathtt{'\_'}$ signifie «la dernière valeur calculée» en l'occurence $(u + v)^3 + u + v + 1$. En regardant de près, on voit que l'expression ci-dessus est égale à $u^3+v^3+(u+v)(3uv+1)+1$, et en effet:

{{{id=12| (_-(u^3+v^3+(u+v)*(3*u*v+1)+1)).expand() /// 0 }}}

L'idée de génie de Tartaglia était de supposer que $3uv+1=0$, i.e, que $uv=-1/3$ ou encore que $v=-1/(3u)$. Cela simplifie considérablement l'expression $u^3+v^3+(u+v)(3uv-3)+1$. Substituons donc $v=-1/(3u)$ dans cette expression:

{{{id=11| (u^3 + 3*u^2*v + 3*u*v^2 + v^3 + u + v + 1).subs(v=-1/(3*u)) /// u^3 - 1/27/u^3 + 1 }}}

Multiplions par $u^3$:

{{{id=16| (_*u^3).expand() /// u^6 + u^3 - 1/27 }}}

C'est une expression quadratique en $u^3$! Pour résumer, si $x^3+x+1=0$ et si on pose $x=u+v$ et $v=-1/(3u)$, on a que $u^3$ est solution de l'équation quadratique $y^2+y-1/27=0$. Or, les solutions de cette derrnière sont:

{{{id=19| y1=(-1+sqrt(31/27))/2; y2=(-1-sqrt(31/27))/2 /// }}}

comme on peut vérifier:

{{{id=15| (y1^2+y1-1/27).expand() /// 0 }}} {{{id=22| (y2^2+y2-1/27).expand() /// 0 }}}

Si on pose $u_1=\sqrt[3]{y_1}$, $v_1=-1/(3u_1)$ et $x_1=u_1+v_1$, on a une solution réelle de l'équation $x^3+x+1=0$:

{{{id=60| u1=y1^(1/3); v1=-1/(3*u1); x1=u1+v1 /// }}} {{{id=62| x1 /// (1/6*sqrt(31/3) - 1/2)^(1/3) - 1/3/(1/6*sqrt(31/3) - 1/2)^(1/3) }}}

ou encore sous format plus lisible:

{{{id=63| view(x1) /// }}}

On a bien une racine de l'équation $x^3+x+1$:

{{{id=61| (x^3+x+1).subs(x=x1) /// (1/6*sqrt(31/3) - 1/2)^(1/3) - 1/3/(1/6*sqrt(31/3) - 1/2)^(1/3) + 1/27*(3*(1/6*sqrt(31/3) - 1/2)^(1/3) - 1/(1/6*sqrt(31/3) - 1/2)^(1/3))^3 + 1 }}} {{{id=24| _.expand() /// -2/9/(sqrt(31/3) - 3) + 1/6*sqrt(31/3) + 1/2 }}} {{{id=67| _.simplify() /// 1/18*sqrt(3)*sqrt(31) - 2/3/(sqrt(3)*sqrt(31) - 9) + 1/2 }}} {{{id=68| _.simplify_radical() /// 0 }}} {{{id=69| G = plot(x^3+x+1,(x,-3,3)) + point((x1,0),size=50,color='red') /// }}} {{{id=70| G.show() /// }}}

On a bien trouvé une racine réelle! Qu'en est-il des racines dans $\mathbf C$? Dans $\mathbf C$, il y a $3$ racines cubiques de $y_1$:

{{{id=23| u1=u1; u2=u1*exp(2*I*pi/3); u3=u1*exp(4*I*pi/3) /// }}}

Posons donc $v_i=-1/(3u_i)$:

{{{id=27| v1=-1/3/u1; v2=-1/3/u2; v3=-1/3/u3 /// }}}

et $x_i=u_i+v_i$:

{{{id=30| x1=u1+v1; x2=u2+v2; x3=u3+v3 /// }}}

Vérifions que les nombres complexes $x_1,x_2,x_3$ sont bien solution de l'équation $x^3-3x+1=0$:

{{{id=32| (x^3+x+1).subs(x=x1) /// (1/6*sqrt(31/3) - 1/2)^(1/3) - 1/3/(1/6*sqrt(31/3) - 1/2)^(1/3) + 1/27*(3*(1/6*sqrt(31/3) - 1/2)^(1/3) - 1/(1/6*sqrt(31/3) - 1/2)^(1/3))^3 + 1 }}} {{{id=35| _.expand() /// -2/9/(sqrt(31/3) - 3) + 1/6*sqrt(31/3) + 1/2 }}} {{{id=29| _.simplify_radical() /// 0 }}}

et de même pour $x_2$ et $x_3$:

{{{id=34| (x^3+x+1).subs(x=x2).expand().simplify_radical() /// 0 }}} {{{id=39| (x^3+x+1).subs(x=x3).expand().simplify_radical() /// 0 }}} {{{id=74| view(x1) /// }}} {{{id=75| view(x2) /// }}} {{{id=76| view(x3) /// }}}

Dans le plan complexe, ces nombres se situent ainsi:

{{{id=71| S = point((x1,0),size=50,color='red') + point((x2.real(),x2.imag()),size=50,color='green') + point((x3.real(),x3.imag()),size=50,color='blue') /// }}} {{{id=73| S.show(figsize=6) /// }}}