
function vystupdekoderu = pgzdeksim(n, k, m, pp, prijateslovo)
chyba = 0;

t=(n-k)/2;         %korekční schopnost

prijatepom = gf(zeros(1,n),m,pp);           % převedení slova do prvků GF

for i = 1:n                            % invertace prijateho slova
    prijatepom(i) = prijateslovo(n+1-i);
end

prijate_chybne=prijatepom;

% % % % % % % % % % % % % % % % Vypocet syndromu
s = gf(zeros(1,2*t),m,pp);
alpha = gf(2, m, pp);
alpha_tb=gf(zeros(1, 2*t), m, pp);
for i=1:2*t;
    alpha_tb(i)=alpha^i;
end;
s = gf(zeros(1, 2*t), m, pp);

for i = n:-1:1,
    s = s.*alpha_tb +prijate_chybne(i);
end;

s;
 hledej = find(double(s.x));
 if length(hledej)==0      %pokud syndromy =0 konec dekodovani
    opraveno = prijate_chybne;  
 else
    
% % % % % % % % % % % % % % % %zacatek PGZ algoritmu    

konec = 0;
pocitadlo=0;
while (~konec)
    
% % % % % % % % % % % % % % % % Krok 1: Kontrola determinantu
    
    pocitadlo=pocitadlo+1;
    A = gf([zeros(t,t)],m,pp);
    for i1=1:t
        for i2=1:t
            A(i1,i2) = s(i1+i2-1);
        end
    end

% % % % % % % % % % % % % % % %  Krok 2: Pokud je determinant nenulovy, nastalo t chyb.    
    if (det(A) ~= 0) 
        konec = 1;
        B = gf(zeros(t,1),m,pp);
        sigma = gf(zeros(1,t),m,pp);
        invA = A^(-1);
        spom = gf(zeros(1,t),m,pp);
        for h = 1:t
            spom(h) = s(h+t);
        end
        spom = spom';
        sigma = invA * spom;
        sigma = sigma';
        sigma(t+1) = gf(1,m,pp);       
        
% % % % % % % % % % % % % % % %  Nalezeni pozic chyb (Chien search)        
        
        r = roots(sigma);
        
        if isempty(r)
            
            t = 0;
            
        else
        position = gf(zeros(1,t),m,pp);
       
        position = 1./r;
% % % % % % % % % % % % % % % %  Nalezeni hodnot chyb
        t = length(position);
        for i1=1:t
            for i2=1:t
                A(i1,i2) = position(i2)^(i1);
            end
        end
        if det(A) ~= 0
        for i=1:t, B(i)=s(i); end       
        value = (A^-1) * B;   
        
        value;
        else
            value = zeros(1,length(position));
        
        end
        end
        
        alpha = gf(2,m,pp);
        for b = 1:t
            for z = 1:(2^m-1)
               if position(b) == alpha^z
                   pozice(b) = z;
                       if pozice(b) == 2^m-1
                           pozice(b) = 1;
                       else
                          pozice(b) = pozice(b)+1;
                       end
            
               end
            
            end
        end
 % % % % % % % % % % % % % % % %  Opraveni prijateho polynomu       
        errorpoly = gf(zeros(1,n),m,pp);
        
        for h = 1:t
            for g = 1:n
                if g == pozice(h)
                    errorpoly(g) = value(h);
                end
            end
        end

        opraveno = prijate_chybne + errorpoly;
       
    else
        
% % % % % % % % % % % % % % % %  Else: Pokud je stupen mensi nez t. Dekrementuj hodnotu t o 1 

        t = t-1;                  
        if t == 0
            konec = 1;
        end
    end
    if t == 0
        opraveno = prijate_chybne;
    end
    
end
end

opr = gf(zeros(1,n),m,pp);

for i = 1:n 
       opr(i) = opraveno(n+1-i);
end

vystupdekoderu=opr(1:k);
