
function vystupdekoderu = bchpgzdeksim(n, k, m, pp, prijateslovo)
t=bchnumerr(n,k);
d=2*t+1;
b=1;  
pold =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

prijate_chybne = prijatepom;

alpha = gf(2,m,pold);

% % % % % % % % % % % % % % % % Vypocet syndromu

s = gf(zeros(1,2*t),m,pp);
for i=b:b+d-2
    ev = gf([zeros(1,n)],m,pold);  
    val = alpha^i;
    for j=1:n
        ev(j) = val^(j-1);
    end
    s(i-b+1) =prijate_chybne*ev';
end


% % % % % % % % % % % % % % % %zacatek PGZ algoritmu

konec = 0;
% t = floor(d/2);

while (~konec)
    
% % % % % % % % % % % % % % % % Krok 1: Kontrola determinantu

    A = gf([zeros(t,t)],m,pold);
    for i1=1:t
        for i2=1:t
            A(i1,i2) = s(i1+i2-1);
        end
    end
    delta = det(A);
    if (det(A) ~= 0)
        konec = 1;
        
% % % % % % % % % % % % % % % %  Krok 2: Pokud je determinant nenulovy, nastalo t chyb. 

        B = gf([zeros(t,1)],m,pold);
        sigma = gf([zeros(1,t)],m,pold);
        for i=1:t
            B(i) = s(t+i);
        end
        sigma = (A \ B)'; 
        sigma(t+1) = 1;
        
% % % % % % % % % % % % % % % %  Nalezeni pozic chyb (Chien search)

        r = roots(sigma);
        position = 1./r;


% % % % % % % % % % % % % % % %  Opraveni prijateho polynomu

        est_error = gf([zeros(1,n)],m,pold);
        est_code_pol = gf([zeros(1,n)],m,pold);
        opravenopom = gf([zeros(1,n)],m,pold);
        for i=1:length(position), for j=1:n
                val = alpha^(j-1);
                if val == position(i)
                    est_error(j) = est_error(j) + 1;
                end
        end, end
        est_code_pol = prijate_chybne + est_error;
        for i = 1:n                         
        opravenopom(i) = est_code_pol(n+1-i);
        end
        opravenopom=double(opravenopom.x);
         vystupdekoderu=opravenopom(1:k);     
    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
         vystupdekoderu=prijateslovo(1:k);
    end
end