function [prijate_chybne, opraveno,syndromy,pozice,hodnotachyb,vektor_chyb,chyba] = bchbmdek(n, k, m, pp, prijateslovo, chyby)

clc;     
t=bchnumerr(n,k);         %korekční schopnost
pozice=0;
hodnotachyb=0;

prijatepom = gf(zeros(1,n),m,pp);           % převedení slova do prvků GF
for i = 1:n                            % invertace prijateho slova
    prijatepom(i) = prijateslovo(i);
end
vektorchyb = gf(chyby,m,pp);

prijate_chybne = prijatepom + vektorchyb;

alpha = gf(2, m);
zero = gf(0, m);
one = gf(1, m);


alpha_tb=gf(zeros(1, 2*t), m);
for i=1:2*t,
    alpha_tb(i)=alpha^(2*t-i+1);
end;

%Vypocet syndromu
syndrome=gf(zeros(1, 2*t), m);
syndromepom=gf(zeros(1, 2*t), m);
for i=1:n,
    syndrome=syndrome.*alpha_tb+prijate_chybne(i);
end;
for i=1:2*t
    syndromepom(i)=syndrome(2*t+1-i);
end;
syndromy = syndromepom;
syndromy = double(syndromy.x);

% zacatek BM algoritmu

lambda = gf([1, zeros(1, t)], m);
lambda0= lambda;
b=gf([0, 1, zeros(1, t)], m);
b2 = gf([0, 0, 1, zeros(1, t)], m);
kk=0;
gamma = one;
delta = zero;
syndrome_array = gf(zeros(1, t+1), m);

    for r=1:2*t,
        r1 = 2*t-r+1;
        r2 = min(r1+t, 2*t);
        num = r2-r1+1;
        syndrome_array(1:num) = syndrome(r1:r2);
        delta = syndrome_array*lambda';

        lambda0 = lambda;
        lambda = gamma*lambda-delta*b(1:t+1);

        if((delta ~= zero) && (k>=0))
            b(2:2+t)=lambda0;
            gamma = delta;
            kk=-kk-1;
        else
            b(2:2+t) = b(1:t+1);
            gamma = gamma;
            kk=kk+1;
        end   
    end

inverse_tb = gf(zeros(1, t+1), m);
for i=1:t+1,
    inverse_tb(i) = alpha^(-i+1);
end;

%chien search
lambda_v = zero;
accu_tb=gf(ones(1, t+1), m);
count = 1;
for i=1:n,
    lambda_v=lambda*accu_tb';
    accu_tb = accu_tb.*inverse_tb;
    if(lambda_v==zero)
        error(1,n-i+1)=1;   
        pozice(count) = i;
            count = count + 1;
    else
        error(1,n-i+1)=0;
    end

end
vektor_chyb=error;
opravenopom = prijate_chybne + vektor_chyb;



if pozice ~=0
hodnotachyb=zeros(1,length(pozice));
for count=1:length(pozice)
    hodnotachyb(count)=1;
end
end


kontrola = gf(zeros(1,n),m,pp);
chyba = 0;

for i = 1:n
    kontrola(i) = prijatepom(i) + opravenopom(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
    for i=1:length(pozice)
    pozice(i) = (n-pozice(i)+1);
    end
end




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



    
prijate_chybne = double(prijate_chybne.x);    