Guest User

Untitled

a guest
May 27th, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.48 KB | None | 0 0
  1. --decompose n-1 as (2^s)*d
  2. local function decompose(negOne)
  3. exponent, remainder = 0, negOne
  4. while (remainder%2) == 0 do
  5. exponent = exponent+1
  6. remainder = remainder/2
  7. end
  8. assert((2^exponent)*remainder == negOne and ((remainder%2) == 1), "Error setting up s and d value")
  9. return exponent, remainder
  10. end
  11.  
  12. local function isNotWitness(n, possibleWitness, exponent, remainder)
  13. witness = (possibleWitness^remainder)%n
  14.  
  15. if (witness == 1) or (witness == n-1) then
  16. return false
  17. end
  18.  
  19. for _=0, exponent do
  20. witness = (witness^2)%n
  21. if witness == (n-1) then
  22. return false
  23. end
  24. end
  25.  
  26. return true
  27. end
  28.  
  29. --using miller-rabin primality testing
  30. --n the integer to be tested, k the accuracy of the test
  31. local function isProbablyPrime(n, accuracy)
  32. if n <= 3 then
  33. return n == 2 or n == 3
  34. end
  35. if (n%2) == 0 then
  36. return false
  37. end
  38.  
  39. exponent, remainder = decompose(n-1)
  40.  
  41. --checks if it is composite
  42. for i=0, accuracy do
  43. math.randomseed(os.time())
  44. witness = math.random(2, n - 2)
  45. if isNotWitness(n, witness, exponent, remainder) then
  46. return false
  47. end
  48. end
  49.  
  50. --probably prime
  51. return true
  52. end
  53.  
  54. if isProbablyPrime(31, 30) then
  55. print("prime")
  56. else
  57. print("nope")
  58. end
  59.  
  60. witness = mulmod(possibleWitness, remainder, n)
  61.  
  62. local function mulmod(a, e, m)
  63. local result = 1
  64. while e > 0 do
  65. if e % 2 == 1 then
  66. result = result * a % m
  67. e = e - 1
  68. end
  69. e = e / 2
  70. a = a * a % m
  71. end
  72. return result
  73. end
Add Comment
Please, Sign In to add comment