多项式的Gcd模k

时间:2015-03-16 19:35:30

标签: matlab algebra polynomials finite-field

我想让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)。

我是如何实现这一点的?

1 个答案:

答案 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.