def PSC(F, G, x): """PSC(F, G, x) returns a set with the non-zero principal subresultant coefficients (psc) of the two polynomials F and G with respect to the variable x. If the degree of the polynomial F is strictly less than the degree of the polynomial G, then F and G are interchanged. Extended psc beyond the n-th are not considered, where n is the minimum of the degrees of F and G with respect to x. >>> PSC(0, 0, var('x')) set() >>> PSC(poly('2*x'), poly('3*y'), var('x')) {3*y} >>> PSC(poly('2*x'), poly('3*y + 5*x**2'), var('x')) == {12*var('y'), 2} True >>> PSC(poly('x**3'), poly('x**3 + x'), var('x')) {1} """ subs = subresultants(F, G, x) s = set() i = len(subs) - 1 if i < 0: return s currDeg = degree(subs[i], x) while i > 0: nextDeg = degree(subs[i - 1], x) s.add(LC(subs[i], x)**(nextDeg - currDeg)) currDeg = nextDeg i -= 1 return s
def test_subresultants_vv_2(): x = var('x') p = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5 q = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21 assert subresultants_vv_2(p, q, x) == subresultants(p, q, x) assert subresultants_vv_2(p, q, x)[-1] == sylvester(p, q, x).det() assert subresultants_vv_2(p, q, x) != euclid_amv(p, q, x) amv_factors = [1, 1, -1, 1, -1, 1] assert subresultants_vv_2(p, q, x) == [i*j for i, j in zip(amv_factors, modified_subresultants_amv(p, q, x))] p = x**3 - 7*x + 7 q = 3*x**2 - 7 assert subresultants_vv_2(p, q, x) == euclid_amv(p, q, x)
def test_subresultants_bezout(): x = var('x') p = x**8 + x**6 - 3*x**4 - 3*x**3 + 8*x**2 + 2*x - 5 q = 3*x**6 + 5*x**4 - 4*x**2 - 9*x + 21 assert subresultants_bezout(p, q, x) == subresultants(p, q, x) assert subresultants_bezout(p, q, x)[-1] == sylvester(p, q, x).det() assert subresultants_bezout(p, q, x) != euclid_amv(p, q, x) amv_factors = [1, 1, -1, 1, -1, 1] assert subresultants_bezout(p, q, x) == [i*j for i, j in zip(amv_factors, modified_subresultants_amv(p, q, x))] p = x**3 - 7*x + 7 q = 3*x**2 - 7 assert subresultants_bezout(p, q, x) == euclid_amv(p, q, x)