logo

ミラー-ラビン素数判定法 📂整数論

ミラー-ラビン素数判定法

定理 1

奇数 n,qn,qn1=2kqn-1 = 2^{k} q のように表しよう。 anaq≢1(modn) a \nmid n \\ a^{q} \not\equiv 1 \pmod{n} そして全ての i=0,1,,(k1)i = 0, 1, \cdots , (k-1) に対して、 a2iq≢1(modn) a^{2^{i} q} \not\equiv -1 \pmod{n} a a が存在して上記を満たすなら、nn は合成数である。

説明

計算量が増えるだけ、フェルマーの小定理を通過する合成数も排除する可能性がある。

例えばカーマイケル数である 561561 は、n1=560=2435n-1 = 560 = 2^4 \cdot 35235263(mod561)2^{35} \equiv 263 \pmod{561} であるので、561561 が素数でないことを早く確認できる。この時、判断に使用された a=2a=2 のような数をミラー・ラビン証人miller-Rabin Witnessという。もちろん、全ての aa がテストを通過してもnn が素数だとは限らない。

証明

奇数の素数 ppp1=2kqp-1 = 2^{k} q のように置こう。フェルマーの小定理により、 ap1a2kq1(modp) a^{p-1} \equiv a^{2^{k} q} \equiv 1 \pmod{p}

a2k1q1(modp)a^{2^{k-1} q} \equiv -1 \pmod{p} でなければ、a2k2q1(modp)a^{2^{k-2} q} \equiv -1 \pmod{p} の可能性がある。

a2k2q1(modp)a^{2^{k-2} q} \equiv -1 \pmod{p} でもなければ、a2k3q1(modp)a^{2^{k-3} q} \equiv -1 \pmod{p} の可能性がある。

同様に、aq,a2q,,a2k2q,a2k1qa^{q} , a^{2q} , \cdots , a^{2^{k-2} q} , a^{2^{k-1} q} の少なくとも一つが (modp)\pmod{p}(1)(-1) と合同であるか、初めから aq1(modp) a^{ q} \equiv 1 \pmod{p} よって、n=2kq+1n = 2^{k} q +1 素数なら、aq1(modn)a^{q} \equiv 1 \pmod{n} か少なくとも一つの 0i(k1)0 \le i \le (k-1) に対して a2iq1(modn) a^{2^{i} q} \equiv -1 \pmod{n} 最後に、対偶法により証明が終わる。

コード

以下は、Rで実装されたミラー・ラビンテストで、計算のために連続二乗法ユークリッドの互除法が使用されている。

FPM<-function(base,power,mod) #It is equal to (base^power)%%mod
{
  i<-0
  if (power<0) {
    while((base*i)%%mod != 1) {i=i+1}
    base<-i
    power<-(-power)}
  
  if (power==0) {return(1)}
  if (power==1) {return(base%%mod)}
  
  n<-0
  while(power>=2^n) {n=n+1}
  
  A<-rep(1,n)
  A[1]=base
  
  for(i in 1:(n-1)) {A[i+1]=(A[i]^2)%%mod}
  
  for(i in n:1) {
    if(power>=2^(i-1)) {power=power-2^(i-1)}
    else {A[i]=1} }
  
  for(i in 2:n) {A[1]=(A[1]*A[i])%%mod}
  
  return(A[1])
}
 
gcd <- function(a, b) {
  if (b>a) {i=b; b=a; a=i;}
  while(b) {
    temp = b
    b = a %% b
    a = temp
  }
  return(a)
}
 
MR.test<-function(n)
{
  q=n-1
  k=0
  while(!q%%2) {q=q/2; k=k+1+6}
  
  for(i in 2:(n-1))
  {
    if (gcd(i,n)!=1) {return(paste(i,"is a Miller-Rabin witness!"))}
    A=FPM(i,q,n)
    a=A
    for(j in 0:(k-1))
    {
      if( a==(n-1) )
      {
        j=0
        break
      }
      a=(a^2)%%n
    }
    if (j==(n-1) & A != 1) {return(paste(i,"is a Miller-Rabin witness!"))}
  }
  paste(n,"passes the Miller-Rabin test!")
}
 
MR.test(17)
MR.test(121)
MR.test(341)    #Almost composite yields fermat witness 2, but 341=11*31 doesn't.
MR.test(561)    #Carmicheal number 56 = 3*11*17
MR.test(1031)    #1031 is a prime
MR.test(1105)    #Carmicheal number 1105 = 5*13*17
MR.test(1729)    #Carmicheal number 1729 = 7*13*19
MR.test(41041)    #Carmicheal number 41041 = 7*11*13*41

以下はコードを実行した結果だ。

20190304\_112954.png フェルマーテストと異なり、ミラー・ラビンテストは 56156111051105172917294104141041 といったカーマイケル数も捕まえることができる。


  1. Silverman. (2012). A Friendly Introduction to Number Theory (4th Edition): p137. ↩︎