// Exercices de la série 1 : Curiosité numériques du cours d'OS AM

disp("==========  Ex 1  =================");

// Exercice 1 de détermination de la précision de la machine.
// Cela donne une indication du nombre de chiffres significatifs
e = 1;
while (1 + e/2) > 1
  e = e / 2;
end;

disp("Précision machine = " + string(e) + "  = %eps = " + string(%eps));

disp("==========  Ex 2  =================");

// Exercice 2, sur le nombre d'or et la suite de Fibonacci
gold = (1 + sqrt(5))/ 2;

fib(1) = 1;
fib(2) = 1;
rap(1) = 1;
for ii=3:25
  fib(ii) = fib(ii-1) + fib(ii-2);
  rap(ii-1) = fib(ii) / fib(ii-1);
  disp(log10(abs(rap(ii-1) - gold)));
end;

plot(log10(abs(rap - gold)));
title("Augmentation linéaire du nombre de chiffres de l''approximation");

disp("==========  Ex 3  =================");

// Exercice 3, sur la périodicité de la suite de Fibonacci

fib3(1) = 1;
fib3(2) = 1;
for ii=3:1000
  fib3(ii) = modulo(fib3(ii-1) + fib3(ii-2), 10);
  if (fib3(ii) == 1) & (fib3(ii-1) == 1) then disp(ii);  end;
end;

// Le chiffre des unités a une périodicité de 60.
// fib3/ii) = fib3(ii - k*60)  pour tout k entier positif.
disp("fib3(100) == fib3(40) == " + string(fib3(100)));
disp("fib3(1000) == fib3(1000 - 16*60) == fib3(40) == " + string(fib3(1000)));
disp("fib3(10000) == fib3(10000-166*60) == fib3(40) == " + string(fib3(40)));

disp("==========  Ex 4  =================");

// Exercice 4, une suite qui devrait converger vers 0 diverge numériquement.
// C'est dû à la limite de précision de l'ordinateur
fib4(1) = 1;
fib4(2) = (1 - sqrt(5)) / 2;  // =  -1/gold
for ii=3:85
  fib4(ii) = fib4(ii-1) + fib4(ii-2);
end;

disp(fib4');
disp(fib4(85) / fib4(84));
disp("Théoriquement le nombre précédent devrait valoir : " + string(-1/gold));

disp("==========  Ex 5  =================");

// Exercice 5, calcul numérique de la racine carrée, par itération
nbr = 7;
rac(1) = 1;
rac(2) = 2.5;
ii = 2;
while (rac(ii) <> rac(ii-1)) do
  rac(ii+1) = 0.5*(rac(ii) + nbr/rac(ii));
  disp(rac(ii+1)^2 - nbr);
  ii=ii+1;
end;

disp("==========  Ex 6  =================");

// Exercice 6, calcul numérique de la racine cubique, par itération
nbr = 7;
rac(1) = 1;
rac(2) = 2;
ii = 2;
while (rac(ii) <> rac(ii-1)) & (ii < 12) do
  rac(ii+1) = (2*rac(ii) + nbr/rac(ii)^2) / 3;
  disp(rac(ii+1)^3 - nbr);
  ii=ii+1;
end;
