def dup_sqf_list(f, K, all=False): """ Return square-free decomposition of a polynomial in ``K[x]``. Examples ======== >>> from sympy.polys.domains import ZZ >>> from sympy.polys.sqfreetools import dup_sqf_list >>> f = ZZ.map([2, 16, 50, 76, 56, 16]) >>> dup_sqf_list(f, ZZ) (2, [([1, 1], 2), ([1, 2], 3)]) >>> dup_sqf_list(f, ZZ, all=True) (2, [([1], 1), ([1, 1], 2), ([1, 2], 3)]) """ if not K.has_CharacteristicZero: return dup_gf_sqf_list(f, K, all=all) if K.has_Field or not K.is_Exact: coeff = dup_LC(f, K) f = dup_monic(f, K) else: coeff, f = dup_primitive(f, K) if K.is_negative(dup_LC(f, K)): f = dup_neg(f, K) coeff = -coeff if dup_degree(f) <= 0: return coeff, [] result, i = [], 1 h = dup_diff(f, 1, K) g, p, q = dup_inner_gcd(f, h, K) while True: d = dup_diff(p, 1, K) h = dup_sub(q, d, K) if not h: result.append((p, i)) break g, p, q = dup_inner_gcd(p, h, K) if all or dup_degree(g) > 0: result.append((g, i)) i += 1 return coeff, result
def dup_sqf_list(f, K, all=False): """ Return square-free decomposition of a polynomial in ``K[x]``. Examples ======== >>> from sympy.polys import ring, ZZ >>> R, x = ring("x", ZZ) >>> f = 2*x**5 + 16*x**4 + 50*x**3 + 76*x**2 + 56*x + 16 >>> R.dup_sqf_list(f) (2, [(x + 1, 2), (x + 2, 3)]) >>> R.dup_sqf_list(f, all=True) (2, [(1, 1), (x + 1, 2), (x + 2, 3)]) """ if K.is_FiniteField: return dup_gf_sqf_list(f, K, all=all) if K.has_Field: coeff = dup_LC(f, K) f = dup_monic(f, K) else: coeff, f = dup_primitive(f, K) if K.is_negative(dup_LC(f, K)): f = dup_neg(f, K) coeff = -coeff if dup_degree(f) <= 0: return coeff, [] result, i = [], 1 h = dup_diff(f, 1, K) g, p, q = dup_inner_gcd(f, h, K) while True: d = dup_diff(p, 1, K) h = dup_sub(q, d, K) if not h: result.append((p, i)) break g, p, q = dup_inner_gcd(p, h, K) if all or dup_degree(g) > 0: result.append((g, i)) i += 1 return coeff, result
def dup_sqf_list(f, K, all=False): """ Return square-free decomposition of a polynomial in ``K[x]``. Examples ======== >>> from sympy.polys import ring, ZZ >>> R, x = ring("x", ZZ) >>> f = 2*x**5 + 16*x**4 + 50*x**3 + 76*x**2 + 56*x + 16 >>> R.dup_sqf_list(f) (2, [(x + 1, 2), (x + 2, 3)]) >>> R.dup_sqf_list(f, all=True) (2, [(1, 1), (x + 1, 2), (x + 2, 3)]) """ if K.is_FiniteField: return dup_gf_sqf_list(f, K, all=all) if K.is_Field: coeff = dup_LC(f, K) f = dup_monic(f, K) else: coeff, f = dup_primitive(f, K) if K.is_negative(dup_LC(f, K)): f = dup_neg(f, K) coeff = -coeff if dup_degree(f) <= 0: return coeff, [] result, i = [], 1 h = dup_diff(f, 1, K) g, p, q = dup_inner_gcd(f, h, K) while True: d = dup_diff(p, 1, K) h = dup_sub(q, d, K) if not h: result.append((p, i)) break g, p, q = dup_inner_gcd(p, h, K) if all or dup_degree(g) > 0: result.append((g, i)) i += 1 return coeff, result
def test_dmp_diff(): assert dmp_diff([], 1, 0, ZZ) == [] assert dmp_diff([[]], 1, 1, ZZ) == [[]] assert dmp_diff([[[]]], 1, 2, ZZ) == [[[]]] assert dmp_diff([[[1], [2]]], 1, 2, ZZ) == [[[]]] assert dmp_diff([[[1]], [[]]], 1, 2, ZZ) == [[[1]]] assert dmp_diff([[[3]], [[1]], [[]]], 1, 2, ZZ) == [[[6]], [[1]]] assert dmp_diff([1, -1, 0, 0, 2], 1, 0, ZZ) == \ dup_diff([1, -1, 0, 0, 2], 1, ZZ) assert dmp_diff(f_6, 0, 3, ZZ) == f_6 assert dmp_diff(f_6, 1, 3, ZZ) == [[[[8460]], [[]]], [[[135, 0, 0], [], [], [-135, 0, 0]]], [[[]]], [[[-423]], [[-47]], [[]], [[141], [], [94, 0], []], [[]]]] assert dmp_diff(f_6, 2, 3, ZZ) == dmp_diff(dmp_diff(f_6, 1, 3, ZZ), 1, 3, ZZ) assert dmp_diff(f_6, 3, 3, ZZ) == dmp_diff( dmp_diff(dmp_diff(f_6, 1, 3, ZZ), 1, 3, ZZ), 1, 3, ZZ) K = FF(23) F_6 = dmp_normal(f_6, 3, K) assert dmp_diff(F_6, 0, 3, K) == F_6 assert dmp_diff(F_6, 1, 3, K) == dmp_diff(F_6, 1, 3, K) assert dmp_diff(F_6, 2, 3, K) == dmp_diff(dmp_diff(F_6, 1, 3, K), 1, 3, K) assert dmp_diff(F_6, 3, 3, K) == dmp_diff(dmp_diff(dmp_diff(F_6, 1, 3, K), 1, 3, K), 1, 3, K)
def test_dmp_diff(): assert dmp_diff([], 1, 0, ZZ) == [] assert dmp_diff([[]], 1, 1, ZZ) == [[]] assert dmp_diff([[[]]], 1, 2, ZZ) == [[[]]] assert dmp_diff([[[1], [2]]], 1, 2, ZZ) == [[[]]] assert dmp_diff([[[1]], [[]]], 1, 2, ZZ) == [[[1]]] assert dmp_diff([[[3]], [[1]], [[]]], 1, 2, ZZ) == [[[6]], [[1]]] assert dmp_diff([1, -1, 0, 0, 2], 1, 0, ZZ) == \ dup_diff([1, -1, 0, 0, 2], 1, ZZ) assert dmp_diff(f_6, 0, 3, ZZ) == f_6 assert dmp_diff(f_6, 1, 3, ZZ) == dmp_diff(f_6, 1, 3, ZZ) assert dmp_diff( f_6, 2, 3, ZZ) == dmp_diff(dmp_diff(f_6, 1, 3, ZZ), 1, 3, ZZ) assert dmp_diff(f_6, 3, 3, ZZ) == dmp_diff( dmp_diff(dmp_diff(f_6, 1, 3, ZZ), 1, 3, ZZ), 1, 3, ZZ) K = FF(23) F_6 = dmp_normal(f_6, 3, K) assert dmp_diff(F_6, 0, 3, K) == F_6 assert dmp_diff(F_6, 1, 3, K) == dmp_diff(F_6, 1, 3, K) assert dmp_diff(F_6, 2, 3, K) == dmp_diff(dmp_diff(F_6, 1, 3, K), 1, 3, K) assert dmp_diff(F_6, 3, 3, K) == dmp_diff( dmp_diff(dmp_diff(F_6, 1, 3, K), 1, 3, K), 1, 3, K)
def dup_discriminant(f, K): """ Computes discriminant of a polynomial in `K[x]`. Examples ======== >>> from sympy.polys.domains import ZZ >>> from sympy.polys.euclidtools import dup_discriminant >>> dup_discriminant([ZZ(1), ZZ(2), ZZ(3)], ZZ) -8 """ d = dup_degree(f) if d <= 0: return K.zero else: s = (-1)**((d * (d - 1)) // 2) c = dup_LC(f, K) r = dup_resultant(f, dup_diff(f, 1, K), K) return K.quo(r, c * K(s))
def dup_sqf_part(f, K): """ Returns square-free part of a polynomial in ``K[x]``. Examples ======== >>> from sympy.polys import ring, ZZ >>> R, x = ring("x", ZZ) >>> R.dup_sqf_part(x**3 - 3*x - 2) x**2 - x - 2 """ if K.is_FiniteField: return dup_gf_sqf_part(f, K) if not f: return f if K.is_negative(dup_LC(f, K)): f = dup_neg(f, K) gcd = dup_gcd(f, dup_diff(f, 1, K), K) sqf = dup_quo(f, gcd, K) if K.is_Field: return dup_monic(sqf, K) else: return dup_primitive(sqf, K)[1]
def dup_discriminant(f, K): """ Computes discriminant of a polynomial in `K[x]`. Examples ======== >>> from sympy.polys import ring, ZZ >>> R, x = ring("x", ZZ) >>> R.dup_discriminant(x**2 + 2*x + 3) -8 """ d = dup_degree(f) if d <= 0: return K.zero else: s = (-1)**((d*(d - 1)) // 2) c = dup_LC(f, K) r = dup_resultant(f, dup_diff(f, 1, K), K) return K.quo(r, c*K(s))
def dup_discriminant(f, K): """ Computes discriminant of a polynomial in `K[x]`. Examples ======== >>> from sympy.polys.domains import ZZ >>> from sympy.polys.euclidtools import dup_discriminant >>> dup_discriminant([ZZ(1), ZZ(2), ZZ(3)], ZZ) -8 """ d = dup_degree(f) if d <= 0: return K.zero else: s = (-1)**((d*(d-1)) // 2) c = dup_LC(f, K) r = dup_resultant(f, dup_diff(f, 1, K), K) return K.quo(r, c*K(s))
def dup_sqf_part(f, K): """ Returns square-free part of a polynomial in ``K[x]``. Examples ======== >>> from sympy.polys.domains import ZZ >>> from sympy.polys.sqfreetools import dup_sqf_part >>> dup_sqf_part([ZZ(1), ZZ(0), -ZZ(3), -ZZ(2)], ZZ) [1, -1, -2] """ if not K.has_CharacteristicZero: return dup_gf_sqf_part(f, K) if not f: return f if K.is_negative(dup_LC(f, K)): f = dup_neg(f, K) gcd = dup_gcd(f, dup_diff(f, 1, K), K) sqf = dup_quo(f, gcd, K) if K.has_Field or not K.is_Exact: return dup_monic(sqf, K) else: return dup_primitive(sqf, K)[1]
def dup_sqf_part(f, K): """ Returns square-free part of a polynomial in ``K[x]``. Examples ======== >>> from sympy.polys import ring, ZZ >>> R, x = ring("x", ZZ) >>> R.dup_sqf_part(x**3 - 3*x - 2) x**2 - x - 2 """ if K.is_FiniteField: return dup_gf_sqf_part(f, K) if not f: return f if K.is_negative(dup_LC(f, K)): f = dup_neg(f, K) gcd = dup_gcd(f, dup_diff(f, 1, K), K) sqf = dup_quo(f, gcd, K) if K.has_Field: return dup_monic(sqf, K) else: return dup_primitive(sqf, K)[1]
def dup_sqf_p(f, K): """ Return ``True`` if ``f`` is a square-free polynomial in ``K[x]``. **Examples** >>> from sympy.polys.domains import ZZ >>> from sympy.polys.sqfreetools import dup_sqf_p >>> dup_sqf_p([ZZ(1),-ZZ(2), ZZ(1)], ZZ) False >>> dup_sqf_p([ZZ(1), ZZ(0),-ZZ(1)], ZZ) True """ if not f: return True else: return not dup_degree(dup_gcd(f, dup_diff(f, 1, K), K))
def dup_sqf_p(f, K): """ Return ``True`` if ``f`` is a square-free polynomial in ``K[x]``. Examples ======== >>> from sympy.polys import ring, ZZ >>> R, x = ring("x", ZZ) >>> R.dup_sqf_p(x**2 - 2*x + 1) False >>> R.dup_sqf_p(x**2 - 1) True """ if not f: return True else: return not dup_degree(dup_gcd(f, dup_diff(f, 1, K), K))
def test_dup_gcd(): assert dup_zz_heu_gcd([], [], ZZ) == ([], [], []) assert dup_rr_prs_gcd([], [], ZZ) == ([], [], []) assert dup_zz_heu_gcd([2], [], ZZ) == ([2], [1], []) assert dup_rr_prs_gcd([2], [], ZZ) == ([2], [1], []) assert dup_zz_heu_gcd([-2], [], ZZ) == ([2], [-1], []) assert dup_rr_prs_gcd([-2], [], ZZ) == ([2], [-1], []) assert dup_zz_heu_gcd([], [-2], ZZ) == ([2], [], [-1]) assert dup_rr_prs_gcd([], [-2], ZZ) == ([2], [], [-1]) assert dup_zz_heu_gcd([], [2, 4], ZZ) == ([2, 4], [], [1]) assert dup_rr_prs_gcd([], [2, 4], ZZ) == ([2, 4], [], [1]) assert dup_zz_heu_gcd([2, 4], [], ZZ) == ([2, 4], [1], []) assert dup_rr_prs_gcd([2, 4], [], ZZ) == ([2, 4], [1], []) assert dup_zz_heu_gcd([2], [2], ZZ) == ([2], [1], [1]) assert dup_rr_prs_gcd([2], [2], ZZ) == ([2], [1], [1]) assert dup_zz_heu_gcd([-2], [2], ZZ) == ([2], [-1], [1]) assert dup_rr_prs_gcd([-2], [2], ZZ) == ([2], [-1], [1]) assert dup_zz_heu_gcd([2], [-2], ZZ) == ([2], [1], [-1]) assert dup_rr_prs_gcd([2], [-2], ZZ) == ([2], [1], [-1]) assert dup_zz_heu_gcd([-2], [-2], ZZ) == ([2], [-1], [-1]) assert dup_rr_prs_gcd([-2], [-2], ZZ) == ([2], [-1], [-1]) assert dup_zz_heu_gcd([1, 2, 1], [1], ZZ) == ([1], [1, 2, 1], [1]) assert dup_rr_prs_gcd([1, 2, 1], [1], ZZ) == ([1], [1, 2, 1], [1]) assert dup_zz_heu_gcd([1, 2, 1], [2], ZZ) == ([1], [1, 2, 1], [2]) assert dup_rr_prs_gcd([1, 2, 1], [2], ZZ) == ([1], [1, 2, 1], [2]) assert dup_zz_heu_gcd([2, 4, 2], [2], ZZ) == ([2], [1, 2, 1], [1]) assert dup_rr_prs_gcd([2, 4, 2], [2], ZZ) == ([2], [1, 2, 1], [1]) assert dup_zz_heu_gcd([2], [2, 4, 2], ZZ) == ([2], [1], [1, 2, 1]) assert dup_rr_prs_gcd([2], [2, 4, 2], ZZ) == ([2], [1], [1, 2, 1]) assert dup_zz_heu_gcd([2, 4, 2], [1, 1], ZZ) == ([1, 1], [2, 2], [1]) assert dup_rr_prs_gcd([2, 4, 2], [1, 1], ZZ) == ([1, 1], [2, 2], [1]) assert dup_zz_heu_gcd([1, 1], [2, 4, 2], ZZ) == ([1, 1], [1], [2, 2]) assert dup_rr_prs_gcd([1, 1], [2, 4, 2], ZZ) == ([1, 1], [1], [2, 2]) f, g = [1, -31], [1, 0] assert dup_zz_heu_gcd(f, g, ZZ) == ([1], f, g) assert dup_rr_prs_gcd(f, g, ZZ) == ([1], f, g) f = [1, 8, 21, 22, 8] g = [1, 6, 11, 6] h = [1, 3, 2] cff = [1, 5, 4] cfg = [1, 3] assert dup_zz_heu_gcd(f, g, ZZ) == (h, cff, cfg) assert dup_rr_prs_gcd(f, g, ZZ) == (h, cff, cfg) f = [1, 0, 0, 0, -4] g = [1, 0, 4, 0, 4] h = [1, 0, 2] cff = [1, 0, -2] cfg = [1, 0, 2] assert dup_zz_heu_gcd(f, g, ZZ) == (h, cff, cfg) assert dup_rr_prs_gcd(f, g, ZZ) == (h, cff, cfg) f = [1, 0, 1, 0, -3, -3, 8, 2, -5] g = [3, 0, 5, -0, -4, -9, 21] h = [1] cff = f cfg = g assert dup_zz_heu_gcd(f, g, ZZ) == (h, cff, cfg) assert dup_rr_prs_gcd(f, g, ZZ) == (h, cff, cfg) f = dup_normal([1, 0, 1, 0, -3, -3, 8, 2, -5], QQ) g = dup_normal([3, 0, 5, -0, -4, -9, 21], QQ) h = dup_normal([1], QQ) assert dup_qq_heu_gcd(f, g, QQ) == (h, cff, cfg) assert dup_ff_prs_gcd(f, g, QQ) == (h, cff, cfg) f = [ -352518131239247345597970242177235495263669787845475025293906825864749649589178600387510272, 0, 0, 0, 0, 0, 0, 46818041807522713962450042363465092040687472354933295397472942006618953623327997952, 0, 0, 0, 0, 0, 0, 378182690892293941192071663536490788434899030680411695933646320291525827756032, 0, 0, 0, 0, 0, 0, 112806468807371824947796775491032386836656074179286744191026149539708928, 0, 0, 0, 0, 0, 0, -12278371209708240950316872681744825481125965781519138077173235712, 0, 0, 0, 0, 0, 0, 289127344604779611146960547954288113529690984687482920704, 0, 0, 0, 0, 0, 0, 19007977035740498977629742919480623972236450681, 0, 0, 0, 0, 0, 0, 311973482284542371301330321821976049 ] g = [ 365431878023781158602430064717380211405897160759702125019136, 0, 0, 0, 0, 0, 0, 197599133478719444145775798221171663643171734081650688, 0, 0, 0, 0, 0, 0, -9504116979659010018253915765478924103928886144, 0, 0, 0, 0, 0, 0, -311973482284542371301330321821976049 ] f = dup_normal(f, ZZ) g = dup_normal(g, ZZ) assert dup_zz_heu_gcd(f, dup_diff(f, 1, ZZ), ZZ)[0] == g assert dup_rr_prs_gcd(f, dup_diff(f, 1, ZZ), ZZ)[0] == g f = [QQ(1, 2), QQ(1), QQ(1, 2)] g = [QQ(1, 2), QQ(1, 2)] h = [QQ(1), QQ(1)] assert dup_qq_heu_gcd(f, g, QQ) == (h, g, [QQ(1, 2)]) assert dup_ff_prs_gcd(f, g, QQ) == (h, g, [QQ(1, 2)])
def test_dup_diff(): assert dup_diff([], 1, ZZ) == [] assert dup_diff([7], 1, ZZ) == [] assert dup_diff([2, 7], 1, ZZ) == [2] assert dup_diff([1, 2, 1], 1, ZZ) == [2, 2] assert dup_diff([1, 2, 3, 4], 1, ZZ) == [3, 4, 3] assert dup_diff([1, -1, 0, 0, 2], 1, ZZ) == [4, -3, 0, 0] f = dup_normal([17, 34, 56, -345, 23, 76, 0, 0, 12, 3, 7], ZZ) assert dup_diff(f, 0, ZZ) == f assert dup_diff(f, 1, ZZ) == [170, 306, 448, -2415, 138, 380, 0, 0, 24, 3] assert dup_diff(f, 2, ZZ) == dup_diff(dup_diff(f, 1, ZZ), 1, ZZ) assert dup_diff(f, 3, ZZ) == dup_diff(dup_diff(dup_diff(f, 1, ZZ), 1, ZZ), 1, ZZ) K = FF(3) f = dup_normal([17, 34, 56, -345, 23, 76, 0, 0, 12, 3, 7], K) assert dup_diff(f, 1, K) == dup_normal([2, 0, 1, 0, 0, 2, 0, 0, 0, 0], K) assert dup_diff(f, 2, K) == dup_normal([1, 0, 0, 2, 0, 0, 0], K) assert dup_diff(f, 3, K) == dup_normal([], K) assert dup_diff(f, 0, K) == f assert dup_diff(f, 2, K) == dup_diff(dup_diff(f, 1, K), 1, K) assert dup_diff(f, 3, K) == dup_diff(dup_diff(dup_diff(f, 1, K), 1, K), 1, K)
def test_dup_diff(): assert dup_diff([], 1, ZZ) == [] assert dup_diff([7], 1, ZZ) == [] assert dup_diff([2, 7], 1, ZZ) == [2] assert dup_diff([1, 2, 1], 1, ZZ) == [2, 2] assert dup_diff([1, 2, 3, 4], 1, ZZ) == [3, 4, 3] assert dup_diff([1, -1, 0, 0, 2], 1, ZZ) == [4, -3, 0, 0] f = dup_normal([17, 34, 56, -345, 23, 76, 0, 0, 12, 3, 7], ZZ) assert dup_diff(f, 0, ZZ) == f assert dup_diff(f, 1, ZZ) == dup_diff(f, 1, ZZ) assert dup_diff(f, 2, ZZ) == dup_diff(dup_diff(f, 1, ZZ), 1, ZZ) assert dup_diff( f, 3, ZZ) == dup_diff(dup_diff(dup_diff(f, 1, ZZ), 1, ZZ), 1, ZZ) K = FF(3) f = dup_normal([17, 34, 56, -345, 23, 76, 0, 0, 12, 3, 7], K) assert dup_diff(f, 1, K) == dup_normal([2, 0, 1, 0, 0, 2, 0, 0, 0, 0], K) assert dup_diff(f, 2, K) == dup_normal([1, 0, 0, 2, 0, 0, 0], K) assert dup_diff(f, 3, K) == dup_normal([], K) assert dup_diff(f, 0, K) == f assert dup_diff(f, 1, K) == dup_diff(f, 1, K) assert dup_diff(f, 2, K) == dup_diff(dup_diff(f, 1, K), 1, K) assert dup_diff( f, 3, K) == dup_diff(dup_diff(dup_diff(f, 1, K), 1, K), 1, K)
def test_dup_gcd(): assert dup_zz_heu_gcd([], [], ZZ) == ([], [], []) assert dup_rr_prs_gcd([], [], ZZ) == ([], [], []) assert dup_zz_heu_gcd([2], [], ZZ) == ([2], [1], []) assert dup_rr_prs_gcd([2], [], ZZ) == ([2], [1], []) assert dup_zz_heu_gcd([-2], [], ZZ) == ([2], [-1], []) assert dup_rr_prs_gcd([-2], [], ZZ) == ([2], [-1], []) assert dup_zz_heu_gcd([], [-2], ZZ) == ([2], [], [-1]) assert dup_rr_prs_gcd([], [-2], ZZ) == ([2], [], [-1]) assert dup_zz_heu_gcd([], [2,4], ZZ) == ([2,4], [], [1]) assert dup_rr_prs_gcd([], [2,4], ZZ) == ([2,4], [], [1]) assert dup_zz_heu_gcd([2,4], [], ZZ) == ([2,4], [1], []) assert dup_rr_prs_gcd([2,4], [], ZZ) == ([2,4], [1], []) assert dup_zz_heu_gcd([2], [2], ZZ) == ([2], [1], [1]) assert dup_rr_prs_gcd([2], [2], ZZ) == ([2], [1], [1]) assert dup_zz_heu_gcd([-2], [2], ZZ) == ([2], [-1], [1]) assert dup_rr_prs_gcd([-2], [2], ZZ) == ([2], [-1], [1]) assert dup_zz_heu_gcd([2], [-2], ZZ) == ([2], [1], [-1]) assert dup_rr_prs_gcd([2], [-2], ZZ) == ([2], [1], [-1]) assert dup_zz_heu_gcd([-2], [-2], ZZ) == ([2], [-1], [-1]) assert dup_rr_prs_gcd([-2], [-2], ZZ) == ([2], [-1], [-1]) assert dup_zz_heu_gcd([1,2,1], [1], ZZ) == ([1], [1, 2, 1], [1]) assert dup_rr_prs_gcd([1,2,1], [1], ZZ) == ([1], [1, 2, 1], [1]) assert dup_zz_heu_gcd([1,2,1], [2], ZZ) == ([1], [1, 2, 1], [2]) assert dup_rr_prs_gcd([1,2,1], [2], ZZ) == ([1], [1, 2, 1], [2]) assert dup_zz_heu_gcd([2,4,2], [2], ZZ) == ([2], [1, 2, 1], [1]) assert dup_rr_prs_gcd([2,4,2], [2], ZZ) == ([2], [1, 2, 1], [1]) assert dup_zz_heu_gcd([2], [2,4,2], ZZ) == ([2], [1], [1, 2, 1]) assert dup_rr_prs_gcd([2], [2,4,2], ZZ) == ([2], [1], [1, 2, 1]) assert dup_zz_heu_gcd([2,4,2], [1,1], ZZ) == ([1, 1], [2, 2], [1]) assert dup_rr_prs_gcd([2,4,2], [1,1], ZZ) == ([1, 1], [2, 2], [1]) assert dup_zz_heu_gcd([1,1], [2,4,2], ZZ) == ([1, 1], [1], [2, 2]) assert dup_rr_prs_gcd([1,1], [2,4,2], ZZ) == ([1, 1], [1], [2, 2]) f, g = [1, -31], [1, 0] assert dup_zz_heu_gcd(f, g, ZZ) == ([1], f, g) assert dup_rr_prs_gcd(f, g, ZZ) == ([1], f, g) f = [1,8,21,22,8] g = [1,6,11,6] h = [1,3,2] cff = [1,5,4] cfg = [1,3] assert dup_zz_heu_gcd(f, g, ZZ) == (h, cff, cfg) assert dup_rr_prs_gcd(f, g, ZZ) == (h, cff, cfg) f = [1,0,0,0,-4] g = [1,0,4,0, 4] h = [1,0,2] cff = [1,0,-2] cfg = [1,0, 2] assert dup_zz_heu_gcd(f, g, ZZ) == (h, cff, cfg) assert dup_rr_prs_gcd(f, g, ZZ) == (h, cff, cfg) f = [1,0,1,0,-3,-3,8,2,-5] g = [3,0,5,-0,-4,-9,21] h = [1] cff = f cfg = g assert dup_zz_heu_gcd(f, g, ZZ) == (h, cff, cfg) assert dup_rr_prs_gcd(f, g, ZZ) == (h, cff, cfg) f = dup_normal([1,0,1,0,-3,-3,8,2,-5], QQ) g = dup_normal([3,0,5,-0,-4,-9,21], QQ) h = dup_normal([1], QQ) assert dup_qq_heu_gcd(f, g, QQ) == (h, cff, cfg) assert dup_ff_prs_gcd(f, g, QQ) == (h, cff, cfg) f = [-352518131239247345597970242177235495263669787845475025293906825864749649589178600387510272, 0, 0, 0, 0, 0, 0, 46818041807522713962450042363465092040687472354933295397472942006618953623327997952, 0, 0, 0, 0, 0, 0, 378182690892293941192071663536490788434899030680411695933646320291525827756032, 0, 0, 0, 0, 0, 0, 112806468807371824947796775491032386836656074179286744191026149539708928, 0, 0, 0, 0, 0, 0, -12278371209708240950316872681744825481125965781519138077173235712, 0, 0, 0, 0, 0, 0, 289127344604779611146960547954288113529690984687482920704, 0, 0, 0, 0, 0, 0, 19007977035740498977629742919480623972236450681, 0, 0, 0, 0, 0, 0, 311973482284542371301330321821976049] g = [365431878023781158602430064717380211405897160759702125019136, 0, 0, 0, 0, 0, 0, 197599133478719444145775798221171663643171734081650688, 0, 0, 0, 0, 0, 0, -9504116979659010018253915765478924103928886144, 0, 0, 0, 0, 0, 0, -311973482284542371301330321821976049] f = dup_normal(f, ZZ) g = dup_normal(g, ZZ) assert dup_zz_heu_gcd(f, dup_diff(f, 1, ZZ), ZZ)[0] == g assert dup_rr_prs_gcd(f, dup_diff(f, 1, ZZ), ZZ)[0] == g f = [QQ(1,2),QQ(1),QQ(1,2)] g = [QQ(1,2),QQ(1,2)] h = [QQ(1), QQ(1)] assert dup_qq_heu_gcd(f, g, QQ) == (h, g, [QQ(1,2)]) assert dup_ff_prs_gcd(f, g, QQ) == (h, g, [QQ(1,2)])