def test_pow(): x, y, z = symbols('x,y,z') assert refine((-1)**x, Q.even(x)) == 1 assert refine((-1)**x, Q.odd(x)) == -1 assert refine((-2)**x, Q.even(x)) == 2**x # nested powers assert refine(sqrt(x**2)) != Abs(x) assert refine(sqrt(x**2), Q.complex(x)) != Abs(x) assert refine(sqrt(x**2), Q.real(x)) == Abs(x) assert refine(sqrt(x**2), Q.positive(x)) == x assert refine((x**3)**(S(1)/3)) != x assert refine((x**3)**(S(1)/3), Q.real(x)) != x assert refine((x**3)**(S(1)/3), Q.positive(x)) == x assert refine(sqrt(1/x), Q.real(x)) != 1/sqrt(x) assert refine(sqrt(1/x), Q.positive(x)) == 1/sqrt(x) # powers of (-1) assert refine((-1)**(x+y), Q.even(x)) == (-1)**y assert refine((-1)**(x+y+z), Q.odd(x) & Q.odd(z))==(-1)**y assert refine((-1)**(x+y+1), Q.odd(x))==(-1)**y assert refine((-1)**(x+y+2), Q.odd(x))==(-1)**(y+1) assert refine((-1)**(x+3)) == (-1)**(x+1)
def test_pow1(): assert refine((-1)**x, Q.even(x)) == 1 assert refine((-1)**x, Q.odd(x)) == -1 assert refine((-2)**x, Q.even(x)) == 2**x # nested powers assert refine(sqrt(x**2)) != Abs(x) assert refine(sqrt(x**2), Q.complex(x)) != Abs(x) assert refine(sqrt(x**2), Q.real(x)) == Abs(x) assert refine(sqrt(x**2), Q.positive(x)) == x assert refine((x**3)**Rational(1, 3)) != x assert refine((x**3)**Rational(1, 3), Q.real(x)) != x assert refine((x**3)**Rational(1, 3), Q.positive(x)) == x assert refine(sqrt(1/x), Q.real(x)) != 1/sqrt(x) assert refine(sqrt(1/x), Q.positive(x)) == 1/sqrt(x) # powers of (-1) assert refine((-1)**(x + y), Q.even(x)) == (-1)**y assert refine((-1)**(x + y + z), Q.odd(x) & Q.odd(z)) == (-1)**y assert refine((-1)**(x + y + 1), Q.odd(x)) == (-1)**y assert refine((-1)**(x + y + 2), Q.odd(x)) == (-1)**(y + 1) assert refine((-1)**(x + 3)) == (-1)**(x + 1) # continuation assert refine((-1)**((-1)**x/2 - S.Half), Q.integer(x)) == (-1)**x assert refine((-1)**((-1)**x/2 + S.Half), Q.integer(x)) == (-1)**(x + 1) assert refine((-1)**((-1)**x/2 + 5*S.Half), Q.integer(x)) == (-1)**(x + 1)
def test_pow(): x, y, z = symbols('x,y,z') assert refine((-1)**x, Q.even(x)) == 1 assert refine((-1)**x, Q.odd(x)) == -1 assert refine((-2)**x, Q.even(x)) == 2**x # nested powers assert refine(sqrt(x**2)) != Abs(x) assert refine(sqrt(x**2), Q.complex(x)) != Abs(x) assert refine(sqrt(x**2), Q.real(x)) == Abs(x) assert refine(sqrt(x**2), Q.positive(x)) == x assert refine((x**3)**(S(1) / 3)) != x assert refine((x**3)**(S(1) / 3), Q.real(x)) != x assert refine((x**3)**(S(1) / 3), Q.positive(x)) == x assert refine(sqrt(1 / x), Q.real(x)) != 1 / sqrt(x) assert refine(sqrt(1 / x), Q.positive(x)) == 1 / sqrt(x) # powers of (-1) assert refine((-1)**(x + y), Q.even(x)) == (-1)**y assert refine((-1)**(x + y + z), Q.odd(x) & Q.odd(z)) == (-1)**y assert refine((-1)**(x + y + 1), Q.odd(x)) == (-1)**y assert refine((-1)**(x + y + 2), Q.odd(x)) == (-1)**(y + 1) assert refine((-1)**(x + 3)) == (-1)**(x + 1)
def test_pow(): assert refine((-1) ** x, Q.even(x)) == 1 assert refine((-1) ** x, Q.odd(x)) == -1 assert refine((-2) ** x, Q.even(x)) == 2 ** x # nested powers assert refine(sqrt(x ** 2)) != Abs(x) assert refine(sqrt(x ** 2), Q.complex(x)) != Abs(x) assert refine(sqrt(x ** 2), Q.real(x)) == Abs(x) assert refine(sqrt(x ** 2), Q.positive(x)) == x assert refine((x ** 3) ** (S(1) / 3)) != x assert refine((x ** 3) ** (S(1) / 3), Q.real(x)) != x assert refine((x ** 3) ** (S(1) / 3), Q.positive(x)) == x assert refine(sqrt(1 / x), Q.real(x)) != 1 / sqrt(x) assert refine(sqrt(1 / x), Q.positive(x)) == 1 / sqrt(x) # powers of (-1) assert refine((-1) ** (x + y), Q.even(x)) == (-1) ** y assert refine((-1) ** (x + y + z), Q.odd(x) & Q.odd(z)) == (-1) ** y assert refine((-1) ** (x + y + 1), Q.odd(x)) == (-1) ** y assert refine((-1) ** (x + y + 2), Q.odd(x)) == (-1) ** (y + 1) assert refine((-1) ** (x + 3)) == (-1) ** (x + 1) assert refine((-1) ** ((-1) ** x / 2 - S.Half), Q.integer(x)) == (-1) ** x assert refine((-1) ** ((-1) ** x / 2 + S.Half), Q.integer(x)) == (-1) ** (x + 1) assert refine((-1) ** ((-1) ** x / 2 + 5 * S.Half), Q.integer(x)) == (-1) ** (x + 1) assert refine((-1) ** ((-1) ** x / 2 - 7 * S.Half), Q.integer(x)) == (-1) ** (x + 1) assert refine((-1) ** ((-1) ** x / 2 - 9 * S.Half), Q.integer(x)) == (-1) ** x # powers of Abs assert refine(Abs(x) ** 2, Q.real(x)) == x ** 2 assert refine(Abs(x) ** 3, Q.real(x)) == Abs(x) ** 3 assert refine(Abs(x) ** 2) == Abs(x) ** 2
def test_pow2(): # powers of (-1) assert refine((-1)**(x + y), Q.even(x)) == (-1)**y assert refine((-1)**(x + y + z), Q.odd(x) & Q.odd(z)) == (-1)**y assert refine((-1)**(x + y + 1), Q.odd(x)) == (-1)**y assert refine((-1)**(x + y + 2), Q.odd(x)) == (-1)**(y + 1) assert refine((-1)**(x + 3)) == (-1)**(x + 1)
def test_pow1(): assert refine((-1)**x, Q.even(x)) == 1 assert refine((-1)**x, Q.odd(x)) == -1 assert refine((-2)**x, Q.even(x)) == 2**x # nested powers assert refine(sqrt(x**2)) != Abs(x) assert refine(sqrt(x**2), Q.complex(x)) != Abs(x) assert refine(sqrt(x**2), Q.real(x)) == Abs(x) assert refine(sqrt(x**2), Q.positive(x)) == x assert refine((x**3)**(S(1)/3)) != x assert refine((x**3)**(S(1)/3), Q.real(x)) != x assert refine((x**3)**(S(1)/3), Q.positive(x)) == x assert refine(sqrt(1/x), Q.real(x)) != 1/sqrt(x) assert refine(sqrt(1/x), Q.positive(x)) == 1/sqrt(x)
def test_get_relevant_clsfacts(): exprs = {Abs(x*y)} exprs, facts = get_relevant_clsfacts(exprs) assert exprs == {x*y} assert facts.clauses == \ {frozenset({Literal(Q.odd(Abs(x*y)), False), Literal(Q.odd(x*y), True)}), frozenset({Literal(Q.zero(Abs(x*y)), False), Literal(Q.zero(x*y), True)}), frozenset({Literal(Q.even(Abs(x*y)), False), Literal(Q.even(x*y), True)}), frozenset({Literal(Q.zero(Abs(x*y)), True), Literal(Q.zero(x*y), False)}), frozenset({Literal(Q.even(Abs(x*y)), False), Literal(Q.odd(Abs(x*y)), False), Literal(Q.odd(x*y), True)}), frozenset({Literal(Q.even(Abs(x*y)), False), Literal(Q.even(x*y), True), Literal(Q.odd(Abs(x*y)), False)}), frozenset({Literal(Q.positive(Abs(x*y)), False), Literal(Q.zero(Abs(x*y)), False)})}
def test_pow(): x = Symbol('x', even=True) assert refine((-1)**x) == 1 x = Symbol('x', odd=True) assert refine((-1)**x) == -1 x = Symbol('x', even=True) assert refine((-2)**x) == 2**x # nested powers x = Symbol('x') assert refine(sqrt(x**2)) != Abs(x) x = Symbol('x', complex=True) assert refine(sqrt(x**2)) != Abs(x) x = Symbol('x', real=True) assert refine(sqrt(x**2)) == Abs(x) p = Symbol('p', positive=True) assert refine(sqrt(p**2)) == p x = Symbol('x') assert refine((x**3)**(S(1) / 3)) != x x = Symbol('x', real=True) assert refine((x**3)**(S(1) / 3)) != x x = Symbol('x', positive=True) assert refine((x**3)**(S(1) / 3)) == x x = Symbol('x', real=True) assert refine(sqrt(1 / x)) != 1 / sqrt(x) x = Symbol('x', positive=True) assert refine(sqrt(1 / x)) == 1 / sqrt(x) # powers of (-1) x = Symbol('x', even=True) assert refine((-1)**(x + y), Q.even(x)) == (-1)**y x = Symbol('x', odd=True) z = Symbol('z', odd=True) assert refine((-1)**(x + y + z), Q.odd(x) & Q.odd(z)) == (-1)**y assert refine((-1)**(x + y + 1), Q.odd(x)) == (-1)**y assert refine((-1)**(x + y + 2), Q.odd(x)) == (-1)**(y + 1) x = Symbol('x') assert refine((-1)**(x + 3)) == (-1)**(x + 1) x = Symbol('x', integer=True) assert refine((-1)**((-1)**x / 2 - S.Half), Q.integer(x)) == (-1)**x assert refine((-1)**((-1)**x / 2 + S.Half), Q.integer(x)) == (-1)**(x + 1) assert refine((-1)**((-1)**x / 2 + 5 * S.Half), Q.integer(x)) == (-1)**(x + 1) assert refine((-1)**((-1)**x / 2 - 7 * S.Half), Q.integer(x)) == (-1)**(x + 1) assert refine((-1)**((-1)**x / 2 - 9 * S.Half), Q.integer(x)) == (-1)**x # powers of Abs x = Symbol('x', real=True) assert refine(Abs(x)**2, Q.real(x)) == x**2 assert refine(Abs(x)**3, Q.real(x)) == Abs(x)**3 x = Symbol('x') assert refine(Abs(x)**2) == Abs(x)**2
def test_pow(): x = Symbol('x', even=True) assert refine((-1)**x) == 1 x = Symbol('x', odd=True) assert refine((-1)**x) == -1 x = Symbol('x', even=True) assert refine((-2)**x) == 2**x # nested powers x = Symbol('x') assert refine(sqrt(x**2)) != Abs(x) x = Symbol('x', complex=True) assert refine(sqrt(x**2)) != Abs(x) x = Symbol('x', real=True) assert refine(sqrt(x**2)) == Abs(x) p = Symbol('p', positive=True) assert refine(sqrt(p**2)) == p x = Symbol('x') assert refine((x**3)**(S(1)/3)) != x x = Symbol('x', real=True) assert refine((x**3)**(S(1)/3)) != x x = Symbol('x', positive=True) assert refine((x**3)**(S(1)/3)) == x x = Symbol('x', real=True) assert refine(sqrt(1/x)) != 1/sqrt(x) x = Symbol('x', positive=True) assert refine(sqrt(1/x)) == 1/sqrt(x) # powers of (-1) x = Symbol('x', even=True) assert refine((-1)**(x + y), Q.even(x)) == (-1)**y x = Symbol('x', odd=True) z = Symbol('z', odd=True) assert refine((-1)**(x + y + z), Q.odd(x) & Q.odd(z)) == (-1)**y assert refine((-1)**(x + y + 1), Q.odd(x)) == (-1)**y assert refine((-1)**(x + y + 2), Q.odd(x)) == (-1)**(y + 1) x = Symbol('x') assert refine((-1)**(x + 3)) == (-1)**(x + 1) x = Symbol('x', integer=True) assert refine((-1)**((-1)**x/2 - S.Half), Q.integer(x)) == (-1)**x assert refine((-1)**((-1)**x/2 + S.Half), Q.integer(x)) == (-1)**(x + 1) assert refine((-1)**((-1)**x/2 + 5*S.Half), Q.integer(x)) == (-1)**(x + 1) assert refine((-1)**((-1)**x/2 - 7*S.Half), Q.integer(x)) == (-1)**(x + 1) assert refine((-1)**((-1)**x/2 - 9*S.Half), Q.integer(x)) == (-1)**x # powers of Abs x = Symbol('x', real=True) assert refine(Abs(x)**2, Q.real(x)) == x**2 assert refine(Abs(x)**3, Q.real(x)) == Abs(x)**3 x = Symbol('x') assert refine(Abs(x)**2) == Abs(x)**2
def test_pow(): assert refine((-1)**x, Q.even(x)) == 1 assert refine((-1)**x, Q.odd(x)) == -1 assert refine((-2)**x, Q.even(x)) == 2**x # nested powers assert refine(sqrt(x**2)) != Abs(x) assert refine(sqrt(x**2), Q.complex(x)) != Abs(x) assert refine(sqrt(x**2), Q.real(x)) == Abs(x) assert refine(sqrt(x**2), Q.positive(x)) == x assert refine((x**3)**(S(1) / 3)) != x assert refine((x**3)**(S(1) / 3), Q.real(x)) != x assert refine((x**3)**(S(1) / 3), Q.positive(x)) == x assert refine(sqrt(1 / x), Q.real(x)) != 1 / sqrt(x) assert refine(sqrt(1 / x), Q.positive(x)) == 1 / sqrt(x) # powers of (-1) assert refine((-1)**(x + y), Q.even(x)) == (-1)**y assert refine((-1)**(x + y + z), Q.odd(x) & Q.odd(z)) == (-1)**y assert refine((-1)**(x + y + 1), Q.odd(x)) == (-1)**y assert refine((-1)**(x + y + 2), Q.odd(x)) == (-1)**(y + 1) assert refine((-1)**(x + 3)) == (-1)**(x + 1) assert refine((-1)**((-1)**x / 2 - S.Half), Q.integer(x)) == (-1)**x assert refine((-1)**((-1)**x / 2 + S.Half), Q.integer(x)) == (-1)**(x + 1) assert refine((-1)**((-1)**x / 2 + 5 * S.Half), Q.integer(x)) == (-1)**(x + 1) assert refine((-1)**((-1)**x / 2 - 7 * S.Half), Q.integer(x)) == (-1)**(x + 1) assert refine((-1)**((-1)**x / 2 - 9 * S.Half), Q.integer(x)) == (-1)**x # powers of Abs assert refine(Abs(x)**2, Q.real(x)) == x**2 assert refine(Abs(x)**3, Q.real(x)) == Abs(x)**3 assert refine(Abs(x)**2) == Abs(x)**2
def test_pow2(): # powers of (-1) assert refine((-1)**(x + y), Q.even(x)) == (-1)**y assert refine((-1)**(x + y + z), Q.odd(x) & Q.odd(z)) == (-1)**y assert refine((-1)**(x + y + 1), Q.odd(x)) == (-1)**y assert refine((-1)**(x + y + 2), Q.odd(x)) == (-1)**(y + 1) assert refine((-1)**(x + 3)) == (-1)**(x + 1) assert refine((-1)**((-1)**x/2 - S.Half), Q.integer(x)) == (-1)**x assert refine((-1)**((-1)**x/2 + S.Half), Q.integer(x)) == (-1)**(x + 1) assert refine((-1)**((-1)**x/2 + 5*S.Half), Q.integer(x)) == (-1)**(x + 1) assert refine((-1)**((-1)**x/2 - 7*S.Half), Q.integer(x)) == (-1)**(x + 1) assert refine((-1)**((-1)**x/2 - 9*S.Half), Q.integer(x)) == (-1)**x # powers of Abs assert refine(Abs(x)**2, Q.real(x)) == x**2 assert refine(Abs(x)**3, Q.real(x)) == Abs(x)**3 assert refine(Abs(x)**2) == Abs(x)**2
def test_odd(): assert satask(Q.odd(2)) is False assert satask(Q.odd(3)) is True assert satask(Q.odd(x*y), Q.even(x) & Q.odd(y)) is False assert satask(Q.odd(x*y), Q.even(x) & Q.integer(y)) is False assert satask(Q.odd(x*y), Q.even(x) & Q.even(y)) is False assert satask(Q.odd(x*y), Q.odd(x) & Q.odd(y)) is True assert satask(Q.odd(x*y), Q.even(x)) is None assert satask(Q.odd(x*y), Q.odd(x) & Q.integer(y)) is None assert satask(Q.odd(x*y), Q.odd(x) & Q.odd(y)) is True assert satask(Q.odd(abs(x)), Q.even(x)) is False assert satask(Q.odd(abs(x)), Q.odd(x)) is True assert satask(Q.odd(x), Q.odd(abs(x))) is None # x could be complex
def test_odd(): assert satask(Q.odd(2)) is False assert satask(Q.odd(3)) is True assert satask(Q.odd(x * y), Q.even(x) & Q.odd(y)) is False assert satask(Q.odd(x * y), Q.even(x) & Q.integer(y)) is False assert satask(Q.odd(x * y), Q.even(x) & Q.even(y)) is False assert satask(Q.odd(x * y), Q.odd(x) & Q.odd(y)) is True assert satask(Q.odd(x * y), Q.even(x)) is None assert satask(Q.odd(x * y), Q.odd(x) & Q.integer(y)) is None assert satask(Q.odd(x * y), Q.odd(x) & Q.odd(y)) is True assert satask(Q.odd(abs(x)), Q.even(x)) is False assert satask(Q.odd(abs(x)), Q.odd(x)) is True assert satask(Q.odd(x), Q.odd(abs(x))) is None # x could be complex
def test_AppliedPredicate(): assert sstr(Q.even(x)) == 'Q.even(x)'
from sympy import ask, Q print("ask(Q.even(2)):", ask(Q.even(2))) print("ask(Q.odd(2)):", ask(Q.odd(2))) print("ask(Q.even(3)):", ask(Q.even(3))) print("ask(Q.odd(3)):", ask(Q.odd(3))) print("ask(Q.even(4)):", ask(Q.even(4))) print("ask(Q.odd(4)):", ask(Q.odd(4))) print("-----------------------") print("ask(Q.prime(2)):", ask(Q.prime(2))) print("ask(Q.prime(3)):", ask(Q.prime(3))) print("ask(Q.prime(4)):", ask(Q.prime(4))) """ ask(Q.even(2)): True ask(Q.odd(2)): False ask(Q.even(3)): False ask(Q.odd(3)): True ask(Q.even(4)): True ask(Q.odd(4)): False ----------------------- ask(Q.prime(2)): True ask(Q.prime(3)): True ask(Q.prime(4)): False """
def test_AppliedPredicate(): sT(Q.even(Symbol('z')), "AppliedPredicate(Q.even, Symbol('z'))")