def test_poly_subresultants(): f = x**8 + x**6 - 3 * x**4 - 3 * x**3 + 8 * x**2 + 2 * x - 5 g = 3 * x**6 + 5 * x**4 - 4 * x**2 - 9 * x + 21 assert poly_subresultants(f, g, x) == \ [Poly(f, x), Poly(g, x), Poly(15*x**4 - 3*x**2 + 9, x), Poly(65*x**2 + 125*x - 245, x), Poly(9326*x - 12300, x), Poly(260708, x)] assert poly_subresultants((x-1)**2, x**2-1, x) == \ [Poly((x-1)**2, x), Poly(x**2-1, x), Poly(2*x - 2, x)]
def test_poly_subresultants(): f = x**8+x**6-3*x**4-3*x**3+8*x**2+2*x-5 g = 3*x**6+5*x**4-4*x**2-9*x+21 assert poly_subresultants(f, g, x) == \ [Poly(f, x), Poly(g, x), Poly(15*x**4 - 3*x**2 + 9, x), Poly(65*x**2 + 125*x - 245, x), Poly(9326*x - 12300, x), Poly(260708, x)] assert poly_subresultants((x-1)**2, x**2-1, x) == \ [Poly((x-1)**2, x), Poly(x**2-1, x), Poly(2*x - 2, x)]
def test_squarefree(): assert Poly(x-1, x).is_squarefree == True assert Poly((x-1)**2, x).is_squarefree == False assert Poly(3*x**2, x).as_squarefree() == Poly(3*x, x) assert Poly(x**2+2*x+1, x).as_squarefree() == Poly(x+1, x) assert Poly(x**5-x**4-x+1, x).as_squarefree() == Poly(x**4-1, x) assert poly_sqf(1, x) == [Poly(1, x)] assert poly_sqf(x, x) == [Poly(x, x)] assert poly_sqf(3*x**2, x) == [Poly(3, x), Poly(x, x)] assert poly_sqf(x**2+2*x+1, x) == [Poly(1, x), Poly(x+1, x)] assert poly_sqf(x**5-x**4-x+1, x) == \ [Poly(x**3 + x**2 + x + 1, x), Poly(x-1, x)] assert poly_sqf(x**8+6*x**6+12*x**4+8*x**2, x) == \ [Poly(1, x), Poly(x, x), Poly(x**2+2, x)] # Bronstein, Symbolic Integration, pp. 52 A = Poly(x**4 - 3*x**2 + 6, x) D = Poly(x**6 - 5*x**4 + 5*x**2 + 4, x) f, g = D, A - D.diff(x).mul_term(t) res, R = poly_subresultants(f, g) S = poly_sqf(Poly(res, t)) assert S == [Poly(45796, t), Poly(1, t), Poly(4*t**2 + 1, t)]
def ratint_logpart(f, g, x, t=None): """Lazard-Rioboo-Trager algorithm. Given a field K and polynomials f and g in K[x], such that f and g are coprime, deg(f) < deg(g) and g is square-free, returns a list of tuples (s_i, q_i) of polynomials, for i = 1..n, such that s_i in K[t, x] and q_i in K[t], and: ___ ___ d f d \ ` \ ` -- - = -- ) ) a log(s_i(a, x)) dx g dx /__, /__, i=1..n a | q_i(a) = 0 """ f, g = Poly(f, x), Poly(g, x) t = t or Symbol('t', dummy=True) a, b = g, f - g.diff().mul_term(t) res, R = poly_subresultants(a, b) Q = poly_sqf(Poly(res, t)) R_map, H, i = {}, [], 1 for r in R: R_map[r.degree] = r for q in Q: if q.degree > 0: _, q = q.as_primitive() if g.degree == i: H.append((g, q)) else: h = R_map[i] A = poly_sqf(h.LC, t) for j in xrange(0, len(A)): T = poly_gcd(A[j], q)**(j+1) h = poly_div(h, Poly(T, x))[0] # NOTE: h.LC is always invertible in K[t] inv, coeffs = Poly(h.LC, t).invert(q), [S(1)] for coeff in h.coeffs[1:]: T = poly_div(inv*coeff, q)[1] coeffs.append(T.as_basic()) h = Poly(zip(coeffs, h.monoms), x) H.append((h, q)) i += 1 return H
def test_poly_subresultants(): f = x**8+x**6-3*x**4-3*x**3+8*x**2+2*x-5 g = 3*x**6+5*x**4-4*x**2-9*x+21 assert poly_subresultants(f, g, x) == \ (Poly(260708, x), [Poly(f, x), Poly(g, x), Poly(15*x**4 - 3*x**2 + 9, x), Poly(65*x**2 + 125*x - 245, x), Poly(9326*x - 12300, x), Poly(260708, x)]) assert poly_subresultants((x-1)**2, x**2-1, x) == \ (Poly(0, x), [Poly((x-1)**2, x), Poly(x**2-1, x), Poly(2*x - 2, x)]) f = Poly(-x**3 + 5, x) g = Poly((1 + 3*t)*x**2, x) assert poly_subresultants(f, g) == \ (Poly(25 + 225*t + 675*t**2 + 675*t**3, x), [Poly(-x**3 + 5, x), Poly((1 + 3*t)*x**2, x), Poly(5 + 30*t + 45*t**2, x)])