**밀러-라빈 소수판별법**(Miller-Rabin primality test)은 입력으로 주어진 수가 소수인지 아닌지 판별하는 알고리즘이다. **라빈-밀러 소수판별법**(Rabin-Miller primality test)이라고도 한다. 개리 L. 밀러의 원래 알고리즘은 일반 리만 가설에 기반한 결정론적 알고리즘이었는데, 미하엘 라빈이 확률적 알고리즘으로 변경했다.

이론적 배경
------

페르마 판별법이나 솔로바이-스트라센 소수판별법과 마찬가지로, 밀러-라빈 소수판별법은 소수가 가지는 특별한 성질을 이용한다. n이 홀수인 소수라고 할 때, n-1은 {\displaystyle 2^{s}d} 라고 할 수 있다.
이때, s는 정수이고 d는 홀수이다. 이것은 n-1을 계속해서 2로 나눈 형태이다. 이제 어떤 {\displaystyle a\in \left(\mathbb {Z} /n\mathbb {Z} \right)^{\*}}에 대해, 다음 식 중 한 가지가 성립한다.

* {\displaystyle a^{d}\equiv 1{\pmod {n}}\,}
* {\displaystyle a^{2^{r}\cdot d}\equiv -1{\pmod {n}}{\mbox{ for some 0 }}\leq r\leq s-1}

위 두 가지 식 중에서 한 가지가 성립한다는 것은 다음과 같은 페르마 소정리에서 유도할 수 있다

{\displaystyle a^{n-1}\equiv 1{\pmod {n}}\,}
즉 {\displaystyle a^{n-1}}의 제곱근을 계속 구해나가면, 1 이거나 -1을 얻게 된다. 만약 -1이 나오면 두 번째 식이 성립하는 것이고, 더 이상 검사하지 않아도 된다.

제곱근을 계속 구해나가도 두 번째 식이 성립하지 않으면, 마찬가지로 1이나 -1의 값을 가질 첫 번째 식을 검사해야 한다. 그런데, 두 번째 식이 성립하지 않는다면, r=0일 때 성립할 수 없고 결과적으로 다음 식이 성립한다.

{\displaystyle a^{2^{0}\cdot d}=a^{d}\not \equiv -1{\pmod {n}}}
그러므로 두 번째 경우가 성립하지 않으면, 첫 번째는 반드시 성립한다.

밀러-라빈 소수판별법은 위와 같은 관계를 이용한다. n이 소수인지 아닌지 검사하려고 할 때, 다음 두 식이 성립하면 a는 n이 합성수라는 것에 대한 **강한 증거**(strong witness)가 된다.

* {\displaystyle a^{d}\not \equiv 1{\pmod {n}}}
* {\displaystyle a^{2^{r}d}\not \equiv -1{\pmod {n}}{\mbox{ for all }}0\leq r\leq s-1}

만약 위 식이 성립하지 않으면 a는 **강한 거짓증거**(strong liar)라 하고, n은 **아마 소수일 것 같다**(probable prime)고 한다.

알고리즘 및 시간복잡도
------------

알고리즘은 다음과 같다.

**입력**: n: 소수인지 검사할 숫자 , k: 소수판별법을 몇회 실행할지 결정하는 인자.
**출력**: n이 합성수이면 합성수이다, 아니면 아마 소수일 것 같다는 것을 반환한다.
n-1을 {\displaystyle 2^{s}d} 형태로 바꾼다.
다음을 *k* 번 반복한다.
{\displaystyle [1,n-1]}에서 임의의 a를 선택한다.
{\displaystyle [0,s-1]}의 모든 r에 대해 {\displaystyle a^{d}\,{\bmod {\,}}n\neq 1}이고 {\displaystyle a^{2^{r}d}\,{\bmod {\,}}n\neq n-1}이면 합성수이다.
위 조건을 만족하지 않으면 소수일 것 같다.
제곱을 반복하는 방법으로 모듈로 지수승을 계산하면 이 알고리즘의 시간복잡도는 {\displaystyle {\color {Blue}O}(k\,\log ^{3}n)}이다.(k는 a의 개수이다.) 이때 FFT를 이용하여 곱셈의 횟수를 줄이면 시간복잡도를 {\displaystyle {\color {Blue}{\tilde {O}}}(k\,\log ^{2}n)}로 줄일 수 있다.

작은 수에 대한 판별
-----------

판별할 수 n의 크기가 작을 경우, 작은 수의 a에 대해서만 검사해보면 결정론적으로 소수를 판별할 수 있다는 것이 알려져 있다. Pomerance, Selfridge, Wagstaff, 그리고 Jaeschke에 의하면

* {\displaystyle n<1,373,653}일 경우 {\displaystyle a=2,3}에 대해서만 검사해보면 충분하다
* {\displaystyle n<9,080,191}일 경우 {\displaystyle a=31,73}에 대해서만 검사해보면 충분하다
* {\displaystyle n<4,759,123,141}일 경우 {\displaystyle a=2,7,61}에 대해서만 검사해보면 충분하다
* {\displaystyle n<2,152,302,898,747}일 경우 {\displaystyle a=2,3,5,7,11}에 대해서만 검사해보면 충분하다
* {\displaystyle n<3,474,749,660,383}일 경우 {\displaystyle a=2,3,5,7,11,13}에 대해서만 검사해보면 충분하다
* {\displaystyle n<341,550,071,728,321}일 경우 {\displaystyle a=2,3,5,7,11,13,17}에 대해서만 검사해보면 충분하다

참고
--

다른 확률적 소수판별 알고리즘과 마찬가지로, n이 소수가 아닌데도 알고리즘 실행결과 언제나 거짓증거가 나와서 n이 소수라고 잘못 판별할 수 있다. 이런 n을 강한 의사소수라고 한다.

소수판별에 필요한 검사를 여러 번 하면 할수록 정확도는 높아진다. 모든 홀수 소수 n에 대하여 a의 최소한 3/4은 n이 합성수라는 것에 대한 강한 증거가 된다.
밀러-라빈 소수판별법의 강력한 거짓증거 집합은 솔로바이-스트라센 소수판별법의 강력한 거짓증거 집합의 부분집합이다. 그러므로, 밀러-라빈 소수판별법이 솔로바이-스트라센 소수판별법보다 더 강력한 소수판별법이다.
n이 합성수일 때, 밀러-라빈 소수판별법에서 n이 아마도 소수일 것이라고 판별할 확률은 최대 {\displaystyle 4^{-k}}이다. 반면에, 솔로바이-스트라센 소수판별법에서 합성수 n이 아마도 소수일 것이라고 판별할 확률은 최대 {\displaystyle 2^{-\!k}}이다.

평균적으로 어떤 합성수가 아마도 소수일 것이라고 판별될 확률은 {\displaystyle 4^{-\!k}}보다 현저히 낮다. 확률의 한계값을 Damgard, Landrock , Pomerance등이 명확하게 계산한 결과가 있는데, 이것은 소수를 생성하는데만 사용할 수 있고 소수를 판별하는데는 사용할 수 없다. 암호학에서 공격자가 소수 대신 의사소수를 사용하여 암호시스템을 공격하려 할 수도 있다. 이런 공격에 안전하려면 의사난수인지 더 엄밀하게 검사해야 하므로, {\displaystyle 4^{-\!k}}이라는 확률을 사용하는 것이 안전하다.

일반화 리만 가설이 맞다면, {\displaystyle 2\,\log ^{2}n}개의 a로 검사했을 때 '아마 소수일 것'이라고 판별되었으면 이 수는 실제로 소수이다. 이때, 이 알고리즘은 {\displaystyle {\tilde {O}}(\log ^{4}n)}의 시간복잡도를 가지는 '결정론적' 소수판별법이 된다.

참고 문헌
-----

* 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.