图片解析应用
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2030 lines
81 KiB

  1. from sympy.calculus.accumulationbounds import AccumBounds
  2. from sympy.core.add import Add
  3. from sympy.core.function import (Lambda, diff)
  4. from sympy.core.mul import Mul
  5. from sympy.core.numbers import (E, Float, I, Rational, nan, oo, pi, zoo)
  6. from sympy.core.power import Pow
  7. from sympy.core.singleton import S
  8. from sympy.core.symbol import (Symbol, symbols)
  9. from sympy.functions.elementary.complexes import (arg, conjugate, im, re)
  10. from sympy.functions.elementary.exponential import (exp, log)
  11. from sympy.functions.elementary.hyperbolic import (acoth, asinh, atanh, cosh, coth, sinh, tanh)
  12. from sympy.functions.elementary.miscellaneous import sqrt
  13. from sympy.functions.elementary.trigonometric import (acos, acot, acsc, asec, asin, atan, atan2, cos, cot, csc, sec, sin, sinc, tan)
  14. from sympy.functions.special.bessel import (besselj, jn)
  15. from sympy.functions.special.delta_functions import Heaviside
  16. from sympy.matrices.dense import Matrix
  17. from sympy.polys.polytools import (cancel, gcd)
  18. from sympy.series.limits import limit
  19. from sympy.series.order import O
  20. from sympy.series.series import series
  21. from sympy.sets.fancysets import ImageSet
  22. from sympy.sets.sets import (FiniteSet, Interval)
  23. from sympy.simplify.simplify import simplify
  24. from sympy.core.expr import unchanged
  25. from sympy.core.function import ArgumentIndexError
  26. from sympy.core.relational import Ne, Eq
  27. from sympy.functions.elementary.piecewise import Piecewise
  28. from sympy.sets.setexpr import SetExpr
  29. from sympy.testing.pytest import XFAIL, slow, raises
  30. x, y, z = symbols('x y z')
  31. r = Symbol('r', real=True)
  32. k, m = symbols('k m', integer=True)
  33. p = Symbol('p', positive=True)
  34. n = Symbol('n', negative=True)
  35. np = Symbol('p', nonpositive=True)
  36. nn = Symbol('n', nonnegative=True)
  37. nz = Symbol('nz', nonzero=True)
  38. ep = Symbol('ep', extended_positive=True)
  39. en = Symbol('en', extended_negative=True)
  40. enp = Symbol('ep', extended_nonpositive=True)
  41. enn = Symbol('en', extended_nonnegative=True)
  42. enz = Symbol('enz', extended_nonzero=True)
  43. a = Symbol('a', algebraic=True)
  44. na = Symbol('na', nonzero=True, algebraic=True)
  45. def test_sin():
  46. x, y = symbols('x y')
  47. assert sin.nargs == FiniteSet(1)
  48. assert sin(nan) is nan
  49. assert sin(zoo) is nan
  50. assert sin(oo) == AccumBounds(-1, 1)
  51. assert sin(oo) - sin(oo) == AccumBounds(-2, 2)
  52. assert sin(oo*I) == oo*I
  53. assert sin(-oo*I) == -oo*I
  54. assert 0*sin(oo) is S.Zero
  55. assert 0/sin(oo) is S.Zero
  56. assert 0 + sin(oo) == AccumBounds(-1, 1)
  57. assert 5 + sin(oo) == AccumBounds(4, 6)
  58. assert sin(0) == 0
  59. assert sin(asin(x)) == x
  60. assert sin(atan(x)) == x / sqrt(1 + x**2)
  61. assert sin(acos(x)) == sqrt(1 - x**2)
  62. assert sin(acot(x)) == 1 / (sqrt(1 + 1 / x**2) * x)
  63. assert sin(acsc(x)) == 1 / x
  64. assert sin(asec(x)) == sqrt(1 - 1 / x**2)
  65. assert sin(atan2(y, x)) == y / sqrt(x**2 + y**2)
  66. assert sin(pi*I) == sinh(pi)*I
  67. assert sin(-pi*I) == -sinh(pi)*I
  68. assert sin(-2*I) == -sinh(2)*I
  69. assert sin(pi) == 0
  70. assert sin(-pi) == 0
  71. assert sin(2*pi) == 0
  72. assert sin(-2*pi) == 0
  73. assert sin(-3*10**73*pi) == 0
  74. assert sin(7*10**103*pi) == 0
  75. assert sin(pi/2) == 1
  76. assert sin(-pi/2) == -1
  77. assert sin(pi*Rational(5, 2)) == 1
  78. assert sin(pi*Rational(7, 2)) == -1
  79. ne = symbols('ne', integer=True, even=False)
  80. e = symbols('e', even=True)
  81. assert sin(pi*ne/2) == (-1)**(ne/2 - S.Half)
  82. assert sin(pi*k/2).func == sin
  83. assert sin(pi*e/2) == 0
  84. assert sin(pi*k) == 0
  85. assert sin(pi*k).subs(k, 3) == sin(pi*k/2).subs(k, 6) # issue 8298
  86. assert sin(pi/3) == S.Half*sqrt(3)
  87. assert sin(pi*Rational(-2, 3)) == Rational(-1, 2)*sqrt(3)
  88. assert sin(pi/4) == S.Half*sqrt(2)
  89. assert sin(-pi/4) == Rational(-1, 2)*sqrt(2)
  90. assert sin(pi*Rational(17, 4)) == S.Half*sqrt(2)
  91. assert sin(pi*Rational(-3, 4)) == Rational(-1, 2)*sqrt(2)
  92. assert sin(pi/6) == S.Half
  93. assert sin(-pi/6) == Rational(-1, 2)
  94. assert sin(pi*Rational(7, 6)) == Rational(-1, 2)
  95. assert sin(pi*Rational(-5, 6)) == Rational(-1, 2)
  96. assert sin(pi*Rational(1, 5)) == sqrt((5 - sqrt(5)) / 8)
  97. assert sin(pi*Rational(2, 5)) == sqrt((5 + sqrt(5)) / 8)
  98. assert sin(pi*Rational(3, 5)) == sin(pi*Rational(2, 5))
  99. assert sin(pi*Rational(4, 5)) == sin(pi*Rational(1, 5))
  100. assert sin(pi*Rational(6, 5)) == -sin(pi*Rational(1, 5))
  101. assert sin(pi*Rational(8, 5)) == -sin(pi*Rational(2, 5))
  102. assert sin(pi*Rational(-1273, 5)) == -sin(pi*Rational(2, 5))
  103. assert sin(pi/8) == sqrt((2 - sqrt(2))/4)
  104. assert sin(pi/10) == Rational(-1, 4) + sqrt(5)/4
  105. assert sin(pi/12) == -sqrt(2)/4 + sqrt(6)/4
  106. assert sin(pi*Rational(5, 12)) == sqrt(2)/4 + sqrt(6)/4
  107. assert sin(pi*Rational(-7, 12)) == -sqrt(2)/4 - sqrt(6)/4
  108. assert sin(pi*Rational(-11, 12)) == sqrt(2)/4 - sqrt(6)/4
  109. assert sin(pi*Rational(104, 105)) == sin(pi/105)
  110. assert sin(pi*Rational(106, 105)) == -sin(pi/105)
  111. assert sin(pi*Rational(-104, 105)) == -sin(pi/105)
  112. assert sin(pi*Rational(-106, 105)) == sin(pi/105)
  113. assert sin(x*I) == sinh(x)*I
  114. assert sin(k*pi) == 0
  115. assert sin(17*k*pi) == 0
  116. assert sin(2*k*pi + 4) == sin(4)
  117. assert sin(2*k*pi + m*pi + 1) == (-1)**(m + 2*k)*sin(1)
  118. assert sin(k*pi*I) == sinh(k*pi)*I
  119. assert sin(r).is_real is True
  120. assert sin(0, evaluate=False).is_algebraic
  121. assert sin(a).is_algebraic is None
  122. assert sin(na).is_algebraic is False
  123. q = Symbol('q', rational=True)
  124. assert sin(pi*q).is_algebraic
  125. qn = Symbol('qn', rational=True, nonzero=True)
  126. assert sin(qn).is_rational is False
  127. assert sin(q).is_rational is None # issue 8653
  128. assert isinstance(sin( re(x) - im(y)), sin) is True
  129. assert isinstance(sin(-re(x) + im(y)), sin) is False
  130. assert sin(SetExpr(Interval(0, 1))) == SetExpr(ImageSet(Lambda(x, sin(x)),
  131. Interval(0, 1)))
  132. for d in list(range(1, 22)) + [60, 85]:
  133. for n in range(0, d*2 + 1):
  134. x = n*pi/d
  135. e = abs( float(sin(x)) - sin(float(x)) )
  136. assert e < 1e-12
  137. assert sin(0, evaluate=False).is_zero is True
  138. assert sin(k*pi, evaluate=False).is_zero is True
  139. assert sin(Add(1, -1, evaluate=False), evaluate=False).is_zero is True
  140. def test_sin_cos():
  141. for d in [1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 24, 30, 40, 60, 120]: # list is not exhaustive...
  142. for n in range(-2*d, d*2):
  143. x = n*pi/d
  144. assert sin(x + pi/2) == cos(x), "fails for %d*pi/%d" % (n, d)
  145. assert sin(x - pi/2) == -cos(x), "fails for %d*pi/%d" % (n, d)
  146. assert sin(x) == cos(x - pi/2), "fails for %d*pi/%d" % (n, d)
  147. assert -sin(x) == cos(x + pi/2), "fails for %d*pi/%d" % (n, d)
  148. def test_sin_series():
  149. assert sin(x).series(x, 0, 9) == \
  150. x - x**3/6 + x**5/120 - x**7/5040 + O(x**9)
  151. def test_sin_rewrite():
  152. assert sin(x).rewrite(exp) == -I*(exp(I*x) - exp(-I*x))/2
  153. assert sin(x).rewrite(tan) == 2*tan(x/2)/(1 + tan(x/2)**2)
  154. assert sin(x).rewrite(cot) == 2*cot(x/2)/(1 + cot(x/2)**2)
  155. assert sin(sinh(x)).rewrite(
  156. exp).subs(x, 3).n() == sin(x).rewrite(exp).subs(x, sinh(3)).n()
  157. assert sin(cosh(x)).rewrite(
  158. exp).subs(x, 3).n() == sin(x).rewrite(exp).subs(x, cosh(3)).n()
  159. assert sin(tanh(x)).rewrite(
  160. exp).subs(x, 3).n() == sin(x).rewrite(exp).subs(x, tanh(3)).n()
  161. assert sin(coth(x)).rewrite(
  162. exp).subs(x, 3).n() == sin(x).rewrite(exp).subs(x, coth(3)).n()
  163. assert sin(sin(x)).rewrite(
  164. exp).subs(x, 3).n() == sin(x).rewrite(exp).subs(x, sin(3)).n()
  165. assert sin(cos(x)).rewrite(
  166. exp).subs(x, 3).n() == sin(x).rewrite(exp).subs(x, cos(3)).n()
  167. assert sin(tan(x)).rewrite(
  168. exp).subs(x, 3).n() == sin(x).rewrite(exp).subs(x, tan(3)).n()
  169. assert sin(cot(x)).rewrite(
  170. exp).subs(x, 3).n() == sin(x).rewrite(exp).subs(x, cot(3)).n()
  171. assert sin(log(x)).rewrite(Pow) == I*x**-I / 2 - I*x**I /2
  172. assert sin(x).rewrite(csc) == 1/csc(x)
  173. assert sin(x).rewrite(cos) == cos(x - pi / 2, evaluate=False)
  174. assert sin(x).rewrite(sec) == 1 / sec(x - pi / 2, evaluate=False)
  175. assert sin(cos(x)).rewrite(Pow) == sin(cos(x))
  176. def _test_extrig(f, i, e):
  177. from sympy.core.function import expand_trig
  178. assert unchanged(f, i)
  179. assert expand_trig(f(i)) == f(i)
  180. # testing directly instead of with .expand(trig=True)
  181. # because the other expansions undo the unevaluated Mul
  182. assert expand_trig(f(Mul(i, 1, evaluate=False))) == e
  183. assert abs(f(i) - e).n() < 1e-10
  184. def test_sin_expansion():
  185. # Note: these formulas are not unique. The ones here come from the
  186. # Chebyshev formulas.
  187. assert sin(x + y).expand(trig=True) == sin(x)*cos(y) + cos(x)*sin(y)
  188. assert sin(x - y).expand(trig=True) == sin(x)*cos(y) - cos(x)*sin(y)
  189. assert sin(y - x).expand(trig=True) == cos(x)*sin(y) - sin(x)*cos(y)
  190. assert sin(2*x).expand(trig=True) == 2*sin(x)*cos(x)
  191. assert sin(3*x).expand(trig=True) == -4*sin(x)**3 + 3*sin(x)
  192. assert sin(4*x).expand(trig=True) == -8*sin(x)**3*cos(x) + 4*sin(x)*cos(x)
  193. _test_extrig(sin, 2, 2*sin(1)*cos(1))
  194. _test_extrig(sin, 3, -4*sin(1)**3 + 3*sin(1))
  195. def test_sin_AccumBounds():
  196. assert sin(AccumBounds(-oo, oo)) == AccumBounds(-1, 1)
  197. assert sin(AccumBounds(0, oo)) == AccumBounds(-1, 1)
  198. assert sin(AccumBounds(-oo, 0)) == AccumBounds(-1, 1)
  199. assert sin(AccumBounds(0, 2*S.Pi)) == AccumBounds(-1, 1)
  200. assert sin(AccumBounds(0, S.Pi*Rational(3, 4))) == AccumBounds(0, 1)
  201. assert sin(AccumBounds(S.Pi*Rational(3, 4), S.Pi*Rational(7, 4))) == AccumBounds(-1, sin(S.Pi*Rational(3, 4)))
  202. assert sin(AccumBounds(S.Pi/4, S.Pi/3)) == AccumBounds(sin(S.Pi/4), sin(S.Pi/3))
  203. assert sin(AccumBounds(S.Pi*Rational(3, 4), S.Pi*Rational(5, 6))) == AccumBounds(sin(S.Pi*Rational(5, 6)), sin(S.Pi*Rational(3, 4)))
  204. def test_sin_fdiff():
  205. assert sin(x).fdiff() == cos(x)
  206. raises(ArgumentIndexError, lambda: sin(x).fdiff(2))
  207. def test_trig_symmetry():
  208. assert sin(-x) == -sin(x)
  209. assert cos(-x) == cos(x)
  210. assert tan(-x) == -tan(x)
  211. assert cot(-x) == -cot(x)
  212. assert sin(x + pi) == -sin(x)
  213. assert sin(x + 2*pi) == sin(x)
  214. assert sin(x + 3*pi) == -sin(x)
  215. assert sin(x + 4*pi) == sin(x)
  216. assert sin(x - 5*pi) == -sin(x)
  217. assert cos(x + pi) == -cos(x)
  218. assert cos(x + 2*pi) == cos(x)
  219. assert cos(x + 3*pi) == -cos(x)
  220. assert cos(x + 4*pi) == cos(x)
  221. assert cos(x - 5*pi) == -cos(x)
  222. assert tan(x + pi) == tan(x)
  223. assert tan(x - 3*pi) == tan(x)
  224. assert cot(x + pi) == cot(x)
  225. assert cot(x - 3*pi) == cot(x)
  226. assert sin(pi/2 - x) == cos(x)
  227. assert sin(pi*Rational(3, 2) - x) == -cos(x)
  228. assert sin(pi*Rational(5, 2) - x) == cos(x)
  229. assert cos(pi/2 - x) == sin(x)
  230. assert cos(pi*Rational(3, 2) - x) == -sin(x)
  231. assert cos(pi*Rational(5, 2) - x) == sin(x)
  232. assert tan(pi/2 - x) == cot(x)
  233. assert tan(pi*Rational(3, 2) - x) == cot(x)
  234. assert tan(pi*Rational(5, 2) - x) == cot(x)
  235. assert cot(pi/2 - x) == tan(x)
  236. assert cot(pi*Rational(3, 2) - x) == tan(x)
  237. assert cot(pi*Rational(5, 2) - x) == tan(x)
  238. assert sin(pi/2 + x) == cos(x)
  239. assert cos(pi/2 + x) == -sin(x)
  240. assert tan(pi/2 + x) == -cot(x)
  241. assert cot(pi/2 + x) == -tan(x)
  242. def test_cos():
  243. x, y = symbols('x y')
  244. assert cos.nargs == FiniteSet(1)
  245. assert cos(nan) is nan
  246. assert cos(oo) == AccumBounds(-1, 1)
  247. assert cos(oo) - cos(oo) == AccumBounds(-2, 2)
  248. assert cos(oo*I) is oo
  249. assert cos(-oo*I) is oo
  250. assert cos(zoo) is nan
  251. assert cos(0) == 1
  252. assert cos(acos(x)) == x
  253. assert cos(atan(x)) == 1 / sqrt(1 + x**2)
  254. assert cos(asin(x)) == sqrt(1 - x**2)
  255. assert cos(acot(x)) == 1 / sqrt(1 + 1 / x**2)
  256. assert cos(acsc(x)) == sqrt(1 - 1 / x**2)
  257. assert cos(asec(x)) == 1 / x
  258. assert cos(atan2(y, x)) == x / sqrt(x**2 + y**2)
  259. assert cos(pi*I) == cosh(pi)
  260. assert cos(-pi*I) == cosh(pi)
  261. assert cos(-2*I) == cosh(2)
  262. assert cos(pi/2) == 0
  263. assert cos(-pi/2) == 0
  264. assert cos(pi/2) == 0
  265. assert cos(-pi/2) == 0
  266. assert cos((-3*10**73 + 1)*pi/2) == 0
  267. assert cos((7*10**103 + 1)*pi/2) == 0
  268. n = symbols('n', integer=True, even=False)
  269. e = symbols('e', even=True)
  270. assert cos(pi*n/2) == 0
  271. assert cos(pi*e/2) == (-1)**(e/2)
  272. assert cos(pi) == -1
  273. assert cos(-pi) == -1
  274. assert cos(2*pi) == 1
  275. assert cos(5*pi) == -1
  276. assert cos(8*pi) == 1
  277. assert cos(pi/3) == S.Half
  278. assert cos(pi*Rational(-2, 3)) == Rational(-1, 2)
  279. assert cos(pi/4) == S.Half*sqrt(2)
  280. assert cos(-pi/4) == S.Half*sqrt(2)
  281. assert cos(pi*Rational(11, 4)) == Rational(-1, 2)*sqrt(2)
  282. assert cos(pi*Rational(-3, 4)) == Rational(-1, 2)*sqrt(2)
  283. assert cos(pi/6) == S.Half*sqrt(3)
  284. assert cos(-pi/6) == S.Half*sqrt(3)
  285. assert cos(pi*Rational(7, 6)) == Rational(-1, 2)*sqrt(3)
  286. assert cos(pi*Rational(-5, 6)) == Rational(-1, 2)*sqrt(3)
  287. assert cos(pi*Rational(1, 5)) == (sqrt(5) + 1)/4
  288. assert cos(pi*Rational(2, 5)) == (sqrt(5) - 1)/4
  289. assert cos(pi*Rational(3, 5)) == -cos(pi*Rational(2, 5))
  290. assert cos(pi*Rational(4, 5)) == -cos(pi*Rational(1, 5))
  291. assert cos(pi*Rational(6, 5)) == -cos(pi*Rational(1, 5))
  292. assert cos(pi*Rational(8, 5)) == cos(pi*Rational(2, 5))
  293. assert cos(pi*Rational(-1273, 5)) == -cos(pi*Rational(2, 5))
  294. assert cos(pi/8) == sqrt((2 + sqrt(2))/4)
  295. assert cos(pi/12) == sqrt(2)/4 + sqrt(6)/4
  296. assert cos(pi*Rational(5, 12)) == -sqrt(2)/4 + sqrt(6)/4
  297. assert cos(pi*Rational(7, 12)) == sqrt(2)/4 - sqrt(6)/4
  298. assert cos(pi*Rational(11, 12)) == -sqrt(2)/4 - sqrt(6)/4
  299. assert cos(pi*Rational(104, 105)) == -cos(pi/105)
  300. assert cos(pi*Rational(106, 105)) == -cos(pi/105)
  301. assert cos(pi*Rational(-104, 105)) == -cos(pi/105)
  302. assert cos(pi*Rational(-106, 105)) == -cos(pi/105)
  303. assert cos(x*I) == cosh(x)
  304. assert cos(k*pi*I) == cosh(k*pi)
  305. assert cos(r).is_real is True
  306. assert cos(0, evaluate=False).is_algebraic
  307. assert cos(a).is_algebraic is None
  308. assert cos(na).is_algebraic is False
  309. q = Symbol('q', rational=True)
  310. assert cos(pi*q).is_algebraic
  311. assert cos(pi*Rational(2, 7)).is_algebraic
  312. assert cos(k*pi) == (-1)**k
  313. assert cos(2*k*pi) == 1
  314. for d in list(range(1, 22)) + [60, 85]:
  315. for n in range(0, 2*d + 1):
  316. x = n*pi/d
  317. e = abs( float(cos(x)) - cos(float(x)) )
  318. assert e < 1e-12
  319. def test_issue_6190():
  320. c = Float('123456789012345678901234567890.25', '')
  321. for cls in [sin, cos, tan, cot]:
  322. assert cls(c*pi) == cls(pi/4)
  323. assert cls(4.125*pi) == cls(pi/8)
  324. assert cls(4.7*pi) == cls((4.7 % 2)*pi)
  325. def test_cos_series():
  326. assert cos(x).series(x, 0, 9) == \
  327. 1 - x**2/2 + x**4/24 - x**6/720 + x**8/40320 + O(x**9)
  328. def test_cos_rewrite():
  329. assert cos(x).rewrite(exp) == exp(I*x)/2 + exp(-I*x)/2
  330. assert cos(x).rewrite(tan) == (1 - tan(x/2)**2)/(1 + tan(x/2)**2)
  331. assert cos(x).rewrite(cot) == -(1 - cot(x/2)**2)/(1 + cot(x/2)**2)
  332. assert cos(sinh(x)).rewrite(
  333. exp).subs(x, 3).n() == cos(x).rewrite(exp).subs(x, sinh(3)).n()
  334. assert cos(cosh(x)).rewrite(
  335. exp).subs(x, 3).n() == cos(x).rewrite(exp).subs(x, cosh(3)).n()
  336. assert cos(tanh(x)).rewrite(
  337. exp).subs(x, 3).n() == cos(x).rewrite(exp).subs(x, tanh(3)).n()
  338. assert cos(coth(x)).rewrite(
  339. exp).subs(x, 3).n() == cos(x).rewrite(exp).subs(x, coth(3)).n()
  340. assert cos(sin(x)).rewrite(
  341. exp).subs(x, 3).n() == cos(x).rewrite(exp).subs(x, sin(3)).n()
  342. assert cos(cos(x)).rewrite(
  343. exp).subs(x, 3).n() == cos(x).rewrite(exp).subs(x, cos(3)).n()
  344. assert cos(tan(x)).rewrite(
  345. exp).subs(x, 3).n() == cos(x).rewrite(exp).subs(x, tan(3)).n()
  346. assert cos(cot(x)).rewrite(
  347. exp).subs(x, 3).n() == cos(x).rewrite(exp).subs(x, cot(3)).n()
  348. assert cos(log(x)).rewrite(Pow) == x**I/2 + x**-I/2
  349. assert cos(x).rewrite(sec) == 1/sec(x)
  350. assert cos(x).rewrite(sin) == sin(x + pi/2, evaluate=False)
  351. assert cos(x).rewrite(csc) == 1/csc(-x + pi/2, evaluate=False)
  352. assert cos(sin(x)).rewrite(Pow) == cos(sin(x))
  353. def test_cos_expansion():
  354. assert cos(x + y).expand(trig=True) == cos(x)*cos(y) - sin(x)*sin(y)
  355. assert cos(x - y).expand(trig=True) == cos(x)*cos(y) + sin(x)*sin(y)
  356. assert cos(y - x).expand(trig=True) == cos(x)*cos(y) + sin(x)*sin(y)
  357. assert cos(2*x).expand(trig=True) == 2*cos(x)**2 - 1
  358. assert cos(3*x).expand(trig=True) == 4*cos(x)**3 - 3*cos(x)
  359. assert cos(4*x).expand(trig=True) == 8*cos(x)**4 - 8*cos(x)**2 + 1
  360. _test_extrig(cos, 2, 2*cos(1)**2 - 1)
  361. _test_extrig(cos, 3, 4*cos(1)**3 - 3*cos(1))
  362. def test_cos_AccumBounds():
  363. assert cos(AccumBounds(-oo, oo)) == AccumBounds(-1, 1)
  364. assert cos(AccumBounds(0, oo)) == AccumBounds(-1, 1)
  365. assert cos(AccumBounds(-oo, 0)) == AccumBounds(-1, 1)
  366. assert cos(AccumBounds(0, 2*S.Pi)) == AccumBounds(-1, 1)
  367. assert cos(AccumBounds(-S.Pi/3, S.Pi/4)) == AccumBounds(cos(-S.Pi/3), 1)
  368. assert cos(AccumBounds(S.Pi*Rational(3, 4), S.Pi*Rational(5, 4))) == AccumBounds(-1, cos(S.Pi*Rational(3, 4)))
  369. assert cos(AccumBounds(S.Pi*Rational(5, 4), S.Pi*Rational(4, 3))) == AccumBounds(cos(S.Pi*Rational(5, 4)), cos(S.Pi*Rational(4, 3)))
  370. assert cos(AccumBounds(S.Pi/4, S.Pi/3)) == AccumBounds(cos(S.Pi/3), cos(S.Pi/4))
  371. def test_cos_fdiff():
  372. assert cos(x).fdiff() == -sin(x)
  373. raises(ArgumentIndexError, lambda: cos(x).fdiff(2))
  374. def test_tan():
  375. assert tan(nan) is nan
  376. assert tan(zoo) is nan
  377. assert tan(oo) == AccumBounds(-oo, oo)
  378. assert tan(oo) - tan(oo) == AccumBounds(-oo, oo)
  379. assert tan.nargs == FiniteSet(1)
  380. assert tan(oo*I) == I
  381. assert tan(-oo*I) == -I
  382. assert tan(0) == 0
  383. assert tan(atan(x)) == x
  384. assert tan(asin(x)) == x / sqrt(1 - x**2)
  385. assert tan(acos(x)) == sqrt(1 - x**2) / x
  386. assert tan(acot(x)) == 1 / x
  387. assert tan(acsc(x)) == 1 / (sqrt(1 - 1 / x**2) * x)
  388. assert tan(asec(x)) == sqrt(1 - 1 / x**2) * x
  389. assert tan(atan2(y, x)) == y/x
  390. assert tan(pi*I) == tanh(pi)*I
  391. assert tan(-pi*I) == -tanh(pi)*I
  392. assert tan(-2*I) == -tanh(2)*I
  393. assert tan(pi) == 0
  394. assert tan(-pi) == 0
  395. assert tan(2*pi) == 0
  396. assert tan(-2*pi) == 0
  397. assert tan(-3*10**73*pi) == 0
  398. assert tan(pi/2) is zoo
  399. assert tan(pi*Rational(3, 2)) is zoo
  400. assert tan(pi/3) == sqrt(3)
  401. assert tan(pi*Rational(-2, 3)) == sqrt(3)
  402. assert tan(pi/4) is S.One
  403. assert tan(-pi/4) is S.NegativeOne
  404. assert tan(pi*Rational(17, 4)) is S.One
  405. assert tan(pi*Rational(-3, 4)) is S.One
  406. assert tan(pi/5) == sqrt(5 - 2*sqrt(5))
  407. assert tan(pi*Rational(2, 5)) == sqrt(5 + 2*sqrt(5))
  408. assert tan(pi*Rational(18, 5)) == -sqrt(5 + 2*sqrt(5))
  409. assert tan(pi*Rational(-16, 5)) == -sqrt(5 - 2*sqrt(5))
  410. assert tan(pi/6) == 1/sqrt(3)
  411. assert tan(-pi/6) == -1/sqrt(3)
  412. assert tan(pi*Rational(7, 6)) == 1/sqrt(3)
  413. assert tan(pi*Rational(-5, 6)) == 1/sqrt(3)
  414. assert tan(pi/8) == -1 + sqrt(2)
  415. assert tan(pi*Rational(3, 8)) == 1 + sqrt(2) # issue 15959
  416. assert tan(pi*Rational(5, 8)) == -1 - sqrt(2)
  417. assert tan(pi*Rational(7, 8)) == 1 - sqrt(2)
  418. assert tan(pi/10) == sqrt(1 - 2*sqrt(5)/5)
  419. assert tan(pi*Rational(3, 10)) == sqrt(1 + 2*sqrt(5)/5)
  420. assert tan(pi*Rational(17, 10)) == -sqrt(1 + 2*sqrt(5)/5)
  421. assert tan(pi*Rational(-31, 10)) == -sqrt(1 - 2*sqrt(5)/5)
  422. assert tan(pi/12) == -sqrt(3) + 2
  423. assert tan(pi*Rational(5, 12)) == sqrt(3) + 2
  424. assert tan(pi*Rational(7, 12)) == -sqrt(3) - 2
  425. assert tan(pi*Rational(11, 12)) == sqrt(3) - 2
  426. assert tan(pi/24).radsimp() == -2 - sqrt(3) + sqrt(2) + sqrt(6)
  427. assert tan(pi*Rational(5, 24)).radsimp() == -2 + sqrt(3) - sqrt(2) + sqrt(6)
  428. assert tan(pi*Rational(7, 24)).radsimp() == 2 - sqrt(3) - sqrt(2) + sqrt(6)
  429. assert tan(pi*Rational(11, 24)).radsimp() == 2 + sqrt(3) + sqrt(2) + sqrt(6)
  430. assert tan(pi*Rational(13, 24)).radsimp() == -2 - sqrt(3) - sqrt(2) - sqrt(6)
  431. assert tan(pi*Rational(17, 24)).radsimp() == -2 + sqrt(3) + sqrt(2) - sqrt(6)
  432. assert tan(pi*Rational(19, 24)).radsimp() == 2 - sqrt(3) + sqrt(2) - sqrt(6)
  433. assert tan(pi*Rational(23, 24)).radsimp() == 2 + sqrt(3) - sqrt(2) - sqrt(6)
  434. assert tan(x*I) == tanh(x)*I
  435. assert tan(k*pi) == 0
  436. assert tan(17*k*pi) == 0
  437. assert tan(k*pi*I) == tanh(k*pi)*I
  438. assert tan(r).is_real is None
  439. assert tan(r).is_extended_real is True
  440. assert tan(0, evaluate=False).is_algebraic
  441. assert tan(a).is_algebraic is None
  442. assert tan(na).is_algebraic is False
  443. assert tan(pi*Rational(10, 7)) == tan(pi*Rational(3, 7))
  444. assert tan(pi*Rational(11, 7)) == -tan(pi*Rational(3, 7))
  445. assert tan(pi*Rational(-11, 7)) == tan(pi*Rational(3, 7))
  446. assert tan(pi*Rational(15, 14)) == tan(pi/14)
  447. assert tan(pi*Rational(-15, 14)) == -tan(pi/14)
  448. assert tan(r).is_finite is None
  449. assert tan(I*r).is_finite is True
  450. # https://github.com/sympy/sympy/issues/21177
  451. f = tan(pi*(x + S(3)/2))/(3*x)
  452. assert f.as_leading_term(x) == -1/(3*pi*x**2)
  453. def test_tan_series():
  454. assert tan(x).series(x, 0, 9) == \
  455. x + x**3/3 + 2*x**5/15 + 17*x**7/315 + O(x**9)
  456. def test_tan_rewrite():
  457. neg_exp, pos_exp = exp(-x*I), exp(x*I)
  458. assert tan(x).rewrite(exp) == I*(neg_exp - pos_exp)/(neg_exp + pos_exp)
  459. assert tan(x).rewrite(sin) == 2*sin(x)**2/sin(2*x)
  460. assert tan(x).rewrite(cos) == cos(x - S.Pi/2, evaluate=False)/cos(x)
  461. assert tan(x).rewrite(cot) == 1/cot(x)
  462. assert tan(sinh(x)).rewrite(
  463. exp).subs(x, 3).n() == tan(x).rewrite(exp).subs(x, sinh(3)).n()
  464. assert tan(cosh(x)).rewrite(
  465. exp).subs(x, 3).n() == tan(x).rewrite(exp).subs(x, cosh(3)).n()
  466. assert tan(tanh(x)).rewrite(
  467. exp).subs(x, 3).n() == tan(x).rewrite(exp).subs(x, tanh(3)).n()
  468. assert tan(coth(x)).rewrite(
  469. exp).subs(x, 3).n() == tan(x).rewrite(exp).subs(x, coth(3)).n()
  470. assert tan(sin(x)).rewrite(
  471. exp).subs(x, 3).n() == tan(x).rewrite(exp).subs(x, sin(3)).n()
  472. assert tan(cos(x)).rewrite(
  473. exp).subs(x, 3).n() == tan(x).rewrite(exp).subs(x, cos(3)).n()
  474. assert tan(tan(x)).rewrite(
  475. exp).subs(x, 3).n() == tan(x).rewrite(exp).subs(x, tan(3)).n()
  476. assert tan(cot(x)).rewrite(
  477. exp).subs(x, 3).n() == tan(x).rewrite(exp).subs(x, cot(3)).n()
  478. assert tan(log(x)).rewrite(Pow) == I*(x**-I - x**I)/(x**-I + x**I)
  479. assert 0 == (cos(pi/34)*tan(pi/34) - sin(pi/34)).rewrite(pow)
  480. assert 0 == (cos(pi/17)*tan(pi/17) - sin(pi/17)).rewrite(pow)
  481. assert tan(pi/19).rewrite(pow) == tan(pi/19)
  482. assert tan(pi*Rational(8, 19)).rewrite(sqrt) == tan(pi*Rational(8, 19))
  483. assert tan(x).rewrite(sec) == sec(x)/sec(x - pi/2, evaluate=False)
  484. assert tan(x).rewrite(csc) == csc(-x + pi/2, evaluate=False)/csc(x)
  485. assert tan(sin(x)).rewrite(Pow) == tan(sin(x))
  486. assert tan(pi*Rational(2, 5), evaluate=False).rewrite(sqrt) == sqrt(sqrt(5)/8 +
  487. Rational(5, 8))/(Rational(-1, 4) + sqrt(5)/4)
  488. def test_tan_subs():
  489. assert tan(x).subs(tan(x), y) == y
  490. assert tan(x).subs(x, y) == tan(y)
  491. assert tan(x).subs(x, S.Pi/2) is zoo
  492. assert tan(x).subs(x, S.Pi*Rational(3, 2)) is zoo
  493. def test_tan_expansion():
  494. assert tan(x + y).expand(trig=True) == ((tan(x) + tan(y))/(1 - tan(x)*tan(y))).expand()
  495. assert tan(x - y).expand(trig=True) == ((tan(x) - tan(y))/(1 + tan(x)*tan(y))).expand()
  496. assert tan(x + y + z).expand(trig=True) == (
  497. (tan(x) + tan(y) + tan(z) - tan(x)*tan(y)*tan(z))/
  498. (1 - tan(x)*tan(y) - tan(x)*tan(z) - tan(y)*tan(z))).expand()
  499. assert 0 == tan(2*x).expand(trig=True).rewrite(tan).subs([(tan(x), Rational(1, 7))])*24 - 7
  500. assert 0 == tan(3*x).expand(trig=True).rewrite(tan).subs([(tan(x), Rational(1, 5))])*55 - 37
  501. assert 0 == tan(4*x - pi/4).expand(trig=True).rewrite(tan).subs([(tan(x), Rational(1, 5))])*239 - 1
  502. _test_extrig(tan, 2, 2*tan(1)/(1 - tan(1)**2))
  503. _test_extrig(tan, 3, (-tan(1)**3 + 3*tan(1))/(1 - 3*tan(1)**2))
  504. def test_tan_AccumBounds():
  505. assert tan(AccumBounds(-oo, oo)) == AccumBounds(-oo, oo)
  506. assert tan(AccumBounds(S.Pi/3, S.Pi*Rational(2, 3))) == AccumBounds(-oo, oo)
  507. assert tan(AccumBounds(S.Pi/6, S.Pi/3)) == AccumBounds(tan(S.Pi/6), tan(S.Pi/3))
  508. def test_tan_fdiff():
  509. assert tan(x).fdiff() == tan(x)**2 + 1
  510. raises(ArgumentIndexError, lambda: tan(x).fdiff(2))
  511. def test_cot():
  512. assert cot(nan) is nan
  513. assert cot.nargs == FiniteSet(1)
  514. assert cot(oo*I) == -I
  515. assert cot(-oo*I) == I
  516. assert cot(zoo) is nan
  517. assert cot(0) is zoo
  518. assert cot(2*pi) is zoo
  519. assert cot(acot(x)) == x
  520. assert cot(atan(x)) == 1 / x
  521. assert cot(asin(x)) == sqrt(1 - x**2) / x
  522. assert cot(acos(x)) == x / sqrt(1 - x**2)
  523. assert cot(acsc(x)) == sqrt(1 - 1 / x**2) * x
  524. assert cot(asec(x)) == 1 / (sqrt(1 - 1 / x**2) * x)
  525. assert cot(atan2(y, x)) == x/y
  526. assert cot(pi*I) == -coth(pi)*I
  527. assert cot(-pi*I) == coth(pi)*I
  528. assert cot(-2*I) == coth(2)*I
  529. assert cot(pi) == cot(2*pi) == cot(3*pi)
  530. assert cot(-pi) == cot(-2*pi) == cot(-3*pi)
  531. assert cot(pi/2) == 0
  532. assert cot(-pi/2) == 0
  533. assert cot(pi*Rational(5, 2)) == 0
  534. assert cot(pi*Rational(7, 2)) == 0
  535. assert cot(pi/3) == 1/sqrt(3)
  536. assert cot(pi*Rational(-2, 3)) == 1/sqrt(3)
  537. assert cot(pi/4) is S.One
  538. assert cot(-pi/4) is S.NegativeOne
  539. assert cot(pi*Rational(17, 4)) is S.One
  540. assert cot(pi*Rational(-3, 4)) is S.One
  541. assert cot(pi/6) == sqrt(3)
  542. assert cot(-pi/6) == -sqrt(3)
  543. assert cot(pi*Rational(7, 6)) == sqrt(3)
  544. assert cot(pi*Rational(-5, 6)) == sqrt(3)
  545. assert cot(pi/8) == 1 + sqrt(2)
  546. assert cot(pi*Rational(3, 8)) == -1 + sqrt(2)
  547. assert cot(pi*Rational(5, 8)) == 1 - sqrt(2)
  548. assert cot(pi*Rational(7, 8)) == -1 - sqrt(2)
  549. assert cot(pi/12) == sqrt(3) + 2
  550. assert cot(pi*Rational(5, 12)) == -sqrt(3) + 2
  551. assert cot(pi*Rational(7, 12)) == sqrt(3) - 2
  552. assert cot(pi*Rational(11, 12)) == -sqrt(3) - 2
  553. assert cot(pi/24).radsimp() == sqrt(2) + sqrt(3) + 2 + sqrt(6)
  554. assert cot(pi*Rational(5, 24)).radsimp() == -sqrt(2) - sqrt(3) + 2 + sqrt(6)
  555. assert cot(pi*Rational(7, 24)).radsimp() == -sqrt(2) + sqrt(3) - 2 + sqrt(6)
  556. assert cot(pi*Rational(11, 24)).radsimp() == sqrt(2) - sqrt(3) - 2 + sqrt(6)
  557. assert cot(pi*Rational(13, 24)).radsimp() == -sqrt(2) + sqrt(3) + 2 - sqrt(6)
  558. assert cot(pi*Rational(17, 24)).radsimp() == sqrt(2) - sqrt(3) + 2 - sqrt(6)
  559. assert cot(pi*Rational(19, 24)).radsimp() == sqrt(2) + sqrt(3) - 2 - sqrt(6)
  560. assert cot(pi*Rational(23, 24)).radsimp() == -sqrt(2) - sqrt(3) - 2 - sqrt(6)
  561. assert cot(x*I) == -coth(x)*I
  562. assert cot(k*pi*I) == -coth(k*pi)*I
  563. assert cot(r).is_real is None
  564. assert cot(r).is_extended_real is True
  565. assert cot(a).is_algebraic is None
  566. assert cot(na).is_algebraic is False
  567. assert cot(pi*Rational(10, 7)) == cot(pi*Rational(3, 7))
  568. assert cot(pi*Rational(11, 7)) == -cot(pi*Rational(3, 7))
  569. assert cot(pi*Rational(-11, 7)) == cot(pi*Rational(3, 7))
  570. assert cot(pi*Rational(39, 34)) == cot(pi*Rational(5, 34))
  571. assert cot(pi*Rational(-41, 34)) == -cot(pi*Rational(7, 34))
  572. assert cot(x).is_finite is None
  573. assert cot(r).is_finite is None
  574. i = Symbol('i', imaginary=True)
  575. assert cot(i).is_finite is True
  576. assert cot(x).subs(x, 3*pi) is zoo
  577. # https://github.com/sympy/sympy/issues/21177
  578. f = cot(pi*(x + 4))/(3*x)
  579. assert f.as_leading_term(x) == 1/(3*pi*x**2)
  580. def test_tan_cot_sin_cos_evalf():
  581. assert abs((tan(pi*Rational(8, 15))*cos(pi*Rational(8, 15))/sin(pi*Rational(8, 15)) - 1).evalf()) < 1e-14
  582. assert abs((cot(pi*Rational(4, 15))*sin(pi*Rational(4, 15))/cos(pi*Rational(4, 15)) - 1).evalf()) < 1e-14
  583. @XFAIL
  584. def test_tan_cot_sin_cos_ratsimp():
  585. assert 1 == (tan(pi*Rational(8, 15))*cos(pi*Rational(8, 15))/sin(pi*Rational(8, 15))).ratsimp()
  586. assert 1 == (cot(pi*Rational(4, 15))*sin(pi*Rational(4, 15))/cos(pi*Rational(4, 15))).ratsimp()
  587. def test_cot_series():
  588. assert cot(x).series(x, 0, 9) == \
  589. 1/x - x/3 - x**3/45 - 2*x**5/945 - x**7/4725 + O(x**9)
  590. # issue 6210
  591. assert cot(x**4 + x**5).series(x, 0, 1) == \
  592. x**(-4) - 1/x**3 + x**(-2) - 1/x + 1 + O(x)
  593. assert cot(pi*(1-x)).series(x, 0, 3) == -1/(pi*x) + pi*x/3 + O(x**3)
  594. assert cot(x).taylor_term(0, x) == 1/x
  595. assert cot(x).taylor_term(2, x) is S.Zero
  596. assert cot(x).taylor_term(3, x) == -x**3/45
  597. def test_cot_rewrite():
  598. neg_exp, pos_exp = exp(-x*I), exp(x*I)
  599. assert cot(x).rewrite(exp) == I*(pos_exp + neg_exp)/(pos_exp - neg_exp)
  600. assert cot(x).rewrite(sin) == sin(2*x)/(2*(sin(x)**2))
  601. assert cot(x).rewrite(cos) == cos(x)/cos(x - pi/2, evaluate=False)
  602. assert cot(x).rewrite(tan) == 1/tan(x)
  603. def check(func):
  604. z = cot(func(x)).rewrite(exp
  605. ) - cot(x).rewrite(exp).subs(x, func(x))
  606. assert z.rewrite(exp).expand() == 0
  607. check(sinh)
  608. check(cosh)
  609. check(tanh)
  610. check(coth)
  611. check(sin)
  612. check(cos)
  613. check(tan)
  614. assert cot(log(x)).rewrite(Pow) == -I*(x**-I + x**I)/(x**-I - x**I)
  615. assert cot(pi*Rational(4, 34)).rewrite(pow).ratsimp() == (cos(pi*Rational(4, 34))/sin(pi*Rational(4, 34))).rewrite(pow).ratsimp()
  616. assert cot(pi*Rational(4, 17)).rewrite(pow) == (cos(pi*Rational(4, 17))/sin(pi*Rational(4, 17))).rewrite(pow)
  617. assert cot(pi/19).rewrite(pow) == cot(pi/19)
  618. assert cot(pi/19).rewrite(sqrt) == cot(pi/19)
  619. assert cot(x).rewrite(sec) == sec(x - pi / 2, evaluate=False) / sec(x)
  620. assert cot(x).rewrite(csc) == csc(x) / csc(- x + pi / 2, evaluate=False)
  621. assert cot(sin(x)).rewrite(Pow) == cot(sin(x))
  622. assert cot(pi*Rational(2, 5), evaluate=False).rewrite(sqrt) == (Rational(-1, 4) + sqrt(5)/4)/\
  623. sqrt(sqrt(5)/8 + Rational(5, 8))
  624. def test_cot_subs():
  625. assert cot(x).subs(cot(x), y) == y
  626. assert cot(x).subs(x, y) == cot(y)
  627. assert cot(x).subs(x, 0) is zoo
  628. assert cot(x).subs(x, S.Pi) is zoo
  629. def test_cot_expansion():
  630. assert cot(x + y).expand(trig=True).together() == (
  631. (cot(x)*cot(y) - 1)/(cot(x) + cot(y)))
  632. assert cot(x - y).expand(trig=True).together() == (
  633. cot(x)*cot(-y) - 1)/(cot(x) + cot(-y))
  634. assert cot(x + y + z).expand(trig=True).together() == (
  635. (cot(x)*cot(y)*cot(z) - cot(x) - cot(y) - cot(z))/
  636. (-1 + cot(x)*cot(y) + cot(x)*cot(z) + cot(y)*cot(z)))
  637. assert cot(3*x).expand(trig=True).together() == (
  638. (cot(x)**2 - 3)*cot(x)/(3*cot(x)**2 - 1))
  639. assert cot(2*x).expand(trig=True) == cot(x)/2 - 1/(2*cot(x))
  640. assert cot(3*x).expand(trig=True).together() == (
  641. cot(x)**2 - 3)*cot(x)/(3*cot(x)**2 - 1)
  642. assert cot(4*x - pi/4).expand(trig=True).cancel() == (
  643. -tan(x)**4 + 4*tan(x)**3 + 6*tan(x)**2 - 4*tan(x) - 1
  644. )/(tan(x)**4 + 4*tan(x)**3 - 6*tan(x)**2 - 4*tan(x) + 1)
  645. _test_extrig(cot, 2, (-1 + cot(1)**2)/(2*cot(1)))
  646. _test_extrig(cot, 3, (-3*cot(1) + cot(1)**3)/(-1 + 3*cot(1)**2))
  647. def test_cot_AccumBounds():
  648. assert cot(AccumBounds(-oo, oo)) == AccumBounds(-oo, oo)
  649. assert cot(AccumBounds(-S.Pi/3, S.Pi/3)) == AccumBounds(-oo, oo)
  650. assert cot(AccumBounds(S.Pi/6, S.Pi/3)) == AccumBounds(cot(S.Pi/3), cot(S.Pi/6))
  651. def test_cot_fdiff():
  652. assert cot(x).fdiff() == -cot(x)**2 - 1
  653. raises(ArgumentIndexError, lambda: cot(x).fdiff(2))
  654. def test_sinc():
  655. assert isinstance(sinc(x), sinc)
  656. s = Symbol('s', zero=True)
  657. assert sinc(s) is S.One
  658. assert sinc(S.Infinity) is S.Zero
  659. assert sinc(S.NegativeInfinity) is S.Zero
  660. assert sinc(S.NaN) is S.NaN
  661. assert sinc(S.ComplexInfinity) is S.NaN
  662. n = Symbol('n', integer=True, nonzero=True)
  663. assert sinc(n*pi) is S.Zero
  664. assert sinc(-n*pi) is S.Zero
  665. assert sinc(pi/2) == 2 / pi
  666. assert sinc(-pi/2) == 2 / pi
  667. assert sinc(pi*Rational(5, 2)) == 2 / (5*pi)
  668. assert sinc(pi*Rational(7, 2)) == -2 / (7*pi)
  669. assert sinc(-x) == sinc(x)
  670. assert sinc(x).diff(x) == cos(x)/x - sin(x)/x**2
  671. assert sinc(x).diff(x) == (sin(x)/x).diff(x)
  672. assert sinc(x).diff(x, x) == (-sin(x) - 2*cos(x)/x + 2*sin(x)/x**2)/x
  673. assert sinc(x).diff(x, x) == (sin(x)/x).diff(x, x)
  674. assert limit(sinc(x).diff(x), x, 0) == 0
  675. assert limit(sinc(x).diff(x, x), x, 0) == -S(1)/3
  676. # https://github.com/sympy/sympy/issues/11402
  677. #
  678. # assert sinc(x).diff(x) == Piecewise(((x*cos(x) - sin(x)) / x**2, Ne(x, 0)), (0, True))
  679. #
  680. # assert sinc(x).diff(x).equals(sinc(x).rewrite(sin).diff(x))
  681. #
  682. # assert sinc(x).diff(x).subs(x, 0) is S.Zero
  683. assert sinc(x).series() == 1 - x**2/6 + x**4/120 + O(x**6)
  684. assert sinc(x).rewrite(jn) == jn(0, x)
  685. assert sinc(x).rewrite(sin) == Piecewise((sin(x)/x, Ne(x, 0)), (1, True))
  686. assert sinc(pi, evaluate=False).is_zero is True
  687. assert sinc(0, evaluate=False).is_zero is False
  688. assert sinc(n*pi, evaluate=False).is_zero is True
  689. assert sinc(x).is_zero is None
  690. xr = Symbol('xr', real=True, nonzero=True)
  691. assert sinc(x).is_real is None
  692. assert sinc(xr).is_real is True
  693. assert sinc(I*xr).is_real is True
  694. assert sinc(I*100).is_real is True
  695. assert sinc(x).is_finite is None
  696. assert sinc(xr).is_finite is True
  697. def test_asin():
  698. assert asin(nan) is nan
  699. assert asin.nargs == FiniteSet(1)
  700. assert asin(oo) == -I*oo
  701. assert asin(-oo) == I*oo
  702. assert asin(zoo) is zoo
  703. # Note: asin(-x) = - asin(x)
  704. assert asin(0) == 0
  705. assert asin(1) == pi/2
  706. assert asin(-1) == -pi/2
  707. assert asin(sqrt(3)/2) == pi/3
  708. assert asin(-sqrt(3)/2) == -pi/3
  709. assert asin(sqrt(2)/2) == pi/4
  710. assert asin(-sqrt(2)/2) == -pi/4
  711. assert asin(sqrt((5 - sqrt(5))/8)) == pi/5
  712. assert asin(-sqrt((5 - sqrt(5))/8)) == -pi/5
  713. assert asin(S.Half) == pi/6
  714. assert asin(Rational(-1, 2)) == -pi/6
  715. assert asin((sqrt(2 - sqrt(2)))/2) == pi/8
  716. assert asin(-(sqrt(2 - sqrt(2)))/2) == -pi/8
  717. assert asin((sqrt(5) - 1)/4) == pi/10
  718. assert asin(-(sqrt(5) - 1)/4) == -pi/10
  719. assert asin((sqrt(3) - 1)/sqrt(2**3)) == pi/12
  720. assert asin(-(sqrt(3) - 1)/sqrt(2**3)) == -pi/12
  721. # check round-trip for exact values:
  722. for d in [5, 6, 8, 10, 12]:
  723. for n in range(-(d//2), d//2 + 1):
  724. if gcd(n, d) == 1:
  725. assert asin(sin(n*pi/d)) == n*pi/d
  726. assert asin(x).diff(x) == 1/sqrt(1 - x**2)
  727. assert asin(1/x).as_leading_term(x) == I*log(1/x)
  728. assert asin(0.2, evaluate=False).is_real is True
  729. assert asin(-2).is_real is False
  730. assert asin(r).is_real is None
  731. assert asin(-2*I) == -I*asinh(2)
  732. assert asin(Rational(1, 7), evaluate=False).is_positive is True
  733. assert asin(Rational(-1, 7), evaluate=False).is_positive is False
  734. assert asin(p).is_positive is None
  735. assert asin(sin(Rational(7, 2))) == Rational(-7, 2) + pi
  736. assert asin(sin(Rational(-7, 4))) == Rational(7, 4) - pi
  737. assert unchanged(asin, cos(x))
  738. def test_asin_series():
  739. assert asin(x).series(x, 0, 9) == \
  740. x + x**3/6 + 3*x**5/40 + 5*x**7/112 + O(x**9)
  741. t5 = asin(x).taylor_term(5, x)
  742. assert t5 == 3*x**5/40
  743. assert asin(x).taylor_term(7, x, t5, 0) == 5*x**7/112
  744. def test_asin_rewrite():
  745. assert asin(x).rewrite(log) == -I*log(I*x + sqrt(1 - x**2))
  746. assert asin(x).rewrite(atan) == 2*atan(x/(1 + sqrt(1 - x**2)))
  747. assert asin(x).rewrite(acos) == S.Pi/2 - acos(x)
  748. assert asin(x).rewrite(acot) == 2*acot((sqrt(-x**2 + 1) + 1)/x)
  749. assert asin(x).rewrite(asec) == -asec(1/x) + pi/2
  750. assert asin(x).rewrite(acsc) == acsc(1/x)
  751. def test_asin_fdiff():
  752. assert asin(x).fdiff() == 1/sqrt(1 - x**2)
  753. raises(ArgumentIndexError, lambda: asin(x).fdiff(2))
  754. def test_acos():
  755. assert acos(nan) is nan
  756. assert acos(zoo) is zoo
  757. assert acos.nargs == FiniteSet(1)
  758. assert acos(oo) == I*oo
  759. assert acos(-oo) == -I*oo
  760. # Note: acos(-x) = pi - acos(x)
  761. assert acos(0) == pi/2
  762. assert acos(S.Half) == pi/3
  763. assert acos(Rational(-1, 2)) == pi*Rational(2, 3)
  764. assert acos(1) == 0
  765. assert acos(-1) == pi
  766. assert acos(sqrt(2)/2) == pi/4
  767. assert acos(-sqrt(2)/2) == pi*Rational(3, 4)
  768. # check round-trip for exact values:
  769. for d in [5, 6, 8, 10, 12]:
  770. for num in range(d):
  771. if gcd(num, d) == 1:
  772. assert acos(cos(num*pi/d)) == num*pi/d
  773. assert acos(2*I) == pi/2 - asin(2*I)
  774. assert acos(x).diff(x) == -1/sqrt(1 - x**2)
  775. assert acos(1/x).as_leading_term(x) == I*log(1/x)
  776. assert acos(0.2).is_real is True
  777. assert acos(-2).is_real is False
  778. assert acos(r).is_real is None
  779. assert acos(Rational(1, 7), evaluate=False).is_positive is True
  780. assert acos(Rational(-1, 7), evaluate=False).is_positive is True
  781. assert acos(Rational(3, 2), evaluate=False).is_positive is False
  782. assert acos(p).is_positive is None
  783. assert acos(2 + p).conjugate() != acos(10 + p)
  784. assert acos(-3 + n).conjugate() != acos(-3 + n)
  785. assert acos(Rational(1, 3)).conjugate() == acos(Rational(1, 3))
  786. assert acos(Rational(-1, 3)).conjugate() == acos(Rational(-1, 3))
  787. assert acos(p + n*I).conjugate() == acos(p - n*I)
  788. assert acos(z).conjugate() != acos(conjugate(z))
  789. def test_acos_series():
  790. assert acos(x).series(x, 0, 8) == \
  791. pi/2 - x - x**3/6 - 3*x**5/40 - 5*x**7/112 + O(x**8)
  792. assert acos(x).series(x, 0, 8) == pi/2 - asin(x).series(x, 0, 8)
  793. t5 = acos(x).taylor_term(5, x)
  794. assert t5 == -3*x**5/40
  795. assert acos(x).taylor_term(7, x, t5, 0) == -5*x**7/112
  796. assert acos(x).taylor_term(0, x) == pi/2
  797. assert acos(x).taylor_term(2, x) is S.Zero
  798. def test_acos_rewrite():
  799. assert acos(x).rewrite(log) == pi/2 + I*log(I*x + sqrt(1 - x**2))
  800. assert acos(x).rewrite(atan) == \
  801. atan(sqrt(1 - x**2)/x) + (pi/2)*(1 - x*sqrt(1/x**2))
  802. assert acos(0).rewrite(atan) == S.Pi/2
  803. assert acos(0.5).rewrite(atan) == acos(0.5).rewrite(log)
  804. assert acos(x).rewrite(asin) == S.Pi/2 - asin(x)
  805. assert acos(x).rewrite(acot) == -2*acot((sqrt(-x**2 + 1) + 1)/x) + pi/2
  806. assert acos(x).rewrite(asec) == asec(1/x)
  807. assert acos(x).rewrite(acsc) == -acsc(1/x) + pi/2
  808. def test_acos_fdiff():
  809. assert acos(x).fdiff() == -1/sqrt(1 - x**2)
  810. raises(ArgumentIndexError, lambda: acos(x).fdiff(2))
  811. def test_atan():
  812. assert atan(nan) is nan
  813. assert atan.nargs == FiniteSet(1)
  814. assert atan(oo) == pi/2
  815. assert atan(-oo) == -pi/2
  816. assert atan(zoo) == AccumBounds(-pi/2, pi/2)
  817. assert atan(0) == 0
  818. assert atan(1) == pi/4
  819. assert atan(sqrt(3)) == pi/3
  820. assert atan(-(1 + sqrt(2))) == pi*Rational(-3, 8)
  821. assert atan(sqrt(5 - 2 * sqrt(5))) == pi/5
  822. assert atan(-sqrt(1 - 2 * sqrt(5)/ 5)) == -pi/10
  823. assert atan(sqrt(1 + 2 * sqrt(5) / 5)) == pi*Rational(3, 10)
  824. assert atan(-2 + sqrt(3)) == -pi/12
  825. assert atan(2 + sqrt(3)) == pi*Rational(5, 12)
  826. assert atan(-2 - sqrt(3)) == pi*Rational(-5, 12)
  827. # check round-trip for exact values:
  828. for d in [5, 6, 8, 10, 12]:
  829. for num in range(-(d//2), d//2 + 1):
  830. if gcd(num, d) == 1:
  831. assert atan(tan(num*pi/d)) == num*pi/d
  832. assert atan(oo) == pi/2
  833. assert atan(x).diff(x) == 1/(1 + x**2)
  834. assert atan(1/x).as_leading_term(x) == pi/2
  835. assert atan(r).is_real is True
  836. assert atan(-2*I) == -I*atanh(2)
  837. assert unchanged(atan, cot(x))
  838. assert atan(cot(Rational(1, 4))) == Rational(-1, 4) + pi/2
  839. assert acot(Rational(1, 4)).is_rational is False
  840. for s in (x, p, n, np, nn, nz, ep, en, enp, enn, enz):
  841. if s.is_real or s.is_extended_real is None:
  842. assert s.is_nonzero is atan(s).is_nonzero
  843. assert s.is_positive is atan(s).is_positive
  844. assert s.is_negative is atan(s).is_negative
  845. assert s.is_nonpositive is atan(s).is_nonpositive
  846. assert s.is_nonnegative is atan(s).is_nonnegative
  847. else:
  848. assert s.is_extended_nonzero is atan(s).is_nonzero
  849. assert s.is_extended_positive is atan(s).is_positive
  850. assert s.is_extended_negative is atan(s).is_negative
  851. assert s.is_extended_nonpositive is atan(s).is_nonpositive
  852. assert s.is_extended_nonnegative is atan(s).is_nonnegative
  853. assert s.is_extended_nonzero is atan(s).is_extended_nonzero
  854. assert s.is_extended_positive is atan(s).is_extended_positive
  855. assert s.is_extended_negative is atan(s).is_extended_negative
  856. assert s.is_extended_nonpositive is atan(s).is_extended_nonpositive
  857. assert s.is_extended_nonnegative is atan(s).is_extended_nonnegative
  858. def test_atan_rewrite():
  859. assert atan(x).rewrite(log) == I*(log(1 - I*x)-log(1 + I*x))/2
  860. assert atan(x).rewrite(asin) == (-asin(1/sqrt(x**2 + 1)) + pi/2)*sqrt(x**2)/x
  861. assert atan(x).rewrite(acos) == sqrt(x**2)*acos(1/sqrt(x**2 + 1))/x
  862. assert atan(x).rewrite(acot) == acot(1/x)
  863. assert atan(x).rewrite(asec) == sqrt(x**2)*asec(sqrt(x**2 + 1))/x
  864. assert atan(x).rewrite(acsc) == (-acsc(sqrt(x**2 + 1)) + pi/2)*sqrt(x**2)/x
  865. assert atan(-5*I).evalf() == atan(x).rewrite(log).evalf(subs={x:-5*I})
  866. assert atan(5*I).evalf() == atan(x).rewrite(log).evalf(subs={x:5*I})
  867. def test_atan_fdiff():
  868. assert atan(x).fdiff() == 1/(x**2 + 1)
  869. raises(ArgumentIndexError, lambda: atan(x).fdiff(2))
  870. def test_atan2():
  871. assert atan2.nargs == FiniteSet(2)
  872. assert atan2(0, 0) is S.NaN
  873. assert atan2(0, 1) == 0
  874. assert atan2(1, 1) == pi/4
  875. assert atan2(1, 0) == pi/2
  876. assert atan2(1, -1) == pi*Rational(3, 4)
  877. assert atan2(0, -1) == pi
  878. assert atan2(-1, -1) == pi*Rational(-3, 4)
  879. assert atan2(-1, 0) == -pi/2
  880. assert atan2(-1, 1) == -pi/4
  881. i = symbols('i', imaginary=True)
  882. r = symbols('r', real=True)
  883. eq = atan2(r, i)
  884. ans = -I*log((i + I*r)/sqrt(i**2 + r**2))
  885. reps = ((r, 2), (i, I))
  886. assert eq.subs(reps) == ans.subs(reps)
  887. x = Symbol('x', negative=True)
  888. y = Symbol('y', negative=True)
  889. assert atan2(y, x) == atan(y/x) - pi
  890. y = Symbol('y', nonnegative=True)
  891. assert atan2(y, x) == atan(y/x) + pi
  892. y = Symbol('y')
  893. assert atan2(y, x) == atan2(y, x, evaluate=False)
  894. u = Symbol("u", positive=True)
  895. assert atan2(0, u) == 0
  896. u = Symbol("u", negative=True)
  897. assert atan2(0, u) == pi
  898. assert atan2(y, oo) == 0
  899. assert atan2(y, -oo)== 2*pi*Heaviside(re(y), S.Half) - pi
  900. assert atan2(y, x).rewrite(log) == -I*log((x + I*y)/sqrt(x**2 + y**2))
  901. assert atan2(0, 0) is S.NaN
  902. ex = atan2(y, x) - arg(x + I*y)
  903. assert ex.subs({x:2, y:3}).rewrite(arg) == 0
  904. assert ex.subs({x:2, y:3*I}).rewrite(arg) == -pi - I*log(sqrt(5)*I/5)
  905. assert ex.subs({x:2*I, y:3}).rewrite(arg) == -pi/2 - I*log(sqrt(5)*I)
  906. assert ex.subs({x:2*I, y:3*I}).rewrite(arg) == -pi + atan(Rational(2, 3)) + atan(Rational(3, 2))
  907. i = symbols('i', imaginary=True)
  908. r = symbols('r', real=True)
  909. e = atan2(i, r)
  910. rewrite = e.rewrite(arg)
  911. reps = {i: I, r: -2}
  912. assert rewrite == -I*log(abs(I*i + r)/sqrt(abs(i**2 + r**2))) + arg((I*i + r)/sqrt(i**2 + r**2))
  913. assert (e - rewrite).subs(reps).equals(0)
  914. assert atan2(0, x).rewrite(atan) == Piecewise((pi, re(x) < 0),
  915. (0, Ne(x, 0)),
  916. (nan, True))
  917. assert atan2(0, r).rewrite(atan) == Piecewise((pi, r < 0), (0, Ne(r, 0)), (S.NaN, True))
  918. assert atan2(0, i),rewrite(atan) == 0
  919. assert atan2(0, r + i).rewrite(atan) == Piecewise((pi, r < 0), (0, True))
  920. assert atan2(y, x).rewrite(atan) == Piecewise(
  921. (2*atan(y/(x + sqrt(x**2 + y**2))), Ne(y, 0)),
  922. (pi, re(x) < 0),
  923. (0, (re(x) > 0) | Ne(im(x), 0)),
  924. (nan, True))
  925. assert conjugate(atan2(x, y)) == atan2(conjugate(x), conjugate(y))
  926. assert diff(atan2(y, x), x) == -y/(x**2 + y**2)
  927. assert diff(atan2(y, x), y) == x/(x**2 + y**2)
  928. assert simplify(diff(atan2(y, x).rewrite(log), x)) == -y/(x**2 + y**2)
  929. assert simplify(diff(atan2(y, x).rewrite(log), y)) == x/(x**2 + y**2)
  930. assert str(atan2(1, 2).evalf(5)) == '0.46365'
  931. raises(ArgumentIndexError, lambda: atan2(x, y).fdiff(3))
  932. def test_issue_17461():
  933. class A(Symbol):
  934. is_extended_real = True
  935. def _eval_evalf(self, prec):
  936. return Float(5.0)
  937. x = A('X')
  938. y = A('Y')
  939. assert abs(atan2(x, y).evalf() - 0.785398163397448) <= 1e-10
  940. def test_acot():
  941. assert acot(nan) is nan
  942. assert acot.nargs == FiniteSet(1)
  943. assert acot(-oo) == 0
  944. assert acot(oo) == 0
  945. assert acot(zoo) == 0
  946. assert acot(1) == pi/4
  947. assert acot(0) == pi/2
  948. assert acot(sqrt(3)/3) == pi/3
  949. assert acot(1/sqrt(3)) == pi/3
  950. assert acot(-1/sqrt(3)) == -pi/3
  951. assert acot(x).diff(x) == -1/(1 + x**2)
  952. assert acot(1/x).as_leading_term(x) == x
  953. assert acot(r).is_extended_real is True
  954. assert acot(I*pi) == -I*acoth(pi)
  955. assert acot(-2*I) == I*acoth(2)
  956. assert acot(x).is_positive is None
  957. assert acot(n).is_positive is False
  958. assert acot(p).is_positive is True
  959. assert acot(I).is_positive is False
  960. assert acot(Rational(1, 4)).is_rational is False
  961. assert unchanged(acot, cot(x))
  962. assert unchanged(acot, tan(x))
  963. assert acot(cot(Rational(1, 4))) == Rational(1, 4)
  964. assert acot(tan(Rational(-1, 4))) == Rational(1, 4) - pi/2
  965. def test_acot_rewrite():
  966. assert acot(x).rewrite(log) == I*(log(1 - I/x)-log(1 + I/x))/2
  967. assert acot(x).rewrite(asin) == x*(-asin(sqrt(-x**2)/sqrt(-x**2 - 1)) + pi/2)*sqrt(x**(-2))
  968. assert acot(x).rewrite(acos) == x*sqrt(x**(-2))*acos(sqrt(-x**2)/sqrt(-x**2 - 1))
  969. assert acot(x).rewrite(atan) == atan(1/x)
  970. assert acot(x).rewrite(asec) == x*sqrt(x**(-2))*asec(sqrt((x**2 + 1)/x**2))
  971. assert acot(x).rewrite(acsc) == x*(-acsc(sqrt((x**2 + 1)/x**2)) + pi/2)*sqrt(x**(-2))
  972. assert acot(-I/5).evalf() == acot(x).rewrite(log).evalf(subs={x:-I/5})
  973. assert acot(I/5).evalf() == acot(x).rewrite(log).evalf(subs={x:I/5})
  974. def test_acot_fdiff():
  975. assert acot(x).fdiff() == -1/(x**2 + 1)
  976. raises(ArgumentIndexError, lambda: acot(x).fdiff(2))
  977. def test_attributes():
  978. assert sin(x).args == (x,)
  979. def test_sincos_rewrite():
  980. assert sin(pi/2 - x) == cos(x)
  981. assert sin(pi - x) == sin(x)
  982. assert cos(pi/2 - x) == sin(x)
  983. assert cos(pi - x) == -cos(x)
  984. def _check_even_rewrite(func, arg):
  985. """Checks that the expr has been rewritten using f(-x) -> f(x)
  986. arg : -x
  987. """
  988. return func(arg).args[0] == -arg
  989. def _check_odd_rewrite(func, arg):
  990. """Checks that the expr has been rewritten using f(-x) -> -f(x)
  991. arg : -x
  992. """
  993. return func(arg).func.is_Mul
  994. def _check_no_rewrite(func, arg):
  995. """Checks that the expr is not rewritten"""
  996. return func(arg).args[0] == arg
  997. def test_evenodd_rewrite():
  998. a = cos(2) # negative
  999. b = sin(1) # positive
  1000. even = [cos]
  1001. odd = [sin, tan, cot, asin, atan, acot]
  1002. with_minus = [-1, -2**1024 * E, -pi/105, -x*y, -x - y]
  1003. for func in even:
  1004. for expr in with_minus:
  1005. assert _check_even_rewrite(func, expr)
  1006. assert _check_no_rewrite(func, a*b)
  1007. assert func(
  1008. x - y) == func(y - x) # it doesn't matter which form is canonical
  1009. for func in odd:
  1010. for expr in with_minus:
  1011. assert _check_odd_rewrite(func, expr)
  1012. assert _check_no_rewrite(func, a*b)
  1013. assert func(
  1014. x - y) == -func(y - x) # it doesn't matter which form is canonical
  1015. def test_issue_4547():
  1016. assert sin(x).rewrite(cot) == 2*cot(x/2)/(1 + cot(x/2)**2)
  1017. assert cos(x).rewrite(cot) == -(1 - cot(x/2)**2)/(1 + cot(x/2)**2)
  1018. assert tan(x).rewrite(cot) == 1/cot(x)
  1019. assert cot(x).fdiff() == -1 - cot(x)**2
  1020. def test_as_leading_term_issue_5272():
  1021. assert sin(x).as_leading_term(x) == x
  1022. assert cos(x).as_leading_term(x) == 1
  1023. assert tan(x).as_leading_term(x) == x
  1024. assert cot(x).as_leading_term(x) == 1/x
  1025. assert asin(x).as_leading_term(x) == x
  1026. assert acos(x).as_leading_term(x) == pi/2
  1027. assert atan(x).as_leading_term(x) == x
  1028. assert acot(x).as_leading_term(x) == pi/2
  1029. def test_leading_terms():
  1030. assert sin(1/x).as_leading_term(x) == AccumBounds(-1, 1)
  1031. assert sin(S.Half).as_leading_term(x) == sin(S.Half)
  1032. assert cos(1/x).as_leading_term(x) == AccumBounds(-1, 1)
  1033. assert cos(S.Half).as_leading_term(x) == cos(S.Half)
  1034. for func in [tan, cot]:
  1035. for a in (1/x, S.Half):
  1036. eq = func(a)
  1037. assert eq.as_leading_term(x) == eq
  1038. # https://github.com/sympy/sympy/issues/21038
  1039. f = sin(pi*(x + 4))/(3*x)
  1040. assert f.as_leading_term(x) == pi/3
  1041. def test_atan2_expansion():
  1042. assert cancel(atan2(x**2, x + 1).diff(x) - atan(x**2/(x + 1)).diff(x)) == 0
  1043. assert cancel(atan(y/x).series(y, 0, 5) - atan2(y, x).series(y, 0, 5)
  1044. + atan2(0, x) - atan(0)) == O(y**5)
  1045. assert cancel(atan(y/x).series(x, 1, 4) - atan2(y, x).series(x, 1, 4)
  1046. + atan2(y, 1) - atan(y)) == O((x - 1)**4, (x, 1))
  1047. assert cancel(atan((y + x)/x).series(x, 1, 3) - atan2(y + x, x).series(x, 1, 3)
  1048. + atan2(1 + y, 1) - atan(1 + y)) == O((x - 1)**3, (x, 1))
  1049. assert Matrix([atan2(y, x)]).jacobian([y, x]) == \
  1050. Matrix([[x/(y**2 + x**2), -y/(y**2 + x**2)]])
  1051. def test_aseries():
  1052. def t(n, v, d, e):
  1053. assert abs(
  1054. n(1/v).evalf() - n(1/x).series(x, dir=d).removeO().subs(x, v)) < e
  1055. t(atan, 0.1, '+', 1e-5)
  1056. t(atan, -0.1, '-', 1e-5)
  1057. t(acot, 0.1, '+', 1e-5)
  1058. t(acot, -0.1, '-', 1e-5)
  1059. def test_issue_4420():
  1060. i = Symbol('i', integer=True)
  1061. e = Symbol('e', even=True)
  1062. o = Symbol('o', odd=True)
  1063. # unknown parity for variable
  1064. assert cos(4*i*pi) == 1
  1065. assert sin(4*i*pi) == 0
  1066. assert tan(4*i*pi) == 0
  1067. assert cot(4*i*pi) is zoo
  1068. assert cos(3*i*pi) == cos(pi*i) # +/-1
  1069. assert sin(3*i*pi) == 0
  1070. assert tan(3*i*pi) == 0
  1071. assert cot(3*i*pi) is zoo
  1072. assert cos(4.0*i*pi) == 1
  1073. assert sin(4.0*i*pi) == 0
  1074. assert tan(4.0*i*pi) == 0
  1075. assert cot(4.0*i*pi) is zoo
  1076. assert cos(3.0*i*pi) == cos(pi*i) # +/-1
  1077. assert sin(3.0*i*pi) == 0
  1078. assert tan(3.0*i*pi) == 0
  1079. assert cot(3.0*i*pi) is zoo
  1080. assert cos(4.5*i*pi) == cos(0.5*pi*i)
  1081. assert sin(4.5*i*pi) == sin(0.5*pi*i)
  1082. assert tan(4.5*i*pi) == tan(0.5*pi*i)
  1083. assert cot(4.5*i*pi) == cot(0.5*pi*i)
  1084. # parity of variable is known
  1085. assert cos(4*e*pi) == 1
  1086. assert sin(4*e*pi) == 0
  1087. assert tan(4*e*pi) == 0
  1088. assert cot(4*e*pi) is zoo
  1089. assert cos(3*e*pi) == 1
  1090. assert sin(3*e*pi) == 0
  1091. assert tan(3*e*pi) == 0
  1092. assert cot(3*e*pi) is zoo
  1093. assert cos(4.0*e*pi) == 1
  1094. assert sin(4.0*e*pi) == 0
  1095. assert tan(4.0*e*pi) == 0
  1096. assert cot(4.0*e*pi) is zoo
  1097. assert cos(3.0*e*pi) == 1
  1098. assert sin(3.0*e*pi) == 0
  1099. assert tan(3.0*e*pi) == 0
  1100. assert cot(3.0*e*pi) is zoo
  1101. assert cos(4.5*e*pi) == cos(0.5*pi*e)
  1102. assert sin(4.5*e*pi) == sin(0.5*pi*e)
  1103. assert tan(4.5*e*pi) == tan(0.5*pi*e)
  1104. assert cot(4.5*e*pi) == cot(0.5*pi*e)
  1105. assert cos(4*o*pi) == 1
  1106. assert sin(4*o*pi) == 0
  1107. assert tan(4*o*pi) == 0
  1108. assert cot(4*o*pi) is zoo
  1109. assert cos(3*o*pi) == -1
  1110. assert sin(3*o*pi) == 0
  1111. assert tan(3*o*pi) == 0
  1112. assert cot(3*o*pi) is zoo
  1113. assert cos(4.0*o*pi) == 1
  1114. assert sin(4.0*o*pi) == 0
  1115. assert tan(4.0*o*pi) == 0
  1116. assert cot(4.0*o*pi) is zoo
  1117. assert cos(3.0*o*pi) == -1
  1118. assert sin(3.0*o*pi) == 0
  1119. assert tan(3.0*o*pi) == 0
  1120. assert cot(3.0*o*pi) is zoo
  1121. assert cos(4.5*o*pi) == cos(0.5*pi*o)
  1122. assert sin(4.5*o*pi) == sin(0.5*pi*o)
  1123. assert tan(4.5*o*pi) == tan(0.5*pi*o)
  1124. assert cot(4.5*o*pi) == cot(0.5*pi*o)
  1125. # x could be imaginary
  1126. assert cos(4*x*pi) == cos(4*pi*x)
  1127. assert sin(4*x*pi) == sin(4*pi*x)
  1128. assert tan(4*x*pi) == tan(4*pi*x)
  1129. assert cot(4*x*pi) == cot(4*pi*x)
  1130. assert cos(3*x*pi) == cos(3*pi*x)
  1131. assert sin(3*x*pi) == sin(3*pi*x)
  1132. assert tan(3*x*pi) == tan(3*pi*x)
  1133. assert cot(3*x*pi) == cot(3*pi*x)
  1134. assert cos(4.0*x*pi) == cos(4.0*pi*x)
  1135. assert sin(4.0*x*pi) == sin(4.0*pi*x)
  1136. assert tan(4.0*x*pi) == tan(4.0*pi*x)
  1137. assert cot(4.0*x*pi) == cot(4.0*pi*x)
  1138. assert cos(3.0*x*pi) == cos(3.0*pi*x)
  1139. assert sin(3.0*x*pi) == sin(3.0*pi*x)
  1140. assert tan(3.0*x*pi) == tan(3.0*pi*x)
  1141. assert cot(3.0*x*pi) == cot(3.0*pi*x)
  1142. assert cos(4.5*x*pi) == cos(4.5*pi*x)
  1143. assert sin(4.5*x*pi) == sin(4.5*pi*x)
  1144. assert tan(4.5*x*pi) == tan(4.5*pi*x)
  1145. assert cot(4.5*x*pi) == cot(4.5*pi*x)
  1146. def test_inverses():
  1147. raises(AttributeError, lambda: sin(x).inverse())
  1148. raises(AttributeError, lambda: cos(x).inverse())
  1149. assert tan(x).inverse() == atan
  1150. assert cot(x).inverse() == acot
  1151. raises(AttributeError, lambda: csc(x).inverse())
  1152. raises(AttributeError, lambda: sec(x).inverse())
  1153. assert asin(x).inverse() == sin
  1154. assert acos(x).inverse() == cos
  1155. assert atan(x).inverse() == tan
  1156. assert acot(x).inverse() == cot
  1157. def test_real_imag():
  1158. a, b = symbols('a b', real=True)
  1159. z = a + b*I
  1160. for deep in [True, False]:
  1161. assert sin(
  1162. z).as_real_imag(deep=deep) == (sin(a)*cosh(b), cos(a)*sinh(b))
  1163. assert cos(
  1164. z).as_real_imag(deep=deep) == (cos(a)*cosh(b), -sin(a)*sinh(b))
  1165. assert tan(z).as_real_imag(deep=deep) == (sin(2*a)/(cos(2*a) +
  1166. cosh(2*b)), sinh(2*b)/(cos(2*a) + cosh(2*b)))
  1167. assert cot(z).as_real_imag(deep=deep) == (-sin(2*a)/(cos(2*a) -
  1168. cosh(2*b)), sinh(2*b)/(cos(2*a) - cosh(2*b)))
  1169. assert sin(a).as_real_imag(deep=deep) == (sin(a), 0)
  1170. assert cos(a).as_real_imag(deep=deep) == (cos(a), 0)
  1171. assert tan(a).as_real_imag(deep=deep) == (tan(a), 0)
  1172. assert cot(a).as_real_imag(deep=deep) == (cot(a), 0)
  1173. @XFAIL
  1174. def test_sin_cos_with_infinity():
  1175. # Test for issue 5196
  1176. # https://github.com/sympy/sympy/issues/5196
  1177. assert sin(oo) is S.NaN
  1178. assert cos(oo) is S.NaN
  1179. @slow
  1180. def test_sincos_rewrite_sqrt():
  1181. # equivalent to testing rewrite(pow)
  1182. for p in [1, 3, 5, 17]:
  1183. for t in [1, 8]:
  1184. n = t*p
  1185. # The vertices `exp(i*pi/n)` of a regular `n`-gon can
  1186. # be expressed by means of nested square roots if and
  1187. # only if `n` is a product of Fermat primes, `p`, and
  1188. # powers of 2, `t'. The code aims to check all vertices
  1189. # not belonging to an `m`-gon for `m < n`(`gcd(i, n) == 1`).
  1190. # For large `n` this makes the test too slow, therefore
  1191. # the vertices are limited to those of index `i < 10`.
  1192. for i in range(1, min((n + 1)//2 + 1, 10)):
  1193. if 1 == gcd(i, n):
  1194. x = i*pi/n
  1195. s1 = sin(x).rewrite(sqrt)
  1196. c1 = cos(x).rewrite(sqrt)
  1197. assert not s1.has(cos, sin), "fails for %d*pi/%d" % (i, n)
  1198. assert not c1.has(cos, sin), "fails for %d*pi/%d" % (i, n)
  1199. assert 1e-3 > abs(sin(x.evalf(5)) - s1.evalf(2)), "fails for %d*pi/%d" % (i, n)
  1200. assert 1e-3 > abs(cos(x.evalf(5)) - c1.evalf(2)), "fails for %d*pi/%d" % (i, n)
  1201. assert cos(pi/14).rewrite(sqrt) == sqrt(cos(pi/7)/2 + S.Half)
  1202. assert cos(pi/257).rewrite(sqrt).evalf(64) == cos(pi/257).evalf(64)
  1203. assert cos(pi*Rational(-15, 2)/11, evaluate=False).rewrite(
  1204. sqrt) == -sqrt(-cos(pi*Rational(4, 11))/2 + S.Half)
  1205. assert cos(Mul(2, pi, S.Half, evaluate=False), evaluate=False).rewrite(
  1206. sqrt) == -1
  1207. e = cos(pi/3/17) # don't use pi/15 since that is caught at instantiation
  1208. a = (
  1209. -3*sqrt(-sqrt(17) + 17)*sqrt(sqrt(17) + 17)/64 -
  1210. 3*sqrt(34)*sqrt(sqrt(17) + 17)/128 - sqrt(sqrt(17) +
  1211. 17)*sqrt(-8*sqrt(2)*sqrt(sqrt(17) + 17) - sqrt(2)*sqrt(-sqrt(17) + 17)
  1212. + sqrt(34)*sqrt(-sqrt(17) + 17) + 6*sqrt(17) + 34)/64 - sqrt(-sqrt(17)
  1213. + 17)*sqrt(-8*sqrt(2)*sqrt(sqrt(17) + 17) - sqrt(2)*sqrt(-sqrt(17) +
  1214. 17) + sqrt(34)*sqrt(-sqrt(17) + 17) + 6*sqrt(17) + 34)/128 - Rational(1, 32) +
  1215. sqrt(2)*sqrt(-8*sqrt(2)*sqrt(sqrt(17) + 17) - sqrt(2)*sqrt(-sqrt(17) +
  1216. 17) + sqrt(34)*sqrt(-sqrt(17) + 17) + 6*sqrt(17) + 34)/64 +
  1217. 3*sqrt(2)*sqrt(sqrt(17) + 17)/128 + sqrt(34)*sqrt(-sqrt(17) + 17)/128
  1218. + 13*sqrt(2)*sqrt(-sqrt(17) + 17)/128 + sqrt(17)*sqrt(-sqrt(17) +
  1219. 17)*sqrt(-8*sqrt(2)*sqrt(sqrt(17) + 17) - sqrt(2)*sqrt(-sqrt(17) + 17)
  1220. + sqrt(34)*sqrt(-sqrt(17) + 17) + 6*sqrt(17) + 34)/128 + 5*sqrt(17)/32
  1221. + sqrt(3)*sqrt(-sqrt(2)*sqrt(sqrt(17) + 17)*sqrt(sqrt(17)/32 +
  1222. sqrt(2)*sqrt(-sqrt(17) + 17)/32 +
  1223. sqrt(2)*sqrt(-8*sqrt(2)*sqrt(sqrt(17) + 17) - sqrt(2)*sqrt(-sqrt(17) +
  1224. 17) + sqrt(34)*sqrt(-sqrt(17) + 17) + 6*sqrt(17) + 34)/32 + Rational(15, 32))/8 -
  1225. 5*sqrt(2)*sqrt(sqrt(17)/32 + sqrt(2)*sqrt(-sqrt(17) + 17)/32 +
  1226. sqrt(2)*sqrt(-8*sqrt(2)*sqrt(sqrt(17) + 17) - sqrt(2)*sqrt(-sqrt(17) +
  1227. 17) + sqrt(34)*sqrt(-sqrt(17) + 17) + 6*sqrt(17) + 34)/32 +
  1228. Rational(15, 32))*sqrt(-8*sqrt(2)*sqrt(sqrt(17) + 17) - sqrt(2)*sqrt(-sqrt(17) +
  1229. 17) + sqrt(34)*sqrt(-sqrt(17) + 17) + 6*sqrt(17) + 34)/64 -
  1230. 3*sqrt(2)*sqrt(-sqrt(17) + 17)*sqrt(sqrt(17)/32 +
  1231. sqrt(2)*sqrt(-sqrt(17) + 17)/32 +
  1232. sqrt(2)*sqrt(-8*sqrt(2)*sqrt(sqrt(17) + 17) - sqrt(2)*sqrt(-sqrt(17) +
  1233. 17) + sqrt(34)*sqrt(-sqrt(17) + 17) + 6*sqrt(17) + 34)/32 + Rational(15, 32))/32
  1234. + sqrt(34)*sqrt(sqrt(17)/32 + sqrt(2)*sqrt(-sqrt(17) + 17)/32 +
  1235. sqrt(2)*sqrt(-8*sqrt(2)*sqrt(sqrt(17) + 17) - sqrt(2)*sqrt(-sqrt(17) +
  1236. 17) + sqrt(34)*sqrt(-sqrt(17) + 17) + 6*sqrt(17) + 34)/32 +
  1237. Rational(15, 32))*sqrt(-8*sqrt(2)*sqrt(sqrt(17) + 17) - sqrt(2)*sqrt(-sqrt(17) +
  1238. 17) + sqrt(34)*sqrt(-sqrt(17) + 17) + 6*sqrt(17) + 34)/64 +
  1239. sqrt(sqrt(17)/32 + sqrt(2)*sqrt(-sqrt(17) + 17)/32 +
  1240. sqrt(2)*sqrt(-8*sqrt(2)*sqrt(sqrt(17) + 17) - sqrt(2)*sqrt(-sqrt(17) +
  1241. 17) + sqrt(34)*sqrt(-sqrt(17) + 17) + 6*sqrt(17) + 34)/32 + Rational(15, 32))/2 +
  1242. S.Half + sqrt(-sqrt(17) + 17)*sqrt(sqrt(17)/32 + sqrt(2)*sqrt(-sqrt(17) +
  1243. 17)/32 + sqrt(2)*sqrt(-8*sqrt(2)*sqrt(sqrt(17) + 17) -
  1244. sqrt(2)*sqrt(-sqrt(17) + 17) + sqrt(34)*sqrt(-sqrt(17) + 17) +
  1245. 6*sqrt(17) + 34)/32 + Rational(15, 32))*sqrt(-8*sqrt(2)*sqrt(sqrt(17) + 17) -
  1246. sqrt(2)*sqrt(-sqrt(17) + 17) + sqrt(34)*sqrt(-sqrt(17) + 17) +
  1247. 6*sqrt(17) + 34)/32 + sqrt(34)*sqrt(-sqrt(17) + 17)*sqrt(sqrt(17)/32 +
  1248. sqrt(2)*sqrt(-sqrt(17) + 17)/32 +
  1249. sqrt(2)*sqrt(-8*sqrt(2)*sqrt(sqrt(17) + 17) - sqrt(2)*sqrt(-sqrt(17) +
  1250. 17) + sqrt(34)*sqrt(-sqrt(17) + 17) + 6*sqrt(17) + 34)/32 +
  1251. Rational(15, 32))/32)/2)
  1252. assert e.rewrite(sqrt) == a
  1253. assert e.n() == a.n()
  1254. # coverage of fermatCoords: multiplicity > 1; the following could be
  1255. # different but that portion of the code should be tested in some way
  1256. assert cos(pi/9/17).rewrite(sqrt) == \
  1257. sin(pi/9)*sin(pi*Rational(2, 17)) + cos(pi/9)*cos(pi*Rational(2, 17))
  1258. @slow
  1259. def test_tancot_rewrite_sqrt():
  1260. # equivalent to testing rewrite(pow)
  1261. for p in [1, 3, 5, 17]:
  1262. for t in [1, 8]:
  1263. n = t*p
  1264. for i in range(1, min((n + 1)//2 + 1, 10)):
  1265. if 1 == gcd(i, n):
  1266. x = i*pi/n
  1267. if 2*i != n and 3*i != 2*n:
  1268. t1 = tan(x).rewrite(sqrt)
  1269. assert not t1.has(cot, tan), "fails for %d*pi/%d" % (i, n)
  1270. assert 1e-3 > abs( tan(x.evalf(7)) - t1.evalf(4) ), "fails for %d*pi/%d" % (i, n)
  1271. if i != 0 and i != n:
  1272. c1 = cot(x).rewrite(sqrt)
  1273. assert not c1.has(cot, tan), "fails for %d*pi/%d" % (i, n)
  1274. assert 1e-3 > abs( cot(x.evalf(7)) - c1.evalf(4) ), "fails for %d*pi/%d" % (i, n)
  1275. def test_sec():
  1276. x = symbols('x', real=True)
  1277. z = symbols('z')
  1278. assert sec.nargs == FiniteSet(1)
  1279. assert sec(zoo) is nan
  1280. assert sec(0) == 1
  1281. assert sec(pi) == -1
  1282. assert sec(pi/2) is zoo
  1283. assert sec(-pi/2) is zoo
  1284. assert sec(pi/6) == 2*sqrt(3)/3
  1285. assert sec(pi/3) == 2
  1286. assert sec(pi*Rational(5, 2)) is zoo
  1287. assert sec(pi*Rational(9, 7)) == -sec(pi*Rational(2, 7))
  1288. assert sec(pi*Rational(3, 4)) == -sqrt(2) # issue 8421
  1289. assert sec(I) == 1/cosh(1)
  1290. assert sec(x*I) == 1/cosh(x)
  1291. assert sec(-x) == sec(x)
  1292. assert sec(asec(x)) == x
  1293. assert sec(z).conjugate() == sec(conjugate(z))
  1294. assert (sec(z).as_real_imag() ==
  1295. (cos(re(z))*cosh(im(z))/(sin(re(z))**2*sinh(im(z))**2 +
  1296. cos(re(z))**2*cosh(im(z))**2),
  1297. sin(re(z))*sinh(im(z))/(sin(re(z))**2*sinh(im(z))**2 +
  1298. cos(re(z))**2*cosh(im(z))**2)))
  1299. assert sec(x).expand(trig=True) == 1/cos(x)
  1300. assert sec(2*x).expand(trig=True) == 1/(2*cos(x)**2 - 1)
  1301. assert sec(x).is_extended_real == True
  1302. assert sec(z).is_real == None
  1303. assert sec(a).is_algebraic is None
  1304. assert sec(na).is_algebraic is False
  1305. assert sec(x).as_leading_term() == sec(x)
  1306. assert sec(0, evaluate=False).is_finite == True
  1307. assert sec(x).is_finite == None
  1308. assert sec(pi/2, evaluate=False).is_finite == False
  1309. assert series(sec(x), x, x0=0, n=6) == 1 + x**2/2 + 5*x**4/24 + O(x**6)
  1310. # https://github.com/sympy/sympy/issues/7166
  1311. assert series(sqrt(sec(x))) == 1 + x**2/4 + 7*x**4/96 + O(x**6)
  1312. # https://github.com/sympy/sympy/issues/7167
  1313. assert (series(sqrt(sec(x)), x, x0=pi*3/2, n=4) ==
  1314. 1/sqrt(x - pi*Rational(3, 2)) + (x - pi*Rational(3, 2))**Rational(3, 2)/12 +
  1315. (x - pi*Rational(3, 2))**Rational(7, 2)/160 + O((x - pi*Rational(3, 2))**4, (x, pi*Rational(3, 2))))
  1316. assert sec(x).diff(x) == tan(x)*sec(x)
  1317. # Taylor Term checks
  1318. assert sec(z).taylor_term(4, z) == 5*z**4/24
  1319. assert sec(z).taylor_term(6, z) == 61*z**6/720
  1320. assert sec(z).taylor_term(5, z) == 0
  1321. def test_sec_rewrite():
  1322. assert sec(x).rewrite(exp) == 1/(exp(I*x)/2 + exp(-I*x)/2)
  1323. assert sec(x).rewrite(cos) == 1/cos(x)
  1324. assert sec(x).rewrite(tan) == (tan(x/2)**2 + 1)/(-tan(x/2)**2 + 1)
  1325. assert sec(x).rewrite(pow) == sec(x)
  1326. assert sec(x).rewrite(sqrt) == sec(x)
  1327. assert sec(z).rewrite(cot) == (cot(z/2)**2 + 1)/(cot(z/2)**2 - 1)
  1328. assert sec(x).rewrite(sin) == 1 / sin(x + pi / 2, evaluate=False)
  1329. assert sec(x).rewrite(tan) == (tan(x / 2)**2 + 1) / (-tan(x / 2)**2 + 1)
  1330. assert sec(x).rewrite(csc) == csc(-x + pi/2, evaluate=False)
  1331. def test_sec_fdiff():
  1332. assert sec(x).fdiff() == tan(x)*sec(x)
  1333. raises(ArgumentIndexError, lambda: sec(x).fdiff(2))
  1334. def test_csc():
  1335. x = symbols('x', real=True)
  1336. z = symbols('z')
  1337. # https://github.com/sympy/sympy/issues/6707
  1338. cosecant = csc('x')
  1339. alternate = 1/sin('x')
  1340. assert cosecant.equals(alternate) == True
  1341. assert alternate.equals(cosecant) == True
  1342. assert csc.nargs == FiniteSet(1)
  1343. assert csc(0) is zoo
  1344. assert csc(pi) is zoo
  1345. assert csc(zoo) is nan
  1346. assert csc(pi/2) == 1
  1347. assert csc(-pi/2) == -1
  1348. assert csc(pi/6) == 2
  1349. assert csc(pi/3) == 2*sqrt(3)/3
  1350. assert csc(pi*Rational(5, 2)) == 1
  1351. assert csc(pi*Rational(9, 7)) == -csc(pi*Rational(2, 7))
  1352. assert csc(pi*Rational(3, 4)) == sqrt(2) # issue 8421
  1353. assert csc(I) == -I/sinh(1)
  1354. assert csc(x*I) == -I/sinh(x)
  1355. assert csc(-x) == -csc(x)
  1356. assert csc(acsc(x)) == x
  1357. assert csc(z).conjugate() == csc(conjugate(z))
  1358. assert (csc(z).as_real_imag() ==
  1359. (sin(re(z))*cosh(im(z))/(sin(re(z))**2*cosh(im(z))**2 +
  1360. cos(re(z))**2*sinh(im(z))**2),
  1361. -cos(re(z))*sinh(im(z))/(sin(re(z))**2*cosh(im(z))**2 +
  1362. cos(re(z))**2*sinh(im(z))**2)))
  1363. assert csc(x).expand(trig=True) == 1/sin(x)
  1364. assert csc(2*x).expand(trig=True) == 1/(2*sin(x)*cos(x))
  1365. assert csc(x).is_extended_real == True
  1366. assert csc(z).is_real == None
  1367. assert csc(a).is_algebraic is None
  1368. assert csc(na).is_algebraic is False
  1369. assert csc(x).as_leading_term() == csc(x)
  1370. assert csc(0, evaluate=False).is_finite == False
  1371. assert csc(x).is_finite == None
  1372. assert csc(pi/2, evaluate=False).is_finite == True
  1373. assert series(csc(x), x, x0=pi/2, n=6) == \
  1374. 1 + (x - pi/2)**2/2 + 5*(x - pi/2)**4/24 + O((x - pi/2)**6, (x, pi/2))
  1375. assert series(csc(x), x, x0=0, n=6) == \
  1376. 1/x + x/6 + 7*x**3/360 + 31*x**5/15120 + O(x**6)
  1377. assert csc(x).diff(x) == -cot(x)*csc(x)
  1378. assert csc(x).taylor_term(2, x) == 0
  1379. assert csc(x).taylor_term(3, x) == 7*x**3/360
  1380. assert csc(x).taylor_term(5, x) == 31*x**5/15120
  1381. raises(ArgumentIndexError, lambda: csc(x).fdiff(2))
  1382. def test_asec():
  1383. z = Symbol('z', zero=True)
  1384. assert asec(z) is zoo
  1385. assert asec(nan) is nan
  1386. assert asec(1) == 0
  1387. assert asec(-1) == pi
  1388. assert asec(oo) == pi/2
  1389. assert asec(-oo) == pi/2
  1390. assert asec(zoo) == pi/2
  1391. assert asec(sec(pi*Rational(13, 4))) == pi*Rational(3, 4)
  1392. assert asec(1 + sqrt(5)) == pi*Rational(2, 5)
  1393. assert asec(2/sqrt(3)) == pi/6
  1394. assert asec(sqrt(4 - 2*sqrt(2))) == pi/8
  1395. assert asec(-sqrt(4 + 2*sqrt(2))) == pi*Rational(5, 8)
  1396. assert asec(sqrt(2 + 2*sqrt(5)/5)) == pi*Rational(3, 10)
  1397. assert asec(-sqrt(2 + 2*sqrt(5)/5)) == pi*Rational(7, 10)
  1398. assert asec(sqrt(2) - sqrt(6)) == pi*Rational(11, 12)
  1399. assert asec(x).diff(x) == 1/(x**2*sqrt(1 - 1/x**2))
  1400. assert asec(x).as_leading_term(x) == I*log(x)
  1401. assert asec(x).rewrite(log) == I*log(sqrt(1 - 1/x**2) + I/x) + pi/2
  1402. assert asec(x).rewrite(asin) == -asin(1/x) + pi/2
  1403. assert asec(x).rewrite(acos) == acos(1/x)
  1404. assert asec(x).rewrite(atan) == (2*atan(x + sqrt(x**2 - 1)) - pi/2)*sqrt(x**2)/x
  1405. assert asec(x).rewrite(acot) == (2*acot(x - sqrt(x**2 - 1)) - pi/2)*sqrt(x**2)/x
  1406. assert asec(x).rewrite(acsc) == -acsc(x) + pi/2
  1407. raises(ArgumentIndexError, lambda: asec(x).fdiff(2))
  1408. def test_asec_is_real():
  1409. assert asec(S.Half).is_real is False
  1410. n = Symbol('n', positive=True, integer=True)
  1411. assert asec(n).is_extended_real is True
  1412. assert asec(x).is_real is None
  1413. assert asec(r).is_real is None
  1414. t = Symbol('t', real=False, finite=True)
  1415. assert asec(t).is_real is False
  1416. def test_acsc():
  1417. assert acsc(nan) is nan
  1418. assert acsc(1) == pi/2
  1419. assert acsc(-1) == -pi/2
  1420. assert acsc(oo) == 0
  1421. assert acsc(-oo) == 0
  1422. assert acsc(zoo) == 0
  1423. assert acsc(0) is zoo
  1424. assert acsc(csc(3)) == -3 + pi
  1425. assert acsc(csc(4)) == -4 + pi
  1426. assert acsc(csc(6)) == 6 - 2*pi
  1427. assert unchanged(acsc, csc(x))
  1428. assert unchanged(acsc, sec(x))
  1429. assert acsc(2/sqrt(3)) == pi/3
  1430. assert acsc(csc(pi*Rational(13, 4))) == -pi/4
  1431. assert acsc(sqrt(2 + 2*sqrt(5)/5)) == pi/5
  1432. assert acsc(-sqrt(2 + 2*sqrt(5)/5)) == -pi/5
  1433. assert acsc(-2) == -pi/6
  1434. assert acsc(-sqrt(4 + 2*sqrt(2))) == -pi/8
  1435. assert acsc(sqrt(4 - 2*sqrt(2))) == pi*Rational(3, 8)
  1436. assert acsc(1 + sqrt(5)) == pi/10
  1437. assert acsc(sqrt(2) - sqrt(6)) == pi*Rational(-5, 12)
  1438. assert acsc(x).diff(x) == -1/(x**2*sqrt(1 - 1/x**2))
  1439. assert acsc(x).as_leading_term(x) == I*log(x)
  1440. assert acsc(x).rewrite(log) == -I*log(sqrt(1 - 1/x**2) + I/x)
  1441. assert acsc(x).rewrite(asin) == asin(1/x)
  1442. assert acsc(x).rewrite(acos) == -acos(1/x) + pi/2
  1443. assert acsc(x).rewrite(atan) == (-atan(sqrt(x**2 - 1)) + pi/2)*sqrt(x**2)/x
  1444. assert acsc(x).rewrite(acot) == (-acot(1/sqrt(x**2 - 1)) + pi/2)*sqrt(x**2)/x
  1445. assert acsc(x).rewrite(asec) == -asec(x) + pi/2
  1446. raises(ArgumentIndexError, lambda: acsc(x).fdiff(2))
  1447. def test_csc_rewrite():
  1448. assert csc(x).rewrite(pow) == csc(x)
  1449. assert csc(x).rewrite(sqrt) == csc(x)
  1450. assert csc(x).rewrite(exp) == 2*I/(exp(I*x) - exp(-I*x))
  1451. assert csc(x).rewrite(sin) == 1/sin(x)
  1452. assert csc(x).rewrite(tan) == (tan(x/2)**2 + 1)/(2*tan(x/2))
  1453. assert csc(x).rewrite(cot) == (cot(x/2)**2 + 1)/(2*cot(x/2))
  1454. assert csc(x).rewrite(cos) == 1/cos(x - pi/2, evaluate=False)
  1455. assert csc(x).rewrite(sec) == sec(-x + pi/2, evaluate=False)
  1456. # issue 17349
  1457. assert csc(1 - exp(-besselj(I, I))).rewrite(cos) == \
  1458. -1/cos(-pi/2 - 1 + cos(I*besselj(I, I)) +
  1459. I*cos(-pi/2 + I*besselj(I, I), evaluate=False), evaluate=False)
  1460. def test_inverses_nseries():
  1461. assert asin(x + 2)._eval_nseries(x, 4, None, I) == -asin(2) + pi + sqrt(3)*I*x/3 - sqrt(3)*I*x**2/9 + \
  1462. sqrt(3)*I*x**3/18 + O(x**4)
  1463. assert asin(x + 2)._eval_nseries(x, 4, None, -I) == asin(2) - sqrt(3)*I*x/3 + sqrt(3)*I*x**2/9 - sqrt(3)*I*x**3/18 + O(x**4)
  1464. assert asin(x - 2)._eval_nseries(x, 4, None, I) == -asin(2) - sqrt(3)*I*x/3 - sqrt(3)*I*x**2/9 - sqrt(3)*I*x**3/18 + O(x**4)
  1465. assert asin(x - 2)._eval_nseries(x, 4, None, -I) == asin(2) - pi + sqrt(3)*I*x/3 + sqrt(3)*I*x**2/9 + \
  1466. sqrt(3)*I*x**3/18 + O(x**4)
  1467. assert asin(I*x + I*x**3 + 2)._eval_nseries(x, 3, None, 1) == -asin(2) + pi - sqrt(3)*x/3 + sqrt(3)*I*x**2/9 + O(x**3)
  1468. assert asin(I*x + I*x**3 + 2)._eval_nseries(x, 3, None, -1) == asin(2) + sqrt(3)*x/3 - sqrt(3)*I*x**2/9 + O(x**3)
  1469. assert asin(I*x + I*x**3 - 2)._eval_nseries(x, 3, None, 1) == -asin(2) + sqrt(3)*x/3 + sqrt(3)*I*x**2/9 + O(x**3)
  1470. assert asin(I*x + I*x**3 - 2)._eval_nseries(x, 3, None, -1) == asin(2) - pi - sqrt(3)*x/3 - sqrt(3)*I*x**2/9 + O(x**3)
  1471. assert asin(I*x**2 + I*x**3 + 2)._eval_nseries(x, 3, None, 1) == -asin(2) + pi - sqrt(3)*x**2/3 + O(x**3)
  1472. assert asin(I*x**2 + I*x**3 + 2)._eval_nseries(x, 3, None, -1) == -asin(2) + pi - sqrt(3)*x**2/3 + O(x**3)
  1473. assert asin(I*x**2 + I*x**3 - 2)._eval_nseries(x, 3, None, 1) == -asin(2) + sqrt(3)*x**2/3 + O(x**3)
  1474. assert asin(I*x**2 + I*x**3 - 2)._eval_nseries(x, 3, None, -1) == -asin(2) + sqrt(3)*x**2/3 + O(x**3)
  1475. assert asin(1 + x)._eval_nseries(x, 3, None) == pi/2 - sqrt(2)*sqrt(-x) - \
  1476. sqrt(2)*(-x)**(S(3)/2)/12 - 3*sqrt(2)*(-x)**(S(5)/2)/160 + O(x**3)
  1477. assert asin(-1 + x)._eval_nseries(x, 3, None) == -pi/2 + sqrt(2)*sqrt(x) + \
  1478. sqrt(2)*x**(S(3)/2)/12 + 3*sqrt(2)*x**(S(5)/2)/160 + O(x**3)
  1479. assert asin(exp(x))._eval_nseries(x, 3, None) == pi/2 - sqrt(2)*sqrt(-x) + \
  1480. sqrt(2)*(-x)**(S(3)/2)/6 - sqrt(2)*(-x)**(S(5)/2)/120 + O(x**3)
  1481. assert asin(-exp(x))._eval_nseries(x, 3, None) == -pi/2 + sqrt(2)*sqrt(-x) - \
  1482. sqrt(2)*(-x)**(S(3)/2)/6 + sqrt(2)*(-x)**(S(5)/2)/120 + O(x**3)
  1483. assert acos(x + 2)._eval_nseries(x, 4, None, I) == -acos(2) - sqrt(3)*I*x/3 + sqrt(3)*I*x**2/9 - sqrt(3)*I*x**3/18 + O(x**4)
  1484. assert acos(x + 2)._eval_nseries(x, 4, None, -I) == acos(2) + sqrt(3)*I*x/3 - sqrt(3)*I*x**2/9 + sqrt(3)*I*x**3/18 + O(x**4)
  1485. assert acos(x - 2)._eval_nseries(x, 4, None, I) == acos(-2) + sqrt(3)*I*x/3 + sqrt(3)*I*x**2/9 + sqrt(3)*I*x**3/18 + O(x**4)
  1486. assert acos(x - 2)._eval_nseries(x, 4, None, -I) == -acos(-2) + 2*pi - sqrt(3)*I*x/3 - \
  1487. sqrt(3)*I*x**2/9 - sqrt(3)*I*x**3/18 + O(x**4)
  1488. # assert acos(I*x + I*x**3 + 2)._eval_nseries(x, 3, None, 1) == -acos(2) + sqrt(3)*x/3 - sqrt(3)*I*x**2/9 + O(x**3)
  1489. # assert acos(I*x + I*x**3 + 2)._eval_nseries(x, 3, None, -1) == acos(2) - sqrt(3)*x/3 + sqrt(3)*I*x**2/9 + O(x**3)
  1490. # assert acos(I*x + I*x**3 - 2)._eval_nseries(x, 3, None, 1) == acos(-2) - sqrt(3)*x/3 - sqrt(3)*I*x**2/9 + O(x**3)
  1491. # assert acos(I*x + I*x**3 - 2)._eval_nseries(x, 3, None, -1) == -acos(-2) + 2*pi + sqrt(3)*x/3 + sqrt(3)*I*x**2/9 + O(x**3)
  1492. # assert acos(I*x**2 + I*x**3 + 2)._eval_nseries(x, 3, None, 1) == -acos(2) + sqrt(3)*x**2/3 + O(x**3)
  1493. # assert acos(I*x**2 + I*x**3 + 2)._eval_nseries(x, 3, None, -1) == -acos(2) + sqrt(3)*x**2/3 + O(x**3)
  1494. # assert acos(I*x**2 + I*x**3 - 2)._eval_nseries(x, 3, None, 1) == acos(-2) - sqrt(3)*x**2/3 + O(x**3)
  1495. # assert acos(I*x**2 + I*x**3 - 2)._eval_nseries(x, 3, None, -1) == acos(-2) - sqrt(3)*x**2/3 + O(x**3)
  1496. # assert acos(1 + x)._eval_nseries(x, 3, None) == sqrt(2)*sqrt(-x) + sqrt(2)*(-x)**(S(3)/2)/12 + 3*sqrt(2)*(-x)**(S(5)/2)/160 + O(x**3)
  1497. # assert acos(-1 + x)._eval_nseries(x, 3, None) == pi - sqrt(2)*sqrt(x) - sqrt(2)*x**(S(3)/2)/12 - 3*sqrt(2)*x**(S(5)/2)/160 + O(x**3)
  1498. # assert acos(exp(x))._eval_nseries(x, 3, None) == sqrt(2)*sqrt(-x) - sqrt(2)*(-x)**(S(3)/2)/6 + sqrt(2)*(-x)**(S(5)/2)/120 + O(x**3)
  1499. # assert acos(-exp(x))._eval_nseries(x, 3, None) == pi - sqrt(2)*sqrt(-x) + sqrt(2)*(-x)**(S(3)/2)/6 - sqrt(2)*(-x)**(S(5)/2)/120 + O(x**3)
  1500. assert atan(x + 2*I)._eval_nseries(x, 4, None, 1) == I*atanh(2) - x/3 - 2*I*x**2/9 + 13*x**3/81 + O(x**4)
  1501. assert atan(x + 2*I)._eval_nseries(x, 4, None, -1) == I*atanh(2) - pi - x/3 - 2*I*x**2/9 + 13*x**3/81 + O(x**4)
  1502. assert atan(x - 2*I)._eval_nseries(x, 4, None, 1) == -I*atanh(2) + pi - x/3 + 2*I*x**2/9 + 13*x**3/81 + O(x**4)
  1503. assert atan(x - 2*I)._eval_nseries(x, 4, None, -1) == -I*atanh(2) - x/3 + 2*I*x**2/9 + 13*x**3/81 + O(x**4)
  1504. # assert atan(x**2 + 2*I)._eval_nseries(x, 3, None, 1) == I*atanh(2) - x**2/3 + O(x**3)
  1505. # assert atan(x**2 + 2*I)._eval_nseries(x, 3, None, -1) == I*atanh(2) - x**2/3 + O(x**3)
  1506. # assert atan(x**2 - 2*I)._eval_nseries(x, 3, None, 1) == -I*atanh(2) + pi - x**2/3 + O(x**3)
  1507. # assert atan(x**2 - 2*I)._eval_nseries(x, 3, None, -1) == -I*atanh(2) + pi - x**2/3 + O(x**3)
  1508. assert atan(1/x)._eval_nseries(x, 2, None, 1) == pi/2 - x + O(x**2)
  1509. assert atan(1/x)._eval_nseries(x, 2, None, -1) == -pi/2 - x + O(x**2)
  1510. assert acot(x + S(1)/2*I)._eval_nseries(x, 4, None, 1) == -I*acoth(S(1)/2) + pi - 4*x/3 + 8*I*x**2/9 + 112*x**3/81 + O(x**4)
  1511. assert acot(x + S(1)/2*I)._eval_nseries(x, 4, None, -1) == -I*acoth(S(1)/2) - 4*x/3 + 8*I*x**2/9 + 112*x**3/81 + O(x**4)
  1512. assert acot(x - S(1)/2*I)._eval_nseries(x, 4, None, 1) == I*acoth(S(1)/2) - 4*x/3 - 8*I*x**2/9 + 112*x**3/81 + O(x**4)
  1513. assert acot(x - S(1)/2*I)._eval_nseries(x, 4, None, -1) == I*acoth(S(1)/2) - pi - 4*x/3 - 8*I*x**2/9 + 112*x**3/81 + O(x**4)
  1514. # assert acot(x**2 + S(1)/2*I)._eval_nseries(x, 3, None, 1) == -I*acoth(S(1)/2) + pi - 4*x**2/3 + O(x**3)
  1515. # assert acot(x**2 + S(1)/2*I)._eval_nseries(x, 3, None, -1) == -I*acoth(S(1)/2) + pi - 4*x**2/3 + O(x**3)
  1516. # assert acot(x**2 - S(1)/2*I)._eval_nseries(x, 3, None, 1) == I*acoth(S(1)/2) - 4*x**2/3 + O(x**3)
  1517. # assert acot(x**2 - S(1)/2*I)._eval_nseries(x, 3, None, -1) == I*acoth(S(1)/2) - 4*x**2/3 + O(x**3)
  1518. # assert acot(x)._eval_nseries(x, 2, None, 1) == pi/2 - x + O(x**2)
  1519. # assert acot(x)._eval_nseries(x, 2, None, -1) == -pi/2 - x + O(x**2)
  1520. assert asec(x + S(1)/2)._eval_nseries(x, 4, None, I) == asec(S(1)/2) - 4*sqrt(3)*I*x/3 + \
  1521. 8*sqrt(3)*I*x**2/9 - 16*sqrt(3)*I*x**3/9 + O(x**4)
  1522. assert asec(x + S(1)/2)._eval_nseries(x, 4, None, -I) == -asec(S(1)/2) + 4*sqrt(3)*I*x/3 - \
  1523. 8*sqrt(3)*I*x**2/9 + 16*sqrt(3)*I*x**3/9 + O(x**4)
  1524. assert asec(x - S(1)/2)._eval_nseries(x, 4, None, I) == -asec(-S(1)/2) + 2*pi + 4*sqrt(3)*I*x/3 + \
  1525. 8*sqrt(3)*I*x**2/9 + 16*sqrt(3)*I*x**3/9 + O(x**4)
  1526. assert asec(x - S(1)/2)._eval_nseries(x, 4, None, -I) == asec(-S(1)/2) - 4*sqrt(3)*I*x/3 - \
  1527. 8*sqrt(3)*I*x**2/9 - 16*sqrt(3)*I*x**3/9 + O(x**4)
  1528. # assert asec(I*x + I*x**3 + S(1)/2)._eval_nseries(x, 3, None, 1) == asec(S(1)/2) + 4*sqrt(3)*x/3 - 8*sqrt(3)*I*x**2/9 + O(x**3)
  1529. # assert asec(I*x + I*x**3 + S(1)/2)._eval_nseries(x, 3, None, -1) == -asec(S(1)/2) - 4*sqrt(3)*x/3 + 8*sqrt(3)*I*x**2/9 + O(x**3)
  1530. # assert asec(I*x + I*x**3 - S(1)/2)._eval_nseries(x, 3, None, 1) == -asec(-S(1)/2) + 2*pi - 4*sqrt(3)*x/3 - 8*sqrt(3)*I*x**2/9 + O(x**3)
  1531. # assert asec(I*x + I*x**3 - S(1)/2)._eval_nseries(x, 3, None, -1) == asec(-S(1)/2) + 4*sqrt(3)*x/3 + 8*sqrt(3)*I*x**2/9 + O(x**3)
  1532. # assert asec(I*x**2 + I*x**3 + S(1)/2)._eval_nseries(x, 3, None, 1) == asec(S(1)/2) + 4*sqrt(3)*x**2/3 + O(x**3)
  1533. # assert asec(I*x**2 + I*x**3 + S(1)/2)._eval_nseries(x, 3, None, -1) == asec(S(1)/2) + 4*sqrt(3)*x**2/3 + O(x**3)
  1534. # assert asec(I*x**2 + I*x**3 - S(1)/2)._eval_nseries(x, 3, None, 1) == -asec(-S(1)/2) + 2*pi - 4*sqrt(3)*x**2/3 + O(x**3)
  1535. # assert asec(I*x**2 + I*x**3 - S(1)/2)._eval_nseries(x, 3, None, -1) == -asec(-S(1)/2) + 2*pi - 4*sqrt(3)*x**2/3 + O(x**3)
  1536. # assert asec(1 + x)._eval_nseries(x, 3, None) == sqrt(2)*sqrt(x) - 5*sqrt(2)*x**(S(3)/2)/12 + 43*sqrt(2)*x**(S(5)/2)/160 + O(x**3)
  1537. # assert asec(-1 + x)._eval_nseries(x, 3, None) == pi - sqrt(2)*sqrt(-x) + 5*sqrt(2)*(-x)**(S(3)/2)/12 - 43*sqrt(2)*(-x)**(S(5)/2)/160 + O(x**3)
  1538. # assert asec(exp(x))._eval_nseries(x, 3, None) == sqrt(2)*sqrt(x) - sqrt(2)*x**(S(3)/2)/6 + sqrt(2)*x**(S(5)/2)/120 + O(x**3)
  1539. # assert asec(-exp(x))._eval_nseries(x, 3, None) == pi - sqrt(2)*sqrt(x) + sqrt(2)*x**(S(3)/2)/6 - sqrt(2)*x**(S(5)/2)/120 + O(x**3)
  1540. assert acsc(x + S(1)/2)._eval_nseries(x, 4, None, I) == acsc(S(1)/2) + 4*sqrt(3)*I*x/3 - \
  1541. 8*sqrt(3)*I*x**2/9 + 16*sqrt(3)*I*x**3/9 + O(x**4)
  1542. assert acsc(x + S(1)/2)._eval_nseries(x, 4, None, -I) == -acsc(S(1)/2) + pi - 4*sqrt(3)*I*x/3 + \
  1543. 8*sqrt(3)*I*x**2/9 - 16*sqrt(3)*I*x**3/9 + O(x**4)
  1544. assert acsc(x - S(1)/2)._eval_nseries(x, 4, None, I) == acsc(S(1)/2) - pi - 4*sqrt(3)*I*x/3 - \
  1545. 8*sqrt(3)*I*x**2/9 - 16*sqrt(3)*I*x**3/9 + O(x**4)
  1546. assert acsc(x - S(1)/2)._eval_nseries(x, 4, None, -I) == -acsc(S(1)/2) + 4*sqrt(3)*I*x/3 + \
  1547. 8*sqrt(3)*I*x**2/9 + 16*sqrt(3)*I*x**3/9 + O(x**4)
  1548. # assert acsc(I*x + I*x**3 + S(1)/2)._eval_nseries(x, 3, None, 1) == acsc(S(1)/2) - 4*sqrt(3)*x/3 + 8*sqrt(3)*I*x**2/9 + O(x**3)
  1549. # assert acsc(I*x + I*x**3 + S(1)/2)._eval_nseries(x, 3, None, -1) == -acsc(S(1)/2) + pi + 4*sqrt(3)*x/3 - 8*sqrt(3)*I*x**2/9 + O(x**3)
  1550. # assert acsc(I*x + I*x**3 - S(1)/2)._eval_nseries(x, 3, None, 1) == acsc(S(1)/2) - pi + 4*sqrt(3)*x/3 + 8*sqrt(3)*I*x**2/9 + O(x**3)
  1551. # assert acsc(I*x + I*x**3 - S(1)/2)._eval_nseries(x, 3, None, -1) == -acsc(S(1)/2) - 4*sqrt(3)*x/3 - 8*sqrt(3)*I*x**2/9 + O(x**3)
  1552. # assert acsc(I*x**2 + I*x**3 + S(1)/2)._eval_nseries(x, 3, None, 1) == acsc(S(1)/2) - 4*sqrt(3)*x**2/3 + O(x**3)
  1553. # assert acsc(I*x**2 + I*x**3 + S(1)/2)._eval_nseries(x, 3, None, -1) == acsc(S(1)/2) - 4*sqrt(3)*x**2/3 + O(x**3)
  1554. # assert acsc(I*x**2 + I*x**3 - S(1)/2)._eval_nseries(x, 3, None, 1) == acsc(S(1)/2) - pi + 4*sqrt(3)*x**2/3 + O(x**3)
  1555. # assert acsc(I*x**2 + I*x**3 - S(1)/2)._eval_nseries(x, 3, None, -1) == acsc(S(1)/2) - pi + 4*sqrt(3)*x**2/3 + O(x**3)
  1556. # assert acsc(1 + x)._eval_nseries(x, 3, None) == pi/2 - sqrt(2)*sqrt(x) + 5*sqrt(2)*x**(S(3)/2)/12 - 43*sqrt(2)*x**(S(5)/2)/160 + O(x**3)
  1557. # assert acsc(-1 + x)._eval_nseries(x, 3, None) == -pi/2 + sqrt(2)*sqrt(-x) - 5*sqrt(2)*(-x)**(S(3)/2)/12 + 43*sqrt(2)*(-x)**(S(5)/2)/160 + O(x**3)
  1558. # assert acsc(exp(x))._eval_nseries(x, 3, None) == pi/2 - sqrt(2)*sqrt(x) + sqrt(2)*x**(S(3)/2)/6 - sqrt(2)*x**(S(5)/2)/120 + O(x**3)
  1559. # assert acsc(-exp(x))._eval_nseries(x, 3, None) == -pi/2 + sqrt(2)*sqrt(x) - sqrt(2)*x**(S(3)/2)/6 + sqrt(2)*x**(S(5)/2)/120 + O(x**3)
  1560. def test_issue_8653():
  1561. n = Symbol('n', integer=True)
  1562. assert sin(n).is_irrational is None
  1563. assert cos(n).is_irrational is None
  1564. assert tan(n).is_irrational is None
  1565. def test_issue_9157():
  1566. n = Symbol('n', integer=True, positive=True)
  1567. assert atan(n - 1).is_nonnegative is True
  1568. def test_trig_period():
  1569. x, y = symbols('x, y')
  1570. assert sin(x).period() == 2*pi
  1571. assert cos(x).period() == 2*pi
  1572. assert tan(x).period() == pi
  1573. assert cot(x).period() == pi
  1574. assert sec(x).period() == 2*pi
  1575. assert csc(x).period() == 2*pi
  1576. assert sin(2*x).period() == pi
  1577. assert cot(4*x - 6).period() == pi/4
  1578. assert cos((-3)*x).period() == pi*Rational(2, 3)
  1579. assert cos(x*y).period(x) == 2*pi/abs(y)
  1580. assert sin(3*x*y + 2*pi).period(y) == 2*pi/abs(3*x)
  1581. assert tan(3*x).period(y) is S.Zero
  1582. raises(NotImplementedError, lambda: sin(x**2).period(x))
  1583. def test_issue_7171():
  1584. assert sin(x).rewrite(sqrt) == sin(x)
  1585. assert sin(x).rewrite(pow) == sin(x)
  1586. def test_issue_11864():
  1587. w, k = symbols('w, k', real=True)
  1588. F = Piecewise((1, Eq(2*pi*k, 0)), (sin(pi*k)/(pi*k), True))
  1589. soln = Piecewise((1, Eq(2*pi*k, 0)), (sinc(pi*k), True))
  1590. assert F.rewrite(sinc) == soln
  1591. def test_real_assumptions():
  1592. z = Symbol('z', real=False, finite=True)
  1593. assert sin(z).is_real is None
  1594. assert cos(z).is_real is None
  1595. assert tan(z).is_real is False
  1596. assert sec(z).is_real is None
  1597. assert csc(z).is_real is None
  1598. assert cot(z).is_real is False
  1599. assert asin(p).is_real is None
  1600. assert asin(n).is_real is None
  1601. assert asec(p).is_real is None
  1602. assert asec(n).is_real is None
  1603. assert acos(p).is_real is None
  1604. assert acos(n).is_real is None
  1605. assert acsc(p).is_real is None
  1606. assert acsc(n).is_real is None
  1607. assert atan(p).is_positive is True
  1608. assert atan(n).is_negative is True
  1609. assert acot(p).is_positive is True
  1610. assert acot(n).is_negative is True
  1611. def test_issue_14320():
  1612. assert asin(sin(2)) == -2 + pi and (-pi/2 <= -2 + pi <= pi/2) and sin(2) == sin(-2 + pi)
  1613. assert asin(cos(2)) == -2 + pi/2 and (-pi/2 <= -2 + pi/2 <= pi/2) and cos(2) == sin(-2 + pi/2)
  1614. assert acos(sin(2)) == -pi/2 + 2 and (0 <= -pi/2 + 2 <= pi) and sin(2) == cos(-pi/2 + 2)
  1615. assert acos(cos(20)) == -6*pi + 20 and (0 <= -6*pi + 20 <= pi) and cos(20) == cos(-6*pi + 20)
  1616. assert acos(cos(30)) == -30 + 10*pi and (0 <= -30 + 10*pi <= pi) and cos(30) == cos(-30 + 10*pi)
  1617. assert atan(tan(17)) == -5*pi + 17 and (-pi/2 < -5*pi + 17 < pi/2) and tan(17) == tan(-5*pi + 17)
  1618. assert atan(tan(15)) == -5*pi + 15 and (-pi/2 < -5*pi + 15 < pi/2) and tan(15) == tan(-5*pi + 15)
  1619. assert atan(cot(12)) == -12 + pi*Rational(7, 2) and (-pi/2 < -12 + pi*Rational(7, 2) < pi/2) and cot(12) == tan(-12 + pi*Rational(7, 2))
  1620. assert acot(cot(15)) == -5*pi + 15 and (-pi/2 < -5*pi + 15 <= pi/2) and cot(15) == cot(-5*pi + 15)
  1621. assert acot(tan(19)) == -19 + pi*Rational(13, 2) and (-pi/2 < -19 + pi*Rational(13, 2) <= pi/2) and tan(19) == cot(-19 + pi*Rational(13, 2))
  1622. assert asec(sec(11)) == -11 + 4*pi and (0 <= -11 + 4*pi <= pi) and cos(11) == cos(-11 + 4*pi)
  1623. assert asec(csc(13)) == -13 + pi*Rational(9, 2) and (0 <= -13 + pi*Rational(9, 2) <= pi) and sin(13) == cos(-13 + pi*Rational(9, 2))
  1624. assert acsc(csc(14)) == -4*pi + 14 and (-pi/2 <= -4*pi + 14 <= pi/2) and sin(14) == sin(-4*pi + 14)
  1625. assert acsc(sec(10)) == pi*Rational(-7, 2) + 10 and (-pi/2 <= pi*Rational(-7, 2) + 10 <= pi/2) and cos(10) == sin(pi*Rational(-7, 2) + 10)
  1626. def test_issue_14543():
  1627. assert sec(2*pi + 11) == sec(11)
  1628. assert sec(2*pi - 11) == sec(11)
  1629. assert sec(pi + 11) == -sec(11)
  1630. assert sec(pi - 11) == -sec(11)
  1631. assert csc(2*pi + 17) == csc(17)
  1632. assert csc(2*pi - 17) == -csc(17)
  1633. assert csc(pi + 17) == -csc(17)
  1634. assert csc(pi - 17) == csc(17)
  1635. x = Symbol('x')
  1636. assert csc(pi/2 + x) == sec(x)
  1637. assert csc(pi/2 - x) == sec(x)
  1638. assert csc(pi*Rational(3, 2) + x) == -sec(x)
  1639. assert csc(pi*Rational(3, 2) - x) == -sec(x)
  1640. assert sec(pi/2 - x) == csc(x)
  1641. assert sec(pi/2 + x) == -csc(x)
  1642. assert sec(pi*Rational(3, 2) + x) == csc(x)
  1643. assert sec(pi*Rational(3, 2) - x) == -csc(x)
  1644. def test_as_real_imag():
  1645. # This is for https://github.com/sympy/sympy/issues/17142
  1646. # If it start failing again in irrelevant builds or in the master
  1647. # please open up the issue again.
  1648. expr = atan(I/(I + I*tan(1)))
  1649. assert expr.as_real_imag() == (expr, 0)
  1650. def test_issue_18746():
  1651. e3 = cos(S.Pi*(x/4 + 1/4))
  1652. assert e3.period() == 8