////////////////////////////
//TP Introduction à Scilab//
////////////////////////////





/////////////////////
// Fonction POLAIRE //
/////////////////////

// La fonction renvoit, pour un couple (x,y), les coordonnees polaires de ce couple dans R^2

function [r,theta] = polaire(x,y)
    r=sqrt(x^2+y^2);
    if (x > 0 & y >=0) theta = atan (y/x);
    elseif (x > 0 & y <0) theta = atan (y/x)+2*%pi;
    elseif (x<0) theta =atan (y/x) +%pi;
    elseif (x==0 & y>0) theta = %pi/2;   
    elseif (x==0 & y<0) theta = 3*%pi/2;
    else theta = 0;
    end
endfunction






/////////////////////
// Fonction PROFIL //
/////////////////////

// Etant donnée une matrice A, la fonction renvoit pour chaque ligne i, l'indice du premier A(i,j) non nul.
// Si toute la ligne i est nulle, la fonction renvoit n+i, où n est le nombre de colonnes de A

function s=profil(A)
    [m,n]=size(A);
    for i=1:m
        temp = find(A(i,:)~=0);
        if  (temp ~= []) then s(i) = min(temp);
            else s(i) = n+i;
        end
    end
endfunction









////////////////////////////
//Suite de Fibonacci//
////////////////////////////


//La fonction calcule les n premiers termes de la suite de Fibonacci.
function u = fibonacci1(n);
    u(1) = 0;   
    u(2) = 1;   
    for i=1:n-1
        u(i+2) = u(i+1) + u(i);
    end
endfunction


//La fonction calcule les termes de la suite de Fibonacci dont la valeur est inférieure à 50000 et affiche le dernier 
function val = fibonacci2();
    u(1) = 0;   
    u(2) = 1; 
    i=1;  
    while (u(i)<50000)
        u(i+2) = u(i+1) + u(i);
        i=i+1;
    end
    val = u(i-1);
endfunction


//La fonction calcule de manière itérative le nieme terme de la suite de Fibonacci sans garder les termes précédents en mémoire.
function un = fibonacci3(n);
    u = 0;   
    v = 1;   
    for i=1:n-2
        w = u+v;
        u=v;
        v=w;
    end
    un = w;
endfunction









////////////////////////////
//Calcul d'une approximation de pi par deux suites adjacentes
////////////////////////////

// version en donnant le nombre n d'itérations
function val = adjacentes()

n = input("Quel nombre n ?");

u=1;
v=2;

for k=1:n
u = (u+v)/2;
v = sqrt(u*v);
end

val = sqrt(27)/v;
endfunction

// version en imposant une precision epsilon
function val = adjacentes2()

e = input("Quel nombre epsilon ?");

u=1;
v=2;

k=1
while (abs(u-v)/abs(u+v) >e)
u = (u+v)/2;
v = sqrt(u*v);
k=k+1;
end

val = sqrt(27)/v;
endfunction




////////////////////////////
// Calcul d'une approximation de pi par Monte-Carlo 
////////////////////////////

function [out]= montecarlo(n)
    x   = rand(n,1);          // tirage d'un vecteur x de n valeurs aléatoires selon une loi uniforme sur [0,1] 
    y   = rand(n,1);          // tirage d'un vecteur y de n valeurs aléatoires selon une loi uniforme sur [0,1]
    v   = (x^2 +y^2<=1);      // test si (x,y) est dans le quart positif-droit du cercle centré en 0 et de rayon 1
    out = sum(v)/n*4;         
endfunction





////////////////////////////
// RECURSIVITE //
////////////////////////////

// calcul récursif de la fonction factorielle

function out = rfactorielle(n)
    if (n==1) then out = 1;
    else    out = n*rfactorielle(n-1);   
    end
endfunction
 

// calcul récursif du PGCD de 2 nombres a et b

function out = pgcd(a,b)
    M = max(a,b);
    m = min(a,b);
    r =pmodulo(M,m);
    if (r==0) then out = m
    else out = pgcd(m,r);
    end
endfunction



// calcul récursif des valeurs de la suite de Fibonacci

function out = rfibonacci(n)
    if (n==0) then out = 0;
    elseif (n==1) then out = 1;
    else out =rfibonacci(n-1) + rfibonacci(n-2);
    end
endfunction


// comparaison des temps d'exécution de rfibonacci et de fibonacci1

timer();
fibonacci1(n)
t1 = timer()

timer();
rfibonacci(n)
t2 = timer()
