Загрузка данных


% Задание 3: Операции над полиномами в Octave

% Исходные полиномы из вашего варианта:
% a(x) = x^8 + x^5 + x^3 + x
a =; 
% b(x) = x^4 + x^2 + 1
b =;

disp('--- Исходные полиномы ---');
fprintf('a(x) = '); disp(a);
fprintf('b(x) = '); disp(b);

%% ОБЫЧНЫЕ ПОЛИНОМЫ
disp('================ ОБЫЧНЫЕ ПОЛИНОМЫ ================');

% а) Сложение полиномов (дополняем b нулями слева до длины a)
max_len = max(length(a), length(b));
a_pad = [zeros(1, max_len - length(a)), a];
b_pad = [zeros(1, max_len - length(b)), b];
poly_sum = a_pad + b_pad;
disp('а) Сложение полиномов a(x) + b(x):');
disp(poly_sum);

% б) Умножение полиномов
poly_mult = conv(a, b);
disp('б) Умножение полиномов a(x) * b(x):');
disp(poly_mult);

% в) Деление полиномов
[q, r] = deconv(a, b);
disp('в) Деление полиномов a(x) / b(x):');
fprintf('Частное (q): '); disp(q);
fprintf('Остаток (r): '); disp(r);


%% ДВОИЧНЫЕ ПОЛИНОМЫ НАД ПОЛЕМ GF(2)
disp('================ ДВОИЧНЫЕ ПОЛИНОМЫ НАД GF(2) ================');

% г) Преобразование полиномов в двоичные (по модулю 2)
a_bin = mod(a, 2);
b_bin = mod(b, 2);
fprintf('г) Двоичный полином a(x) mod 2: '); disp(a_bin);
fprintf('г) Двоичный полином b(x) mod 2: '); disp(b_bin);

% д) Сложение двоичных полиномов (XOR коэффициентов)
bin_sum = mod(a_pad + b_pad, 2);
disp('д) Сложение двоичных полиномов:');
disp(bin_sum);

% е) Умножение двоичных полиномов
bin_mult = mod(conv(a_bin, b_bin), 2);
disp('е) Умножение двоичных полиномов:');
disp(bin_mult);

% ж) Деление двоичного полинома a(x) на b(x) через деление в столбик mod 2
% (Реализовано через кастомный цикл, чтобы код работал без сторонних пакетов)
q_bin = [];
rem_bin = a_bin;
while length(rem_bin) >= length(b_bin) && any(rem_bin)
    % Находим первую единицу
    idx = find(rem_bin, 1);
    if idx > length(rem_bin) - length(b_bin) + 1
        break;
    end
    % Формируем частное
    shift = length(rem_bin) - idx - (length(b_bin) - 1);
    curr_q = zeros(1, shift + 1);
    curr_q(1) = 1;
    q_bin = [zeros(1, max(0, shift + 1 - length(q_bin))), q_bin];
    q_bin(end-shift) = 1;
    
    % Вычитаем (XOR) делитель
    sub_b = [zeros(1, idx-1), b_bin, zeros(1, shift)];
    rem_bin = mod(rem_bin + sub_b, 2);
end
% Убираем ведущие нули в остатке
idx_r = find(rem_bin, 1);
if isempty(idx_r)
    rem_bin = 0;
else
    rem_bin = rem_bin(idx_r:end);
end

disp('ж) Деление двоичных полиномов:');
fprintf('Частное (q_bin): '); disp(q_bin);
fprintf('Остаток (r_bin): '); disp(rem_bin);