基本介紹
- 中文名:米勒-拉賓素性檢驗
- 外文名:Miller-Rabin prime test
- 定義:素數判定法則
- 相關術語:隨機化算法
- 學科:密碼學
- 領域:密碼學
概念,例子,算法複雜度,
概念
![](/img/7/f2e/43ac3935aca963a6ddf5a592c09a.jpg)
![](/img/5/a42/34cb46dddb5488a7fce426597103.jpg)
現在假設n是一個奇素數,且 n>2。於是n-1是一個偶數,可以被表示為
的形式,s和d都是正整數且d是奇數。對任意在
範圍內的a 和
,必滿足以下兩種形式的一種:
![](/img/4/6e1/942fa72258c26481f83f147e43ce.jpg)
![](/img/7/af1/2b2500069fbc07b892939b52f5b9.jpg)
![](/img/e/a4a/bcbbd32cfcd7714aa3cc3f7f0da7.jpg)
![](/img/4/c70/3f68bdf626f0fb2982da80872021.jpg)
![](/img/b/6cd/66abcf9e28569744d457edd8048d.jpg)
![](/img/d/7c9/a1dd016d23bb68656947fa83a47d.jpg)
![](/img/a/2c5/02f083b67ec0ac3bfcbf544f2f25.jpg)
米勒-拉賓素性測試就是基於上述原理的逆否,也就是說,如果如果我們能找到這樣一個a,使得對任意
以下兩個式子均滿足:
![](/img/7/ca1/54e09ba1cb3a8e923e3a7b93b300.jpg)
![](/img/e/534/fe7539abe73f7f20ce590f9ebcb6.jpg)
![](/img/0/42f/59718249794f31713ebdbd5bd8f5.jpg)
每個奇合數n都有很多個對應的憑證a,但是要生成這些a並不容易。當前解決的辦法是使用機率性的測試。我們從集合
中隨機選擇非零數a,然後檢測當前的a是否是n為合數的一個憑證。如果n本身確實是一個合數,那么大部分被選擇的a都應該是n的憑證,也即通過這個測試能檢測出n是合數的可能性很大。然而,仍有極小機率的情況下我們找到的a是一個“強偽證”(反而表明了n可能是一個素數)。通過多次獨立測試不同的a,我們能減少這種出錯的機率。
![](/img/7/94c/35667191b50a04cd90effc7cd3eb.jpg)
對於測試一個大數是否是素數,常見的做法隨機選取基數a,畢竟我們並不知道憑證和偽證在 [1,n-1]這個區間如何分布。典型的例子是 Arnault 曾經給出了一個397位的合數n,但是所有小於307的基數a都是n是素數的“強偽證”。不出所料,這個大合數通過了 Maple 程式的isprime()函式(被判定為素數)。這個函式通過檢測 a=2,3,5,7,11這幾種情況來進行素性檢驗。
例子
假設我們需要檢驗n=221是否是一個素數。首先
,於是我們得到了 s=2和d=55。我們隨機從[1,n-1]中選取a,假設a=174,於是有:
![](/img/8/c70/580b7da53de535d21b153079ac4b.jpg)
![](/img/3/b3c/2f2e1620090e4b321faa60ef950b.jpg)
![](/img/7/269/a74c67f4eaa4c629316299fda022.jpg)
![](/img/c/01e/8d0a2f4ff7c5e49f9c397bc54120.jpg)
![](/img/9/bf9/602a88c714857dae8c996776145f.jpg)
算法複雜度
這一算法可以被表示成如下偽代碼:
Input #1: n > 3, an odd integer to be tested for primality;
Input #2: k, a parameter that determines the accuracy of the test
Output: composite if n is composite, otherwise probably prime
write n − 1 as 2r·d with d odd by factoring powers of 2 from n − 1
WitnessLoop: repeat k times:
pick a random integer a in the range [2, n − 2]
x ← ad mod n
if x = 1 or x = n − 1
then
continue WitnessLoop
repeat r − 1 times:
x ← x2 mod n
if x = 1
then
return composite
if x = n − 1
then
continue WitnessLoop
return compositereturn probably prime
使用模冪運算,這個算法的時間複雜度是
,k是我們測試的不同的a的值。也就是說,這是一個高效的多項式時間算法。使用快速傅立葉變換能夠將這個時間推進到O(klognlog lognlog log logn) =Õ(klogn).
![](/img/1/a2c/97b2808f733824f18edb2a66bc6e.jpg)
如果我們加入最大公因數算法到上述算法中,我們有時候可以得到n的因數,而不僅僅是證明n是一個合數。例如,若n是一個基於a的可能的素數,但不是一個大機率素數,則
或
將得到n的因數。如果因式分解是必要的,這一GCDs算法可以加入到上述的算法中,代價是增加了一些額外的運算時間。
![](/img/e/3cd/0021d419b7ae1be72ebcca26210f.jpg)
![](/img/f/ada/13f53d0ca57b7e5a2958b7694635.jpg)
例如,假設n=341,則n-1=340=85*4。於是
,這也告訴我們n不是一個大機率素數,即n是一個合數。如果這個時候我們求最大公因數,我們可以得到一個n=341的因數:
。這是時可行的,因為n=341是一個基於2的偽素數,但不是一個“強偽素數”。
![](/img/f/bb4/2255cf58add41b76fd25c8c79a80.jpg)
![](/img/9/1f3/f812bffe0cad7f7abc453d1c8e79.jpg)