test_ntheory.py 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. from itertools import permutations
  2. from sympy.external.ntheory import (bit_scan1, remove, bit_scan0, is_fermat_prp,
  3. is_euler_prp, is_strong_prp, gcdext, _lucas_sequence,
  4. is_fibonacci_prp, is_lucas_prp, is_selfridge_prp,
  5. is_strong_lucas_prp, is_strong_selfridge_prp,
  6. is_bpsw_prp, is_strong_bpsw_prp)
  7. from sympy.testing.pytest import raises
  8. def test_bit_scan1():
  9. assert bit_scan1(0) is None
  10. assert bit_scan1(1) == 0
  11. assert bit_scan1(-1) == 0
  12. assert bit_scan1(2) == 1
  13. assert bit_scan1(7) == 0
  14. assert bit_scan1(-7) == 0
  15. for i in range(100):
  16. assert bit_scan1(1 << i) == i
  17. assert bit_scan1((1 << i) * 31337) == i
  18. for i in range(500):
  19. n = (1 << 500) + (1 << i)
  20. assert bit_scan1(n) == i
  21. assert bit_scan1(1 << 1000001) == 1000001
  22. assert bit_scan1((1 << 273956)*7**37) == 273956
  23. # issue 12709
  24. for i in range(1, 10):
  25. big = 1 << i
  26. assert bit_scan1(-big) == bit_scan1(big)
  27. def test_bit_scan0():
  28. assert bit_scan0(-1) is None
  29. assert bit_scan0(0) == 0
  30. assert bit_scan0(1) == 1
  31. assert bit_scan0(-2) == 0
  32. def test_remove():
  33. raises(ValueError, lambda: remove(1, 1))
  34. assert remove(0, 3) == (0, 0)
  35. for f in range(2, 10):
  36. for y in range(2, 1000):
  37. for z in [1, 17, 101, 1009]:
  38. assert remove(z*f**y, f) == (z, y)
  39. def test_gcdext():
  40. assert gcdext(0, 0) == (0, 0, 0)
  41. assert gcdext(3, 0) == (3, 1, 0)
  42. assert gcdext(0, 4) == (4, 0, 1)
  43. for n in range(1, 10):
  44. assert gcdext(n, 1) == gcdext(-n, 1) == (1, 0, 1)
  45. assert gcdext(n, -1) == gcdext(-n, -1) == (1, 0, -1)
  46. assert gcdext(n, n) == gcdext(-n, n) == (n, 0, 1)
  47. assert gcdext(n, -n) == gcdext(-n, -n) == (n, 0, -1)
  48. for n in range(2, 10):
  49. assert gcdext(1, n) == gcdext(1, -n) == (1, 1, 0)
  50. assert gcdext(-1, n) == gcdext(-1, -n) == (1, -1, 0)
  51. for a, b in permutations([2**5, 3, 5, 7**2, 11], 2):
  52. g, x, y = gcdext(a, b)
  53. assert g == a*x + b*y == 1
  54. def test_is_fermat_prp():
  55. # invalid input
  56. raises(ValueError, lambda: is_fermat_prp(0, 10))
  57. raises(ValueError, lambda: is_fermat_prp(5, 1))
  58. # n = 1
  59. assert not is_fermat_prp(1, 3)
  60. # n is prime
  61. assert is_fermat_prp(2, 4)
  62. assert is_fermat_prp(3, 2)
  63. assert is_fermat_prp(11, 3)
  64. assert is_fermat_prp(2**31-1, 5)
  65. # A001567
  66. pseudorpime = [341, 561, 645, 1105, 1387, 1729, 1905, 2047,
  67. 2465, 2701, 2821, 3277, 4033, 4369, 4371, 4681]
  68. for n in pseudorpime:
  69. assert is_fermat_prp(n, 2)
  70. # A020136
  71. pseudorpime = [15, 85, 91, 341, 435, 451, 561, 645, 703, 1105,
  72. 1247, 1271, 1387, 1581, 1695, 1729, 1891, 1905]
  73. for n in pseudorpime:
  74. assert is_fermat_prp(n, 4)
  75. def test_is_euler_prp():
  76. # invalid input
  77. raises(ValueError, lambda: is_euler_prp(0, 10))
  78. raises(ValueError, lambda: is_euler_prp(5, 1))
  79. # n = 1
  80. assert not is_euler_prp(1, 3)
  81. # n is prime
  82. assert is_euler_prp(2, 4)
  83. assert is_euler_prp(3, 2)
  84. assert is_euler_prp(11, 3)
  85. assert is_euler_prp(2**31-1, 5)
  86. # A047713
  87. pseudorpime = [561, 1105, 1729, 1905, 2047, 2465, 3277, 4033,
  88. 4681, 6601, 8321, 8481, 10585, 12801, 15841]
  89. for n in pseudorpime:
  90. assert is_euler_prp(n, 2)
  91. # A048950
  92. pseudorpime = [121, 703, 1729, 1891, 2821, 3281, 7381, 8401,
  93. 8911, 10585, 12403, 15457, 15841, 16531, 18721]
  94. for n in pseudorpime:
  95. assert is_euler_prp(n, 3)
  96. def test_is_strong_prp():
  97. # invalid input
  98. raises(ValueError, lambda: is_strong_prp(0, 10))
  99. raises(ValueError, lambda: is_strong_prp(5, 1))
  100. # n = 1
  101. assert not is_strong_prp(1, 3)
  102. # n is prime
  103. assert is_strong_prp(2, 4)
  104. assert is_strong_prp(3, 2)
  105. assert is_strong_prp(11, 3)
  106. assert is_strong_prp(2**31-1, 5)
  107. # A001262
  108. pseudorpime = [2047, 3277, 4033, 4681, 8321, 15841, 29341,
  109. 42799, 49141, 52633, 65281, 74665, 80581]
  110. for n in pseudorpime:
  111. assert is_strong_prp(n, 2)
  112. # A020229
  113. pseudorpime = [121, 703, 1891, 3281, 8401, 8911, 10585, 12403,
  114. 16531, 18721, 19345, 23521, 31621, 44287, 47197]
  115. for n in pseudorpime:
  116. assert is_strong_prp(n, 3)
  117. def test_lucas_sequence():
  118. def lucas_u(P, Q, length):
  119. array = [0] * length
  120. array[1] = 1
  121. for k in range(2, length):
  122. array[k] = P * array[k - 1] - Q * array[k - 2]
  123. return array
  124. def lucas_v(P, Q, length):
  125. array = [0] * length
  126. array[0] = 2
  127. array[1] = P
  128. for k in range(2, length):
  129. array[k] = P * array[k - 1] - Q * array[k - 2]
  130. return array
  131. length = 20
  132. for P in range(-10, 10):
  133. for Q in range(-10, 10):
  134. D = P**2 - 4*Q
  135. if D == 0:
  136. continue
  137. us = lucas_u(P, Q, length)
  138. vs = lucas_v(P, Q, length)
  139. for n in range(3, 100, 2):
  140. for k in range(length):
  141. U, V, Qk = _lucas_sequence(n, P, Q, k)
  142. assert U == us[k] % n
  143. assert V == vs[k] % n
  144. assert pow(Q, k, n) == Qk
  145. def test_is_fibonacci_prp():
  146. # invalid input
  147. raises(ValueError, lambda: is_fibonacci_prp(3, 2, 1))
  148. raises(ValueError, lambda: is_fibonacci_prp(3, -5, 1))
  149. raises(ValueError, lambda: is_fibonacci_prp(3, 5, 2))
  150. raises(ValueError, lambda: is_fibonacci_prp(0, 5, -1))
  151. # n = 1
  152. assert not is_fibonacci_prp(1, 3, 1)
  153. # n is prime
  154. assert is_fibonacci_prp(2, 5, 1)
  155. assert is_fibonacci_prp(3, 6, -1)
  156. assert is_fibonacci_prp(11, 7, 1)
  157. assert is_fibonacci_prp(2**31-1, 8, -1)
  158. # A005845
  159. pseudorpime = [705, 2465, 2737, 3745, 4181, 5777, 6721,
  160. 10877, 13201, 15251, 24465, 29281, 34561]
  161. for n in pseudorpime:
  162. assert is_fibonacci_prp(n, 1, -1)
  163. def test_is_lucas_prp():
  164. # invalid input
  165. raises(ValueError, lambda: is_lucas_prp(3, 2, 1))
  166. raises(ValueError, lambda: is_lucas_prp(0, 5, -1))
  167. raises(ValueError, lambda: is_lucas_prp(15, 3, 1))
  168. # n = 1
  169. assert not is_lucas_prp(1, 3, 1)
  170. # n is prime
  171. assert is_lucas_prp(2, 5, 2)
  172. assert is_lucas_prp(3, 6, -1)
  173. assert is_lucas_prp(11, 7, 5)
  174. assert is_lucas_prp(2**31-1, 8, -3)
  175. # A081264
  176. pseudorpime = [323, 377, 1891, 3827, 4181, 5777, 6601, 6721,
  177. 8149, 10877, 11663, 13201, 13981, 15251, 17119]
  178. for n in pseudorpime:
  179. assert is_lucas_prp(n, 1, -1)
  180. def test_is_selfridge_prp():
  181. # invalid input
  182. raises(ValueError, lambda: is_selfridge_prp(0))
  183. # n = 1
  184. assert not is_selfridge_prp(1)
  185. # n is prime
  186. assert is_selfridge_prp(2)
  187. assert is_selfridge_prp(3)
  188. assert is_selfridge_prp(11)
  189. assert is_selfridge_prp(2**31-1)
  190. # A217120
  191. pseudorpime = [323, 377, 1159, 1829, 3827, 5459, 5777, 9071,
  192. 9179, 10877, 11419, 11663, 13919, 14839, 16109]
  193. for n in pseudorpime:
  194. assert is_selfridge_prp(n)
  195. def test_is_strong_lucas_prp():
  196. # invalid input
  197. raises(ValueError, lambda: is_strong_lucas_prp(3, 2, 1))
  198. raises(ValueError, lambda: is_strong_lucas_prp(0, 5, -1))
  199. raises(ValueError, lambda: is_strong_lucas_prp(15, 3, 1))
  200. # n = 1
  201. assert not is_strong_lucas_prp(1, 3, 1)
  202. # n is prime
  203. assert is_strong_lucas_prp(2, 5, 2)
  204. assert is_strong_lucas_prp(3, 6, -1)
  205. assert is_strong_lucas_prp(11, 7, 5)
  206. assert is_strong_lucas_prp(2**31-1, 8, -3)
  207. def test_is_strong_selfridge_prp():
  208. # invalid input
  209. raises(ValueError, lambda: is_strong_selfridge_prp(0))
  210. # n = 1
  211. assert not is_strong_selfridge_prp(1)
  212. # n is prime
  213. assert is_strong_selfridge_prp(2)
  214. assert is_strong_selfridge_prp(3)
  215. assert is_strong_selfridge_prp(11)
  216. assert is_strong_selfridge_prp(2**31-1)
  217. # A217255
  218. pseudorpime = [5459, 5777, 10877, 16109, 18971, 22499, 24569,
  219. 25199, 40309, 58519, 75077, 97439, 100127, 113573]
  220. for n in pseudorpime:
  221. assert is_strong_selfridge_prp(n)
  222. def test_is_bpsw_prp():
  223. # invalid input
  224. raises(ValueError, lambda: is_bpsw_prp(0))
  225. # n = 1
  226. assert not is_bpsw_prp(1)
  227. # n is prime
  228. assert is_bpsw_prp(2)
  229. assert is_bpsw_prp(3)
  230. assert is_bpsw_prp(11)
  231. assert is_bpsw_prp(2**31-1)
  232. def test_is_strong_bpsw_prp():
  233. # invalid input
  234. raises(ValueError, lambda: is_strong_bpsw_prp(0))
  235. # n = 1
  236. assert not is_strong_bpsw_prp(1)
  237. # n is prime
  238. assert is_strong_bpsw_prp(2)
  239. assert is_strong_bpsw_prp(3)
  240. assert is_strong_bpsw_prp(11)
  241. assert is_strong_bpsw_prp(2**31-1)