def poly_factors(f, *symbols, **flags): """Factor polynomials over rationals. >>> from sympy.polys.factortools import poly_factors >>> from sympy.abc import x, y >>> poly_factors(x**2 - y**2, x, y) (1, [(Poly(x - y, x, y), 1), (Poly(x + y, x, y), 1)]) """ if not isinstance(f, Poly): f = Poly(f, *symbols) elif symbols: raise SymbolsError("Redundant symbols were given") symbols = list(f.symbols) try: denom, F = f.as_integer() except CoefficientError: other = set([]) for coeff in f.iter_coeffs(): other |= coeff.atoms(Symbol) symbols += sorted(other) F = Poly(f, *symbols) denom, F = F.as_integer() cont, factors = zzX_factor(zzX_from_poly(F)) for i, (h, k) in enumerate(factors): h = zzX_to_poly(h, *symbols) if f.symbols != symbols: h = h.as_poly(*f.symbols) factors[i] = (h, k) return Rational(cont, denom), factors
def poly_factors(f, *symbols, **flags): """Factor polynomials over rationals. >>> from sympy import * >>> x, y = symbols("x y") >>> poly_factors(x**2 - y**2, x, y) (1, [(Poly(x - y, x, y), 1), (Poly(x + y, x, y), 1)]) """ if not isinstance(f, Poly): f = Poly(f, *symbols) elif symbols: raise SymbolsError("Redundant symbols were given") symbols = list(f.symbols) try: denom, F = f.as_integer() except CoefficientError: other = set([]) for coeff in f.iter_coeffs(): other |= coeff.atoms(Symbol) symbols += sorted(other) F = Poly(f, *symbols) denom, F = F.as_integer() cont, factors = zzX_factor(zzX_from_poly(F)) for i, (h, k) in enumerate(factors): h = zzX_to_poly(h, *symbols) if f.symbols != symbols: h = h.as_poly(*f.symbols) factors[i] = (h, k) return Rational(cont, denom), factors
def test_zzX_factor(): assert zzX_factor([]) == (0, []) assert zzX_factor([7]) == (7, []) assert zzX_factor([[7]]) == (7, []) assert zzX_factor([[1], []]) == \ (1, [([[1], []], 1)]) assert zzX_factor([[4], []]) == \ (4, [([[1], []], 1)]) assert zzX_factor([[4], [2]]) == \ (2, [([[2], [1]], 1)]) assert zzX_factor([[1,0,1]]) == \ (1, [([[1, 0, 1]], 1)]) assert zzX_factor([[1,0,-1]]) == \ (1, [([[1,-1]], 1), ([[1, 1]], 1)]) assert zzX_factor(f_1) == \ (1, [([[[1]], [[1, 0], [20]]], 1), ([[[1], []], [[1, 10]]], 1), ([[[1, 0]], [[1], [30]]], 1)]) assert zzX_factor(f_2) == \ (1, [([[[1], [], [1, 0, 0]], [[]], [[1], [90]]], 1), ([[[1], [1, 0]], [[]], [[]], [[1, -11]]], 1)]) assert zzX_factor(f_3) == \ (1, [([[[1], [], []], [[1, 0, 0, 0, 1]], [[1, 0]]], 1), ([[[1]], [[]], [[1, 0], []], [[1], [1, 0, 0, 0], []]], 1)]) assert zzX_factor(f_4) == \ (-1, [([[[1], [], [], []], [[1, 0, 0]]], 1), ([[[1, 0]], [[]], [[1, 0, 0], [], [], [], [5]]], 1), ([[[1], []], [[]], [[]], [[-1, 0, -3]]], 1), ([[[1], [], [], [], []], [[]], [[]], [[1, 0, 0]]], 1)]) assert zzX_factor(f_5) == \ (-1, [([[[1]], [[1], [-1, 0]]], 3)]) assert zzX_factor(f_6) == \ (1, [([[[[47]], [[]]], [[[1, 0, 0], [], [], [-1, 0, 0]]]], 1), ([[[[45]]], [[[]]], [[[]]], [[[-9]], [[-1]], [[]], [[3], [], [2, 0], []]]], 1)])
def test_zzX_factor(): assert zzX_factor([]) == (0, []) assert zzX_factor([7]) == (7, []) assert zzX_factor([[7]]) == (7, []) assert zzX_factor([[1], []]) == \ (1, [([[1], []], 1)]) assert zzX_factor([[4], []]) == \ (4, [([[1], []], 1)]) assert zzX_factor([[4], [2]]) == \ (2, [([[2], [1]], 1)]) assert zzX_factor([[1,0,1]]) == \ (1, [([[1, 0, 1]], 1)]) assert zzX_factor([[1,0,-1]]) == \ (1, [([[1,-1]], 1), ([[1, 1]], 1)]) assert zzX_factor(f_1) == \ (1, [([[[1]], [[1, 0], [20]]], 1), ([[[1], []], [[1, 10]]], 1), ([[[1, 0]], [[1], [30]]], 1)]) assert zzX_factor(f_2) == \ (1, [([[[1], [], [1, 0, 0]], [[]], [[1], [90]]], 1), ([[[1], [1, 0]], [[]], [[]], [[1, -11]]], 1)]) assert zzX_factor(f_3) == \ (1, [([[[1], [], []], [[1, 0, 0, 0, 1]], [[1, 0]]], 1), ([[[1]], [[]], [[1, 0], []], [[1], [1, 0, 0, 0], []]], 1)]) assert zzX_factor(f_4) == \ (-1, [([[[1], [], [], []], [[1, 0, 0]]], 1), ([[[1, 0]], [[]], [[1, 0, 0], [], [], [], [5]]], 1), ([[[1], []], [[]], [[]], [[-1, 0, -3]]], 1), ([[[1], [], [], [], []], [[]], [[]], [[1, 0, 0]]], 1)]) assert zzX_factor(f_5) == \ (-1, [([[[1]], [[1], [-1, 0]]], 3)]) assert zzX_factor(f_6) == \ (1, [([[[[47]], [[]]], [[[1, 0, 0], [], [], [-1, 0, 0]]]], 1), ([[[[45]]], [[[]]], [[[]]], [[[-9]], [[-1]], [[]], [[3], [], [2, 0], []]]], 1)])