test_trigonometric.py 88 KB

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