Advertisement
Guest User

Untitled

a guest
Feb 27th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.53 KB | None | 0 0
  1. import java.math.BigInteger;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.Random;
  5.  
  6. public class RabinMiller {
  7.  
  8. private static final BigInteger ZERO = BigInteger.ZERO;
  9. private static final BigInteger TWO = new BigInteger("2");
  10. private static final BigInteger THREE = new BigInteger("3");
  11. private ArrayList<BigInteger> primes;
  12.  
  13. public RabinMiller(){
  14. primes = new ArrayList<BigInteger>();
  15. primes.add(new BigInteger("2"));
  16. primes.add(new BigInteger("3"));
  17. primes.add(new BigInteger("5"));
  18. primes.add(new BigInteger("7"));
  19. }
  20.  
  21. /**
  22. *
  23. * @param number
  24. * @return
  25. */
  26. public boolean isPrime(BigInteger number){
  27. if(number.compareTo(THREE) < 0) return true;
  28. if(primes.contains(number)) return true;
  29.  
  30. for(BigInteger a : primes)
  31. if(number.mod(a).equals(ZERO))
  32. return false;
  33.  
  34. int s = 0;
  35. BigInteger d = number.subtract(new BigInteger("1"));
  36.  
  37. //While d is even divide d until it's an odd number
  38. while(d.mod(TWO).equals(ZERO)) {
  39. s++;
  40. d = d.divide(TWO);
  41. }
  42.  
  43. for(int i = 0; i < 20; i++){
  44. BigInteger a = randomBigInteger(number);
  45. if(tryComposite(a, d, number, s)) return false;
  46. }
  47. return true;
  48. }
  49.  
  50. /**
  51. * Get a random BigInteger
  52. * @param range
  53. * @return random BigInteger
  54. */
  55. private BigInteger randomBigInteger(BigInteger range){
  56. BigInteger a;
  57.  
  58. Random rand = new Random();
  59. do{
  60. a = new BigInteger(range.bitLength(), rand);
  61. } while(a.compareTo(TWO) < 0 || a.compareTo(range) >= 0);
  62.  
  63. return a;
  64. }
  65.  
  66. /**
  67. *
  68. * @param a
  69. * @param d
  70. * @param n
  71. * @param s
  72. * @return
  73. */
  74. private boolean tryComposite(BigInteger a, BigInteger d, BigInteger n, int s) {
  75. // BigInteger x = powMod(a, d, n);
  76. BigInteger x = a.modPow(d, n);
  77. if(x.equals(BigInteger.ONE) || x.equals(n.subtract(BigInteger.ONE))) return false;
  78.  
  79. int j = 1;
  80. for(; j < s; j++){
  81. // if(a.modPow(TWO.pow(j).multiply(d), n).equals(n.subtract(BigInteger.ONE))) return false;
  82. if(x.modPow(TWO, n).equals(n.subtract(BigInteger.ONE))) return false;
  83. }
  84.  
  85. return true;
  86. }
  87.  
  88. /**
  89. *
  90. * @param base
  91. * @param exp
  92. * @param mod
  93. * @return
  94. */
  95. private BigInteger powMod(BigInteger base, BigInteger exp, BigInteger mod) {
  96. if(base.equals(ZERO)) return ZERO;
  97. if(exp.equals(BigInteger.ONE)) return BigInteger.ONE;
  98.  
  99. if(exp.mod(TWO).equals(ZERO)) {
  100. return powMod(base, exp.divide(TWO), mod).pow(2).mod(mod);
  101. } else {
  102. return base.multiply(powMod(base, exp.subtract(BigInteger.ONE), mod)).mod(mod);
  103. }
  104. }
  105.  
  106. public BigInteger generate_prime(int bits){
  107. Random rand = new Random();
  108. while(true){
  109. BigInteger p = new BigInteger(bits, rand);
  110. if(isPrime(p)) return p;
  111. }
  112. }
  113.  
  114. /**
  115. * Main
  116. * @param args
  117. */
  118. public static void main(String[] args){
  119. RabinMiller rm = new RabinMiller();
  120. BigInteger prime1 = new BigInteger("1");
  121. BigInteger prime2 = new BigInteger("17");
  122. BigInteger prime3 = new BigInteger("18");
  123. BigInteger prime4 = new BigInteger("15485863");
  124. BigInteger prime5 = new BigInteger("15485864");
  125. ArrayList<BigInteger> generated_primes = new ArrayList<BigInteger>();
  126.  
  127. long startTime = System.nanoTime();
  128. for(int i = 0; i < 100; i++){
  129. generated_primes.add(rm.generate_prime(512));
  130. }
  131. long endTime = System.nanoTime();
  132. double timeSec = (endTime-startTime) / 1000000000;
  133.  
  134. int i = 0;
  135. for(BigInteger b : generated_primes){
  136. System.out.println(i + ": " + b);
  137. i++;
  138. }
  139. System.out.println("time taken in seconds: " + timeSec);
  140.  
  141. }
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement