// Essais associés au texte "Inititaion_programmation_Scilab.odt" sur l'initiation à SciLab.

disp("-------------------------------------------------------");
// Approximation du nombre pi
approx_pi = 355 / 113
derreur_relative = (approx_pi - %pi) / %pi;
disp("approx_pi = " + string(approx_pi));
disp("derreur_relative = " + string(derreur_relative));

// Approximation du nombre d'Euler e
approx_e = 2 + 1/2 + 1/(2*3) + 1/(2*3*4) + 1/(2*3*4*5) + 1/(2*3*4*5*6);
derreur_relative = (approx_e - %e) / %e;
disp("approx_e = " + string(approx_e));
disp("derreur_relative = " + string(derreur_relative));

// LA BOUCLE FOR
// Somme des inverses des nombres entiers de 1 à 10
somme=0; 
for n=1:10 do
  somme=somme+1/n; 
end;
disp(somme);

disp("EXERCICE 1.1");
// Somme des inverses des nombres entiers pour atteindre une limite
exposant = 4;
somme=0;
for k=1:10^exposant do
  somme=somme+1/k;
end;
disp(somme);
// On remarque que la somme est environ égale à 2.4*exposant, donc la série diverge probablement !

disp("EXERCICE 1.2");
// Somme des carrés des inverses des nombres entiers pour atteindre une limite
somme=0;
for k=1:10000 do
  somme=somme+1/k^2;
end;
disp(somme);
disp(%pi^2/6);

disp("EXERCICE 1.3");
// Calcul ne  n!
n = 6;
fact=1;
for k=1:n do
  fact=fact*k;
end;
disp(string(n) + "! = " + string(fact));

disp("EXERCICE 2.1");
// Approximation du nombre d'Euler e
// en utilisant une boucle  for
n = 6;
approx_e = 2;
fact = 1;
for k=2:n do
  fact = fact * k;
  approx_e = approx_e + 1 / fact;
end;
disp("approx_e = " + string(approx_e));

disp("EXERCICE 2.2");
// Approximation du nombre d'Euler e
// en utilisant une boucle  for
x = 2;   //  x = log(10);  // est intéressant,  le log  étant le  ln naturel.
n = 10;
approx_e_x = 1 + x;
fact = 1;
for k=2:n do
  fact = fact * k;
  approx_e_x = approx_e_x + x^k / fact;
end;
disp("approx_e_x = " + string(approx_e_x));

disp("PAGE 3, la boucle WHILE");
somme=0;
k=1;
while (somme < 10) do
  somme = somme + 1/k;
  k = k+1;
end;
disp(somme, k);

disp("EXERCICE 3.1");
// Approximation du nombre pi^2 / 6
// en utilisant une boucle  while
approx = 1;
k = 1;
while (abs(%pi^2/6 - approx) > 1e-4) do
  k = k + 1;
  approx = approx + 1 / k^2;
end;
disp("approx = " + string(approx) + "    pi^2/6 - approx = " + ..
     string(%pi^2/6-approx)  + "    k = " + string(k));

disp("EXERCICE 3.2");
// Approximation du nombre d'Euler e
// en utilisant une boucle  while
approx_e = 2;
fact = 1;
k = 1;
while (abs(%e - approx_e) > 1e-10) do
  k = k + 1;
  fact = fact * k;
  approx_e = approx_e + 1 / fact;
end;
disp("approx_e = " + string(approx_e) + "    e-approx_e= " + ..
     string(%e-approx_e)  + "    k = " + string(k));

disp("PAGE 4, le test IF THEN ELSE");
// Test si un nombre est positif, nul ou négatif
n=7;  // nombre que l'on peut changer
if (n > 0) then
   disp(string(n) + " est un nombre positif");
elseif (n == 0) then
   disp("Le nombre n = 0");
else
   disp(string(n) + " est un nombre négatif");
end; // if

if (modulo(n, 2) == 0) then  // modulo(n, 2)  donne le reste de la division de  n  par  2
   // n  le reste de la division de  n  par  2  est nul, donc  n  est pair.
   disp(string(n) + " est un nombre pair");
else
   disp(string(n) + " est un nombre impair");
end; // if

disp("EXERCICE 4.1  Test de divisibilité par 3");
n = 15;
if (modulo(n, 3) == 0) then
   // n  le reste de la division de  n  par  3  est nul, donc  n  est divisible par 3.
   disp(string(n) + " est un nombre divisible par 3");
else
   disp(string(n) + " est un nombre non divisible par 3");
end; // if

disp("EXEMPLE  le problème de Siracus");
// Le problème de Siracus, liste de la succesion de nombres
n=7;
while (n > 1)
  disp(n); 
  if (modulo(n, 2) == 0) then
    n = n / 2;
  else
    n = 3*n + 1;
  end; // if
end; // while

disp("EXERCICE 4.2  Racines d''un polynôme du second degré");
// a, b, c étant donnés, déterminez si le polynôme  ax^2 + bx + c  possède des racines et
// indiquez-les.   
// sqrt(expr)  retourne la racine carrée de  expr.
a=2;  b=10;  c=12;
delta=b^2 - 4*a*c;
if (delta < 0) then
  disp("Le posynôme n''a pas de racines");
elseif (delta == 0) then
  disp("Le polynôme ne possède qu''une seule racine qui est " + string(-b/(2*a)));
else
  disp( "les deux racines sont : " + ..
        string((-b - sqrt(delta))/(2*a)) + " ; " + ..  
        string((-b + sqrt(delta))/(2*a)));
end

disp("EXEMPLE de la PAGE 5, rainepol2(a, b, c) retourn les racines du polynome a*x^2 + b*x + c");
function  sols=racinepol2(a, b, c)
//================================
// résolution d'une équation du second degré
delta=b^2 - 4*a*c;
if (delta < 0) then
  sols = [];  // pas de solutions
elseif (delta == 0) then
  sols = [-b/(2*a)];
 // une seule solution
else
  sols = [(-b - sqrt(delta))/(2*a), (-b + sqrt(delta))/(2*a)]; // deux sol
end; // if
endfunction;

disp("EXERCICE 5.1 fonction  n!");
function f=fact(n)
//================
// Pour  n  entier donné, retourn  n!
f=1;
for k = 2:n do
  f = f * k;
end;
endfunction
// Test la fonction
nbr = 8;
disp(string(nbr) + "! = " + string(fact(nbr)));

disp("EXERCICE 5.2 de diviseur de  n  sous la forme 2^p");
function sol=pmax2(n)
//===================
// Un nombre étant donné, déterminez la plus grande puissance de 2 qui divise ce nombre.
p=1;
while (modulo(n, 2^p) == 0) do
  p=p+1
end;
sol = p-1;
endfunction
// Test la fonction
nbr = 24;
disp(string(nbr) + " est divisible par 2^" + string(pmax2(nbr)));

disp("EXERCICE 5.3, la fonction  Syracuse(n)  retourne la suite de Syracuse.");
function  sols=Syracuse(n)
//========================
// étapes du problème de Syracuse
sols = [];
while (n > 1)
  sols = [sols, n]; 
  if (modulo(n, 2) == 0)
    n = n / 2;
  else
    n = 3*n + 1;
  end; // if
end; // while
sols = [sols, 1];
endfunction;


