数学板块学习之大素数检测Miller_Rabin算法

Miller_Rabin算法

算法的两个基础理论

  • 费马小定理:当 p 为质数,有 a^(p-1) ≡ 1(mod p),但是反过来不一定成立。
  • 二次探测:一个素数p,对于0

证明:Miller-Rabin素性测试算法详解

解题步骤

  1. 特判0,1,2,偶数
  2. n-1=u*2^t(u为奇数)
  3. 随机选取一个数a,并令1a^(p-1) ≡ 1(mod p)(费马小定理)成立则继续,不成立则返回false
  4. 令x = a^u%n,后面t次循环(循环后x = a ^ (n-1))循环中x
  5. 循环结束x = a ^ (n-1) 如果x!=1,n即为合数
  6. 多随机几次a提高准确率

代码模板

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;
#define me(x,y) memset(x,y,sizeof x)
#define MIN(x,y) x < y ? x : y
#define MAX(x,y) x > y ? x : y
typedef long long ll;
const int maxn = 1e5+10;
const double INF = 0x3f3f3f3f;
const int MOD = 1e6;
const double eps = 1e-06;

ll Quick_Multiply(ll a,ll b,ll p){  // a*b%p
    ll ans = 0;
    a %= p;
    b %= p;
    if(b < 0) a = -a,b = -b;
    while(b){
        if(b&1) ans = (ans+a)%p;
        b >>= 1;
        a = (a+a)%p;
    }
    ans = (ans+p)%p;
    return ans;
}

ll Quick_Pow(ll a,ll b,ll p){   //a^b%p
    ll ans = 1;
    while(b){
        if(b&1) ans = Quick_Multiply(ans,a,p)%p;
        b >>= 1;
        a = Quick_Multiply(a,a,p)%p;
    }
    return ans;
}

bool Miller_Rabin(ll n){    //Miller_Rabin
    ll i,j,a,x,y,t,u,s = 10;
    if(n == 2 || n == 3) return true;
    if(n < 2 || !(n&1)) return false;
    for(t = 0,u = n-1;!(u&1); t++,u>>=1);   //n-1 = u*2^t
    for(i = 0; i < s; i++){
        a = rand()%(n-1)-1;
        x = Quick_Pow(a,u,n);   //a^u
        for(j = 0; j < t; j++){
            y = Quick_Multiply(x,x,n);  //x^2
            if(y == 1 && x != 1 && x != n-1) return false;  //二次探测
            x = y;
        }
        if(x != 1) return false;    //费马小定理
    }
    return true;
}
int main(){
    
    //freopen("E:/TanJX/in.txt","r",stdin);
    //freopen("E:/TanJX/out.txt","w",stdout);
    int n;
    while(cin>>n){
        int sum = 0;
        ll x;
        for(int i = 1; i <= n; i++){
            scanf("%lld",&x);
            if(Miller_Rabin(x)) sum++;
        }
        cout<<sum<<endl;
    }
    return 0;
}


/*


*/

你可能感兴趣的:(——数学——,#,知识点,#,#,数论——Prime)