Search code examples
matlabalgebrapolynomialsfinite-field

Gcd of polynomials modulo k


I want to ask Matlab to tell me, for example, the greatest common divisor of polynomials of x^4+x^3+2x+2 and x^3+x^2+x+1 over fields like Z_3[x] (where an answer is x+1) and Z_5[x] (where an answer is x^2-x+2).

Any ideas how I would implement this?


Solution

  • Here's a simple implementation. The polynomials are encoded as arrays of coefficients, starting from the lowest degree: so, x^4+x^3+2x+2 is [2 2 0 1 1]. The function takes two polynomials p, q and the modulus k (which should be prime for the algorithm to work property).

    Examples:

    • gcdpolyff([2 2 0 1 1], [1 1 1 1], 3) returns [1 1] meaning 1+x.
    • gcdpolyff([2 2 0 1 1], [1 1 1 1], 5) returns [1 3 2] meaning 1+3x+2x^2; this disagrees with your answer but I hand-checked and it seems that yours is wrong.

    The function first pads arrays to be of the same length. As long as they are not equal, is identifies the higher-degree polynomial and subtracts from it the lower-degree polynomial multiplied by an appropriate power of x. That's all.

    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
    

    The names of the variables dp and dq are slightly misleading: they are not degrees of p and q, but rather degrees + 1.