[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๊ณผ์ œ 5. 2์˜ ํ™€์ˆ˜์ œ๊ณฑ์ˆ˜ - 1์€ ์†Œ์ˆ˜์ผ๊นŒ?

์†Œ์ˆ˜ ์ฐพ๊ธฐ ํ”„๋กœ๊ทธ๋žจ

๋ฐฉ๋ฒ•

  1. n-1๊นŒ์ง€ ๊ตฌํ•˜๊ธฐ O(n)

n-1 ๊นŒ์ง€ ์†Œ์ˆ˜๋ฅผ ๋ชจ๋‘ ๊ตฌํ•˜๋Š” ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์งœ๊ธฐ

  1. ์†Œ์ˆ˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ์†Œ์ˆ˜ ๋ฐฐ์—ด๋งŒ ๋Œ๋ฉด์„œ ๋‚˜๋ˆ„์–ด์ง€๋Š”์ง€ ํŒ๋‹จ O(n)

์†Œ์ˆ˜ ๋ฐฐ์—ด์„ ๋งŒ๋“œ๋Š” ๋ฐ์— O(n) => ๋ฉ”๋ฆฌํŠธ ์—†์Œ

  1. ๋ฃจํŠธ n๊นŒ์ง€ ๋Œ๋ฆฌ๋ฉด์„œ ์ง์ˆ˜ ์ œ์™ธํ•˜๊ธฐ O(sqrt(n))

์กฐ๊ฑด ์ถ”๊ฐ€

  1. ๋ช‡ ๊ฐœ์˜ ์†Œ์ˆ˜( 3, 5 )๋ฅผ ๊ฐ€์ง€๊ณ  ํ•ด๋‹น ์ˆ˜์˜ ๋ฐฐ์ˆ˜์ด๋ฉด ๋›ฐ์–ด๋„˜๊ธฐ

    3, 5 ๊ณ„์‚ฐ ์‹œ ๋‚˜๋ˆ„์–ด๋–จ์–ด์ง€์ง€ ์•Š์•˜์œผ๋ฉด ํ•ด๋‹น ์ˆ˜์˜ ๋ฐฐ์ˆ˜์—๋„ ๋‚˜๋ˆ„์–ด๋–จ์–ด์ง€์ง€ ์•Š์Œ

    ๊ตฌํ˜„ ์‹œ ์ฃผ์˜

    1. ํ•ด๋‹น ์ˆ˜๊ฐ€ 3์œผ๋กœ ๋‚˜๋ˆ„์–ด๋–จ์–ด์ง€๋Š”์ง€, 5๋กœ ๋‚˜๋ˆ„์–ด๋–จ์–ด์ง€๋Š”์ง€๋ฅผ ๊ณ„์‚ฐํ•˜๋ ค๋ฉด ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆผ

    ๋ณ€์ˆ˜ ํ•˜๋‚˜์”ฉ ์ง€์ •ํ•˜๊ณ  1์”ฉ ๋”ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌ์„ฑ

    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์˜ ๋ฐฐ์ˆ˜์ด๋‹ค. ์ด๋ฅผ ์ฆ๋ช…ํ•ด๋ณด์ž.

  1. ์ฒซ๋ฒˆ์งธ ๊ฒฝ์šฐ

2์˜ ์ฒซ๋ฒˆ์งธ ์ง์ˆ˜์ œ๊ณฑ์ˆ˜์ธ 2^2์—์„œ 1์„ ๋นผ๋ฉด 3์ด๋‹ค. ์ด๋Š” 3์˜ ๋ฐฐ์ˆ˜์ด๋‹ค.

  1. k๋ฒˆ์งธ ๊ฒฝ์šฐ

2์˜ k๋ฒˆ์งธ ์ง์ˆ˜์ œ๊ณฑ์ˆ˜์ธ 2^k-1 = 3a(a๋Š” ์ž์—ฐ์ˆ˜) ๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ,

  1. k+2๋ฒˆ์งธ ๊ฒฝ์šฐ

k+2๋ฒˆ์งธ ๊ฒฝ์šฐ๊ฐ€ ์„ฑ๋ฆฝํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.

2^(k+2)-1 
= 4*(2^k)-1 
= 4*(3a+1)-1
= 12a+4-1
= 12a+3 (3์˜ ๋ฐฐ์ˆ˜)

๋”ฐ๋ผ์„œ 2์˜ ์ œ๊ณฑ์ˆ˜ -1 ์˜ ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚œ ์ˆ˜๋Š” ํ™€์ˆ˜์ œ๊ณฑ์ˆ˜๋งŒ ์†Œ์ˆ˜์ธ์ง€ ํŒ๋‹จํ•˜๋ฉด ๋œ๋‹ค.

๋ฐ˜์‘ํ˜•