Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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)])
Ejemplo n.º 4
0
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)])