% Задание 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);