Я написал алгоритм обмена четностью и бинарного поиска.X и Y - две случайные последовательности.Первый шаг, X и Y делят строку на блоки, которые означают 1000 битов на 100 * 10 подмножеств, каждое подмножество имеет 100 битов.X и Y будут обмениваться информацией четности о подмножествах, если несовпадение четности, они вызывают метод двоичного поиска, чтобы найти ошибку и исправить ее.Все это происходит в первой итерации.Во второй итерации (максимум это занимает 4 итерации) X и Y случайным образом перемешивают свои 1000 битов, повторяют один и тот же алгоритм чётного обмена и двоичного поиска.Всякий раз, когда X и Y тасуют свои 1000 бит, алгоритм показывает исправленный дополнительный бит (changeindex).Хотя я заметил, что этот неправильный результат начинает появляться в последующих шаффлах.Я пытаюсь исправить это, чтобы не допустить повторения одного и того же индекса или рассматривать неправильную разницу в качестве ответа, но я не смог.Пример: если разница в позициях X и Y равна 5 3 110 521 891 974, но когда она исправляется, она показывает дважды, например, 5 3 110 110 521 521 891 974 974.
clear all; clc; close all;
X = randi([0,1],1000,1);
Y = bsc(X,0.02);
X_Original = X; Y_Original = Y;
diff_ind = [];
for i = 1:length(X)
if X_Original(i) ~= Y_Original(i)
diff_ind = [diff_ind i];
end
end
changeindex = [];
Iteration = 1;
ind = [1:length(X)]';
while length(changeindex) < length(diff_ind)
block_dim = Iteration*36;
%% defining the length
for div = 1:floor(length(X)/block_dim)
tX = X(1+(div-1)*block_dim:div*block_dim);
tY = Y(1+(div-1)*block_dim:div*block_dim);
tind = ind(1+(div-1)*block_dim:div*block_dim);
len = length(tX);
backup_tX = [];
backup_tY = [];
backup_ind = [];
pass = 0;
while len > 1
pass = pass + 1;
% fprintf('Parity Number: %d\n',pass);
if mod(len,2) == 1
x = [tX(1:(len-1)/2) tX(1+(len-1)/2:len-1)];
y = [tY(1:(len-1)/2) tY(1+(len-1)/2:len-1)];
tind = [tind(1:(len-1)/2) tind(1+(len-1)/2:len-1)];
else
x = [tX(1:(len)/2) tX(1+(len)/2:len)];
y = [tY(1:(len)/2) tY(1+(len)/2:len)];
tind = [tind(1:(len)/2) tind(1+(len)/2:len)];
end
%% parity exchange
b1 = sum(x(:,1)) == sum(y(:,1));
b2 = sum(x(:,2)) == sum(y(:,2));
if (b1 == false) && (b2 == true)
tX = x(:,1);
tY = y(:,1);
tind = tind(:,1);
elseif (b2 == false) && (b1 == true)
tX = x(:,2);
tY = y(:,2);
tind = tind(:,2);
elseif (b1 == false) && (b2 == false)
tX = x(:,1);
tY = y(:,1);
if isempty(backup_tX)
backup_tX = x(:,2);
backup_tY = y(:,2);
backup_ind = tind(:,2);
else
backup_tX = [x(:,2); backup_tX];
backup_tY = [y(:,2); backup_tY];
backup_ind = [tind(:,2); backup_ind];
end
tind = tind(:,1);
else
break;
end
len = length(tX);
if len == 1
tY = tX;
Y(tind) = tX;
% fprintf('Change made at index: %d\n',tind);
changeindex = [changeindex tind];
if ~isempty(backup_tX)
tX = backup_tX;
tY = backup_tY;
tind = backup_ind;
len = length(tX);
backup_tX = [];
backup_tY = [];
backup_ind = [];
end
end
end
end
if block_dim > length(X)
break;
else
%% Shuffle
chng = randperm(length(X));
X = X(chng);
Y = Y(chng);
ind = ind(chng);
Iteration = Iteration + 1;
end
end
disp('------------------------');
disp('Original difference index:');
disp(sort(diff_ind));
disp('Changes made at index:');
disp(sort(changeindex));