test_exponential.py 29 KB

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