본문 바로가기

Study

소수 판별법(밀러-라빈 소수판별법)

알고리즘 설명

연습 문제 : https://www.acmicpc.net/problem/5615

 

5615번: 아파트 임대

첫째 줄에 아파트의 면적의 수 N이 주어진다. 다음 줄부터 N개 줄에 카탈로그에 적혀있는 순서대로 면적이 주어진다. N은 100,000이하이고 면적은 231-1이하인 양의 정수이다.

www.acmicpc.net

 

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h>
#define NMAX 7
#define lint unsigned long long int
 
int N, cnt;
lint K;
 
int prime[NMAX] = {2357111317};
 
lint pow(lint x, lint k, lint p) {
    if(k == 0return 1;
    else if(k == 1return x;
    else {
        if(k%2 == 0return pow((x*x)%p, k/2, p);
        else return (pow((x*x)%p, k/2, p)*x)%p;
    }
}
 
// 소수인지 판단
bool isPrime(lint p) {
    lint a, s, r;
 
    for(int i=0;i<NMAX;i++) {
        if(p%prime[i] == 0return 1;
 
        a = prime[i];
        s = p-1// s = d*2^k
 
        while(1) {
            r = pow(a, s, p)%p;
 
            // a^s % p = -1
            if(r == p-1break;
            else {
                if(s%2 == 0) s /= 2;
                else {
                    // a^d % p = 1 or -1 >> 소수
                    if(r == 1 or r == p-1break;
                    else return 0;
                }
            }
        }
    }
 
    return 1;
}
 
int main() {
    scanf("%d"&N);
    while(N--) {
        scanf("%lld"&K);
        K = K*2+1;
 
        if( K==2 or (K%2==1 and isPrime(K)) ) cnt++;
    }
 
    printf("%d", cnt);
 
}
cs

참고 자료

위키피디아 : https://ko.wikipedia.org/wiki/밀러-라빈_소수판별법

 

밀러-라빈 소수판별법 - 위키백과, 우리 모두의 백과사전

밀러-라빈 소수판별법(Miller-Rabin primality test)은 입력으로 주어진 수가 소수인지 아닌지 판별하는 알고리즘이다. 라빈-밀러 소수판별법(Rabin-Miller primality test)이라고도 한다. 개리 L. 밀러의 원래

ko.wikipedia.org

블로그 : https://freshrimpsushi.github.io/posts/miller-rabin-test/

 

밀러-라빈 판정법

Miller rabin test

freshrimpsushi.github.io

 

'Study' 카테고리의 다른 글

모듈로 곱셈 역원_팩토리얼 계산( BOJ 13977 )  (0) 2022.07.11
정렬 시간 비교  (0) 2022.04.09
순열 알고리즘  (0) 2021.10.01
Manacher's Algorithm  (0) 2021.05.27
Fenwick Tree( BIT )  (0) 2021.03.16