
function [prijate_chybne, opraveno, syndromy, pozice, hodnotachyb,vektor_chyb,chyba] = bchpgzdek(n, k, m, pp, prijateslovo, chyby)
clc
t=bchnumerr(n,k);
pozice=0;
value=0;
hodnotachyb=0;
vektor_chyb = zeros(1,n);
        opravenopom = gf([zeros(1,n)],m,pp);
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
vektorchyb = gf(chyby,m,pp);
for i = 1:n                            % invertace chyb slova
    vektorchyb(i) = chyby(n+1-i);
end

prijate_chybne = prijatepom + vektorchyb;

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

syndromy=double(s.x);


% % % % % % % % % % % % % % % %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;
        for i=1:t, for j=1:n
          val = alpha^(j-1);
          if val == position(i)
            pozice(i) = n+1-j;
            vektor_chyb(pozice)=1;
          end
        end, end
% % % % % % % % % % % % % % % %  Nalezeni hodnot chyb

        for i1=1:t, for i2=1:t
                A(i1,i2) = position(i2)^(i1+b-1);
            end, end
        for i=1:t, B(i)=s(i); end
        value = (A \ B); 

        hodnotachyb=double(value.x);

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

        est_error = gf([zeros(1,n)],m,pold);
        est_code_pol = gf([zeros(1,n)],m,pold);

        for i=1:t, for j=1:n
                val = alpha^(j-1);
                if val == position(i)
                    est_error(j) = est_error(j) + value(i);
                end
        end, end
        opraveno = prijate_chybne + est_error;
       
        
    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
        for i = 1:n                         
        opravenopom(i) = opraveno(n+1-i);
        end
opraveno=opravenopom;
kontrola = gf(zeros(1,n),m,pp);
chyba = 0;
prijatepom2=gf(zeros(1,length(prijatepom)),m,pp);
for i = 1:n                            % invertace prijateho slova
    prijatepom2(i) = prijatepom(n+1-i);
end
for i = 1:n
    kontrola(i) = prijatepom2(i) + opraveno(i);
        if kontrola(i) ~= 0
            chyba = chyba + 1;
        end
    
end

if chyba > 0
    hodnotachyb = 'hodnoty chyb nenalezeny';
    pozice = 'pozice chyb nenalezeny';
    vektor_chyb='polynom chyb nenalezen';
else
    if pozice ~=0 & isfloat(pozice)
    hodnotachyb = value';
    hodnotachyb = double(hodnotachyb.x);
    end
end
for i = 1:n                            % invertace prijateho slova
    prijatepom(i) = prijate_chybne(n+1-i);
end
prijate_chybne=prijatepom;

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