写在前面

网上有很多关于米勒拉宾素性测试算法的博客  但是大多数都是转载,或者只有模板代码没有分析讲解的,甚至还有的分析的都是错的。花了一早上,借鉴了几十篇博客,总算是把这个算法理解了差不多,并且详细整理了一下我的理解。

讲解很细,篇幅较长,要是想看,准备好耐心。

个人理解,如有不对,欢迎指正。

 

米勒-拉宾(MillerRabbin)素性测试算法

 

米勒-拉宾(MillerRabbin)素性测试算法是一个高效判断素数的方法

 

首先 在学习米勒拉宾素性测试涉及到两个定理  先放出来  下文会详细解释

1、费马小定理: 如果p为质数           (在mod p 的情况下)

2、对于任意一个小于p的正整数x,发现1(模p)的非平凡平方根存在,则说明p是合数。

首先说  费马小定理

费马素性测试

关于 费马小定理   他的证明 这里就不赘述了  感兴趣可以自行百度

我们要用的是费马小定理的逆推

费马小定理说, 如果p为质数    则满足 (在mod p 的情况下)

那么是不是意味着  如果任意一个数p   满足 (mod p )  就可以断定p是质数了呢?

如果这样来检测素数   这个方法就叫做费马素性测试      但是答案是  不可以这样!

  要注意  p是质数  一定满足费马小定理   但是  满足费马小定理的数  并不能证明就是质数

有些数字 满足费马小定理,但是并不是质数  他们叫做伪质数 Carmichael(伪质数的个数是无穷的  文末附有伪质数表哦)

所以说 如果我们用费马检测去判断素数是会出错的

那么这个出错的概率是多大呢    在一定范围内 有多少个数是伪素数呢?  这个和a的选取有关系

当a = 2时,前十亿个正整数中能满足费马小定理且不是素数的只有5597个  ,也就是说 出错的概率是0.011%

虽然这个错误率不高 但是还是存在那么多的伪素数  费马检测无法检测出来

我需要一个新的方法 来判断这些伪素数

这个时候也就是米勒拉宾算法的核心部分了  二次探测

二次探测

这里就要用到一开始放出来的那个定理二

2、对于任意一个小于p的正整数x,发现1(模p)的非平凡平方根存在,则说明p是合数。

乍一看是不是根本看不懂这个定理说的啥意思

其实翻译下来就是下面这样

如果p是一个素数,0 < x< p,   则方程 ≡ 1(mod p) 的解为 x=1 ,x= p-1

反之 如果  x^ 2 ≡ 1(mod p)  的解不是 x=1 ,x= p-1   那 p 就不是素数

(我们把 1和-1称为 平凡根   其他的根都称为非平凡根

而 如果一个数x 的平方 模 p =1 或-1   我们就称这个数是1 或 -1 模p 的非平凡平方根

然而 ≡ -1 (mod p)  那x就是虚数了 不在我们讨论范围内  所以  我们只用关心 ≡ 1(mod p)  

也就是只用关心 1(模p)的非平凡平方根  而如果p是素数 那么 他的根只可能是 1或者 p-1

若根不是1或者p-1 那他就是个合数     关于证明 在下边)

我们用这条性质 进行二次探测

关于这条性质的证明: (如果不想看证明直接跳过 往下看

--------------------------------证明-----------------------------------------

≡ 1(mod p)   可以移项  变成    -1 ≡ 0 (mod p)

那么就是  ( x - 1 )( x + 1 ) ≡ 0(mod p)     就是说  ( x - 1 )( x + 1 ) % p = 0

那如果p是个质数

因为p是质数     所以 p不可能  %( x - 1 )=0   也不可能 %( x + 1 )=0

既然%他俩都不可能为0  也就是他俩都不是p的因子(x<p)   那他俩的乘积也不可能%p = 0

≡ 1(mod p)  这怎么成立呢

只有一个答案  ( x - 1 )( x + 1 )本身就=0   那么也就是  x=1 或 p-1

由此可证明  p为素数的时候 ≡ 1(mod p)   只有两个解 x=1 或 p-1

--------------------------------证毕--------------------------------------------

有了这条性质 

那么    满足x^ 2 ≡ 1(mod p)  的 x 值   只可能等于  1 或 p-1     如果不是这俩   那就不是素数 (x<p)

那么我们去怎样验证呢  总不能把比 p 小的数一个一个验证吧  那样也太费时间了吧

所以 米勒拉宾算法就提供了一个 快速的办法(但不准确~~后面会讲)

我们转换个角度看问题

既然   我们遍历所有 x 让它 mod  p  结果有很多种   我们需要的只是那些结果为1的 x

那我们反过来   把所有结果为 1 的 x 拿出来       看他们 是不是等于   p - 1 或 1   

 

写这里 你可能要说了  what?  怎么根据结果找这些 x    我不经过计算怎么知道结果是不是1   ?

别着急   可以的  首先要明白   我们要找的 这些 x     都是满足 x ^ 2 ≡ 1 (mod p) (别忘记了~~)

那么 再看下刚才的费马素性检测

能通过费马检测的数    一定满足     (mod  p)

而 p - 1是一个偶数

(如果p是个偶数   我们不需要任何复杂的算法  因为偶数只有2是质数  直接判断即可  所以只有p是奇数 我们才进来判断   p是奇数  p - 1  自然是偶数了)

然后 来看个很好理解的性质

任何一个偶数 都可以写成   的形式      比如 6 可以写成  2^1 * 3

所以  p-1 也可以写成    

那么  就等于       也就可以写成

那么式子就变成了  (mod  p)

我们把    看作 k       那么式子就是        1(mod  p) 

 

为什么把费马小定理化简成这个样子呢?  我们来看看我们要找的 x    x是满足 x ^ 2 ≡ 1 (mod p) 解为 x=1 ,x= p-1的

而  的计算过程      是不是    ....      ................

的变化过程中  一定会存在        那么  此时  这些k相乘  就是我们要找的 x

这就是满足   x ^ 2 ≡ 1 (mod p) 的那些 x        这个x是存在于 的变化过程中的

所以我们只需要在的变化过程中不停的判断  只要它等于1 或者 p - 1  就说明他是素数!

当然 这里还有一个重点    如果 x  在这个过程中一直不等于  1或 p-1    就能说明他不是素数吗

不能!   思路不要晕   我们要彻底明白米勒拉宾的核心  

核心是 根据二次探测定理   我们要找满足 x ^ 2 ≡ 1 (mod p) 的所有  x 

要看这些x是不是全部为 1 或 p-1   

但是挨个遍历太慢了

然后我们发现  满足x ^ 2 ≡ 1 (mod p)  的x    都存在于  里面

然后我们去 里面找 x    但是 是和 k 有关的

严格来说    你想判断一个数不是素数   需要找遍所有满足条件的 x 

而想找遍 x    你必须找遍所有k的取值

明白了这个 你可能会说 找遍所有k 肯定超时啊   扯了半天 这不还是判断不了吗。。。

别急 确实 米勒拉宾不能百分百的判断出一个数是不是素数

但是  我们只尝试几个 k 值    去找x    如果x取值都不是 1或 p-1  虽然理论上不能断定他百分百不是素数   

但是 此时他是素数的概率很小  很小很小  比你买的新电脑刚打开突然爆炸了的概率还小 

所以 你可以认为他就不是个素数

那么多尝试几个k  其实就是多尝试几个a     k值取决于 a 的值 

所以 多试几个a   这个算法的错误概率就可以降低到忽略不计

一般试个十几次  二三十次就差不多

而且据说按照下表取a的值  在一定范围内 可以使正确率达到百分之百   变成一个确定的算法

  1.        if n < 1 373 653   a = 2 and 3.
  2.        if n < 9 080 191   a = 31 and 73.
  3.   if n < 4 759 123 141   a = 2, 7, and 61. 
  4.   if n < 2 152 302 898 747      a = 2, 3, 5, 7, and 11.

 

代码

标有注释

模板题目51nod1106

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll mul(ll a,ll b,ll mod){//高精度
    a%=mod;
    b%=mod;
    ll c=(long double)a*b/mod;
    ll ans=a*b-c*mod;
    return (ans%mod+mod)%mod;
}
ll pow_mod(ll x,ll n,ll mod){//快速幂
    ll res=1;
    while(n){
        if(n&1)
        res=mul(res,x,mod);
        x=mul(x,x,mod);
        n>>=1;
    }
    return (res+mod)%mod;
}
bool Miller_Rabbin(ll a,ll n){
    
    //把n-1  转化成 (2^r)*d
    ll s=n-1,r=0;
    while((s&1)==0){
        s>>=1;r++;
    }
    
    //算出 2^d  存在 k 里
    ll k=pow_mod(a,s,n);
    
    //二次探测  看变化过程中是不是等于1 或 n-1
    if(k==1)return true;
    for(int i=0;i<r;i++,k=k*k%n){
        if(k==n-1)return true;
    }
    return false;
}
bool isprime(ll n){
    //这里可以随机取a值进行探测  探测次数可以自己定
    //我写了几个我喜欢用的探测数据
    ll times=7;
    ll prime[100]={2,3,5,7,11,233,331};
    for(int i=0;i<times;i++){
        if(n==prime[i])return true;
        if(Miller_Rabbin(prime[i],n)==false)return false;//未通过探测 返回假
    }
    return true;//所有探测结束 返回真
}

 

伪素数表

常用的

 18位素数:154590409516822759
 19位素数:2305843009213693951 (梅森素数)
 19位素数:4384957924686954497

Carmichael-list:

561
1105
1729
2465
2821
6601
8911
10585
15841
29341
41041
46657
52633
62745
63973
75361
101101
115921
126217
162401
172081
188461
252601
278545
294409
314821
334153
340561
399001
410041
449065
488881
512461
530881
552721
656601
658801
670033
748657
825265
838201
852841
997633
1024651
1033669
1050985
1082809
1152271
1193221
1461241
1569457
1615681
1773289
1857241
1909001
2100901
2113921
2433601
2455921
2508013
2531845
2628073
2704801
3057601
3146221
3224065
3581761
3664585
3828001
4335241
4463641
4767841
4903921
4909177
5031181
5049001
5148001
5310721
5444489
5481451
5632705
5968873
6049681
6054985
6189121
6313681
6733693
6840001
6868261
7207201
7519441
7995169
8134561
8341201
8355841
8719309
8719921
8830801
8927101
9439201
9494101
9582145
9585541
9613297
9890881
10024561
10267951
10402561
10606681
10837321
10877581
11119105
11205601
11921001
11972017
12261061
12262321
12490201
12945745
13187665
13696033
13992265
14469841
14676481
14913991
15247621
15403285
15829633
15888313
16046641
16778881
17098369
17236801
17316001
17586361
17812081
18162001
18307381
18900973
19384289
19683001
20964961
21584305
22665505
23382529
25603201
26280073
26474581
26719701
26921089
26932081
27062101
27336673
27402481
28787185
29020321
29111881
31146661
31405501
31692805
32914441
33596641
34196401
34657141
34901461
35571601
35703361
36121345
36765901
37167361
37280881
37354465
37964809
38151361
38624041
38637361
39353665
40280065
40430401
40622401
40917241
41298985
41341321
41471521
42490801
43286881
43331401
43584481
43620409
44238481
45318561
45877861
45890209
46483633
47006785
48321001
49333201
50201089
53245921
54767881
55462177
56052361
58489201
60112885
60957361
62756641
64377991
64774081
65037817
65241793
67371265
67653433
67902031
67994641
68154001
69331969
70561921
72108421
72286501
74165065
75151441
75681541
75765313
76595761
77826001
78091201
78120001
79411201
79624621
80282161
80927821
81638401
81926461
82929001
83099521
83966401
84311569
84350561
84417985
87318001
88689601
90698401
92625121
93030145
93614521
93869665
94536001
96895441
99036001
99830641
99861985
100427041
101649241
101957401
102090781
104404861
104569501
104852881
105117481
105309289
105869401
107714881
109393201
109577161
111291181
114910489
115039081
115542505
116682721
118901521
119327041
120981601
121247281
122785741
124630273
127664461
128697361
129255841
129762001
130032865
130497361
132511681
133205761
133344793
133800661
134809921
134857801
135556345
136625941
139592101
139952671
140241361
144218341
145124785
146843929
150846961
151530401
151813201
153927961
157731841
158404141
158864833
159492061
161035057
161242705
161913961
163954561
167979421
168659569
169057801
169570801
170947105
171679561
172290241
172430401
172947529
173085121
174352641
175997185
176659201
178451857
178482151
178837201
180115489
181154701
182356993
184353001
186393481
186782401
188516329
188689501
189941761
193910977
194120389
194675041
196358977
200753281
206955841
208969201
212027401
214850881
214852609
216821881
221884001
226509361
227752993
228842209
230630401
230996949
231194965
237597361
238244041
238527745
241242001
242641153
246446929
247095361
250200721
252141121
255160621
256828321
257495641
258634741
266003101
270857521
271481329
271794601
273769921
274569601
275283401
277241401
278152381
279377281
280067761
288120421
289860481
291848401
292244833
292776121
295643089
295826581
296559361
299736181
300614161
301704985
302751505
306871201
311388337
321197185
321602401
328573477
329769721
333065305
333229141
338740417
334783585
346808881
348612265
354938221
357380101
358940737
360067201
362569201
364590721
366532321
366652201
367804801
367939585
368113411
382304161
382536001
390489121
392099401
393513121
393716701
395044651
395136505
399906001
403043257
405739681
413058601
413138881
416964241
419520241
426821473
429553345
434330401
434932961
438359041
440306461
455106601
458368201
461502097
461854261
462199681
471905281
471441001
473847121
477726145
481239361
483006889
484662529
490099681
490503601
492559141
503758801
507726901
510825601
511338241
516684961
517937581
518117041
518706721
527761081
529782121
530443201
532758241
540066241
542497201
544101481
545363281
547652161
548871961
549333121
549538081
551672221
552894301
555465601
556199281
556450777
557160241
558977761
561777121
564651361
568227241
569332177
573896881
577240273
579606301
580565233
590754385
595405201
597717121
600892993
602074585
602426161
606057985
609865201
612816751
616463809
620169409
625060801
625482001
629692801
631071001
633639097
652969351
656187001
662086041
683032801
683379841
686059921
689880801
697906561
702683101
703995733
704934361
710382401
710541481
711374401
713588401
717164449
727083001
739444021
743404663
744866305
752102401
759472561
765245881
771043201
775368901
775866001
776176261
784966297
790020001
790623289
794937601
798770161
804978721
809702401
809883361
814056001
822531841
824389441
829678141
833608321
834244501
839275921
841340521
843704401
847491361
849064321
851703301
851934601
852729121
855734401
863984881
867800701
876850801
882796321
885336481
888700681
897880321
902645857
914801665
918661501
928482241
931694401
934784929
935794081
939947009
940123801
941056273
954732853
955134181
957044881
958735681
958762729
958970545
962442001
962500561
963168193
968553181
975303121
977892241
981567505
981789337
985052881
990893569
993420289
993905641
1001152801
1027334881
1030401901
1031750401
1035608041
1038165961
1055384929
1070659201
1072570801
1093916341
1100674561
1103145121
1125038377
1131222841
1136739745
1177195201
1180398961
1189238401
1190790721
1193229577
1198650961
1200456577
1200778753
1207252621
1213619761
1216631521
1223475841
1227220801
1227280681
1232469001
1251295501
1251992281
1256855041
1257102001
1260332137
1264145401
1268604001
1269295201
1295577361
1299963601
1309440001
1312114945
1312332001
1316958721
1317828601
1318126321
1321983937
1332521065
1337805505
1348964401
1349671681
1376844481
1378483393
1382114881
1384157161
1394746081
1394942473
1404111241
1407548341
1422477001
1428966001
1439328001
1439492041
1441316269
1442761201
1490078305
1504651681
1507746241
1515785041
1520467201
1528936501
1540454761
1574601601
1576826161
1583582113
1588247851
1597821121
1626167341
1632785701
1646426881
1648076041
1659935761
1672719217
1676203201
1685266561
1688214529
1689411601
1690230241
1699279441
1701016801
1708549501
1726372441
1746692641
1750412161
1760460481
1772267281
1776450565
1778382541
1785507361
1795216501
1801558201
1803278401
1817067169
1825568641
1828377001
1831048561
1833328621
1841034961
1846817281
1848681121
1849811041
1879480513
1894344001
1899525601
1913016001
1918052065
1942608529
1943951041
1949646601
1950276565
1954174465
1955324449
1958102641
1976295241
1984089601
1988071801
2000436751
2023528501
2049293401
2064236401
2064373921
2067887557
2073560401
2080544005
2097317377
2101170097
2105594401
2107535221
2126689501
2140538401
2140699681
2301745249
2323147201
2436691321
2438403661
2444950561
2456536681
2529410281
2560600351
2598933481
2690867401
3264820001
3313196881
3480174001
3504570301
3713287801
3787491457
3835537861
4034969401
4215885697
4464573049
4562359201
4765950001
5255104513
5278692481
5781222721
5959748521
6047866621
6630702121
6916775113
7045248121
7629221377
8044161481
8251854001
8346731851
8652633601
8714965001
8976678481
9030158341
9086767201
9139810681
9293756581
9624742921
9701285761
9789244921
10119879001
10277275681
11346205609
12121569601
12173703001
12456671569
13079177569
13691148241
13946829751
14313548881
15906120889
16157879263
16765869121
17930792881
18151032901
18500666251
19742849041
21515221081
21796387201
22062297601
23224518901
23707055737
24285378001
25509692041
25749237001
26624905201
27278026129
30923424001
31876135201
34153717249
45983665729
48874811311
51436355851
51476019409
52756389001
57274147841
58094662081
59512667761
63593140801
64188507241
65700513721
67495942201
71171308081
82380774001
83946864769
100264053529
110296864801
168003672409
172018713961
173032371289
192739365541
225593397919
461574735553
464052305161
2199733160881
10028704049893
84154807001953
197531244744661
973694665856161
1436697831295441
1493812621027441
2094319836529921
2842648863161185
5778659093725441
6665161459969441
8015398984895401
8084842432668001
8188730132744161
12300849473799601
16166305446157945
32769125985828961
36629326277622001
39108343499765281
34795784213714161
37244219285276641
51116737346161201
61754693922936001
74538625278452401
91010482208190721
103183537035680641
126708084584398801
166857847951798081
186551892579535561
190232114399046721
194379756103868401
314610088213970641
335642734654849441
346413738355448401
556237362582392401
790689421836863641
1222628719906994401
1228155123631509217
1719756626091706801
2448237906710996401
2851896013395343201
3589102252820237401
4954039956700380001