我想让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)。
我是如何实现这一点的?
答案 0 :(得分: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.