Skip to content

Instantly share code, notes, and snippets.

@akaneko3
Last active August 29, 2015 14:18
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save akaneko3/76bfd2727a6b49c9b577 to your computer and use it in GitHub Desktop.
Stream API を用いた並列化された素数検出プログラム
import java.util.stream.IntStream;
/**
* <p>素数の検出と処理時間の測定</p>
* @author yucchi
* @author redcat
*/
public class PrimeNumber {
/**
* <p>探索の上限</p>
*/
private static int UP_NUMBER = 32_000_000;
public static void main(String... args) {
// 開始時間
long startTime = System.nanoTime();
// フィルタリング
IntStream primeStream = IntStream.rangeClosed(1, UP_NUMBER)
.parallel()
.filter(n -> ((n & 0b1) != 0 || n == 0b10) && n > 0b1)
.filter(PrimeNumber::isPrime);
System.out.println(primeStream.count() + " 個の素数を検出しました。");
// 処理時間の表示
long time = System.nanoTime() - startTime;
System.out.println(nanoTimeToString(time));
}
/**
* <p>素数かどうか判定する</p>
* @param number 整数
* @return number が素数なら true, 素数でないなら false
*/
private static boolean isPrime(int number) {
return IntStream.rangeClosed(2, (int) Math.sqrt(number))
.allMatch(n -> (number % n) != 0);
}
/**
* <p>ナノ秒単位の時間を時・分・秒・ミリ秒形式に変換する</p>
* @param ns ナノ秒単位の時間
* @return ns を時・分・秒・ミリ秒形式に変換した文字列
*/
private static String nanoTimeToString(long ns) {
int hour = (int) ((ns * 1e-9) / 3600);
int minite = (int) ((ns * 1e-9) / 60) % 60;
int second = (int) (ns * 1e-9) % 60;
String ms = Double.toString((ns * 1e-9) % 1)
.substring(2, 5);
return hour + " 時間 " + minite + " 分 " + second + " 秒 " + ms;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment