galois.poly_egcd

galois.poly_egcd(a, b)

Finds the polynomial multiplicands of \(a(x)\) and \(b(x)\) such that \(a(x)s(x) + b(x)t(x) = \mathrm{gcd}(a(x), b(x))\).

This implementation uses the Extended Euclidean Algorithm.

Parameters
  • a (galois.Poly) – A polynomial \(a(x)\) over \(\mathrm{GF}(q)\).

  • b (galois.Poly) – A polynomial \(b(x)\) over \(\mathrm{GF}(q)\).

Returns

  • galois.Poly – Polynomial greatest common divisor of \(a(x)\) and \(b(x)\).

  • galois.Poly – Polynomial \(s(x)\), such that \(a(x)s(x) + b(x)t(x) = \mathrm{gcd}(a(x), b(x))\).

  • galois.Poly – Polynomial \(t(x)\), such that \(a(x)s(x) + b(x)t(x) = \mathrm{gcd}(a(x), b(x))\).

Examples

In [1]: GF = galois.GF(7)

In [2]: a = galois.Poly.Roots([2,2,2,3,6], field=GF); a
Out[2]: Poly(x^5 + 6x^4 + x + 3, GF(7))

# a(x) and b(x) only share the root 2 in common
In [3]: b = galois.Poly.Roots([1,2], field=GF); b
Out[3]: Poly(x^2 + 4x + 2, GF(7))

In [4]: gcd, x, y = galois.poly_egcd(a, b); gcd, x, y
Out[4]: (Poly(x + 5, GF(7)), Poly(5, GF(7)), Poly(2x^3 + 4x^2 + x + 2, GF(7)))

# The GCD has only 2 as a root with multiplicity 1
In [5]: gcd.roots(multiplicity=True)
Out[5]: (GF([2], order=7), array([1]))

In [6]: a*x + b*y == gcd
Out[6]: True