% Calcolo di una matrice p che contiene per righe le 
% 3 fattoriale = 6 permutazioni di 1, 2, 3:

p=perms([1 2 3])

size(p)

length(p)

a=[1 2 3;4 5 6;7 8 9]

% Estrarre la diagonale della matrice a:

diag(a)

% Creare una matrice diagonale con la diagonale principale [1, 5, 9]:

diag([1,5,9])

% Prodotto 1 * 5 * 9:

prod([1 5 9])
a
prod(a) %% prodotto degli elementi nelle colonne della matrice a
sum(a)  %% somma degli elementi nelle colonne della matrice a

% Numero casuale (numero random) tra 0 e 1:
rand(1)

% Matrice quadrata casuale di dimensione 5 per 5:

rand(5)

% Vettore colonna con 5 numeri random:
rand(5,1)
% Vettore riga con 5 numeri random:

rand(1,5)

% di nuovo:
rand(1,5)

% Calcolo della media:
mean(rand(1,5))
mean(rand(1,1e7))  %% e' circa un mezzo

% 5 numeri random tra 0 e 6:
6*rand(1,5)

% 5 lanci con un dado a 6 facce:

fix(6*rand(1,5))+1   
%% fix calcola la parte intera (arrotondando verso lo zero)

% cento lanci di un dado a 6 facce:
fix(6*rand(1,100))+1

% punto medio su 100.000 lanci di un dado:

mean(fix(6*rand(1,100000))+1)      %% circa 3,5

% Complessita' computazionale del calcolo del determinante con la formula
% di Leibniz con i programmi
% http://www.dm.unibo.it/~achilles/calc/programmi/perm_sign.m
% http://www.dm.unibo.it/~achilles/calc/programmi/leibniz.m

a=rand(6); t=cputime; leibniz(a); t1 = cputime - t
t1 =  0.70312

a=rand(7); t=cputime; leibniz(a); t2 = cputime - t
t2 =  5.6562

% cioe' circa 49/6 volte il tempo necessario per calcolare un 
% determinante di ordine 6:

t2/t1, 49/6

% Calcolo del tempo necessario per calcolare un determinate di ordine 24
% con la formula di Leibniz:

factorial(24)*24   %% numero di operazioni (approssimativamente)

% Supponiamo di fare il calcolo con un computer di 10 GigaFLOPS
% cioe' con un processore che esegue 10^10 operazioni in virgola mobile
% in un secondo.

ans/1.e10 %% tempo necessario in secondi
ans/60    %% tempo necessario in minuti
ans/60    %% in ore
ans/24    %% in giorni
ans/365   %% in anni: piu' di 47 milioni anni!!!

