Генератор простых чисел

  1. import java.util.PrimitiveIterator;
  2. import java.util.Spliterator;
  3. import java.util.Spliterators;
  4. import java.util.function.LongPredicate;
  5. import java.util.stream.LongStream;
  6. import java.util.stream.StreamSupport;
  7.  
  8. /**
  9.  * Генерация простых чисел
  10.  *
  11.  * @author Kalter
  12.  */
  13. public class PrimitiveNumberGenerator implements PrimitiveIterator.OfLong {
  14.  
  15.     public static LongStream finiteStream(LongPredicate predicate) {
  16.         return stream(predicate, false);
  17.     }
  18.  
  19.     public static LongStream finiteParallelStream(LongPredicate predicate) {
  20.         return stream(predicate, true);
  21.     }
  22.  
  23.     public static LongStream infiniteStream() {
  24.         return stream(a -> true, false);
  25.     }
  26.  
  27.     public static LongStream infiniteParallelStream() {
  28.         return stream(a -> true, true);
  29.     }
  30.  
  31.     private static LongStream stream(LongPredicate predicate, boolean parallel) {
  32.         return StreamSupport.longStream(Spliterators.spliteratorUnknownSize(
  33.                 new PrimitiveNumberGenerator(predicate), Spliterator.ORDERED), parallel);
  34.     }
  35.  
  36.     private final LongPredicate predicate;
  37.     private long primitiveNumber;
  38.  
  39.     protected PrimitiveNumberGenerator(LongPredicate predicate) {
  40.         this.predicate = predicate;
  41.         primitiveNumber = 1;
  42.     }
  43.  
  44.     @Override
  45.     public long nextLong() {
  46.         primitiveNumber++;
  47.         while (!isPrimitive(primitiveNumber)) {
  48.             primitiveNumber++;
  49.         }
  50.         return primitiveNumber;
  51.     }
  52.  
  53.     @Override
  54.     public boolean hasNext() {
  55.         return predicate.test(primitiveNumber);
  56.     }
  57.  
  58.     private boolean isPrimitive(long number) {
  59.         int r = 0;
  60.         for (long i = 1; i <= number; i++) {
  61.             if ((number % i) == 0) {
  62.                 r++;
  63.             }
  64.         }
  65.         return r <= 2;
  66.     }
  67. }
  1. //генерирует 10 простых чисел в пределах от 10 до 100
  2. PrimitiveNumberGenerator
  3.         .infiniteStream()
  4.         .filter(p -> p > 10 && p < 100)
  5.         .limit(10)
  6.         .forEach(System.out::println);
  7.  
  8. //генерирует первые 666 простых чисел
  9. PrimitiveNumberGenerator
  10.         .infiniteStream()
  11.         .limit(666)
  12.         .forEach(System.out::println);

Реклама

Мы в соцсетях

tw tg yt gt