test_order.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  1. from sympy.core.add import Add
  2. from sympy.core.function import (Function, expand)
  3. from sympy.core.numbers import (I, Rational, nan, oo, pi)
  4. from sympy.core.singleton import S
  5. from sympy.core.symbol import (Symbol, symbols)
  6. from sympy.functions.combinatorial.factorials import factorial
  7. from sympy.functions.elementary.complexes import (conjugate, transpose)
  8. from sympy.functions.elementary.exponential import (exp, log)
  9. from sympy.functions.elementary.miscellaneous import sqrt
  10. from sympy.functions.elementary.trigonometric import (cos, sin)
  11. from sympy.integrals.integrals import Integral
  12. from sympy.series.order import O, Order
  13. from sympy.core.expr import unchanged
  14. from sympy.testing.pytest import raises
  15. from sympy.abc import w, x, y, z
  16. from sympy.testing.pytest import XFAIL
  17. def test_caching_bug():
  18. #needs to be a first test, so that all caches are clean
  19. #cache it
  20. O(w)
  21. #and test that this won't raise an exception
  22. O(w**(-1/x/log(3)*log(5)), w)
  23. def test_free_symbols():
  24. assert Order(1).free_symbols == set()
  25. assert Order(x).free_symbols == {x}
  26. assert Order(1, x).free_symbols == {x}
  27. assert Order(x*y).free_symbols == {x, y}
  28. assert Order(x, x, y).free_symbols == {x, y}
  29. def test_simple_1():
  30. o = Rational(0)
  31. assert Order(2*x) == Order(x)
  32. assert Order(x)*3 == Order(x)
  33. assert -28*Order(x) == Order(x)
  34. assert Order(Order(x)) == Order(x)
  35. assert Order(Order(x), y) == Order(Order(x), x, y)
  36. assert Order(-23) == Order(1)
  37. assert Order(exp(x)) == Order(1, x)
  38. assert Order(exp(1/x)).expr == exp(1/x)
  39. assert Order(x*exp(1/x)).expr == x*exp(1/x)
  40. assert Order(x**(o/3)).expr == x**(o/3)
  41. assert Order(x**(o*Rational(5, 3))).expr == x**(o*Rational(5, 3))
  42. assert Order(x**2 + x + y, x) == O(1, x)
  43. assert Order(x**2 + x + y, y) == O(1, y)
  44. raises(ValueError, lambda: Order(exp(x), x, x))
  45. raises(TypeError, lambda: Order(x, 2 - x))
  46. def test_simple_2():
  47. assert Order(2*x)*x == Order(x**2)
  48. assert Order(2*x)/x == Order(1, x)
  49. assert Order(2*x)*x*exp(1/x) == Order(x**2*exp(1/x))
  50. assert (Order(2*x)*x*exp(1/x)/log(x)**3).expr == x**2*exp(1/x)*log(x)**-3
  51. def test_simple_3():
  52. assert Order(x) + x == Order(x)
  53. assert Order(x) + 2 == 2 + Order(x)
  54. assert Order(x) + x**2 == Order(x)
  55. assert Order(x) + 1/x == 1/x + Order(x)
  56. assert Order(1/x) + 1/x**2 == 1/x**2 + Order(1/x)
  57. assert Order(x) + exp(1/x) == Order(x) + exp(1/x)
  58. def test_simple_4():
  59. assert Order(x)**2 == Order(x**2)
  60. def test_simple_5():
  61. assert Order(x) + Order(x**2) == Order(x)
  62. assert Order(x) + Order(x**-2) == Order(x**-2)
  63. assert Order(x) + Order(1/x) == Order(1/x)
  64. def test_simple_6():
  65. assert Order(x) - Order(x) == Order(x)
  66. assert Order(x) + Order(1) == Order(1)
  67. assert Order(x) + Order(x**2) == Order(x)
  68. assert Order(1/x) + Order(1) == Order(1/x)
  69. assert Order(x) + Order(exp(1/x)) == Order(exp(1/x))
  70. assert Order(x**3) + Order(exp(2/x)) == Order(exp(2/x))
  71. assert Order(x**-3) + Order(exp(2/x)) == Order(exp(2/x))
  72. def test_simple_7():
  73. assert 1 + O(1) == O(1)
  74. assert 2 + O(1) == O(1)
  75. assert x + O(1) == O(1)
  76. assert 1/x + O(1) == 1/x + O(1)
  77. def test_simple_8():
  78. assert O(sqrt(-x)) == O(sqrt(x))
  79. assert O(x**2*sqrt(x)) == O(x**Rational(5, 2))
  80. assert O(x**3*sqrt(-(-x)**3)) == O(x**Rational(9, 2))
  81. assert O(x**Rational(3, 2)*sqrt((-x)**3)) == O(x**3)
  82. assert O(x*(-2*x)**(I/2)) == O(x*(-x)**(I/2))
  83. def test_as_expr_variables():
  84. assert Order(x).as_expr_variables(None) == (x, ((x, 0),))
  85. assert Order(x).as_expr_variables(((x, 0),)) == (x, ((x, 0),))
  86. assert Order(y).as_expr_variables(((x, 0),)) == (y, ((x, 0), (y, 0)))
  87. assert Order(y).as_expr_variables(((x, 0), (y, 0))) == (y, ((x, 0), (y, 0)))
  88. def test_contains_0():
  89. assert Order(1, x).contains(Order(1, x))
  90. assert Order(1, x).contains(Order(1))
  91. assert Order(1).contains(Order(1, x)) is False
  92. def test_contains_1():
  93. assert Order(x).contains(Order(x))
  94. assert Order(x).contains(Order(x**2))
  95. assert not Order(x**2).contains(Order(x))
  96. assert not Order(x).contains(Order(1/x))
  97. assert not Order(1/x).contains(Order(exp(1/x)))
  98. assert not Order(x).contains(Order(exp(1/x)))
  99. assert Order(1/x).contains(Order(x))
  100. assert Order(exp(1/x)).contains(Order(x))
  101. assert Order(exp(1/x)).contains(Order(1/x))
  102. assert Order(exp(1/x)).contains(Order(exp(1/x)))
  103. assert Order(exp(2/x)).contains(Order(exp(1/x)))
  104. assert not Order(exp(1/x)).contains(Order(exp(2/x)))
  105. def test_contains_2():
  106. assert Order(x).contains(Order(y)) is None
  107. assert Order(x).contains(Order(y*x))
  108. assert Order(y*x).contains(Order(x))
  109. assert Order(y).contains(Order(x*y))
  110. assert Order(x).contains(Order(y**2*x))
  111. def test_contains_3():
  112. assert Order(x*y**2).contains(Order(x**2*y)) is None
  113. assert Order(x**2*y).contains(Order(x*y**2)) is None
  114. def test_contains_4():
  115. assert Order(sin(1/x**2)).contains(Order(cos(1/x**2))) is True
  116. assert Order(cos(1/x**2)).contains(Order(sin(1/x**2))) is True
  117. def test_contains():
  118. assert Order(1, x) not in Order(1)
  119. assert Order(1) in Order(1, x)
  120. raises(TypeError, lambda: Order(x*y**2) in Order(x**2*y))
  121. def test_add_1():
  122. assert Order(x + x) == Order(x)
  123. assert Order(3*x - 2*x**2) == Order(x)
  124. assert Order(1 + x) == Order(1, x)
  125. assert Order(1 + 1/x) == Order(1/x)
  126. # TODO : A better output for Order(log(x) + 1/log(x))
  127. # could be Order(log(x)). Currently Order for expressions
  128. # where all arguments would involve a log term would fall
  129. # in this category and outputs for these should be improved.
  130. assert Order(log(x) + 1/log(x)) == Order((log(x)**2 + 1)/log(x))
  131. assert Order(exp(1/x) + x) == Order(exp(1/x))
  132. assert Order(exp(1/x) + 1/x**20) == Order(exp(1/x))
  133. def test_ln_args():
  134. assert O(log(x)) + O(log(2*x)) == O(log(x))
  135. assert O(log(x)) + O(log(x**3)) == O(log(x))
  136. assert O(log(x*y)) + O(log(x) + log(y)) == O(log(x) + log(y), x, y)
  137. def test_multivar_0():
  138. assert Order(x*y).expr == x*y
  139. assert Order(x*y**2).expr == x*y**2
  140. assert Order(x*y, x).expr == x
  141. assert Order(x*y**2, y).expr == y**2
  142. assert Order(x*y*z).expr == x*y*z
  143. assert Order(x/y).expr == x/y
  144. assert Order(x*exp(1/y)).expr == x*exp(1/y)
  145. assert Order(exp(x)*exp(1/y)).expr == exp(x)*exp(1/y)
  146. def test_multivar_0a():
  147. assert Order(exp(1/x)*exp(1/y)).expr == exp(1/x)*exp(1/y)
  148. def test_multivar_1():
  149. assert Order(x + y).expr == x + y
  150. assert Order(x + 2*y).expr == x + y
  151. assert (Order(x + y) + x).expr == (x + y)
  152. assert (Order(x + y) + x**2) == Order(x + y)
  153. assert (Order(x + y) + 1/x) == 1/x + Order(x + y)
  154. assert Order(x**2 + y*x).expr == x**2 + y*x
  155. def test_multivar_2():
  156. assert Order(x**2*y + y**2*x, x, y).expr == x**2*y + y**2*x
  157. def test_multivar_mul_1():
  158. assert Order(x + y)*x == Order(x**2 + y*x, x, y)
  159. def test_multivar_3():
  160. assert (Order(x) + Order(y)).args in [
  161. (Order(x), Order(y)),
  162. (Order(y), Order(x))]
  163. assert Order(x) + Order(y) + Order(x + y) == Order(x + y)
  164. assert (Order(x**2*y) + Order(y**2*x)).args in [
  165. (Order(x*y**2), Order(y*x**2)),
  166. (Order(y*x**2), Order(x*y**2))]
  167. assert (Order(x**2*y) + Order(y*x)) == Order(x*y)
  168. def test_issue_3468():
  169. y = Symbol('y', negative=True)
  170. z = Symbol('z', complex=True)
  171. # check that Order does not modify assumptions about symbols
  172. Order(x)
  173. Order(y)
  174. Order(z)
  175. assert x.is_positive is None
  176. assert y.is_positive is False
  177. assert z.is_positive is None
  178. def test_leading_order():
  179. assert (x + 1 + 1/x**5).extract_leading_order(x) == ((1/x**5, O(1/x**5)),)
  180. assert (1 + 1/x).extract_leading_order(x) == ((1/x, O(1/x)),)
  181. assert (1 + x).extract_leading_order(x) == ((1, O(1, x)),)
  182. assert (1 + x**2).extract_leading_order(x) == ((1, O(1, x)),)
  183. assert (2 + x**2).extract_leading_order(x) == ((2, O(1, x)),)
  184. assert (x + x**2).extract_leading_order(x) == ((x, O(x)),)
  185. def test_leading_order2():
  186. assert set((2 + pi + x**2).extract_leading_order(x)) == {(pi, O(1, x)),
  187. (S(2), O(1, x))}
  188. assert set((2*x + pi*x + x**2).extract_leading_order(x)) == {(2*x, O(x)),
  189. (x*pi, O(x))}
  190. def test_order_leadterm():
  191. assert O(x**2)._eval_as_leading_term(x, None, 1) == O(x**2)
  192. def test_order_symbols():
  193. e = x*y*sin(x)*Integral(x, (x, 1, 2))
  194. assert O(e) == O(x**2*y, x, y)
  195. assert O(e, x) == O(x**2)
  196. def test_nan():
  197. assert O(nan) is nan
  198. assert not O(x).contains(nan)
  199. def test_O1():
  200. assert O(1, x) * x == O(x)
  201. assert O(1, y) * x == O(1, y)
  202. def test_getn():
  203. # other lines are tested incidentally by the suite
  204. assert O(x).getn() == 1
  205. assert O(x/log(x)).getn() == 1
  206. assert O(x**2/log(x)**2).getn() == 2
  207. assert O(x*log(x)).getn() == 1
  208. raises(NotImplementedError, lambda: (O(x) + O(y)).getn())
  209. def test_diff():
  210. assert O(x**2).diff(x) == O(x)
  211. def test_getO():
  212. assert (x).getO() is None
  213. assert (x).removeO() == x
  214. assert (O(x)).getO() == O(x)
  215. assert (O(x)).removeO() == 0
  216. assert (z + O(x) + O(y)).getO() == O(x) + O(y)
  217. assert (z + O(x) + O(y)).removeO() == z
  218. raises(NotImplementedError, lambda: (O(x) + O(y)).getn())
  219. def test_leading_term():
  220. from sympy.functions.special.gamma_functions import digamma
  221. assert O(1/digamma(1/x)) == O(1/log(x))
  222. def test_eval():
  223. assert Order(x).subs(Order(x), 1) == 1
  224. assert Order(x).subs(x, y) == Order(y)
  225. assert Order(x).subs(y, x) == Order(x)
  226. assert Order(x).subs(x, x + y) == Order(x + y, (x, -y))
  227. assert (O(1)**x).is_Pow
  228. def test_issue_4279():
  229. a, b = symbols('a b')
  230. assert O(a, a, b) + O(1, a, b) == O(1, a, b)
  231. assert O(b, a, b) + O(1, a, b) == O(1, a, b)
  232. assert O(a + b, a, b) + O(1, a, b) == O(1, a, b)
  233. assert O(1, a, b) + O(a, a, b) == O(1, a, b)
  234. assert O(1, a, b) + O(b, a, b) == O(1, a, b)
  235. assert O(1, a, b) + O(a + b, a, b) == O(1, a, b)
  236. def test_issue_4855():
  237. assert 1/O(1) != O(1)
  238. assert 1/O(x) != O(1/x)
  239. assert 1/O(x, (x, oo)) != O(1/x, (x, oo))
  240. f = Function('f')
  241. assert 1/O(f(x)) != O(1/x)
  242. def test_order_conjugate_transpose():
  243. x = Symbol('x', real=True)
  244. y = Symbol('y', imaginary=True)
  245. assert conjugate(Order(x)) == Order(conjugate(x))
  246. assert conjugate(Order(y)) == Order(conjugate(y))
  247. assert conjugate(Order(x**2)) == Order(conjugate(x)**2)
  248. assert conjugate(Order(y**2)) == Order(conjugate(y)**2)
  249. assert transpose(Order(x)) == Order(transpose(x))
  250. assert transpose(Order(y)) == Order(transpose(y))
  251. assert transpose(Order(x**2)) == Order(transpose(x)**2)
  252. assert transpose(Order(y**2)) == Order(transpose(y)**2)
  253. def test_order_noncommutative():
  254. A = Symbol('A', commutative=False)
  255. assert Order(A + A*x, x) == Order(1, x)
  256. assert (A + A*x)*Order(x) == Order(x)
  257. assert (A*x)*Order(x) == Order(x**2, x)
  258. assert expand((1 + Order(x))*A*A*x) == A*A*x + Order(x**2, x)
  259. assert expand((A*A + Order(x))*x) == A*A*x + Order(x**2, x)
  260. assert expand((A + Order(x))*A*x) == A*A*x + Order(x**2, x)
  261. def test_issue_6753():
  262. assert (1 + x**2)**10000*O(x) == O(x)
  263. def test_order_at_infinity():
  264. assert Order(1 + x, (x, oo)) == Order(x, (x, oo))
  265. assert Order(3*x, (x, oo)) == Order(x, (x, oo))
  266. assert Order(x, (x, oo))*3 == Order(x, (x, oo))
  267. assert -28*Order(x, (x, oo)) == Order(x, (x, oo))
  268. assert Order(Order(x, (x, oo)), (x, oo)) == Order(x, (x, oo))
  269. assert Order(Order(x, (x, oo)), (y, oo)) == Order(x, (x, oo), (y, oo))
  270. assert Order(3, (x, oo)) == Order(1, (x, oo))
  271. assert Order(x**2 + x + y, (x, oo)) == O(x**2, (x, oo))
  272. assert Order(x**2 + x + y, (y, oo)) == O(y, (y, oo))
  273. assert Order(2*x, (x, oo))*x == Order(x**2, (x, oo))
  274. assert Order(2*x, (x, oo))/x == Order(1, (x, oo))
  275. assert Order(2*x, (x, oo))*x*exp(1/x) == Order(x**2*exp(1/x), (x, oo))
  276. assert Order(2*x, (x, oo))*x*exp(1/x)/log(x)**3 == Order(x**2*exp(1/x)*log(x)**-3, (x, oo))
  277. assert Order(x, (x, oo)) + 1/x == 1/x + Order(x, (x, oo)) == Order(x, (x, oo))
  278. assert Order(x, (x, oo)) + 1 == 1 + Order(x, (x, oo)) == Order(x, (x, oo))
  279. assert Order(x, (x, oo)) + x == x + Order(x, (x, oo)) == Order(x, (x, oo))
  280. assert Order(x, (x, oo)) + x**2 == x**2 + Order(x, (x, oo))
  281. assert Order(1/x, (x, oo)) + 1/x**2 == 1/x**2 + Order(1/x, (x, oo)) == Order(1/x, (x, oo))
  282. assert Order(x, (x, oo)) + exp(1/x) == exp(1/x) + Order(x, (x, oo))
  283. assert Order(x, (x, oo))**2 == Order(x**2, (x, oo))
  284. assert Order(x, (x, oo)) + Order(x**2, (x, oo)) == Order(x**2, (x, oo))
  285. assert Order(x, (x, oo)) + Order(x**-2, (x, oo)) == Order(x, (x, oo))
  286. assert Order(x, (x, oo)) + Order(1/x, (x, oo)) == Order(x, (x, oo))
  287. assert Order(x, (x, oo)) - Order(x, (x, oo)) == Order(x, (x, oo))
  288. assert Order(x, (x, oo)) + Order(1, (x, oo)) == Order(x, (x, oo))
  289. assert Order(x, (x, oo)) + Order(x**2, (x, oo)) == Order(x**2, (x, oo))
  290. assert Order(1/x, (x, oo)) + Order(1, (x, oo)) == Order(1, (x, oo))
  291. assert Order(x, (x, oo)) + Order(exp(1/x), (x, oo)) == Order(x, (x, oo))
  292. assert Order(x**3, (x, oo)) + Order(exp(2/x), (x, oo)) == Order(x**3, (x, oo))
  293. assert Order(x**-3, (x, oo)) + Order(exp(2/x), (x, oo)) == Order(exp(2/x), (x, oo))
  294. # issue 7207
  295. assert Order(exp(x), (x, oo)).expr == Order(2*exp(x), (x, oo)).expr == exp(x)
  296. assert Order(y**x, (x, oo)).expr == Order(2*y**x, (x, oo)).expr == exp(x*log(y))
  297. # issue 19545
  298. assert Order(1/x - 3/(3*x + 2), (x, oo)).expr == x**(-2)
  299. def test_mixing_order_at_zero_and_infinity():
  300. assert (Order(x, (x, 0)) + Order(x, (x, oo))).is_Add
  301. assert Order(x, (x, 0)) + Order(x, (x, oo)) == Order(x, (x, oo)) + Order(x, (x, 0))
  302. assert Order(Order(x, (x, oo))) == Order(x, (x, oo))
  303. # not supported (yet)
  304. raises(NotImplementedError, lambda: Order(x, (x, 0))*Order(x, (x, oo)))
  305. raises(NotImplementedError, lambda: Order(x, (x, oo))*Order(x, (x, 0)))
  306. raises(NotImplementedError, lambda: Order(Order(x, (x, oo)), y))
  307. raises(NotImplementedError, lambda: Order(Order(x), (x, oo)))
  308. def test_order_at_some_point():
  309. assert Order(x, (x, 1)) == Order(1, (x, 1))
  310. assert Order(2*x - 2, (x, 1)) == Order(x - 1, (x, 1))
  311. assert Order(-x + 1, (x, 1)) == Order(x - 1, (x, 1))
  312. assert Order(x - 1, (x, 1))**2 == Order((x - 1)**2, (x, 1))
  313. assert Order(x - 2, (x, 2)) - O(x - 2, (x, 2)) == Order(x - 2, (x, 2))
  314. def test_order_subs_limits():
  315. # issue 3333
  316. assert (1 + Order(x)).subs(x, 1/x) == 1 + Order(1/x, (x, oo))
  317. assert (1 + Order(x)).limit(x, 0) == 1
  318. # issue 5769
  319. assert ((x + Order(x**2))/x).limit(x, 0) == 1
  320. assert Order(x**2).subs(x, y - 1) == Order((y - 1)**2, (y, 1))
  321. assert Order(10*x**2, (x, 2)).subs(x, y - 1) == Order(1, (y, 3))
  322. #issue 19120
  323. assert O(x).subs(x, O(x)) == O(x)
  324. assert O(x**2).subs(x, x + O(x)) == O(x**2)
  325. assert O(x, (x, oo)).subs(x, O(x, (x, oo))) == O(x, (x, oo))
  326. assert O(x**2, (x, oo)).subs(x, x + O(x, (x, oo))) == O(x**2, (x, oo))
  327. assert (x + O(x**2)).subs(x, x + O(x**2)) == x + O(x**2)
  328. assert (x**2 + O(x**2) + 1/x**2).subs(x, x + O(x**2)) == (x + O(x**2))**(-2) + O(x**2)
  329. assert (x**2 + O(x**2) + 1).subs(x, x + O(x**2)) == 1 + O(x**2)
  330. assert O(x, (x, oo)).subs(x, x + O(x**2, (x, oo))) == O(x**2, (x, oo))
  331. assert sin(x).series(n=8).subs(x,sin(x).series(n=8)).expand() == x - x**3/3 + x**5/10 - 8*x**7/315 + O(x**8)
  332. assert cos(x).series(n=8).subs(x,sin(x).series(n=8)).expand() == 1 - x**2/2 + 5*x**4/24 - 37*x**6/720 + O(x**8)
  333. assert O(x).subs(x, O(1/x, (x, oo))) == O(1/x, (x, oo))
  334. @XFAIL
  335. def test_order_failing_due_to_solveset():
  336. assert O(x**3).subs(x, exp(-x**2)) == O(exp(-3*x**2), (x, -oo))
  337. raises(NotImplementedError, lambda: O(x).subs(x, O(1/x))) # mixing of order at different points
  338. def test_issue_9351():
  339. assert exp(x).series(x, 10, 1) == exp(10) + Order(x - 10, (x, 10))
  340. def test_issue_9192():
  341. assert O(1)*O(1) == O(1)
  342. assert O(1)**O(1) == O(1)
  343. def test_issue_9910():
  344. assert O(x*log(x) + sin(x), (x, oo)) == O(x*log(x), (x, oo))
  345. def test_performance_of_adding_order():
  346. l = [x**i for i in range(1000)]
  347. l.append(O(x**1001))
  348. assert Add(*l).subs(x,1) == O(1)
  349. def test_issue_14622():
  350. assert (x**(-4) + x**(-3) + x**(-1) + O(x**(-6), (x, oo))).as_numer_denom() == (
  351. x**4 + x**5 + x**7 + O(x**2, (x, oo)), x**8)
  352. assert (x**3 + O(x**2, (x, oo))).is_Add
  353. assert O(x**2, (x, oo)).contains(x**3) is False
  354. assert O(x, (x, oo)).contains(O(x, (x, 0))) is None
  355. assert O(x, (x, 0)).contains(O(x, (x, oo))) is None
  356. raises(NotImplementedError, lambda: O(x**3).contains(x**w))
  357. def test_issue_15539():
  358. assert O(1/x**2 + 1/x**4, (x, -oo)) == O(1/x**2, (x, -oo))
  359. assert O(1/x**4 + exp(x), (x, -oo)) == O(1/x**4, (x, -oo))
  360. assert O(1/x**4 + exp(-x), (x, -oo)) == O(exp(-x), (x, -oo))
  361. assert O(1/x, (x, oo)).subs(x, -x) == O(-1/x, (x, -oo))
  362. def test_issue_18606():
  363. assert unchanged(Order, 0)
  364. def test_issue_22165():
  365. assert O(log(x)).contains(2)
  366. def test_issue_23231():
  367. # This test checks Order for expressions having
  368. # arguments containing variables in exponents/powers.
  369. assert O(x**x + 2**x, (x, oo)) == O(exp(x*log(x)), (x, oo))
  370. assert O(x**x + x**2, (x, oo)) == O(exp(x*log(x)), (x, oo))
  371. assert O(x**x + 1/x**2, (x, oo)) == O(exp(x*log(x)), (x, oo))
  372. assert O(2**x + 3**x , (x, oo)) == O(exp(x*log(3)), (x, oo))
  373. def test_issue_9917():
  374. assert O(x*sin(x) + 1, (x, oo)) == O(x, (x, oo))
  375. def test_issue_22836():
  376. assert O(2**x + factorial(x), (x, oo)) == O(factorial(x), (x, oo))
  377. assert O(2**x + factorial(x) + x**x, (x, oo)) == O(exp(x*log(x)), (x, oo))
  378. assert O(x + factorial(x), (x, oo)) == O(factorial(x), (x, oo))