【数论基础】素数判定和Miller Rabin算法

判断正整数p是否是素数

方法一 朴素的判定    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAADUAAAAUBAMAAADfOGjQAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHZmmasi3Ym7RO8yVM0Ml5alAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABPUlEQVQoFV2RPUvDUBSGn9Q01iapQVycLBbBRawUN7G6OxQXHRyyiDjZxVHILBTq4lwQJxWK/QMO7opObvEfVIROBX2T3qbqITfvV+45SS78L6/+ndQfe86omSAl5fRuLdV2RBqpgKcRzqewEXAckOuY7GqEflVY0IZCm5KJvPH+WMZtAMU+bybLh4a0wOqJe0NMK45MxI3afUr4A7rG24XX9dohuDDdlmn3aY4yq41z1+MdZnVFMt2GE6uzlv2IP9VkWV7AYlnZWpj411+wIGVH7KlhgBtJPWAlPffhQuB2GKTz7BjymtmV+dzRODjFjzvJu1jncCDjQ6sU514EW9hRlROxQmUlFKxqFYfp36ngtQJqMkyl33yWPGHqckwgPZp6nBlOI6M42+JuNTPsIKNwL+5N9OaEgvNbQAg/B2w73MSNaYAAAAAASUVORK5CYII=" alt="">

方法二 线筛  aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAATBAMAAAAOpGKDAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHZmmasi3Ym7RO8yVM0Ml5alAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA9UlEQVQYGT2QMU7DQBBF38bGLIkNKy4AIkKiQQRFtCjcwKKioEiDKDEHQPIFkFJRuwckQy7AERBU6cwNTJOKgr92nJF2/vt/RrvSQle7LfQaMQfjC0HaZmbi9cxx6+gVnlXfOlYLdsZ2E6h5eHbQr5txE9tPzFwU//HUBGr9FPsrTZaU8HU6vpYp2ZxJwpqM6GXOQqZmJ5cM0qgiCTIOZd7Y25ecTONK2zmXMvcMcsk7JtN2wVKmJKxgQ3fqjTuSqvBkHuBK0x84J8xHRFqww6OpsmMYEj86gpFcWzcdbLmOWON6CNFkNfb/1tVrC8FHF0ijliX/HNUrtUeIY3MAAAAASUVORK5CYII=" alt="">

对于大整数(>1e9),可以优化

方法三 利用费马小定理

假如p是质数,且gcd(a,p)=1,那么 a^(p-1) ≡1(mod p)。
即:假如a是整数,p是质数,且a,p互质,那么a的(p-1)次方除以p的余数恒等于1。
我们这样写:a*a^(p-2) ≡1(mod p)
根据定义,a^(p-2)就是a (模p)的逆元
 
那么反过来,随机整数a能使p满足a^(p-1) ≡1(mod p)的话,那么p就是质数?
当然不是,虽然很大可能是,但是会有特殊的存在。
如2^340≡1(mod 341),但341=31*11
具体来说,特殊的数是费马伪素数和卡迈克尔数,这里不介绍了
 
方法四 二次探测定理
对于任意素数p, 满足方程aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMUAAAAVBAMAAAAEKDfsAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMARFSZImYQMrvddqvNie8Nf0xcAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC3UlEQVRIDbVUTUgUYRh+Znd+9sd2h6JDSTZYkAiVh5IoghEpIqodMGtFpKHoUBAOBREkbQhGeMkunjfCFL0sBdVFWCQIgij2kAcJ9ODdQLZLUe/3ffO5M+OsdfGD/d7ned5n3ne+n1mAjcRQF4/bOZ3H/HaW57VHUIzpoZdjRC41TTR7gOvfY7LZqGY8s4V0I5r5H65Phl3KR+IvwhqxNl9JOALsHTI3eZoKWS+UUqd/Eq+GNEbmpFLlwKjig1T+HafViId6yJcNZMYkrnGQsvBSKqorkYxnJRBRMTMMnHjKBpeoR8rmKDitS9LKQd7b2D3jjStzfnzY3RB2HtvdXfjzuyFwRD1ygDZ1c/B++zta09QiMNu+TGj2TB/Pka1ko+Rye2KcR+VAT58Q0PGKJYTbsB44zxkND+qRBnoeOYkFdAAncQkpJ1sBrg87SQd57t5PPWyGbo9yjrvGWNpkUJ+xuCLcGXoVh/PQRD0uANYAtAk6aa2KvFdEtgyYbdhRQc5lbmpAbYBeWikfZaOuMaCe8oQg3IHLgveh8xgh22lWdxw5B8PeKnLsyTlku5B2WY2Ch6MElBVG+MhUeGgzfS7cwILkwUjruEV8herq6yjYuKauo8Qco8hZ7Kxo5E0cYXFjHWixGG+sQ7gVtY4yT4Qm6kF11DUUaKNMKv7JWMOMQp469sgzTzn+F3PntXjYLLj8gkJfsoTC3QPapGYLHry7P4AWl51DEcmyk/a0Cpb1z7TZRh30H3AO6lvapMfyG9TGWQltYsC97NcqlhkQ7osH9x3y5UbQl34tImMh46AGpQa11g/sar93Bcgc77SBfhirZO88LDdemXdp2bWeGjsyPlq/URBuX4kJqji/SIb2h8YTuvrhRPx3LtxhZ4hRoc0jb5PG2kd6bHYyhbvjU0LtjUvyu5V06duJy0Y17o6KQa5YQSaw8uUrgav0s4Sw5SzcW1rsZtmmidgH/gIMvZoUzJQ+GwAAAABJRU5ErkJggg==" alt="">
有唯一解 x=1||p-1
证明
aaarticlea/png;base64,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" alt="">
 
方法五 Miller Rabin算法
逆用费马小定理加上二次探测,就得到了 Miller Rabin 算法。
Miller Rabin 算法有一定的出错概率,出错的情况一定是将合数判定为素数,且出错概率极低
 
对于一个奇素数(偶素数只有2嘛),显然p-1是偶数
则有推导过程如下:
aaarticlea/png;base64,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" alt="">
 
所以算法实现过程有两步:
1.枚举k,对于每一个k,检验是否满足二次探测定理(即上面的最后一步)
2.再检验aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAQBAMAAACIMBAtAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdlQyIrtmq82J70QQmd0a05NiAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAsklEQVQYGWNgQAZMmReQuWC2I0Mlw7ZcVGELhlSeAHewGI/kpitJExgOAjkzmQXSwGJs/AaiDA/YHZMYeN4wzG6B6DVlqOZ5wHNvAwO7AQNDA0RMkOEN0wV2zdsMwiwMTG8gYsU8D9i3MZxk4N7ACBZgFDJhCGCewCjMwMPg//8nWCyMoQKiGEGyBQDdiQa4EhhWowkx+Dswf0AXs2dgDNiAJsjFcGJCApoY9yXlawdQxQB8VCWO20gk9wAAAABJRU5ErkJggg==" alt="">即aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAQBAMAAACFLmBqAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdlQyIrtmq82J70QQmd0a05NiAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAg0lEQVQYGWNgQAY8qsg8IJtJA02AwQMiwCObNgHCggqwcR0oRhFgMGWIZpw5c6YATAtDIsMaVBXVbFAz/IDijEImDM8UIQq4Z6UwMIQxVPA8gPDBJFsAQyX3BSQBrgSG1UdjkAT8HZg/IHEZGOwZGAM2IItwMZyYkIAswH1J+doBJAEAnnoYCfcgYtYAAAAASUVORK5CYII=" alt="">是否满足费马小定理aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAH8AAAAVBAMAAACd/CwcAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdlQyIrtmq82J70QQmd0a05NiAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACAUlEQVQ4EZ1SP2jUUBz+cpdLNMn9qWJvEOF6IjjeYEFEaRZFFO0p6KLgE21d/HPQpeJSdXLyuA5yTp1c6nCbUFCCoLhoq0PBrZNzwRsEO/i95MXkJRGhGe59v+9f3r0XIP14R9LTLnDp6C5CWuSsNqnBaxSxkosF79B8P/IUFtjZfPmGH1GflWI5wUIEswXuU/IHlS1Z1hQsCQWmcc0YDocNZArM/T/pWFKuZGnGMJZu4nVEZQoAFvx9TZwCrsZwoMAjS53BRUlUr8inG2osqPghSv+M4+ENgbHvGH5MRYz78nYsqZUFDmBNfrxzsr3A3UwuAxPtFaKJM/dCjdtZ9LYysWRkQQ04f0KUnoBf2VecQ0XYPeD9uqgK1FnexUN3I0lkEAt4Lq37sLbQhLWEemcOdgMYrWFvD04AR2D1w3UtZutncJzidxm6JM3rnVdwOqSasDdQCzDrl7e1uD5wB1/IrDLkjWnGA3OMGem5DKclz2cGRnekh9ITC2gytzHL/Y+YfMz3HXBp2cG7UHPwqS/SEf0afwN7Avnf51BtiFrH6mHFe2YB5R3wKz0NuN8ObwZ6QTJ5L34tw2jBEBjAHcAczANv26fu8vY3p3yA4/8fs1fkqQjJ6qdf5Punq+5TKu7O9VzIMSTCm6gGRVKOc1s5Cu7zPslbeaGQ8QtZkhT+AOtwZG8D7+pXAAAAAElFTkSuQmCC" alt="">
 
对于任意一个p,如果通过了算法检验,则它不是素数的概率是25%
那么k轮之后,p不是素数的概率就是0.25^k,就很小了
一般8-10轮就差不多了
那么对于a的选择,可以选前面几个质数:2,3,5,7,11等,也可以用随机数
时间复杂度一般是aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAAATBAMAAADBilZAAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHZmmasi3Ym7RO8yVM0Ml5alAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABkklEQVQoFV1Sv0vDYBB9aWKMbdoEVxGLIrio1VJxkvofBCcHhy6igz/BSRQCxUFQ6OTgYvYqRvsPOAo6lNbFRSLOQlwydfBdTSR68H3v3b2XuxwJkMRwQv5hpp8r4+VlEgfmlQ0YB/9MSlUKFRsbNjIe0JT0U650dJkYDk8DBdIT0b7kSocoTc7IhhD/B092L20QbrShtIhmDxeEnpSqvP5E1oEh7fMRfOlnzqNQAjqLD1Dqc3ZnrrxG1cdgg6CF4BSj8fwEqwatqPvYsUcWrlt4pRrCcgk5Rw+Awpk3KhsuyeBPWNvqHiap3mGsSJitmTRZl6TcsAWlx1Wa0FyssLSPnEu4h8Jxt48c/QE9ghpmAtpzHiKqPrQAGKDoA6c4NBFtmSEKRa1K+y7ygSeScgys0v4uTY7ySljCESrIO2rEl9PcEnS2MCamajRNy+xOG3UPm90SUO/4mIB5bkNlFsd6QhKUz9WPITspIUV/aoPtWEs9rld//UJm8Jbk8h8lcZOQPr503ThXH2IioKd4mrL+DejaXpq1xURbAAAAAElFTkSuQmCC" alt="">,k为测试的轮数
//里面有龟速乘和快速幂,防越界
inline int slow_mult(int a,int b,int mod){
int ans=;
while(b){
if(b&) ans=(ans+a)%mod;
a=(a+a)%mod;
b>>=;
}
return ans;
} inline int quick_pow(int a,int b,int mod){
int ans=;
while(b){
if(b&) ans=slow_mult(ans,a,mod);
a=slow_mult(a,a,mod);
b>>=;
}
return ans;
} inline bool Miller_Rabin(int p){
if(p==) return true;
if(p==||p%==) return false;
int u=p-,t=;
while(u%==) u/=,t++;
for(int i=;i<=;i++){//我测了十次
int a=rand()%(p-)+;
int x=quick_pow(a,u,p);
if(x==) continue;
for(int j=;j<=t;j++){
int y=slow_mult(x,x,p);
if(y== && x!= && x!=p-) return false;//二次探测定理
x=y;//递推求2的幂
}
if(x!=) return false;//费马小定理
}
return true;
}
上一篇:HDU1164_Eddy's research I【Miller Rabin素数测试】【Pollar Rho整数分解】


下一篇:Android高仿微信图片选择功能的PhotoPicker