Advertisement
Guest User

Untitled

a guest
Jul 25th, 2016
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.18 KB | None | 0 0
  1. _mrpt_num_trials = 5 # number of bases to test
  2.  
  3. def is_probable_prime(n):
  4. """
  5. Miller-Rabin primality test.
  6.  
  7. A return value of False means n is certainly not prime. A return value of
  8. True means n is very likely a prime.
  9.  
  10. >>> is_probable_prime(1)
  11. Traceback (most recent call last):
  12. ...
  13. AssertionError
  14. >>> is_probable_prime(2)
  15. True
  16. >>> is_probable_prime(3)
  17. True
  18. >>> is_probable_prime(4)
  19. False
  20. >>> is_probable_prime(5)
  21. True
  22. >>> is_probable_prime(123456789)
  23. False
  24.  
  25. >>> primes_under_1000 = [i for i in range(2, 1000) if is_probable_prime(i)]
  26. >>> len(primes_under_1000)
  27. 168
  28. >>> primes_under_1000[-10:]
  29. [937, 941, 947, 953, 967, 971, 977, 983, 991, 997]
  30.  
  31. >>> is_probable_prime(6438080068035544392301298549614926991513861075340134\
  32. 3291807343952413826484237063006136971539473913409092293733259038472039\
  33. 7133335969549256322620979036686633213903952966175107096769180017646161\
  34. 851573147596390153)
  35. True
  36.  
  37. >>> is_probable_prime(7438080068035544392301298549614926991513861075340134\
  38. 3291807343952413826484237063006136971539473913409092293733259038472039\
  39. 7133335969549256322620979036686633213903952966175107096769180017646161\
  40. 851573147596390153)
  41. False
  42. """
  43. assert n >= 2
  44. # special case 2
  45. if n == 2:
  46. return True
  47. # ensure n is odd
  48. if n % 2 == 0:
  49. return False
  50. # write n-1 as 2**s * d
  51. # repeatedly try to divide n-1 by 2
  52. s = 0
  53. d = n-1
  54. while True:
  55. quotient, remainder = divmod(d, 2)
  56. if remainder == 1:
  57. break
  58. s += 1
  59. d = quotient
  60. assert(2**s * d == n-1)
  61.  
  62. # test the base a to see whether it is a witness for the compositeness of n
  63. def try_composite(a):
  64. if pow(a, d, n) == 1:
  65. return False
  66. for i in range(s):
  67. if pow(a, 2**i * d, n) == n-1:
  68. return False
  69. return True # n is definitely composite
  70.  
  71. for i in range(_mrpt_num_trials):
  72. a = random.randrange(2, n)
  73. if try_composite(a):
  74. return False
  75.  
  76. return True # no base tested showed n as composite
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement