test_exponential.py 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810
  1. from sympy.assumptions.refine import refine
  2. from sympy.calculus.accumulationbounds import AccumBounds
  3. from sympy.concrete.products import Product
  4. from sympy.concrete.summations import Sum
  5. from sympy.core.function import expand_log
  6. from sympy.core.numbers import (E, Float, I, Rational, nan, oo, pi, zoo)
  7. from sympy.core.power import Pow
  8. from sympy.core.singleton import S
  9. from sympy.core.symbol import (Symbol, symbols)
  10. from sympy.functions.elementary.complexes import (adjoint, conjugate, re, sign, transpose)
  11. from sympy.functions.elementary.exponential import (LambertW, exp, exp_polar, log)
  12. from sympy.functions.elementary.hyperbolic import (cosh, sinh, tanh)
  13. from sympy.functions.elementary.miscellaneous import sqrt
  14. from sympy.functions.elementary.trigonometric import (cos, sin, tan)
  15. from sympy.matrices.expressions.matexpr import MatrixSymbol
  16. from sympy.polys.polytools import gcd
  17. from sympy.series.order import O
  18. from sympy.simplify.simplify import simplify
  19. from sympy.core.parameters import global_parameters
  20. from sympy.functions.elementary.exponential import match_real_imag
  21. from sympy.abc import x, y, z
  22. from sympy.core.expr import unchanged
  23. from sympy.core.function import ArgumentIndexError
  24. from sympy.testing.pytest import raises, XFAIL, _both_exp_pow
  25. @_both_exp_pow
  26. def test_exp_values():
  27. if global_parameters.exp_is_pow:
  28. assert type(exp(x)) is Pow
  29. else:
  30. assert type(exp(x)) is exp
  31. k = Symbol('k', integer=True)
  32. assert exp(nan) is nan
  33. assert exp(oo) is oo
  34. assert exp(-oo) == 0
  35. assert exp(0) == 1
  36. assert exp(1) == E
  37. assert exp(-1 + x).as_base_exp() == (S.Exp1, x - 1)
  38. assert exp(1 + x).as_base_exp() == (S.Exp1, x + 1)
  39. assert exp(pi*I/2) == I
  40. assert exp(pi*I) == -1
  41. assert exp(pi*I*Rational(3, 2)) == -I
  42. assert exp(2*pi*I) == 1
  43. assert refine(exp(pi*I*2*k)) == 1
  44. assert refine(exp(pi*I*2*(k + S.Half))) == -1
  45. assert refine(exp(pi*I*2*(k + Rational(1, 4)))) == I
  46. assert refine(exp(pi*I*2*(k + Rational(3, 4)))) == -I
  47. assert exp(log(x)) == x
  48. assert exp(2*log(x)) == x**2
  49. assert exp(pi*log(x)) == x**pi
  50. assert exp(17*log(x) + E*log(y)) == x**17 * y**E
  51. assert exp(x*log(x)) != x**x
  52. assert exp(sin(x)*log(x)) != x
  53. assert exp(3*log(x) + oo*x) == exp(oo*x) * x**3
  54. assert exp(4*log(x)*log(y) + 3*log(x)) == x**3 * exp(4*log(x)*log(y))
  55. assert exp(-oo, evaluate=False).is_finite is True
  56. assert exp(oo, evaluate=False).is_finite is False
  57. @_both_exp_pow
  58. def test_exp_period():
  59. assert exp(I*pi*Rational(9, 4)) == exp(I*pi/4)
  60. assert exp(I*pi*Rational(46, 18)) == exp(I*pi*Rational(5, 9))
  61. assert exp(I*pi*Rational(25, 7)) == exp(I*pi*Rational(-3, 7))
  62. assert exp(I*pi*Rational(-19, 3)) == exp(-I*pi/3)
  63. assert exp(I*pi*Rational(37, 8)) - exp(I*pi*Rational(-11, 8)) == 0
  64. assert exp(I*pi*Rational(-5, 3)) / exp(I*pi*Rational(11, 5)) * exp(I*pi*Rational(148, 15)) == 1
  65. assert exp(2 - I*pi*Rational(17, 5)) == exp(2 + I*pi*Rational(3, 5))
  66. assert exp(log(3) + I*pi*Rational(29, 9)) == 3 * exp(I*pi*Rational(-7, 9))
  67. n = Symbol('n', integer=True)
  68. e = Symbol('e', even=True)
  69. assert exp(e*I*pi) == 1
  70. assert exp((e + 1)*I*pi) == -1
  71. assert exp((1 + 4*n)*I*pi/2) == I
  72. assert exp((-1 + 4*n)*I*pi/2) == -I
  73. @_both_exp_pow
  74. def test_exp_log():
  75. x = Symbol("x", real=True)
  76. assert log(exp(x)) == x
  77. assert exp(log(x)) == x
  78. if not global_parameters.exp_is_pow:
  79. assert log(x).inverse() == exp
  80. assert exp(x).inverse() == log
  81. y = Symbol("y", polar=True)
  82. assert log(exp_polar(z)) == z
  83. assert exp(log(y)) == y
  84. @_both_exp_pow
  85. def test_exp_expand():
  86. e = exp(log(Rational(2))*(1 + x) - log(Rational(2))*x)
  87. assert e.expand() == 2
  88. assert exp(x + y) != exp(x)*exp(y)
  89. assert exp(x + y).expand() == exp(x)*exp(y)
  90. @_both_exp_pow
  91. def test_exp__as_base_exp():
  92. assert exp(x).as_base_exp() == (E, x)
  93. assert exp(2*x).as_base_exp() == (E, 2*x)
  94. assert exp(x*y).as_base_exp() == (E, x*y)
  95. assert exp(-x).as_base_exp() == (E, -x)
  96. # Pow( *expr.as_base_exp() ) == expr invariant should hold
  97. assert E**x == exp(x)
  98. assert E**(2*x) == exp(2*x)
  99. assert E**(x*y) == exp(x*y)
  100. assert exp(x).base is S.Exp1
  101. assert exp(x).exp == x
  102. @_both_exp_pow
  103. def test_exp_infinity():
  104. assert exp(I*y) != nan
  105. assert refine(exp(I*oo)) is nan
  106. assert refine(exp(-I*oo)) is nan
  107. assert exp(y*I*oo) != nan
  108. assert exp(zoo) is nan
  109. x = Symbol('x', extended_real=True, finite=False)
  110. assert exp(x).is_complex is None
  111. @_both_exp_pow
  112. def test_exp_subs():
  113. x = Symbol('x')
  114. e = (exp(3*log(x), evaluate=False)) # evaluates to x**3
  115. assert e.subs(x**3, y**3) == e
  116. assert e.subs(x**2, 5) == e
  117. assert (x**3).subs(x**2, y) != y**Rational(3, 2)
  118. assert exp(exp(x) + exp(x**2)).subs(exp(exp(x)), y) == y * exp(exp(x**2))
  119. assert exp(x).subs(E, y) == y**x
  120. x = symbols('x', real=True)
  121. assert exp(5*x).subs(exp(7*x), y) == y**Rational(5, 7)
  122. assert exp(2*x + 7).subs(exp(3*x), y) == y**Rational(2, 3) * exp(7)
  123. x = symbols('x', positive=True)
  124. assert exp(3*log(x)).subs(x**2, y) == y**Rational(3, 2)
  125. # differentiate between E and exp
  126. assert exp(exp(x + E)).subs(exp, 3) == 3**(3**(x + E))
  127. assert exp(exp(x + E)).subs(exp, sin) == sin(sin(x + E))
  128. assert exp(exp(x + E)).subs(E, 3) == 3**(3**(x + 3))
  129. assert exp(3).subs(E, sin) == sin(3)
  130. def test_exp_adjoint():
  131. x = Symbol('x', commutative=False)
  132. assert adjoint(exp(x)) == exp(adjoint(x))
  133. def test_exp_conjugate():
  134. assert conjugate(exp(x)) == exp(conjugate(x))
  135. @_both_exp_pow
  136. def test_exp_transpose():
  137. assert transpose(exp(x)) == exp(transpose(x))
  138. @_both_exp_pow
  139. def test_exp_rewrite():
  140. assert exp(x).rewrite(sin) == sinh(x) + cosh(x)
  141. assert exp(x*I).rewrite(cos) == cos(x) + I*sin(x)
  142. assert exp(1).rewrite(cos) == sinh(1) + cosh(1)
  143. assert exp(1).rewrite(sin) == sinh(1) + cosh(1)
  144. assert exp(1).rewrite(sin) == sinh(1) + cosh(1)
  145. assert exp(x).rewrite(tanh) == (1 + tanh(x/2))/(1 - tanh(x/2))
  146. assert exp(pi*I/4).rewrite(sqrt) == sqrt(2)/2 + sqrt(2)*I/2
  147. assert exp(pi*I/3).rewrite(sqrt) == S.Half + sqrt(3)*I/2
  148. if not global_parameters.exp_is_pow:
  149. assert exp(x*log(y)).rewrite(Pow) == y**x
  150. assert exp(log(x)*log(y)).rewrite(Pow) in [x**log(y), y**log(x)]
  151. assert exp(log(log(x))*y).rewrite(Pow) == log(x)**y
  152. n = Symbol('n', integer=True)
  153. assert Sum((exp(pi*I/2)/2)**n, (n, 0, oo)).rewrite(sqrt).doit() == Rational(4, 5) + I*2/5
  154. assert Sum((exp(pi*I/4)/2)**n, (n, 0, oo)).rewrite(sqrt).doit() == 1/(1 - sqrt(2)*(1 + I)/4)
  155. assert (Sum((exp(pi*I/3)/2)**n, (n, 0, oo)).rewrite(sqrt).doit().cancel()
  156. == 4*I/(sqrt(3) + 3*I))
  157. @_both_exp_pow
  158. def test_exp_leading_term():
  159. assert exp(x).as_leading_term(x) == 1
  160. assert exp(2 + x).as_leading_term(x) == exp(2)
  161. assert exp((2*x + 3) / (x+1)).as_leading_term(x) == exp(3)
  162. # The following tests are commented, since now SymPy returns the
  163. # original function when the leading term in the series expansion does
  164. # not exist.
  165. # raises(NotImplementedError, lambda: exp(1/x).as_leading_term(x))
  166. # raises(NotImplementedError, lambda: exp((x + 1) / x**2).as_leading_term(x))
  167. # raises(NotImplementedError, lambda: exp(x + 1/x).as_leading_term(x))
  168. @_both_exp_pow
  169. def test_exp_taylor_term():
  170. x = symbols('x')
  171. assert exp(x).taylor_term(1, x) == x
  172. assert exp(x).taylor_term(3, x) == x**3/6
  173. assert exp(x).taylor_term(4, x) == x**4/24
  174. assert exp(x).taylor_term(-1, x) is S.Zero
  175. def test_exp_MatrixSymbol():
  176. A = MatrixSymbol("A", 2, 2)
  177. assert exp(A).has(exp)
  178. def test_exp_fdiff():
  179. x = Symbol('x')
  180. raises(ArgumentIndexError, lambda: exp(x).fdiff(2))
  181. def test_log_values():
  182. assert log(nan) is nan
  183. assert log(oo) is oo
  184. assert log(-oo) is oo
  185. assert log(zoo) is zoo
  186. assert log(-zoo) is zoo
  187. assert log(0) is zoo
  188. assert log(1) == 0
  189. assert log(-1) == I*pi
  190. assert log(E) == 1
  191. assert log(-E).expand() == 1 + I*pi
  192. assert unchanged(log, pi)
  193. assert log(-pi).expand() == log(pi) + I*pi
  194. assert unchanged(log, 17)
  195. assert log(-17) == log(17) + I*pi
  196. assert log(I) == I*pi/2
  197. assert log(-I) == -I*pi/2
  198. assert log(17*I) == I*pi/2 + log(17)
  199. assert log(-17*I).expand() == -I*pi/2 + log(17)
  200. assert log(oo*I) is oo
  201. assert log(-oo*I) is oo
  202. assert log(0, 2) is zoo
  203. assert log(0, 5) is zoo
  204. assert exp(-log(3))**(-1) == 3
  205. assert log(S.Half) == -log(2)
  206. assert log(2*3).func is log
  207. assert log(2*3**2).func is log
  208. def test_match_real_imag():
  209. x, y = symbols('x,y', real=True)
  210. i = Symbol('i', imaginary=True)
  211. assert match_real_imag(S.One) == (1, 0)
  212. assert match_real_imag(I) == (0, 1)
  213. assert match_real_imag(3 - 5*I) == (3, -5)
  214. assert match_real_imag(-sqrt(3) + S.Half*I) == (-sqrt(3), S.Half)
  215. assert match_real_imag(x + y*I) == (x, y)
  216. assert match_real_imag(x*I + y*I) == (0, x + y)
  217. assert match_real_imag((x + y)*I) == (0, x + y)
  218. assert match_real_imag(Rational(-2, 3)*i*I) == (None, None)
  219. assert match_real_imag(1 - 2*i) == (None, None)
  220. assert match_real_imag(sqrt(2)*(3 - 5*I)) == (None, None)
  221. def test_log_exact():
  222. # check for pi/2, pi/3, pi/4, pi/6, pi/8, pi/12; pi/5, pi/10:
  223. for n in range(-23, 24):
  224. if gcd(n, 24) != 1:
  225. assert log(exp(n*I*pi/24).rewrite(sqrt)) == n*I*pi/24
  226. for n in range(-9, 10):
  227. assert log(exp(n*I*pi/10).rewrite(sqrt)) == n*I*pi/10
  228. assert log(S.Half - I*sqrt(3)/2) == -I*pi/3
  229. assert log(Rational(-1, 2) + I*sqrt(3)/2) == I*pi*Rational(2, 3)
  230. assert log(-sqrt(2)/2 - I*sqrt(2)/2) == -I*pi*Rational(3, 4)
  231. assert log(-sqrt(3)/2 - I*S.Half) == -I*pi*Rational(5, 6)
  232. assert log(Rational(-1, 4) + sqrt(5)/4 - I*sqrt(sqrt(5)/8 + Rational(5, 8))) == -I*pi*Rational(2, 5)
  233. assert log(sqrt(Rational(5, 8) - sqrt(5)/8) + I*(Rational(1, 4) + sqrt(5)/4)) == I*pi*Rational(3, 10)
  234. assert log(-sqrt(sqrt(2)/4 + S.Half) + I*sqrt(S.Half - sqrt(2)/4)) == I*pi*Rational(7, 8)
  235. assert log(-sqrt(6)/4 - sqrt(2)/4 + I*(-sqrt(6)/4 + sqrt(2)/4)) == -I*pi*Rational(11, 12)
  236. assert log(-1 + I*sqrt(3)) == log(2) + I*pi*Rational(2, 3)
  237. assert log(5 + 5*I) == log(5*sqrt(2)) + I*pi/4
  238. assert log(sqrt(-12)) == log(2*sqrt(3)) + I*pi/2
  239. assert log(-sqrt(6) + sqrt(2) - I*sqrt(6) - I*sqrt(2)) == log(4) - I*pi*Rational(7, 12)
  240. assert log(-sqrt(6-3*sqrt(2)) - I*sqrt(6+3*sqrt(2))) == log(2*sqrt(3)) - I*pi*Rational(5, 8)
  241. assert log(1 + I*sqrt(2-sqrt(2))/sqrt(2+sqrt(2))) == log(2/sqrt(sqrt(2) + 2)) + I*pi/8
  242. assert log(cos(pi*Rational(7, 12)) + I*sin(pi*Rational(7, 12))) == I*pi*Rational(7, 12)
  243. assert log(cos(pi*Rational(6, 5)) + I*sin(pi*Rational(6, 5))) == I*pi*Rational(-4, 5)
  244. assert log(5*(1 + I)/sqrt(2)) == log(5) + I*pi/4
  245. assert log(sqrt(2)*(-sqrt(3) + 1 - sqrt(3)*I - I)) == log(4) - I*pi*Rational(7, 12)
  246. assert log(-sqrt(2)*(1 - I*sqrt(3))) == log(2*sqrt(2)) + I*pi*Rational(2, 3)
  247. assert log(sqrt(3)*I*(-sqrt(6 - 3*sqrt(2)) - I*sqrt(3*sqrt(2) + 6))) == log(6) - I*pi/8
  248. zero = (1 + sqrt(2))**2 - 3 - 2*sqrt(2)
  249. assert log(zero - I*sqrt(3)) == log(sqrt(3)) - I*pi/2
  250. assert unchanged(log, zero + I*zero) or log(zero + zero*I) is zoo
  251. # bail quickly if no obvious simplification is possible:
  252. assert unchanged(log, (sqrt(2)-1/sqrt(sqrt(3)+I))**1000)
  253. # beware of non-real coefficients
  254. assert unchanged(log, sqrt(2-sqrt(5))*(1 + I))
  255. def test_log_base():
  256. assert log(1, 2) == 0
  257. assert log(2, 2) == 1
  258. assert log(3, 2) == log(3)/log(2)
  259. assert log(6, 2) == 1 + log(3)/log(2)
  260. assert log(6, 3) == 1 + log(2)/log(3)
  261. assert log(2**3, 2) == 3
  262. assert log(3**3, 3) == 3
  263. assert log(5, 1) is zoo
  264. assert log(1, 1) is nan
  265. assert log(Rational(2, 3), 10) == log(Rational(2, 3))/log(10)
  266. assert log(Rational(2, 3), Rational(1, 3)) == -log(2)/log(3) + 1
  267. assert log(Rational(2, 3), Rational(2, 5)) == \
  268. log(Rational(2, 3))/log(Rational(2, 5))
  269. # issue 17148
  270. assert log(Rational(8, 3), 2) == -log(3)/log(2) + 3
  271. def test_log_symbolic():
  272. assert log(x, exp(1)) == log(x)
  273. assert log(exp(x)) != x
  274. assert log(x, exp(1)) == log(x)
  275. assert log(x*y) != log(x) + log(y)
  276. assert log(x/y).expand() != log(x) - log(y)
  277. assert log(x/y).expand(force=True) == log(x) - log(y)
  278. assert log(x**y).expand() != y*log(x)
  279. assert log(x**y).expand(force=True) == y*log(x)
  280. assert log(x, 2) == log(x)/log(2)
  281. assert log(E, 2) == 1/log(2)
  282. p, q = symbols('p,q', positive=True)
  283. r = Symbol('r', real=True)
  284. assert log(p**2) != 2*log(p)
  285. assert log(p**2).expand() == 2*log(p)
  286. assert log(x**2).expand() != 2*log(x)
  287. assert log(p**q) != q*log(p)
  288. assert log(exp(p)) == p
  289. assert log(p*q) != log(p) + log(q)
  290. assert log(p*q).expand() == log(p) + log(q)
  291. assert log(-sqrt(3)) == log(sqrt(3)) + I*pi
  292. assert log(-exp(p)) != p + I*pi
  293. assert log(-exp(x)).expand() != x + I*pi
  294. assert log(-exp(r)).expand() == r + I*pi
  295. assert log(x**y) != y*log(x)
  296. assert (log(x**-5)**-1).expand() != -1/log(x)/5
  297. assert (log(p**-5)**-1).expand() == -1/log(p)/5
  298. assert log(-x).func is log and log(-x).args[0] == -x
  299. assert log(-p).func is log and log(-p).args[0] == -p
  300. def test_log_exp():
  301. assert log(exp(4*I*pi)) == 0 # exp evaluates
  302. assert log(exp(-5*I*pi)) == I*pi # exp evaluates
  303. assert log(exp(I*pi*Rational(19, 4))) == I*pi*Rational(3, 4)
  304. assert log(exp(I*pi*Rational(25, 7))) == I*pi*Rational(-3, 7)
  305. assert log(exp(-5*I)) == -5*I + 2*I*pi
  306. @_both_exp_pow
  307. def test_exp_assumptions():
  308. r = Symbol('r', real=True)
  309. i = Symbol('i', imaginary=True)
  310. for e in exp, exp_polar:
  311. assert e(x).is_real is None
  312. assert e(x).is_imaginary is None
  313. assert e(i).is_real is None
  314. assert e(i).is_imaginary is None
  315. assert e(r).is_real is True
  316. assert e(r).is_imaginary is False
  317. assert e(re(x)).is_extended_real is True
  318. assert e(re(x)).is_imaginary is False
  319. assert Pow(E, I*pi, evaluate=False).is_imaginary == False
  320. assert Pow(E, 2*I*pi, evaluate=False).is_imaginary == False
  321. assert Pow(E, I*pi/2, evaluate=False).is_imaginary == True
  322. assert Pow(E, I*pi/3, evaluate=False).is_imaginary is None
  323. assert exp(0, evaluate=False).is_algebraic
  324. a = Symbol('a', algebraic=True)
  325. an = Symbol('an', algebraic=True, nonzero=True)
  326. r = Symbol('r', rational=True)
  327. rn = Symbol('rn', rational=True, nonzero=True)
  328. assert exp(a).is_algebraic is None
  329. assert exp(an).is_algebraic is False
  330. assert exp(pi*r).is_algebraic is None
  331. assert exp(pi*rn).is_algebraic is False
  332. assert exp(0, evaluate=False).is_algebraic is True
  333. assert exp(I*pi/3, evaluate=False).is_algebraic is True
  334. assert exp(I*pi*r, evaluate=False).is_algebraic is True
  335. @_both_exp_pow
  336. def test_exp_AccumBounds():
  337. assert exp(AccumBounds(1, 2)) == AccumBounds(E, E**2)
  338. def test_log_assumptions():
  339. p = symbols('p', positive=True)
  340. n = symbols('n', negative=True)
  341. z = symbols('z', zero=True)
  342. x = symbols('x', infinite=True, extended_positive=True)
  343. assert log(z).is_positive is False
  344. assert log(x).is_extended_positive is True
  345. assert log(2) > 0
  346. assert log(1, evaluate=False).is_zero
  347. assert log(1 + z).is_zero
  348. assert log(p).is_zero is None
  349. assert log(n).is_zero is False
  350. assert log(0.5).is_negative is True
  351. assert log(exp(p) + 1).is_positive
  352. assert log(1, evaluate=False).is_algebraic
  353. assert log(42, evaluate=False).is_algebraic is False
  354. assert log(1 + z).is_rational
  355. def test_log_hashing():
  356. assert x != log(log(x))
  357. assert hash(x) != hash(log(log(x)))
  358. assert log(x) != log(log(log(x)))
  359. e = 1/log(log(x) + log(log(x)))
  360. assert e.base.func is log
  361. e = 1/log(log(x) + log(log(log(x))))
  362. assert e.base.func is log
  363. e = log(log(x))
  364. assert e.func is log
  365. assert x.func is not log
  366. assert hash(log(log(x))) != hash(x)
  367. assert e != x
  368. def test_log_sign():
  369. assert sign(log(2)) == 1
  370. def test_log_expand_complex():
  371. assert log(1 + I).expand(complex=True) == log(2)/2 + I*pi/4
  372. assert log(1 - sqrt(2)).expand(complex=True) == log(sqrt(2) - 1) + I*pi
  373. def test_log_apply_evalf():
  374. value = (log(3)/log(2) - 1).evalf()
  375. assert value.epsilon_eq(Float("0.58496250072115618145373"))
  376. def test_log_leading_term():
  377. p = Symbol('p')
  378. # Test for STEP 3
  379. assert log(1 + x + x**2).as_leading_term(x, cdir=1) == x
  380. # Test for STEP 4
  381. assert log(2*x).as_leading_term(x, cdir=1) == log(x) + log(2)
  382. assert log(2*x).as_leading_term(x, cdir=-1) == log(x) + log(2)
  383. assert log(-2*x).as_leading_term(x, cdir=1, logx=p) == p + log(2) + I*pi
  384. assert log(-2*x).as_leading_term(x, cdir=-1, logx=p) == p + log(2) - I*pi
  385. # Test for STEP 5
  386. assert log(-2*x + (3 - I)*x**2).as_leading_term(x, cdir=1) == log(x) + log(2) - I*pi
  387. assert log(-2*x + (3 - I)*x**2).as_leading_term(x, cdir=-1) == log(x) + log(2) - I*pi
  388. assert log(2*x + (3 - I)*x**2).as_leading_term(x, cdir=1) == log(x) + log(2)
  389. assert log(2*x + (3 - I)*x**2).as_leading_term(x, cdir=-1) == log(x) + log(2) - 2*I*pi
  390. assert log(-1 + x - I*x**2 + I*x**3).as_leading_term(x, cdir=1) == -I*pi
  391. assert log(-1 + x - I*x**2 + I*x**3).as_leading_term(x, cdir=-1) == -I*pi
  392. assert log(-1/(1 - x)).as_leading_term(x, cdir=1) == I*pi
  393. assert log(-1/(1 - x)).as_leading_term(x, cdir=-1) == I*pi
  394. def test_log_nseries():
  395. p = Symbol('p')
  396. assert log(1/x)._eval_nseries(x, 4, logx=-p, cdir=1) == p
  397. assert log(1/x)._eval_nseries(x, 4, logx=-p, cdir=-1) == p + 2*I*pi
  398. assert log(x - 1)._eval_nseries(x, 4, None, I) == I*pi - x - x**2/2 - x**3/3 + O(x**4)
  399. assert log(x - 1)._eval_nseries(x, 4, None, -I) == -I*pi - x - x**2/2 - x**3/3 + O(x**4)
  400. assert log(I*x + I*x**3 - 1)._eval_nseries(x, 3, None, 1) == I*pi - I*x + x**2/2 + O(x**3)
  401. assert log(I*x + I*x**3 - 1)._eval_nseries(x, 3, None, -1) == -I*pi - I*x + x**2/2 + O(x**3)
  402. assert log(I*x**2 + I*x**3 - 1)._eval_nseries(x, 3, None, 1) == I*pi - I*x**2 + O(x**3)
  403. assert log(I*x**2 + I*x**3 - 1)._eval_nseries(x, 3, None, -1) == I*pi - I*x**2 + O(x**3)
  404. assert log(2*x + (3 - I)*x**2)._eval_nseries(x, 3, None, 1) == log(2) + log(x) + \
  405. x*(S(3)/2 - I/2) + x**2*(-1 + 3*I/4) + O(x**3)
  406. assert log(2*x + (3 - I)*x**2)._eval_nseries(x, 3, None, -1) == -2*I*pi + log(2) + \
  407. log(x) - x*(-S(3)/2 + I/2) + x**2*(-1 + 3*I/4) + O(x**3)
  408. assert log(-2*x + (3 - I)*x**2)._eval_nseries(x, 3, None, 1) == -I*pi + log(2) + log(x) + \
  409. x*(-S(3)/2 + I/2) + x**2*(-1 + 3*I/4) + O(x**3)
  410. assert log(-2*x + (3 - I)*x**2)._eval_nseries(x, 3, None, -1) == -I*pi + log(2) + log(x) - \
  411. x*(S(3)/2 - I/2) + x**2*(-1 + 3*I/4) + O(x**3)
  412. assert log(sqrt(-I*x**2 - 3)*sqrt(-I*x**2 - 1) - 2)._eval_nseries(x, 3, None, 1) == -I*pi + \
  413. log(sqrt(3) + 2) + 2*sqrt(3)*I*x**2/(3*sqrt(3) + 6) + O(x**3)
  414. assert log(-1/(1 - x))._eval_nseries(x, 3, None, 1) == I*pi + x + x**2/2 + O(x**3)
  415. assert log(-1/(1 - x))._eval_nseries(x, 3, None, -1) == I*pi + x + x**2/2 + O(x**3)
  416. def test_log_series():
  417. # Note Series at infinities other than oo/-oo were introduced as a part of
  418. # pull request 23798. Refer https://github.com/sympy/sympy/pull/23798 for
  419. # more information.
  420. expr1 = log(1 + x)
  421. expr2 = log(x + sqrt(x**2 + 1))
  422. assert expr1.series(x, x0=I*oo, n=4) == 1/(3*x**3) - 1/(2*x**2) + 1/x + \
  423. I*pi/2 - log(I/x) + O(x**(-4), (x, oo*I))
  424. assert expr1.series(x, x0=-I*oo, n=4) == 1/(3*x**3) - 1/(2*x**2) + 1/x - \
  425. I*pi/2 - log(-I/x) + O(x**(-4), (x, -oo*I))
  426. assert expr2.series(x, x0=I*oo, n=4) == 1/(4*x**2) + I*pi/2 + log(2) - \
  427. log(I/x) + O(x**(-4), (x, oo*I))
  428. assert expr2.series(x, x0=-I*oo, n=4) == -1/(4*x**2) - I*pi/2 - log(2) + \
  429. log(-I/x) + O(x**(-4), (x, -oo*I))
  430. def test_log_expand():
  431. w = Symbol("w", positive=True)
  432. e = log(w**(log(5)/log(3)))
  433. assert e.expand() == log(5)/log(3) * log(w)
  434. x, y, z = symbols('x,y,z', positive=True)
  435. assert log(x*(y + z)).expand(mul=False) == log(x) + log(y + z)
  436. assert log(log(x**2)*log(y*z)).expand() in [log(2*log(x)*log(y) +
  437. 2*log(x)*log(z)), log(log(x)*log(z) + log(y)*log(x)) + log(2),
  438. log((log(y) + log(z))*log(x)) + log(2)]
  439. assert log(x**log(x**2)).expand(deep=False) == log(x)*log(x**2)
  440. assert log(x**log(x**2)).expand() == 2*log(x)**2
  441. x, y = symbols('x,y')
  442. assert log(x*y).expand(force=True) == log(x) + log(y)
  443. assert log(x**y).expand(force=True) == y*log(x)
  444. assert log(exp(x)).expand(force=True) == x
  445. # there's generally no need to expand out logs since this requires
  446. # factoring and if simplification is sought, it's cheaper to put
  447. # logs together than it is to take them apart.
  448. assert log(2*3**2).expand() != 2*log(3) + log(2)
  449. @XFAIL
  450. def test_log_expand_fail():
  451. x, y, z = symbols('x,y,z', positive=True)
  452. assert (log(x*(y + z))*(x + y)).expand(mul=True, log=True) == y*log(
  453. x) + y*log(y + z) + z*log(x) + z*log(y + z)
  454. def test_log_simplify():
  455. x = Symbol("x", positive=True)
  456. assert log(x**2).expand() == 2*log(x)
  457. assert expand_log(log(x**(2 + log(2)))) == (2 + log(2))*log(x)
  458. z = Symbol('z')
  459. assert log(sqrt(z)).expand() == log(z)/2
  460. assert expand_log(log(z**(log(2) - 1))) == (log(2) - 1)*log(z)
  461. assert log(z**(-1)).expand() != -log(z)
  462. assert log(z**(x/(x+1))).expand() == x*log(z)/(x + 1)
  463. def test_log_AccumBounds():
  464. assert log(AccumBounds(1, E)) == AccumBounds(0, 1)
  465. assert log(AccumBounds(0, E)) == AccumBounds(-oo, 1)
  466. assert log(AccumBounds(-1, E)) == S.NaN
  467. assert log(AccumBounds(0, oo)) == AccumBounds(-oo, oo)
  468. assert log(AccumBounds(-oo, 0)) == S.NaN
  469. assert log(AccumBounds(-oo, oo)) == S.NaN
  470. @_both_exp_pow
  471. def test_lambertw():
  472. k = Symbol('k')
  473. assert LambertW(x, 0) == LambertW(x)
  474. assert LambertW(x, 0, evaluate=False) != LambertW(x)
  475. assert LambertW(0) == 0
  476. assert LambertW(E) == 1
  477. assert LambertW(-1/E) == -1
  478. assert LambertW(-log(2)/2) == -log(2)
  479. assert LambertW(oo) is oo
  480. assert LambertW(0, 1) is -oo
  481. assert LambertW(0, 42) is -oo
  482. assert LambertW(-pi/2, -1) == -I*pi/2
  483. assert LambertW(-1/E, -1) == -1
  484. assert LambertW(-2*exp(-2), -1) == -2
  485. assert LambertW(2*log(2)) == log(2)
  486. assert LambertW(-pi/2) == I*pi/2
  487. assert LambertW(exp(1 + E)) == E
  488. assert LambertW(x**2).diff(x) == 2*LambertW(x**2)/x/(1 + LambertW(x**2))
  489. assert LambertW(x, k).diff(x) == LambertW(x, k)/x/(1 + LambertW(x, k))
  490. assert LambertW(sqrt(2)).evalf(30).epsilon_eq(
  491. Float("0.701338383413663009202120278965", 30), 1e-29)
  492. assert re(LambertW(2, -1)).evalf().epsilon_eq(Float("-0.834310366631110"))
  493. assert LambertW(-1).is_real is False # issue 5215
  494. assert LambertW(2, evaluate=False).is_real
  495. p = Symbol('p', positive=True)
  496. assert LambertW(p, evaluate=False).is_real
  497. assert LambertW(p - 1, evaluate=False).is_real is None
  498. assert LambertW(-p - 2/S.Exp1, evaluate=False).is_real is False
  499. assert LambertW(S.Half, -1, evaluate=False).is_real is False
  500. assert LambertW(Rational(-1, 10), -1, evaluate=False).is_real
  501. assert LambertW(-10, -1, evaluate=False).is_real is False
  502. assert LambertW(-2, 2, evaluate=False).is_real is False
  503. assert LambertW(0, evaluate=False).is_algebraic
  504. na = Symbol('na', nonzero=True, algebraic=True)
  505. assert LambertW(na).is_algebraic is False
  506. assert LambertW(p).is_zero is False
  507. n = Symbol('n', negative=True)
  508. assert LambertW(n).is_zero is False
  509. def test_issue_5673():
  510. e = LambertW(-1)
  511. assert e.is_comparable is False
  512. assert e.is_positive is not True
  513. e2 = 1 - 1/(1 - exp(-1000))
  514. assert e2.is_positive is not True
  515. e3 = -2 + exp(exp(LambertW(log(2)))*LambertW(log(2)))
  516. assert e3.is_nonzero is not True
  517. def test_log_fdiff():
  518. x = Symbol('x')
  519. raises(ArgumentIndexError, lambda: log(x).fdiff(2))
  520. def test_log_taylor_term():
  521. x = symbols('x')
  522. assert log(x).taylor_term(0, x) == x
  523. assert log(x).taylor_term(1, x) == -x**2/2
  524. assert log(x).taylor_term(4, x) == x**5/5
  525. assert log(x).taylor_term(-1, x) is S.Zero
  526. def test_exp_expand_NC():
  527. A, B, C = symbols('A,B,C', commutative=False)
  528. assert exp(A + B).expand() == exp(A + B)
  529. assert exp(A + B + C).expand() == exp(A + B + C)
  530. assert exp(x + y).expand() == exp(x)*exp(y)
  531. assert exp(x + y + z).expand() == exp(x)*exp(y)*exp(z)
  532. @_both_exp_pow
  533. def test_as_numer_denom():
  534. n = symbols('n', negative=True)
  535. assert exp(x).as_numer_denom() == (exp(x), 1)
  536. assert exp(-x).as_numer_denom() == (1, exp(x))
  537. assert exp(-2*x).as_numer_denom() == (1, exp(2*x))
  538. assert exp(-2).as_numer_denom() == (1, exp(2))
  539. assert exp(n).as_numer_denom() == (1, exp(-n))
  540. assert exp(-n).as_numer_denom() == (exp(-n), 1)
  541. assert exp(-I*x).as_numer_denom() == (1, exp(I*x))
  542. assert exp(-I*n).as_numer_denom() == (1, exp(I*n))
  543. assert exp(-n).as_numer_denom() == (exp(-n), 1)
  544. # Check noncommutativity
  545. a = symbols('a', commutative=False)
  546. assert exp(-a).as_numer_denom() == (exp(-a), 1)
  547. @_both_exp_pow
  548. def test_polar():
  549. x, y = symbols('x y', polar=True)
  550. assert abs(exp_polar(I*4)) == 1
  551. assert abs(exp_polar(0)) == 1
  552. assert abs(exp_polar(2 + 3*I)) == exp(2)
  553. assert exp_polar(I*10).n() == exp_polar(I*10)
  554. assert log(exp_polar(z)) == z
  555. assert log(x*y).expand() == log(x) + log(y)
  556. assert log(x**z).expand() == z*log(x)
  557. assert exp_polar(3).exp == 3
  558. # Compare exp(1.0*pi*I).
  559. assert (exp_polar(1.0*pi*I).n(n=5)).as_real_imag()[1] >= 0
  560. assert exp_polar(0).is_rational is True # issue 8008
  561. def test_exp_summation():
  562. w = symbols("w")
  563. m, n, i, j = symbols("m n i j")
  564. expr = exp(Sum(w*i, (i, 0, n), (j, 0, m)))
  565. assert expr.expand() == Product(exp(w*i), (i, 0, n), (j, 0, m))
  566. def test_log_product():
  567. from sympy.abc import n, m
  568. i, j = symbols('i,j', positive=True, integer=True)
  569. x, y = symbols('x,y', positive=True)
  570. z = symbols('z', real=True)
  571. w = symbols('w')
  572. expr = log(Product(x**i, (i, 1, n)))
  573. assert simplify(expr) == expr
  574. assert expr.expand() == Sum(i*log(x), (i, 1, n))
  575. expr = log(Product(x**i*y**j, (i, 1, n), (j, 1, m)))
  576. assert simplify(expr) == expr
  577. assert expr.expand() == Sum(i*log(x) + j*log(y), (i, 1, n), (j, 1, m))
  578. expr = log(Product(-2, (n, 0, 4)))
  579. assert simplify(expr) == expr
  580. assert expr.expand() == expr
  581. assert expr.expand(force=True) == Sum(log(-2), (n, 0, 4))
  582. expr = log(Product(exp(z*i), (i, 0, n)))
  583. assert expr.expand() == Sum(z*i, (i, 0, n))
  584. expr = log(Product(exp(w*i), (i, 0, n)))
  585. assert expr.expand() == expr
  586. assert expr.expand(force=True) == Sum(w*i, (i, 0, n))
  587. expr = log(Product(i**2*abs(j), (i, 1, n), (j, 1, m)))
  588. assert expr.expand() == Sum(2*log(i) + log(j), (i, 1, n), (j, 1, m))
  589. @XFAIL
  590. def test_log_product_simplify_to_sum():
  591. from sympy.abc import n, m
  592. i, j = symbols('i,j', positive=True, integer=True)
  593. x, y = symbols('x,y', positive=True)
  594. assert simplify(log(Product(x**i, (i, 1, n)))) == Sum(i*log(x), (i, 1, n))
  595. assert simplify(log(Product(x**i*y**j, (i, 1, n), (j, 1, m)))) == \
  596. Sum(i*log(x) + j*log(y), (i, 1, n), (j, 1, m))
  597. def test_issue_8866():
  598. assert simplify(log(x, 10, evaluate=False)) == simplify(log(x, 10))
  599. assert expand_log(log(x, 10, evaluate=False)) == expand_log(log(x, 10))
  600. y = Symbol('y', positive=True)
  601. l1 = log(exp(y), exp(10))
  602. b1 = log(exp(y), exp(5))
  603. l2 = log(exp(y), exp(10), evaluate=False)
  604. b2 = log(exp(y), exp(5), evaluate=False)
  605. assert simplify(log(l1, b1)) == simplify(log(l2, b2))
  606. assert expand_log(log(l1, b1)) == expand_log(log(l2, b2))
  607. def test_log_expand_factor():
  608. assert (log(18)/log(3) - 2).expand(factor=True) == log(2)/log(3)
  609. assert (log(12)/log(2)).expand(factor=True) == log(3)/log(2) + 2
  610. assert (log(15)/log(3)).expand(factor=True) == 1 + log(5)/log(3)
  611. assert (log(2)/(-log(12) + log(24))).expand(factor=True) == 1
  612. assert expand_log(log(12), factor=True) == log(3) + 2*log(2)
  613. assert expand_log(log(21)/log(7), factor=False) == log(3)/log(7) + 1
  614. assert expand_log(log(45)/log(5) + log(20), factor=False) == \
  615. 1 + 2*log(3)/log(5) + log(20)
  616. assert expand_log(log(45)/log(5) + log(26), factor=True) == \
  617. log(2) + log(13) + (log(5) + 2*log(3))/log(5)
  618. def test_issue_9116():
  619. n = Symbol('n', positive=True, integer=True)
  620. assert log(n).is_nonnegative is True
  621. def test_issue_18473():
  622. assert exp(x*log(cos(1/x))).as_leading_term(x) == S.NaN
  623. assert exp(x*log(tan(1/x))).as_leading_term(x) == S.NaN
  624. assert log(cos(1/x)).as_leading_term(x) == S.NaN
  625. assert log(tan(1/x)).as_leading_term(x) == S.NaN
  626. assert log(cos(1/x) + 2).as_leading_term(x) == AccumBounds(0, log(3))
  627. assert exp(x*log(cos(1/x) + 2)).as_leading_term(x) == 1
  628. assert log(cos(1/x) - 2).as_leading_term(x) == S.NaN
  629. assert exp(x*log(cos(1/x) - 2)).as_leading_term(x) == S.NaN
  630. assert log(cos(1/x) + 1).as_leading_term(x) == AccumBounds(-oo, log(2))
  631. assert exp(x*log(cos(1/x) + 1)).as_leading_term(x) == AccumBounds(0, 1)
  632. assert log(sin(1/x)**2).as_leading_term(x) == AccumBounds(-oo, 0)
  633. assert exp(x*log(sin(1/x)**2)).as_leading_term(x) == AccumBounds(0, 1)
  634. assert log(tan(1/x)**2).as_leading_term(x) == AccumBounds(-oo, oo)
  635. assert exp(2*x*(log(tan(1/x)**2))).as_leading_term(x) == AccumBounds(0, oo)