Matlab 模k多项式的Gcd

Matlab 模k多项式的Gcd,matlab,algebra,polynomials,finite-field,Matlab,Algebra,Polynomials,Finite Field,我想让Matlab告诉我,例如,在像Z_3[x](其中答案是x+1)和Z_5[x](其中答案是x^2-x+2)这样的域上,x^4+x^3+2x+2和x^3+x^2+x+1的多项式的最大公因式 有什么想法可以实现吗?这里是一个简单的实现。多项式从最低阶开始编码为系数数组:因此,x^4+x^3+2x+2是[2 2 0 1]。该函数采用两个多项式p、q和模k(对于算法的工作性质而言,这应该是素数) 示例: gcdpolyff([22001],[1111],3)返回[11]表示1+x gcdpolyf

我想让Matlab告诉我,例如,在像Z_3[x](其中答案是x+1)和Z_5[x](其中答案是x^2-x+2)这样的域上,x^4+x^3+2x+2和x^3+x^2+x+1的多项式的最大公因式


有什么想法可以实现吗?

这里是一个简单的实现。多项式从最低阶开始编码为系数数组:因此,x^4+x^3+2x+2是
[2 2 0 1]
。该函数采用两个多项式p、q和模k(对于算法的工作性质而言,这应该是素数)

示例:

  • gcdpolyff([22001],[1111],3)
    返回
    [11]
    表示1+x
  • gcdpolyff([22001],[1111],5)
    返回
    [1232]
    表示1+3x+2x^2;这与你的答案不一致,但我亲自检查了一下,似乎你的答案是错的
该函数首先使阵列具有相同的长度。只要它们不相等,is就会识别高次多项式,并从中减去低次多项式乘以适当的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

您是希望自己实际实现一个算法,还是可以使用这样的现有实现@它说你不能在matlab中使用它?我不想实现我自己的算法,我只是想为我计算一下。(我尝试了wolfram alpha,但每个答案都是1!)(实际上,用户错误可能是它是1的原因,但我仍然希望有一种使用matlab计算的方法)应该没有那么困难: