test_complexes.py 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018
  1. from sympy.core.expr import Expr
  2. from sympy.core.function import (Derivative, Function, Lambda, expand)
  3. from sympy.core.numbers import (E, I, Rational, comp, nan, oo, pi, zoo)
  4. from sympy.core.relational import Eq
  5. from sympy.core.singleton import S
  6. from sympy.core.symbol import (Symbol, symbols)
  7. from sympy.functions.elementary.complexes import (Abs, adjoint, arg, conjugate, im, re, sign, transpose)
  8. from sympy.functions.elementary.exponential import (exp, exp_polar, log)
  9. from sympy.functions.elementary.miscellaneous import sqrt
  10. from sympy.functions.elementary.piecewise import Piecewise
  11. from sympy.functions.elementary.trigonometric import (acos, atan, atan2, cos, sin)
  12. from sympy.functions.special.delta_functions import (DiracDelta, Heaviside)
  13. from sympy.integrals.integrals import Integral
  14. from sympy.matrices.dense import Matrix
  15. from sympy.matrices.expressions.funcmatrix import FunctionMatrix
  16. from sympy.matrices.expressions.matexpr import MatrixSymbol
  17. from sympy.matrices.immutable import (ImmutableMatrix, ImmutableSparseMatrix)
  18. from sympy.matrices import SparseMatrix
  19. from sympy.sets.sets import Interval
  20. from sympy.core.expr import unchanged
  21. from sympy.core.function import ArgumentIndexError
  22. from sympy.testing.pytest import XFAIL, raises, _both_exp_pow
  23. def N_equals(a, b):
  24. """Check whether two complex numbers are numerically close"""
  25. return comp(a.n(), b.n(), 1.e-6)
  26. def test_re():
  27. x, y = symbols('x,y')
  28. a, b = symbols('a,b', real=True)
  29. r = Symbol('r', real=True)
  30. i = Symbol('i', imaginary=True)
  31. assert re(nan) is nan
  32. assert re(oo) is oo
  33. assert re(-oo) is -oo
  34. assert re(0) == 0
  35. assert re(1) == 1
  36. assert re(-1) == -1
  37. assert re(E) == E
  38. assert re(-E) == -E
  39. assert unchanged(re, x)
  40. assert re(x*I) == -im(x)
  41. assert re(r*I) == 0
  42. assert re(r) == r
  43. assert re(i*I) == I * i
  44. assert re(i) == 0
  45. assert re(x + y) == re(x) + re(y)
  46. assert re(x + r) == re(x) + r
  47. assert re(re(x)) == re(x)
  48. assert re(2 + I) == 2
  49. assert re(x + I) == re(x)
  50. assert re(x + y*I) == re(x) - im(y)
  51. assert re(x + r*I) == re(x)
  52. assert re(log(2*I)) == log(2)
  53. assert re((2 + I)**2).expand(complex=True) == 3
  54. assert re(conjugate(x)) == re(x)
  55. assert conjugate(re(x)) == re(x)
  56. assert re(x).as_real_imag() == (re(x), 0)
  57. assert re(i*r*x).diff(r) == re(i*x)
  58. assert re(i*r*x).diff(i) == I*r*im(x)
  59. assert re(
  60. sqrt(a + b*I)) == (a**2 + b**2)**Rational(1, 4)*cos(atan2(b, a)/2)
  61. assert re(a * (2 + b*I)) == 2*a
  62. assert re((1 + sqrt(a + b*I))/2) == \
  63. (a**2 + b**2)**Rational(1, 4)*cos(atan2(b, a)/2)/2 + S.Half
  64. assert re(x).rewrite(im) == x - S.ImaginaryUnit*im(x)
  65. assert (x + re(y)).rewrite(re, im) == x + y - S.ImaginaryUnit*im(y)
  66. a = Symbol('a', algebraic=True)
  67. t = Symbol('t', transcendental=True)
  68. x = Symbol('x')
  69. assert re(a).is_algebraic
  70. assert re(x).is_algebraic is None
  71. assert re(t).is_algebraic is False
  72. assert re(S.ComplexInfinity) is S.NaN
  73. n, m, l = symbols('n m l')
  74. A = MatrixSymbol('A',n,m)
  75. assert re(A) == (S.Half) * (A + conjugate(A))
  76. A = Matrix([[1 + 4*I,2],[0, -3*I]])
  77. assert re(A) == Matrix([[1, 2],[0, 0]])
  78. A = ImmutableMatrix([[1 + 3*I, 3-2*I],[0, 2*I]])
  79. assert re(A) == ImmutableMatrix([[1, 3],[0, 0]])
  80. X = SparseMatrix([[2*j + i*I for i in range(5)] for j in range(5)])
  81. assert re(X) - Matrix([[0, 0, 0, 0, 0],
  82. [2, 2, 2, 2, 2],
  83. [4, 4, 4, 4, 4],
  84. [6, 6, 6, 6, 6],
  85. [8, 8, 8, 8, 8]]) == Matrix.zeros(5)
  86. assert im(X) - Matrix([[0, 1, 2, 3, 4],
  87. [0, 1, 2, 3, 4],
  88. [0, 1, 2, 3, 4],
  89. [0, 1, 2, 3, 4],
  90. [0, 1, 2, 3, 4]]) == Matrix.zeros(5)
  91. X = FunctionMatrix(3, 3, Lambda((n, m), n + m*I))
  92. assert re(X) == Matrix([[0, 0, 0], [1, 1, 1], [2, 2, 2]])
  93. def test_im():
  94. x, y = symbols('x,y')
  95. a, b = symbols('a,b', real=True)
  96. r = Symbol('r', real=True)
  97. i = Symbol('i', imaginary=True)
  98. assert im(nan) is nan
  99. assert im(oo*I) is oo
  100. assert im(-oo*I) is -oo
  101. assert im(0) == 0
  102. assert im(1) == 0
  103. assert im(-1) == 0
  104. assert im(E*I) == E
  105. assert im(-E*I) == -E
  106. assert unchanged(im, x)
  107. assert im(x*I) == re(x)
  108. assert im(r*I) == r
  109. assert im(r) == 0
  110. assert im(i*I) == 0
  111. assert im(i) == -I * i
  112. assert im(x + y) == im(x) + im(y)
  113. assert im(x + r) == im(x)
  114. assert im(x + r*I) == im(x) + r
  115. assert im(im(x)*I) == im(x)
  116. assert im(2 + I) == 1
  117. assert im(x + I) == im(x) + 1
  118. assert im(x + y*I) == im(x) + re(y)
  119. assert im(x + r*I) == im(x) + r
  120. assert im(log(2*I)) == pi/2
  121. assert im((2 + I)**2).expand(complex=True) == 4
  122. assert im(conjugate(x)) == -im(x)
  123. assert conjugate(im(x)) == im(x)
  124. assert im(x).as_real_imag() == (im(x), 0)
  125. assert im(i*r*x).diff(r) == im(i*x)
  126. assert im(i*r*x).diff(i) == -I * re(r*x)
  127. assert im(
  128. sqrt(a + b*I)) == (a**2 + b**2)**Rational(1, 4)*sin(atan2(b, a)/2)
  129. assert im(a * (2 + b*I)) == a*b
  130. assert im((1 + sqrt(a + b*I))/2) == \
  131. (a**2 + b**2)**Rational(1, 4)*sin(atan2(b, a)/2)/2
  132. assert im(x).rewrite(re) == -S.ImaginaryUnit * (x - re(x))
  133. assert (x + im(y)).rewrite(im, re) == x - S.ImaginaryUnit * (y - re(y))
  134. a = Symbol('a', algebraic=True)
  135. t = Symbol('t', transcendental=True)
  136. x = Symbol('x')
  137. assert re(a).is_algebraic
  138. assert re(x).is_algebraic is None
  139. assert re(t).is_algebraic is False
  140. assert im(S.ComplexInfinity) is S.NaN
  141. n, m, l = symbols('n m l')
  142. A = MatrixSymbol('A',n,m)
  143. assert im(A) == (S.One/(2*I)) * (A - conjugate(A))
  144. A = Matrix([[1 + 4*I, 2],[0, -3*I]])
  145. assert im(A) == Matrix([[4, 0],[0, -3]])
  146. A = ImmutableMatrix([[1 + 3*I, 3-2*I],[0, 2*I]])
  147. assert im(A) == ImmutableMatrix([[3, -2],[0, 2]])
  148. X = ImmutableSparseMatrix(
  149. [[i*I + i for i in range(5)] for i in range(5)])
  150. Y = SparseMatrix([list(range(5)) for i in range(5)])
  151. assert im(X).as_immutable() == Y
  152. X = FunctionMatrix(3, 3, Lambda((n, m), n + m*I))
  153. assert im(X) == Matrix([[0, 1, 2], [0, 1, 2], [0, 1, 2]])
  154. def test_sign():
  155. assert sign(1.2) == 1
  156. assert sign(-1.2) == -1
  157. assert sign(3*I) == I
  158. assert sign(-3*I) == -I
  159. assert sign(0) == 0
  160. assert sign(0, evaluate=False).doit() == 0
  161. assert sign(oo, evaluate=False).doit() == 1
  162. assert sign(nan) is nan
  163. assert sign(2 + 2*I).doit() == sqrt(2)*(2 + 2*I)/4
  164. assert sign(2 + 3*I).simplify() == sign(2 + 3*I)
  165. assert sign(2 + 2*I).simplify() == sign(1 + I)
  166. assert sign(im(sqrt(1 - sqrt(3)))) == 1
  167. assert sign(sqrt(1 - sqrt(3))) == I
  168. x = Symbol('x')
  169. assert sign(x).is_finite is True
  170. assert sign(x).is_complex is True
  171. assert sign(x).is_imaginary is None
  172. assert sign(x).is_integer is None
  173. assert sign(x).is_real is None
  174. assert sign(x).is_zero is None
  175. assert sign(x).doit() == sign(x)
  176. assert sign(1.2*x) == sign(x)
  177. assert sign(2*x) == sign(x)
  178. assert sign(I*x) == I*sign(x)
  179. assert sign(-2*I*x) == -I*sign(x)
  180. assert sign(conjugate(x)) == conjugate(sign(x))
  181. p = Symbol('p', positive=True)
  182. n = Symbol('n', negative=True)
  183. m = Symbol('m', negative=True)
  184. assert sign(2*p*x) == sign(x)
  185. assert sign(n*x) == -sign(x)
  186. assert sign(n*m*x) == sign(x)
  187. x = Symbol('x', imaginary=True)
  188. assert sign(x).is_imaginary is True
  189. assert sign(x).is_integer is False
  190. assert sign(x).is_real is False
  191. assert sign(x).is_zero is False
  192. assert sign(x).diff(x) == 2*DiracDelta(-I*x)
  193. assert sign(x).doit() == x / Abs(x)
  194. assert conjugate(sign(x)) == -sign(x)
  195. x = Symbol('x', real=True)
  196. assert sign(x).is_imaginary is False
  197. assert sign(x).is_integer is True
  198. assert sign(x).is_real is True
  199. assert sign(x).is_zero is None
  200. assert sign(x).diff(x) == 2*DiracDelta(x)
  201. assert sign(x).doit() == sign(x)
  202. assert conjugate(sign(x)) == sign(x)
  203. x = Symbol('x', nonzero=True)
  204. assert sign(x).is_imaginary is False
  205. assert sign(x).is_integer is True
  206. assert sign(x).is_real is True
  207. assert sign(x).is_zero is False
  208. assert sign(x).doit() == x / Abs(x)
  209. assert sign(Abs(x)) == 1
  210. assert Abs(sign(x)) == 1
  211. x = Symbol('x', positive=True)
  212. assert sign(x).is_imaginary is False
  213. assert sign(x).is_integer is True
  214. assert sign(x).is_real is True
  215. assert sign(x).is_zero is False
  216. assert sign(x).doit() == x / Abs(x)
  217. assert sign(Abs(x)) == 1
  218. assert Abs(sign(x)) == 1
  219. x = 0
  220. assert sign(x).is_imaginary is False
  221. assert sign(x).is_integer is True
  222. assert sign(x).is_real is True
  223. assert sign(x).is_zero is True
  224. assert sign(x).doit() == 0
  225. assert sign(Abs(x)) == 0
  226. assert Abs(sign(x)) == 0
  227. nz = Symbol('nz', nonzero=True, integer=True)
  228. assert sign(nz).is_imaginary is False
  229. assert sign(nz).is_integer is True
  230. assert sign(nz).is_real is True
  231. assert sign(nz).is_zero is False
  232. assert sign(nz)**2 == 1
  233. assert (sign(nz)**3).args == (sign(nz), 3)
  234. assert sign(Symbol('x', nonnegative=True)).is_nonnegative
  235. assert sign(Symbol('x', nonnegative=True)).is_nonpositive is None
  236. assert sign(Symbol('x', nonpositive=True)).is_nonnegative is None
  237. assert sign(Symbol('x', nonpositive=True)).is_nonpositive
  238. assert sign(Symbol('x', real=True)).is_nonnegative is None
  239. assert sign(Symbol('x', real=True)).is_nonpositive is None
  240. assert sign(Symbol('x', real=True, zero=False)).is_nonpositive is None
  241. x, y = Symbol('x', real=True), Symbol('y')
  242. f = Function('f')
  243. assert sign(x).rewrite(Piecewise) == \
  244. Piecewise((1, x > 0), (-1, x < 0), (0, True))
  245. assert sign(y).rewrite(Piecewise) == sign(y)
  246. assert sign(x).rewrite(Heaviside) == 2*Heaviside(x, H0=S(1)/2) - 1
  247. assert sign(y).rewrite(Heaviside) == sign(y)
  248. assert sign(y).rewrite(Abs) == Piecewise((0, Eq(y, 0)), (y/Abs(y), True))
  249. assert sign(f(y)).rewrite(Abs) == Piecewise((0, Eq(f(y), 0)), (f(y)/Abs(f(y)), True))
  250. # evaluate what can be evaluated
  251. assert sign(exp_polar(I*pi)*pi) is S.NegativeOne
  252. eq = -sqrt(10 + 6*sqrt(3)) + sqrt(1 + sqrt(3)) + sqrt(3 + 3*sqrt(3))
  253. # if there is a fast way to know when and when you cannot prove an
  254. # expression like this is zero then the equality to zero is ok
  255. assert sign(eq).func is sign or sign(eq) == 0
  256. # but sometimes it's hard to do this so it's better not to load
  257. # abs down with tests that will be very slow
  258. q = 1 + sqrt(2) - 2*sqrt(3) + 1331*sqrt(6)
  259. p = expand(q**3)**Rational(1, 3)
  260. d = p - q
  261. assert sign(d).func is sign or sign(d) == 0
  262. def test_as_real_imag():
  263. n = pi**1000
  264. # the special code for working out the real
  265. # and complex parts of a power with Integer exponent
  266. # should not run if there is no imaginary part, hence
  267. # this should not hang
  268. assert n.as_real_imag() == (n, 0)
  269. # issue 6261
  270. x = Symbol('x')
  271. assert sqrt(x).as_real_imag() == \
  272. ((re(x)**2 + im(x)**2)**Rational(1, 4)*cos(atan2(im(x), re(x))/2),
  273. (re(x)**2 + im(x)**2)**Rational(1, 4)*sin(atan2(im(x), re(x))/2))
  274. # issue 3853
  275. a, b = symbols('a,b', real=True)
  276. assert ((1 + sqrt(a + b*I))/2).as_real_imag() == \
  277. (
  278. (a**2 + b**2)**Rational(
  279. 1, 4)*cos(atan2(b, a)/2)/2 + S.Half,
  280. (a**2 + b**2)**Rational(1, 4)*sin(atan2(b, a)/2)/2)
  281. assert sqrt(a**2).as_real_imag() == (sqrt(a**2), 0)
  282. i = symbols('i', imaginary=True)
  283. assert sqrt(i**2).as_real_imag() == (0, abs(i))
  284. assert ((1 + I)/(1 - I)).as_real_imag() == (0, 1)
  285. assert ((1 + I)**3/(1 - I)).as_real_imag() == (-2, 0)
  286. @XFAIL
  287. def test_sign_issue_3068():
  288. n = pi**1000
  289. i = int(n)
  290. x = Symbol('x')
  291. assert (n - i).round() == 1 # doesn't hang
  292. assert sign(n - i) == 1
  293. # perhaps it's not possible to get the sign right when
  294. # only 1 digit is being requested for this situation;
  295. # 2 digits works
  296. assert (n - x).n(1, subs={x: i}) > 0
  297. assert (n - x).n(2, subs={x: i}) > 0
  298. def test_Abs():
  299. raises(TypeError, lambda: Abs(Interval(2, 3))) # issue 8717
  300. x, y = symbols('x,y')
  301. assert sign(sign(x)) == sign(x)
  302. assert sign(x*y).func is sign
  303. assert Abs(0) == 0
  304. assert Abs(1) == 1
  305. assert Abs(-1) == 1
  306. assert Abs(I) == 1
  307. assert Abs(-I) == 1
  308. assert Abs(nan) is nan
  309. assert Abs(zoo) is oo
  310. assert Abs(I * pi) == pi
  311. assert Abs(-I * pi) == pi
  312. assert Abs(I * x) == Abs(x)
  313. assert Abs(-I * x) == Abs(x)
  314. assert Abs(-2*x) == 2*Abs(x)
  315. assert Abs(-2.0*x) == 2.0*Abs(x)
  316. assert Abs(2*pi*x*y) == 2*pi*Abs(x*y)
  317. assert Abs(conjugate(x)) == Abs(x)
  318. assert conjugate(Abs(x)) == Abs(x)
  319. assert Abs(x).expand(complex=True) == sqrt(re(x)**2 + im(x)**2)
  320. a = Symbol('a', positive=True)
  321. assert Abs(2*pi*x*a) == 2*pi*a*Abs(x)
  322. assert Abs(2*pi*I*x*a) == 2*pi*a*Abs(x)
  323. x = Symbol('x', real=True)
  324. n = Symbol('n', integer=True)
  325. assert Abs((-1)**n) == 1
  326. assert x**(2*n) == Abs(x)**(2*n)
  327. assert Abs(x).diff(x) == sign(x)
  328. assert abs(x) == Abs(x) # Python built-in
  329. assert Abs(x)**3 == x**2*Abs(x)
  330. assert Abs(x)**4 == x**4
  331. assert (
  332. Abs(x)**(3*n)).args == (Abs(x), 3*n) # leave symbolic odd unchanged
  333. assert (1/Abs(x)).args == (Abs(x), -1)
  334. assert 1/Abs(x)**3 == 1/(x**2*Abs(x))
  335. assert Abs(x)**-3 == Abs(x)/(x**4)
  336. assert Abs(x**3) == x**2*Abs(x)
  337. assert Abs(I**I) == exp(-pi/2)
  338. assert Abs((4 + 5*I)**(6 + 7*I)) == 68921*exp(-7*atan(Rational(5, 4)))
  339. y = Symbol('y', real=True)
  340. assert Abs(I**y) == 1
  341. y = Symbol('y')
  342. assert Abs(I**y) == exp(-pi*im(y)/2)
  343. x = Symbol('x', imaginary=True)
  344. assert Abs(x).diff(x) == -sign(x)
  345. eq = -sqrt(10 + 6*sqrt(3)) + sqrt(1 + sqrt(3)) + sqrt(3 + 3*sqrt(3))
  346. # if there is a fast way to know when you can and when you cannot prove an
  347. # expression like this is zero then the equality to zero is ok
  348. assert abs(eq).func is Abs or abs(eq) == 0
  349. # but sometimes it's hard to do this so it's better not to load
  350. # abs down with tests that will be very slow
  351. q = 1 + sqrt(2) - 2*sqrt(3) + 1331*sqrt(6)
  352. p = expand(q**3)**Rational(1, 3)
  353. d = p - q
  354. assert abs(d).func is Abs or abs(d) == 0
  355. assert Abs(4*exp(pi*I/4)) == 4
  356. assert Abs(3**(2 + I)) == 9
  357. assert Abs((-3)**(1 - I)) == 3*exp(pi)
  358. assert Abs(oo) is oo
  359. assert Abs(-oo) is oo
  360. assert Abs(oo + I) is oo
  361. assert Abs(oo + I*oo) is oo
  362. a = Symbol('a', algebraic=True)
  363. t = Symbol('t', transcendental=True)
  364. x = Symbol('x')
  365. assert re(a).is_algebraic
  366. assert re(x).is_algebraic is None
  367. assert re(t).is_algebraic is False
  368. assert Abs(x).fdiff() == sign(x)
  369. raises(ArgumentIndexError, lambda: Abs(x).fdiff(2))
  370. # doesn't have recursion error
  371. arg = sqrt(acos(1 - I)*acos(1 + I))
  372. assert abs(arg) == arg
  373. # special handling to put Abs in denom
  374. assert abs(1/x) == 1/Abs(x)
  375. e = abs(2/x**2)
  376. assert e.is_Mul and e == 2/Abs(x**2)
  377. assert unchanged(Abs, y/x)
  378. assert unchanged(Abs, x/(x + 1))
  379. assert unchanged(Abs, x*y)
  380. p = Symbol('p', positive=True)
  381. assert abs(x/p) == abs(x)/p
  382. # coverage
  383. assert unchanged(Abs, Symbol('x', real=True)**y)
  384. # issue 19627
  385. f = Function('f', positive=True)
  386. assert sqrt(f(x)**2) == f(x)
  387. # issue 21625
  388. assert unchanged(Abs, S("im(acos(-i + acosh(-g + i)))"))
  389. def test_Abs_rewrite():
  390. x = Symbol('x', real=True)
  391. a = Abs(x).rewrite(Heaviside).expand()
  392. assert a == x*Heaviside(x) - x*Heaviside(-x)
  393. for i in [-2, -1, 0, 1, 2]:
  394. assert a.subs(x, i) == abs(i)
  395. y = Symbol('y')
  396. assert Abs(y).rewrite(Heaviside) == Abs(y)
  397. x, y = Symbol('x', real=True), Symbol('y')
  398. assert Abs(x).rewrite(Piecewise) == Piecewise((x, x >= 0), (-x, True))
  399. assert Abs(y).rewrite(Piecewise) == Abs(y)
  400. assert Abs(y).rewrite(sign) == y/sign(y)
  401. i = Symbol('i', imaginary=True)
  402. assert abs(i).rewrite(Piecewise) == Piecewise((I*i, I*i >= 0), (-I*i, True))
  403. assert Abs(y).rewrite(conjugate) == sqrt(y*conjugate(y))
  404. assert Abs(i).rewrite(conjugate) == sqrt(-i**2) # == -I*i
  405. y = Symbol('y', extended_real=True)
  406. assert (Abs(exp(-I*x)-exp(-I*y))**2).rewrite(conjugate) == \
  407. -exp(I*x)*exp(-I*y) + 2 - exp(-I*x)*exp(I*y)
  408. def test_Abs_real():
  409. # test some properties of abs that only apply
  410. # to real numbers
  411. x = Symbol('x', complex=True)
  412. assert sqrt(x**2) != Abs(x)
  413. assert Abs(x**2) != x**2
  414. x = Symbol('x', real=True)
  415. assert sqrt(x**2) == Abs(x)
  416. assert Abs(x**2) == x**2
  417. # if the symbol is zero, the following will still apply
  418. nn = Symbol('nn', nonnegative=True, real=True)
  419. np = Symbol('np', nonpositive=True, real=True)
  420. assert Abs(nn) == nn
  421. assert Abs(np) == -np
  422. def test_Abs_properties():
  423. x = Symbol('x')
  424. assert Abs(x).is_real is None
  425. assert Abs(x).is_extended_real is True
  426. assert Abs(x).is_rational is None
  427. assert Abs(x).is_positive is None
  428. assert Abs(x).is_nonnegative is None
  429. assert Abs(x).is_extended_positive is None
  430. assert Abs(x).is_extended_nonnegative is True
  431. f = Symbol('x', finite=True)
  432. assert Abs(f).is_real is True
  433. assert Abs(f).is_extended_real is True
  434. assert Abs(f).is_rational is None
  435. assert Abs(f).is_positive is None
  436. assert Abs(f).is_nonnegative is True
  437. assert Abs(f).is_extended_positive is None
  438. assert Abs(f).is_extended_nonnegative is True
  439. z = Symbol('z', complex=True, zero=False)
  440. assert Abs(z).is_real is True # since complex implies finite
  441. assert Abs(z).is_extended_real is True
  442. assert Abs(z).is_rational is None
  443. assert Abs(z).is_positive is True
  444. assert Abs(z).is_extended_positive is True
  445. assert Abs(z).is_zero is False
  446. p = Symbol('p', positive=True)
  447. assert Abs(p).is_real is True
  448. assert Abs(p).is_extended_real is True
  449. assert Abs(p).is_rational is None
  450. assert Abs(p).is_positive is True
  451. assert Abs(p).is_zero is False
  452. q = Symbol('q', rational=True)
  453. assert Abs(q).is_real is True
  454. assert Abs(q).is_rational is True
  455. assert Abs(q).is_integer is None
  456. assert Abs(q).is_positive is None
  457. assert Abs(q).is_nonnegative is True
  458. i = Symbol('i', integer=True)
  459. assert Abs(i).is_real is True
  460. assert Abs(i).is_integer is True
  461. assert Abs(i).is_positive is None
  462. assert Abs(i).is_nonnegative is True
  463. e = Symbol('n', even=True)
  464. ne = Symbol('ne', real=True, even=False)
  465. assert Abs(e).is_even is True
  466. assert Abs(ne).is_even is False
  467. assert Abs(i).is_even is None
  468. o = Symbol('n', odd=True)
  469. no = Symbol('no', real=True, odd=False)
  470. assert Abs(o).is_odd is True
  471. assert Abs(no).is_odd is False
  472. assert Abs(i).is_odd is None
  473. def test_abs():
  474. # this tests that abs calls Abs; don't rename to
  475. # test_Abs since that test is already above
  476. a = Symbol('a', positive=True)
  477. assert abs(I*(1 + a)**2) == (1 + a)**2
  478. def test_arg():
  479. assert arg(0) is nan
  480. assert arg(1) == 0
  481. assert arg(-1) == pi
  482. assert arg(I) == pi/2
  483. assert arg(-I) == -pi/2
  484. assert arg(1 + I) == pi/4
  485. assert arg(-1 + I) == pi*Rational(3, 4)
  486. assert arg(1 - I) == -pi/4
  487. assert arg(exp_polar(4*pi*I)) == 4*pi
  488. assert arg(exp_polar(-7*pi*I)) == -7*pi
  489. assert arg(exp_polar(5 - 3*pi*I/4)) == pi*Rational(-3, 4)
  490. f = Function('f')
  491. assert not arg(f(0) + I*f(1)).atoms(re)
  492. # check nesting
  493. x = Symbol('x')
  494. assert arg(arg(arg(x))) is not S.NaN
  495. assert arg(arg(arg(arg(x)))) is S.NaN
  496. r = Symbol('r', extended_real=True)
  497. assert arg(arg(r)) is not S.NaN
  498. assert arg(arg(arg(r))) is S.NaN
  499. p = Function('p', extended_positive=True)
  500. assert arg(p(x)) == 0
  501. assert arg((3 + I)*p(x)) == arg(3 + I)
  502. p = Symbol('p', positive=True)
  503. assert arg(p) == 0
  504. assert arg(p*I) == pi/2
  505. n = Symbol('n', negative=True)
  506. assert arg(n) == pi
  507. assert arg(n*I) == -pi/2
  508. x = Symbol('x')
  509. assert conjugate(arg(x)) == arg(x)
  510. e = p + I*p**2
  511. assert arg(e) == arg(1 + p*I)
  512. # make sure sign doesn't swap
  513. e = -2*p + 4*I*p**2
  514. assert arg(e) == arg(-1 + 2*p*I)
  515. # make sure sign isn't lost
  516. x = symbols('x', real=True) # could be zero
  517. e = x + I*x
  518. assert arg(e) == arg(x*(1 + I))
  519. assert arg(e/p) == arg(x*(1 + I))
  520. e = p*cos(p) + I*log(p)*exp(p)
  521. assert arg(e).args[0] == e
  522. # keep it simple -- let the user do more advanced cancellation
  523. e = (p + 1) + I*(p**2 - 1)
  524. assert arg(e).args[0] == e
  525. f = Function('f')
  526. e = 2*x*(f(0) - 1) - 2*x*f(0)
  527. assert arg(e) == arg(-2*x)
  528. assert arg(f(0)).func == arg and arg(f(0)).args == (f(0),)
  529. def test_arg_rewrite():
  530. assert arg(1 + I) == atan2(1, 1)
  531. x = Symbol('x', real=True)
  532. y = Symbol('y', real=True)
  533. assert arg(x + I*y).rewrite(atan2) == atan2(y, x)
  534. def test_adjoint():
  535. a = Symbol('a', antihermitian=True)
  536. b = Symbol('b', hermitian=True)
  537. assert adjoint(a) == -a
  538. assert adjoint(I*a) == I*a
  539. assert adjoint(b) == b
  540. assert adjoint(I*b) == -I*b
  541. assert adjoint(a*b) == -b*a
  542. assert adjoint(I*a*b) == I*b*a
  543. x, y = symbols('x y')
  544. assert adjoint(adjoint(x)) == x
  545. assert adjoint(x + y) == adjoint(x) + adjoint(y)
  546. assert adjoint(x - y) == adjoint(x) - adjoint(y)
  547. assert adjoint(x * y) == adjoint(x) * adjoint(y)
  548. assert adjoint(x / y) == adjoint(x) / adjoint(y)
  549. assert adjoint(-x) == -adjoint(x)
  550. x, y = symbols('x y', commutative=False)
  551. assert adjoint(adjoint(x)) == x
  552. assert adjoint(x + y) == adjoint(x) + adjoint(y)
  553. assert adjoint(x - y) == adjoint(x) - adjoint(y)
  554. assert adjoint(x * y) == adjoint(y) * adjoint(x)
  555. assert adjoint(x / y) == 1 / adjoint(y) * adjoint(x)
  556. assert adjoint(-x) == -adjoint(x)
  557. def test_conjugate():
  558. a = Symbol('a', real=True)
  559. b = Symbol('b', imaginary=True)
  560. assert conjugate(a) == a
  561. assert conjugate(I*a) == -I*a
  562. assert conjugate(b) == -b
  563. assert conjugate(I*b) == I*b
  564. assert conjugate(a*b) == -a*b
  565. assert conjugate(I*a*b) == I*a*b
  566. x, y = symbols('x y')
  567. assert conjugate(conjugate(x)) == x
  568. assert conjugate(x).inverse() == conjugate
  569. assert conjugate(x + y) == conjugate(x) + conjugate(y)
  570. assert conjugate(x - y) == conjugate(x) - conjugate(y)
  571. assert conjugate(x * y) == conjugate(x) * conjugate(y)
  572. assert conjugate(x / y) == conjugate(x) / conjugate(y)
  573. assert conjugate(-x) == -conjugate(x)
  574. a = Symbol('a', algebraic=True)
  575. t = Symbol('t', transcendental=True)
  576. assert re(a).is_algebraic
  577. assert re(x).is_algebraic is None
  578. assert re(t).is_algebraic is False
  579. def test_conjugate_transpose():
  580. x = Symbol('x')
  581. assert conjugate(transpose(x)) == adjoint(x)
  582. assert transpose(conjugate(x)) == adjoint(x)
  583. assert adjoint(transpose(x)) == conjugate(x)
  584. assert transpose(adjoint(x)) == conjugate(x)
  585. assert adjoint(conjugate(x)) == transpose(x)
  586. assert conjugate(adjoint(x)) == transpose(x)
  587. class Symmetric(Expr):
  588. def _eval_adjoint(self):
  589. return None
  590. def _eval_conjugate(self):
  591. return None
  592. def _eval_transpose(self):
  593. return self
  594. x = Symmetric()
  595. assert conjugate(x) == adjoint(x)
  596. assert transpose(x) == x
  597. def test_transpose():
  598. a = Symbol('a', complex=True)
  599. assert transpose(a) == a
  600. assert transpose(I*a) == I*a
  601. x, y = symbols('x y')
  602. assert transpose(transpose(x)) == x
  603. assert transpose(x + y) == transpose(x) + transpose(y)
  604. assert transpose(x - y) == transpose(x) - transpose(y)
  605. assert transpose(x * y) == transpose(x) * transpose(y)
  606. assert transpose(x / y) == transpose(x) / transpose(y)
  607. assert transpose(-x) == -transpose(x)
  608. x, y = symbols('x y', commutative=False)
  609. assert transpose(transpose(x)) == x
  610. assert transpose(x + y) == transpose(x) + transpose(y)
  611. assert transpose(x - y) == transpose(x) - transpose(y)
  612. assert transpose(x * y) == transpose(y) * transpose(x)
  613. assert transpose(x / y) == 1 / transpose(y) * transpose(x)
  614. assert transpose(-x) == -transpose(x)
  615. @_both_exp_pow
  616. def test_polarify():
  617. from sympy.functions.elementary.complexes import (polar_lift, polarify)
  618. x = Symbol('x')
  619. z = Symbol('z', polar=True)
  620. f = Function('f')
  621. ES = {}
  622. assert polarify(-1) == (polar_lift(-1), ES)
  623. assert polarify(1 + I) == (polar_lift(1 + I), ES)
  624. assert polarify(exp(x), subs=False) == exp(x)
  625. assert polarify(1 + x, subs=False) == 1 + x
  626. assert polarify(f(I) + x, subs=False) == f(polar_lift(I)) + x
  627. assert polarify(x, lift=True) == polar_lift(x)
  628. assert polarify(z, lift=True) == z
  629. assert polarify(f(x), lift=True) == f(polar_lift(x))
  630. assert polarify(1 + x, lift=True) == polar_lift(1 + x)
  631. assert polarify(1 + f(x), lift=True) == polar_lift(1 + f(polar_lift(x)))
  632. newex, subs = polarify(f(x) + z)
  633. assert newex.subs(subs) == f(x) + z
  634. mu = Symbol("mu")
  635. sigma = Symbol("sigma", positive=True)
  636. # Make sure polarify(lift=True) doesn't try to lift the integration
  637. # variable
  638. assert polarify(
  639. Integral(sqrt(2)*x*exp(-(-mu + x)**2/(2*sigma**2))/(2*sqrt(pi)*sigma),
  640. (x, -oo, oo)), lift=True) == Integral(sqrt(2)*(sigma*exp_polar(0))**exp_polar(I*pi)*
  641. exp((sigma*exp_polar(0))**(2*exp_polar(I*pi))*exp_polar(I*pi)*polar_lift(-mu + x)**
  642. (2*exp_polar(0))/2)*exp_polar(0)*polar_lift(x)/(2*sqrt(pi)), (x, -oo, oo))
  643. def test_unpolarify():
  644. from sympy.functions.elementary.complexes import (polar_lift, principal_branch, unpolarify)
  645. from sympy.core.relational import Ne
  646. from sympy.functions.elementary.hyperbolic import tanh
  647. from sympy.functions.special.error_functions import erf
  648. from sympy.functions.special.gamma_functions import (gamma, uppergamma)
  649. from sympy.abc import x
  650. p = exp_polar(7*I) + 1
  651. u = exp(7*I) + 1
  652. assert unpolarify(1) == 1
  653. assert unpolarify(p) == u
  654. assert unpolarify(p**2) == u**2
  655. assert unpolarify(p**x) == p**x
  656. assert unpolarify(p*x) == u*x
  657. assert unpolarify(p + x) == u + x
  658. assert unpolarify(sqrt(sin(p))) == sqrt(sin(u))
  659. # Test reduction to principal branch 2*pi.
  660. t = principal_branch(x, 2*pi)
  661. assert unpolarify(t) == x
  662. assert unpolarify(sqrt(t)) == sqrt(t)
  663. # Test exponents_only.
  664. assert unpolarify(p**p, exponents_only=True) == p**u
  665. assert unpolarify(uppergamma(x, p**p)) == uppergamma(x, p**u)
  666. # Test functions.
  667. assert unpolarify(sin(p)) == sin(u)
  668. assert unpolarify(tanh(p)) == tanh(u)
  669. assert unpolarify(gamma(p)) == gamma(u)
  670. assert unpolarify(erf(p)) == erf(u)
  671. assert unpolarify(uppergamma(x, p)) == uppergamma(x, p)
  672. assert unpolarify(uppergamma(sin(p), sin(p + exp_polar(0)))) == \
  673. uppergamma(sin(u), sin(u + 1))
  674. assert unpolarify(uppergamma(polar_lift(0), 2*exp_polar(0))) == \
  675. uppergamma(0, 2)
  676. assert unpolarify(Eq(p, 0)) == Eq(u, 0)
  677. assert unpolarify(Ne(p, 0)) == Ne(u, 0)
  678. assert unpolarify(polar_lift(x) > 0) == (x > 0)
  679. # Test bools
  680. assert unpolarify(True) is True
  681. def test_issue_4035():
  682. x = Symbol('x')
  683. assert Abs(x).expand(trig=True) == Abs(x)
  684. assert sign(x).expand(trig=True) == sign(x)
  685. assert arg(x).expand(trig=True) == arg(x)
  686. def test_issue_3206():
  687. x = Symbol('x')
  688. assert Abs(Abs(x)) == Abs(x)
  689. def test_issue_4754_derivative_conjugate():
  690. x = Symbol('x', real=True)
  691. y = Symbol('y', imaginary=True)
  692. f = Function('f')
  693. assert (f(x).conjugate()).diff(x) == (f(x).diff(x)).conjugate()
  694. assert (f(y).conjugate()).diff(y) == -(f(y).diff(y)).conjugate()
  695. def test_derivatives_issue_4757():
  696. x = Symbol('x', real=True)
  697. y = Symbol('y', imaginary=True)
  698. f = Function('f')
  699. assert re(f(x)).diff(x) == re(f(x).diff(x))
  700. assert im(f(x)).diff(x) == im(f(x).diff(x))
  701. assert re(f(y)).diff(y) == -I*im(f(y).diff(y))
  702. assert im(f(y)).diff(y) == -I*re(f(y).diff(y))
  703. assert Abs(f(x)).diff(x).subs(f(x), 1 + I*x).doit() == x/sqrt(1 + x**2)
  704. assert arg(f(x)).diff(x).subs(f(x), 1 + I*x**2).doit() == 2*x/(1 + x**4)
  705. assert Abs(f(y)).diff(y).subs(f(y), 1 + y).doit() == -y/sqrt(1 - y**2)
  706. assert arg(f(y)).diff(y).subs(f(y), I + y**2).doit() == 2*y/(1 + y**4)
  707. def test_issue_11413():
  708. from sympy.simplify.simplify import simplify
  709. v0 = Symbol('v0')
  710. v1 = Symbol('v1')
  711. v2 = Symbol('v2')
  712. V = Matrix([[v0],[v1],[v2]])
  713. U = V.normalized()
  714. assert U == Matrix([
  715. [v0/sqrt(Abs(v0)**2 + Abs(v1)**2 + Abs(v2)**2)],
  716. [v1/sqrt(Abs(v0)**2 + Abs(v1)**2 + Abs(v2)**2)],
  717. [v2/sqrt(Abs(v0)**2 + Abs(v1)**2 + Abs(v2)**2)]])
  718. U.norm = sqrt(v0**2/(v0**2 + v1**2 + v2**2) + v1**2/(v0**2 + v1**2 + v2**2) + v2**2/(v0**2 + v1**2 + v2**2))
  719. assert simplify(U.norm) == 1
  720. def test_periodic_argument():
  721. from sympy.functions.elementary.complexes import (periodic_argument, polar_lift, principal_branch, unbranched_argument)
  722. x = Symbol('x')
  723. p = Symbol('p', positive=True)
  724. assert unbranched_argument(2 + I) == periodic_argument(2 + I, oo)
  725. assert unbranched_argument(1 + x) == periodic_argument(1 + x, oo)
  726. assert N_equals(unbranched_argument((1 + I)**2), pi/2)
  727. assert N_equals(unbranched_argument((1 - I)**2), -pi/2)
  728. assert N_equals(periodic_argument((1 + I)**2, 3*pi), pi/2)
  729. assert N_equals(periodic_argument((1 - I)**2, 3*pi), -pi/2)
  730. assert unbranched_argument(principal_branch(x, pi)) == \
  731. periodic_argument(x, pi)
  732. assert unbranched_argument(polar_lift(2 + I)) == unbranched_argument(2 + I)
  733. assert periodic_argument(polar_lift(2 + I), 2*pi) == \
  734. periodic_argument(2 + I, 2*pi)
  735. assert periodic_argument(polar_lift(2 + I), 3*pi) == \
  736. periodic_argument(2 + I, 3*pi)
  737. assert periodic_argument(polar_lift(2 + I), pi) == \
  738. periodic_argument(polar_lift(2 + I), pi)
  739. assert unbranched_argument(polar_lift(1 + I)) == pi/4
  740. assert periodic_argument(2*p, p) == periodic_argument(p, p)
  741. assert periodic_argument(pi*p, p) == periodic_argument(p, p)
  742. assert Abs(polar_lift(1 + I)) == Abs(1 + I)
  743. @XFAIL
  744. def test_principal_branch_fail():
  745. # TODO XXX why does abs(x)._eval_evalf() not fall back to global evalf?
  746. from sympy.functions.elementary.complexes import principal_branch
  747. assert N_equals(principal_branch((1 + I)**2, pi/2), 0)
  748. def test_principal_branch():
  749. from sympy.functions.elementary.complexes import (polar_lift, principal_branch)
  750. p = Symbol('p', positive=True)
  751. x = Symbol('x')
  752. neg = Symbol('x', negative=True)
  753. assert principal_branch(polar_lift(x), p) == principal_branch(x, p)
  754. assert principal_branch(polar_lift(2 + I), p) == principal_branch(2 + I, p)
  755. assert principal_branch(2*x, p) == 2*principal_branch(x, p)
  756. assert principal_branch(1, pi) == exp_polar(0)
  757. assert principal_branch(-1, 2*pi) == exp_polar(I*pi)
  758. assert principal_branch(-1, pi) == exp_polar(0)
  759. assert principal_branch(exp_polar(3*pi*I)*x, 2*pi) == \
  760. principal_branch(exp_polar(I*pi)*x, 2*pi)
  761. assert principal_branch(neg*exp_polar(pi*I), 2*pi) == neg*exp_polar(-I*pi)
  762. # related to issue #14692
  763. assert principal_branch(exp_polar(-I*pi/2)/polar_lift(neg), 2*pi) == \
  764. exp_polar(-I*pi/2)/neg
  765. assert N_equals(principal_branch((1 + I)**2, 2*pi), 2*I)
  766. assert N_equals(principal_branch((1 + I)**2, 3*pi), 2*I)
  767. assert N_equals(principal_branch((1 + I)**2, 1*pi), 2*I)
  768. # test argument sanitization
  769. assert principal_branch(x, I).func is principal_branch
  770. assert principal_branch(x, -4).func is principal_branch
  771. assert principal_branch(x, -oo).func is principal_branch
  772. assert principal_branch(x, zoo).func is principal_branch
  773. @XFAIL
  774. def test_issue_6167_6151():
  775. n = pi**1000
  776. i = int(n)
  777. assert sign(n - i) == 1
  778. assert abs(n - i) == n - i
  779. x = Symbol('x')
  780. eps = pi**-1500
  781. big = pi**1000
  782. one = cos(x)**2 + sin(x)**2
  783. e = big*one - big + eps
  784. from sympy.simplify.simplify import simplify
  785. assert sign(simplify(e)) == 1
  786. for xi in (111, 11, 1, Rational(1, 10)):
  787. assert sign(e.subs(x, xi)) == 1
  788. def test_issue_14216():
  789. from sympy.functions.elementary.complexes import unpolarify
  790. A = MatrixSymbol("A", 2, 2)
  791. assert unpolarify(A[0, 0]) == A[0, 0]
  792. assert unpolarify(A[0, 0]*A[1, 0]) == A[0, 0]*A[1, 0]
  793. def test_issue_14238():
  794. # doesn't cause recursion error
  795. r = Symbol('r', real=True)
  796. assert Abs(r + Piecewise((0, r > 0), (1 - r, True)))
  797. def test_issue_22189():
  798. x = Symbol('x')
  799. for a in (sqrt(7 - 2*x) - 2, 1 - x):
  800. assert Abs(a) - Abs(-a) == 0, a
  801. def test_zero_assumptions():
  802. nr = Symbol('nonreal', real=False, finite=True)
  803. ni = Symbol('nonimaginary', imaginary=False)
  804. # imaginary implies not zero
  805. nzni = Symbol('nonzerononimaginary', zero=False, imaginary=False)
  806. assert re(nr).is_zero is None
  807. assert im(nr).is_zero is False
  808. assert re(ni).is_zero is None
  809. assert im(ni).is_zero is None
  810. assert re(nzni).is_zero is False
  811. assert im(nzni).is_zero is None
  812. @_both_exp_pow
  813. def test_issue_15893():
  814. f = Function('f', real=True)
  815. x = Symbol('x', real=True)
  816. eq = Derivative(Abs(f(x)), f(x))
  817. assert eq.doit() == sign(f(x))