function C = cebisev_poly(n, a, b)
% CEBISEV_POLY  - racuna sve Cebisevljeve polinome do stepena n
% Polinomi imaju osobinu da je Cn(1)=1
% Funkcija vraca cell array C, tako da je C{i}=Ci-1

C{1} = 1;        % C0 = 1
C{2} = [1 0];    % C1 = x

% Ostali polinomi se racunaju na osnovu rekurentne formule
%  Ci(x) = 2x Ci-1(x) - Ci-2(x)
for i=2:n
    C{i+1}=2*[C{i} 0]-[0 0 C{i-1}];
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
         C{i} = map_to_interval(C{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