[Java] μ€νΈλ¦Όμ μ΄μ©ν μμ ꡬνκΈ°
μμ¦ μ΄νν°λΈ μλ° Third μλμ μ± μ λλ€ λμκ΄μμ λμ¬ν΄μ μ½κ³ μμ΅λλ€.
μ€νΈλ¦Ό λ³λ ¬νμ λν κΈμ μ½λ€κ° μμꡬνλ λ‘μ§μ μ€νΈλ¦ΌμΌλ‘ μμ±ν λΆλΆμ 보κ²λμμ΅λλ€.
μμꡬνκΈ° λ‘μ§μ μ΄μ§μ€λΉ ν λλ λ€μ λ€μ¬λ€λ³Όλ§νκ±°λΌ μ€λμ μ for-loop λ‘ κ΅¬νν΄λ³Έ κΈ°μ΅λ§ μλ€λ³΄λ μ μ νκ² λκ»΄μ‘λ€μ.
μμ§λ λ§μ λΈλ‘κ·Έλ€μμ for-loopλ₯Ό μ΄μ©ν λ°©λ²λ€λ§ λ§μ΄ μκ°νκ³ μκΈ°λ νκ³ ν΄μ ν¬μ€ν μ£Όμ λ‘ μΌμλ΄€μ΅λλ€.
κ°μΈμ μΈ κΈ°λ‘λ ν κ²Έ...
μ± μ μ½κ³ μλ‘ μκ²λ λΆλΆμ μ€νΈλ¦Όμ λν λΆλΆλ μμ§λ§ μ΄λ―Έ BigInteger ν΄λμ€μ isProbablePrime μ΄λ λ©μλκ° μμλ€λ κ²λλ€..
μλλ νΉμ μ«μ n κΉμ§ μμκ° λͺ κ°μΈμ§λ₯Ό μΆλ ₯νκ³ , κ·Έ λͺ©λ‘λ μΆλ ₯νλ κ²μ ν μ€νΈν μ½λμ λλ€.
public static void main(String[] args) {
int n = (int) Math.pow(10, 8);
// n κΉμ§μ μ μ€μ μμμ κ°μ μΆλ ₯νκΈ°
long cnt = LongStream.rangeClosed(2, n)
.parallel()
.mapToObj(BigInteger::valueOf)
.filter(i -> i.isProbablePrime(50))
.count();
System.out.println(cnt);
// n κΉμ§μ μ μ€μ μμ λͺ©λ‘ μΆλ ₯νκΈ°
System.out.println(LongStream.rangeClosed(2, n)
.mapToObj(BigInteger::valueOf)
.filter(i -> i.isProbablePrime(50))
.collect(Collectors.toList()));
}
LongStreamμ μ΄μ©νμ¬ μ«μμ λ²μλ₯Ό μ νκ³ mapToObj λ₯Ό μ΄μ©νμ¬ BigIntegerλ‘ λ³ννλ€ BigInteger.isProbablePrime(int certainty) λ©μλλ₯Ό νν°λ‘ μ λ¬νμ¬ μμλ₯Ό ꡬνκ³ μμ΅λλ€.
BigInteger.isProbablePrime(int certainty) λ©μλλ μμλ₯Ό ꡬνκΈ°μν΄ λ΄λΆμ μΌλ‘ λ°λ¬-λΌλΉ(Miller-Rabin) ν μ€νΈμ 루카μ€-λ λ¨Έ(Lucas-Lehmer) ν μ€νΈλ₯Ό μ¬μ©νκ³ μκ³ μ. μ¬κΈ°μ μ¬μ©λ λ°λ¬λΌλΉ ν μ€νΈλ DSA(Digital Signiture Algorithm) μ€ν (NIST FIPS 186-2)μ κΈ°λ°μΌλ‘ νλ€κ³ ν©λλ€. μ΄ μ€νμ νμΌλ‘ 첨λΆνλ κ΄μ¬μμΌμ λΆλ€μ λ€μ΄λ°μ 보μ λ λ κ² κ°λ€μ.
μ°Έκ³ λ‘ .parallel() μ μ€νΈλ¦Όμμ μ¬μ©ν λ λ§€μ° μ£Όμλ₯Ό μνλ κΈ°λ₯μ λλ€. μ± μμλ μ΄λ κ² μκΈ°ν©λλ€. Stream.iterate λ₯Ό λ°μ΄ν° μμ€λ‘ μ΄μ©νκ±°λ μ€κ° μ°μ°μΌλ‘ limit μ μ¬μ©νλ μ€νΈλ¦Ό νμ΄νλΌμΈμμλ parallelμ μ΄μ©ν μ±λ₯κ°μ μ κΈ°λν μ μμΌλ©° μ€νλ € μμ’μμ§ μλ μλ€κ³ λ§μ΄μ£ . μ€μ λ‘ μ΄μνκ²½μμ μ κ² λλ¬Έμ μ΄μκ° λ°μν μ λ μμμ΅λλ€. κ·Έλ₯ 무ν루νμ λΉ μ§κ²μ²λΌ μ°λ λ νλκ° λ¨Ήν΅μ΄ λμ΄λ²λ¦¬λκ΅°μ. μ€νΈλ¦Όμμ λ³λ ¬μ°μ°μ μ ν©ν μ μ reduce, min, max, count, sum λ±μ μ°μ°μ΄λ©°, collectμ²λΌ κ°λ³μΆμλ₯Ό μννλ λ©μλλ λ³λ ¬μ°μ°μ μ ν©νμ§ μλ€κ³ ν©λλ€. μ°Έκ³ νμκΈ° λ°λλλ€.