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

203 lines
7.7 KiB

  1. """Tests for Gosper's algorithm for hypergeometric summation. """
  2. from sympy.core.numbers import (Rational, pi)
  3. from sympy.core.singleton import S
  4. from sympy.core.symbol import Symbol
  5. from sympy.functions.combinatorial.factorials import (binomial, factorial)
  6. from sympy.functions.elementary.miscellaneous import sqrt
  7. from sympy.functions.special.gamma_functions import gamma
  8. from sympy.polys.polytools import Poly
  9. from sympy.simplify.simplify import simplify
  10. from sympy.abc import a, b, j, k, m, n, r, x
  11. from sympy.concrete.gosper import gosper_normal, gosper_sum, gosper_term
  12. def test_gosper_normal():
  13. eq = 4*n + 5, 2*(4*n + 1)*(2*n + 3), n
  14. assert gosper_normal(*eq) == \
  15. (Poly(Rational(1, 4), n), Poly(n + Rational(3, 2)), Poly(n + Rational(1, 4)))
  16. assert gosper_normal(*eq, polys=False) == \
  17. (Rational(1, 4), n + Rational(3, 2), n + Rational(1, 4))
  18. def test_gosper_term():
  19. assert gosper_term((4*k + 1)*factorial(
  20. k)/factorial(2*k + 1), k) == (-k - S.Half)/(k + Rational(1, 4))
  21. def test_gosper_sum():
  22. assert gosper_sum(1, (k, 0, n)) == 1 + n
  23. assert gosper_sum(k, (k, 0, n)) == n*(1 + n)/2
  24. assert gosper_sum(k**2, (k, 0, n)) == n*(1 + n)*(1 + 2*n)/6
  25. assert gosper_sum(k**3, (k, 0, n)) == n**2*(1 + n)**2/4
  26. assert gosper_sum(2**k, (k, 0, n)) == 2*2**n - 1
  27. assert gosper_sum(factorial(k), (k, 0, n)) is None
  28. assert gosper_sum(binomial(n, k), (k, 0, n)) is None
  29. assert gosper_sum(factorial(k)/k**2, (k, 0, n)) is None
  30. assert gosper_sum((k - 3)*factorial(k), (k, 0, n)) is None
  31. assert gosper_sum(k*factorial(k), k) == factorial(k)
  32. assert gosper_sum(
  33. k*factorial(k), (k, 0, n)) == n*factorial(n) + factorial(n) - 1
  34. assert gosper_sum((-1)**k*binomial(n, k), (k, 0, n)) == 0
  35. assert gosper_sum((
  36. -1)**k*binomial(n, k), (k, 0, m)) == -(-1)**m*(m - n)*binomial(n, m)/n
  37. assert gosper_sum((4*k + 1)*factorial(k)/factorial(2*k + 1), (k, 0, n)) == \
  38. (2*factorial(2*n + 1) - factorial(n))/factorial(2*n + 1)
  39. # issue 6033:
  40. assert gosper_sum(
  41. n*(n + a + b)*a**n*b**n/(factorial(n + a)*factorial(n + b)), \
  42. (n, 0, m)).simplify() == -(a*b)**m*gamma(a + 1) \
  43. *gamma(b + 1)/(gamma(a)*gamma(b)*gamma(a + m + 1)*gamma(b + m + 1)) \
  44. + 1/(gamma(a)*gamma(b))
  45. def test_gosper_sum_indefinite():
  46. assert gosper_sum(k, k) == k*(k - 1)/2
  47. assert gosper_sum(k**2, k) == k*(k - 1)*(2*k - 1)/6
  48. assert gosper_sum(1/(k*(k + 1)), k) == -1/k
  49. assert gosper_sum(-(27*k**4 + 158*k**3 + 430*k**2 + 678*k + 445)*gamma(2*k
  50. + 4)/(3*(3*k + 7)*gamma(3*k + 6)), k) == \
  51. (3*k + 5)*(k**2 + 2*k + 5)*gamma(2*k + 4)/gamma(3*k + 6)
  52. def test_gosper_sum_parametric():
  53. assert gosper_sum(binomial(S.Half, m - j + 1)*binomial(S.Half, m + j), (j, 1, n)) == \
  54. n*(1 + m - n)*(-1 + 2*m + 2*n)*binomial(S.Half, 1 + m - n)* \
  55. binomial(S.Half, m + n)/(m*(1 + 2*m))
  56. def test_gosper_sum_algebraic():
  57. assert gosper_sum(
  58. n**2 + sqrt(2), (n, 0, m)) == (m + 1)*(2*m**2 + m + 6*sqrt(2))/6
  59. def test_gosper_sum_iterated():
  60. f1 = binomial(2*k, k)/4**k
  61. f2 = (1 + 2*n)*binomial(2*n, n)/4**n
  62. f3 = (1 + 2*n)*(3 + 2*n)*binomial(2*n, n)/(3*4**n)
  63. f4 = (1 + 2*n)*(3 + 2*n)*(5 + 2*n)*binomial(2*n, n)/(15*4**n)
  64. f5 = (1 + 2*n)*(3 + 2*n)*(5 + 2*n)*(7 + 2*n)*binomial(2*n, n)/(105*4**n)
  65. assert gosper_sum(f1, (k, 0, n)) == f2
  66. assert gosper_sum(f2, (n, 0, n)) == f3
  67. assert gosper_sum(f3, (n, 0, n)) == f4
  68. assert gosper_sum(f4, (n, 0, n)) == f5
  69. # the AeqB tests test expressions given in
  70. # www.math.upenn.edu/~wilf/AeqB.pdf
  71. def test_gosper_sum_AeqB_part1():
  72. f1a = n**4
  73. f1b = n**3*2**n
  74. f1c = 1/(n**2 + sqrt(5)*n - 1)
  75. f1d = n**4*4**n/binomial(2*n, n)
  76. f1e = factorial(3*n)/(factorial(n)*factorial(n + 1)*factorial(n + 2)*27**n)
  77. f1f = binomial(2*n, n)**2/((n + 1)*4**(2*n))
  78. f1g = (4*n - 1)*binomial(2*n, n)**2/((2*n - 1)**2*4**(2*n))
  79. f1h = n*factorial(n - S.Half)**2/factorial(n + 1)**2
  80. g1a = m*(m + 1)*(2*m + 1)*(3*m**2 + 3*m - 1)/30
  81. g1b = 26 + 2**(m + 1)*(m**3 - 3*m**2 + 9*m - 13)
  82. g1c = (m + 1)*(m*(m**2 - 7*m + 3)*sqrt(5) - (
  83. 3*m**3 - 7*m**2 + 19*m - 6))/(2*m**3*sqrt(5) + m**4 + 5*m**2 - 1)/6
  84. g1d = Rational(-2, 231) + 2*4**m*(m + 1)*(63*m**4 + 112*m**3 + 18*m**2 -
  85. 22*m + 3)/(693*binomial(2*m, m))
  86. g1e = Rational(-9, 2) + (81*m**2 + 261*m + 200)*factorial(
  87. 3*m + 2)/(40*27**m*factorial(m)*factorial(m + 1)*factorial(m + 2))
  88. g1f = (2*m + 1)**2*binomial(2*m, m)**2/(4**(2*m)*(m + 1))
  89. g1g = -binomial(2*m, m)**2/4**(2*m)
  90. g1h = 4*pi -(2*m + 1)**2*(3*m + 4)*factorial(m - S.Half)**2/factorial(m + 1)**2
  91. g = gosper_sum(f1a, (n, 0, m))
  92. assert g is not None and simplify(g - g1a) == 0
  93. g = gosper_sum(f1b, (n, 0, m))
  94. assert g is not None and simplify(g - g1b) == 0
  95. g = gosper_sum(f1c, (n, 0, m))
  96. assert g is not None and simplify(g - g1c) == 0
  97. g = gosper_sum(f1d, (n, 0, m))
  98. assert g is not None and simplify(g - g1d) == 0
  99. g = gosper_sum(f1e, (n, 0, m))
  100. assert g is not None and simplify(g - g1e) == 0
  101. g = gosper_sum(f1f, (n, 0, m))
  102. assert g is not None and simplify(g - g1f) == 0
  103. g = gosper_sum(f1g, (n, 0, m))
  104. assert g is not None and simplify(g - g1g) == 0
  105. g = gosper_sum(f1h, (n, 0, m))
  106. # need to call rewrite(gamma) here because we have terms involving
  107. # factorial(1/2)
  108. assert g is not None and simplify(g - g1h).rewrite(gamma) == 0
  109. def test_gosper_sum_AeqB_part2():
  110. f2a = n**2*a**n
  111. f2b = (n - r/2)*binomial(r, n)
  112. f2c = factorial(n - 1)**2/(factorial(n - x)*factorial(n + x))
  113. g2a = -a*(a + 1)/(a - 1)**3 + a**(
  114. m + 1)*(a**2*m**2 - 2*a*m**2 + m**2 - 2*a*m + 2*m + a + 1)/(a - 1)**3
  115. g2b = (m - r)*binomial(r, m)/2
  116. ff = factorial(1 - x)*factorial(1 + x)
  117. g2c = 1/ff*(
  118. 1 - 1/x**2) + factorial(m)**2/(x**2*factorial(m - x)*factorial(m + x))
  119. g = gosper_sum(f2a, (n, 0, m))
  120. assert g is not None and simplify(g - g2a) == 0
  121. g = gosper_sum(f2b, (n, 0, m))
  122. assert g is not None and simplify(g - g2b) == 0
  123. g = gosper_sum(f2c, (n, 1, m))
  124. assert g is not None and simplify(g - g2c) == 0
  125. def test_gosper_nan():
  126. a = Symbol('a', positive=True)
  127. b = Symbol('b', positive=True)
  128. n = Symbol('n', integer=True)
  129. m = Symbol('m', integer=True)
  130. f2d = n*(n + a + b)*a**n*b**n/(factorial(n + a)*factorial(n + b))
  131. g2d = 1/(factorial(a - 1)*factorial(
  132. b - 1)) - a**(m + 1)*b**(m + 1)/(factorial(a + m)*factorial(b + m))
  133. g = gosper_sum(f2d, (n, 0, m))
  134. assert simplify(g - g2d) == 0
  135. def test_gosper_sum_AeqB_part3():
  136. f3a = 1/n**4
  137. f3b = (6*n + 3)/(4*n**4 + 8*n**3 + 8*n**2 + 4*n + 3)
  138. f3c = 2**n*(n**2 - 2*n - 1)/(n**2*(n + 1)**2)
  139. f3d = n**2*4**n/((n + 1)*(n + 2))
  140. f3e = 2**n/(n + 1)
  141. f3f = 4*(n - 1)*(n**2 - 2*n - 1)/(n**2*(n + 1)**2*(n - 2)**2*(n - 3)**2)
  142. f3g = (n**4 - 14*n**2 - 24*n - 9)*2**n/(n**2*(n + 1)**2*(n + 2)**2*
  143. (n + 3)**2)
  144. # g3a -> no closed form
  145. g3b = m*(m + 2)/(2*m**2 + 4*m + 3)
  146. g3c = 2**m/m**2 - 2
  147. g3d = Rational(2, 3) + 4**(m + 1)*(m - 1)/(m + 2)/3
  148. # g3e -> no closed form
  149. g3f = -(Rational(-1, 16) + 1/((m - 2)**2*(m + 1)**2)) # the AeqB key is wrong
  150. g3g = Rational(-2, 9) + 2**(m + 1)/((m + 1)**2*(m + 3)**2)
  151. g = gosper_sum(f3a, (n, 1, m))
  152. assert g is None
  153. g = gosper_sum(f3b, (n, 1, m))
  154. assert g is not None and simplify(g - g3b) == 0
  155. g = gosper_sum(f3c, (n, 1, m - 1))
  156. assert g is not None and simplify(g - g3c) == 0
  157. g = gosper_sum(f3d, (n, 1, m))
  158. assert g is not None and simplify(g - g3d) == 0
  159. g = gosper_sum(f3e, (n, 0, m - 1))
  160. assert g is None
  161. g = gosper_sum(f3f, (n, 4, m))
  162. assert g is not None and simplify(g - g3f) == 0
  163. g = gosper_sum(f3g, (n, 1, m))
  164. assert g is not None and simplify(g - g3g) == 0