test_complexes.py 33 KB

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