Initialisation du repository de Beta
This commit is contained in:
commit
14985f6dbb
9469 changed files with 1903273 additions and 0 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,810 @@
|
|||
from sympy.assumptions.refine import refine
|
||||
from sympy.calculus.accumulationbounds import AccumBounds
|
||||
from sympy.concrete.products import Product
|
||||
from sympy.concrete.summations import Sum
|
||||
from sympy.core.function import expand_log
|
||||
from sympy.core.numbers import (E, Float, I, Rational, nan, oo, pi, zoo)
|
||||
from sympy.core.power import Pow
|
||||
from sympy.core.singleton import S
|
||||
from sympy.core.symbol import (Symbol, symbols)
|
||||
from sympy.functions.elementary.complexes import (adjoint, conjugate, re, sign, transpose)
|
||||
from sympy.functions.elementary.exponential import (LambertW, exp, exp_polar, log)
|
||||
from sympy.functions.elementary.hyperbolic import (cosh, sinh, tanh)
|
||||
from sympy.functions.elementary.miscellaneous import sqrt
|
||||
from sympy.functions.elementary.trigonometric import (cos, sin, tan)
|
||||
from sympy.matrices.expressions.matexpr import MatrixSymbol
|
||||
from sympy.polys.polytools import gcd
|
||||
from sympy.series.order import O
|
||||
from sympy.simplify.simplify import simplify
|
||||
from sympy.core.parameters import global_parameters
|
||||
from sympy.functions.elementary.exponential import match_real_imag
|
||||
from sympy.abc import x, y, z
|
||||
from sympy.core.expr import unchanged
|
||||
from sympy.core.function import ArgumentIndexError
|
||||
from sympy.testing.pytest import raises, XFAIL, _both_exp_pow
|
||||
|
||||
|
||||
@_both_exp_pow
|
||||
def test_exp_values():
|
||||
if global_parameters.exp_is_pow:
|
||||
assert type(exp(x)) is Pow
|
||||
else:
|
||||
assert type(exp(x)) is exp
|
||||
|
||||
k = Symbol('k', integer=True)
|
||||
|
||||
assert exp(nan) is nan
|
||||
|
||||
assert exp(oo) is oo
|
||||
assert exp(-oo) == 0
|
||||
|
||||
assert exp(0) == 1
|
||||
assert exp(1) == E
|
||||
assert exp(-1 + x).as_base_exp() == (S.Exp1, x - 1)
|
||||
assert exp(1 + x).as_base_exp() == (S.Exp1, x + 1)
|
||||
|
||||
assert exp(pi*I/2) == I
|
||||
assert exp(pi*I) == -1
|
||||
assert exp(pi*I*Rational(3, 2)) == -I
|
||||
assert exp(2*pi*I) == 1
|
||||
|
||||
assert refine(exp(pi*I*2*k)) == 1
|
||||
assert refine(exp(pi*I*2*(k + S.Half))) == -1
|
||||
assert refine(exp(pi*I*2*(k + Rational(1, 4)))) == I
|
||||
assert refine(exp(pi*I*2*(k + Rational(3, 4)))) == -I
|
||||
|
||||
assert exp(log(x)) == x
|
||||
assert exp(2*log(x)) == x**2
|
||||
assert exp(pi*log(x)) == x**pi
|
||||
|
||||
assert exp(17*log(x) + E*log(y)) == x**17 * y**E
|
||||
|
||||
assert exp(x*log(x)) != x**x
|
||||
assert exp(sin(x)*log(x)) != x
|
||||
|
||||
assert exp(3*log(x) + oo*x) == exp(oo*x) * x**3
|
||||
assert exp(4*log(x)*log(y) + 3*log(x)) == x**3 * exp(4*log(x)*log(y))
|
||||
|
||||
assert exp(-oo, evaluate=False).is_finite is True
|
||||
assert exp(oo, evaluate=False).is_finite is False
|
||||
|
||||
|
||||
@_both_exp_pow
|
||||
def test_exp_period():
|
||||
assert exp(I*pi*Rational(9, 4)) == exp(I*pi/4)
|
||||
assert exp(I*pi*Rational(46, 18)) == exp(I*pi*Rational(5, 9))
|
||||
assert exp(I*pi*Rational(25, 7)) == exp(I*pi*Rational(-3, 7))
|
||||
assert exp(I*pi*Rational(-19, 3)) == exp(-I*pi/3)
|
||||
assert exp(I*pi*Rational(37, 8)) - exp(I*pi*Rational(-11, 8)) == 0
|
||||
assert exp(I*pi*Rational(-5, 3)) / exp(I*pi*Rational(11, 5)) * exp(I*pi*Rational(148, 15)) == 1
|
||||
|
||||
assert exp(2 - I*pi*Rational(17, 5)) == exp(2 + I*pi*Rational(3, 5))
|
||||
assert exp(log(3) + I*pi*Rational(29, 9)) == 3 * exp(I*pi*Rational(-7, 9))
|
||||
|
||||
n = Symbol('n', integer=True)
|
||||
e = Symbol('e', even=True)
|
||||
assert exp(e*I*pi) == 1
|
||||
assert exp((e + 1)*I*pi) == -1
|
||||
assert exp((1 + 4*n)*I*pi/2) == I
|
||||
assert exp((-1 + 4*n)*I*pi/2) == -I
|
||||
|
||||
|
||||
@_both_exp_pow
|
||||
def test_exp_log():
|
||||
x = Symbol("x", real=True)
|
||||
assert log(exp(x)) == x
|
||||
assert exp(log(x)) == x
|
||||
|
||||
if not global_parameters.exp_is_pow:
|
||||
assert log(x).inverse() == exp
|
||||
assert exp(x).inverse() == log
|
||||
|
||||
y = Symbol("y", polar=True)
|
||||
assert log(exp_polar(z)) == z
|
||||
assert exp(log(y)) == y
|
||||
|
||||
|
||||
@_both_exp_pow
|
||||
def test_exp_expand():
|
||||
e = exp(log(Rational(2))*(1 + x) - log(Rational(2))*x)
|
||||
assert e.expand() == 2
|
||||
assert exp(x + y) != exp(x)*exp(y)
|
||||
assert exp(x + y).expand() == exp(x)*exp(y)
|
||||
|
||||
|
||||
@_both_exp_pow
|
||||
def test_exp__as_base_exp():
|
||||
assert exp(x).as_base_exp() == (E, x)
|
||||
assert exp(2*x).as_base_exp() == (E, 2*x)
|
||||
assert exp(x*y).as_base_exp() == (E, x*y)
|
||||
assert exp(-x).as_base_exp() == (E, -x)
|
||||
|
||||
# Pow( *expr.as_base_exp() ) == expr invariant should hold
|
||||
assert E**x == exp(x)
|
||||
assert E**(2*x) == exp(2*x)
|
||||
assert E**(x*y) == exp(x*y)
|
||||
|
||||
assert exp(x).base is S.Exp1
|
||||
assert exp(x).exp == x
|
||||
|
||||
|
||||
@_both_exp_pow
|
||||
def test_exp_infinity():
|
||||
assert exp(I*y) != nan
|
||||
assert refine(exp(I*oo)) is nan
|
||||
assert refine(exp(-I*oo)) is nan
|
||||
assert exp(y*I*oo) != nan
|
||||
assert exp(zoo) is nan
|
||||
x = Symbol('x', extended_real=True, finite=False)
|
||||
assert exp(x).is_complex is None
|
||||
|
||||
|
||||
@_both_exp_pow
|
||||
def test_exp_subs():
|
||||
x = Symbol('x')
|
||||
e = (exp(3*log(x), evaluate=False)) # evaluates to x**3
|
||||
assert e.subs(x**3, y**3) == e
|
||||
assert e.subs(x**2, 5) == e
|
||||
assert (x**3).subs(x**2, y) != y**Rational(3, 2)
|
||||
assert exp(exp(x) + exp(x**2)).subs(exp(exp(x)), y) == y * exp(exp(x**2))
|
||||
assert exp(x).subs(E, y) == y**x
|
||||
x = symbols('x', real=True)
|
||||
assert exp(5*x).subs(exp(7*x), y) == y**Rational(5, 7)
|
||||
assert exp(2*x + 7).subs(exp(3*x), y) == y**Rational(2, 3) * exp(7)
|
||||
x = symbols('x', positive=True)
|
||||
assert exp(3*log(x)).subs(x**2, y) == y**Rational(3, 2)
|
||||
# differentiate between E and exp
|
||||
assert exp(exp(x + E)).subs(exp, 3) == 3**(3**(x + E))
|
||||
assert exp(exp(x + E)).subs(exp, sin) == sin(sin(x + E))
|
||||
assert exp(exp(x + E)).subs(E, 3) == 3**(3**(x + 3))
|
||||
assert exp(3).subs(E, sin) == sin(3)
|
||||
|
||||
|
||||
def test_exp_adjoint():
|
||||
x = Symbol('x', commutative=False)
|
||||
assert adjoint(exp(x)) == exp(adjoint(x))
|
||||
|
||||
|
||||
def test_exp_conjugate():
|
||||
assert conjugate(exp(x)) == exp(conjugate(x))
|
||||
|
||||
|
||||
@_both_exp_pow
|
||||
def test_exp_transpose():
|
||||
assert transpose(exp(x)) == exp(transpose(x))
|
||||
|
||||
|
||||
@_both_exp_pow
|
||||
def test_exp_rewrite():
|
||||
assert exp(x).rewrite(sin) == sinh(x) + cosh(x)
|
||||
assert exp(x*I).rewrite(cos) == cos(x) + I*sin(x)
|
||||
assert exp(1).rewrite(cos) == sinh(1) + cosh(1)
|
||||
assert exp(1).rewrite(sin) == sinh(1) + cosh(1)
|
||||
assert exp(1).rewrite(sin) == sinh(1) + cosh(1)
|
||||
assert exp(x).rewrite(tanh) == (1 + tanh(x/2))/(1 - tanh(x/2))
|
||||
assert exp(pi*I/4).rewrite(sqrt) == sqrt(2)/2 + sqrt(2)*I/2
|
||||
assert exp(pi*I/3).rewrite(sqrt) == S.Half + sqrt(3)*I/2
|
||||
if not global_parameters.exp_is_pow:
|
||||
assert exp(x*log(y)).rewrite(Pow) == y**x
|
||||
assert exp(log(x)*log(y)).rewrite(Pow) in [x**log(y), y**log(x)]
|
||||
assert exp(log(log(x))*y).rewrite(Pow) == log(x)**y
|
||||
|
||||
n = Symbol('n', integer=True)
|
||||
|
||||
assert Sum((exp(pi*I/2)/2)**n, (n, 0, oo)).rewrite(sqrt).doit() == Rational(4, 5) + I*2/5
|
||||
assert Sum((exp(pi*I/4)/2)**n, (n, 0, oo)).rewrite(sqrt).doit() == 1/(1 - sqrt(2)*(1 + I)/4)
|
||||
assert (Sum((exp(pi*I/3)/2)**n, (n, 0, oo)).rewrite(sqrt).doit().cancel()
|
||||
== 4*I/(sqrt(3) + 3*I))
|
||||
|
||||
|
||||
@_both_exp_pow
|
||||
def test_exp_leading_term():
|
||||
assert exp(x).as_leading_term(x) == 1
|
||||
assert exp(2 + x).as_leading_term(x) == exp(2)
|
||||
assert exp((2*x + 3) / (x+1)).as_leading_term(x) == exp(3)
|
||||
|
||||
# The following tests are commented, since now SymPy returns the
|
||||
# original function when the leading term in the series expansion does
|
||||
# not exist.
|
||||
# raises(NotImplementedError, lambda: exp(1/x).as_leading_term(x))
|
||||
# raises(NotImplementedError, lambda: exp((x + 1) / x**2).as_leading_term(x))
|
||||
# raises(NotImplementedError, lambda: exp(x + 1/x).as_leading_term(x))
|
||||
|
||||
|
||||
@_both_exp_pow
|
||||
def test_exp_taylor_term():
|
||||
x = symbols('x')
|
||||
assert exp(x).taylor_term(1, x) == x
|
||||
assert exp(x).taylor_term(3, x) == x**3/6
|
||||
assert exp(x).taylor_term(4, x) == x**4/24
|
||||
assert exp(x).taylor_term(-1, x) is S.Zero
|
||||
|
||||
|
||||
def test_exp_MatrixSymbol():
|
||||
A = MatrixSymbol("A", 2, 2)
|
||||
assert exp(A).has(exp)
|
||||
|
||||
|
||||
def test_exp_fdiff():
|
||||
x = Symbol('x')
|
||||
raises(ArgumentIndexError, lambda: exp(x).fdiff(2))
|
||||
|
||||
|
||||
def test_log_values():
|
||||
assert log(nan) is nan
|
||||
|
||||
assert log(oo) is oo
|
||||
assert log(-oo) is oo
|
||||
|
||||
assert log(zoo) is zoo
|
||||
assert log(-zoo) is zoo
|
||||
|
||||
assert log(0) is zoo
|
||||
|
||||
assert log(1) == 0
|
||||
assert log(-1) == I*pi
|
||||
|
||||
assert log(E) == 1
|
||||
assert log(-E).expand() == 1 + I*pi
|
||||
|
||||
assert unchanged(log, pi)
|
||||
assert log(-pi).expand() == log(pi) + I*pi
|
||||
|
||||
assert unchanged(log, 17)
|
||||
assert log(-17) == log(17) + I*pi
|
||||
|
||||
assert log(I) == I*pi/2
|
||||
assert log(-I) == -I*pi/2
|
||||
|
||||
assert log(17*I) == I*pi/2 + log(17)
|
||||
assert log(-17*I).expand() == -I*pi/2 + log(17)
|
||||
|
||||
assert log(oo*I) is oo
|
||||
assert log(-oo*I) is oo
|
||||
assert log(0, 2) is zoo
|
||||
assert log(0, 5) is zoo
|
||||
|
||||
assert exp(-log(3))**(-1) == 3
|
||||
|
||||
assert log(S.Half) == -log(2)
|
||||
assert log(2*3).func is log
|
||||
assert log(2*3**2).func is log
|
||||
|
||||
|
||||
def test_match_real_imag():
|
||||
x, y = symbols('x,y', real=True)
|
||||
i = Symbol('i', imaginary=True)
|
||||
assert match_real_imag(S.One) == (1, 0)
|
||||
assert match_real_imag(I) == (0, 1)
|
||||
assert match_real_imag(3 - 5*I) == (3, -5)
|
||||
assert match_real_imag(-sqrt(3) + S.Half*I) == (-sqrt(3), S.Half)
|
||||
assert match_real_imag(x + y*I) == (x, y)
|
||||
assert match_real_imag(x*I + y*I) == (0, x + y)
|
||||
assert match_real_imag((x + y)*I) == (0, x + y)
|
||||
assert match_real_imag(Rational(-2, 3)*i*I) == (None, None)
|
||||
assert match_real_imag(1 - 2*i) == (None, None)
|
||||
assert match_real_imag(sqrt(2)*(3 - 5*I)) == (None, None)
|
||||
|
||||
|
||||
def test_log_exact():
|
||||
# check for pi/2, pi/3, pi/4, pi/6, pi/8, pi/12; pi/5, pi/10:
|
||||
for n in range(-23, 24):
|
||||
if gcd(n, 24) != 1:
|
||||
assert log(exp(n*I*pi/24).rewrite(sqrt)) == n*I*pi/24
|
||||
for n in range(-9, 10):
|
||||
assert log(exp(n*I*pi/10).rewrite(sqrt)) == n*I*pi/10
|
||||
|
||||
assert log(S.Half - I*sqrt(3)/2) == -I*pi/3
|
||||
assert log(Rational(-1, 2) + I*sqrt(3)/2) == I*pi*Rational(2, 3)
|
||||
assert log(-sqrt(2)/2 - I*sqrt(2)/2) == -I*pi*Rational(3, 4)
|
||||
assert log(-sqrt(3)/2 - I*S.Half) == -I*pi*Rational(5, 6)
|
||||
|
||||
assert log(Rational(-1, 4) + sqrt(5)/4 - I*sqrt(sqrt(5)/8 + Rational(5, 8))) == -I*pi*Rational(2, 5)
|
||||
assert log(sqrt(Rational(5, 8) - sqrt(5)/8) + I*(Rational(1, 4) + sqrt(5)/4)) == I*pi*Rational(3, 10)
|
||||
assert log(-sqrt(sqrt(2)/4 + S.Half) + I*sqrt(S.Half - sqrt(2)/4)) == I*pi*Rational(7, 8)
|
||||
assert log(-sqrt(6)/4 - sqrt(2)/4 + I*(-sqrt(6)/4 + sqrt(2)/4)) == -I*pi*Rational(11, 12)
|
||||
|
||||
assert log(-1 + I*sqrt(3)) == log(2) + I*pi*Rational(2, 3)
|
||||
assert log(5 + 5*I) == log(5*sqrt(2)) + I*pi/4
|
||||
assert log(sqrt(-12)) == log(2*sqrt(3)) + I*pi/2
|
||||
assert log(-sqrt(6) + sqrt(2) - I*sqrt(6) - I*sqrt(2)) == log(4) - I*pi*Rational(7, 12)
|
||||
assert log(-sqrt(6-3*sqrt(2)) - I*sqrt(6+3*sqrt(2))) == log(2*sqrt(3)) - I*pi*Rational(5, 8)
|
||||
assert log(1 + I*sqrt(2-sqrt(2))/sqrt(2+sqrt(2))) == log(2/sqrt(sqrt(2) + 2)) + I*pi/8
|
||||
assert log(cos(pi*Rational(7, 12)) + I*sin(pi*Rational(7, 12))) == I*pi*Rational(7, 12)
|
||||
assert log(cos(pi*Rational(6, 5)) + I*sin(pi*Rational(6, 5))) == I*pi*Rational(-4, 5)
|
||||
|
||||
assert log(5*(1 + I)/sqrt(2)) == log(5) + I*pi/4
|
||||
assert log(sqrt(2)*(-sqrt(3) + 1 - sqrt(3)*I - I)) == log(4) - I*pi*Rational(7, 12)
|
||||
assert log(-sqrt(2)*(1 - I*sqrt(3))) == log(2*sqrt(2)) + I*pi*Rational(2, 3)
|
||||
assert log(sqrt(3)*I*(-sqrt(6 - 3*sqrt(2)) - I*sqrt(3*sqrt(2) + 6))) == log(6) - I*pi/8
|
||||
|
||||
zero = (1 + sqrt(2))**2 - 3 - 2*sqrt(2)
|
||||
assert log(zero - I*sqrt(3)) == log(sqrt(3)) - I*pi/2
|
||||
assert unchanged(log, zero + I*zero) or log(zero + zero*I) is zoo
|
||||
|
||||
# bail quickly if no obvious simplification is possible:
|
||||
assert unchanged(log, (sqrt(2)-1/sqrt(sqrt(3)+I))**1000)
|
||||
# beware of non-real coefficients
|
||||
assert unchanged(log, sqrt(2-sqrt(5))*(1 + I))
|
||||
|
||||
|
||||
def test_log_base():
|
||||
assert log(1, 2) == 0
|
||||
assert log(2, 2) == 1
|
||||
assert log(3, 2) == log(3)/log(2)
|
||||
assert log(6, 2) == 1 + log(3)/log(2)
|
||||
assert log(6, 3) == 1 + log(2)/log(3)
|
||||
assert log(2**3, 2) == 3
|
||||
assert log(3**3, 3) == 3
|
||||
assert log(5, 1) is zoo
|
||||
assert log(1, 1) is nan
|
||||
assert log(Rational(2, 3), 10) == log(Rational(2, 3))/log(10)
|
||||
assert log(Rational(2, 3), Rational(1, 3)) == -log(2)/log(3) + 1
|
||||
assert log(Rational(2, 3), Rational(2, 5)) == \
|
||||
log(Rational(2, 3))/log(Rational(2, 5))
|
||||
# issue 17148
|
||||
assert log(Rational(8, 3), 2) == -log(3)/log(2) + 3
|
||||
|
||||
|
||||
def test_log_symbolic():
|
||||
assert log(x, exp(1)) == log(x)
|
||||
assert log(exp(x)) != x
|
||||
|
||||
assert log(x, exp(1)) == log(x)
|
||||
assert log(x*y) != log(x) + log(y)
|
||||
assert log(x/y).expand() != log(x) - log(y)
|
||||
assert log(x/y).expand(force=True) == log(x) - log(y)
|
||||
assert log(x**y).expand() != y*log(x)
|
||||
assert log(x**y).expand(force=True) == y*log(x)
|
||||
|
||||
assert log(x, 2) == log(x)/log(2)
|
||||
assert log(E, 2) == 1/log(2)
|
||||
|
||||
p, q = symbols('p,q', positive=True)
|
||||
r = Symbol('r', real=True)
|
||||
|
||||
assert log(p**2) != 2*log(p)
|
||||
assert log(p**2).expand() == 2*log(p)
|
||||
assert log(x**2).expand() != 2*log(x)
|
||||
assert log(p**q) != q*log(p)
|
||||
assert log(exp(p)) == p
|
||||
assert log(p*q) != log(p) + log(q)
|
||||
assert log(p*q).expand() == log(p) + log(q)
|
||||
|
||||
assert log(-sqrt(3)) == log(sqrt(3)) + I*pi
|
||||
assert log(-exp(p)) != p + I*pi
|
||||
assert log(-exp(x)).expand() != x + I*pi
|
||||
assert log(-exp(r)).expand() == r + I*pi
|
||||
|
||||
assert log(x**y) != y*log(x)
|
||||
|
||||
assert (log(x**-5)**-1).expand() != -1/log(x)/5
|
||||
assert (log(p**-5)**-1).expand() == -1/log(p)/5
|
||||
assert log(-x).func is log and log(-x).args[0] == -x
|
||||
assert log(-p).func is log and log(-p).args[0] == -p
|
||||
|
||||
|
||||
def test_log_exp():
|
||||
assert log(exp(4*I*pi)) == 0 # exp evaluates
|
||||
assert log(exp(-5*I*pi)) == I*pi # exp evaluates
|
||||
assert log(exp(I*pi*Rational(19, 4))) == I*pi*Rational(3, 4)
|
||||
assert log(exp(I*pi*Rational(25, 7))) == I*pi*Rational(-3, 7)
|
||||
assert log(exp(-5*I)) == -5*I + 2*I*pi
|
||||
|
||||
|
||||
@_both_exp_pow
|
||||
def test_exp_assumptions():
|
||||
r = Symbol('r', real=True)
|
||||
i = Symbol('i', imaginary=True)
|
||||
for e in exp, exp_polar:
|
||||
assert e(x).is_real is None
|
||||
assert e(x).is_imaginary is None
|
||||
assert e(i).is_real is None
|
||||
assert e(i).is_imaginary is None
|
||||
assert e(r).is_real is True
|
||||
assert e(r).is_imaginary is False
|
||||
assert e(re(x)).is_extended_real is True
|
||||
assert e(re(x)).is_imaginary is False
|
||||
|
||||
assert Pow(E, I*pi, evaluate=False).is_imaginary == False
|
||||
assert Pow(E, 2*I*pi, evaluate=False).is_imaginary == False
|
||||
assert Pow(E, I*pi/2, evaluate=False).is_imaginary == True
|
||||
assert Pow(E, I*pi/3, evaluate=False).is_imaginary is None
|
||||
|
||||
assert exp(0, evaluate=False).is_algebraic
|
||||
|
||||
a = Symbol('a', algebraic=True)
|
||||
an = Symbol('an', algebraic=True, nonzero=True)
|
||||
r = Symbol('r', rational=True)
|
||||
rn = Symbol('rn', rational=True, nonzero=True)
|
||||
assert exp(a).is_algebraic is None
|
||||
assert exp(an).is_algebraic is False
|
||||
assert exp(pi*r).is_algebraic is None
|
||||
assert exp(pi*rn).is_algebraic is False
|
||||
|
||||
assert exp(0, evaluate=False).is_algebraic is True
|
||||
assert exp(I*pi/3, evaluate=False).is_algebraic is True
|
||||
assert exp(I*pi*r, evaluate=False).is_algebraic is True
|
||||
|
||||
|
||||
@_both_exp_pow
|
||||
def test_exp_AccumBounds():
|
||||
assert exp(AccumBounds(1, 2)) == AccumBounds(E, E**2)
|
||||
|
||||
|
||||
def test_log_assumptions():
|
||||
p = symbols('p', positive=True)
|
||||
n = symbols('n', negative=True)
|
||||
z = symbols('z', zero=True)
|
||||
x = symbols('x', infinite=True, extended_positive=True)
|
||||
|
||||
assert log(z).is_positive is False
|
||||
assert log(x).is_extended_positive is True
|
||||
assert log(2) > 0
|
||||
assert log(1, evaluate=False).is_zero
|
||||
assert log(1 + z).is_zero
|
||||
assert log(p).is_zero is None
|
||||
assert log(n).is_zero is False
|
||||
assert log(0.5).is_negative is True
|
||||
assert log(exp(p) + 1).is_positive
|
||||
|
||||
assert log(1, evaluate=False).is_algebraic
|
||||
assert log(42, evaluate=False).is_algebraic is False
|
||||
|
||||
assert log(1 + z).is_rational
|
||||
|
||||
|
||||
def test_log_hashing():
|
||||
assert x != log(log(x))
|
||||
assert hash(x) != hash(log(log(x)))
|
||||
assert log(x) != log(log(log(x)))
|
||||
|
||||
e = 1/log(log(x) + log(log(x)))
|
||||
assert e.base.func is log
|
||||
e = 1/log(log(x) + log(log(log(x))))
|
||||
assert e.base.func is log
|
||||
|
||||
e = log(log(x))
|
||||
assert e.func is log
|
||||
assert x.func is not log
|
||||
assert hash(log(log(x))) != hash(x)
|
||||
assert e != x
|
||||
|
||||
|
||||
def test_log_sign():
|
||||
assert sign(log(2)) == 1
|
||||
|
||||
|
||||
def test_log_expand_complex():
|
||||
assert log(1 + I).expand(complex=True) == log(2)/2 + I*pi/4
|
||||
assert log(1 - sqrt(2)).expand(complex=True) == log(sqrt(2) - 1) + I*pi
|
||||
|
||||
|
||||
def test_log_apply_evalf():
|
||||
value = (log(3)/log(2) - 1).evalf()
|
||||
assert value.epsilon_eq(Float("0.58496250072115618145373"))
|
||||
|
||||
|
||||
def test_log_leading_term():
|
||||
p = Symbol('p')
|
||||
|
||||
# Test for STEP 3
|
||||
assert log(1 + x + x**2).as_leading_term(x, cdir=1) == x
|
||||
# Test for STEP 4
|
||||
assert log(2*x).as_leading_term(x, cdir=1) == log(x) + log(2)
|
||||
assert log(2*x).as_leading_term(x, cdir=-1) == log(x) + log(2)
|
||||
assert log(-2*x).as_leading_term(x, cdir=1, logx=p) == p + log(2) + I*pi
|
||||
assert log(-2*x).as_leading_term(x, cdir=-1, logx=p) == p + log(2) - I*pi
|
||||
# Test for STEP 5
|
||||
assert log(-2*x + (3 - I)*x**2).as_leading_term(x, cdir=1) == log(x) + log(2) - I*pi
|
||||
assert log(-2*x + (3 - I)*x**2).as_leading_term(x, cdir=-1) == log(x) + log(2) - I*pi
|
||||
assert log(2*x + (3 - I)*x**2).as_leading_term(x, cdir=1) == log(x) + log(2)
|
||||
assert log(2*x + (3 - I)*x**2).as_leading_term(x, cdir=-1) == log(x) + log(2) - 2*I*pi
|
||||
assert log(-1 + x - I*x**2 + I*x**3).as_leading_term(x, cdir=1) == -I*pi
|
||||
assert log(-1 + x - I*x**2 + I*x**3).as_leading_term(x, cdir=-1) == -I*pi
|
||||
assert log(-1/(1 - x)).as_leading_term(x, cdir=1) == I*pi
|
||||
assert log(-1/(1 - x)).as_leading_term(x, cdir=-1) == I*pi
|
||||
|
||||
|
||||
def test_log_nseries():
|
||||
p = Symbol('p')
|
||||
assert log(1/x)._eval_nseries(x, 4, logx=-p, cdir=1) == p
|
||||
assert log(1/x)._eval_nseries(x, 4, logx=-p, cdir=-1) == p + 2*I*pi
|
||||
assert log(x - 1)._eval_nseries(x, 4, None, I) == I*pi - x - x**2/2 - x**3/3 + O(x**4)
|
||||
assert log(x - 1)._eval_nseries(x, 4, None, -I) == -I*pi - x - x**2/2 - x**3/3 + O(x**4)
|
||||
assert log(I*x + I*x**3 - 1)._eval_nseries(x, 3, None, 1) == I*pi - I*x + x**2/2 + O(x**3)
|
||||
assert log(I*x + I*x**3 - 1)._eval_nseries(x, 3, None, -1) == -I*pi - I*x + x**2/2 + O(x**3)
|
||||
assert log(I*x**2 + I*x**3 - 1)._eval_nseries(x, 3, None, 1) == I*pi - I*x**2 + O(x**3)
|
||||
assert log(I*x**2 + I*x**3 - 1)._eval_nseries(x, 3, None, -1) == I*pi - I*x**2 + O(x**3)
|
||||
assert log(2*x + (3 - I)*x**2)._eval_nseries(x, 3, None, 1) == log(2) + log(x) + \
|
||||
x*(S(3)/2 - I/2) + x**2*(-1 + 3*I/4) + O(x**3)
|
||||
assert log(2*x + (3 - I)*x**2)._eval_nseries(x, 3, None, -1) == -2*I*pi + log(2) + \
|
||||
log(x) - x*(-S(3)/2 + I/2) + x**2*(-1 + 3*I/4) + O(x**3)
|
||||
assert log(-2*x + (3 - I)*x**2)._eval_nseries(x, 3, None, 1) == -I*pi + log(2) + log(x) + \
|
||||
x*(-S(3)/2 + I/2) + x**2*(-1 + 3*I/4) + O(x**3)
|
||||
assert log(-2*x + (3 - I)*x**2)._eval_nseries(x, 3, None, -1) == -I*pi + log(2) + log(x) - \
|
||||
x*(S(3)/2 - I/2) + x**2*(-1 + 3*I/4) + O(x**3)
|
||||
assert log(sqrt(-I*x**2 - 3)*sqrt(-I*x**2 - 1) - 2)._eval_nseries(x, 3, None, 1) == -I*pi + \
|
||||
log(sqrt(3) + 2) + 2*sqrt(3)*I*x**2/(3*sqrt(3) + 6) + O(x**3)
|
||||
assert log(-1/(1 - x))._eval_nseries(x, 3, None, 1) == I*pi + x + x**2/2 + O(x**3)
|
||||
assert log(-1/(1 - x))._eval_nseries(x, 3, None, -1) == I*pi + x + x**2/2 + O(x**3)
|
||||
|
||||
|
||||
def test_log_series():
|
||||
# Note Series at infinities other than oo/-oo were introduced as a part of
|
||||
# pull request 23798. Refer https://github.com/sympy/sympy/pull/23798 for
|
||||
# more information.
|
||||
expr1 = log(1 + x)
|
||||
expr2 = log(x + sqrt(x**2 + 1))
|
||||
|
||||
assert expr1.series(x, x0=I*oo, n=4) == 1/(3*x**3) - 1/(2*x**2) + 1/x + \
|
||||
I*pi/2 - log(I/x) + O(x**(-4), (x, oo*I))
|
||||
assert expr1.series(x, x0=-I*oo, n=4) == 1/(3*x**3) - 1/(2*x**2) + 1/x - \
|
||||
I*pi/2 - log(-I/x) + O(x**(-4), (x, -oo*I))
|
||||
assert expr2.series(x, x0=I*oo, n=4) == 1/(4*x**2) + I*pi/2 + log(2) - \
|
||||
log(I/x) + O(x**(-4), (x, oo*I))
|
||||
assert expr2.series(x, x0=-I*oo, n=4) == -1/(4*x**2) - I*pi/2 - log(2) + \
|
||||
log(-I/x) + O(x**(-4), (x, -oo*I))
|
||||
|
||||
|
||||
def test_log_expand():
|
||||
w = Symbol("w", positive=True)
|
||||
e = log(w**(log(5)/log(3)))
|
||||
assert e.expand() == log(5)/log(3) * log(w)
|
||||
x, y, z = symbols('x,y,z', positive=True)
|
||||
assert log(x*(y + z)).expand(mul=False) == log(x) + log(y + z)
|
||||
assert log(log(x**2)*log(y*z)).expand() in [log(2*log(x)*log(y) +
|
||||
2*log(x)*log(z)), log(log(x)*log(z) + log(y)*log(x)) + log(2),
|
||||
log((log(y) + log(z))*log(x)) + log(2)]
|
||||
assert log(x**log(x**2)).expand(deep=False) == log(x)*log(x**2)
|
||||
assert log(x**log(x**2)).expand() == 2*log(x)**2
|
||||
x, y = symbols('x,y')
|
||||
assert log(x*y).expand(force=True) == log(x) + log(y)
|
||||
assert log(x**y).expand(force=True) == y*log(x)
|
||||
assert log(exp(x)).expand(force=True) == x
|
||||
|
||||
# there's generally no need to expand out logs since this requires
|
||||
# factoring and if simplification is sought, it's cheaper to put
|
||||
# logs together than it is to take them apart.
|
||||
assert log(2*3**2).expand() != 2*log(3) + log(2)
|
||||
|
||||
|
||||
@XFAIL
|
||||
def test_log_expand_fail():
|
||||
x, y, z = symbols('x,y,z', positive=True)
|
||||
assert (log(x*(y + z))*(x + y)).expand(mul=True, log=True) == y*log(
|
||||
x) + y*log(y + z) + z*log(x) + z*log(y + z)
|
||||
|
||||
|
||||
def test_log_simplify():
|
||||
x = Symbol("x", positive=True)
|
||||
assert log(x**2).expand() == 2*log(x)
|
||||
assert expand_log(log(x**(2 + log(2)))) == (2 + log(2))*log(x)
|
||||
|
||||
z = Symbol('z')
|
||||
assert log(sqrt(z)).expand() == log(z)/2
|
||||
assert expand_log(log(z**(log(2) - 1))) == (log(2) - 1)*log(z)
|
||||
assert log(z**(-1)).expand() != -log(z)
|
||||
assert log(z**(x/(x+1))).expand() == x*log(z)/(x + 1)
|
||||
|
||||
|
||||
def test_log_AccumBounds():
|
||||
assert log(AccumBounds(1, E)) == AccumBounds(0, 1)
|
||||
assert log(AccumBounds(0, E)) == AccumBounds(-oo, 1)
|
||||
assert log(AccumBounds(-1, E)) == S.NaN
|
||||
assert log(AccumBounds(0, oo)) == AccumBounds(-oo, oo)
|
||||
assert log(AccumBounds(-oo, 0)) == S.NaN
|
||||
assert log(AccumBounds(-oo, oo)) == S.NaN
|
||||
|
||||
|
||||
@_both_exp_pow
|
||||
def test_lambertw():
|
||||
k = Symbol('k')
|
||||
|
||||
assert LambertW(x, 0) == LambertW(x)
|
||||
assert LambertW(x, 0, evaluate=False) != LambertW(x)
|
||||
assert LambertW(0) == 0
|
||||
assert LambertW(E) == 1
|
||||
assert LambertW(-1/E) == -1
|
||||
assert LambertW(-log(2)/2) == -log(2)
|
||||
assert LambertW(oo) is oo
|
||||
assert LambertW(0, 1) is -oo
|
||||
assert LambertW(0, 42) is -oo
|
||||
assert LambertW(-pi/2, -1) == -I*pi/2
|
||||
assert LambertW(-1/E, -1) == -1
|
||||
assert LambertW(-2*exp(-2), -1) == -2
|
||||
assert LambertW(2*log(2)) == log(2)
|
||||
assert LambertW(-pi/2) == I*pi/2
|
||||
assert LambertW(exp(1 + E)) == E
|
||||
|
||||
assert LambertW(x**2).diff(x) == 2*LambertW(x**2)/x/(1 + LambertW(x**2))
|
||||
assert LambertW(x, k).diff(x) == LambertW(x, k)/x/(1 + LambertW(x, k))
|
||||
|
||||
assert LambertW(sqrt(2)).evalf(30).epsilon_eq(
|
||||
Float("0.701338383413663009202120278965", 30), 1e-29)
|
||||
assert re(LambertW(2, -1)).evalf().epsilon_eq(Float("-0.834310366631110"))
|
||||
|
||||
assert LambertW(-1).is_real is False # issue 5215
|
||||
assert LambertW(2, evaluate=False).is_real
|
||||
p = Symbol('p', positive=True)
|
||||
assert LambertW(p, evaluate=False).is_real
|
||||
assert LambertW(p - 1, evaluate=False).is_real is None
|
||||
assert LambertW(-p - 2/S.Exp1, evaluate=False).is_real is False
|
||||
assert LambertW(S.Half, -1, evaluate=False).is_real is False
|
||||
assert LambertW(Rational(-1, 10), -1, evaluate=False).is_real
|
||||
assert LambertW(-10, -1, evaluate=False).is_real is False
|
||||
assert LambertW(-2, 2, evaluate=False).is_real is False
|
||||
|
||||
assert LambertW(0, evaluate=False).is_algebraic
|
||||
na = Symbol('na', nonzero=True, algebraic=True)
|
||||
assert LambertW(na).is_algebraic is False
|
||||
assert LambertW(p).is_zero is False
|
||||
n = Symbol('n', negative=True)
|
||||
assert LambertW(n).is_zero is False
|
||||
|
||||
|
||||
def test_issue_5673():
|
||||
e = LambertW(-1)
|
||||
assert e.is_comparable is False
|
||||
assert e.is_positive is not True
|
||||
e2 = 1 - 1/(1 - exp(-1000))
|
||||
assert e2.is_positive is not True
|
||||
e3 = -2 + exp(exp(LambertW(log(2)))*LambertW(log(2)))
|
||||
assert e3.is_nonzero is not True
|
||||
|
||||
|
||||
def test_log_fdiff():
|
||||
x = Symbol('x')
|
||||
raises(ArgumentIndexError, lambda: log(x).fdiff(2))
|
||||
|
||||
|
||||
def test_log_taylor_term():
|
||||
x = symbols('x')
|
||||
assert log(x).taylor_term(0, x) == x
|
||||
assert log(x).taylor_term(1, x) == -x**2/2
|
||||
assert log(x).taylor_term(4, x) == x**5/5
|
||||
assert log(x).taylor_term(-1, x) is S.Zero
|
||||
|
||||
|
||||
def test_exp_expand_NC():
|
||||
A, B, C = symbols('A,B,C', commutative=False)
|
||||
|
||||
assert exp(A + B).expand() == exp(A + B)
|
||||
assert exp(A + B + C).expand() == exp(A + B + C)
|
||||
assert exp(x + y).expand() == exp(x)*exp(y)
|
||||
assert exp(x + y + z).expand() == exp(x)*exp(y)*exp(z)
|
||||
|
||||
|
||||
@_both_exp_pow
|
||||
def test_as_numer_denom():
|
||||
n = symbols('n', negative=True)
|
||||
assert exp(x).as_numer_denom() == (exp(x), 1)
|
||||
assert exp(-x).as_numer_denom() == (1, exp(x))
|
||||
assert exp(-2*x).as_numer_denom() == (1, exp(2*x))
|
||||
assert exp(-2).as_numer_denom() == (1, exp(2))
|
||||
assert exp(n).as_numer_denom() == (1, exp(-n))
|
||||
assert exp(-n).as_numer_denom() == (exp(-n), 1)
|
||||
assert exp(-I*x).as_numer_denom() == (1, exp(I*x))
|
||||
assert exp(-I*n).as_numer_denom() == (1, exp(I*n))
|
||||
assert exp(-n).as_numer_denom() == (exp(-n), 1)
|
||||
# Check noncommutativity
|
||||
a = symbols('a', commutative=False)
|
||||
assert exp(-a).as_numer_denom() == (exp(-a), 1)
|
||||
|
||||
|
||||
@_both_exp_pow
|
||||
def test_polar():
|
||||
x, y = symbols('x y', polar=True)
|
||||
|
||||
assert abs(exp_polar(I*4)) == 1
|
||||
assert abs(exp_polar(0)) == 1
|
||||
assert abs(exp_polar(2 + 3*I)) == exp(2)
|
||||
assert exp_polar(I*10).n() == exp_polar(I*10)
|
||||
|
||||
assert log(exp_polar(z)) == z
|
||||
assert log(x*y).expand() == log(x) + log(y)
|
||||
assert log(x**z).expand() == z*log(x)
|
||||
|
||||
assert exp_polar(3).exp == 3
|
||||
|
||||
# Compare exp(1.0*pi*I).
|
||||
assert (exp_polar(1.0*pi*I).n(n=5)).as_real_imag()[1] >= 0
|
||||
|
||||
assert exp_polar(0).is_rational is True # issue 8008
|
||||
|
||||
|
||||
def test_exp_summation():
|
||||
w = symbols("w")
|
||||
m, n, i, j = symbols("m n i j")
|
||||
expr = exp(Sum(w*i, (i, 0, n), (j, 0, m)))
|
||||
assert expr.expand() == Product(exp(w*i), (i, 0, n), (j, 0, m))
|
||||
|
||||
|
||||
def test_log_product():
|
||||
from sympy.abc import n, m
|
||||
|
||||
i, j = symbols('i,j', positive=True, integer=True)
|
||||
x, y = symbols('x,y', positive=True)
|
||||
z = symbols('z', real=True)
|
||||
w = symbols('w')
|
||||
|
||||
expr = log(Product(x**i, (i, 1, n)))
|
||||
assert simplify(expr) == expr
|
||||
assert expr.expand() == Sum(i*log(x), (i, 1, n))
|
||||
expr = log(Product(x**i*y**j, (i, 1, n), (j, 1, m)))
|
||||
assert simplify(expr) == expr
|
||||
assert expr.expand() == Sum(i*log(x) + j*log(y), (i, 1, n), (j, 1, m))
|
||||
|
||||
expr = log(Product(-2, (n, 0, 4)))
|
||||
assert simplify(expr) == expr
|
||||
assert expr.expand() == expr
|
||||
assert expr.expand(force=True) == Sum(log(-2), (n, 0, 4))
|
||||
|
||||
expr = log(Product(exp(z*i), (i, 0, n)))
|
||||
assert expr.expand() == Sum(z*i, (i, 0, n))
|
||||
|
||||
expr = log(Product(exp(w*i), (i, 0, n)))
|
||||
assert expr.expand() == expr
|
||||
assert expr.expand(force=True) == Sum(w*i, (i, 0, n))
|
||||
|
||||
expr = log(Product(i**2*abs(j), (i, 1, n), (j, 1, m)))
|
||||
assert expr.expand() == Sum(2*log(i) + log(j), (i, 1, n), (j, 1, m))
|
||||
|
||||
|
||||
@XFAIL
|
||||
def test_log_product_simplify_to_sum():
|
||||
from sympy.abc import n, m
|
||||
i, j = symbols('i,j', positive=True, integer=True)
|
||||
x, y = symbols('x,y', positive=True)
|
||||
assert simplify(log(Product(x**i, (i, 1, n)))) == Sum(i*log(x), (i, 1, n))
|
||||
assert simplify(log(Product(x**i*y**j, (i, 1, n), (j, 1, m)))) == \
|
||||
Sum(i*log(x) + j*log(y), (i, 1, n), (j, 1, m))
|
||||
|
||||
|
||||
def test_issue_8866():
|
||||
assert simplify(log(x, 10, evaluate=False)) == simplify(log(x, 10))
|
||||
assert expand_log(log(x, 10, evaluate=False)) == expand_log(log(x, 10))
|
||||
|
||||
y = Symbol('y', positive=True)
|
||||
l1 = log(exp(y), exp(10))
|
||||
b1 = log(exp(y), exp(5))
|
||||
l2 = log(exp(y), exp(10), evaluate=False)
|
||||
b2 = log(exp(y), exp(5), evaluate=False)
|
||||
assert simplify(log(l1, b1)) == simplify(log(l2, b2))
|
||||
assert expand_log(log(l1, b1)) == expand_log(log(l2, b2))
|
||||
|
||||
|
||||
def test_log_expand_factor():
|
||||
assert (log(18)/log(3) - 2).expand(factor=True) == log(2)/log(3)
|
||||
assert (log(12)/log(2)).expand(factor=True) == log(3)/log(2) + 2
|
||||
assert (log(15)/log(3)).expand(factor=True) == 1 + log(5)/log(3)
|
||||
assert (log(2)/(-log(12) + log(24))).expand(factor=True) == 1
|
||||
|
||||
assert expand_log(log(12), factor=True) == log(3) + 2*log(2)
|
||||
assert expand_log(log(21)/log(7), factor=False) == log(3)/log(7) + 1
|
||||
assert expand_log(log(45)/log(5) + log(20), factor=False) == \
|
||||
1 + 2*log(3)/log(5) + log(20)
|
||||
assert expand_log(log(45)/log(5) + log(26), factor=True) == \
|
||||
log(2) + log(13) + (log(5) + 2*log(3))/log(5)
|
||||
|
||||
|
||||
def test_issue_9116():
|
||||
n = Symbol('n', positive=True, integer=True)
|
||||
assert log(n).is_nonnegative is True
|
||||
|
||||
|
||||
def test_issue_18473():
|
||||
assert exp(x*log(cos(1/x))).as_leading_term(x) == S.NaN
|
||||
assert exp(x*log(tan(1/x))).as_leading_term(x) == S.NaN
|
||||
assert log(cos(1/x)).as_leading_term(x) == S.NaN
|
||||
assert log(tan(1/x)).as_leading_term(x) == S.NaN
|
||||
assert log(cos(1/x) + 2).as_leading_term(x) == AccumBounds(0, log(3))
|
||||
assert exp(x*log(cos(1/x) + 2)).as_leading_term(x) == 1
|
||||
assert log(cos(1/x) - 2).as_leading_term(x) == S.NaN
|
||||
assert exp(x*log(cos(1/x) - 2)).as_leading_term(x) == S.NaN
|
||||
assert log(cos(1/x) + 1).as_leading_term(x) == AccumBounds(-oo, log(2))
|
||||
assert exp(x*log(cos(1/x) + 1)).as_leading_term(x) == AccumBounds(0, 1)
|
||||
assert log(sin(1/x)**2).as_leading_term(x) == AccumBounds(-oo, 0)
|
||||
assert exp(x*log(sin(1/x)**2)).as_leading_term(x) == AccumBounds(0, 1)
|
||||
assert log(tan(1/x)**2).as_leading_term(x) == AccumBounds(-oo, oo)
|
||||
assert exp(2*x*(log(tan(1/x)**2))).as_leading_term(x) == AccumBounds(0, oo)
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,688 @@
|
|||
from sympy.calculus.accumulationbounds import AccumBounds
|
||||
from sympy.core.numbers import (E, Float, I, Rational, Integer, nan, oo, pi, zoo)
|
||||
from sympy.core.relational import (Eq, Ge, Gt, Le, Lt, Ne)
|
||||
from sympy.core.singleton import S
|
||||
from sympy.core.symbol import (Symbol, symbols)
|
||||
from sympy.functions.combinatorial.factorials import factorial
|
||||
from sympy.functions.elementary.exponential import (exp, log)
|
||||
from sympy.functions.elementary.integers import (ceiling, floor, frac)
|
||||
from sympy.functions.elementary.miscellaneous import sqrt
|
||||
from sympy.functions.elementary.trigonometric import sin, cos, tan, asin
|
||||
from sympy.polys.rootoftools import RootOf, CRootOf
|
||||
from sympy import Integers
|
||||
from sympy.sets.sets import Interval
|
||||
from sympy.sets.fancysets import ImageSet
|
||||
from sympy.core.function import Lambda
|
||||
|
||||
from sympy.core.expr import unchanged
|
||||
from sympy.testing.pytest import XFAIL, raises
|
||||
|
||||
x = Symbol('x')
|
||||
i = Symbol('i', imaginary=True)
|
||||
y = Symbol('y', real=True)
|
||||
k, n = symbols('k,n', integer=True)
|
||||
b = Symbol('b', real=True, noninteger=True)
|
||||
m = Symbol('m', positive=True)
|
||||
|
||||
|
||||
def test_floor():
|
||||
|
||||
assert floor(nan) is nan
|
||||
|
||||
assert floor(oo) is oo
|
||||
assert floor(-oo) is -oo
|
||||
assert floor(zoo) is zoo
|
||||
|
||||
assert floor(0) == 0
|
||||
|
||||
assert floor(1) == 1
|
||||
assert floor(-1) == -1
|
||||
|
||||
assert floor(I*log(asin(5)/abs(asin(5)))) == 0
|
||||
assert floor(-I*log(asin(7)/abs(asin(7)))) == -2
|
||||
|
||||
assert floor(E) == 2
|
||||
assert floor(-E) == -3
|
||||
|
||||
assert floor(2*E) == 5
|
||||
assert floor(-2*E) == -6
|
||||
|
||||
assert floor(pi) == 3
|
||||
assert floor(-pi) == -4
|
||||
|
||||
assert floor(S.Half) == 0
|
||||
assert floor(Rational(-1, 2)) == -1
|
||||
|
||||
assert floor(Rational(7, 3)) == 2
|
||||
assert floor(Rational(-7, 3)) == -3
|
||||
assert floor(-Rational(7, 3)) == -3
|
||||
|
||||
assert floor(Float(17.0)) == 17
|
||||
assert floor(-Float(17.0)) == -17
|
||||
|
||||
assert floor(Float(7.69)) == 7
|
||||
assert floor(-Float(7.69)) == -8
|
||||
|
||||
assert floor(1/(m+1)) == S.Zero
|
||||
assert floor((m+2)/(m+1)) == S.One
|
||||
assert floor(-1/(m+1)) == S.NegativeOne
|
||||
assert floor((m+2)/(-m-1)) == Integer(-2)
|
||||
|
||||
assert floor(I) == I
|
||||
assert floor(-I) == -I
|
||||
e = floor(i)
|
||||
assert e.func is floor and e.args[0] == i
|
||||
|
||||
assert floor(oo*I) == oo*I
|
||||
assert floor(-oo*I) == -oo*I
|
||||
assert floor(exp(I*pi/4)*oo) == exp(I*pi/4)*oo
|
||||
|
||||
assert floor(2*I) == 2*I
|
||||
assert floor(-2*I) == -2*I
|
||||
|
||||
assert floor(I/2) == 0
|
||||
assert floor(-I/2) == -I
|
||||
|
||||
assert floor(E + 17) == 19
|
||||
assert floor(pi + 2) == 5
|
||||
|
||||
assert floor(E + pi) == 5
|
||||
assert floor(I + pi) == 3 + I
|
||||
|
||||
assert floor(floor(pi)) == 3
|
||||
assert floor(floor(y)) == floor(y)
|
||||
assert floor(floor(x)) == floor(x)
|
||||
|
||||
assert unchanged(floor, x)
|
||||
assert unchanged(floor, 2*x)
|
||||
assert unchanged(floor, k*x)
|
||||
|
||||
assert floor(k) == k
|
||||
assert floor(2*k) == 2*k
|
||||
assert floor(k*n) == k*n
|
||||
|
||||
assert unchanged(floor, k/2)
|
||||
|
||||
assert unchanged(floor, x + y)
|
||||
|
||||
assert floor(x + 3) == floor(x) + 3
|
||||
assert floor(x + k) == floor(x) + k
|
||||
|
||||
assert floor(y + 3) == floor(y) + 3
|
||||
assert floor(y + k) == floor(y) + k
|
||||
|
||||
assert floor(3 + I*y + pi) == 6 + floor(y)*I
|
||||
|
||||
assert floor(k + n) == k + n
|
||||
|
||||
assert unchanged(floor, x*I)
|
||||
assert floor(k*I) == k*I
|
||||
|
||||
assert floor(Rational(23, 10) - E*I) == 2 - 3*I
|
||||
|
||||
assert floor(sin(1)) == 0
|
||||
assert floor(sin(-1)) == -1
|
||||
|
||||
assert floor(exp(2)) == 7
|
||||
|
||||
assert floor(log(8)/log(2)) != 2
|
||||
assert int(floor(log(8)/log(2)).evalf(chop=True)) == 3
|
||||
|
||||
assert floor(factorial(50)/exp(1)) == \
|
||||
11188719610782480504630258070757734324011354208865721592720336800
|
||||
|
||||
assert (floor(y) < y).is_Relational
|
||||
assert (floor(y) <= y) == True
|
||||
assert (floor(y) > y) == False
|
||||
assert (floor(y) >= y).is_Relational
|
||||
assert (floor(x) <= x).is_Relational # x could be non-real
|
||||
assert (floor(x) > x).is_Relational
|
||||
assert (floor(x) <= y).is_Relational # arg is not same as rhs
|
||||
assert (floor(x) > y).is_Relational
|
||||
assert (floor(y) <= oo) == True
|
||||
assert (floor(y) < oo) == True
|
||||
assert (floor(y) >= -oo) == True
|
||||
assert (floor(y) > -oo) == True
|
||||
assert (floor(b) < b) == True
|
||||
assert (floor(b) <= b) == True
|
||||
assert (floor(b) > b) == False
|
||||
assert (floor(b) >= b) == False
|
||||
|
||||
assert floor(y).rewrite(frac) == y - frac(y)
|
||||
assert floor(y).rewrite(ceiling) == -ceiling(-y)
|
||||
assert floor(y).rewrite(frac).subs(y, -pi) == floor(-pi)
|
||||
assert floor(y).rewrite(frac).subs(y, E) == floor(E)
|
||||
assert floor(y).rewrite(ceiling).subs(y, E) == -ceiling(-E)
|
||||
assert floor(y).rewrite(ceiling).subs(y, -pi) == -ceiling(pi)
|
||||
|
||||
assert Eq(floor(y), y - frac(y))
|
||||
assert Eq(floor(y), -ceiling(-y))
|
||||
|
||||
neg = Symbol('neg', negative=True)
|
||||
nn = Symbol('nn', nonnegative=True)
|
||||
pos = Symbol('pos', positive=True)
|
||||
np = Symbol('np', nonpositive=True)
|
||||
|
||||
assert (floor(neg) < 0) == True
|
||||
assert (floor(neg) <= 0) == True
|
||||
assert (floor(neg) > 0) == False
|
||||
assert (floor(neg) >= 0) == False
|
||||
assert (floor(neg) <= -1) == True
|
||||
assert (floor(neg) >= -3) == (neg >= -3)
|
||||
assert (floor(neg) < 5) == (neg < 5)
|
||||
|
||||
assert (floor(nn) < 0) == False
|
||||
assert (floor(nn) >= 0) == True
|
||||
|
||||
assert (floor(pos) < 0) == False
|
||||
assert (floor(pos) <= 0) == (pos < 1)
|
||||
assert (floor(pos) > 0) == (pos >= 1)
|
||||
assert (floor(pos) >= 0) == True
|
||||
assert (floor(pos) >= 3) == (pos >= 3)
|
||||
|
||||
assert (floor(np) <= 0) == True
|
||||
assert (floor(np) > 0) == False
|
||||
|
||||
assert floor(neg).is_negative == True
|
||||
assert floor(neg).is_nonnegative == False
|
||||
assert floor(nn).is_negative == False
|
||||
assert floor(nn).is_nonnegative == True
|
||||
assert floor(pos).is_negative == False
|
||||
assert floor(pos).is_nonnegative == True
|
||||
assert floor(np).is_negative is None
|
||||
assert floor(np).is_nonnegative is None
|
||||
|
||||
assert (floor(7, evaluate=False) >= 7) == True
|
||||
assert (floor(7, evaluate=False) > 7) == False
|
||||
assert (floor(7, evaluate=False) <= 7) == True
|
||||
assert (floor(7, evaluate=False) < 7) == False
|
||||
|
||||
assert (floor(7, evaluate=False) >= 6) == True
|
||||
assert (floor(7, evaluate=False) > 6) == True
|
||||
assert (floor(7, evaluate=False) <= 6) == False
|
||||
assert (floor(7, evaluate=False) < 6) == False
|
||||
|
||||
assert (floor(7, evaluate=False) >= 8) == False
|
||||
assert (floor(7, evaluate=False) > 8) == False
|
||||
assert (floor(7, evaluate=False) <= 8) == True
|
||||
assert (floor(7, evaluate=False) < 8) == True
|
||||
|
||||
assert (floor(x) <= 5.5) == Le(floor(x), 5.5, evaluate=False)
|
||||
assert (floor(x) >= -3.2) == Ge(floor(x), -3.2, evaluate=False)
|
||||
assert (floor(x) < 2.9) == Lt(floor(x), 2.9, evaluate=False)
|
||||
assert (floor(x) > -1.7) == Gt(floor(x), -1.7, evaluate=False)
|
||||
|
||||
assert (floor(y) <= 5.5) == (y < 6)
|
||||
assert (floor(y) >= -3.2) == (y >= -3)
|
||||
assert (floor(y) < 2.9) == (y < 3)
|
||||
assert (floor(y) > -1.7) == (y >= -1)
|
||||
|
||||
assert (floor(y) <= n) == (y < n + 1)
|
||||
assert (floor(y) >= n) == (y >= n)
|
||||
assert (floor(y) < n) == (y < n)
|
||||
assert (floor(y) > n) == (y >= n + 1)
|
||||
|
||||
assert floor(RootOf(x**3 - 27*x, 2)) == 5
|
||||
|
||||
|
||||
def test_ceiling():
|
||||
|
||||
assert ceiling(nan) is nan
|
||||
|
||||
assert ceiling(oo) is oo
|
||||
assert ceiling(-oo) is -oo
|
||||
assert ceiling(zoo) is zoo
|
||||
|
||||
assert ceiling(0) == 0
|
||||
|
||||
assert ceiling(1) == 1
|
||||
assert ceiling(-1) == -1
|
||||
|
||||
assert ceiling(I*log(asin(5)/abs(asin(5)))) == 1
|
||||
assert ceiling(-I*log(asin(7)/abs(asin(7)))) == -1
|
||||
|
||||
assert ceiling(E) == 3
|
||||
assert ceiling(-E) == -2
|
||||
|
||||
assert ceiling(2*E) == 6
|
||||
assert ceiling(-2*E) == -5
|
||||
|
||||
assert ceiling(pi) == 4
|
||||
assert ceiling(-pi) == -3
|
||||
|
||||
assert ceiling(S.Half) == 1
|
||||
assert ceiling(Rational(-1, 2)) == 0
|
||||
|
||||
assert ceiling(Rational(7, 3)) == 3
|
||||
assert ceiling(-Rational(7, 3)) == -2
|
||||
|
||||
assert ceiling(Float(17.0)) == 17
|
||||
assert ceiling(-Float(17.0)) == -17
|
||||
|
||||
assert ceiling(Float(7.69)) == 8
|
||||
assert ceiling(-Float(7.69)) == -7
|
||||
|
||||
assert ceiling(1/(m+1)) == S.One
|
||||
assert ceiling((m+2)/(m+1)) == Integer(2)
|
||||
assert ceiling(-1/(m+1)) == S.Zero
|
||||
assert ceiling((m+2)/(-m-1)) == S.NegativeOne
|
||||
|
||||
assert ceiling(I) == I
|
||||
assert ceiling(-I) == -I
|
||||
e = ceiling(i)
|
||||
assert e.func is ceiling and e.args[0] == i
|
||||
|
||||
assert ceiling(oo*I) == oo*I
|
||||
assert ceiling(-oo*I) == -oo*I
|
||||
assert ceiling(exp(I*pi/4)*oo) == exp(I*pi/4)*oo
|
||||
|
||||
assert ceiling(2*I) == 2*I
|
||||
assert ceiling(-2*I) == -2*I
|
||||
|
||||
assert ceiling(I/2) == I
|
||||
assert ceiling(-I/2) == 0
|
||||
|
||||
assert ceiling(E + 17) == 20
|
||||
assert ceiling(pi + 2) == 6
|
||||
|
||||
assert ceiling(E + pi) == 6
|
||||
assert ceiling(I + pi) == I + 4
|
||||
|
||||
assert ceiling(ceiling(pi)) == 4
|
||||
assert ceiling(ceiling(y)) == ceiling(y)
|
||||
assert ceiling(ceiling(x)) == ceiling(x)
|
||||
|
||||
assert unchanged(ceiling, x)
|
||||
assert unchanged(ceiling, 2*x)
|
||||
assert unchanged(ceiling, k*x)
|
||||
|
||||
assert ceiling(k) == k
|
||||
assert ceiling(2*k) == 2*k
|
||||
assert ceiling(k*n) == k*n
|
||||
|
||||
assert unchanged(ceiling, k/2)
|
||||
|
||||
assert unchanged(ceiling, x + y)
|
||||
|
||||
assert ceiling(x + 3) == ceiling(x) + 3
|
||||
assert ceiling(x + 3.0) == ceiling(x) + 3
|
||||
assert ceiling(x + 3.0*I) == ceiling(x) + 3*I
|
||||
assert ceiling(x + k) == ceiling(x) + k
|
||||
|
||||
assert ceiling(y + 3) == ceiling(y) + 3
|
||||
assert ceiling(y + k) == ceiling(y) + k
|
||||
|
||||
assert ceiling(3 + pi + y*I) == 7 + ceiling(y)*I
|
||||
|
||||
assert ceiling(k + n) == k + n
|
||||
|
||||
assert unchanged(ceiling, x*I)
|
||||
assert ceiling(k*I) == k*I
|
||||
|
||||
assert ceiling(Rational(23, 10) - E*I) == 3 - 2*I
|
||||
|
||||
assert ceiling(sin(1)) == 1
|
||||
assert ceiling(sin(-1)) == 0
|
||||
|
||||
assert ceiling(exp(2)) == 8
|
||||
|
||||
assert ceiling(-log(8)/log(2)) != -2
|
||||
assert int(ceiling(-log(8)/log(2)).evalf(chop=True)) == -3
|
||||
|
||||
assert ceiling(factorial(50)/exp(1)) == \
|
||||
11188719610782480504630258070757734324011354208865721592720336801
|
||||
|
||||
assert (ceiling(y) >= y) == True
|
||||
assert (ceiling(y) > y).is_Relational
|
||||
assert (ceiling(y) < y) == False
|
||||
assert (ceiling(y) <= y).is_Relational
|
||||
assert (ceiling(x) >= x).is_Relational # x could be non-real
|
||||
assert (ceiling(x) < x).is_Relational
|
||||
assert (ceiling(x) >= y).is_Relational # arg is not same as rhs
|
||||
assert (ceiling(x) < y).is_Relational
|
||||
assert (ceiling(y) >= -oo) == True
|
||||
assert (ceiling(y) > -oo) == True
|
||||
assert (ceiling(y) <= oo) == True
|
||||
assert (ceiling(y) < oo) == True
|
||||
assert (ceiling(b) < b) == False
|
||||
assert (ceiling(b) <= b) == False
|
||||
assert (ceiling(b) > b) == True
|
||||
assert (ceiling(b) >= b) == True
|
||||
|
||||
assert ceiling(y).rewrite(floor) == -floor(-y)
|
||||
assert ceiling(y).rewrite(frac) == y + frac(-y)
|
||||
assert ceiling(y).rewrite(floor).subs(y, -pi) == -floor(pi)
|
||||
assert ceiling(y).rewrite(floor).subs(y, E) == -floor(-E)
|
||||
assert ceiling(y).rewrite(frac).subs(y, pi) == ceiling(pi)
|
||||
assert ceiling(y).rewrite(frac).subs(y, -E) == ceiling(-E)
|
||||
|
||||
assert Eq(ceiling(y), y + frac(-y))
|
||||
assert Eq(ceiling(y), -floor(-y))
|
||||
|
||||
neg = Symbol('neg', negative=True)
|
||||
nn = Symbol('nn', nonnegative=True)
|
||||
pos = Symbol('pos', positive=True)
|
||||
np = Symbol('np', nonpositive=True)
|
||||
|
||||
assert (ceiling(neg) <= 0) == True
|
||||
assert (ceiling(neg) < 0) == (neg <= -1)
|
||||
assert (ceiling(neg) > 0) == False
|
||||
assert (ceiling(neg) >= 0) == (neg > -1)
|
||||
assert (ceiling(neg) > -3) == (neg > -3)
|
||||
assert (ceiling(neg) <= 10) == (neg <= 10)
|
||||
|
||||
assert (ceiling(nn) < 0) == False
|
||||
assert (ceiling(nn) >= 0) == True
|
||||
|
||||
assert (ceiling(pos) < 0) == False
|
||||
assert (ceiling(pos) <= 0) == False
|
||||
assert (ceiling(pos) > 0) == True
|
||||
assert (ceiling(pos) >= 0) == True
|
||||
assert (ceiling(pos) >= 1) == True
|
||||
assert (ceiling(pos) > 5) == (pos > 5)
|
||||
|
||||
assert (ceiling(np) <= 0) == True
|
||||
assert (ceiling(np) > 0) == False
|
||||
|
||||
assert ceiling(neg).is_positive == False
|
||||
assert ceiling(neg).is_nonpositive == True
|
||||
assert ceiling(nn).is_positive is None
|
||||
assert ceiling(nn).is_nonpositive is None
|
||||
assert ceiling(pos).is_positive == True
|
||||
assert ceiling(pos).is_nonpositive == False
|
||||
assert ceiling(np).is_positive == False
|
||||
assert ceiling(np).is_nonpositive == True
|
||||
|
||||
assert (ceiling(7, evaluate=False) >= 7) == True
|
||||
assert (ceiling(7, evaluate=False) > 7) == False
|
||||
assert (ceiling(7, evaluate=False) <= 7) == True
|
||||
assert (ceiling(7, evaluate=False) < 7) == False
|
||||
|
||||
assert (ceiling(7, evaluate=False) >= 6) == True
|
||||
assert (ceiling(7, evaluate=False) > 6) == True
|
||||
assert (ceiling(7, evaluate=False) <= 6) == False
|
||||
assert (ceiling(7, evaluate=False) < 6) == False
|
||||
|
||||
assert (ceiling(7, evaluate=False) >= 8) == False
|
||||
assert (ceiling(7, evaluate=False) > 8) == False
|
||||
assert (ceiling(7, evaluate=False) <= 8) == True
|
||||
assert (ceiling(7, evaluate=False) < 8) == True
|
||||
|
||||
assert (ceiling(x) <= 5.5) == Le(ceiling(x), 5.5, evaluate=False)
|
||||
assert (ceiling(x) >= -3.2) == Ge(ceiling(x), -3.2, evaluate=False)
|
||||
assert (ceiling(x) < 2.9) == Lt(ceiling(x), 2.9, evaluate=False)
|
||||
assert (ceiling(x) > -1.7) == Gt(ceiling(x), -1.7, evaluate=False)
|
||||
|
||||
assert (ceiling(y) <= 5.5) == (y <= 5)
|
||||
assert (ceiling(y) >= -3.2) == (y > -4)
|
||||
assert (ceiling(y) < 2.9) == (y <= 2)
|
||||
assert (ceiling(y) > -1.7) == (y > -2)
|
||||
|
||||
assert (ceiling(y) <= n) == (y <= n)
|
||||
assert (ceiling(y) >= n) == (y > n - 1)
|
||||
assert (ceiling(y) < n) == (y <= n - 1)
|
||||
assert (ceiling(y) > n) == (y > n)
|
||||
|
||||
assert ceiling(RootOf(x**3 - 27*x, 2)) == 6
|
||||
s = ImageSet(Lambda(n, n + (CRootOf(x**5 - x**2 + 1, 0))), Integers)
|
||||
f = CRootOf(x**5 - x**2 + 1, 0)
|
||||
s = ImageSet(Lambda(n, n + f), Integers)
|
||||
assert s.intersect(Interval(-10, 10)) == {i + f for i in range(-9, 11)}
|
||||
|
||||
|
||||
def test_frac():
|
||||
assert isinstance(frac(x), frac)
|
||||
assert frac(oo) == AccumBounds(0, 1)
|
||||
assert frac(-oo) == AccumBounds(0, 1)
|
||||
assert frac(zoo) is nan
|
||||
|
||||
assert frac(n) == 0
|
||||
assert frac(nan) is nan
|
||||
assert frac(Rational(4, 3)) == Rational(1, 3)
|
||||
assert frac(-Rational(4, 3)) == Rational(2, 3)
|
||||
assert frac(Rational(-4, 3)) == Rational(2, 3)
|
||||
|
||||
r = Symbol('r', real=True)
|
||||
assert frac(I*r) == I*frac(r)
|
||||
assert frac(1 + I*r) == I*frac(r)
|
||||
assert frac(0.5 + I*r) == 0.5 + I*frac(r)
|
||||
assert frac(n + I*r) == I*frac(r)
|
||||
assert frac(n + I*k) == 0
|
||||
assert unchanged(frac, x + I*x)
|
||||
assert frac(x + I*n) == frac(x)
|
||||
|
||||
assert frac(x).rewrite(floor) == x - floor(x)
|
||||
assert frac(x).rewrite(ceiling) == x + ceiling(-x)
|
||||
assert frac(y).rewrite(floor).subs(y, pi) == frac(pi)
|
||||
assert frac(y).rewrite(floor).subs(y, -E) == frac(-E)
|
||||
assert frac(y).rewrite(ceiling).subs(y, -pi) == frac(-pi)
|
||||
assert frac(y).rewrite(ceiling).subs(y, E) == frac(E)
|
||||
|
||||
assert Eq(frac(y), y - floor(y))
|
||||
assert Eq(frac(y), y + ceiling(-y))
|
||||
|
||||
r = Symbol('r', real=True)
|
||||
p_i = Symbol('p_i', integer=True, positive=True)
|
||||
n_i = Symbol('p_i', integer=True, negative=True)
|
||||
np_i = Symbol('np_i', integer=True, nonpositive=True)
|
||||
nn_i = Symbol('nn_i', integer=True, nonnegative=True)
|
||||
p_r = Symbol('p_r', positive=True)
|
||||
n_r = Symbol('n_r', negative=True)
|
||||
np_r = Symbol('np_r', real=True, nonpositive=True)
|
||||
nn_r = Symbol('nn_r', real=True, nonnegative=True)
|
||||
|
||||
# Real frac argument, integer rhs
|
||||
assert frac(r) <= p_i
|
||||
assert not frac(r) <= n_i
|
||||
assert (frac(r) <= np_i).has(Le)
|
||||
assert (frac(r) <= nn_i).has(Le)
|
||||
assert frac(r) < p_i
|
||||
assert not frac(r) < n_i
|
||||
assert not frac(r) < np_i
|
||||
assert (frac(r) < nn_i).has(Lt)
|
||||
assert not frac(r) >= p_i
|
||||
assert frac(r) >= n_i
|
||||
assert frac(r) >= np_i
|
||||
assert (frac(r) >= nn_i).has(Ge)
|
||||
assert not frac(r) > p_i
|
||||
assert frac(r) > n_i
|
||||
assert (frac(r) > np_i).has(Gt)
|
||||
assert (frac(r) > nn_i).has(Gt)
|
||||
|
||||
assert not Eq(frac(r), p_i)
|
||||
assert not Eq(frac(r), n_i)
|
||||
assert Eq(frac(r), np_i).has(Eq)
|
||||
assert Eq(frac(r), nn_i).has(Eq)
|
||||
|
||||
assert Ne(frac(r), p_i)
|
||||
assert Ne(frac(r), n_i)
|
||||
assert Ne(frac(r), np_i).has(Ne)
|
||||
assert Ne(frac(r), nn_i).has(Ne)
|
||||
|
||||
|
||||
# Real frac argument, real rhs
|
||||
assert (frac(r) <= p_r).has(Le)
|
||||
assert not frac(r) <= n_r
|
||||
assert (frac(r) <= np_r).has(Le)
|
||||
assert (frac(r) <= nn_r).has(Le)
|
||||
assert (frac(r) < p_r).has(Lt)
|
||||
assert not frac(r) < n_r
|
||||
assert not frac(r) < np_r
|
||||
assert (frac(r) < nn_r).has(Lt)
|
||||
assert (frac(r) >= p_r).has(Ge)
|
||||
assert frac(r) >= n_r
|
||||
assert frac(r) >= np_r
|
||||
assert (frac(r) >= nn_r).has(Ge)
|
||||
assert (frac(r) > p_r).has(Gt)
|
||||
assert frac(r) > n_r
|
||||
assert (frac(r) > np_r).has(Gt)
|
||||
assert (frac(r) > nn_r).has(Gt)
|
||||
|
||||
assert not Eq(frac(r), n_r)
|
||||
assert Eq(frac(r), p_r).has(Eq)
|
||||
assert Eq(frac(r), np_r).has(Eq)
|
||||
assert Eq(frac(r), nn_r).has(Eq)
|
||||
|
||||
assert Ne(frac(r), p_r).has(Ne)
|
||||
assert Ne(frac(r), n_r)
|
||||
assert Ne(frac(r), np_r).has(Ne)
|
||||
assert Ne(frac(r), nn_r).has(Ne)
|
||||
|
||||
# Real frac argument, +/- oo rhs
|
||||
assert frac(r) < oo
|
||||
assert frac(r) <= oo
|
||||
assert not frac(r) > oo
|
||||
assert not frac(r) >= oo
|
||||
|
||||
assert not frac(r) < -oo
|
||||
assert not frac(r) <= -oo
|
||||
assert frac(r) > -oo
|
||||
assert frac(r) >= -oo
|
||||
|
||||
assert frac(r) < 1
|
||||
assert frac(r) <= 1
|
||||
assert not frac(r) > 1
|
||||
assert not frac(r) >= 1
|
||||
|
||||
assert not frac(r) < 0
|
||||
assert (frac(r) <= 0).has(Le)
|
||||
assert (frac(r) > 0).has(Gt)
|
||||
assert frac(r) >= 0
|
||||
|
||||
# Some test for numbers
|
||||
assert frac(r) <= sqrt(2)
|
||||
assert (frac(r) <= sqrt(3) - sqrt(2)).has(Le)
|
||||
assert not frac(r) <= sqrt(2) - sqrt(3)
|
||||
assert not frac(r) >= sqrt(2)
|
||||
assert (frac(r) >= sqrt(3) - sqrt(2)).has(Ge)
|
||||
assert frac(r) >= sqrt(2) - sqrt(3)
|
||||
|
||||
assert not Eq(frac(r), sqrt(2))
|
||||
assert Eq(frac(r), sqrt(3) - sqrt(2)).has(Eq)
|
||||
assert not Eq(frac(r), sqrt(2) - sqrt(3))
|
||||
assert Ne(frac(r), sqrt(2))
|
||||
assert Ne(frac(r), sqrt(3) - sqrt(2)).has(Ne)
|
||||
assert Ne(frac(r), sqrt(2) - sqrt(3))
|
||||
|
||||
assert frac(p_i, evaluate=False).is_zero
|
||||
assert frac(p_i, evaluate=False).is_finite
|
||||
assert frac(p_i, evaluate=False).is_integer
|
||||
assert frac(p_i, evaluate=False).is_real
|
||||
assert frac(r).is_finite
|
||||
assert frac(r).is_real
|
||||
assert frac(r).is_zero is None
|
||||
assert frac(r).is_integer is None
|
||||
|
||||
assert frac(oo).is_finite
|
||||
assert frac(oo).is_real
|
||||
|
||||
|
||||
def test_series():
|
||||
x, y = symbols('x,y')
|
||||
assert floor(x).nseries(x, y, 100) == floor(y)
|
||||
assert ceiling(x).nseries(x, y, 100) == ceiling(y)
|
||||
assert floor(x).nseries(x, pi, 100) == 3
|
||||
assert ceiling(x).nseries(x, pi, 100) == 4
|
||||
assert floor(x).nseries(x, 0, 100) == 0
|
||||
assert ceiling(x).nseries(x, 0, 100) == 1
|
||||
assert floor(-x).nseries(x, 0, 100) == -1
|
||||
assert ceiling(-x).nseries(x, 0, 100) == 0
|
||||
|
||||
|
||||
def test_issue_14355():
|
||||
# This test checks the leading term and series for the floor and ceil
|
||||
# function when arg0 evaluates to S.NaN.
|
||||
assert floor((x**3 + x)/(x**2 - x)).as_leading_term(x, cdir = 1) == -2
|
||||
assert floor((x**3 + x)/(x**2 - x)).as_leading_term(x, cdir = -1) == -1
|
||||
assert floor((cos(x) - 1)/x).as_leading_term(x, cdir = 1) == -1
|
||||
assert floor((cos(x) - 1)/x).as_leading_term(x, cdir = -1) == 0
|
||||
assert floor(sin(x)/x).as_leading_term(x, cdir = 1) == 0
|
||||
assert floor(sin(x)/x).as_leading_term(x, cdir = -1) == 0
|
||||
assert floor(-tan(x)/x).as_leading_term(x, cdir = 1) == -2
|
||||
assert floor(-tan(x)/x).as_leading_term(x, cdir = -1) == -2
|
||||
assert floor(sin(x)/x/3).as_leading_term(x, cdir = 1) == 0
|
||||
assert floor(sin(x)/x/3).as_leading_term(x, cdir = -1) == 0
|
||||
assert ceiling((x**3 + x)/(x**2 - x)).as_leading_term(x, cdir = 1) == -1
|
||||
assert ceiling((x**3 + x)/(x**2 - x)).as_leading_term(x, cdir = -1) == 0
|
||||
assert ceiling((cos(x) - 1)/x).as_leading_term(x, cdir = 1) == 0
|
||||
assert ceiling((cos(x) - 1)/x).as_leading_term(x, cdir = -1) == 1
|
||||
assert ceiling(sin(x)/x).as_leading_term(x, cdir = 1) == 1
|
||||
assert ceiling(sin(x)/x).as_leading_term(x, cdir = -1) == 1
|
||||
assert ceiling(-tan(x)/x).as_leading_term(x, cdir = 1) == -1
|
||||
assert ceiling(-tan(x)/x).as_leading_term(x, cdir = 1) == -1
|
||||
assert ceiling(sin(x)/x/3).as_leading_term(x, cdir = 1) == 1
|
||||
assert ceiling(sin(x)/x/3).as_leading_term(x, cdir = -1) == 1
|
||||
# test for series
|
||||
assert floor(sin(x)/x).series(x, 0, 100, cdir = 1) == 0
|
||||
assert floor(sin(x)/x).series(x, 0, 100, cdir = 1) == 0
|
||||
assert floor((x**3 + x)/(x**2 - x)).series(x, 0, 100, cdir = 1) == -2
|
||||
assert floor((x**3 + x)/(x**2 - x)).series(x, 0, 100, cdir = -1) == -1
|
||||
assert ceiling(sin(x)/x).series(x, 0, 100, cdir = 1) == 1
|
||||
assert ceiling(sin(x)/x).series(x, 0, 100, cdir = -1) == 1
|
||||
assert ceiling((x**3 + x)/(x**2 - x)).series(x, 0, 100, cdir = 1) == -1
|
||||
assert ceiling((x**3 + x)/(x**2 - x)).series(x, 0, 100, cdir = -1) == 0
|
||||
|
||||
|
||||
def test_frac_leading_term():
|
||||
assert frac(x).as_leading_term(x) == x
|
||||
assert frac(x).as_leading_term(x, cdir = 1) == x
|
||||
assert frac(x).as_leading_term(x, cdir = -1) == 1
|
||||
assert frac(x + S.Half).as_leading_term(x, cdir = 1) == S.Half
|
||||
assert frac(x + S.Half).as_leading_term(x, cdir = -1) == S.Half
|
||||
assert frac(-2*x + 1).as_leading_term(x, cdir = 1) == S.One
|
||||
assert frac(-2*x + 1).as_leading_term(x, cdir = -1) == -2*x
|
||||
assert frac(sin(x) + 5).as_leading_term(x, cdir = 1) == x
|
||||
assert frac(sin(x) + 5).as_leading_term(x, cdir = -1) == S.One
|
||||
assert frac(sin(x**2) + 5).as_leading_term(x, cdir = 1) == x**2
|
||||
assert frac(sin(x**2) + 5).as_leading_term(x, cdir = -1) == x**2
|
||||
|
||||
|
||||
@XFAIL
|
||||
def test_issue_4149():
|
||||
assert floor(3 + pi*I + y*I) == 3 + floor(pi + y)*I
|
||||
assert floor(3*I + pi*I + y*I) == floor(3 + pi + y)*I
|
||||
assert floor(3 + E + pi*I + y*I) == 5 + floor(pi + y)*I
|
||||
|
||||
|
||||
def test_issue_21651():
|
||||
k = Symbol('k', positive=True, integer=True)
|
||||
exp = 2*2**(-k)
|
||||
assert isinstance(floor(exp), floor)
|
||||
|
||||
|
||||
def test_issue_11207():
|
||||
assert floor(floor(x)) == floor(x)
|
||||
assert floor(ceiling(x)) == ceiling(x)
|
||||
assert ceiling(floor(x)) == floor(x)
|
||||
assert ceiling(ceiling(x)) == ceiling(x)
|
||||
|
||||
|
||||
def test_nested_floor_ceiling():
|
||||
assert floor(-floor(ceiling(x**3)/y)) == -floor(ceiling(x**3)/y)
|
||||
assert ceiling(-floor(ceiling(x**3)/y)) == -floor(ceiling(x**3)/y)
|
||||
assert floor(ceiling(-floor(x**Rational(7, 2)/y))) == -floor(x**Rational(7, 2)/y)
|
||||
assert -ceiling(-ceiling(floor(x)/y)) == ceiling(floor(x)/y)
|
||||
|
||||
def test_issue_18689():
|
||||
assert floor(floor(floor(x)) + 3) == floor(x) + 3
|
||||
assert ceiling(ceiling(ceiling(x)) + 1) == ceiling(x) + 1
|
||||
assert ceiling(ceiling(floor(x)) + 3) == floor(x) + 3
|
||||
|
||||
def test_issue_18421():
|
||||
assert floor(float(0)) is S.Zero
|
||||
assert ceiling(float(0)) is S.Zero
|
||||
|
||||
def test_issue_25230():
|
||||
a = Symbol('a', real = True)
|
||||
b = Symbol('b', positive = True)
|
||||
c = Symbol('c', negative = True)
|
||||
raises(NotImplementedError, lambda: floor(x/a).as_leading_term(x, cdir = 1))
|
||||
raises(NotImplementedError, lambda: ceiling(x/a).as_leading_term(x, cdir = 1))
|
||||
assert floor(x/b).as_leading_term(x, cdir = 1) == 0
|
||||
assert floor(x/b).as_leading_term(x, cdir = -1) == -1
|
||||
assert floor(x/c).as_leading_term(x, cdir = 1) == -1
|
||||
assert floor(x/c).as_leading_term(x, cdir = -1) == 0
|
||||
assert ceiling(x/b).as_leading_term(x, cdir = 1) == 1
|
||||
assert ceiling(x/b).as_leading_term(x, cdir = -1) == 0
|
||||
assert ceiling(x/c).as_leading_term(x, cdir = 1) == 0
|
||||
assert ceiling(x/c).as_leading_term(x, cdir = -1) == 1
|
||||
|
|
@ -0,0 +1,82 @@
|
|||
# This test file tests the SymPy function interface, that people use to create
|
||||
# their own new functions. It should be as easy as possible.
|
||||
#
|
||||
# We test that it works with both Function and DefinedFunction. New code should
|
||||
# use DefinedFunction because it has better type inference. Old code still
|
||||
# using Function should continue to work though.
|
||||
from sympy.core.function import Function, DefinedFunction
|
||||
from sympy.core.sympify import sympify
|
||||
from sympy.functions.elementary.hyperbolic import tanh
|
||||
from sympy.functions.elementary.trigonometric import (cos, sin)
|
||||
from sympy.series.limits import limit
|
||||
from sympy.abc import x
|
||||
|
||||
|
||||
def test_function_series1():
|
||||
"""Create our new "sin" function."""
|
||||
|
||||
for F in [Function, DefinedFunction]:
|
||||
|
||||
class my_function(F):
|
||||
|
||||
def fdiff(self, argindex=1):
|
||||
return cos(self.args[0])
|
||||
|
||||
@classmethod
|
||||
def eval(cls, arg):
|
||||
arg = sympify(arg)
|
||||
if arg == 0:
|
||||
return sympify(0)
|
||||
|
||||
#Test that the taylor series is correct
|
||||
assert my_function(x).series(x, 0, 10) == sin(x).series(x, 0, 10)
|
||||
assert limit(my_function(x)/x, x, 0) == 1
|
||||
|
||||
|
||||
def test_function_series2():
|
||||
"""Create our new "cos" function."""
|
||||
|
||||
for F in [Function, DefinedFunction]:
|
||||
|
||||
class my_function2(F):
|
||||
|
||||
def fdiff(self, argindex=1):
|
||||
return -sin(self.args[0])
|
||||
|
||||
@classmethod
|
||||
def eval(cls, arg):
|
||||
arg = sympify(arg)
|
||||
if arg == 0:
|
||||
return sympify(1)
|
||||
|
||||
#Test that the taylor series is correct
|
||||
assert my_function2(x).series(x, 0, 10) == cos(x).series(x, 0, 10)
|
||||
|
||||
|
||||
def test_function_series3():
|
||||
"""
|
||||
Test our easy "tanh" function.
|
||||
|
||||
This test tests two things:
|
||||
* that the Function interface works as expected and it's easy to use
|
||||
* that the general algorithm for the series expansion works even when the
|
||||
derivative is defined recursively in terms of the original function,
|
||||
since tanh(x).diff(x) == 1-tanh(x)**2
|
||||
"""
|
||||
|
||||
for F in [Function, DefinedFunction]:
|
||||
|
||||
class mytanh(F):
|
||||
|
||||
def fdiff(self, argindex=1):
|
||||
return 1 - mytanh(self.args[0])**2
|
||||
|
||||
@classmethod
|
||||
def eval(cls, arg):
|
||||
arg = sympify(arg)
|
||||
if arg == 0:
|
||||
return sympify(0)
|
||||
|
||||
e = tanh(x)
|
||||
f = mytanh(x)
|
||||
assert e.series(x, 0, 6) == f.series(x, 0, 6)
|
||||
|
|
@ -0,0 +1,504 @@
|
|||
import itertools as it
|
||||
|
||||
from sympy.core.expr import unchanged
|
||||
from sympy.core.function import Function
|
||||
from sympy.core.numbers import I, oo, Rational
|
||||
from sympy.core.power import Pow
|
||||
from sympy.core.singleton import S
|
||||
from sympy.core.symbol import Symbol
|
||||
from sympy.external import import_module
|
||||
from sympy.functions.elementary.exponential import log
|
||||
from sympy.functions.elementary.integers import floor, ceiling
|
||||
from sympy.functions.elementary.miscellaneous import (sqrt, cbrt, root, Min,
|
||||
Max, real_root, Rem)
|
||||
from sympy.functions.elementary.trigonometric import cos, sin
|
||||
from sympy.functions.special.delta_functions import Heaviside
|
||||
|
||||
from sympy.utilities.lambdify import lambdify
|
||||
from sympy.testing.pytest import raises, skip, ignore_warnings
|
||||
|
||||
def test_Min():
|
||||
from sympy.abc import x, y, z
|
||||
n = Symbol('n', negative=True)
|
||||
n_ = Symbol('n_', negative=True)
|
||||
nn = Symbol('nn', nonnegative=True)
|
||||
nn_ = Symbol('nn_', nonnegative=True)
|
||||
p = Symbol('p', positive=True)
|
||||
p_ = Symbol('p_', positive=True)
|
||||
np = Symbol('np', nonpositive=True)
|
||||
np_ = Symbol('np_', nonpositive=True)
|
||||
r = Symbol('r', real=True)
|
||||
|
||||
assert Min(5, 4) == 4
|
||||
assert Min(-oo, -oo) is -oo
|
||||
assert Min(-oo, n) is -oo
|
||||
assert Min(n, -oo) is -oo
|
||||
assert Min(-oo, np) is -oo
|
||||
assert Min(np, -oo) is -oo
|
||||
assert Min(-oo, 0) is -oo
|
||||
assert Min(0, -oo) is -oo
|
||||
assert Min(-oo, nn) is -oo
|
||||
assert Min(nn, -oo) is -oo
|
||||
assert Min(-oo, p) is -oo
|
||||
assert Min(p, -oo) is -oo
|
||||
assert Min(-oo, oo) is -oo
|
||||
assert Min(oo, -oo) is -oo
|
||||
assert Min(n, n) == n
|
||||
assert unchanged(Min, n, np)
|
||||
assert Min(np, n) == Min(n, np)
|
||||
assert Min(n, 0) == n
|
||||
assert Min(0, n) == n
|
||||
assert Min(n, nn) == n
|
||||
assert Min(nn, n) == n
|
||||
assert Min(n, p) == n
|
||||
assert Min(p, n) == n
|
||||
assert Min(n, oo) == n
|
||||
assert Min(oo, n) == n
|
||||
assert Min(np, np) == np
|
||||
assert Min(np, 0) == np
|
||||
assert Min(0, np) == np
|
||||
assert Min(np, nn) == np
|
||||
assert Min(nn, np) == np
|
||||
assert Min(np, p) == np
|
||||
assert Min(p, np) == np
|
||||
assert Min(np, oo) == np
|
||||
assert Min(oo, np) == np
|
||||
assert Min(0, 0) == 0
|
||||
assert Min(0, nn) == 0
|
||||
assert Min(nn, 0) == 0
|
||||
assert Min(0, p) == 0
|
||||
assert Min(p, 0) == 0
|
||||
assert Min(0, oo) == 0
|
||||
assert Min(oo, 0) == 0
|
||||
assert Min(nn, nn) == nn
|
||||
assert unchanged(Min, nn, p)
|
||||
assert Min(p, nn) == Min(nn, p)
|
||||
assert Min(nn, oo) == nn
|
||||
assert Min(oo, nn) == nn
|
||||
assert Min(p, p) == p
|
||||
assert Min(p, oo) == p
|
||||
assert Min(oo, p) == p
|
||||
assert Min(oo, oo) is oo
|
||||
|
||||
assert Min(n, n_).func is Min
|
||||
assert Min(nn, nn_).func is Min
|
||||
assert Min(np, np_).func is Min
|
||||
assert Min(p, p_).func is Min
|
||||
|
||||
# lists
|
||||
assert Min() is S.Infinity
|
||||
assert Min(x) == x
|
||||
assert Min(x, y) == Min(y, x)
|
||||
assert Min(x, y, z) == Min(z, y, x)
|
||||
assert Min(x, Min(y, z)) == Min(z, y, x)
|
||||
assert Min(x, Max(y, -oo)) == Min(x, y)
|
||||
assert Min(p, oo, n, p, p, p_) == n
|
||||
assert Min(p_, n_, p) == n_
|
||||
assert Min(n, oo, -7, p, p, 2) == Min(n, -7)
|
||||
assert Min(2, x, p, n, oo, n_, p, 2, -2, -2) == Min(-2, x, n, n_)
|
||||
assert Min(0, x, 1, y) == Min(0, x, y)
|
||||
assert Min(1000, 100, -100, x, p, n) == Min(n, x, -100)
|
||||
assert unchanged(Min, sin(x), cos(x))
|
||||
assert Min(sin(x), cos(x)) == Min(cos(x), sin(x))
|
||||
assert Min(cos(x), sin(x)).subs(x, 1) == cos(1)
|
||||
assert Min(cos(x), sin(x)).subs(x, S.Half) == sin(S.Half)
|
||||
raises(ValueError, lambda: Min(cos(x), sin(x)).subs(x, I))
|
||||
raises(ValueError, lambda: Min(I))
|
||||
raises(ValueError, lambda: Min(I, x))
|
||||
raises(ValueError, lambda: Min(S.ComplexInfinity, x))
|
||||
|
||||
assert Min(1, x).diff(x) == Heaviside(1 - x)
|
||||
assert Min(x, 1).diff(x) == Heaviside(1 - x)
|
||||
assert Min(0, -x, 1 - 2*x).diff(x) == -Heaviside(x + Min(0, -2*x + 1)) \
|
||||
- 2*Heaviside(2*x + Min(0, -x) - 1)
|
||||
|
||||
# issue 7619
|
||||
f = Function('f')
|
||||
assert Min(1, 2*Min(f(1), 2)) # doesn't fail
|
||||
|
||||
# issue 7233
|
||||
e = Min(0, x)
|
||||
assert e.n().args == (0, x)
|
||||
|
||||
# issue 8643
|
||||
m = Min(n, p_, n_, r)
|
||||
assert m.is_positive is False
|
||||
assert m.is_nonnegative is False
|
||||
assert m.is_negative is True
|
||||
|
||||
m = Min(p, p_)
|
||||
assert m.is_positive is True
|
||||
assert m.is_nonnegative is True
|
||||
assert m.is_negative is False
|
||||
|
||||
m = Min(p, nn_, p_)
|
||||
assert m.is_positive is None
|
||||
assert m.is_nonnegative is True
|
||||
assert m.is_negative is False
|
||||
|
||||
m = Min(nn, p, r)
|
||||
assert m.is_positive is None
|
||||
assert m.is_nonnegative is None
|
||||
assert m.is_negative is None
|
||||
|
||||
|
||||
def test_Max():
|
||||
from sympy.abc import x, y, z
|
||||
n = Symbol('n', negative=True)
|
||||
n_ = Symbol('n_', negative=True)
|
||||
nn = Symbol('nn', nonnegative=True)
|
||||
p = Symbol('p', positive=True)
|
||||
p_ = Symbol('p_', positive=True)
|
||||
r = Symbol('r', real=True)
|
||||
|
||||
assert Max(5, 4) == 5
|
||||
|
||||
# lists
|
||||
|
||||
assert Max() is S.NegativeInfinity
|
||||
assert Max(x) == x
|
||||
assert Max(x, y) == Max(y, x)
|
||||
assert Max(x, y, z) == Max(z, y, x)
|
||||
assert Max(x, Max(y, z)) == Max(z, y, x)
|
||||
assert Max(x, Min(y, oo)) == Max(x, y)
|
||||
assert Max(n, -oo, n_, p, 2) == Max(p, 2)
|
||||
assert Max(n, -oo, n_, p) == p
|
||||
assert Max(2, x, p, n, -oo, S.NegativeInfinity, n_, p, 2) == Max(2, x, p)
|
||||
assert Max(0, x, 1, y) == Max(1, x, y)
|
||||
assert Max(r, r + 1, r - 1) == 1 + r
|
||||
assert Max(1000, 100, -100, x, p, n) == Max(p, x, 1000)
|
||||
assert Max(cos(x), sin(x)) == Max(sin(x), cos(x))
|
||||
assert Max(cos(x), sin(x)).subs(x, 1) == sin(1)
|
||||
assert Max(cos(x), sin(x)).subs(x, S.Half) == cos(S.Half)
|
||||
raises(ValueError, lambda: Max(cos(x), sin(x)).subs(x, I))
|
||||
raises(ValueError, lambda: Max(I))
|
||||
raises(ValueError, lambda: Max(I, x))
|
||||
raises(ValueError, lambda: Max(S.ComplexInfinity, 1))
|
||||
assert Max(n, -oo, n_, p, 2) == Max(p, 2)
|
||||
assert Max(n, -oo, n_, p, 1000) == Max(p, 1000)
|
||||
|
||||
assert Max(1, x).diff(x) == Heaviside(x - 1)
|
||||
assert Max(x, 1).diff(x) == Heaviside(x - 1)
|
||||
assert Max(x**2, 1 + x, 1).diff(x) == \
|
||||
2*x*Heaviside(x**2 - Max(1, x + 1)) \
|
||||
+ Heaviside(x - Max(1, x**2) + 1)
|
||||
|
||||
e = Max(0, x)
|
||||
assert e.n().args == (0, x)
|
||||
|
||||
# issue 8643
|
||||
m = Max(p, p_, n, r)
|
||||
assert m.is_positive is True
|
||||
assert m.is_nonnegative is True
|
||||
assert m.is_negative is False
|
||||
|
||||
m = Max(n, n_)
|
||||
assert m.is_positive is False
|
||||
assert m.is_nonnegative is False
|
||||
assert m.is_negative is True
|
||||
|
||||
m = Max(n, n_, r)
|
||||
assert m.is_positive is None
|
||||
assert m.is_nonnegative is None
|
||||
assert m.is_negative is None
|
||||
|
||||
m = Max(n, nn, r)
|
||||
assert m.is_positive is None
|
||||
assert m.is_nonnegative is True
|
||||
assert m.is_negative is False
|
||||
|
||||
|
||||
def test_minmax_assumptions():
|
||||
r = Symbol('r', real=True)
|
||||
a = Symbol('a', real=True, algebraic=True)
|
||||
t = Symbol('t', real=True, transcendental=True)
|
||||
q = Symbol('q', rational=True)
|
||||
p = Symbol('p', irrational=True)
|
||||
n = Symbol('n', rational=True, integer=False)
|
||||
i = Symbol('i', integer=True)
|
||||
o = Symbol('o', odd=True)
|
||||
e = Symbol('e', even=True)
|
||||
k = Symbol('k', prime=True)
|
||||
reals = [r, a, t, q, p, n, i, o, e, k]
|
||||
|
||||
for ext in (Max, Min):
|
||||
for x, y in it.product(reals, repeat=2):
|
||||
|
||||
# Must be real
|
||||
assert ext(x, y).is_real
|
||||
|
||||
# Algebraic?
|
||||
if x.is_algebraic and y.is_algebraic:
|
||||
assert ext(x, y).is_algebraic
|
||||
elif x.is_transcendental and y.is_transcendental:
|
||||
assert ext(x, y).is_transcendental
|
||||
else:
|
||||
assert ext(x, y).is_algebraic is None
|
||||
|
||||
# Rational?
|
||||
if x.is_rational and y.is_rational:
|
||||
assert ext(x, y).is_rational
|
||||
elif x.is_irrational and y.is_irrational:
|
||||
assert ext(x, y).is_irrational
|
||||
else:
|
||||
assert ext(x, y).is_rational is None
|
||||
|
||||
# Integer?
|
||||
if x.is_integer and y.is_integer:
|
||||
assert ext(x, y).is_integer
|
||||
elif x.is_noninteger and y.is_noninteger:
|
||||
assert ext(x, y).is_noninteger
|
||||
else:
|
||||
assert ext(x, y).is_integer is None
|
||||
|
||||
# Odd?
|
||||
if x.is_odd and y.is_odd:
|
||||
assert ext(x, y).is_odd
|
||||
elif x.is_odd is False and y.is_odd is False:
|
||||
assert ext(x, y).is_odd is False
|
||||
else:
|
||||
assert ext(x, y).is_odd is None
|
||||
|
||||
# Even?
|
||||
if x.is_even and y.is_even:
|
||||
assert ext(x, y).is_even
|
||||
elif x.is_even is False and y.is_even is False:
|
||||
assert ext(x, y).is_even is False
|
||||
else:
|
||||
assert ext(x, y).is_even is None
|
||||
|
||||
# Prime?
|
||||
if x.is_prime and y.is_prime:
|
||||
assert ext(x, y).is_prime
|
||||
elif x.is_prime is False and y.is_prime is False:
|
||||
assert ext(x, y).is_prime is False
|
||||
else:
|
||||
assert ext(x, y).is_prime is None
|
||||
|
||||
|
||||
def test_issue_8413():
|
||||
x = Symbol('x', real=True)
|
||||
# we can't evaluate in general because non-reals are not
|
||||
# comparable: Min(floor(3.2 + I), 3.2 + I) -> ValueError
|
||||
assert Min(floor(x), x) == floor(x)
|
||||
assert Min(ceiling(x), x) == x
|
||||
assert Max(floor(x), x) == x
|
||||
assert Max(ceiling(x), x) == ceiling(x)
|
||||
|
||||
|
||||
def test_root():
|
||||
from sympy.abc import x
|
||||
n = Symbol('n', integer=True)
|
||||
k = Symbol('k', integer=True)
|
||||
|
||||
assert root(2, 2) == sqrt(2)
|
||||
assert root(2, 1) == 2
|
||||
assert root(2, 3) == 2**Rational(1, 3)
|
||||
assert root(2, 3) == cbrt(2)
|
||||
assert root(2, -5) == 2**Rational(4, 5)/2
|
||||
|
||||
assert root(-2, 1) == -2
|
||||
|
||||
assert root(-2, 2) == sqrt(2)*I
|
||||
assert root(-2, 1) == -2
|
||||
|
||||
assert root(x, 2) == sqrt(x)
|
||||
assert root(x, 1) == x
|
||||
assert root(x, 3) == x**Rational(1, 3)
|
||||
assert root(x, 3) == cbrt(x)
|
||||
assert root(x, -5) == x**Rational(-1, 5)
|
||||
|
||||
assert root(x, n) == x**(1/n)
|
||||
assert root(x, -n) == x**(-1/n)
|
||||
|
||||
assert root(x, n, k) == (-1)**(2*k/n)*x**(1/n)
|
||||
|
||||
|
||||
def test_real_root():
|
||||
assert real_root(-8, 3) == -2
|
||||
assert real_root(-16, 4) == root(-16, 4)
|
||||
r = root(-7, 4)
|
||||
assert real_root(r) == r
|
||||
r1 = root(-1, 3)
|
||||
r2 = r1**2
|
||||
r3 = root(-1, 4)
|
||||
assert real_root(r1 + r2 + r3) == -1 + r2 + r3
|
||||
assert real_root(root(-2, 3)) == -root(2, 3)
|
||||
assert real_root(-8., 3) == -2.0
|
||||
x = Symbol('x')
|
||||
n = Symbol('n')
|
||||
g = real_root(x, n)
|
||||
assert g.subs({"x": -8, "n": 3}) == -2
|
||||
assert g.subs({"x": 8, "n": 3}) == 2
|
||||
# give principle root if there is no real root -- if this is not desired
|
||||
# then maybe a Root class is needed to raise an error instead
|
||||
assert g.subs({"x": I, "n": 3}) == cbrt(I)
|
||||
assert g.subs({"x": -8, "n": 2}) == sqrt(-8)
|
||||
assert g.subs({"x": I, "n": 2}) == sqrt(I)
|
||||
|
||||
|
||||
def test_issue_11463():
|
||||
numpy = import_module('numpy')
|
||||
if not numpy:
|
||||
skip("numpy not installed.")
|
||||
x = Symbol('x')
|
||||
f = lambdify(x, real_root((log(x/(x-2))), 3), 'numpy')
|
||||
# numpy.select evaluates all options before considering conditions,
|
||||
# so it raises a warning about root of negative number which does
|
||||
# not affect the outcome. This warning is suppressed here
|
||||
with ignore_warnings(RuntimeWarning):
|
||||
assert f(numpy.array(-1)) < -1
|
||||
|
||||
|
||||
def test_rewrite_MaxMin_as_Heaviside():
|
||||
from sympy.abc import x
|
||||
assert Max(0, x).rewrite(Heaviside) == x*Heaviside(x)
|
||||
assert Max(3, x).rewrite(Heaviside) == x*Heaviside(x - 3) + \
|
||||
3*Heaviside(-x + 3)
|
||||
assert Max(0, x+2, 2*x).rewrite(Heaviside) == \
|
||||
2*x*Heaviside(2*x)*Heaviside(x - 2) + \
|
||||
(x + 2)*Heaviside(-x + 2)*Heaviside(x + 2)
|
||||
|
||||
assert Min(0, x).rewrite(Heaviside) == x*Heaviside(-x)
|
||||
assert Min(3, x).rewrite(Heaviside) == x*Heaviside(-x + 3) + \
|
||||
3*Heaviside(x - 3)
|
||||
assert Min(x, -x, -2).rewrite(Heaviside) == \
|
||||
x*Heaviside(-2*x)*Heaviside(-x - 2) - \
|
||||
x*Heaviside(2*x)*Heaviside(x - 2) \
|
||||
- 2*Heaviside(-x + 2)*Heaviside(x + 2)
|
||||
|
||||
|
||||
def test_rewrite_MaxMin_as_Piecewise():
|
||||
from sympy.core.symbol import symbols
|
||||
from sympy.functions.elementary.piecewise import Piecewise
|
||||
x, y, z, a, b = symbols('x y z a b', real=True)
|
||||
vx, vy, va = symbols('vx vy va')
|
||||
assert Max(a, b).rewrite(Piecewise) == Piecewise((a, a >= b), (b, True))
|
||||
assert Max(x, y, z).rewrite(Piecewise) == Piecewise((x, (x >= y) & (x >= z)), (y, y >= z), (z, True))
|
||||
assert Max(x, y, a, b).rewrite(Piecewise) == Piecewise((a, (a >= b) & (a >= x) & (a >= y)),
|
||||
(b, (b >= x) & (b >= y)), (x, x >= y), (y, True))
|
||||
assert Min(a, b).rewrite(Piecewise) == Piecewise((a, a <= b), (b, True))
|
||||
assert Min(x, y, z).rewrite(Piecewise) == Piecewise((x, (x <= y) & (x <= z)), (y, y <= z), (z, True))
|
||||
assert Min(x, y, a, b).rewrite(Piecewise) == Piecewise((a, (a <= b) & (a <= x) & (a <= y)),
|
||||
(b, (b <= x) & (b <= y)), (x, x <= y), (y, True))
|
||||
|
||||
# Piecewise rewriting of Min/Max does also takes place for not explicitly real arguments
|
||||
assert Max(vx, vy).rewrite(Piecewise) == Piecewise((vx, vx >= vy), (vy, True))
|
||||
assert Min(va, vx, vy).rewrite(Piecewise) == Piecewise((va, (va <= vx) & (va <= vy)), (vx, vx <= vy), (vy, True))
|
||||
|
||||
|
||||
def test_issue_11099():
|
||||
from sympy.abc import x, y
|
||||
# some fixed value tests
|
||||
fixed_test_data = {x: -2, y: 3}
|
||||
assert Min(x, y).evalf(subs=fixed_test_data) == \
|
||||
Min(x, y).subs(fixed_test_data).evalf()
|
||||
assert Max(x, y).evalf(subs=fixed_test_data) == \
|
||||
Max(x, y).subs(fixed_test_data).evalf()
|
||||
# randomly generate some test data
|
||||
from sympy.core.random import randint
|
||||
for i in range(20):
|
||||
random_test_data = {x: randint(-100, 100), y: randint(-100, 100)}
|
||||
assert Min(x, y).evalf(subs=random_test_data) == \
|
||||
Min(x, y).subs(random_test_data).evalf()
|
||||
assert Max(x, y).evalf(subs=random_test_data) == \
|
||||
Max(x, y).subs(random_test_data).evalf()
|
||||
|
||||
|
||||
def test_issue_12638():
|
||||
from sympy.abc import a, b, c
|
||||
assert Min(a, b, c, Max(a, b)) == Min(a, b, c)
|
||||
assert Min(a, b, Max(a, b, c)) == Min(a, b)
|
||||
assert Min(a, b, Max(a, c)) == Min(a, b)
|
||||
|
||||
def test_issue_21399():
|
||||
from sympy.abc import a, b, c
|
||||
assert Max(Min(a, b), Min(a, b, c)) == Min(a, b)
|
||||
|
||||
|
||||
def test_instantiation_evaluation():
|
||||
from sympy.abc import v, w, x, y, z
|
||||
assert Min(1, Max(2, x)) == 1
|
||||
assert Max(3, Min(2, x)) == 3
|
||||
assert Min(Max(x, y), Max(x, z)) == Max(x, Min(y, z))
|
||||
assert set(Min(Max(w, x), Max(y, z)).args) == {
|
||||
Max(w, x), Max(y, z)}
|
||||
assert Min(Max(x, y), Max(x, z), w) == Min(
|
||||
w, Max(x, Min(y, z)))
|
||||
A, B = Min, Max
|
||||
for i in range(2):
|
||||
assert A(x, B(x, y)) == x
|
||||
assert A(x, B(y, A(x, w, z))) == A(x, B(y, A(w, z)))
|
||||
A, B = B, A
|
||||
assert Min(w, Max(x, y), Max(v, x, z)) == Min(
|
||||
w, Max(x, Min(y, Max(v, z))))
|
||||
|
||||
def test_rewrite_as_Abs():
|
||||
from itertools import permutations
|
||||
from sympy.functions.elementary.complexes import Abs
|
||||
from sympy.abc import x, y, z, w
|
||||
def test(e):
|
||||
free = e.free_symbols
|
||||
a = e.rewrite(Abs)
|
||||
assert not a.has(Min, Max)
|
||||
for i in permutations(range(len(free))):
|
||||
reps = dict(zip(free, i))
|
||||
assert a.xreplace(reps) == e.xreplace(reps)
|
||||
test(Min(x, y))
|
||||
test(Max(x, y))
|
||||
test(Min(x, y, z))
|
||||
test(Min(Max(w, x), Max(y, z)))
|
||||
|
||||
def test_issue_14000():
|
||||
assert isinstance(sqrt(4, evaluate=False), Pow) == True
|
||||
assert isinstance(cbrt(3.5, evaluate=False), Pow) == True
|
||||
assert isinstance(root(16, 4, evaluate=False), Pow) == True
|
||||
|
||||
assert sqrt(4, evaluate=False) == Pow(4, S.Half, evaluate=False)
|
||||
assert cbrt(3.5, evaluate=False) == Pow(3.5, Rational(1, 3), evaluate=False)
|
||||
assert root(4, 2, evaluate=False) == Pow(4, S.Half, evaluate=False)
|
||||
|
||||
assert root(16, 4, 2, evaluate=False).has(Pow) == True
|
||||
assert real_root(-8, 3, evaluate=False).has(Pow) == True
|
||||
|
||||
def test_issue_6899():
|
||||
from sympy.core.function import Lambda
|
||||
x = Symbol('x')
|
||||
eqn = Lambda(x, x)
|
||||
assert eqn.func(*eqn.args) == eqn
|
||||
|
||||
def test_Rem():
|
||||
from sympy.abc import x, y
|
||||
assert Rem(5, 3) == 2
|
||||
assert Rem(-5, 3) == -2
|
||||
assert Rem(5, -3) == 2
|
||||
assert Rem(-5, -3) == -2
|
||||
assert Rem(x**3, y) == Rem(x**3, y)
|
||||
assert Rem(Rem(-5, 3) + 3, 3) == 1
|
||||
|
||||
|
||||
def test_minmax_no_evaluate():
|
||||
from sympy import evaluate
|
||||
p = Symbol('p', positive=True)
|
||||
|
||||
assert Max(1, 3) == 3
|
||||
assert Max(1, 3).args == ()
|
||||
assert Max(0, p) == p
|
||||
assert Max(0, p).args == ()
|
||||
assert Min(0, p) == 0
|
||||
assert Min(0, p).args == ()
|
||||
|
||||
assert Max(1, 3, evaluate=False) != 3
|
||||
assert Max(1, 3, evaluate=False).args == (1, 3)
|
||||
assert Max(0, p, evaluate=False) != p
|
||||
assert Max(0, p, evaluate=False).args == (0, p)
|
||||
assert Min(0, p, evaluate=False) != 0
|
||||
assert Min(0, p, evaluate=False).args == (0, p)
|
||||
|
||||
with evaluate(False):
|
||||
assert Max(1, 3) != 3
|
||||
assert Max(1, 3).args == (1, 3)
|
||||
assert Max(0, p) != p
|
||||
assert Max(0, p).args == (0, p)
|
||||
assert Min(0, p) != 0
|
||||
assert Min(0, p).args == (0, p)
|
||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue