test_ring_series.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635
  1. from sympy.polys.domains import QQ, EX, RR
  2. from sympy.polys.rings import ring
  3. from sympy.polys.ring_series import (_invert_monoms, rs_integrate,
  4. rs_trunc, rs_mul, rs_square, rs_pow, _has_constant_term, rs_hadamard_exp,
  5. rs_series_from_list, rs_exp, rs_log, rs_newton, rs_series_inversion,
  6. rs_compose_add, rs_asin, rs_atan, rs_atanh, rs_tan, rs_cot, rs_sin, rs_cos,
  7. rs_cos_sin, rs_sinh, rs_cosh, rs_tanh, _tan1, rs_fun, rs_nth_root,
  8. rs_LambertW, rs_series_reversion, rs_is_puiseux, rs_series)
  9. from sympy.testing.pytest import raises, slow
  10. from sympy.core.symbol import symbols
  11. from sympy.functions import (sin, cos, exp, tan, cot, atan, atanh,
  12. tanh, log, sqrt)
  13. from sympy.core.numbers import Rational
  14. from sympy.core import expand, S
  15. def is_close(a, b):
  16. tol = 10**(-10)
  17. assert abs(a - b) < tol
  18. def test_ring_series1():
  19. R, x = ring('x', QQ)
  20. p = x**4 + 2*x**3 + 3*x + 4
  21. assert _invert_monoms(p) == 4*x**4 + 3*x**3 + 2*x + 1
  22. assert rs_hadamard_exp(p) == x**4/24 + x**3/3 + 3*x + 4
  23. R, x = ring('x', QQ)
  24. p = x**4 + 2*x**3 + 3*x + 4
  25. assert rs_integrate(p, x) == x**5/5 + x**4/2 + 3*x**2/2 + 4*x
  26. R, x, y = ring('x, y', QQ)
  27. p = x**2*y**2 + x + 1
  28. assert rs_integrate(p, x) == x**3*y**2/3 + x**2/2 + x
  29. assert rs_integrate(p, y) == x**2*y**3/3 + x*y + y
  30. def test_trunc():
  31. R, x, y, t = ring('x, y, t', QQ)
  32. p = (y + t*x)**4
  33. p1 = rs_trunc(p, x, 3)
  34. assert p1 == y**4 + 4*y**3*t*x + 6*y**2*t**2*x**2
  35. def test_mul_trunc():
  36. R, x, y, t = ring('x, y, t', QQ)
  37. p = 1 + t*x + t*y
  38. for i in range(2):
  39. p = rs_mul(p, p, t, 3)
  40. assert p == 6*x**2*t**2 + 12*x*y*t**2 + 6*y**2*t**2 + 4*x*t + 4*y*t + 1
  41. p = 1 + t*x + t*y + t**2*x*y
  42. p1 = rs_mul(p, p, t, 2)
  43. assert p1 == 1 + 2*t*x + 2*t*y
  44. R1, z = ring('z', QQ)
  45. raises(ValueError, lambda: rs_mul(p, z, x, 2))
  46. p1 = 2 + 2*x + 3*x**2
  47. p2 = 3 + x**2
  48. assert rs_mul(p1, p2, x, 4) == 2*x**3 + 11*x**2 + 6*x + 6
  49. def test_square_trunc():
  50. R, x, y, t = ring('x, y, t', QQ)
  51. p = (1 + t*x + t*y)*2
  52. p1 = rs_mul(p, p, x, 3)
  53. p2 = rs_square(p, x, 3)
  54. assert p1 == p2
  55. p = 1 + x + x**2 + x**3
  56. assert rs_square(p, x, 4) == 4*x**3 + 3*x**2 + 2*x + 1
  57. def test_pow_trunc():
  58. R, x, y, z = ring('x, y, z', QQ)
  59. p0 = y + x*z
  60. p = p0**16
  61. for xx in (x, y, z):
  62. p1 = rs_trunc(p, xx, 8)
  63. p2 = rs_pow(p0, 16, xx, 8)
  64. assert p1 == p2
  65. p = 1 + x
  66. p1 = rs_pow(p, 3, x, 2)
  67. assert p1 == 1 + 3*x
  68. assert rs_pow(p, 0, x, 2) == 1
  69. assert rs_pow(p, -2, x, 2) == 1 - 2*x
  70. p = x + y
  71. assert rs_pow(p, 3, y, 3) == x**3 + 3*x**2*y + 3*x*y**2
  72. assert rs_pow(1 + x, Rational(2, 3), x, 4) == 4*x**3/81 - x**2/9 + x*Rational(2, 3) + 1
  73. def test_has_constant_term():
  74. R, x, y, z = ring('x, y, z', QQ)
  75. p = y + x*z
  76. assert _has_constant_term(p, x)
  77. p = x + x**4
  78. assert not _has_constant_term(p, x)
  79. p = 1 + x + x**4
  80. assert _has_constant_term(p, x)
  81. p = x + y + x*z
  82. def test_inversion():
  83. R, x = ring('x', QQ)
  84. p = 2 + x + 2*x**2
  85. n = 5
  86. p1 = rs_series_inversion(p, x, n)
  87. assert rs_trunc(p*p1, x, n) == 1
  88. R, x, y = ring('x, y', QQ)
  89. p = 2 + x + 2*x**2 + y*x + x**2*y
  90. p1 = rs_series_inversion(p, x, n)
  91. assert rs_trunc(p*p1, x, n) == 1
  92. R, x, y = ring('x, y', QQ)
  93. p = 1 + x + y
  94. raises(NotImplementedError, lambda: rs_series_inversion(p, x, 4))
  95. p = R.zero
  96. raises(ZeroDivisionError, lambda: rs_series_inversion(p, x, 3))
  97. def test_series_reversion():
  98. R, x, y = ring('x, y', QQ)
  99. p = rs_tan(x, x, 10)
  100. assert rs_series_reversion(p, x, 8, y) == rs_atan(y, y, 8)
  101. p = rs_sin(x, x, 10)
  102. assert rs_series_reversion(p, x, 8, y) == 5*y**7/112 + 3*y**5/40 + \
  103. y**3/6 + y
  104. def test_series_from_list():
  105. R, x = ring('x', QQ)
  106. p = 1 + 2*x + x**2 + 3*x**3
  107. c = [1, 2, 0, 4, 4]
  108. r = rs_series_from_list(p, c, x, 5)
  109. pc = R.from_list(list(reversed(c)))
  110. r1 = rs_trunc(pc.compose(x, p), x, 5)
  111. assert r == r1
  112. R, x, y = ring('x, y', QQ)
  113. c = [1, 3, 5, 7]
  114. p1 = rs_series_from_list(x + y, c, x, 3, concur=0)
  115. p2 = rs_trunc((1 + 3*(x+y) + 5*(x+y)**2 + 7*(x+y)**3), x, 3)
  116. assert p1 == p2
  117. R, x = ring('x', QQ)
  118. h = 25
  119. p = rs_exp(x, x, h) - 1
  120. p1 = rs_series_from_list(p, c, x, h)
  121. p2 = 0
  122. for i, cx in enumerate(c):
  123. p2 += cx*rs_pow(p, i, x, h)
  124. assert p1 == p2
  125. def test_log():
  126. R, x = ring('x', QQ)
  127. p = 1 + x
  128. p1 = rs_log(p, x, 4)/x**2
  129. assert p1 == Rational(1, 3)*x - S.Half + x**(-1)
  130. p = 1 + x +2*x**2/3
  131. p1 = rs_log(p, x, 9)
  132. assert p1 == -17*x**8/648 + 13*x**7/189 - 11*x**6/162 - x**5/45 + \
  133. 7*x**4/36 - x**3/3 + x**2/6 + x
  134. p2 = rs_series_inversion(p, x, 9)
  135. p3 = rs_log(p2, x, 9)
  136. assert p3 == -p1
  137. R, x, y = ring('x, y', QQ)
  138. p = 1 + x + 2*y*x**2
  139. p1 = rs_log(p, x, 6)
  140. assert p1 == (4*x**5*y**2 - 2*x**5*y - 2*x**4*y**2 + x**5/5 + 2*x**4*y -
  141. x**4/4 - 2*x**3*y + x**3/3 + 2*x**2*y - x**2/2 + x)
  142. # Constant term in series
  143. a = symbols('a')
  144. R, x, y = ring('x, y', EX)
  145. assert rs_log(x + a, x, 5) == -EX(1/(4*a**4))*x**4 + EX(1/(3*a**3))*x**3 \
  146. - EX(1/(2*a**2))*x**2 + EX(1/a)*x + EX(log(a))
  147. assert rs_log(x + x**2*y + a, x, 4) == -EX(a**(-2))*x**3*y + \
  148. EX(1/(3*a**3))*x**3 + EX(1/a)*x**2*y - EX(1/(2*a**2))*x**2 + \
  149. EX(1/a)*x + EX(log(a))
  150. p = x + x**2 + 3
  151. assert rs_log(p, x, 10).compose(x, 5) == EX(log(3) + Rational(19281291595, 9920232))
  152. def test_exp():
  153. R, x = ring('x', QQ)
  154. p = x + x**4
  155. for h in [10, 30]:
  156. q = rs_series_inversion(1 + p, x, h) - 1
  157. p1 = rs_exp(q, x, h)
  158. q1 = rs_log(p1, x, h)
  159. assert q1 == q
  160. p1 = rs_exp(p, x, 30)
  161. assert p1.coeff(x**29) == QQ(74274246775059676726972369, 353670479749588078181744640000)
  162. prec = 21
  163. p = rs_log(1 + x, x, prec)
  164. p1 = rs_exp(p, x, prec)
  165. assert p1 == x + 1
  166. # Constant term in series
  167. a = symbols('a')
  168. R, x, y = ring('x, y', QQ[exp(a), a])
  169. assert rs_exp(x + a, x, 5) == exp(a)*x**4/24 + exp(a)*x**3/6 + \
  170. exp(a)*x**2/2 + exp(a)*x + exp(a)
  171. assert rs_exp(x + x**2*y + a, x, 5) == exp(a)*x**4*y**2/2 + \
  172. exp(a)*x**4*y/2 + exp(a)*x**4/24 + exp(a)*x**3*y + \
  173. exp(a)*x**3/6 + exp(a)*x**2*y + exp(a)*x**2/2 + exp(a)*x + exp(a)
  174. R, x, y = ring('x, y', EX)
  175. assert rs_exp(x + a, x, 5) == EX(exp(a)/24)*x**4 + EX(exp(a)/6)*x**3 + \
  176. EX(exp(a)/2)*x**2 + EX(exp(a))*x + EX(exp(a))
  177. assert rs_exp(x + x**2*y + a, x, 5) == EX(exp(a)/2)*x**4*y**2 + \
  178. EX(exp(a)/2)*x**4*y + EX(exp(a)/24)*x**4 + EX(exp(a))*x**3*y + \
  179. EX(exp(a)/6)*x**3 + EX(exp(a))*x**2*y + EX(exp(a)/2)*x**2 + \
  180. EX(exp(a))*x + EX(exp(a))
  181. def test_newton():
  182. R, x = ring('x', QQ)
  183. p = x**2 - 2
  184. r = rs_newton(p, x, 4)
  185. assert r == 8*x**4 + 4*x**2 + 2
  186. def test_compose_add():
  187. R, x = ring('x', QQ)
  188. p1 = x**3 - 1
  189. p2 = x**2 - 2
  190. assert rs_compose_add(p1, p2) == x**6 - 6*x**4 - 2*x**3 + 12*x**2 - 12*x - 7
  191. def test_fun():
  192. R, x, y = ring('x, y', QQ)
  193. p = x*y + x**2*y**3 + x**5*y
  194. assert rs_fun(p, rs_tan, x, 10) == rs_tan(p, x, 10)
  195. assert rs_fun(p, _tan1, x, 10) == _tan1(p, x, 10)
  196. def test_nth_root():
  197. R, x, y = ring('x, y', QQ)
  198. assert rs_nth_root(1 + x**2*y, 4, x, 10) == -77*x**8*y**4/2048 + \
  199. 7*x**6*y**3/128 - 3*x**4*y**2/32 + x**2*y/4 + 1
  200. assert rs_nth_root(1 + x*y + x**2*y**3, 3, x, 5) == -x**4*y**6/9 + \
  201. 5*x**4*y**5/27 - 10*x**4*y**4/243 - 2*x**3*y**4/9 + 5*x**3*y**3/81 + \
  202. x**2*y**3/3 - x**2*y**2/9 + x*y/3 + 1
  203. assert rs_nth_root(8*x, 3, x, 3) == 2*x**QQ(1, 3)
  204. assert rs_nth_root(8*x + x**2 + x**3, 3, x, 3) == x**QQ(4,3)/12 + 2*x**QQ(1,3)
  205. r = rs_nth_root(8*x + x**2*y + x**3, 3, x, 4)
  206. assert r == -x**QQ(7,3)*y**2/288 + x**QQ(7,3)/12 + x**QQ(4,3)*y/12 + 2*x**QQ(1,3)
  207. # Constant term in series
  208. a = symbols('a')
  209. R, x, y = ring('x, y', EX)
  210. assert rs_nth_root(x + a, 3, x, 4) == EX(5/(81*a**QQ(8, 3)))*x**3 - \
  211. EX(1/(9*a**QQ(5, 3)))*x**2 + EX(1/(3*a**QQ(2, 3)))*x + EX(a**QQ(1, 3))
  212. assert rs_nth_root(x**QQ(2, 3) + x**2*y + 5, 2, x, 3) == -EX(sqrt(5)/100)*\
  213. x**QQ(8, 3)*y - EX(sqrt(5)/16000)*x**QQ(8, 3) + EX(sqrt(5)/10)*x**2*y + \
  214. EX(sqrt(5)/2000)*x**2 - EX(sqrt(5)/200)*x**QQ(4, 3) + \
  215. EX(sqrt(5)/10)*x**QQ(2, 3) + EX(sqrt(5))
  216. def test_atan():
  217. R, x, y = ring('x, y', QQ)
  218. assert rs_atan(x, x, 9) == -x**7/7 + x**5/5 - x**3/3 + x
  219. assert rs_atan(x*y + x**2*y**3, x, 9) == 2*x**8*y**11 - x**8*y**9 + \
  220. 2*x**7*y**9 - x**7*y**7/7 - x**6*y**9/3 + x**6*y**7 - x**5*y**7 + \
  221. x**5*y**5/5 - x**4*y**5 - x**3*y**3/3 + x**2*y**3 + x*y
  222. # Constant term in series
  223. a = symbols('a')
  224. R, x, y = ring('x, y', EX)
  225. assert rs_atan(x + a, x, 5) == -EX((a**3 - a)/(a**8 + 4*a**6 + 6*a**4 + \
  226. 4*a**2 + 1))*x**4 + EX((3*a**2 - 1)/(3*a**6 + 9*a**4 + \
  227. 9*a**2 + 3))*x**3 - EX(a/(a**4 + 2*a**2 + 1))*x**2 + \
  228. EX(1/(a**2 + 1))*x + EX(atan(a))
  229. assert rs_atan(x + x**2*y + a, x, 4) == -EX(2*a/(a**4 + 2*a**2 + 1)) \
  230. *x**3*y + EX((3*a**2 - 1)/(3*a**6 + 9*a**4 + 9*a**2 + 3))*x**3 + \
  231. EX(1/(a**2 + 1))*x**2*y - EX(a/(a**4 + 2*a**2 + 1))*x**2 + EX(1/(a**2 \
  232. + 1))*x + EX(atan(a))
  233. def test_asin():
  234. R, x, y = ring('x, y', QQ)
  235. assert rs_asin(x + x*y, x, 5) == x**3*y**3/6 + x**3*y**2/2 + x**3*y/2 + \
  236. x**3/6 + x*y + x
  237. assert rs_asin(x*y + x**2*y**3, x, 6) == x**5*y**7/2 + 3*x**5*y**5/40 + \
  238. x**4*y**5/2 + x**3*y**3/6 + x**2*y**3 + x*y
  239. def test_tan():
  240. R, x, y = ring('x, y', QQ)
  241. assert rs_tan(x, x, 9)/x**5 == \
  242. Rational(17, 315)*x**2 + Rational(2, 15) + Rational(1, 3)*x**(-2) + x**(-4)
  243. assert rs_tan(x*y + x**2*y**3, x, 9) == 4*x**8*y**11/3 + 17*x**8*y**9/45 + \
  244. 4*x**7*y**9/3 + 17*x**7*y**7/315 + x**6*y**9/3 + 2*x**6*y**7/3 + \
  245. x**5*y**7 + 2*x**5*y**5/15 + x**4*y**5 + x**3*y**3/3 + x**2*y**3 + x*y
  246. # Constant term in series
  247. a = symbols('a')
  248. R, x, y = ring('x, y', QQ[tan(a), a])
  249. assert rs_tan(x + a, x, 5) == (tan(a)**5 + 5*tan(a)**3/3 +
  250. 2*tan(a)/3)*x**4 + (tan(a)**4 + 4*tan(a)**2/3 + Rational(1, 3))*x**3 + \
  251. (tan(a)**3 + tan(a))*x**2 + (tan(a)**2 + 1)*x + tan(a)
  252. assert rs_tan(x + x**2*y + a, x, 4) == (2*tan(a)**3 + 2*tan(a))*x**3*y + \
  253. (tan(a)**4 + Rational(4, 3)*tan(a)**2 + Rational(1, 3))*x**3 + (tan(a)**2 + 1)*x**2*y + \
  254. (tan(a)**3 + tan(a))*x**2 + (tan(a)**2 + 1)*x + tan(a)
  255. R, x, y = ring('x, y', EX)
  256. assert rs_tan(x + a, x, 5) == EX(tan(a)**5 + 5*tan(a)**3/3 +
  257. 2*tan(a)/3)*x**4 + EX(tan(a)**4 + 4*tan(a)**2/3 + EX(1)/3)*x**3 + \
  258. EX(tan(a)**3 + tan(a))*x**2 + EX(tan(a)**2 + 1)*x + EX(tan(a))
  259. assert rs_tan(x + x**2*y + a, x, 4) == EX(2*tan(a)**3 +
  260. 2*tan(a))*x**3*y + EX(tan(a)**4 + 4*tan(a)**2/3 + EX(1)/3)*x**3 + \
  261. EX(tan(a)**2 + 1)*x**2*y + EX(tan(a)**3 + tan(a))*x**2 + \
  262. EX(tan(a)**2 + 1)*x + EX(tan(a))
  263. p = x + x**2 + 5
  264. assert rs_atan(p, x, 10).compose(x, 10) == EX(atan(5) + S(67701870330562640) / \
  265. 668083460499)
  266. def test_cot():
  267. R, x, y = ring('x, y', QQ)
  268. assert rs_cot(x**6 + x**7, x, 8) == x**(-6) - x**(-5) + x**(-4) - \
  269. x**(-3) + x**(-2) - x**(-1) + 1 - x + x**2 - x**3 + x**4 - x**5 + \
  270. 2*x**6/3 - 4*x**7/3
  271. assert rs_cot(x + x**2*y, x, 5) == -x**4*y**5 - x**4*y/15 + x**3*y**4 - \
  272. x**3/45 - x**2*y**3 - x**2*y/3 + x*y**2 - x/3 - y + x**(-1)
  273. def test_sin():
  274. R, x, y = ring('x, y', QQ)
  275. assert rs_sin(x, x, 9)/x**5 == \
  276. Rational(-1, 5040)*x**2 + Rational(1, 120) - Rational(1, 6)*x**(-2) + x**(-4)
  277. assert rs_sin(x*y + x**2*y**3, x, 9) == x**8*y**11/12 - \
  278. x**8*y**9/720 + x**7*y**9/12 - x**7*y**7/5040 - x**6*y**9/6 + \
  279. x**6*y**7/24 - x**5*y**7/2 + x**5*y**5/120 - x**4*y**5/2 - \
  280. x**3*y**3/6 + x**2*y**3 + x*y
  281. # Constant term in series
  282. a = symbols('a')
  283. R, x, y = ring('x, y', QQ[sin(a), cos(a), a])
  284. assert rs_sin(x + a, x, 5) == sin(a)*x**4/24 - cos(a)*x**3/6 - \
  285. sin(a)*x**2/2 + cos(a)*x + sin(a)
  286. assert rs_sin(x + x**2*y + a, x, 5) == -sin(a)*x**4*y**2/2 - \
  287. cos(a)*x**4*y/2 + sin(a)*x**4/24 - sin(a)*x**3*y - cos(a)*x**3/6 + \
  288. cos(a)*x**2*y - sin(a)*x**2/2 + cos(a)*x + sin(a)
  289. R, x, y = ring('x, y', EX)
  290. assert rs_sin(x + a, x, 5) == EX(sin(a)/24)*x**4 - EX(cos(a)/6)*x**3 - \
  291. EX(sin(a)/2)*x**2 + EX(cos(a))*x + EX(sin(a))
  292. assert rs_sin(x + x**2*y + a, x, 5) == -EX(sin(a)/2)*x**4*y**2 - \
  293. EX(cos(a)/2)*x**4*y + EX(sin(a)/24)*x**4 - EX(sin(a))*x**3*y - \
  294. EX(cos(a)/6)*x**3 + EX(cos(a))*x**2*y - EX(sin(a)/2)*x**2 + \
  295. EX(cos(a))*x + EX(sin(a))
  296. def test_cos():
  297. R, x, y = ring('x, y', QQ)
  298. assert rs_cos(x, x, 9)/x**5 == \
  299. Rational(1, 40320)*x**3 - Rational(1, 720)*x + Rational(1, 24)*x**(-1) - S.Half*x**(-3) + x**(-5)
  300. assert rs_cos(x*y + x**2*y**3, x, 9) == x**8*y**12/24 - \
  301. x**8*y**10/48 + x**8*y**8/40320 + x**7*y**10/6 - \
  302. x**7*y**8/120 + x**6*y**8/4 - x**6*y**6/720 + x**5*y**6/6 - \
  303. x**4*y**6/2 + x**4*y**4/24 - x**3*y**4 - x**2*y**2/2 + 1
  304. # Constant term in series
  305. a = symbols('a')
  306. R, x, y = ring('x, y', QQ[sin(a), cos(a), a])
  307. assert rs_cos(x + a, x, 5) == cos(a)*x**4/24 + sin(a)*x**3/6 - \
  308. cos(a)*x**2/2 - sin(a)*x + cos(a)
  309. assert rs_cos(x + x**2*y + a, x, 5) == -cos(a)*x**4*y**2/2 + \
  310. sin(a)*x**4*y/2 + cos(a)*x**4/24 - cos(a)*x**3*y + sin(a)*x**3/6 - \
  311. sin(a)*x**2*y - cos(a)*x**2/2 - sin(a)*x + cos(a)
  312. R, x, y = ring('x, y', EX)
  313. assert rs_cos(x + a, x, 5) == EX(cos(a)/24)*x**4 + EX(sin(a)/6)*x**3 - \
  314. EX(cos(a)/2)*x**2 - EX(sin(a))*x + EX(cos(a))
  315. assert rs_cos(x + x**2*y + a, x, 5) == -EX(cos(a)/2)*x**4*y**2 + \
  316. EX(sin(a)/2)*x**4*y + EX(cos(a)/24)*x**4 - EX(cos(a))*x**3*y + \
  317. EX(sin(a)/6)*x**3 - EX(sin(a))*x**2*y - EX(cos(a)/2)*x**2 - \
  318. EX(sin(a))*x + EX(cos(a))
  319. def test_cos_sin():
  320. R, x, y = ring('x, y', QQ)
  321. cos, sin = rs_cos_sin(x, x, 9)
  322. assert cos == rs_cos(x, x, 9)
  323. assert sin == rs_sin(x, x, 9)
  324. cos, sin = rs_cos_sin(x + x*y, x, 5)
  325. assert cos == rs_cos(x + x*y, x, 5)
  326. assert sin == rs_sin(x + x*y, x, 5)
  327. def test_atanh():
  328. R, x, y = ring('x, y', QQ)
  329. assert rs_atanh(x, x, 9)/x**5 == Rational(1, 7)*x**2 + Rational(1, 5) + Rational(1, 3)*x**(-2) + x**(-4)
  330. assert rs_atanh(x*y + x**2*y**3, x, 9) == 2*x**8*y**11 + x**8*y**9 + \
  331. 2*x**7*y**9 + x**7*y**7/7 + x**6*y**9/3 + x**6*y**7 + x**5*y**7 + \
  332. x**5*y**5/5 + x**4*y**5 + x**3*y**3/3 + x**2*y**3 + x*y
  333. # Constant term in series
  334. a = symbols('a')
  335. R, x, y = ring('x, y', EX)
  336. assert rs_atanh(x + a, x, 5) == EX((a**3 + a)/(a**8 - 4*a**6 + 6*a**4 - \
  337. 4*a**2 + 1))*x**4 - EX((3*a**2 + 1)/(3*a**6 - 9*a**4 + \
  338. 9*a**2 - 3))*x**3 + EX(a/(a**4 - 2*a**2 + 1))*x**2 - EX(1/(a**2 - \
  339. 1))*x + EX(atanh(a))
  340. assert rs_atanh(x + x**2*y + a, x, 4) == EX(2*a/(a**4 - 2*a**2 + \
  341. 1))*x**3*y - EX((3*a**2 + 1)/(3*a**6 - 9*a**4 + 9*a**2 - 3))*x**3 - \
  342. EX(1/(a**2 - 1))*x**2*y + EX(a/(a**4 - 2*a**2 + 1))*x**2 - \
  343. EX(1/(a**2 - 1))*x + EX(atanh(a))
  344. p = x + x**2 + 5
  345. assert rs_atanh(p, x, 10).compose(x, 10) == EX(Rational(-733442653682135, 5079158784) \
  346. + atanh(5))
  347. def test_sinh():
  348. R, x, y = ring('x, y', QQ)
  349. assert rs_sinh(x, x, 9)/x**5 == Rational(1, 5040)*x**2 + Rational(1, 120) + Rational(1, 6)*x**(-2) + x**(-4)
  350. assert rs_sinh(x*y + x**2*y**3, x, 9) == x**8*y**11/12 + \
  351. x**8*y**9/720 + x**7*y**9/12 + x**7*y**7/5040 + x**6*y**9/6 + \
  352. x**6*y**7/24 + x**5*y**7/2 + x**5*y**5/120 + x**4*y**5/2 + \
  353. x**3*y**3/6 + x**2*y**3 + x*y
  354. def test_cosh():
  355. R, x, y = ring('x, y', QQ)
  356. assert rs_cosh(x, x, 9)/x**5 == Rational(1, 40320)*x**3 + Rational(1, 720)*x + Rational(1, 24)*x**(-1) + \
  357. S.Half*x**(-3) + x**(-5)
  358. assert rs_cosh(x*y + x**2*y**3, x, 9) == x**8*y**12/24 + \
  359. x**8*y**10/48 + x**8*y**8/40320 + x**7*y**10/6 + \
  360. x**7*y**8/120 + x**6*y**8/4 + x**6*y**6/720 + x**5*y**6/6 + \
  361. x**4*y**6/2 + x**4*y**4/24 + x**3*y**4 + x**2*y**2/2 + 1
  362. def test_tanh():
  363. R, x, y = ring('x, y', QQ)
  364. assert rs_tanh(x, x, 9)/x**5 == Rational(-17, 315)*x**2 + Rational(2, 15) - Rational(1, 3)*x**(-2) + x**(-4)
  365. assert rs_tanh(x*y + x**2*y**3, x, 9) == 4*x**8*y**11/3 - \
  366. 17*x**8*y**9/45 + 4*x**7*y**9/3 - 17*x**7*y**7/315 - x**6*y**9/3 + \
  367. 2*x**6*y**7/3 - x**5*y**7 + 2*x**5*y**5/15 - x**4*y**5 - \
  368. x**3*y**3/3 + x**2*y**3 + x*y
  369. # Constant term in series
  370. a = symbols('a')
  371. R, x, y = ring('x, y', EX)
  372. assert rs_tanh(x + a, x, 5) == EX(tanh(a)**5 - 5*tanh(a)**3/3 +
  373. 2*tanh(a)/3)*x**4 + EX(-tanh(a)**4 + 4*tanh(a)**2/3 - QQ(1, 3))*x**3 + \
  374. EX(tanh(a)**3 - tanh(a))*x**2 + EX(-tanh(a)**2 + 1)*x + EX(tanh(a))
  375. p = rs_tanh(x + x**2*y + a, x, 4)
  376. assert (p.compose(x, 10)).compose(y, 5) == EX(-1000*tanh(a)**4 + \
  377. 10100*tanh(a)**3 + 2470*tanh(a)**2/3 - 10099*tanh(a) + QQ(530, 3))
  378. def test_RR():
  379. rs_funcs = [rs_sin, rs_cos, rs_tan, rs_cot, rs_atan, rs_tanh]
  380. sympy_funcs = [sin, cos, tan, cot, atan, tanh]
  381. R, x, y = ring('x, y', RR)
  382. a = symbols('a')
  383. for rs_func, sympy_func in zip(rs_funcs, sympy_funcs):
  384. p = rs_func(2 + x, x, 5).compose(x, 5)
  385. q = sympy_func(2 + a).series(a, 0, 5).removeO()
  386. is_close(p.as_expr(), q.subs(a, 5).n())
  387. p = rs_nth_root(2 + x, 5, x, 5).compose(x, 5)
  388. q = ((2 + a)**QQ(1, 5)).series(a, 0, 5).removeO()
  389. is_close(p.as_expr(), q.subs(a, 5).n())
  390. def test_is_regular():
  391. R, x, y = ring('x, y', QQ)
  392. p = 1 + 2*x + x**2 + 3*x**3
  393. assert not rs_is_puiseux(p, x)
  394. p = x + x**QQ(1,5)*y
  395. assert rs_is_puiseux(p, x)
  396. assert not rs_is_puiseux(p, y)
  397. p = x + x**2*y**QQ(1,5)*y
  398. assert not rs_is_puiseux(p, x)
  399. def test_puiseux():
  400. R, x, y = ring('x, y', QQ)
  401. p = x**QQ(2,5) + x**QQ(2,3) + x
  402. r = rs_series_inversion(p, x, 1)
  403. r1 = -x**QQ(14,15) + x**QQ(4,5) - 3*x**QQ(11,15) + x**QQ(2,3) + \
  404. 2*x**QQ(7,15) - x**QQ(2,5) - x**QQ(1,5) + x**QQ(2,15) - x**QQ(-2,15) \
  405. + x**QQ(-2,5)
  406. assert r == r1
  407. r = rs_nth_root(1 + p, 3, x, 1)
  408. assert r == -x**QQ(4,5)/9 + x**QQ(2,3)/3 + x**QQ(2,5)/3 + 1
  409. r = rs_log(1 + p, x, 1)
  410. assert r == -x**QQ(4,5)/2 + x**QQ(2,3) + x**QQ(2,5)
  411. r = rs_LambertW(p, x, 1)
  412. assert r == -x**QQ(4,5) + x**QQ(2,3) + x**QQ(2,5)
  413. p1 = x + x**QQ(1,5)*y
  414. r = rs_exp(p1, x, 1)
  415. assert r == x**QQ(4,5)*y**4/24 + x**QQ(3,5)*y**3/6 + x**QQ(2,5)*y**2/2 + \
  416. x**QQ(1,5)*y + 1
  417. r = rs_atan(p, x, 2)
  418. assert r == -x**QQ(9,5) - x**QQ(26,15) - x**QQ(22,15) - x**QQ(6,5)/3 + \
  419. x + x**QQ(2,3) + x**QQ(2,5)
  420. r = rs_atan(p1, x, 2)
  421. assert r == x**QQ(9,5)*y**9/9 + x**QQ(9,5)*y**4 - x**QQ(7,5)*y**7/7 - \
  422. x**QQ(7,5)*y**2 + x*y**5/5 + x - x**QQ(3,5)*y**3/3 + x**QQ(1,5)*y
  423. r = rs_asin(p, x, 2)
  424. assert r == x**QQ(9,5)/2 + x**QQ(26,15)/2 + x**QQ(22,15)/2 + \
  425. x**QQ(6,5)/6 + x + x**QQ(2,3) + x**QQ(2,5)
  426. r = rs_cot(p, x, 1)
  427. assert r == -x**QQ(14,15) + x**QQ(4,5) - 3*x**QQ(11,15) + \
  428. 2*x**QQ(2,3)/3 + 2*x**QQ(7,15) - 4*x**QQ(2,5)/3 - x**QQ(1,5) + \
  429. x**QQ(2,15) - x**QQ(-2,15) + x**QQ(-2,5)
  430. r = rs_cos_sin(p, x, 2)
  431. assert r[0] == x**QQ(28,15)/6 - x**QQ(5,3) + x**QQ(8,5)/24 - x**QQ(7,5) - \
  432. x**QQ(4,3)/2 - x**QQ(16,15) - x**QQ(4,5)/2 + 1
  433. assert r[1] == -x**QQ(9,5)/2 - x**QQ(26,15)/2 - x**QQ(22,15)/2 - \
  434. x**QQ(6,5)/6 + x + x**QQ(2,3) + x**QQ(2,5)
  435. r = rs_atanh(p, x, 2)
  436. assert r == x**QQ(9,5) + x**QQ(26,15) + x**QQ(22,15) + x**QQ(6,5)/3 + x + \
  437. x**QQ(2,3) + x**QQ(2,5)
  438. r = rs_sinh(p, x, 2)
  439. assert r == x**QQ(9,5)/2 + x**QQ(26,15)/2 + x**QQ(22,15)/2 + \
  440. x**QQ(6,5)/6 + x + x**QQ(2,3) + x**QQ(2,5)
  441. r = rs_cosh(p, x, 2)
  442. assert r == x**QQ(28,15)/6 + x**QQ(5,3) + x**QQ(8,5)/24 + x**QQ(7,5) + \
  443. x**QQ(4,3)/2 + x**QQ(16,15) + x**QQ(4,5)/2 + 1
  444. r = rs_tanh(p, x, 2)
  445. assert r == -x**QQ(9,5) - x**QQ(26,15) - x**QQ(22,15) - x**QQ(6,5)/3 + \
  446. x + x**QQ(2,3) + x**QQ(2,5)
  447. def test_puiseux_algebraic(): # https://github.com/sympy/sympy/issues/24395
  448. K = QQ.algebraic_field(sqrt(2))
  449. sqrt2 = K.from_sympy(sqrt(2))
  450. x, y = symbols('x, y')
  451. R, xr, yr = ring([x, y], K)
  452. p = (1+sqrt2)*xr**QQ(1,2) + (1-sqrt2)*yr**QQ(2,3)
  453. assert dict(p) == {(QQ(1,2),QQ(0)):1+sqrt2, (QQ(0),QQ(2,3)):1-sqrt2}
  454. assert p.as_expr() == (1 + sqrt(2))*x**(S(1)/2) + (1 - sqrt(2))*y**(S(2)/3)
  455. def test1():
  456. R, x = ring('x', QQ)
  457. r = rs_sin(x, x, 15)*x**(-5)
  458. assert r == x**8/6227020800 - x**6/39916800 + x**4/362880 - x**2/5040 + \
  459. QQ(1,120) - x**-2/6 + x**-4
  460. p = rs_sin(x, x, 10)
  461. r = rs_nth_root(p, 2, x, 10)
  462. assert r == -67*x**QQ(17,2)/29030400 - x**QQ(13,2)/24192 + \
  463. x**QQ(9,2)/1440 - x**QQ(5,2)/12 + x**QQ(1,2)
  464. p = rs_sin(x, x, 10)
  465. r = rs_nth_root(p, 7, x, 10)
  466. r = rs_pow(r, 5, x, 10)
  467. assert r == -97*x**QQ(61,7)/124467840 - x**QQ(47,7)/16464 + \
  468. 11*x**QQ(33,7)/3528 - 5*x**QQ(19,7)/42 + x**QQ(5,7)
  469. r = rs_exp(x**QQ(1,2), x, 10)
  470. assert r == x**QQ(19,2)/121645100408832000 + x**9/6402373705728000 + \
  471. x**QQ(17,2)/355687428096000 + x**8/20922789888000 + \
  472. x**QQ(15,2)/1307674368000 + x**7/87178291200 + \
  473. x**QQ(13,2)/6227020800 + x**6/479001600 + x**QQ(11,2)/39916800 + \
  474. x**5/3628800 + x**QQ(9,2)/362880 + x**4/40320 + x**QQ(7,2)/5040 + \
  475. x**3/720 + x**QQ(5,2)/120 + x**2/24 + x**QQ(3,2)/6 + x/2 + \
  476. x**QQ(1,2) + 1
  477. def test_puiseux2():
  478. R, y = ring('y', QQ)
  479. S, x = ring('x', R)
  480. p = x + x**QQ(1,5)*y
  481. r = rs_atan(p, x, 3)
  482. assert r == (y**13/13 + y**8 + 2*y**3)*x**QQ(13,5) - (y**11/11 + y**6 +
  483. y)*x**QQ(11,5) + (y**9/9 + y**4)*x**QQ(9,5) - (y**7/7 +
  484. y**2)*x**QQ(7,5) + (y**5/5 + 1)*x - y**3*x**QQ(3,5)/3 + y*x**QQ(1,5)
  485. @slow
  486. def test_rs_series():
  487. x, a, b, c = symbols('x, a, b, c')
  488. assert rs_series(a, a, 5).as_expr() == a
  489. assert rs_series(sin(a), a, 5).as_expr() == (sin(a).series(a, 0,
  490. 5)).removeO()
  491. assert rs_series(sin(a) + cos(a), a, 5).as_expr() == ((sin(a) +
  492. cos(a)).series(a, 0, 5)).removeO()
  493. assert rs_series(sin(a)*cos(a), a, 5).as_expr() == ((sin(a)*
  494. cos(a)).series(a, 0, 5)).removeO()
  495. p = (sin(a) - a)*(cos(a**2) + a**4/2)
  496. assert expand(rs_series(p, a, 10).as_expr()) == expand(p.series(a, 0,
  497. 10).removeO())
  498. p = sin(a**2/2 + a/3) + cos(a/5)*sin(a/2)**3
  499. assert expand(rs_series(p, a, 5).as_expr()) == expand(p.series(a, 0,
  500. 5).removeO())
  501. p = sin(x**2 + a)*(cos(x**3 - 1) - a - a**2)
  502. assert expand(rs_series(p, a, 5).as_expr()) == expand(p.series(a, 0,
  503. 5).removeO())
  504. p = sin(a**2 - a/3 + 2)**5*exp(a**3 - a/2)
  505. assert expand(rs_series(p, a, 10).as_expr()) == expand(p.series(a, 0,
  506. 10).removeO())
  507. p = sin(a + b + c)
  508. assert expand(rs_series(p, a, 5).as_expr()) == expand(p.series(a, 0,
  509. 5).removeO())
  510. p = tan(sin(a**2 + 4) + b + c)
  511. assert expand(rs_series(p, a, 6).as_expr()) == expand(p.series(a, 0,
  512. 6).removeO())
  513. p = a**QQ(2,5) + a**QQ(2,3) + a
  514. r = rs_series(tan(p), a, 2)
  515. assert r.as_expr() == a**QQ(9,5) + a**QQ(26,15) + a**QQ(22,15) + a**QQ(6,5)/3 + \
  516. a + a**QQ(2,3) + a**QQ(2,5)
  517. r = rs_series(exp(p), a, 1)
  518. assert r.as_expr() == a**QQ(4,5)/2 + a**QQ(2,3) + a**QQ(2,5) + 1
  519. r = rs_series(sin(p), a, 2)
  520. assert r.as_expr() == -a**QQ(9,5)/2 - a**QQ(26,15)/2 - a**QQ(22,15)/2 - \
  521. a**QQ(6,5)/6 + a + a**QQ(2,3) + a**QQ(2,5)
  522. r = rs_series(cos(p), a, 2)
  523. assert r.as_expr() == a**QQ(28,15)/6 - a**QQ(5,3) + a**QQ(8,5)/24 - a**QQ(7,5) - \
  524. a**QQ(4,3)/2 - a**QQ(16,15) - a**QQ(4,5)/2 + 1
  525. assert rs_series(sin(a)/7, a, 5).as_expr() == (sin(a)/7).series(a, 0,
  526. 5).removeO()
  527. assert rs_series(log(1 + x), x, 5).as_expr() == -x**4/4 + x**3/3 - \
  528. x**2/2 + x
  529. assert rs_series(log(1 + 4*x), x, 5).as_expr() == -64*x**4 + 64*x**3/3 - \
  530. 8*x**2 + 4*x
  531. assert rs_series(log(1 + x + x**2), x, 10).as_expr() == -2*x**9/9 + \
  532. x**8/8 + x**7/7 - x**6/3 + x**5/5 + x**4/4 - 2*x**3/3 + \
  533. x**2/2 + x
  534. assert rs_series(log(1 + x*a**2), x, 7).as_expr() == -x**6*a**12/6 + \
  535. x**5*a**10/5 - x**4*a**8/4 + x**3*a**6/3 - \
  536. x**2*a**4/2 + x*a**2