function L = legendre_poly(n, a, b)
% LEGENDRE_POLY  - racuna sve Lezandrove polinome do stepena n
% Polinomi imaju osobinu da je Ln(1)=1
% Funkcija vraca cell array L, tako da je L{i}=Li-1

L{1} = 1;        % L0 = 1
L{2} = [1 0];    % L1 = x

% Ostali polinomi se racunaju na osnovu rekurentne formule
%  Li(x)=(2i-1)/i x Li-1(x) - (i-1)/i Li-2(x)
for i=2:n
    L{i+1}=((2*i-1)/i)*[L{i} 0]-[0 0 (i-1)/i*L{i-1}]; %polinom stepena i
end

% U slucaju da je naveden i interval razlicit od podrazumevanog [-1 1]
% vrsimo preslikavanje polinoma na dati interval [a, b]
if (nargin == 3)
    for i = 2:n+1
         L{i} = map_to_interval(L{i}, a, b);
    end
end

% Pomocna funkcija koja preslikava polinom P sa [-1, 1] na [a, b]
% uvodjenjem smene t = (2x-b-a)/(b-a)
% Hornerovom shemom se izracunava vrednost polinoma P u tacki t
function Pab = map_to_interval(P, a, b)
Pab = P(1); 
for j=2:length(P)
    Pab = (2*[Pab 0]-(b+a)*[0 Pab])/(b-a);
    Pab(end) = Pab(end) + P(j);
end