
function [prijate_chybne, opraveno, hodnotachyb, pozice, polynom_chyb, syndromy, chyba] = pgzdek(n, k, m, pp, prijateslovo, chyby)
clc;

t=(n-k)/2;         %korekční schopnost
pozice=0;
value=0;
hodnotachyb=0;
polynom_chyb = gf(zeros(1,n),m,pp);
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
vektorchyb = gf(chyby,m,pp);
for i = 1:n                            % invertace chyb slova
    vektorchyb(i) = chyby(n+1-i);
end

prijate_chybne = prijatepom + vektorchyb;

% % % % % % % % % % % % % % % % vypocet syndromu

s = gf(zeros(1,2*t),m,pp);              
syndrompom=gf(zeros(1,2*t),m,pp); 
for z = 1:2*t
s(z) = 0;
alpha = gf(2,m,pp);
for j = 1:n
    pom = gf(prijate_chybne(j),m,pp)*alpha^((j-1)*z);
    s(z) = s(z)+pom;
end
end

    for i=1:(2*t)
    syndrompom(i)=s((2*t+1)-i);
    end
    syndromy = syndrompom;
    syndromy = double(syndromy.x);
    
% % % % % % % % % % % % % % % % Zacatek PGZ algoritmu

konec = 0;
while (~konec)

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

    delta = det(A);
% % % % % % % % % % % % % % % %  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);
       
        lokalpoly = sigma;
        lokalpoly = double(lokalpoly.x);
        
% % % % % % % % % % % % % % % %  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        
        for h = 1:t
            for g = 1:n
                if g == pozice(h)
                    polynom_chyb(g) = value(h);
                end
            end
        end
        polynom_chyb;
        opraveno = prijate_chybne + polynom_chyb;
        
% % % % % % % % % % % % % % % %  Else: Pokud je stupen mensi nez t. Dekrementuj hodnotu t o 1
    else
        t = t-1;
        if t == 0
            konec = 1;
        end
    end
    if t == 0
        opraveno = prijate_chybne;
    end
    
end

kontrola = gf(zeros(1,n),m,pp);
chyba = 0;
for i = 1:n
    kontrola(i) = prijatepom(i) + opraveno(i);
        if kontrola(i) ~= 0
            chyba = chyba + 1;
        end
    
end

polynom_chybp = gf(zeros(1,n),m,pp);
for i = 1:n 
       prijatepom(i) = prijate_chybne(n+1-i);
end
    prijate_chybne=prijatepom;
for i = 1:n                         
    prijatepom(i) = opraveno(n+1-i);

end
opraveno=prijatepom;

if chyba > 0
    hodnotachyb = 'hodnoty chyb nenalezeny';
    pozice = 'pozice chyb nenalezeny';
    polynom_chyb='polynom chyb nenalezen';
    
    
else
    if pozice ~=0
    pozice = (n+1-pozice);
    hodnotachyb = value';
    hodnotachyb = double(hodnotachyb.x);
         for i = 1:n                         
    polynom_chybp(i) = polynom_chyb(n+1-i);
     end
    
    end
    polynom_chyb = double(polynom_chybp.x);
end

opraveno = double(opraveno.x);
prijate_chybne = double(prijate_chybne.x);