function rk=rackoreny(P,tol)
% function rk=rackoreny(P)
% Racionalni koreny polynomu P
% Polynom musi byt s celociselnymi koeficienty

if nargin==1
   tol=0.000001;
end

if any(round(P)~=P)
   error('Polynom nema celociselne koeficienty.');
end

if(P==0)
   error('Polynom je nulovy.');
end

% Odstraneni nul na zacatku
while P(1)==0
   P(1)=[];
end   


rk=[];
l=length(P);
% Odstraneni nul na konci
while P(l)==0
   rk=[rk,0];
   P(l)=[];
   l=l-1;
end


% Hledame delitele koeficientu u nejvyssi mocniny - kandidaty na jmenovatele
c=abs(P(1));         % rozklad na prvocinitele -  chybi tam jednicka
j1=factor(c);
jmen=[1 j1];
for k=2:length(j1)      % hledame souciny vsech kombinaci
   kombinace=nchoosek(j1,k);
   jmen=[jmen, prod(kombinace')];
end
% Vypustime opakovana cisla
jmen=sort(jmen);
lj=length(jmen);
dj=jmen(2:lj)-jmen(1:lj-1);
I=find(dj==0);
jmen(I+1)=[];

% Hledame delitele koeficientu u absolutniho clenu - kandidaty na citatele
c=abs(P(l));         % rozklad na prvocinitele -  chybi tam jednicka
c1=factor(c);
cit=[1 c1];
for k=2:length(c1)      % hledame souciny vsech kombinaci
   kombinace=nchoosek(c1,k);
   cit=[cit, prod(kombinace')];
end
% Vypustime opakovana cisla
cit=sort(cit);
lc=length(cit);
dc=cit(2:lc)-cit(1:lc-1);
I=find(dc==0);
cit(I+1)=[];

% Vyrobime vsechny mozne zlomky
zlomky=[];
for k=1:length(jmen)
   zlomky=[zlomky, cit/jmen(k)];
end   
% Vypustime opakovana cisla
zlomky=sort(zlomky);
lz=length(zlomky);
dz=zlomky(2:lz)-zlomky(1:lz-1);
I=find(dz==0);
zlomky(I+1)=[];
zlomky=[zlomky, -zlomky];
   
n=length(zlomky);
for k=1:n
   if length(P)==1, break; end
   if length(P)==2
      rk=[rk, -P(2)/P(1)];
      break
   end
   z_k=zlomky(k);
   Pz=polyval(P,z_k);
   while abs(Pz)<tol
      rk=[rk,z_k];
      [P,R]=deconv(P,[1 -z_k]);
      Pz=polyval(P,z_k);
   end
end
