def test_Factors(): assert Factors() == Factors({}) == Factors(Integer(1)) assert Factors(Integer(1)) == Factors(Factors(Integer(1))) assert Factors().as_expr() == 1 assert Factors({ x: 2, y: 3, sin(x): 4 }).as_expr() == x**2 * y**3 * sin(x)**4 assert Factors(+oo) == Factors({oo: 1}) assert Factors(-oo) == Factors({oo: 1, -1: 1}) f1 = Factors({oo: 1}) f2 = Factors({oo: 1}) assert hash(f1) == hash(f2) a = Factors({x: 5, y: 3, z: 7}) b = Factors({y: 4, z: 3, t: 10}) assert a.mul(b) == a * b == Factors({x: 5, y: 7, z: 10, t: 10}) assert a.div(b) == divmod(a, b) == \ (Factors({x: 5, z: 4}), Factors({y: 1, t: 10})) assert a.quo(b) == a / b == Factors({x: 5, z: 4}) assert a.rem(b) == a % b == Factors({y: 1, t: 10}) assert a.pow(3) == a**3 == Factors({x: 15, y: 9, z: 21}) assert b.pow(3) == b**3 == Factors({y: 12, z: 9, t: 30}) pytest.raises(ValueError, lambda: a.pow(3.1)) pytest.raises(ValueError, lambda: a.pow(Factors(3.1))) assert a.pow(0) == Factors() assert a.gcd(b) == Factors({y: 3, z: 3}) assert a.lcm(b) == a.lcm(b.as_expr()) == Factors({x: 5, y: 4, z: 7, t: 10}) a = Factors({x: 4, y: 7, t: 7}) b = Factors({z: 1, t: 3}) assert a.normal(b) == (Factors({x: 4, y: 7, t: 4}), Factors({z: 1})) assert Factors(sqrt(2) * x).as_expr() == sqrt(2) * x assert Factors(-I) * I == Factors() assert Factors({Integer(-1): Integer(3)})*Factors({Integer(-1): Integer(1), I: Integer(5)}) == \ Factors(I) assert Factors(Integer(2)**x).div(Integer(3)**x) == \ (Factors({Integer(2): x}), Factors({Integer(3): x})) assert Factors(2**(2*x + 2)).div(Integer(8)) == \ (Factors({Integer(2): 2*x + 2}), Factors({Integer(8): Integer(1)})) # coverage # /!\ things break if this is not True assert Factors({Integer(-1): Rational(3, 2)}) == Factors({I: 1, -1: 1}) assert Factors({ I: Integer(1), Integer(-1): Rational(1, 3) }).as_expr() == I * cbrt(-1) assert Factors(-1.) == Factors({Integer(-1): Integer(1), Float(1.): 1}) assert Factors(-2.) == Factors({Integer(-1): Integer(1), Float(2.): 1}) assert Factors((-2.)**x) == Factors({Float(-2.): x}) assert Factors(Integer(-2)) == Factors({ Integer(-1): Integer(1), Integer(2): 1 }) assert Factors(Rational(1, 2)) == Factors({Integer(2): -1}) assert Factors(Rational(3, 2)) == Factors({ Integer(3): 1, Integer(2): Integer(-1) }) assert Factors({I: Integer(1)}) == Factors(I) assert Factors({-1.0: 2, I: 1}) == Factors({Float(1.0): 1, I: 1}) assert Factors({-1: -Rational(3, 2)}).as_expr() == I A = symbols('A', commutative=False) assert Factors(2 * A**2) == Factors({Integer(2): 1, A**2: 1}) assert Factors(I) == Factors({I: 1}) assert Factors(x).normal(Integer(2)) == (Factors(x), Factors(Integer(2))) assert Factors(x).normal(Integer(0)) == (Factors(), Factors(Integer(0))) pytest.raises(ZeroDivisionError, lambda: Factors(x).div(Integer(0))) assert Factors(x).mul(Integer(2)) == Factors(2 * x) assert Factors(x).mul(Integer(0)).is_zero assert Factors(x).mul(1 / x).is_one assert Factors(x**sqrt(8)).as_expr() == x**(2 * sqrt(2)) assert Factors(x)**Factors(Integer(2)) == Factors(x**2) assert Factors(x).gcd(Integer(0)) == Factors(x) assert Factors(x).lcm(Integer(0)).is_zero assert Factors(Integer(0)).div(x) == (Factors(Integer(0)), Factors()) assert Factors(x).div(x) == (Factors(), Factors()) assert Factors({x: .2}) / Factors({x: .2}) == Factors() assert Factors(x) != Factors() assert Factors(x) == x assert Factors(Integer(0)).normal(x) == (Factors(Integer(0)), Factors()) n, d = x**(2 + y), x**2 f = Factors(n) assert f.div(d) == f.normal(d) == (Factors(x**y), Factors()) assert f.gcd(d) == Factors() d = x**y assert f.div(d) == f.normal(d) == (Factors(x**2), Factors()) assert f.gcd(d) == Factors(d) n = d = 2**x f = Factors(n) assert f.div(d) == f.normal(d) == (Factors(), Factors()) assert f.gcd(d) == Factors(d) n, d = 2**x, 2**y f = Factors(n) assert f.div(d) == f.normal(d) == (Factors({Integer(2): x }), Factors({Integer(2): y})) assert f.gcd(d) == Factors() assert f.div(f) == (Factors(), Factors()) # extraction of constant only n = x**(x + 3) assert Factors(n).normal(x**-3) == (Factors({x: x + 6}), Factors({})) assert Factors(n).normal(x**3) == (Factors({x: x}), Factors({})) assert Factors(n).normal(x**4) == (Factors({x: x}), Factors({x: 1})) assert Factors(n).normal(x**(y - 3)) == \ (Factors({x: x + 6}), Factors({x: y})) assert Factors(n).normal(x**(y + 3)) == (Factors({x: x}), Factors({x: y})) assert Factors(n).normal(x**(y + 4)) == \ (Factors({x: x}), Factors({x: y + 1})) assert Factors(n).div(x**-3) == (Factors({x: x + 6}), Factors({})) assert Factors(n).div(x**3) == (Factors({x: x}), Factors({})) assert Factors(n).div(x**4) == (Factors({x: x}), Factors({x: 1})) assert Factors(n).div(x**(y - 3)) == \ (Factors({x: x + 6}), Factors({x: y})) assert Factors(n).div(x**(y + 3)) == (Factors({x: x}), Factors({x: y})) assert Factors(n).div(x**(y + 4)) == \ (Factors({x: x}), Factors({x: y + 1})) assert Factors({I: I}).as_expr() == (-1)**(I / 2) assert Factors({-1: Rational(4, 3)}).as_expr() == -cbrt(-1)
def test_Factors(): assert Factors() == Factors({}) == Factors(Integer(1)) assert Factors(Integer(1)) == Factors(Factors(Integer(1))) assert Factors().as_expr() == 1 assert Factors({x: 2, y: 3, sin(x): 4}).as_expr() == x**2*y**3*sin(x)**4 assert Factors(+oo) == Factors({oo: 1}) assert Factors(-oo) == Factors({oo: 1, -1: 1}) f1 = Factors({oo: 1}) f2 = Factors({oo: 1}) assert hash(f1) == hash(f2) a = Factors({x: 5, y: 3, z: 7}) b = Factors({ y: 4, z: 3, t: 10}) assert a.mul(b) == a*b == Factors({x: 5, y: 7, z: 10, t: 10}) assert a.div(b) == divmod(a, b) == \ (Factors({x: 5, z: 4}), Factors({y: 1, t: 10})) assert a.quo(b) == a/b == Factors({x: 5, z: 4}) assert a.rem(b) == a % b == Factors({y: 1, t: 10}) assert a.pow(3) == a**3 == Factors({x: 15, y: 9, z: 21}) assert b.pow(3) == b**3 == Factors({y: 12, z: 9, t: 30}) pytest.raises(ValueError, lambda: a.pow(3.1)) pytest.raises(ValueError, lambda: a.pow(Factors(3.1))) assert a.pow(0) == Factors() assert a.gcd(b) == Factors({y: 3, z: 3}) assert a.lcm(b) == a.lcm(b.as_expr()) == Factors({x: 5, y: 4, z: 7, t: 10}) a = Factors({x: 4, y: 7, t: 7}) b = Factors({z: 1, t: 3}) assert a.normal(b) == (Factors({x: 4, y: 7, t: 4}), Factors({z: 1})) assert Factors(sqrt(2)*x).as_expr() == sqrt(2)*x assert Factors(-I)*I == Factors() assert Factors({Integer(-1): Integer(3)})*Factors({Integer(-1): Integer(1), I: Integer(5)}) == \ Factors(I) assert Factors(Integer(2)**x).div(Integer(3)**x) == \ (Factors({Integer(2): x}), Factors({Integer(3): x})) assert Factors(2**(2*x + 2)).div(Integer(8)) == \ (Factors({Integer(2): 2*x + 2}), Factors({Integer(8): Integer(1)})) # coverage # /!\ things break if this is not True assert Factors({Integer(-1): Rational(3, 2)}) == Factors({I: 1, -1: 1}) assert Factors({I: Integer(1), Integer(-1): Rational(1, 3)}).as_expr() == I*cbrt(-1) assert Factors(-1.) == Factors({Integer(-1): Integer(1), Float(1.): 1}) assert Factors(-2.) == Factors({Integer(-1): Integer(1), Float(2.): 1}) assert Factors((-2.)**x) == Factors({Float(-2.): x}) assert Factors(Integer(-2)) == Factors({Integer(-1): Integer(1), Integer(2): 1}) assert Factors(Rational(1, 2)) == Factors({Integer(2): -1}) assert Factors(Rational(3, 2)) == Factors({Integer(3): 1, Integer(2): Integer(-1)}) assert Factors({I: Integer(1)}) == Factors(I) assert Factors({-1.0: 2, I: 1}) == Factors({Float(1.0): 1, I: 1}) assert Factors({-1: -Rational(3, 2)}).as_expr() == I A = symbols('A', commutative=False) assert Factors(2*A**2) == Factors({Integer(2): 1, A**2: 1}) assert Factors(I) == Factors({I: 1}) assert Factors(x).normal(Integer(2)) == (Factors(x), Factors(Integer(2))) assert Factors(x).normal(Integer(0)) == (Factors(), Factors(Integer(0))) pytest.raises(ZeroDivisionError, lambda: Factors(x).div(Integer(0))) assert Factors(x).mul(Integer(2)) == Factors(2*x) assert Factors(x).mul(Integer(0)).is_zero assert Factors(x).mul(1/x).is_one assert Factors(x**sqrt(8)).as_expr() == x**(2*sqrt(2)) assert Factors(x)**Factors(Integer(2)) == Factors(x**2) assert Factors(x).gcd(Integer(0)) == Factors(x) assert Factors(x).lcm(Integer(0)).is_zero assert Factors(Integer(0)).div(x) == (Factors(Integer(0)), Factors()) assert Factors(x).div(x) == (Factors(), Factors()) assert Factors({x: .2})/Factors({x: .2}) == Factors() assert Factors(x) != Factors() assert Factors(x) == x assert Factors(Integer(0)).normal(x) == (Factors(Integer(0)), Factors()) n, d = x**(2 + y), x**2 f = Factors(n) assert f.div(d) == f.normal(d) == (Factors(x**y), Factors()) assert f.gcd(d) == Factors() d = x**y assert f.div(d) == f.normal(d) == (Factors(x**2), Factors()) assert f.gcd(d) == Factors(d) n = d = 2**x f = Factors(n) assert f.div(d) == f.normal(d) == (Factors(), Factors()) assert f.gcd(d) == Factors(d) n, d = 2**x, 2**y f = Factors(n) assert f.div(d) == f.normal(d) == (Factors({Integer(2): x}), Factors({Integer(2): y})) assert f.gcd(d) == Factors() assert f.div(f) == (Factors(), Factors()) # extraction of constant only n = x**(x + 3) assert Factors(n).normal(x**-3) == (Factors({x: x + 6}), Factors({})) assert Factors(n).normal(x**3) == (Factors({x: x}), Factors({})) assert Factors(n).normal(x**4) == (Factors({x: x}), Factors({x: 1})) assert Factors(n).normal(x**(y - 3)) == \ (Factors({x: x + 6}), Factors({x: y})) assert Factors(n).normal(x**(y + 3)) == (Factors({x: x}), Factors({x: y})) assert Factors(n).normal(x**(y + 4)) == \ (Factors({x: x}), Factors({x: y + 1})) assert Factors(n).div(x**-3) == (Factors({x: x + 6}), Factors({})) assert Factors(n).div(x**3) == (Factors({x: x}), Factors({})) assert Factors(n).div(x**4) == (Factors({x: x}), Factors({x: 1})) assert Factors(n).div(x**(y - 3)) == \ (Factors({x: x + 6}), Factors({x: y})) assert Factors(n).div(x**(y + 3)) == (Factors({x: x}), Factors({x: y})) assert Factors(n).div(x**(y + 4)) == \ (Factors({x: x}), Factors({x: y + 1})) assert Factors({I: I}).as_expr() == (-1)**(I/2) assert Factors({-1: Rational(4, 3)}).as_expr() == -cbrt(-1)