Advertisement
Guest User

Untitled

a guest
May 4th, 2016
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.22 KB | None | 0 0
  1. import java.util.Collections;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.function.Predicate;
  5. import java.util.function.Supplier;
  6. import java.util.stream.Stream;
  7.  
  8. /**
  9. * Primes generator.
  10. */
  11. public class Primes {
  12.  
  13. private final Map<Long,Boolean> cache;
  14. private final Predicate<Long> isPrime;
  15.  
  16. /**
  17. * Creates a new basic prime generator.
  18. */
  19. public Primes(){
  20. this.cache = Collections.emptyMap();
  21. this.isPrime = Primes::isPrime;
  22. }
  23.  
  24. /**
  25. * Creates a memoized prime generator with a cache of
  26. * the provided size.
  27. *
  28. * @param cacheSize - the cache size.
  29. */
  30. public Primes(int cacheSize) {
  31. if(cacheSize < 1) {
  32. throw new IllegalArgumentException("The cache size must be a positive integer bigger than 0: " + cacheSize);
  33. }
  34. this.cache = new HashMap<>(cacheSize);
  35. this.isPrime = memoize(Primes::isPrime);
  36. }
  37.  
  38. private Predicate<Long> memoize(Predicate<Long> source) {
  39. return x -> cache.computeIfAbsent(x, source::test);
  40. }
  41.  
  42. private static boolean isEven(long n){
  43. return n % 2 == 0;
  44. }
  45.  
  46. /**
  47. * Determines the smallest divisor of n starting at k.
  48. */
  49. private static long ldf(long n, long k) {
  50. while(true){
  51. if(n % k == 0) return k;
  52. else if(k * k > n) return n;
  53. else k = k + 2;
  54. }
  55. }
  56.  
  57. private static boolean isPrime(long n) {
  58. return n==2 || ((n >= 2) && !isEven(n) && ldf(n, 3) == n);
  59. }
  60.  
  61. /**
  62. * Infinite generator of prime numbers.
  63. */
  64. private static class PrimeGenerator implements Supplier<Long> {
  65.  
  66. private long prime = 2;
  67. private final Predicate<Long> isPrime;
  68.  
  69. PrimeGenerator(Predicate<Long> isPrime) {
  70. this.isPrime = isPrime;
  71. }
  72.  
  73. @Override
  74. public Long get() {
  75. if(prime == 2) {
  76. return prime++;
  77. }
  78. do {
  79. prime = prime + 2;
  80. } while(!isPrime.test(prime));
  81. return prime;
  82. }
  83. }
  84.  
  85. /**
  86. * Provides an infinite stream of prime numbers.
  87. */
  88. public Stream<Long> stream(){
  89. return Stream.generate(new PrimeGenerator(this.isPrime));
  90. }
  91.  
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement