์š”์ฆ˜ ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” 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)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ–ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ŠคํŽ™์€ ํŒŒ์ผ๋กœ ์ฒจ๋ถ€ํ•˜๋‹ˆ ๊ด€์‹ฌ์žˆ์œผ์‹  ๋ถ„๋“ค์€ ๋‹ค์šด๋ฐ›์•„ ๋ณด์…”๋„ ๋  ๊ฒƒ ๊ฐ™๋„ค์š”. 

 

fips186-2.pdf
0.35MB

 

์ฐธ๊ณ ๋กœ .parallel() ์€ ์ŠคํŠธ๋ฆผ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ ๋งค์šฐ ์ฃผ์˜๋ฅผ ์š”ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ฑ…์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ์–˜๊ธฐํ•ฉ๋‹ˆ๋‹ค. Stream.iterate ๋ฅผ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ ์ด์šฉํ•˜๊ฑฐ๋‚˜ ์ค‘๊ฐ„ ์—ฐ์‚ฐ์œผ๋กœ limit ์„ ์‚ฌ์šฉํ•˜๋Š” ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ๋Š” parallel์„ ์ด์šฉํ•œ ์„ฑ๋Šฅ๊ฐœ์„ ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์˜คํžˆ๋ ค ์•ˆ์ข‹์•„์งˆ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ๋ง์ด์ฃ . ์‹ค์ œ๋กœ ์šด์˜ํ™˜๊ฒฝ์—์„œ ์ €๊ฒƒ ๋•Œ๋ฌธ์— ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•œ ์ ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋ฌดํ•œ๋ฃจํ”„์— ๋น ์ง„๊ฒƒ์ฒ˜๋Ÿผ ์“ฐ๋ ˆ๋“œ ํ•˜๋‚˜๊ฐ€ ๋จนํ†ต์ด ๋˜์–ด๋ฒ„๋ฆฌ๋”๊ตฐ์š”. ์ŠคํŠธ๋ฆผ์—์„œ ๋ณ‘๋ ฌ์—ฐ์‚ฐ์— ์ ํ•ฉํ•œ ์ ์€ reduce, min, max, count, sum ๋“ฑ์˜ ์—ฐ์‚ฐ์ด๋ฉฐ, collect์ฒ˜๋Ÿผ ๊ฐ€๋ณ€์ถ•์†Œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋Š” ๋ณ‘๋ ฌ์—ฐ์‚ฐ์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.