test_fu.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. from sympy.core.add import Add
  2. from sympy.core.mul import Mul
  3. from sympy.core.numbers import (I, Rational, pi)
  4. from sympy.core.singleton import S
  5. from sympy.core.symbol import (Dummy, Symbol, symbols)
  6. from sympy.functions.elementary.hyperbolic import (cosh, coth, csch, sech, sinh, tanh)
  7. from sympy.functions.elementary.miscellaneous import (root, sqrt)
  8. from sympy.functions.elementary.trigonometric import (cos, cot, csc, sec, sin, tan)
  9. from sympy.simplify.powsimp import powsimp
  10. from sympy.simplify.fu import (
  11. L, TR1, TR10, TR10i, TR11, _TR11, TR12, TR12i, TR13, TR14, TR15, TR16,
  12. TR111, TR2, TR2i, TR3, TR5, TR6, TR7, TR8, TR9, TRmorrie, _TR56 as T,
  13. TRpower, hyper_as_trig, fu, process_common_addends, trig_split,
  14. as_f_sign_1)
  15. from sympy.core.random import verify_numerically
  16. from sympy.abc import a, b, c, x, y, z
  17. def test_TR1():
  18. assert TR1(2*csc(x) + sec(x)) == 1/cos(x) + 2/sin(x)
  19. def test_TR2():
  20. assert TR2(tan(x)) == sin(x)/cos(x)
  21. assert TR2(cot(x)) == cos(x)/sin(x)
  22. assert TR2(tan(tan(x) - sin(x)/cos(x))) == 0
  23. def test_TR2i():
  24. # just a reminder that ratios of powers only simplify if both
  25. # numerator and denominator satisfy the condition that each
  26. # has a positive base or an integer exponent; e.g. the following,
  27. # at y=-1, x=1/2 gives sqrt(2)*I != -sqrt(2)*I
  28. assert powsimp(2**x/y**x) != (2/y)**x
  29. assert TR2i(sin(x)/cos(x)) == tan(x)
  30. assert TR2i(sin(x)*sin(y)/cos(x)) == tan(x)*sin(y)
  31. assert TR2i(1/(sin(x)/cos(x))) == 1/tan(x)
  32. assert TR2i(1/(sin(x)*sin(y)/cos(x))) == 1/tan(x)/sin(y)
  33. assert TR2i(sin(x)/2/(cos(x) + 1)) == sin(x)/(cos(x) + 1)/2
  34. assert TR2i(sin(x)/2/(cos(x) + 1), half=True) == tan(x/2)/2
  35. assert TR2i(sin(1)/(cos(1) + 1), half=True) == tan(S.Half)
  36. assert TR2i(sin(2)/(cos(2) + 1), half=True) == tan(1)
  37. assert TR2i(sin(4)/(cos(4) + 1), half=True) == tan(2)
  38. assert TR2i(sin(5)/(cos(5) + 1), half=True) == tan(5*S.Half)
  39. assert TR2i((cos(1) + 1)/sin(1), half=True) == 1/tan(S.Half)
  40. assert TR2i((cos(2) + 1)/sin(2), half=True) == 1/tan(1)
  41. assert TR2i((cos(4) + 1)/sin(4), half=True) == 1/tan(2)
  42. assert TR2i((cos(5) + 1)/sin(5), half=True) == 1/tan(5*S.Half)
  43. assert TR2i((cos(1) + 1)**(-a)*sin(1)**a, half=True) == tan(S.Half)**a
  44. assert TR2i((cos(2) + 1)**(-a)*sin(2)**a, half=True) == tan(1)**a
  45. assert TR2i((cos(4) + 1)**(-a)*sin(4)**a, half=True) == (cos(4) + 1)**(-a)*sin(4)**a
  46. assert TR2i((cos(5) + 1)**(-a)*sin(5)**a, half=True) == (cos(5) + 1)**(-a)*sin(5)**a
  47. assert TR2i((cos(1) + 1)**a*sin(1)**(-a), half=True) == tan(S.Half)**(-a)
  48. assert TR2i((cos(2) + 1)**a*sin(2)**(-a), half=True) == tan(1)**(-a)
  49. assert TR2i((cos(4) + 1)**a*sin(4)**(-a), half=True) == (cos(4) + 1)**a*sin(4)**(-a)
  50. assert TR2i((cos(5) + 1)**a*sin(5)**(-a), half=True) == (cos(5) + 1)**a*sin(5)**(-a)
  51. i = symbols('i', integer=True)
  52. assert TR2i(((cos(5) + 1)**i*sin(5)**(-i)), half=True) == tan(5*S.Half)**(-i)
  53. assert TR2i(1/((cos(5) + 1)**i*sin(5)**(-i)), half=True) == tan(5*S.Half)**i
  54. def test_TR3():
  55. assert TR3(cos(y - x*(y - x))) == cos(x*(x - y) + y)
  56. assert cos(pi/2 + x) == -sin(x)
  57. assert cos(30*pi/2 + x) == -cos(x)
  58. for f in (cos, sin, tan, cot, csc, sec):
  59. i = f(pi*Rational(3, 7))
  60. j = TR3(i)
  61. assert verify_numerically(i, j) and i.func != j.func
  62. def test__TR56():
  63. h = lambda x: 1 - x
  64. assert T(sin(x)**3, sin, cos, h, 4, False) == sin(x)*(-cos(x)**2 + 1)
  65. assert T(sin(x)**10, sin, cos, h, 4, False) == sin(x)**10
  66. assert T(sin(x)**6, sin, cos, h, 6, False) == (-cos(x)**2 + 1)**3
  67. assert T(sin(x)**6, sin, cos, h, 6, True) == sin(x)**6
  68. assert T(sin(x)**8, sin, cos, h, 10, True) == (-cos(x)**2 + 1)**4
  69. # issue 17137
  70. assert T(sin(x)**I, sin, cos, h, 4, True) == sin(x)**I
  71. assert T(sin(x)**(2*I + 1), sin, cos, h, 4, True) == sin(x)**(2*I + 1)
  72. def test_TR5():
  73. assert TR5(sin(x)**2) == -cos(x)**2 + 1
  74. assert TR5(sin(x)**-2) == sin(x)**(-2)
  75. assert TR5(sin(x)**4) == (-cos(x)**2 + 1)**2
  76. def test_TR6():
  77. assert TR6(cos(x)**2) == -sin(x)**2 + 1
  78. assert TR6(cos(x)**-2) == cos(x)**(-2)
  79. assert TR6(cos(x)**4) == (-sin(x)**2 + 1)**2
  80. def test_TR7():
  81. assert TR7(cos(x)**2) == cos(2*x)/2 + S.Half
  82. assert TR7(cos(x)**2 + 1) == cos(2*x)/2 + Rational(3, 2)
  83. def test_TR8():
  84. assert TR8(cos(2)*cos(3)) == cos(5)/2 + cos(1)/2
  85. assert TR8(cos(2)*sin(3)) == sin(5)/2 + sin(1)/2
  86. assert TR8(sin(2)*sin(3)) == -cos(5)/2 + cos(1)/2
  87. assert TR8(sin(1)*sin(2)*sin(3)) == sin(4)/4 - sin(6)/4 + sin(2)/4
  88. assert TR8(cos(2)*cos(3)*cos(4)*cos(5)) == \
  89. cos(4)/4 + cos(10)/8 + cos(2)/8 + cos(8)/8 + cos(14)/8 + \
  90. cos(6)/8 + Rational(1, 8)
  91. assert TR8(cos(2)*cos(3)*cos(4)*cos(5)*cos(6)) == \
  92. cos(10)/8 + cos(4)/8 + 3*cos(2)/16 + cos(16)/16 + cos(8)/8 + \
  93. cos(14)/16 + cos(20)/16 + cos(12)/16 + Rational(1, 16) + cos(6)/8
  94. assert TR8(sin(pi*Rational(3, 7))**2*cos(pi*Rational(3, 7))**2/(16*sin(pi/7)**2)) == Rational(1, 64)
  95. def test_TR9():
  96. a = S.Half
  97. b = 3*a
  98. assert TR9(a) == a
  99. assert TR9(cos(1) + cos(2)) == 2*cos(a)*cos(b)
  100. assert TR9(cos(1) - cos(2)) == 2*sin(a)*sin(b)
  101. assert TR9(sin(1) - sin(2)) == -2*sin(a)*cos(b)
  102. assert TR9(sin(1) + sin(2)) == 2*sin(b)*cos(a)
  103. assert TR9(cos(1) + 2*sin(1) + 2*sin(2)) == cos(1) + 4*sin(b)*cos(a)
  104. assert TR9(cos(4) + cos(2) + 2*cos(1)*cos(3)) == 4*cos(1)*cos(3)
  105. assert TR9((cos(4) + cos(2))/cos(3)/2 + cos(3)) == 2*cos(1)*cos(2)
  106. assert TR9(cos(3) + cos(4) + cos(5) + cos(6)) == \
  107. 4*cos(S.Half)*cos(1)*cos(Rational(9, 2))
  108. assert TR9(cos(3) + cos(3)*cos(2)) == cos(3) + cos(2)*cos(3)
  109. assert TR9(-cos(y) + cos(x*y)) == -2*sin(x*y/2 - y/2)*sin(x*y/2 + y/2)
  110. assert TR9(-sin(y) + sin(x*y)) == 2*sin(x*y/2 - y/2)*cos(x*y/2 + y/2)
  111. c = cos(x)
  112. s = sin(x)
  113. for si in ((1, 1), (1, -1), (-1, 1), (-1, -1)):
  114. for a in ((c, s), (s, c), (cos(x), cos(x*y)), (sin(x), sin(x*y))):
  115. args = zip(si, a)
  116. ex = Add(*[Mul(*ai) for ai in args])
  117. t = TR9(ex)
  118. assert not (a[0].func == a[1].func and (
  119. not verify_numerically(ex, t.expand(trig=True)) or t.is_Add)
  120. or a[1].func != a[0].func and ex != t)
  121. def test_TR10():
  122. assert TR10(cos(a + b)) == -sin(a)*sin(b) + cos(a)*cos(b)
  123. assert TR10(sin(a + b)) == sin(a)*cos(b) + sin(b)*cos(a)
  124. assert TR10(sin(a + b + c)) == \
  125. (-sin(a)*sin(b) + cos(a)*cos(b))*sin(c) + \
  126. (sin(a)*cos(b) + sin(b)*cos(a))*cos(c)
  127. assert TR10(cos(a + b + c)) == \
  128. (-sin(a)*sin(b) + cos(a)*cos(b))*cos(c) - \
  129. (sin(a)*cos(b) + sin(b)*cos(a))*sin(c)
  130. def test_TR10i():
  131. assert TR10i(cos(1)*cos(3) + sin(1)*sin(3)) == cos(2)
  132. assert TR10i(cos(1)*cos(3) - sin(1)*sin(3)) == cos(4)
  133. assert TR10i(cos(1)*sin(3) - sin(1)*cos(3)) == sin(2)
  134. assert TR10i(cos(1)*sin(3) + sin(1)*cos(3)) == sin(4)
  135. assert TR10i(cos(1)*sin(3) + sin(1)*cos(3) + 7) == sin(4) + 7
  136. assert TR10i(cos(1)*sin(3) + sin(1)*cos(3) + cos(3)) == cos(3) + sin(4)
  137. assert TR10i(2*cos(1)*sin(3) + 2*sin(1)*cos(3) + cos(3)) == \
  138. 2*sin(4) + cos(3)
  139. assert TR10i(cos(2)*cos(3) + sin(2)*(cos(1)*sin(2) + cos(2)*sin(1))) == \
  140. cos(1)
  141. eq = (cos(2)*cos(3) + sin(2)*(
  142. cos(1)*sin(2) + cos(2)*sin(1)))*cos(5) + sin(1)*sin(5)
  143. assert TR10i(eq) == TR10i(eq.expand()) == cos(4)
  144. assert TR10i(sqrt(2)*cos(x)*x + sqrt(6)*sin(x)*x) == \
  145. 2*sqrt(2)*x*sin(x + pi/6)
  146. assert TR10i(cos(x)/sqrt(6) + sin(x)/sqrt(2) +
  147. cos(x)/sqrt(6)/3 + sin(x)/sqrt(2)/3) == 4*sqrt(6)*sin(x + pi/6)/9
  148. assert TR10i(cos(x)/sqrt(6) + sin(x)/sqrt(2) +
  149. cos(y)/sqrt(6)/3 + sin(y)/sqrt(2)/3) == \
  150. sqrt(6)*sin(x + pi/6)/3 + sqrt(6)*sin(y + pi/6)/9
  151. assert TR10i(cos(x) + sqrt(3)*sin(x) + 2*sqrt(3)*cos(x + pi/6)) == 4*cos(x)
  152. assert TR10i(cos(x) + sqrt(3)*sin(x) +
  153. 2*sqrt(3)*cos(x + pi/6) + 4*sin(x)) == 4*sqrt(2)*sin(x + pi/4)
  154. assert TR10i(cos(2)*sin(3) + sin(2)*cos(4)) == \
  155. sin(2)*cos(4) + sin(3)*cos(2)
  156. A = Symbol('A', commutative=False)
  157. assert TR10i(sqrt(2)*cos(x)*A + sqrt(6)*sin(x)*A) == \
  158. 2*sqrt(2)*sin(x + pi/6)*A
  159. c = cos(x)
  160. s = sin(x)
  161. h = sin(y)
  162. r = cos(y)
  163. for si in ((1, 1), (1, -1), (-1, 1), (-1, -1)):
  164. for argsi in ((c*r, s*h), (c*h, s*r)): # explicit 2-args
  165. args = zip(si, argsi)
  166. ex = Add(*[Mul(*ai) for ai in args])
  167. t = TR10i(ex)
  168. assert not (ex - t.expand(trig=True) or t.is_Add)
  169. c = cos(x)
  170. s = sin(x)
  171. h = sin(pi/6)
  172. r = cos(pi/6)
  173. for si in ((1, 1), (1, -1), (-1, 1), (-1, -1)):
  174. for argsi in ((c*r, s*h), (c*h, s*r)): # induced
  175. args = zip(si, argsi)
  176. ex = Add(*[Mul(*ai) for ai in args])
  177. t = TR10i(ex)
  178. assert not (ex - t.expand(trig=True) or t.is_Add)
  179. def test_TR11():
  180. assert TR11(sin(2*x)) == 2*sin(x)*cos(x)
  181. assert TR11(sin(4*x)) == 4*((-sin(x)**2 + cos(x)**2)*sin(x)*cos(x))
  182. assert TR11(sin(x*Rational(4, 3))) == \
  183. 4*((-sin(x/3)**2 + cos(x/3)**2)*sin(x/3)*cos(x/3))
  184. assert TR11(cos(2*x)) == -sin(x)**2 + cos(x)**2
  185. assert TR11(cos(4*x)) == \
  186. (-sin(x)**2 + cos(x)**2)**2 - 4*sin(x)**2*cos(x)**2
  187. assert TR11(cos(2)) == cos(2)
  188. assert TR11(cos(pi*Rational(3, 7)), pi*Rational(2, 7)) == -cos(pi*Rational(2, 7))**2 + sin(pi*Rational(2, 7))**2
  189. assert TR11(cos(4), 2) == -sin(2)**2 + cos(2)**2
  190. assert TR11(cos(6), 2) == cos(6)
  191. assert TR11(sin(x)/cos(x/2), x/2) == 2*sin(x/2)
  192. def test__TR11():
  193. assert _TR11(sin(x/3)*sin(2*x)*sin(x/4)/(cos(x/6)*cos(x/8))) == \
  194. 4*sin(x/8)*sin(x/6)*sin(2*x),_TR11(sin(x/3)*sin(2*x)*sin(x/4)/(cos(x/6)*cos(x/8)))
  195. assert _TR11(sin(x/3)/cos(x/6)) == 2*sin(x/6)
  196. assert _TR11(cos(x/6)/sin(x/3)) == 1/(2*sin(x/6))
  197. assert _TR11(sin(2*x)*cos(x/8)/sin(x/4)) == sin(2*x)/(2*sin(x/8)), _TR11(sin(2*x)*cos(x/8)/sin(x/4))
  198. assert _TR11(sin(x)/sin(x/2)) == 2*cos(x/2)
  199. def test_TR12():
  200. assert TR12(tan(x + y)) == (tan(x) + tan(y))/(-tan(x)*tan(y) + 1)
  201. assert TR12(tan(x + y + z)) ==\
  202. (tan(z) + (tan(x) + tan(y))/(-tan(x)*tan(y) + 1))/(
  203. 1 - (tan(x) + tan(y))*tan(z)/(-tan(x)*tan(y) + 1))
  204. assert TR12(tan(x*y)) == tan(x*y)
  205. def test_TR13():
  206. assert TR13(tan(3)*tan(2)) == -tan(2)/tan(5) - tan(3)/tan(5) + 1
  207. assert TR13(cot(3)*cot(2)) == 1 + cot(3)*cot(5) + cot(2)*cot(5)
  208. assert TR13(tan(1)*tan(2)*tan(3)) == \
  209. (-tan(2)/tan(5) - tan(3)/tan(5) + 1)*tan(1)
  210. assert TR13(tan(1)*tan(2)*cot(3)) == \
  211. (-tan(2)/tan(3) + 1 - tan(1)/tan(3))*cot(3)
  212. def test_L():
  213. assert L(cos(x) + sin(x)) == 2
  214. def test_fu():
  215. assert fu(sin(50)**2 + cos(50)**2 + sin(pi/6)) == Rational(3, 2)
  216. assert fu(sqrt(6)*cos(x) + sqrt(2)*sin(x)) == 2*sqrt(2)*sin(x + pi/3)
  217. eq = sin(x)**4 - cos(y)**2 + sin(y)**2 + 2*cos(x)**2
  218. assert fu(eq) == cos(x)**4 - 2*cos(y)**2 + 2
  219. assert fu(S.Half - cos(2*x)/2) == sin(x)**2
  220. assert fu(sin(a)*(cos(b) - sin(b)) + cos(a)*(sin(b) + cos(b))) == \
  221. sqrt(2)*sin(a + b + pi/4)
  222. assert fu(sqrt(3)*cos(x)/2 + sin(x)/2) == sin(x + pi/3)
  223. assert fu(1 - sin(2*x)**2/4 - sin(y)**2 - cos(x)**4) == \
  224. -cos(x)**2 + cos(y)**2
  225. assert fu(cos(pi*Rational(4, 9))) == sin(pi/18)
  226. assert fu(cos(pi/9)*cos(pi*Rational(2, 9))*cos(pi*Rational(3, 9))*cos(pi*Rational(4, 9))) == Rational(1, 16)
  227. assert fu(
  228. tan(pi*Rational(7, 18)) + tan(pi*Rational(5, 18)) - sqrt(3)*tan(pi*Rational(5, 18))*tan(pi*Rational(7, 18))) == \
  229. -sqrt(3)
  230. assert fu(tan(1)*tan(2)) == tan(1)*tan(2)
  231. expr = Mul(*[cos(2**i) for i in range(10)])
  232. assert fu(expr) == sin(1024)/(1024*sin(1))
  233. # issue #18059:
  234. assert fu(cos(x) + sqrt(sin(x)**2)) == cos(x) + sqrt(sin(x)**2)
  235. assert fu((-14*sin(x)**3 + 35*sin(x) + 6*sqrt(3)*cos(x)**3 + 9*sqrt(3)*cos(x))/((cos(2*x) + 4))) == \
  236. 7*sin(x) + 3*sqrt(3)*cos(x)
  237. def test_objective():
  238. assert fu(sin(x)/cos(x), measure=lambda x: x.count_ops()) == \
  239. tan(x)
  240. assert fu(sin(x)/cos(x), measure=lambda x: -x.count_ops()) == \
  241. sin(x)/cos(x)
  242. def test_process_common_addends():
  243. # this tests that the args are not evaluated as they are given to do
  244. # and that key2 works when key1 is False
  245. do = lambda x: Add(*[i**(i%2) for i in x.args])
  246. assert process_common_addends(Add(*[1, 2, 3, 4], evaluate=False), do,
  247. key2=lambda x: x%2, key1=False) == 1**1 + 3**1 + 2**0 + 4**0
  248. def test_trig_split():
  249. assert trig_split(cos(x), cos(y)) == (1, 1, 1, x, y, True)
  250. assert trig_split(2*cos(x), -2*cos(y)) == (2, 1, -1, x, y, True)
  251. assert trig_split(cos(x)*sin(y), cos(y)*sin(y)) == \
  252. (sin(y), 1, 1, x, y, True)
  253. assert trig_split(cos(x), -sqrt(3)*sin(x), two=True) == \
  254. (2, 1, -1, x, pi/6, False)
  255. assert trig_split(cos(x), sin(x), two=True) == \
  256. (sqrt(2), 1, 1, x, pi/4, False)
  257. assert trig_split(cos(x), -sin(x), two=True) == \
  258. (sqrt(2), 1, -1, x, pi/4, False)
  259. assert trig_split(sqrt(2)*cos(x), -sqrt(6)*sin(x), two=True) == \
  260. (2*sqrt(2), 1, -1, x, pi/6, False)
  261. assert trig_split(-sqrt(6)*cos(x), -sqrt(2)*sin(x), two=True) == \
  262. (-2*sqrt(2), 1, 1, x, pi/3, False)
  263. assert trig_split(cos(x)/sqrt(6), sin(x)/sqrt(2), two=True) == \
  264. (sqrt(6)/3, 1, 1, x, pi/6, False)
  265. assert trig_split(-sqrt(6)*cos(x)*sin(y),
  266. -sqrt(2)*sin(x)*sin(y), two=True) == \
  267. (-2*sqrt(2)*sin(y), 1, 1, x, pi/3, False)
  268. assert trig_split(cos(x), sin(x)) is None
  269. assert trig_split(cos(x), sin(z)) is None
  270. assert trig_split(2*cos(x), -sin(x)) is None
  271. assert trig_split(cos(x), -sqrt(3)*sin(x)) is None
  272. assert trig_split(cos(x)*cos(y), sin(x)*sin(z)) is None
  273. assert trig_split(cos(x)*cos(y), sin(x)*sin(y)) is None
  274. assert trig_split(-sqrt(6)*cos(x), sqrt(2)*sin(x)*sin(y), two=True) is \
  275. None
  276. assert trig_split(sqrt(3)*sqrt(x), cos(3), two=True) is None
  277. assert trig_split(sqrt(3)*root(x, 3), sin(3)*cos(2), two=True) is None
  278. assert trig_split(cos(5)*cos(6), cos(7)*sin(5), two=True) is None
  279. def test_TRmorrie():
  280. assert TRmorrie(7*Mul(*[cos(i) for i in range(10)])) == \
  281. 7*sin(12)*sin(16)*cos(5)*cos(7)*cos(9)/(64*sin(1)*sin(3))
  282. assert TRmorrie(x) == x
  283. assert TRmorrie(2*x) == 2*x
  284. e = cos(pi/7)*cos(pi*Rational(2, 7))*cos(pi*Rational(4, 7))
  285. assert TR8(TRmorrie(e)) == Rational(-1, 8)
  286. e = Mul(*[cos(2**i*pi/17) for i in range(1, 17)])
  287. assert TR8(TR3(TRmorrie(e))) == Rational(1, 65536)
  288. # issue 17063
  289. eq = cos(x)/cos(x/2)
  290. assert TRmorrie(eq) == eq
  291. # issue #20430
  292. eq = cos(x/2)*sin(x/2)*cos(x)**3
  293. assert TRmorrie(eq) == sin(2*x)*cos(x)**2/4
  294. def test_TRpower():
  295. assert TRpower(1/sin(x)**2) == 1/sin(x)**2
  296. assert TRpower(cos(x)**3*sin(x/2)**4) == \
  297. (3*cos(x)/4 + cos(3*x)/4)*(-cos(x)/2 + cos(2*x)/8 + Rational(3, 8))
  298. for k in range(2, 8):
  299. assert verify_numerically(sin(x)**k, TRpower(sin(x)**k))
  300. assert verify_numerically(cos(x)**k, TRpower(cos(x)**k))
  301. def test_hyper_as_trig():
  302. from sympy.simplify.fu import _osborne, _osbornei
  303. eq = sinh(x)**2 + cosh(x)**2
  304. t, f = hyper_as_trig(eq)
  305. assert f(fu(t)) == cosh(2*x)
  306. e, f = hyper_as_trig(tanh(x + y))
  307. assert f(TR12(e)) == (tanh(x) + tanh(y))/(tanh(x)*tanh(y) + 1)
  308. d = Dummy()
  309. assert _osborne(sinh(x), d) == I*sin(x*d)
  310. assert _osborne(tanh(x), d) == I*tan(x*d)
  311. assert _osborne(coth(x), d) == cot(x*d)/I
  312. assert _osborne(cosh(x), d) == cos(x*d)
  313. assert _osborne(sech(x), d) == sec(x*d)
  314. assert _osborne(csch(x), d) == csc(x*d)/I
  315. for func in (sinh, cosh, tanh, coth, sech, csch):
  316. h = func(pi)
  317. assert _osbornei(_osborne(h, d), d) == h
  318. # /!\ the _osborne functions are not meant to work
  319. # in the o(i(trig, d), d) direction so we just check
  320. # that they work as they are supposed to work
  321. assert _osbornei(cos(x*y + z), y) == cosh(x + z*I)
  322. assert _osbornei(sin(x*y + z), y) == sinh(x + z*I)/I
  323. assert _osbornei(tan(x*y + z), y) == tanh(x + z*I)/I
  324. assert _osbornei(cot(x*y + z), y) == coth(x + z*I)*I
  325. assert _osbornei(sec(x*y + z), y) == sech(x + z*I)
  326. assert _osbornei(csc(x*y + z), y) == csch(x + z*I)*I
  327. def test_TR12i():
  328. ta, tb, tc = [tan(i) for i in (a, b, c)]
  329. assert TR12i((ta + tb)/(-ta*tb + 1)) == tan(a + b)
  330. assert TR12i((ta + tb)/(ta*tb - 1)) == -tan(a + b)
  331. assert TR12i((-ta - tb)/(ta*tb - 1)) == tan(a + b)
  332. eq = (ta + tb)/(-ta*tb + 1)**2*(-3*ta - 3*tc)/(2*(ta*tc - 1))
  333. assert TR12i(eq.expand()) == \
  334. -3*tan(a + b)*tan(a + c)/(tan(a) + tan(b) - 1)/2
  335. assert TR12i(tan(x)/sin(x)) == tan(x)/sin(x)
  336. eq = (ta + cos(2))/(-ta*tb + 1)
  337. assert TR12i(eq) == eq
  338. eq = (ta + tb + 2)**2/(-ta*tb + 1)
  339. assert TR12i(eq) == eq
  340. eq = ta/(-ta*tb + 1)
  341. assert TR12i(eq) == eq
  342. eq = (((ta + tb)*(a + 1)).expand())**2/(ta*tb - 1)
  343. assert TR12i(eq) == -(a + 1)**2*tan(a + b)
  344. def test_TR14():
  345. eq = (cos(x) - 1)*(cos(x) + 1)
  346. ans = -sin(x)**2
  347. assert TR14(eq) == ans
  348. assert TR14(1/eq) == 1/ans
  349. assert TR14((cos(x) - 1)**2*(cos(x) + 1)**2) == ans**2
  350. assert TR14((cos(x) - 1)**2*(cos(x) + 1)**3) == ans**2*(cos(x) + 1)
  351. assert TR14((cos(x) - 1)**3*(cos(x) + 1)**2) == ans**2*(cos(x) - 1)
  352. eq = (cos(x) - 1)**y*(cos(x) + 1)**y
  353. assert TR14(eq) == eq
  354. eq = (cos(x) - 2)**y*(cos(x) + 1)
  355. assert TR14(eq) == eq
  356. eq = (tan(x) - 2)**2*(cos(x) + 1)
  357. assert TR14(eq) == eq
  358. i = symbols('i', integer=True)
  359. assert TR14((cos(x) - 1)**i*(cos(x) + 1)**i) == ans**i
  360. assert TR14((sin(x) - 1)**i*(sin(x) + 1)**i) == (-cos(x)**2)**i
  361. # could use extraction in this case
  362. eq = (cos(x) - 1)**(i + 1)*(cos(x) + 1)**i
  363. assert TR14(eq) in [(cos(x) - 1)*ans**i, eq]
  364. assert TR14((sin(x) - 1)*(sin(x) + 1)) == -cos(x)**2
  365. p1 = (cos(x) + 1)*(cos(x) - 1)
  366. p2 = (cos(y) - 1)*2*(cos(y) + 1)
  367. p3 = (3*(cos(y) - 1))*(3*(cos(y) + 1))
  368. assert TR14(p1*p2*p3*(x - 1)) == -18*((x - 1)*sin(x)**2*sin(y)**4)
  369. def test_TR15_16_17():
  370. assert TR15(1 - 1/sin(x)**2) == -cot(x)**2
  371. assert TR16(1 - 1/cos(x)**2) == -tan(x)**2
  372. assert TR111(1 - 1/tan(x)**2) == 1 - cot(x)**2
  373. def test_as_f_sign_1():
  374. assert as_f_sign_1(x + 1) == (1, x, 1)
  375. assert as_f_sign_1(x - 1) == (1, x, -1)
  376. assert as_f_sign_1(-x + 1) == (-1, x, -1)
  377. assert as_f_sign_1(-x - 1) == (-1, x, 1)
  378. assert as_f_sign_1(2*x + 2) == (2, x, 1)
  379. assert as_f_sign_1(x*y - y) == (y, x, -1)
  380. assert as_f_sign_1(-x*y + y) == (-y, x, -1)