Я хочу попросить Matlab сообщить мне, например, наибольший общий делитель полиномов x^4+x^3+2x+2 и x^3+x^2+x+1 над такими полями, как Z_3[x] ( где ответ x+1) и Z_5[x] (где ответ x^2-x+2).
Есть идеи, как мне это реализовать?
Я хочу попросить Matlab сообщить мне, например, наибольший общий делитель полиномов x^4+x^3+2x+2 и x^3+x^2+x+1 над такими полями, как Z_3[x] ( где ответ x+1) и Z_5[x] (где ответ x^2-x+2).
Есть идеи, как мне это реализовать?
Вот простая реализация. Полиномы кодируются как массивы коэффициентов, начиная с самой низкой степени: так, x^4+x^3+2x+2 равно [2 2 0 1 1]
. Функция принимает два полинома p, q и модуль k (который должен быть простым, чтобы алгоритм работал).
Примеры:
gcdpolyff([2 2 0 1 1], [1 1 1 1], 3)
возвращает [1 1]
, что означает 1+x.gcdpolyff([2 2 0 1 1], [1 1 1 1], 5)
возвращает [1 3 2]
, что означает 1+3x+2x^2; это не согласуется с вашим ответом, но я проверил вручную, и кажется, что ваш ответ неверен.Функция сначала заполняет массивы, чтобы они были одинаковой длины. Пока они не равны, он идентифицирует полином более высокой степени и вычитает из него полином более низкой степени, умноженный на соответствующую степень x. Это все.
function g = gcdpolyff(p, q, k)
p = [p, zeros(1, numel(q)-numel(p))];
q = [q, zeros(1, numel(p)-numel(q))];
while nnz(mod(p-q,k))>0
dp = find(p,1,'last');
dq = find(q,1,'last');
if (dp>=dq)
p(dp-dq+1:dp) = mod(p(1+dp-dq:dp) - q(1:dq), k);
else
q(dq-dp+1:dq) = mod(q(dq-dp+1:dq) - p(1:dp), k);
end
end
g = p(1:find(p,1,'last'));
end
Имена переменных dp и dq немного вводят в заблуждение: это не степени p и q, а скорее степени + 1.