test_generate.py 9.6 KB

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