밀러-라빈 소수판별법

밀러-라빈 소수판별법(Miller-Rabin primality test)은 입력으로 주어진 수가 소수인지 아닌지 판별하는 알고리즘이다. 라빈-밀러 소수판별법(Rabin-Miller primality test)이라고도 한다. 개리 L. 밀러의 원래 알고리즘은 일반 리만 가설에 기반한 결정론적 알고리즘이었는데, 미하엘 라빈이 확률적 알고리즘으로 변경했다. 페르마 판별법이나 솔로바이-스트라센 소수판별법과 마찬가지로, 밀러-라빈 소수판별법은 소수가 가지는 특별한 성질을 이용한다. n {\displaystyle n} 이 홀수인 소수라고 할 때, n − 1 {\displaystyle n-1} 은 2 s d {\displaystyle 2^{s}d} 라고 할 수 있다. 이때, s {\displaystyle s} 는 정수이고 d {\displaystyle d} 는 홀수이다. 이것은 n − 1 {\displaystyle n-1} 을 계속해서 2로 나눈 형태이다. 이제 어떤 a ∈ ( Z / n Z ) ∗ {\displaystyle a\in \left(\mathbb {Z} /n\mathbb {Z} \right)^{*}} 에 대해, 다음 식 중 한 가지가 성립한다. a d ≡ 1 ( mod n ) {\displaystyle a^{d}\equiv 1{\pmod {n}}\,} a 2 r ⋅ d ≡ − 1 ( mod n )  for some 0  ≤ r ≤ s − 1 {\displaystyle a^{2^{r}\cdot d}\equiv -1{\pmod {n}}{\mbox{ for some 0 }}\leq r\leq s-1} 위 두 가지 식 중에서 한 가지가 성립한다는 것은 다음과 같은 페르마 소정리에서 유도할 수 있다 a n − 1 ≡ 1 ( mod n ) {\displaystyle a^{n-1}\equiv 1{\pmod {n}}\,} 즉 a n − 1 {\displaystyle a^{n-1}} 의 제곱근을 계속 구해나가면, 1 이거나 -1을 얻게 된다. 만약 -1이 나오면 두 번째 식이 성립하는 것이고, 더 이상 검사하지 않아도 된다. 제곱근을 계속 구해나가도 두 번째 식이 성립하지 않으면, 마찬가지로 1이나 -1의 값을 가질 첫 번째 식을 검사해야 한다. 그런데, 두 번째 식이 성립하지 않는다면, r = 0 {\displaystyle r=0} 일 때 성립할 수 없고 결과적으로 다음 식이 성립한다. a 2 0 ⋅ d = a d ≢ − 1 ( mod n ) {\displaystyle a^{2^{0}\cdot d}=a^{d}\not \equiv -1{\pmod {n}}} 그러므로 두 번째 경우가 성립하지 않으면, 첫 번째는 반드시 성립한다. 밀러-라빈 소수판별법은 위와 같은 관계를 이용한다. n {\displaystyle n} 이 소수인지 아닌지 검사하려고 할 때, 다음 두 식이 성립하면 a {\displaystyle a} 는 n {\displaystyle n} 이 합성수라는 것에 대한 강한 증거(strong witness)가 된다. a d ≢ 1 ( mod n ) {\displaystyle a^{d}\not \equiv 1{\pmod {n}}} a 2 r d ≢ − 1 ( mod n )  for all  0 ≤ r ≤ s − 1 {\displaystyle a^{2^{r}d}\not \equiv -1{\pmod {n}}{\mbox{ for all }}0\leq r\leq s-1} 만약 위 식이 성립하지 않으면 a {\displaystyle a} 는 강한 거짓증거(strong liar)라 하고, n {\displaystyle n} 은 아마 소수일 것 같다(probable prime)고 한다. 알고리즘은 다음과 같다. 입력: n {\displaystyle n} : 소수인지 검사할 숫자 , k {\displaystyle k} : 소수판별법을 몇회 실행할지 결정하는 인자. 출력: n {\displaystyle n} 이 합성수이면 합성수이다, 아니면 아마 소수일 것 같다는 것을 반환한다. n − 1 {\displaystyle n-1} 을 2 s d {\displaystyle 2^{s}d} 형태로 바꾼다. 다음을 k 번 반복한다. [ 1 , n − 1 ] {\displaystyle [1,n-1]} 에서 임의의 a {\displaystyle a} 를 선택한다. [ 0 , s − 1 ] {\displaystyle [0,s-1]} 의 모든 r {\displaystyle r} 에 대해 a d mod n ≠ 1 {\displaystyle a^{d}\,{\bmod {\,}}n\neq 1} 이고 a 2 r d mod n ≠ n − 1 {\displaystyle a^{2^{r}d}\,{\bmod {\,}}n\neq n-1} 이면 합성수이다. 위 조건을 만족하지 않으면 소수일 것 같다. 제곱을 반복하는 방법으로 모듈로 지수승을 계산하면 이 알고리즘의 시간복잡도는 O ( k log 3 ⁡ n ) {\displaystyle {\color {Blue}O}(k\,\log ^{3}n)} 이다.( k {\displaystyle k} 는 a {\displaystyle a} 의 개수이다.) 이때 FFT를 이용하여 곱셈의 횟수를 줄이면 시간복잡도를 O ~ ( k log 2 ⁡ n ) {\displaystyle {\color {Blue}{\tilde {O}}}(k\,\log ^{2}n)} 로 줄일 수 있다. 판별할 수 n {\displaystyle n} 의 크기가 작을 경우, 작은 수의 a {\displaystyle a} 에 대해서만 검사해보면 결정론적으로 소수를 판별할 수 있다는 것이 알려져 있다. Pomerance, Selfridge, Wagstaff, 그리고 Jaeschke에 의하면 n < 1 , 373 , 653 {\displaystyle n<1,373,653} 일 경우 a = 2 , 3 {\displaystyle a=2,3} 에 대해서만 검사해보면 충분하다 n < 9 , 080 , 191 {\displaystyle n<9,080,191} 일 경우 a = 31 , 73 {\displaystyle a=31,73} 에 대해서만 검사해보면 충분하다 n < 4 , 759 , 123 , 141 {\displaystyle n<4,759,123,141} 일 경우 a = 2 , 7 , 61 {\displaystyle a=2,7,61} 에 대해서만 검사해보면 충분하다 n < 2 , 152 , 302 , 898 , 747 {\displaystyle n<2,152,302,898,747} 일 경우 a = 2 , 3 , 5 , 7 , 11 {\displaystyle a=2,3,5,7,11} 에 대해서만 검사해보면 충분하다 n < 3 , 474 , 749 , 660 , 383 {\displaystyle n<3,474,749,660,383} 일 경우 a = 2 , 3 , 5 , 7 , 11 , 13 {\displaystyle a=2,3,5,7,11,13} 에 대해서만 검사해보면 충분하다 n < 341 , 550 , 071 , 728 , 321 {\displaystyle n<341,550,071,728,321} 일 경우 a = 2 , 3 , 5 , 7 , 11 , 13 , 17 {\displaystyle a=2,3,5,7,11,13,17} 에 대해서만 검사해보면 충분하다 다른 확률적 소수판별 알고리즘과 마찬가지로, n {\displaystyle n} 이 소수가 아닌데도 알고리즘 실행결과 언제나 거짓증거가 나와서 n {\displaystyle n} 이 소수라고 잘못 판별할 수 있다. 이런 n {\displaystyle n} 을 강한 의사소수라고 한다. 소수판별에 필요한 검사를 여러 번 하면 할수록 정확도는 높아진다. 모든 홀수 소수 n {\displaystyle n} 에 대하여 a {\displaystyle a} 의 최소한 3/4은 n {\displaystyle n} 이 합성수라는 것에 대한 강한 증거가 된다. 밀러-라빈 소수판별법의 강력한 거짓증거 집합은 솔로바이-스트라센 소수판별법의 강력한 거짓증거 집합의 부분집합이다. 그러므로, 밀러-라빈 소수판별법이 솔로바이-스트라센 소수판별법보다 더 강력한 소수판별법이다. n {\displaystyle n} 이 합성수일 때, 밀러-라빈 소수판별법에서 n {\displaystyle n} 이 아마도 소수일 것이라고 판별할 확률은 최대 4 − k {\displaystyle 4^{-k}} 이다. 반면에, 솔로바이-스트라센 소수판별법에서 합성수 n {\displaystyle n} 이 아마도 소수일 것이라고 판별할 확률은 최대 2 − k {\displaystyle 2^{-\!k}} 이다. 평균적으로 어떤 합성수가 아마도 소수일 것이라고 판별될 확률은 4 − k {\displaystyle 4^{-\!k}} 보다 현저히 낮다. 확률의 한계값을 Damgard, Landrock , Pomerance등이 명확하게 계산한 결과가 있는데, 이것은 소수를 생성하는데만 사용할 수 있고 소수를 판별하는데는 사용할 수 없다. 암호학에서 공격자가 소수 대신 의사소수를 사용하여 암호시스템을 공격하려 할 수도 있다. 이런 공격에 안전하려면 의사난수인지 더 엄밀하게 검사해야 하므로, 4 − k {\displaystyle 4^{-\!k}} 이라는 확률을 사용하는 것이 안전하다. 일반화 리만 가설이 맞다면, 2 log 2 ⁡ n {\displaystyle 2\,\log ^{2}n} 개의 a {\displaystyle a} 로 검사했을 때 '아마 소수일 것'이라고 판별되었으면 이 수는 실제로 소수이다. 이때, 이 알고리즘은 O ~ ( log 4 ⁡ n ) {\displaystyle {\tilde {O}}(\log ^{4}n)} 의 시간복잡도를 가지는 '결정론적' 소수판별법이 된다. Pomerance, C.; Selfridge, J. L. & Wagstaff, S. S., Jr. (1980), “The pseudoprimes to 25·109”, 《Mathematics of Computation》 35 (151): 1003–1026, doi:10.2307/2006210  Jaeschke, Gerhard (1993), “On strong pseudoprimes to several bases”, 《Mathematics of Computation》 61 (204): 915–926, doi:10.2307/2153262  I. Damgard, P. Landrock and C. Pomerance (1993), Average case error estimates for the strong probable prime test, Math. Comp. 61(203) p.177–194. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms, Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. Pages 890–896 of section 31.8, Primality testing. Online demo of Miller-Rabin MathWorld - Rabin-Miller Strong Pseudoprime Test