test_power.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652
  1. from sympy.core import (
  2. Basic, Rational, Symbol, S, Float, Integer, Mul, Number, Pow,
  3. Expr, I, nan, pi, symbols, oo, zoo, N)
  4. from sympy.core.parameters import global_parameters
  5. from sympy.core.tests.test_evalf import NS
  6. from sympy.core.function import expand_multinomial
  7. from sympy.functions.elementary.miscellaneous import sqrt, cbrt
  8. from sympy.functions.elementary.exponential import exp, log
  9. from sympy.functions.special.error_functions import erf
  10. from sympy.functions.elementary.trigonometric import (
  11. sin, cos, tan, sec, csc, atan)
  12. from sympy.functions.elementary.hyperbolic import cosh, sinh, tanh
  13. from sympy.polys import Poly
  14. from sympy.series.order import O
  15. from sympy.sets import FiniteSet
  16. from sympy.core.power import power, integer_nthroot
  17. from sympy.testing.pytest import warns, _both_exp_pow
  18. from sympy.utilities.exceptions import SymPyDeprecationWarning
  19. from sympy.abc import a, b, c, x, y
  20. def test_rational():
  21. a = Rational(1, 5)
  22. r = sqrt(5)/5
  23. assert sqrt(a) == r
  24. assert 2*sqrt(a) == 2*r
  25. r = a*a**S.Half
  26. assert a**Rational(3, 2) == r
  27. assert 2*a**Rational(3, 2) == 2*r
  28. r = a**5*a**Rational(2, 3)
  29. assert a**Rational(17, 3) == r
  30. assert 2 * a**Rational(17, 3) == 2*r
  31. def test_large_rational():
  32. e = (Rational(123712**12 - 1, 7) + Rational(1, 7))**Rational(1, 3)
  33. assert e == 234232585392159195136 * (Rational(1, 7)**Rational(1, 3))
  34. def test_negative_real():
  35. def feq(a, b):
  36. return abs(a - b) < 1E-10
  37. assert feq(S.One / Float(-0.5), -Integer(2))
  38. def test_expand():
  39. assert (2**(-1 - x)).expand() == S.Half*2**(-x)
  40. def test_issue_3449():
  41. #test if powers are simplified correctly
  42. #see also issue 3995
  43. assert ((x**Rational(1, 3))**Rational(2)) == x**Rational(2, 3)
  44. assert (
  45. (x**Rational(3))**Rational(2, 5)) == (x**Rational(3))**Rational(2, 5)
  46. a = Symbol('a', real=True)
  47. b = Symbol('b', real=True)
  48. assert (a**2)**b == (abs(a)**b)**2
  49. assert sqrt(1/a) != 1/sqrt(a) # e.g. for a = -1
  50. assert (a**3)**Rational(1, 3) != a
  51. assert (x**a)**b != x**(a*b) # e.g. x = -1, a=2, b=1/2
  52. assert (x**.5)**b == x**(.5*b)
  53. assert (x**.5)**.5 == x**.25
  54. assert (x**2.5)**.5 != x**1.25 # e.g. for x = 5*I
  55. k = Symbol('k', integer=True)
  56. m = Symbol('m', integer=True)
  57. assert (x**k)**m == x**(k*m)
  58. assert Number(5)**Rational(2, 3) == Number(25)**Rational(1, 3)
  59. assert (x**.5)**2 == x**1.0
  60. assert (x**2)**k == (x**k)**2 == x**(2*k)
  61. a = Symbol('a', positive=True)
  62. assert (a**3)**Rational(2, 5) == a**Rational(6, 5)
  63. assert (a**2)**b == (a**b)**2
  64. assert (a**Rational(2, 3))**x == a**(x*Rational(2, 3)) != (a**x)**Rational(2, 3)
  65. def test_issue_3866():
  66. assert --sqrt(sqrt(5) - 1) == sqrt(sqrt(5) - 1)
  67. def test_negative_one():
  68. x = Symbol('x', complex=True)
  69. y = Symbol('y', complex=True)
  70. assert 1/x**y == x**(-y)
  71. def test_issue_4362():
  72. neg = Symbol('neg', negative=True)
  73. nonneg = Symbol('nonneg', nonnegative=True)
  74. any = Symbol('any')
  75. num, den = sqrt(1/neg).as_numer_denom()
  76. assert num == sqrt(-1)
  77. assert den == sqrt(-neg)
  78. num, den = sqrt(1/nonneg).as_numer_denom()
  79. assert num == 1
  80. assert den == sqrt(nonneg)
  81. num, den = sqrt(1/any).as_numer_denom()
  82. assert num == sqrt(1/any)
  83. assert den == 1
  84. def eqn(num, den, pow):
  85. return (num/den)**pow
  86. npos = 1
  87. nneg = -1
  88. dpos = 2 - sqrt(3)
  89. dneg = 1 - sqrt(3)
  90. assert dpos > 0 and dneg < 0 and npos > 0 and nneg < 0
  91. # pos or neg integer
  92. eq = eqn(npos, dpos, 2)
  93. assert eq.is_Pow and eq.as_numer_denom() == (1, dpos**2)
  94. eq = eqn(npos, dneg, 2)
  95. assert eq.is_Pow and eq.as_numer_denom() == (1, dneg**2)
  96. eq = eqn(nneg, dpos, 2)
  97. assert eq.is_Pow and eq.as_numer_denom() == (1, dpos**2)
  98. eq = eqn(nneg, dneg, 2)
  99. assert eq.is_Pow and eq.as_numer_denom() == (1, dneg**2)
  100. eq = eqn(npos, dpos, -2)
  101. assert eq.is_Pow and eq.as_numer_denom() == (dpos**2, 1)
  102. eq = eqn(npos, dneg, -2)
  103. assert eq.is_Pow and eq.as_numer_denom() == (dneg**2, 1)
  104. eq = eqn(nneg, dpos, -2)
  105. assert eq.is_Pow and eq.as_numer_denom() == (dpos**2, 1)
  106. eq = eqn(nneg, dneg, -2)
  107. assert eq.is_Pow and eq.as_numer_denom() == (dneg**2, 1)
  108. # pos or neg rational
  109. pow = S.Half
  110. eq = eqn(npos, dpos, pow)
  111. assert eq.is_Pow and eq.as_numer_denom() == (npos**pow, dpos**pow)
  112. eq = eqn(npos, dneg, pow)
  113. assert eq.is_Pow is False and eq.as_numer_denom() == ((-npos)**pow, (-dneg)**pow)
  114. eq = eqn(nneg, dpos, pow)
  115. assert not eq.is_Pow or eq.as_numer_denom() == (nneg**pow, dpos**pow)
  116. eq = eqn(nneg, dneg, pow)
  117. assert eq.is_Pow and eq.as_numer_denom() == ((-nneg)**pow, (-dneg)**pow)
  118. eq = eqn(npos, dpos, -pow)
  119. assert eq.is_Pow and eq.as_numer_denom() == (dpos**pow, npos**pow)
  120. eq = eqn(npos, dneg, -pow)
  121. assert eq.is_Pow is False and eq.as_numer_denom() == (-(-npos)**pow*(-dneg)**pow, npos)
  122. eq = eqn(nneg, dpos, -pow)
  123. assert not eq.is_Pow or eq.as_numer_denom() == (dpos**pow, nneg**pow)
  124. eq = eqn(nneg, dneg, -pow)
  125. assert eq.is_Pow and eq.as_numer_denom() == ((-dneg)**pow, (-nneg)**pow)
  126. # unknown exponent
  127. pow = 2*any
  128. eq = eqn(npos, dpos, pow)
  129. assert eq.is_Pow and eq.as_numer_denom() == (npos**pow, dpos**pow)
  130. eq = eqn(npos, dneg, pow)
  131. assert eq.is_Pow and eq.as_numer_denom() == ((-npos)**pow, (-dneg)**pow)
  132. eq = eqn(nneg, dpos, pow)
  133. assert eq.is_Pow and eq.as_numer_denom() == (nneg**pow, dpos**pow)
  134. eq = eqn(nneg, dneg, pow)
  135. assert eq.is_Pow and eq.as_numer_denom() == ((-nneg)**pow, (-dneg)**pow)
  136. eq = eqn(npos, dpos, -pow)
  137. assert eq.as_numer_denom() == (dpos**pow, npos**pow)
  138. eq = eqn(npos, dneg, -pow)
  139. assert eq.is_Pow and eq.as_numer_denom() == ((-dneg)**pow, (-npos)**pow)
  140. eq = eqn(nneg, dpos, -pow)
  141. assert eq.is_Pow and eq.as_numer_denom() == (dpos**pow, nneg**pow)
  142. eq = eqn(nneg, dneg, -pow)
  143. assert eq.is_Pow and eq.as_numer_denom() == ((-dneg)**pow, (-nneg)**pow)
  144. assert ((1/(1 + x/3))**(-S.One)).as_numer_denom() == (3 + x, 3)
  145. notp = Symbol('notp', positive=False) # not positive does not imply real
  146. b = ((1 + x/notp)**-2)
  147. assert (b**(-y)).as_numer_denom() == (1, b**y)
  148. assert (b**(-S.One)).as_numer_denom() == ((notp + x)**2, notp**2)
  149. nonp = Symbol('nonp', nonpositive=True)
  150. assert (((1 + x/nonp)**-2)**(-S.One)).as_numer_denom() == ((-nonp -
  151. x)**2, nonp**2)
  152. n = Symbol('n', negative=True)
  153. assert (x**n).as_numer_denom() == (1, x**-n)
  154. assert sqrt(1/n).as_numer_denom() == (S.ImaginaryUnit, sqrt(-n))
  155. n = Symbol('0 or neg', nonpositive=True)
  156. # if x and n are split up without negating each term and n is negative
  157. # then the answer might be wrong; if n is 0 it won't matter since
  158. # 1/oo and 1/zoo are both zero as is sqrt(0)/sqrt(-x) unless x is also
  159. # zero (in which case the negative sign doesn't matter):
  160. # 1/sqrt(1/-1) = -I but sqrt(-1)/sqrt(1) = I
  161. assert (1/sqrt(x/n)).as_numer_denom() == (sqrt(-n), sqrt(-x))
  162. c = Symbol('c', complex=True)
  163. e = sqrt(1/c)
  164. assert e.as_numer_denom() == (e, 1)
  165. i = Symbol('i', integer=True)
  166. assert ((1 + x/y)**i).as_numer_denom() == ((x + y)**i, y**i)
  167. def test_Pow_Expr_args():
  168. bases = [Basic(), Poly(x, x), FiniteSet(x)]
  169. for base in bases:
  170. # The cache can mess with the stacklevel test
  171. with warns(SymPyDeprecationWarning, test_stacklevel=False):
  172. Pow(base, S.One)
  173. def test_Pow_signs():
  174. """Cf. issues 4595 and 5250"""
  175. n = Symbol('n', even=True)
  176. assert (3 - y)**2 != (y - 3)**2
  177. assert (3 - y)**n != (y - 3)**n
  178. assert (-3 + y - x)**2 != (3 - y + x)**2
  179. assert (y - 3)**3 != -(3 - y)**3
  180. def test_power_with_noncommutative_mul_as_base():
  181. x = Symbol('x', commutative=False)
  182. y = Symbol('y', commutative=False)
  183. assert not (x*y)**3 == x**3*y**3
  184. assert (2*x*y)**3 == 8*(x*y)**3
  185. @_both_exp_pow
  186. def test_power_rewrite_exp():
  187. assert (I**I).rewrite(exp) == exp(-pi/2)
  188. expr = (2 + 3*I)**(4 + 5*I)
  189. assert expr.rewrite(exp) == exp((4 + 5*I)*(log(sqrt(13)) + I*atan(Rational(3, 2))))
  190. assert expr.rewrite(exp).expand() == \
  191. 169*exp(5*I*log(13)/2)*exp(4*I*atan(Rational(3, 2)))*exp(-5*atan(Rational(3, 2)))
  192. assert ((6 + 7*I)**5).rewrite(exp) == 7225*sqrt(85)*exp(5*I*atan(Rational(7, 6)))
  193. expr = 5**(6 + 7*I)
  194. assert expr.rewrite(exp) == exp((6 + 7*I)*log(5))
  195. assert expr.rewrite(exp).expand() == 15625*exp(7*I*log(5))
  196. assert Pow(123, 789, evaluate=False).rewrite(exp) == 123**789
  197. assert (1**I).rewrite(exp) == 1**I
  198. assert (0**I).rewrite(exp) == 0**I
  199. expr = (-2)**(2 + 5*I)
  200. assert expr.rewrite(exp) == exp((2 + 5*I)*(log(2) + I*pi))
  201. assert expr.rewrite(exp).expand() == 4*exp(-5*pi)*exp(5*I*log(2))
  202. assert ((-2)**S(-5)).rewrite(exp) == (-2)**S(-5)
  203. x, y = symbols('x y')
  204. assert (x**y).rewrite(exp) == exp(y*log(x))
  205. if global_parameters.exp_is_pow:
  206. assert (7**x).rewrite(exp) == Pow(S.Exp1, x*log(7), evaluate=False)
  207. else:
  208. assert (7**x).rewrite(exp) == exp(x*log(7), evaluate=False)
  209. assert ((2 + 3*I)**x).rewrite(exp) == exp(x*(log(sqrt(13)) + I*atan(Rational(3, 2))))
  210. assert (y**(5 + 6*I)).rewrite(exp) == exp(log(y)*(5 + 6*I))
  211. assert all((1/func(x)).rewrite(exp) == 1/(func(x).rewrite(exp)) for func in
  212. (sin, cos, tan, sec, csc, sinh, cosh, tanh))
  213. def test_zero():
  214. assert 0**x != 0
  215. assert 0**(2*x) == 0**x
  216. assert 0**(1.0*x) == 0**x
  217. assert 0**(2.0*x) == 0**x
  218. assert (0**(2 - x)).as_base_exp() == (0, 2 - x)
  219. assert 0**(x - 2) != S.Infinity**(2 - x)
  220. assert 0**(2*x*y) == 0**(x*y)
  221. assert 0**(-2*x*y) == S.ComplexInfinity**(x*y)
  222. assert Float(0)**2 is not S.Zero
  223. assert Float(0)**2 == 0.0
  224. assert Float(0)**-2 is zoo
  225. assert Float(0)**oo is S.Zero
  226. #Test issue 19572
  227. assert 0 ** -oo is zoo
  228. assert power(0, -oo) is zoo
  229. assert Float(0)**-oo is zoo
  230. def test_pow_as_base_exp():
  231. assert (S.Infinity**(2 - x)).as_base_exp() == (S.Infinity, 2 - x)
  232. assert (S.Infinity**(x - 2)).as_base_exp() == (S.Infinity, x - 2)
  233. p = S.Half**x
  234. assert p.base, p.exp == p.as_base_exp() == (S(2), -x)
  235. p = (S(3)/2)**x
  236. assert p.base, p.exp == p.as_base_exp() == (3*S.Half, x)
  237. p = (S(2)/3)**x
  238. assert p.as_base_exp() == (S(3)/2, -x)
  239. assert p.base, p.exp == (S(2)/3, x)
  240. # issue 8344:
  241. assert Pow(1, 2, evaluate=False).as_base_exp() == (S.One, S(2))
  242. def test_nseries():
  243. assert sqrt(I*x - 1)._eval_nseries(x, 4, None, 1) == I + x/2 + I*x**2/8 - x**3/16 + O(x**4)
  244. assert sqrt(I*x - 1)._eval_nseries(x, 4, None, -1) == -I - x/2 - I*x**2/8 + x**3/16 + O(x**4)
  245. assert cbrt(I*x - 1)._eval_nseries(x, 4, None, 1) == (-1)**(S(1)/3) - (-1)**(S(5)/6)*x/3 + \
  246. (-1)**(S(1)/3)*x**2/9 + 5*(-1)**(S(5)/6)*x**3/81 + O(x**4)
  247. assert cbrt(I*x - 1)._eval_nseries(x, 4, None, -1) == -(-1)**(S(2)/3) - (-1)**(S(1)/6)*x/3 - \
  248. (-1)**(S(2)/3)*x**2/9 + 5*(-1)**(S(1)/6)*x**3/81 + O(x**4)
  249. assert (1 / (exp(-1/x) + 1/x))._eval_nseries(x, 2, None) == x + O(x**2)
  250. # test issue 23752
  251. assert sqrt(-I*x**2 + x - 3)._eval_nseries(x, 4, None, 1) == -sqrt(3)*I + sqrt(3)*I*x/6 - \
  252. sqrt(3)*I*x**2*(-S(1)/72 + I/6) - sqrt(3)*I*x**3*(-S(1)/432 + I/36) + O(x**4)
  253. assert sqrt(-I*x**2 + x - 3)._eval_nseries(x, 4, None, -1) == -sqrt(3)*I + sqrt(3)*I*x/6 - \
  254. sqrt(3)*I*x**2*(-S(1)/72 + I/6) - sqrt(3)*I*x**3*(-S(1)/432 + I/36) + O(x**4)
  255. assert cbrt(-I*x**2 + x - 3)._eval_nseries(x, 4, None, 1) == -(-1)**(S(2)/3)*3**(S(1)/3) + \
  256. (-1)**(S(2)/3)*3**(S(1)/3)*x/9 - (-1)**(S(2)/3)*3**(S(1)/3)*x**2*(-S(1)/81 + I/9) - \
  257. (-1)**(S(2)/3)*3**(S(1)/3)*x**3*(-S(5)/2187 + 2*I/81) + O(x**4)
  258. assert cbrt(-I*x**2 + x - 3)._eval_nseries(x, 4, None, -1) == -(-1)**(S(2)/3)*3**(S(1)/3) + \
  259. (-1)**(S(2)/3)*3**(S(1)/3)*x/9 - (-1)**(S(2)/3)*3**(S(1)/3)*x**2*(-S(1)/81 + I/9) - \
  260. (-1)**(S(2)/3)*3**(S(1)/3)*x**3*(-S(5)/2187 + 2*I/81) + O(x**4)
  261. def test_issue_6100_12942_4473():
  262. assert x**1.0 != x
  263. assert x != x**1.0
  264. assert True != x**1.0
  265. assert x**1.0 is not True
  266. assert x is not True
  267. assert x*y != (x*y)**1.0
  268. # Pow != Symbol
  269. assert (x**1.0)**1.0 != x
  270. assert (x**1.0)**2.0 != x**2
  271. b = Expr()
  272. assert Pow(b, 1.0, evaluate=False) != b
  273. # if the following gets distributed as a Mul (x**1.0*y**1.0 then
  274. # __eq__ methods could be added to Symbol and Pow to detect the
  275. # power-of-1.0 case.
  276. assert ((x*y)**1.0).func is Pow
  277. def test_issue_6208():
  278. from sympy.functions.elementary.miscellaneous import root
  279. assert sqrt(33**(I*9/10)) == -33**(I*9/20)
  280. assert root((6*I)**(2*I), 3).as_base_exp()[1] == Rational(1, 3) # != 2*I/3
  281. assert root((6*I)**(I/3), 3).as_base_exp()[1] == I/9
  282. assert sqrt(exp(3*I)) == exp(3*I/2)
  283. assert sqrt(-sqrt(3)*(1 + 2*I)) == sqrt(sqrt(3))*sqrt(-1 - 2*I)
  284. assert sqrt(exp(5*I)) == -exp(5*I/2)
  285. assert root(exp(5*I), 3).exp == Rational(1, 3)
  286. def test_issue_6990():
  287. assert (sqrt(a + b*x + x**2)).series(x, 0, 3).removeO() == \
  288. sqrt(a)*x**2*(1/(2*a) - b**2/(8*a**2)) + sqrt(a) + b*x/(2*sqrt(a))
  289. def test_issue_6068():
  290. assert sqrt(sin(x)).series(x, 0, 7) == \
  291. sqrt(x) - x**Rational(5, 2)/12 + x**Rational(9, 2)/1440 - \
  292. x**Rational(13, 2)/24192 + O(x**7)
  293. assert sqrt(sin(x)).series(x, 0, 9) == \
  294. sqrt(x) - x**Rational(5, 2)/12 + x**Rational(9, 2)/1440 - \
  295. x**Rational(13, 2)/24192 - 67*x**Rational(17, 2)/29030400 + O(x**9)
  296. assert sqrt(sin(x**3)).series(x, 0, 19) == \
  297. x**Rational(3, 2) - x**Rational(15, 2)/12 + x**Rational(27, 2)/1440 + O(x**19)
  298. assert sqrt(sin(x**3)).series(x, 0, 20) == \
  299. x**Rational(3, 2) - x**Rational(15, 2)/12 + x**Rational(27, 2)/1440 - \
  300. x**Rational(39, 2)/24192 + O(x**20)
  301. def test_issue_6782():
  302. assert sqrt(sin(x**3)).series(x, 0, 7) == x**Rational(3, 2) + O(x**7)
  303. assert sqrt(sin(x**4)).series(x, 0, 3) == x**2 + O(x**3)
  304. def test_issue_6653():
  305. assert (1 / sqrt(1 + sin(x**2))).series(x, 0, 3) == 1 - x**2/2 + O(x**3)
  306. def test_issue_6429():
  307. f = (c**2 + x)**(0.5)
  308. assert f.series(x, x0=0, n=1) == (c**2)**0.5 + O(x)
  309. assert f.taylor_term(0, x) == (c**2)**0.5
  310. assert f.taylor_term(1, x) == 0.5*x*(c**2)**(-0.5)
  311. assert f.taylor_term(2, x) == -0.125*x**2*(c**2)**(-1.5)
  312. def test_issue_7638():
  313. f = pi/log(sqrt(2))
  314. assert ((1 + I)**(I*f/2))**0.3 == (1 + I)**(0.15*I*f)
  315. # if 1/3 -> 1.0/3 this should fail since it cannot be shown that the
  316. # sign will be +/-1; for the previous "small arg" case, it didn't matter
  317. # that this could not be proved
  318. assert (1 + I)**(4*I*f) == ((1 + I)**(12*I*f))**Rational(1, 3)
  319. assert (((1 + I)**(I*(1 + 7*f)))**Rational(1, 3)).exp == Rational(1, 3)
  320. r = symbols('r', real=True)
  321. assert sqrt(r**2) == abs(r)
  322. assert cbrt(r**3) != r
  323. assert sqrt(Pow(2*I, 5*S.Half)) != (2*I)**Rational(5, 4)
  324. p = symbols('p', positive=True)
  325. assert cbrt(p**2) == p**Rational(2, 3)
  326. assert NS(((0.2 + 0.7*I)**(0.7 + 1.0*I))**(0.5 - 0.1*I), 1) == '0.4 + 0.2*I'
  327. assert sqrt(1/(1 + I)) == sqrt(1 - I)/sqrt(2) # or 1/sqrt(1 + I)
  328. e = 1/(1 - sqrt(2))
  329. assert sqrt(e) == I/sqrt(-1 + sqrt(2))
  330. assert e**Rational(-1, 2) == -I*sqrt(-1 + sqrt(2))
  331. assert sqrt((cos(1)**2 + sin(1)**2 - 1)**(3 + I)).exp in [S.Half,
  332. Rational(3, 2) + I/2]
  333. assert sqrt(r**Rational(4, 3)) != r**Rational(2, 3)
  334. assert sqrt((p + I)**Rational(4, 3)) == (p + I)**Rational(2, 3)
  335. for q in 1+I, 1-I:
  336. assert sqrt(q**2) == q
  337. for q in -1+I, -1-I:
  338. assert sqrt(q**2) == -q
  339. assert sqrt((p + r*I)**2) != p + r*I
  340. e = (1 + I/5)
  341. assert sqrt(e**5) == e**(5*S.Half)
  342. assert sqrt(e**6) == e**3
  343. assert sqrt((1 + I*r)**6) != (1 + I*r)**3
  344. def test_issue_8582():
  345. assert 1**oo is nan
  346. assert 1**(-oo) is nan
  347. assert 1**zoo is nan
  348. assert 1**(oo + I) is nan
  349. assert 1**(1 + I*oo) is nan
  350. assert 1**(oo + I*oo) is nan
  351. def test_issue_8650():
  352. n = Symbol('n', integer=True, nonnegative=True)
  353. assert (n**n).is_positive is True
  354. x = 5*n + 5
  355. assert (x**(5*(n + 1))).is_positive is True
  356. def test_issue_13914():
  357. b = Symbol('b')
  358. assert (-1)**zoo is nan
  359. assert 2**zoo is nan
  360. assert (S.Half)**(1 + zoo) is nan
  361. assert I**(zoo + I) is nan
  362. assert b**(I + zoo) is nan
  363. def test_better_sqrt():
  364. n = Symbol('n', integer=True, nonnegative=True)
  365. assert sqrt(3 + 4*I) == 2 + I
  366. assert sqrt(3 - 4*I) == 2 - I
  367. assert sqrt(-3 - 4*I) == 1 - 2*I
  368. assert sqrt(-3 + 4*I) == 1 + 2*I
  369. assert sqrt(32 + 24*I) == 6 + 2*I
  370. assert sqrt(32 - 24*I) == 6 - 2*I
  371. assert sqrt(-32 - 24*I) == 2 - 6*I
  372. assert sqrt(-32 + 24*I) == 2 + 6*I
  373. # triple (3, 4, 5):
  374. # parity of 3 matches parity of 5 and
  375. # den, 4, is a square
  376. assert sqrt((3 + 4*I)/4) == 1 + I/2
  377. # triple (8, 15, 17)
  378. # parity of 8 doesn't match parity of 17 but
  379. # den/2, 8/2, is a square
  380. assert sqrt((8 + 15*I)/8) == (5 + 3*I)/4
  381. # handle the denominator
  382. assert sqrt((3 - 4*I)/25) == (2 - I)/5
  383. assert sqrt((3 - 4*I)/26) == (2 - I)/sqrt(26)
  384. # mul
  385. # issue #12739
  386. assert sqrt((3 + 4*I)/(3 - 4*I)) == (3 + 4*I)/5
  387. assert sqrt(2/(3 + 4*I)) == sqrt(2)/5*(2 - I)
  388. assert sqrt(n/(3 + 4*I)).subs(n, 2) == sqrt(2)/5*(2 - I)
  389. assert sqrt(-2/(3 + 4*I)) == sqrt(2)/5*(1 + 2*I)
  390. assert sqrt(-n/(3 + 4*I)).subs(n, 2) == sqrt(2)/5*(1 + 2*I)
  391. # power
  392. assert sqrt(1/(3 + I*4)) == (2 - I)/5
  393. assert sqrt(1/(3 - I)) == sqrt(10)*sqrt(3 + I)/10
  394. # symbolic
  395. i = symbols('i', imaginary=True)
  396. assert sqrt(3/i) == Mul(sqrt(3), 1/sqrt(i), evaluate=False)
  397. # multiples of 1/2; don't make this too automatic
  398. assert sqrt(3 + 4*I)**3 == (2 + I)**3
  399. assert Pow(3 + 4*I, Rational(3, 2)) == 2 + 11*I
  400. assert Pow(6 + 8*I, Rational(3, 2)) == 2*sqrt(2)*(2 + 11*I)
  401. n, d = (3 + 4*I), (3 - 4*I)**3
  402. a = n/d
  403. assert a.args == (1/d, n)
  404. eq = sqrt(a)
  405. assert eq.args == (a, S.Half)
  406. assert expand_multinomial(eq) == sqrt((-117 + 44*I)*(3 + 4*I))/125
  407. assert eq.expand() == (7 - 24*I)/125
  408. # issue 12775
  409. # pos im part
  410. assert sqrt(2*I) == (1 + I)
  411. assert sqrt(2*9*I) == Mul(3, 1 + I, evaluate=False)
  412. assert Pow(2*I, 3*S.Half) == (1 + I)**3
  413. # neg im part
  414. assert sqrt(-I/2) == Mul(S.Half, 1 - I, evaluate=False)
  415. # fractional im part
  416. assert Pow(Rational(-9, 2)*I, Rational(3, 2)) == 27*(1 - I)**3/8
  417. def test_issue_2993():
  418. assert str((2.3*x - 4)**0.3) == '1.5157165665104*(0.575*x - 1)**0.3'
  419. assert str((2.3*x + 4)**0.3) == '1.5157165665104*(0.575*x + 1)**0.3'
  420. assert str((-2.3*x + 4)**0.3) == '1.5157165665104*(1 - 0.575*x)**0.3'
  421. assert str((-2.3*x - 4)**0.3) == '1.5157165665104*(-0.575*x - 1)**0.3'
  422. assert str((2.3*x - 2)**0.3) == '1.28386201800527*(x - 0.869565217391304)**0.3'
  423. assert str((-2.3*x - 2)**0.3) == '1.28386201800527*(-x - 0.869565217391304)**0.3'
  424. assert str((-2.3*x + 2)**0.3) == '1.28386201800527*(0.869565217391304 - x)**0.3'
  425. assert str((2.3*x + 2)**0.3) == '1.28386201800527*(x + 0.869565217391304)**0.3'
  426. assert str((2.3*x - 4)**Rational(1, 3)) == '2**(2/3)*(0.575*x - 1)**(1/3)'
  427. eq = (2.3*x + 4)
  428. assert eq**2 == 16*(0.575*x + 1)**2
  429. assert (1/eq).args == (eq, -1) # don't change trivial power
  430. # issue 17735
  431. q=.5*exp(x) - .5*exp(-x) + 0.1
  432. assert int((q**2).subs(x, 1)) == 1
  433. # issue 17756
  434. y = Symbol('y')
  435. assert len(sqrt(x/(x + y)**2 + Float('0.008', 30)).subs(y, pi.n(25)).atoms(Float)) == 2
  436. # issue 17756
  437. a, b, c, d, e, f, g = symbols('a:g')
  438. expr = sqrt(1 + a*(c**4 + g*d - 2*g*e - f*(-g + d))**2/
  439. (c**3*b**2*(d - 3*e + 2*f)**2))/2
  440. r = [
  441. (a, N('0.0170992456333788667034850458615', 30)),
  442. (b, N('0.0966594956075474769169134801223', 30)),
  443. (c, N('0.390911862903463913632151616184', 30)),
  444. (d, N('0.152812084558656566271750185933', 30)),
  445. (e, N('0.137562344465103337106561623432', 30)),
  446. (f, N('0.174259178881496659302933610355', 30)),
  447. (g, N('0.220745448491223779615401870086', 30))]
  448. tru = expr.n(30, subs=dict(r))
  449. seq = expr.subs(r)
  450. # although `tru` is the right way to evaluate
  451. # expr with numerical values, `seq` will have
  452. # significant loss of precision if extraction of
  453. # the largest coefficient of a power's base's terms
  454. # is done improperly
  455. assert seq == tru
  456. def test_issue_17450():
  457. assert (erf(cosh(1)**7)**I).is_real is None
  458. assert (erf(cosh(1)**7)**I).is_imaginary is False
  459. assert (Pow(exp(1+sqrt(2)), ((1-sqrt(2))*I*pi), evaluate=False)).is_real is None
  460. assert ((-10)**(10*I*pi/3)).is_real is False
  461. assert ((-5)**(4*I*pi)).is_real is False
  462. def test_issue_18190():
  463. assert sqrt(1 / tan(1 + I)) == 1 / sqrt(tan(1 + I))
  464. def test_issue_14815():
  465. x = Symbol('x', real=True)
  466. assert sqrt(x).is_extended_negative is False
  467. x = Symbol('x', real=False)
  468. assert sqrt(x).is_extended_negative is None
  469. x = Symbol('x', complex=True)
  470. assert sqrt(x).is_extended_negative is False
  471. x = Symbol('x', extended_real=True)
  472. assert sqrt(x).is_extended_negative is False
  473. assert sqrt(zoo, evaluate=False).is_extended_negative is None
  474. assert sqrt(nan, evaluate=False).is_extended_negative is None
  475. def test_issue_18509():
  476. x = Symbol('x', prime=True)
  477. assert x**oo is oo
  478. assert (1/x)**oo is S.Zero
  479. assert (-1/x)**oo is S.Zero
  480. assert (-x)**oo is zoo
  481. assert (-oo)**(-1 + I) is S.Zero
  482. assert (-oo)**(1 + I) is zoo
  483. assert (oo)**(-1 + I) is S.Zero
  484. assert (oo)**(1 + I) is zoo
  485. def test_issue_18762():
  486. e, p = symbols('e p')
  487. g0 = sqrt(1 + e**2 - 2*e*cos(p))
  488. assert len(g0.series(e, 1, 3).args) == 4
  489. def test_issue_21860():
  490. e = 3*2**Rational(66666666667,200000000000)*3**Rational(16666666667,50000000000)*x**Rational(66666666667, 200000000000)
  491. ans = Mul(Rational(3, 2),
  492. Pow(Integer(2), Rational(33333333333, 100000000000)),
  493. Pow(Integer(3), Rational(26666666667, 40000000000)))
  494. assert e.xreplace({x: Rational(3,8)}) == ans
  495. def test_issue_21647():
  496. e = log((Integer(567)/500)**(811*(Integer(567)/500)**x/100))
  497. ans = log(Mul(Rational(64701150190720499096094005280169087619821081527,
  498. 76293945312500000000000000000000000000000000000),
  499. Pow(Integer(2), Rational(396204892125479941, 781250000000000000)),
  500. Pow(Integer(3), Rational(385045107874520059, 390625000000000000)),
  501. Pow(Integer(5), Rational(407364676376439823, 1562500000000000000)),
  502. Pow(Integer(7), Rational(385045107874520059, 1562500000000000000))))
  503. assert e.xreplace({x: 6}) == ans
  504. def test_issue_21762():
  505. e = (x**2 + 6)**(Integer(33333333333333333)/50000000000000000)
  506. ans = Mul(Rational(5, 4),
  507. Pow(Integer(2), Rational(16666666666666667, 25000000000000000)),
  508. Pow(Integer(5), Rational(8333333333333333, 25000000000000000)))
  509. assert e.xreplace({x: S.Half}) == ans
  510. def test_issue_14704():
  511. a = 144**144
  512. x, xexact = integer_nthroot(a,a)
  513. assert x == 1 and xexact is False
  514. def test_rational_powers_larger_than_one():
  515. assert Rational(2, 3)**Rational(3, 2) == 2*sqrt(6)/9
  516. assert Rational(1, 6)**Rational(9, 4) == 6**Rational(3, 4)/216
  517. assert Rational(3, 7)**Rational(7, 3) == 9*3**Rational(1, 3)*7**Rational(2, 3)/343
  518. def test_power_dispatcher():
  519. class NewBase(Expr):
  520. pass
  521. class NewPow(NewBase, Pow):
  522. pass
  523. a, b = Symbol('a'), NewBase()
  524. @power.register(Expr, NewBase)
  525. @power.register(NewBase, Expr)
  526. @power.register(NewBase, NewBase)
  527. def _(a, b):
  528. return NewPow(a, b)
  529. # Pow called as fallback
  530. assert power(2, 3) == 8*S.One
  531. assert power(a, 2) == Pow(a, 2)
  532. assert power(a, a) == Pow(a, a)
  533. # NewPow called by dispatch
  534. assert power(a, b) == NewPow(a, b)
  535. assert power(b, a) == NewPow(b, a)
  536. assert power(b, b) == NewPow(b, b)
  537. def test_powers_of_I():
  538. assert [sqrt(I)**i for i in range(13)] == [
  539. 1, sqrt(I), I, sqrt(I)**3, -1, -sqrt(I), -I, -sqrt(I)**3,
  540. 1, sqrt(I), I, sqrt(I)**3, -1]
  541. assert sqrt(I)**(S(9)/2) == -I**(S(1)/4)
  542. def test_issue_23918():
  543. b = S(2)/3
  544. assert (b**x).as_base_exp() == (1/b, -x)