test_spec_polynomials.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. from sympy.concrete.summations import Sum
  2. from sympy.core.function import (Derivative, diff)
  3. from sympy.core.numbers import (Rational, oo, pi, zoo)
  4. from sympy.core.singleton import S
  5. from sympy.core.symbol import (Dummy, Symbol)
  6. from sympy.functions.combinatorial.factorials import (RisingFactorial, binomial, factorial)
  7. from sympy.functions.elementary.complexes import conjugate
  8. from sympy.functions.elementary.exponential import exp
  9. from sympy.functions.elementary.integers import floor
  10. from sympy.functions.elementary.miscellaneous import sqrt
  11. from sympy.functions.elementary.trigonometric import cos
  12. from sympy.functions.special.gamma_functions import gamma
  13. from sympy.functions.special.hyper import hyper
  14. from sympy.functions.special.polynomials import (assoc_laguerre, assoc_legendre, chebyshevt, chebyshevt_root, chebyshevu, chebyshevu_root, gegenbauer, hermite, hermite_prob, jacobi, jacobi_normalized, laguerre, legendre)
  15. from sympy.polys.orthopolys import laguerre_poly
  16. from sympy.polys.polyroots import roots
  17. from sympy.core.expr import unchanged
  18. from sympy.core.function import ArgumentIndexError
  19. from sympy.testing.pytest import raises
  20. x = Symbol('x')
  21. def test_jacobi():
  22. n = Symbol("n")
  23. a = Symbol("a")
  24. b = Symbol("b")
  25. assert jacobi(0, a, b, x) == 1
  26. assert jacobi(1, a, b, x) == a/2 - b/2 + x*(a/2 + b/2 + 1)
  27. assert jacobi(n, a, a, x) == RisingFactorial(
  28. a + 1, n)*gegenbauer(n, a + S.Half, x)/RisingFactorial(2*a + 1, n)
  29. assert jacobi(n, a, -a, x) == ((-1)**a*(-x + 1)**(-a/2)*(x + 1)**(a/2)*assoc_legendre(n, a, x)*
  30. factorial(-a + n)*gamma(a + n + 1)/(factorial(a + n)*gamma(n + 1)))
  31. assert jacobi(n, -b, b, x) == ((-x + 1)**(b/2)*(x + 1)**(-b/2)*assoc_legendre(n, b, x)*
  32. gamma(-b + n + 1)/gamma(n + 1))
  33. assert jacobi(n, 0, 0, x) == legendre(n, x)
  34. assert jacobi(n, S.Half, S.Half, x) == RisingFactorial(
  35. Rational(3, 2), n)*chebyshevu(n, x)/factorial(n + 1)
  36. assert jacobi(n, Rational(-1, 2), Rational(-1, 2), x) == RisingFactorial(
  37. S.Half, n)*chebyshevt(n, x)/factorial(n)
  38. X = jacobi(n, a, b, x)
  39. assert isinstance(X, jacobi)
  40. assert jacobi(n, a, b, -x) == (-1)**n*jacobi(n, b, a, x)
  41. assert jacobi(n, a, b, 0) == 2**(-n)*gamma(a + n + 1)*hyper(
  42. (-b - n, -n), (a + 1,), -1)/(factorial(n)*gamma(a + 1))
  43. assert jacobi(n, a, b, 1) == RisingFactorial(a + 1, n)/factorial(n)
  44. m = Symbol("m", positive=True)
  45. assert jacobi(m, a, b, oo) == oo*RisingFactorial(a + b + m + 1, m)
  46. assert unchanged(jacobi, n, a, b, oo)
  47. assert conjugate(jacobi(m, a, b, x)) == \
  48. jacobi(m, conjugate(a), conjugate(b), conjugate(x))
  49. _k = Dummy('k')
  50. assert diff(jacobi(n, a, b, x), n) == Derivative(jacobi(n, a, b, x), n)
  51. assert diff(jacobi(n, a, b, x), a).dummy_eq(Sum((jacobi(n, a, b, x) +
  52. (2*_k + a + b + 1)*RisingFactorial(_k + b + 1, -_k + n)*jacobi(_k, a,
  53. b, x)/((-_k + n)*RisingFactorial(_k + a + b + 1, -_k + n)))/(_k + a
  54. + b + n + 1), (_k, 0, n - 1)))
  55. assert diff(jacobi(n, a, b, x), b).dummy_eq(Sum(((-1)**(-_k + n)*(2*_k +
  56. a + b + 1)*RisingFactorial(_k + a + 1, -_k + n)*jacobi(_k, a, b, x)/
  57. ((-_k + n)*RisingFactorial(_k + a + b + 1, -_k + n)) + jacobi(n, a,
  58. b, x))/(_k + a + b + n + 1), (_k, 0, n - 1)))
  59. assert diff(jacobi(n, a, b, x), x) == \
  60. (a/2 + b/2 + n/2 + S.Half)*jacobi(n - 1, a + 1, b + 1, x)
  61. assert jacobi_normalized(n, a, b, x) == \
  62. (jacobi(n, a, b, x)/sqrt(2**(a + b + 1)*gamma(a + n + 1)*gamma(b + n + 1)
  63. /((a + b + 2*n + 1)*factorial(n)*gamma(a + b + n + 1))))
  64. raises(ValueError, lambda: jacobi(-2.1, a, b, x))
  65. raises(ValueError, lambda: jacobi(Dummy(positive=True, integer=True), 1, 2, oo))
  66. assert jacobi(n, a, b, x).rewrite(Sum).dummy_eq(Sum((S.Half - x/2)
  67. **_k*RisingFactorial(-n, _k)*RisingFactorial(_k + a + 1, -_k + n)*
  68. RisingFactorial(a + b + n + 1, _k)/factorial(_k), (_k, 0, n))/factorial(n))
  69. assert jacobi(n, a, b, x).rewrite("polynomial").dummy_eq(Sum((S.Half - x/2)
  70. **_k*RisingFactorial(-n, _k)*RisingFactorial(_k + a + 1, -_k + n)*
  71. RisingFactorial(a + b + n + 1, _k)/factorial(_k), (_k, 0, n))/factorial(n))
  72. raises(ArgumentIndexError, lambda: jacobi(n, a, b, x).fdiff(5))
  73. def test_gegenbauer():
  74. n = Symbol("n")
  75. a = Symbol("a")
  76. assert gegenbauer(0, a, x) == 1
  77. assert gegenbauer(1, a, x) == 2*a*x
  78. assert gegenbauer(2, a, x) == -a + x**2*(2*a**2 + 2*a)
  79. assert gegenbauer(3, a, x) == \
  80. x**3*(4*a**3/3 + 4*a**2 + a*Rational(8, 3)) + x*(-2*a**2 - 2*a)
  81. assert gegenbauer(-1, a, x) == 0
  82. assert gegenbauer(n, S.Half, x) == legendre(n, x)
  83. assert gegenbauer(n, 1, x) == chebyshevu(n, x)
  84. assert gegenbauer(n, -1, x) == 0
  85. X = gegenbauer(n, a, x)
  86. assert isinstance(X, gegenbauer)
  87. assert gegenbauer(n, a, -x) == (-1)**n*gegenbauer(n, a, x)
  88. assert gegenbauer(n, a, 0) == 2**n*sqrt(pi) * \
  89. gamma(a + n/2)/(gamma(a)*gamma(-n/2 + S.Half)*gamma(n + 1))
  90. assert gegenbauer(n, a, 1) == gamma(2*a + n)/(gamma(2*a)*gamma(n + 1))
  91. assert gegenbauer(n, Rational(3, 4), -1) is zoo
  92. assert gegenbauer(n, Rational(1, 4), -1) == (sqrt(2)*cos(pi*(n + S.One/4))*
  93. gamma(n + S.Half)/(sqrt(pi)*gamma(n + 1)))
  94. m = Symbol("m", positive=True)
  95. assert gegenbauer(m, a, oo) == oo*RisingFactorial(a, m)
  96. assert unchanged(gegenbauer, n, a, oo)
  97. assert conjugate(gegenbauer(n, a, x)) == gegenbauer(n, conjugate(a), conjugate(x))
  98. _k = Dummy('k')
  99. assert diff(gegenbauer(n, a, x), n) == Derivative(gegenbauer(n, a, x), n)
  100. assert diff(gegenbauer(n, a, x), a).dummy_eq(Sum((2*(-1)**(-_k + n) + 2)*
  101. (_k + a)*gegenbauer(_k, a, x)/((-_k + n)*(_k + 2*a + n)) + ((2*_k +
  102. 2)/((_k + 2*a)*(2*_k + 2*a + 1)) + 2/(_k + 2*a + n))*gegenbauer(n, a
  103. , x), (_k, 0, n - 1)))
  104. assert diff(gegenbauer(n, a, x), x) == 2*a*gegenbauer(n - 1, a + 1, x)
  105. assert gegenbauer(n, a, x).rewrite(Sum).dummy_eq(
  106. Sum((-1)**_k*(2*x)**(-2*_k + n)*RisingFactorial(a, -_k + n)
  107. /(factorial(_k)*factorial(-2*_k + n)), (_k, 0, floor(n/2))))
  108. assert gegenbauer(n, a, x).rewrite("polynomial").dummy_eq(
  109. Sum((-1)**_k*(2*x)**(-2*_k + n)*RisingFactorial(a, -_k + n)
  110. /(factorial(_k)*factorial(-2*_k + n)), (_k, 0, floor(n/2))))
  111. raises(ArgumentIndexError, lambda: gegenbauer(n, a, x).fdiff(4))
  112. def test_legendre():
  113. assert legendre(0, x) == 1
  114. assert legendre(1, x) == x
  115. assert legendre(2, x) == ((3*x**2 - 1)/2).expand()
  116. assert legendre(3, x) == ((5*x**3 - 3*x)/2).expand()
  117. assert legendre(4, x) == ((35*x**4 - 30*x**2 + 3)/8).expand()
  118. assert legendre(5, x) == ((63*x**5 - 70*x**3 + 15*x)/8).expand()
  119. assert legendre(6, x) == ((231*x**6 - 315*x**4 + 105*x**2 - 5)/16).expand()
  120. assert legendre(10, -1) == 1
  121. assert legendre(11, -1) == -1
  122. assert legendre(10, 1) == 1
  123. assert legendre(11, 1) == 1
  124. assert legendre(10, 0) != 0
  125. assert legendre(11, 0) == 0
  126. assert legendre(-1, x) == 1
  127. k = Symbol('k')
  128. assert legendre(5 - k, x).subs(k, 2) == ((5*x**3 - 3*x)/2).expand()
  129. assert roots(legendre(4, x), x) == {
  130. sqrt(Rational(3, 7) - Rational(2, 35)*sqrt(30)): 1,
  131. -sqrt(Rational(3, 7) - Rational(2, 35)*sqrt(30)): 1,
  132. sqrt(Rational(3, 7) + Rational(2, 35)*sqrt(30)): 1,
  133. -sqrt(Rational(3, 7) + Rational(2, 35)*sqrt(30)): 1,
  134. }
  135. n = Symbol("n")
  136. X = legendre(n, x)
  137. assert isinstance(X, legendre)
  138. assert unchanged(legendre, n, x)
  139. assert legendre(n, 0) == sqrt(pi)/(gamma(S.Half - n/2)*gamma(n/2 + 1))
  140. assert legendre(n, 1) == 1
  141. assert legendre(n, oo) is oo
  142. assert legendre(-n, x) == legendre(n - 1, x)
  143. assert legendre(n, -x) == (-1)**n*legendre(n, x)
  144. assert unchanged(legendre, -n + k, x)
  145. assert conjugate(legendre(n, x)) == legendre(n, conjugate(x))
  146. assert diff(legendre(n, x), x) == \
  147. n*(x*legendre(n, x) - legendre(n - 1, x))/(x**2 - 1)
  148. assert diff(legendre(n, x), n) == Derivative(legendre(n, x), n)
  149. _k = Dummy('k')
  150. assert legendre(n, x).rewrite(Sum).dummy_eq(Sum((-1)**_k*(S.Half -
  151. x/2)**_k*(x/2 + S.Half)**(-_k + n)*binomial(n, _k)**2, (_k, 0, n)))
  152. assert legendre(n, x).rewrite("polynomial").dummy_eq(Sum((-1)**_k*(S.Half -
  153. x/2)**_k*(x/2 + S.Half)**(-_k + n)*binomial(n, _k)**2, (_k, 0, n)))
  154. raises(ArgumentIndexError, lambda: legendre(n, x).fdiff(1))
  155. raises(ArgumentIndexError, lambda: legendre(n, x).fdiff(3))
  156. def test_assoc_legendre():
  157. Plm = assoc_legendre
  158. Q = sqrt(1 - x**2)
  159. assert Plm(0, 0, x) == 1
  160. assert Plm(1, 0, x) == x
  161. assert Plm(1, 1, x) == -Q
  162. assert Plm(2, 0, x) == (3*x**2 - 1)/2
  163. assert Plm(2, 1, x) == -3*x*Q
  164. assert Plm(2, 2, x) == 3*Q**2
  165. assert Plm(3, 0, x) == (5*x**3 - 3*x)/2
  166. assert Plm(3, 1, x).expand() == (( 3*(1 - 5*x**2)/2 ).expand() * Q).expand()
  167. assert Plm(3, 2, x) == 15*x * Q**2
  168. assert Plm(3, 3, x) == -15 * Q**3
  169. # negative m
  170. assert Plm(1, -1, x) == -Plm(1, 1, x)/2
  171. assert Plm(2, -2, x) == Plm(2, 2, x)/24
  172. assert Plm(2, -1, x) == -Plm(2, 1, x)/6
  173. assert Plm(3, -3, x) == -Plm(3, 3, x)/720
  174. assert Plm(3, -2, x) == Plm(3, 2, x)/120
  175. assert Plm(3, -1, x) == -Plm(3, 1, x)/12
  176. n = Symbol("n")
  177. m = Symbol("m")
  178. X = Plm(n, m, x)
  179. assert isinstance(X, assoc_legendre)
  180. assert Plm(n, 0, x) == legendre(n, x)
  181. assert Plm(n, m, 0) == 2**m*sqrt(pi)/(gamma(-m/2 - n/2 +
  182. S.Half)*gamma(-m/2 + n/2 + 1))
  183. assert diff(Plm(m, n, x), x) == (m*x*assoc_legendre(m, n, x) -
  184. (m + n)*assoc_legendre(m - 1, n, x))/(x**2 - 1)
  185. _k = Dummy('k')
  186. assert Plm(m, n, x).rewrite(Sum).dummy_eq(
  187. (1 - x**2)**(n/2)*Sum((-1)**_k*2**(-m)*x**(-2*_k + m - n)*factorial
  188. (-2*_k + 2*m)/(factorial(_k)*factorial(-_k + m)*factorial(-2*_k + m
  189. - n)), (_k, 0, floor(m/2 - n/2))))
  190. assert Plm(m, n, x).rewrite("polynomial").dummy_eq(
  191. (1 - x**2)**(n/2)*Sum((-1)**_k*2**(-m)*x**(-2*_k + m - n)*factorial
  192. (-2*_k + 2*m)/(factorial(_k)*factorial(-_k + m)*factorial(-2*_k + m
  193. - n)), (_k, 0, floor(m/2 - n/2))))
  194. assert conjugate(assoc_legendre(n, m, x)) == \
  195. assoc_legendre(n, conjugate(m), conjugate(x))
  196. raises(ValueError, lambda: Plm(0, 1, x))
  197. raises(ValueError, lambda: Plm(-1, 1, x))
  198. raises(ArgumentIndexError, lambda: Plm(n, m, x).fdiff(1))
  199. raises(ArgumentIndexError, lambda: Plm(n, m, x).fdiff(2))
  200. raises(ArgumentIndexError, lambda: Plm(n, m, x).fdiff(4))
  201. def test_chebyshev():
  202. assert chebyshevt(0, x) == 1
  203. assert chebyshevt(1, x) == x
  204. assert chebyshevt(2, x) == 2*x**2 - 1
  205. assert chebyshevt(3, x) == 4*x**3 - 3*x
  206. for n in range(1, 4):
  207. for k in range(n):
  208. z = chebyshevt_root(n, k)
  209. assert chebyshevt(n, z) == 0
  210. raises(ValueError, lambda: chebyshevt_root(n, n))
  211. for n in range(1, 4):
  212. for k in range(n):
  213. z = chebyshevu_root(n, k)
  214. assert chebyshevu(n, z) == 0
  215. raises(ValueError, lambda: chebyshevu_root(n, n))
  216. n = Symbol("n")
  217. X = chebyshevt(n, x)
  218. assert isinstance(X, chebyshevt)
  219. assert unchanged(chebyshevt, n, x)
  220. assert chebyshevt(n, -x) == (-1)**n*chebyshevt(n, x)
  221. assert chebyshevt(-n, x) == chebyshevt(n, x)
  222. assert chebyshevt(n, 0) == cos(pi*n/2)
  223. assert chebyshevt(n, 1) == 1
  224. assert chebyshevt(n, oo) is oo
  225. assert conjugate(chebyshevt(n, x)) == chebyshevt(n, conjugate(x))
  226. assert diff(chebyshevt(n, x), x) == n*chebyshevu(n - 1, x)
  227. X = chebyshevu(n, x)
  228. assert isinstance(X, chebyshevu)
  229. y = Symbol('y')
  230. assert chebyshevu(n, -x) == (-1)**n*chebyshevu(n, x)
  231. assert chebyshevu(-n, x) == -chebyshevu(n - 2, x)
  232. assert unchanged(chebyshevu, -n + y, x)
  233. assert chebyshevu(n, 0) == cos(pi*n/2)
  234. assert chebyshevu(n, 1) == n + 1
  235. assert chebyshevu(n, oo) is oo
  236. assert conjugate(chebyshevu(n, x)) == chebyshevu(n, conjugate(x))
  237. assert diff(chebyshevu(n, x), x) == \
  238. (-x*chebyshevu(n, x) + (n + 1)*chebyshevt(n + 1, x))/(x**2 - 1)
  239. _k = Dummy('k')
  240. assert chebyshevt(n, x).rewrite(Sum).dummy_eq(Sum(x**(-2*_k + n)
  241. *(x**2 - 1)**_k*binomial(n, 2*_k), (_k, 0, floor(n/2))))
  242. assert chebyshevt(n, x).rewrite("polynomial").dummy_eq(Sum(x**(-2*_k + n)
  243. *(x**2 - 1)**_k*binomial(n, 2*_k), (_k, 0, floor(n/2))))
  244. assert chebyshevu(n, x).rewrite(Sum).dummy_eq(Sum((-1)**_k*(2*x)
  245. **(-2*_k + n)*factorial(-_k + n)/(factorial(_k)*
  246. factorial(-2*_k + n)), (_k, 0, floor(n/2))))
  247. assert chebyshevu(n, x).rewrite("polynomial").dummy_eq(Sum((-1)**_k*(2*x)
  248. **(-2*_k + n)*factorial(-_k + n)/(factorial(_k)*
  249. factorial(-2*_k + n)), (_k, 0, floor(n/2))))
  250. raises(ArgumentIndexError, lambda: chebyshevt(n, x).fdiff(1))
  251. raises(ArgumentIndexError, lambda: chebyshevt(n, x).fdiff(3))
  252. raises(ArgumentIndexError, lambda: chebyshevu(n, x).fdiff(1))
  253. raises(ArgumentIndexError, lambda: chebyshevu(n, x).fdiff(3))
  254. def test_hermite():
  255. assert hermite(0, x) == 1
  256. assert hermite(1, x) == 2*x
  257. assert hermite(2, x) == 4*x**2 - 2
  258. assert hermite(3, x) == 8*x**3 - 12*x
  259. assert hermite(4, x) == 16*x**4 - 48*x**2 + 12
  260. assert hermite(6, x) == 64*x**6 - 480*x**4 + 720*x**2 - 120
  261. n = Symbol("n")
  262. assert unchanged(hermite, n, x)
  263. assert hermite(n, -x) == (-1)**n*hermite(n, x)
  264. assert unchanged(hermite, -n, x)
  265. assert hermite(n, 0) == 2**n*sqrt(pi)/gamma(S.Half - n/2)
  266. assert hermite(n, oo) is oo
  267. assert conjugate(hermite(n, x)) == hermite(n, conjugate(x))
  268. _k = Dummy('k')
  269. assert hermite(n, x).rewrite(Sum).dummy_eq(factorial(n)*Sum((-1)
  270. **_k*(2*x)**(-2*_k + n)/(factorial(_k)*factorial(-2*_k + n)), (_k,
  271. 0, floor(n/2))))
  272. assert hermite(n, x).rewrite("polynomial").dummy_eq(factorial(n)*Sum((-1)
  273. **_k*(2*x)**(-2*_k + n)/(factorial(_k)*factorial(-2*_k + n)), (_k,
  274. 0, floor(n/2))))
  275. assert diff(hermite(n, x), x) == 2*n*hermite(n - 1, x)
  276. assert diff(hermite(n, x), n) == Derivative(hermite(n, x), n)
  277. raises(ArgumentIndexError, lambda: hermite(n, x).fdiff(3))
  278. assert hermite(n, x).rewrite(hermite_prob) == \
  279. sqrt(2)**n * hermite_prob(n, x*sqrt(2))
  280. def test_hermite_prob():
  281. assert hermite_prob(0, x) == 1
  282. assert hermite_prob(1, x) == x
  283. assert hermite_prob(2, x) == x**2 - 1
  284. assert hermite_prob(3, x) == x**3 - 3*x
  285. assert hermite_prob(4, x) == x**4 - 6*x**2 + 3
  286. assert hermite_prob(6, x) == x**6 - 15*x**4 + 45*x**2 - 15
  287. n = Symbol("n")
  288. assert unchanged(hermite_prob, n, x)
  289. assert hermite_prob(n, -x) == (-1)**n*hermite_prob(n, x)
  290. assert unchanged(hermite_prob, -n, x)
  291. assert hermite_prob(n, 0) == sqrt(pi)/gamma(S.Half - n/2)
  292. assert hermite_prob(n, oo) is oo
  293. assert conjugate(hermite_prob(n, x)) == hermite_prob(n, conjugate(x))
  294. _k = Dummy('k')
  295. assert hermite_prob(n, x).rewrite(Sum).dummy_eq(factorial(n) *
  296. Sum((-S.Half)**_k * x**(n-2*_k) / (factorial(_k) * factorial(n-2*_k)),
  297. (_k, 0, floor(n/2))))
  298. assert hermite_prob(n, x).rewrite("polynomial").dummy_eq(factorial(n) *
  299. Sum((-S.Half)**_k * x**(n-2*_k) / (factorial(_k) * factorial(n-2*_k)),
  300. (_k, 0, floor(n/2))))
  301. assert diff(hermite_prob(n, x), x) == n*hermite_prob(n-1, x)
  302. assert diff(hermite_prob(n, x), n) == Derivative(hermite_prob(n, x), n)
  303. raises(ArgumentIndexError, lambda: hermite_prob(n, x).fdiff(3))
  304. assert hermite_prob(n, x).rewrite(hermite) == \
  305. sqrt(2)**(-n) * hermite(n, x/sqrt(2))
  306. def test_laguerre():
  307. n = Symbol("n")
  308. m = Symbol("m", negative=True)
  309. # Laguerre polynomials:
  310. assert laguerre(0, x) == 1
  311. assert laguerre(1, x) == -x + 1
  312. assert laguerre(2, x) == x**2/2 - 2*x + 1
  313. assert laguerre(3, x) == -x**3/6 + 3*x**2/2 - 3*x + 1
  314. assert laguerre(-2, x) == (x + 1)*exp(x)
  315. X = laguerre(n, x)
  316. assert isinstance(X, laguerre)
  317. assert laguerre(n, 0) == 1
  318. assert laguerre(n, oo) == (-1)**n*oo
  319. assert laguerre(n, -oo) is oo
  320. assert conjugate(laguerre(n, x)) == laguerre(n, conjugate(x))
  321. _k = Dummy('k')
  322. assert laguerre(n, x).rewrite(Sum).dummy_eq(
  323. Sum(x**_k*RisingFactorial(-n, _k)/factorial(_k)**2, (_k, 0, n)))
  324. assert laguerre(n, x).rewrite("polynomial").dummy_eq(
  325. Sum(x**_k*RisingFactorial(-n, _k)/factorial(_k)**2, (_k, 0, n)))
  326. assert laguerre(m, x).rewrite(Sum).dummy_eq(
  327. exp(x)*Sum((-x)**_k*RisingFactorial(m + 1, _k)/factorial(_k)**2,
  328. (_k, 0, -m - 1)))
  329. assert laguerre(m, x).rewrite("polynomial").dummy_eq(
  330. exp(x)*Sum((-x)**_k*RisingFactorial(m + 1, _k)/factorial(_k)**2,
  331. (_k, 0, -m - 1)))
  332. assert diff(laguerre(n, x), x) == -assoc_laguerre(n - 1, 1, x)
  333. k = Symbol('k')
  334. assert laguerre(-n, x) == exp(x)*laguerre(n - 1, -x)
  335. assert laguerre(-3, x) == exp(x)*laguerre(2, -x)
  336. assert unchanged(laguerre, -n + k, x)
  337. raises(ValueError, lambda: laguerre(-2.1, x))
  338. raises(ValueError, lambda: laguerre(Rational(5, 2), x))
  339. raises(ArgumentIndexError, lambda: laguerre(n, x).fdiff(1))
  340. raises(ArgumentIndexError, lambda: laguerre(n, x).fdiff(3))
  341. def test_assoc_laguerre():
  342. n = Symbol("n")
  343. m = Symbol("m")
  344. alpha = Symbol("alpha")
  345. # generalized Laguerre polynomials:
  346. assert assoc_laguerre(0, alpha, x) == 1
  347. assert assoc_laguerre(1, alpha, x) == -x + alpha + 1
  348. assert assoc_laguerre(2, alpha, x).expand() == \
  349. (x**2/2 - (alpha + 2)*x + (alpha + 2)*(alpha + 1)/2).expand()
  350. assert assoc_laguerre(3, alpha, x).expand() == \
  351. (-x**3/6 + (alpha + 3)*x**2/2 - (alpha + 2)*(alpha + 3)*x/2 +
  352. (alpha + 1)*(alpha + 2)*(alpha + 3)/6).expand()
  353. # Test the lowest 10 polynomials with laguerre_poly, to make sure it works:
  354. for i in range(10):
  355. assert assoc_laguerre(i, 0, x).expand() == laguerre_poly(i, x)
  356. X = assoc_laguerre(n, m, x)
  357. assert isinstance(X, assoc_laguerre)
  358. assert assoc_laguerre(n, 0, x) == laguerre(n, x)
  359. assert assoc_laguerre(n, alpha, 0) == binomial(alpha + n, alpha)
  360. p = Symbol("p", positive=True)
  361. assert assoc_laguerre(p, alpha, oo) == (-1)**p*oo
  362. assert assoc_laguerre(p, alpha, -oo) is oo
  363. assert diff(assoc_laguerre(n, alpha, x), x) == \
  364. -assoc_laguerre(n - 1, alpha + 1, x)
  365. _k = Dummy('k')
  366. assert diff(assoc_laguerre(n, alpha, x), alpha).dummy_eq(
  367. Sum(assoc_laguerre(_k, alpha, x)/(-alpha + n), (_k, 0, n - 1)))
  368. assert conjugate(assoc_laguerre(n, alpha, x)) == \
  369. assoc_laguerre(n, conjugate(alpha), conjugate(x))
  370. assert assoc_laguerre(n, alpha, x).rewrite(Sum).dummy_eq(
  371. gamma(alpha + n + 1)*Sum(x**_k*RisingFactorial(-n, _k)/
  372. (factorial(_k)*gamma(_k + alpha + 1)), (_k, 0, n))/factorial(n))
  373. assert assoc_laguerre(n, alpha, x).rewrite("polynomial").dummy_eq(
  374. gamma(alpha + n + 1)*Sum(x**_k*RisingFactorial(-n, _k)/
  375. (factorial(_k)*gamma(_k + alpha + 1)), (_k, 0, n))/factorial(n))
  376. raises(ValueError, lambda: assoc_laguerre(-2.1, alpha, x))
  377. raises(ArgumentIndexError, lambda: assoc_laguerre(n, alpha, x).fdiff(1))
  378. raises(ArgumentIndexError, lambda: assoc_laguerre(n, alpha, x).fdiff(4))