/* Programmé par Frédéric WANG
Script permettant la résolution d'équation de degré inférieur ou égal.
http://maths-informatique-jeux.chez.alice.fr/maths/divers/equation.php */

function init()
{return;
document.getElementById("n_chiffre").selectedIndex=4;
}

function resoudre(degre)
{
/* Création d'un polynôme defaut ayant des racines entières */
var defaut=new Array(1,0);
for(var k=0;k<degre;k++)
  {
  var racine=(RND(1)?-1:1)*(RND(9)+1);
  defaut=prod(defaut,new Array(-racine,1));
  }
defaut=prod(defaut,new Array(RND(2)+1,0));
if(confirm("L'ordinateur vous propose de résoudre l'équation « "+equation(defaut,degre)+" »\n\nVous pouvez la garder (touche OK), ou en proposer une autre (touche annuler)..."))
  {
  coeff=defaut;
  }
else
  {  
  /* Création du polynôme rentré par l'utilisateur */
  var coeff=new Array();
  for(var k=degre;k>=0;k-=1)
    {
    var ch="L'équation à résoudre est « "+equation(coeff,degre)+" »";
    coeff[k]=prompt(ch+"\nVeuillez rentrer le nombre "+String.fromCharCode(65+degre-k)+".",defaut[k]);
    if(k==degre&&coeff[k]==0)return;
    coeff[k]=cmp(new Array(eval(coeff[k]),0));
	}
  }

/* Sélection de l'algorithme recherchant les racines */
var racines; 

switch(degre)
  {
  case 1:racines=degre1(coeff);break;
  case 2:racines=degre2(coeff);break;
  case 3:racines=degre3(coeff);break;
  case 4:racines=degre4(coeff);break;
  default:alert("Impossible de résoudre par radicaux cette équation !");return;
  }
var ch="Voici les racines de l'équation :\n\n";
for(var k=0;k<degre;k++)ch+="x"+k+" = "+ecrire(racines[k])+"\n";
alert(ch);
}

function equation(coeff,degre)
{
var ch="";
for(var k=degre;k>=0;k-=1)
   {
   ch+=(coeff[k]?"("+ecrire(coeff[k])+")":String.fromCharCode(65+degre-k));
   if(k)
     {
     ch+="x";
	 switch(k)
	   {
	   case 1:break;
	   case 2:ch+="²";break;
	   case 3:ch+="³";break;
	   default:ch+="^"+k;break;
	   }	
     ch+=" + ";
	 }
   }
return ch+=" = 0";
}

function degre1(coeff)
{
var f=document.getElementById("detail1");
document.getElementById("equation1").value=equation(coeff,1);
var A=cmp(coeff[1]),B=cmp(coeff[0]);
f.value="L'équation à résoudre est de la forme Ax + B = 0, avec\n";
f.value+="A = "+ecrire(A)+" ; B = "+ecrire(B)+"\n\n";
var x=pr(new Array(opp(B),inv(A)));f.value+="Par conséquent x = -B/A = "+ecrire(x);
return new Array(x);
}

function degre2(coeff)
{
var f=document.getElementById("detail2");
document.getElementById("equation2").value=equation(coeff,2);
var A=cmp(coeff[2]),B=cmp(coeff[1]),C=cmp(coeff[0]);
f.value="L'équation à résoudre est de la forme Ax² + Bx + C = 0, avec\n";
f.value+="A = "+ecrire(A)+" ; B = "+ecrire(B)+" ; C = "+ecrire(C)+"\n\n";
var DELTA=so(new Array(pui(B,2),pr(new Array(-4,A,C))));
f.value+="On pose DELTA = B² - 4AC = "+ecrire(DELTA)+"\n\n";
if(ecrire(DELTA)==0)// Une seule racine
  {
  var x=pr(new Array(opp(B),.5,inv(A)));
  f.value+="On a alors une racine : x = -B / 2A = "+ecrire(x)+"\n";
  return new Array(x,x);
  } 
else
  {
  f.value+="On a alors deux racines :\n";
  var x0=pr(new Array(so(new Array(opp(B),pui(DELTA,.5))),.5,inv(A)));
  var x1=pr(new Array(so(new Array(opp(B),opp(pui(DELTA,.5)))),.5,inv(A)));
  f.value+="x0 = (-B + racine(DELTA)) / 2A = "+ecrire(x0)+"\n";
  f.value+="x1 = (-B - racine(DELTA)) / 2A = "+ecrire(x1);
  return new Array(x0,x1);
  }
}

function degre3(coeff)
{
var f=document.getElementById("detail3");
var j=pr(new Array(.5,so(new Array(-1,pui(-3,.5)))));

document.getElementById("equation3").value=equation(coeff,3);
f.value="L'équation à résoudre est de la forme Ax³ + Bx² + Cx + D = 0, avec\n";
f.value+="A = "+ecrire(coeff[3])+" ; B = "+ecrire(coeff[2])+" ; C = "+ecrire(coeff[1])+" ; D = "+ecrire(coeff[0])+"\n\n";

for(var k=0;k<4;k++)coeff[k]=cmp(coeff[k]);
var a=pr(new Array(coeff[2],inv(coeff[3])));
var b=pr(new Array(coeff[1],inv(coeff[3])));
var c=pr(new Array(coeff[0],inv(coeff[3])));
f.value+="On divise par A et on obtient x³ + ax² + bx + c = 0, avec \n";
f.value+="a = "+ecrire(a)+" ; b = "+ecrire(b)+" ; c = "+ecrire(c)+"\n\n";

f.value+="On pose alors x = z - a/3 et on obtient z³ + pz + q = 0\n";
var p=so(new Array(pr(new Array(-1/3,pui(a,2))),b));
var q=so(new Array(pr(new Array(2/27,pui(a,3))),pr(new Array(-1/3,a,b)),c));
f.value+="p = (-1/3)a² + b = "+ecrire(p)+"\n";
f.value+="q = (2/27)a³ - (1/3)ab + c = "+ecrire(q)+"\n\n";

var z=new Array(),x=new Array();

if(ecrire(p)==0)// cas où p = 0
  {
  f.value+="Comme p = 0, on a z³ = -q, et par conséquent :\n";
  for(var k=0;k<3;k++)
    {
	z[k]=(k==0?pui(opp(q),1/3):pr(new Array(z[k-1],j)));
	f.value+="z"+k+" = racine_cubique(-q) = "+ecrire(z[k])+"\n";
	}
  }
else
  {
  f.value+="On pose z = u + v, et on résoud le système suivant :\n";
  f.value+=" {u^6 + q × u³ - (1/27)p³ = 0\n";
  f.value+=" {v = -p / 3u\n";
  f.value+="On pose y = u³ pour arriver à l'équation y² + qy - (1/27)p³ = 0 qui ";
  y0=degre2(new Array(pr(new Array(-1/27,pui(p,3))),q,1))[0];
  f.value+="est du second degré, et que l'on sait résoudre :\ny0 = "+ecrire(y0)+"\n\n";

  f.value+="A partir de là, on peut résoudre le système et trouver z0, z1 et z2\n";
  var u=new Array(),v=new Array();
  for(var k=0;k<3;k++)
    {
	u[k]=(k==0?pui(y0,1/3):pr(new Array(u[k-1],j)));
	v[k]=pr(new Array(p,inv(pr(new Array(-3,u[k])))));
	z[k]=so(new Array(u[k],v[k]));
	f.value+="z"+k+" = u"+k+" + v"+k+" = "+ecrire(z[k])+"\n";
	}
  }

f.value+="\nOn en déduit les racines de l'équation :\n";
for(var k=0;k<3;k++)
  {
  x[k]=so(new Array(z[k],pr(new Array(a,-1/3))));
  f.value+="x"+k+" = z"+k+" - a/3 = "+ecrire(x[k])+"\n";
  } 
return x;
}

function degre4(coeff)
{
var f=document.getElementById("detail4");
document.getElementById("equation4").value=equation(coeff,4);

f.value="L'équation à résoudre est de la forme Ax^4 + Bx³ + Cx¹ + Dx + E = 0, avec\n";
f.value+="A = "+ecrire(coeff[4])+" ; B = "+ecrire(coeff[3])+" ; C = "+ecrire(coeff[2])+" ; D = "+ecrire(coeff[1])+" ; E = "+ecrire(coeff[0])+"\n\n";

for(var k=0;k<5;k++)coeff[k]=cmp(coeff[k]);
var a=pr(new Array(coeff[3],inv(coeff[4])));
var b=pr(new Array(coeff[2],inv(coeff[4])));
var c=pr(new Array(coeff[1],inv(coeff[4])));
var d=pr(new Array(coeff[0],inv(coeff[4])));

f.value+="On divise par A et on obtient x^4 + ax³ + bx¹ + cx + d = 0, avec \n";
f.value+="a = "+ecrire(a)+" ; b = "+ecrire(b)+" ; c = "+ecrire(c)+" ; d = "+ecrire(d)+"\n\n";

var z=new Array(),x=new Array();

f.value+="On pose alors x = z - a/4 et on obtient z^4 + pz² + qz + r = 0\n";
var p=so(new Array(pr(new Array(-3/8,pui(a,2))),b));
var q=so(new Array(pr(new Array(1/8,pui(a,3))),pr(new Array(-1/2,a,b)),c));
var r=so(new Array(pr(new Array(-3/256,pui(a,4))),pr(new Array(1/16,pui(a,2),b)),pr(new Array(-1/4,a,c)),d));
f.value+="p = -(3/8)a² + b = "+ecrire(p)+"\n";
f.value+="q = (1/8)a³ - (1/2)ab + c = "+ecrire(q)+"\n";
f.value+="r = -(3/256)a^4 + (1/16)a²b - (1/4)ac + d = "+ecrire(r)+"\n\n";
if(ecrire(q)==0)
  {
  f.value+="Comme q = 0, on a l'équation bicarée suivante : z^4 + pz² + r = 0\n";
  f.value+="On pose y = z² et on résoud l'équation y² + py + r = 0 :\n";
  var y=degre2(new Array(r,p,1));
  for(var k=0;k<2;k++)
    {
	z[k*2]=pui(y[k],.5);z[k*2+1]=opp(pui(y[k],.5));
	f.value+="y"+k+" = "+ecrire(y[k])+" d'où "
	f.value+="z"+(k*2)+" = "+ecrire(z[k*2])+" et z"+(k*2+1)+" = "+ecrire(z[k*2+1])+"\n";
    }
  }
else
  {
  f.value+=" {2P - Q² = p\n";
  f.value+=" {  -2QR  = q         (z² + P)² -(Qz + R)² = 0\n";
  f.value+=" {P² - R² = r\n\n";
  f.value+="On cherche une racine de l'équation du 3e degré\n";
  f.value+="P³ - (p/2)P² - rP + (1/2)pr - (1/8)q² = 0, pour avoir P0, Q0 et R0 :\n";
  var P0=degre3(new Array(so(new Array(pr(new Array(pui(q,2),-1/8)),pr(new Array(p,r,1/2)))),opp(r),pr(new Array(p,-1/2)),1))[0];
  var R0=pui(so(new Array(pui(P0,2),opp(r))),.5);var Q0=pr(new Array(q,-1/2,inv(R0)));
  f.value+="P0 = "+ecrire(P0)+"\n";
  f.value+="Q0 = "+ecrire(Q0)+"\n";
  f.value+="R0 = "+ecrire(R0)+"\n\n";
  f.value+="On résoud ensuite « z² + Qz + P + R = 0 ou z² - Qz + P - R = 0 »\n";
  var zz=new Array(degre2(new Array(so(new Array(P0,R0)),Q0,1)),
                   degre2(new Array(so(new Array(P0,opp(R0))),opp(Q0),1))
				   );
  for(var k=0;k<4;k++)
     {
	 z[k]=zz[Math.floor(k/2)][k%2];
	 f.value+="z"+k+" = "+ecrire(z[k])+"\n";
	 } 
  }

f.value+="\nOn en déduit les racines de l'équation :\n";
for(var k=0;k<4;k++)
  {
  x[k]=so(new Array(z[k],pr(new Array(a,-1/4))));
  f.value+="x"+k+" = z"+k+" - a/4 = "+ecrire(x[k])+"\n";
  } 
return x;
}
