/* * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Oracle nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * This source code is provided to illustrate the usage of a given feature * or technique and has been deliberately simplified. Additional steps * required for a production-quality application, such as security checks, * input validation and proper error handling, might not be present in * this sample code. */ package stream.parallel; import java.math.BigInteger; import java.util.Random; import java.util.stream.LongStream; /** * This demo shows how to use the parallel mode to find several number of * unknown length�prime number. The process easily use new Random.LongStream * generates a desired length stream. Following with filter operation. Here * input length is desirable long stream length instead of number of prime * number. * * @author tyan */ public class RandomPrimeNumber { /** * By default we only calculate at most 64 numbers once.. */ private final static long RANGE_SIZE = 1 << 6; /** * Try to get length from command line. Use the length to create random long * stream, that integer's digit is length. * * @param args This has to be a 1-element or 2-elements array, The first * element must be a positive number, which equals to length of generated * prime number stream. Second element is optional, it will be used as how * many prime number that will be generated if it's set. */ public static void main(String[] args) { if (args.length != 1 && args.length != 2) { usage(); return; } try { int length = Integer.parseInt(args[0]); if (length > 16) { System.out.println("Can calculate maximun only l6 digits " + "prime number"); return; } long numberOfPrime = RANGE_SIZE; if (args.length == 2) { numberOfPrime = Long.parseLong(args[1]); } long minNDigit = BigInteger.valueOf(10L).pow(length - 1).longValue(); long maxNDigit = BigInteger.valueOf(10L).pow(length).longValue(); new Random(System.currentTimeMillis()). longs(numberOfPrime, minNDigit, maxNDigit). filter(N -> isPrime(N)). forEach(System.out::println); } catch (NumberFormatException nfe) { usage(); } } /** * Decide if a BigInteger is a prime number * * @param integer a number * @return true if integer is a prime number false if integer is not a prime * number */ private static boolean isPrime(long number) { //This is a parall version that checks if a number is a prime number return !LongStream.range(2L, Math.round(Math.sqrt(number))).parallel(). anyMatch(divisor -> number % divisor == 0); } /** * Usage of this program */ public static void usage() { System.out.println("Usage: java RandomPrimeNumber lentgh[size]"); System.out.println("length is a positive integer not greater than 16"); System.out.println("size is a positive integer"); } }