test_generate.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. from sympy.core.numbers import (I, Rational, nan, zoo)
  2. from sympy.core.singleton import S
  3. from sympy.core.symbol import Symbol
  4. from sympy.ntheory.generate import (sieve, Sieve)
  5. from sympy.series.limits import limit
  6. from sympy.ntheory import isprime, totient, mobius, randprime, nextprime, prevprime, \
  7. primerange, primepi, prime, primorial, composite, compositepi, reduced_totient
  8. from sympy.ntheory.generate import cycle_length
  9. from sympy.ntheory.primetest import mr
  10. from sympy.testing.pytest import raises
  11. def test_prime():
  12. assert prime(1) == 2
  13. assert prime(2) == 3
  14. assert prime(5) == 11
  15. assert prime(11) == 31
  16. assert prime(57) == 269
  17. assert prime(296) == 1949
  18. assert prime(559) == 4051
  19. assert prime(3000) == 27449
  20. assert prime(4096) == 38873
  21. assert prime(9096) == 94321
  22. assert prime(25023) == 287341
  23. assert prime(10000000) == 179424673 # issue #20951
  24. assert prime(99999999) == 2038074739
  25. raises(ValueError, lambda: prime(0))
  26. sieve.extend(3000)
  27. assert prime(401) == 2749
  28. raises(ValueError, lambda: prime(-1))
  29. def test_primepi():
  30. assert primepi(-1) == 0
  31. assert primepi(1) == 0
  32. assert primepi(2) == 1
  33. assert primepi(Rational(7, 2)) == 2
  34. assert primepi(3.5) == 2
  35. assert primepi(5) == 3
  36. assert primepi(11) == 5
  37. assert primepi(57) == 16
  38. assert primepi(296) == 62
  39. assert primepi(559) == 102
  40. assert primepi(3000) == 430
  41. assert primepi(4096) == 564
  42. assert primepi(9096) == 1128
  43. assert primepi(25023) == 2763
  44. assert primepi(10**8) == 5761455
  45. assert primepi(253425253) == 13856396
  46. assert primepi(8769575643) == 401464322
  47. sieve.extend(3000)
  48. assert primepi(2000) == 303
  49. n = Symbol('n')
  50. assert primepi(n).subs(n, 2) == 1
  51. r = Symbol('r', real=True)
  52. assert primepi(r).subs(r, 2) == 1
  53. assert primepi(S.Infinity) is S.Infinity
  54. assert primepi(S.NegativeInfinity) == 0
  55. assert limit(primepi(n), n, 100) == 25
  56. raises(ValueError, lambda: primepi(I))
  57. raises(ValueError, lambda: primepi(1 + I))
  58. raises(ValueError, lambda: primepi(zoo))
  59. raises(ValueError, lambda: primepi(nan))
  60. def test_composite():
  61. from sympy.ntheory.generate import sieve
  62. sieve._reset()
  63. assert composite(1) == 4
  64. assert composite(2) == 6
  65. assert composite(5) == 10
  66. assert composite(11) == 20
  67. assert composite(41) == 58
  68. assert composite(57) == 80
  69. assert composite(296) == 370
  70. assert composite(559) == 684
  71. assert composite(3000) == 3488
  72. assert composite(4096) == 4736
  73. assert composite(9096) == 10368
  74. assert composite(25023) == 28088
  75. sieve.extend(3000)
  76. assert composite(1957) == 2300
  77. assert composite(2568) == 2998
  78. raises(ValueError, lambda: composite(0))
  79. def test_compositepi():
  80. assert compositepi(1) == 0
  81. assert compositepi(2) == 0
  82. assert compositepi(5) == 1
  83. assert compositepi(11) == 5
  84. assert compositepi(57) == 40
  85. assert compositepi(296) == 233
  86. assert compositepi(559) == 456
  87. assert compositepi(3000) == 2569
  88. assert compositepi(4096) == 3531
  89. assert compositepi(9096) == 7967
  90. assert compositepi(25023) == 22259
  91. assert compositepi(10**8) == 94238544
  92. assert compositepi(253425253) == 239568856
  93. assert compositepi(8769575643) == 8368111320
  94. sieve.extend(3000)
  95. assert compositepi(2321) == 1976
  96. def test_generate():
  97. from sympy.ntheory.generate import sieve
  98. sieve._reset()
  99. assert nextprime(-4) == 2
  100. assert nextprime(2) == 3
  101. assert nextprime(5) == 7
  102. assert nextprime(12) == 13
  103. assert prevprime(3) == 2
  104. assert prevprime(7) == 5
  105. assert prevprime(13) == 11
  106. assert prevprime(19) == 17
  107. assert prevprime(20) == 19
  108. sieve.extend_to_no(9)
  109. assert sieve._list[-1] == 23
  110. assert sieve._list[-1] < 31
  111. assert 31 in sieve
  112. assert nextprime(90) == 97
  113. assert nextprime(10**40) == (10**40 + 121)
  114. assert prevprime(97) == 89
  115. assert prevprime(10**40) == (10**40 - 17)
  116. assert list(sieve.primerange(10, 1)) == []
  117. assert list(sieve.primerange(5, 9)) == [5, 7]
  118. sieve._reset(prime=True)
  119. assert list(sieve.primerange(2, 13)) == [2, 3, 5, 7, 11]
  120. assert list(sieve.primerange(13)) == [2, 3, 5, 7, 11]
  121. assert list(sieve.primerange(8)) == [2, 3, 5, 7]
  122. assert list(sieve.primerange(-2)) == []
  123. assert list(sieve.primerange(29)) == [2, 3, 5, 7, 11, 13, 17, 19, 23]
  124. assert list(sieve.primerange(34)) == [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]
  125. assert list(sieve.totientrange(5, 15)) == [4, 2, 6, 4, 6, 4, 10, 4, 12, 6]
  126. sieve._reset(totient=True)
  127. assert list(sieve.totientrange(3, 13)) == [2, 2, 4, 2, 6, 4, 6, 4, 10, 4]
  128. assert list(sieve.totientrange(900, 1000)) == [totient(x) for x in range(900, 1000)]
  129. assert list(sieve.totientrange(0, 1)) == []
  130. assert list(sieve.totientrange(1, 2)) == [1]
  131. assert list(sieve.mobiusrange(5, 15)) == [-1, 1, -1, 0, 0, 1, -1, 0, -1, 1]
  132. sieve._reset(mobius=True)
  133. assert list(sieve.mobiusrange(3, 13)) == [-1, 0, -1, 1, -1, 0, 0, 1, -1, 0]
  134. assert list(sieve.mobiusrange(1050, 1100)) == [mobius(x) for x in range(1050, 1100)]
  135. assert list(sieve.mobiusrange(0, 1)) == []
  136. assert list(sieve.mobiusrange(1, 2)) == [1]
  137. assert list(primerange(10, 1)) == []
  138. assert list(primerange(2, 7)) == [2, 3, 5]
  139. assert list(primerange(2, 10)) == [2, 3, 5, 7]
  140. assert list(primerange(1050, 1100)) == [1051, 1061,
  141. 1063, 1069, 1087, 1091, 1093, 1097]
  142. s = Sieve()
  143. for i in range(30, 2350, 376):
  144. for j in range(2, 5096, 1139):
  145. A = list(s.primerange(i, i + j))
  146. B = list(primerange(i, i + j))
  147. assert A == B
  148. s = Sieve()
  149. assert s[10] == 29
  150. assert nextprime(2, 2) == 5
  151. raises(ValueError, lambda: totient(0))
  152. raises(ValueError, lambda: reduced_totient(0))
  153. raises(ValueError, lambda: primorial(0))
  154. assert mr(1, [2]) is False
  155. func = lambda i: (i**2 + 1) % 51
  156. assert next(cycle_length(func, 4)) == (6, 2)
  157. assert list(cycle_length(func, 4, values=True)) == \
  158. [17, 35, 2, 5, 26, 14, 44, 50, 2, 5, 26, 14]
  159. assert next(cycle_length(func, 4, nmax=5)) == (5, None)
  160. assert list(cycle_length(func, 4, nmax=5, values=True)) == \
  161. [17, 35, 2, 5, 26]
  162. sieve.extend(3000)
  163. assert nextprime(2968) == 2969
  164. assert prevprime(2930) == 2927
  165. raises(ValueError, lambda: prevprime(1))
  166. raises(ValueError, lambda: prevprime(-4))
  167. def test_randprime():
  168. assert randprime(10, 1) is None
  169. assert randprime(3, -3) is None
  170. assert randprime(2, 3) == 2
  171. assert randprime(1, 3) == 2
  172. assert randprime(3, 5) == 3
  173. raises(ValueError, lambda: randprime(-12, -2))
  174. raises(ValueError, lambda: randprime(-10, 0))
  175. raises(ValueError, lambda: randprime(20, 22))
  176. raises(ValueError, lambda: randprime(0, 2))
  177. raises(ValueError, lambda: randprime(1, 2))
  178. for a in [100, 300, 500, 250000]:
  179. for b in [100, 300, 500, 250000]:
  180. p = randprime(a, a + b)
  181. assert a <= p < (a + b) and isprime(p)
  182. def test_primorial():
  183. assert primorial(1) == 2
  184. assert primorial(1, nth=0) == 1
  185. assert primorial(2) == 6
  186. assert primorial(2, nth=0) == 2
  187. assert primorial(4, nth=0) == 6
  188. def test_search():
  189. assert 2 in sieve
  190. assert 2.1 not in sieve
  191. assert 1 not in sieve
  192. assert 2**1000 not in sieve
  193. raises(ValueError, lambda: sieve.search(1))
  194. def test_sieve_slice():
  195. assert sieve[5] == 11
  196. assert list(sieve[5:10]) == [sieve[x] for x in range(5, 10)]
  197. assert list(sieve[5:10:2]) == [sieve[x] for x in range(5, 10, 2)]
  198. assert list(sieve[1:5]) == [2, 3, 5, 7]
  199. raises(IndexError, lambda: sieve[:5])
  200. raises(IndexError, lambda: sieve[0])
  201. raises(IndexError, lambda: sieve[0:5])
  202. def test_sieve_iter():
  203. values = []
  204. for value in sieve:
  205. if value > 7:
  206. break
  207. values.append(value)
  208. assert values == list(sieve[1:5])
  209. def test_sieve_repr():
  210. assert "sieve" in repr(sieve)
  211. assert "prime" in repr(sieve)