def is_polynomial_irreducible(f, p): """ Rabin's polynomial irreducibility test over finite fields. """ gf_degree = len(f) - 1 if gf_degree <= 1: return True monic_field = galois_field_monic(f, p) compare_polynomial = [1, 0] indices = {gf_degree // i for i in factorint(gf_degree)} monomial_base = gf_frobenius_monomial_base(monic_field, p, ZZ) h = monomial_base[1] for i in range(1, gf_degree): if i in indices: g = gf_sub(h, compare_polynomial, p, ZZ) if gf_gcd(monic_field, g, p, ZZ) != [1]: return False h = gf_frobenius_map(h, monic_field, monomial_base, p, ZZ) return h == compare_polynomial
def test_gf_gcd(): assert gf_gcd([], [], 11, ZZ) == [] assert gf_gcd([2], [], 11, ZZ) == [1] assert gf_gcd([], [2], 11, ZZ) == [1] assert gf_gcd([2], [2], 11, ZZ) == [1] assert gf_gcd([], [1,0], 11, ZZ) == [1,0] assert gf_gcd([1,0], [], 11, ZZ) == [1,0] assert gf_gcd([3,0], [3,0], 11, ZZ) == [1,0] assert gf_gcd([1,8,7], [1,7,1,7], 11, ZZ) == [1,7]
def test_gf_gcd(): assert gf_gcd(ZZ.map([]), ZZ.map([]), 11, ZZ) == [] assert gf_gcd(ZZ.map([2]), ZZ.map([]), 11, ZZ) == [1] assert gf_gcd(ZZ.map([]), ZZ.map([2]), 11, ZZ) == [1] assert gf_gcd(ZZ.map([2]), ZZ.map([2]), 11, ZZ) == [1] assert gf_gcd(ZZ.map([]), ZZ.map([1, 0]), 11, ZZ) == [1, 0] assert gf_gcd(ZZ.map([1, 0]), ZZ.map([]), 11, ZZ) == [1, 0] assert gf_gcd(ZZ.map([3, 0]), ZZ.map([3, 0]), 11, ZZ) == [1, 0] assert gf_gcd(ZZ.map([1, 8, 7]), ZZ.map([1, 7, 1, 7]), 11, ZZ) == [1, 7]
def test_gf_euclidean(): assert gf_gcd([], [], 11, ZZ) == [] assert gf_gcd([2], [], 11, ZZ) == [1] assert gf_gcd([], [2], 11, ZZ) == [1] assert gf_gcd([2], [2], 11, ZZ) == [1] assert gf_gcd([], [1, 0], 11, ZZ) == [1, 0] assert gf_gcd([1, 0], [], 11, ZZ) == [1, 0] assert gf_gcd([3, 0], [3, 0], 11, ZZ) == [1, 0] assert gf_gcd([1, 8, 7], [1, 7, 1, 7], 11, ZZ) == [1, 7] assert gf_gcdex([], [], 11, ZZ) == ([1], [], []) assert gf_gcdex([2], [], 11, ZZ) == ([6], [], [1]) assert gf_gcdex([], [2], 11, ZZ) == ([], [6], [1]) assert gf_gcdex([2], [2], 11, ZZ) == ([], [6], [1]) assert gf_gcdex([], [3, 0], 11, ZZ) == ([], [4], [1, 0]) assert gf_gcdex([3, 0], [], 11, ZZ) == ([4], [], [1, 0]) assert gf_gcdex([3, 0], [3, 0], 11, ZZ) == ([], [4], [1, 0]) assert gf_gcdex([1, 8, 7], [1, 7, 1, 7], 11, ZZ) == ([5, 6], [6], [1, 7])
def test_gf_euclidean(): assert gf_gcd([], [], 11, ZZ) == [] assert gf_gcd([2], [], 11, ZZ) == [1] assert gf_gcd([], [2], 11, ZZ) == [1] assert gf_gcd([2], [2], 11, ZZ) == [1] assert gf_gcd([], [1,0], 11, ZZ) == [1,0] assert gf_gcd([1,0], [], 11, ZZ) == [1,0] assert gf_gcd([3,0], [3,0], 11, ZZ) == [1,0] assert gf_gcd([1,8,7], [1,7,1,7], 11, ZZ) == [1,7] assert gf_gcdex([], [], 11, ZZ) == ([1], [], []) assert gf_gcdex([2], [], 11, ZZ) == ([6], [], [1]) assert gf_gcdex([], [2], 11, ZZ) == ([], [6], [1]) assert gf_gcdex([2], [2], 11, ZZ) == ([], [6], [1]) assert gf_gcdex([], [3,0], 11, ZZ) == ([], [4], [1,0]) assert gf_gcdex([3,0], [], 11, ZZ) == ([4], [], [1,0]) assert gf_gcdex([3,0], [3,0], 11, ZZ) == ([], [4], [1,0]) assert gf_gcdex([1,8,7], [1,7,1,7], 11, ZZ) == ([5,6], [6], [1,7])