Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.Collections;
- import java.util.HashMap;
- import java.util.Map;
- import java.util.function.Predicate;
- import java.util.function.Supplier;
- import java.util.stream.Stream;
- /**
- * Primes generator.
- */
- public class Primes {
- private final Map<Long,Boolean> cache;
- private final Predicate<Long> isPrime;
- /**
- * Creates a new basic prime generator.
- */
- public Primes(){
- this.cache = Collections.emptyMap();
- this.isPrime = Primes::isPrime;
- }
- /**
- * Creates a memoized prime generator with a cache of
- * the provided size.
- *
- * @param cacheSize - the cache size.
- */
- public Primes(int cacheSize) {
- if(cacheSize < 1) {
- throw new IllegalArgumentException("The cache size must be a positive integer bigger than 0: " + cacheSize);
- }
- this.cache = new HashMap<>(cacheSize);
- this.isPrime = memoize(Primes::isPrime);
- }
- private Predicate<Long> memoize(Predicate<Long> source) {
- return x -> cache.computeIfAbsent(x, source::test);
- }
- private static boolean isEven(long n){
- return n % 2 == 0;
- }
- /**
- * Determines the smallest divisor of n starting at k.
- */
- private static long ldf(long n, long k) {
- while(true){
- if(n % k == 0) return k;
- else if(k * k > n) return n;
- else k = k + 2;
- }
- }
- private static boolean isPrime(long n) {
- return n==2 || ((n >= 2) && !isEven(n) && ldf(n, 3) == n);
- }
- /**
- * Infinite generator of prime numbers.
- */
- private static class PrimeGenerator implements Supplier<Long> {
- private long prime = 2;
- private final Predicate<Long> isPrime;
- PrimeGenerator(Predicate<Long> isPrime) {
- this.isPrime = isPrime;
- }
- @Override
- public Long get() {
- if(prime == 2) {
- return prime++;
- }
- do {
- prime = prime + 2;
- } while(!isPrime.test(prime));
- return prime;
- }
- }
- /**
- * Provides an infinite stream of prime numbers.
- */
- public Stream<Long> stream(){
- return Stream.generate(new PrimeGenerator(this.isPrime));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement