test_primetest.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. from sympy.ntheory.generate import Sieve, sieve
  2. from sympy.ntheory.primetest import (mr, is_lucas_prp, is_square,
  3. is_strong_lucas_prp, is_extra_strong_lucas_prp, isprime, is_euler_pseudoprime,
  4. is_gaussian_prime)
  5. from sympy.testing.pytest import slow
  6. from sympy.core.numbers import I
  7. def test_euler_pseudoprimes():
  8. assert is_euler_pseudoprime(9, 1) == True
  9. assert is_euler_pseudoprime(341, 2) == False
  10. assert is_euler_pseudoprime(121, 3) == True
  11. assert is_euler_pseudoprime(341, 4) == True
  12. assert is_euler_pseudoprime(217, 5) == False
  13. assert is_euler_pseudoprime(185, 6) == False
  14. assert is_euler_pseudoprime(55, 111) == True
  15. assert is_euler_pseudoprime(115, 114) == True
  16. assert is_euler_pseudoprime(49, 117) == True
  17. assert is_euler_pseudoprime(85, 84) == True
  18. assert is_euler_pseudoprime(87, 88) == True
  19. assert is_euler_pseudoprime(49, 128) == True
  20. assert is_euler_pseudoprime(39, 77) == True
  21. assert is_euler_pseudoprime(9881, 30) == True
  22. assert is_euler_pseudoprime(8841, 29) == False
  23. assert is_euler_pseudoprime(8421, 29) == False
  24. assert is_euler_pseudoprime(9997, 19) == True
  25. def test_is_extra_strong_lucas_prp():
  26. assert is_extra_strong_lucas_prp(4) == False
  27. assert is_extra_strong_lucas_prp(989) == True
  28. assert is_extra_strong_lucas_prp(10877) == True
  29. assert is_extra_strong_lucas_prp(9) == False
  30. assert is_extra_strong_lucas_prp(16) == False
  31. assert is_extra_strong_lucas_prp(169) == False
  32. @slow
  33. def test_prps():
  34. oddcomposites = [n for n in range(1, 10**5) if
  35. n % 2 and not isprime(n)]
  36. # A checksum would be better.
  37. assert sum(oddcomposites) == 2045603465
  38. assert [n for n in oddcomposites if mr(n, [2])] == [
  39. 2047, 3277, 4033, 4681, 8321, 15841, 29341, 42799, 49141,
  40. 52633, 65281, 74665, 80581, 85489, 88357, 90751]
  41. assert [n for n in oddcomposites if mr(n, [3])] == [
  42. 121, 703, 1891, 3281, 8401, 8911, 10585, 12403, 16531,
  43. 18721, 19345, 23521, 31621, 44287, 47197, 55969, 63139,
  44. 74593, 79003, 82513, 87913, 88573, 97567]
  45. assert [n for n in oddcomposites if mr(n, [325])] == [
  46. 9, 25, 27, 49, 65, 81, 325, 341, 343, 697, 1141, 2059,
  47. 2149, 3097, 3537, 4033, 4681, 4941, 5833, 6517, 7987, 8911,
  48. 12403, 12913, 15043, 16021, 20017, 22261, 23221, 24649,
  49. 24929, 31841, 35371, 38503, 43213, 44173, 47197, 50041,
  50. 55909, 56033, 58969, 59089, 61337, 65441, 68823, 72641,
  51. 76793, 78409, 85879]
  52. assert not any(mr(n, [9345883071009581737]) for n in oddcomposites)
  53. assert [n for n in oddcomposites if is_lucas_prp(n)] == [
  54. 323, 377, 1159, 1829, 3827, 5459, 5777, 9071, 9179, 10877,
  55. 11419, 11663, 13919, 14839, 16109, 16211, 18407, 18971,
  56. 19043, 22499, 23407, 24569, 25199, 25877, 26069, 27323,
  57. 32759, 34943, 35207, 39059, 39203, 39689, 40309, 44099,
  58. 46979, 47879, 50183, 51983, 53663, 56279, 58519, 60377,
  59. 63881, 69509, 72389, 73919, 75077, 77219, 79547, 79799,
  60. 82983, 84419, 86063, 90287, 94667, 97019, 97439]
  61. assert [n for n in oddcomposites if is_strong_lucas_prp(n)] == [
  62. 5459, 5777, 10877, 16109, 18971, 22499, 24569, 25199, 40309,
  63. 58519, 75077, 97439]
  64. assert [n for n in oddcomposites if is_extra_strong_lucas_prp(n)
  65. ] == [
  66. 989, 3239, 5777, 10877, 27971, 29681, 30739, 31631, 39059,
  67. 72389, 73919, 75077]
  68. def test_isprime():
  69. s = Sieve()
  70. s.extend(100000)
  71. ps = set(s.primerange(2, 100001))
  72. for n in range(100001):
  73. # if (n in ps) != isprime(n): print n
  74. assert (n in ps) == isprime(n)
  75. assert isprime(179424673)
  76. assert isprime(20678048681)
  77. assert isprime(1968188556461)
  78. assert isprime(2614941710599)
  79. assert isprime(65635624165761929287)
  80. assert isprime(1162566711635022452267983)
  81. assert isprime(77123077103005189615466924501)
  82. assert isprime(3991617775553178702574451996736229)
  83. assert isprime(273952953553395851092382714516720001799)
  84. assert isprime(int('''
  85. 531137992816767098689588206552468627329593117727031923199444138200403\
  86. 559860852242739162502265229285668889329486246501015346579337652707239\
  87. 409519978766587351943831270835393219031728127'''))
  88. # Some Mersenne primes
  89. assert isprime(2**61 - 1)
  90. assert isprime(2**89 - 1)
  91. assert isprime(2**607 - 1)
  92. # (but not all Mersenne's are primes
  93. assert not isprime(2**601 - 1)
  94. # pseudoprimes
  95. #-------------
  96. # to some small bases
  97. assert not isprime(2152302898747)
  98. assert not isprime(3474749660383)
  99. assert not isprime(341550071728321)
  100. assert not isprime(3825123056546413051)
  101. # passes the base set [2, 3, 7, 61, 24251]
  102. assert not isprime(9188353522314541)
  103. # large examples
  104. assert not isprime(877777777777777777777777)
  105. # conjectured psi_12 given at http://mathworld.wolfram.com/StrongPseudoprime.html
  106. assert not isprime(318665857834031151167461)
  107. # conjectured psi_17 given at http://mathworld.wolfram.com/StrongPseudoprime.html
  108. assert not isprime(564132928021909221014087501701)
  109. # Arnault's 1993 number; a factor of it is
  110. # 400958216639499605418306452084546853005188166041132508774506\
  111. # 204738003217070119624271622319159721973358216316508535816696\
  112. # 9145233813917169287527980445796800452592031836601
  113. assert not isprime(int('''
  114. 803837457453639491257079614341942108138837688287558145837488917522297\
  115. 427376533365218650233616396004545791504202360320876656996676098728404\
  116. 396540823292873879185086916685732826776177102938969773947016708230428\
  117. 687109997439976544144845341155872450633409279022275296229414984230688\
  118. 1685404326457534018329786111298960644845216191652872597534901'''))
  119. # Arnault's 1995 number; can be factored as
  120. # p1*(313*(p1 - 1) + 1)*(353*(p1 - 1) + 1) where p1 is
  121. # 296744956686855105501541746429053327307719917998530433509950\
  122. # 755312768387531717701995942385964281211880336647542183455624\
  123. # 93168782883
  124. assert not isprime(int('''
  125. 288714823805077121267142959713039399197760945927972270092651602419743\
  126. 230379915273311632898314463922594197780311092934965557841894944174093\
  127. 380561511397999942154241693397290542371100275104208013496673175515285\
  128. 922696291677532547504444585610194940420003990443211677661994962953925\
  129. 045269871932907037356403227370127845389912612030924484149472897688540\
  130. 6024976768122077071687938121709811322297802059565867'''))
  131. sieve.extend(3000)
  132. assert isprime(2819)
  133. assert not isprime(2931)
  134. assert not isprime(2.0)
  135. def test_is_square():
  136. assert [i for i in range(25) if is_square(i)] == [0, 1, 4, 9, 16]
  137. # issue #17044
  138. assert not is_square(60 ** 3)
  139. assert not is_square(60 ** 5)
  140. assert not is_square(84 ** 7)
  141. assert not is_square(105 ** 9)
  142. assert not is_square(120 ** 3)
  143. def test_is_gaussianprime():
  144. assert is_gaussian_prime(7*I)
  145. assert is_gaussian_prime(7)
  146. assert is_gaussian_prime(2 + 3*I)
  147. assert not is_gaussian_prime(2 + 2*I)