์์ ์ฐพ๊ธฐ ํ๋ก๊ทธ๋จ
๋ฐฉ๋ฒ
- n-1๊น์ง ๊ตฌํ๊ธฐ
O(n)
n-1 ๊น์ง ์์๋ฅผ ๋ชจ๋ ๊ตฌํ๋ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ์๊ณ ๋ฆฌ์ฆ ์ง๊ธฐ
- ์์ ๋ฐฐ์ด์ ๋ง๋ค์ด์ ์์ ๋ฐฐ์ด๋ง ๋๋ฉด์ ๋๋์ด์ง๋์ง ํ๋จ
O(n)
์์ ๋ฐฐ์ด์ ๋ง๋๋ ๋ฐ์ O(n) => ๋ฉ๋ฆฌํธ ์์
- ๋ฃจํธ n๊น์ง ๋๋ฆฌ๋ฉด์ ์ง์ ์ ์ธํ๊ธฐ
O(sqrt(n))
์กฐ๊ฑด ์ถ๊ฐ
-
๋ช ๊ฐ์ ์์( 3, 5 )๋ฅผ ๊ฐ์ง๊ณ ํด๋น ์์ ๋ฐฐ์์ด๋ฉด ๋ฐ์ด๋๊ธฐ
3, 5 ๊ณ์ฐ ์ ๋๋์ด๋จ์ด์ง์ง ์์์ผ๋ฉด ํด๋น ์์ ๋ฐฐ์์๋ ๋๋์ด๋จ์ด์ง์ง ์์
๊ตฌํ ์ ์ฃผ์
- ํด๋น ์๊ฐ 3์ผ๋ก ๋๋์ด๋จ์ด์ง๋์ง, 5๋ก ๋๋์ด๋จ์ด์ง๋์ง๋ฅผ ๊ณ์ฐํ๋ ค๋ฉด ๋ชจ๋๋ฌ ์ฐ์ฐ์ ์ฌ์ฉํด์ผํ๋๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆผ
๋ณ์ ํ๋์ฉ ์ง์ ํ๊ณ 1์ฉ ๋ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌ์ฑ
- 3๊ณผ 5์ ๊ณต๋ฐฐ์๊ฐ ๋์ค๋ฉด ๋จผ์ ๊ฑฐ์น๋ 3์ if๋ฌธ์์ continue ๋จ์ผ๋ก 5์ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผํ๋ค.
5๋ฅผ ๋ํ๋ด๋ ์์ธ five_num์ด 5๋ฅผ ๋์ด๊ฐ๋ฉด 1๋ก ์ด๊ธฐํ
์ฝ๋
/*
IS 2^61-1 PRIME NUMBER?
2.305843e+18
7์ด
2020-03-27
*/
#include <stdio.h>
#include <math.h>
#include <time.h>
int main() {
time_t start, end;
start = time(NULL);
long long n = (long long)(pow(2, 61))-1; // 2์ ๋ฐฐ์๋ ์๋
long long s_n = (long long)sqrt(n) + 1;
// ์์ ๊ตฌํ๊ธฐ
char result =0;
int three_num = 0;
int five_num = -1;
for (int i = 1; i <= (int)(s_n / 2); i++, three_num++, five_num++) { // (๋ฃจํธ n) / 2 ๊น์ง
if (three_num == 3) { // ๋๋๋ ์๊ฐ 3์ ๋ฐฐ์์ด๋ฉด
three_num = 1;
continue;
}
else if (five_num == 5) { // ๋๋๋ ์๊ฐ 5์ ๋ฐฐ์์ด๋ฉด
five_num = 1;
continue;
}
if (n % (2 * i + 1) == 0) { // 3 ~ (ํ์๋ง)
// ์์๊ฐ ์๋
result = 1;
break;
}
}
// ๊ฒฐ๊ณผ ์ถ๋ ฅ
if (result)
printf("์์์
๋๋ค.\n");
else
printf("์์๊ฐ ์๋๋๋ค.\n");
end = time(NULL);
printf("- ๋์์๊ฐ: %lfms\n", (double)(end - start) * 1000);
}
์ต์ข ๊ตฌํ์๊ฐ : 7์ด
์ปดํจํฐ ์ฌ์
์ปดํจํฐ CPU : Intel(R) Core(TM) i7-7500U CPU @ 2.70Ghz
๋ฉ๋ชจ๋ฆฌ : 8GB
+
2์ ์ง์์ ๊ณฑ์ -1 ์ ์ ์์๊ฐ ์๋๊น?
2์ ์ง์์ ๊ณฑ์ -1 ์ 3์ ๋ฐฐ์์ด๋ค. ์ด๋ฅผ ์ฆ๋ช ํด๋ณด์.
- ์ฒซ๋ฒ์งธ ๊ฒฝ์ฐ
2์ ์ฒซ๋ฒ์งธ ์ง์์ ๊ณฑ์์ธ 2^2์์ 1์ ๋นผ๋ฉด 3์ด๋ค. ์ด๋ 3์ ๋ฐฐ์์ด๋ค.
- k๋ฒ์งธ ๊ฒฝ์ฐ
2์ k๋ฒ์งธ ์ง์์ ๊ณฑ์์ธ 2^k-1 = 3a(a๋ ์์ฐ์)
๋ผ๊ณ ๊ฐ์ ํ์ ๋,
- k+2๋ฒ์งธ ๊ฒฝ์ฐ
k+2๋ฒ์งธ ๊ฒฝ์ฐ๊ฐ ์ฑ๋ฆฝํ๋์ง ํ์ธํด๋ณด์.
2^(k+2)-1
= 4*(2^k)-1
= 4*(3a+1)-1
= 12a+4-1
= 12a+3 (3์ ๋ฐฐ์)
๋ฐ๋ผ์ 2์ ์ ๊ณฑ์ -1
์ ํํ๋ก ๋ํ๋ ์๋ ํ์์ ๊ณฑ์๋ง ์์์ธ์ง ํ๋จํ๋ฉด ๋๋ค.
Comment