多项式模 k 的 Gcd
Gcd of polynomials modulo k
我想请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)
returns [1 1]
表示 1+x.
gcdpolyff([2 2 0 1 1], [1 1 1 1], 5)
returns [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。
我想请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)
returns[1 1]
表示 1+x.gcdpolyff([2 2 0 1 1], [1 1 1 1], 5)
returns[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。