zoukankan      html  css  js  c++  java
  • 【Miller-Rabin算法】

    存个板子,应该是对的吧……没太试

    http://www.cnblogs.com/Norlan/p/5350243.html

    Matrix67写的

    根据wiki,取前9个素数当base的时候,long long内仅有一个强伪素数 382512305654641305 。

    #include<cstdio>
    using namespace std;
    typedef long long ll;
    const int BASE[]={2,3,5,7,11,13,17,19,23};
    ll Quick_Mul(ll a,ll p,ll MOD)
    {
        if(!p){
        	return 0;
        }
        ll ans=Quick_Mul(a,p>>1,MOD);
        ans=(ans+ans)%MOD;
        if((p&1)==1){
        	ans=(ans+a%MOD)%MOD;
        }
        return ans;
    }
    ll Quick_Pow(ll a,ll p,ll MOD)
    {
        if(!p){
        	return 1;
        }
        ll ans=Quick_Pow(a,p>>1,MOD);
        ans=Quick_Mul(ans,ans,MOD);
        if((p&1)==1){
        	ans=(a%MOD*ans)%MOD;
    	}
        return ans;
    }
    bool test(ll n,ll a,ll d){
    	if(n==2){
    		return 1;
    	}
    	if(n==a){
    		return 0;
    	}
    	if(!(n&1)){
    		return 0;
    	}
    	while(!(d&1)){
    		d>>=1;
    	}
    	ll t=Quick_Pow(a,d,n);
    	if(t==1){
    		return 1;//要么一开始t就等于1,咋乘都是1 
    	}
        while(d!=n-1 && t!=n-1 && t!=1){
    		t=Quick_Mul(t,t,n);
    		d<<=1;
    	}
    	return t==n-1;//要么t能变成n-1,那么下一次t肯定变成1,
    				//再往后也没有卵用了,一直是1,就通过了测试 
    }
    bool Miller_Rabin(ll n){
    	if(n==1 || n==3825123056546413051ll){
    		return 0;
    	}
    	for(int i=0;i<9;++i){
    		if(n==BASE[i]){
    			return 1;
    		}
    		if(!test(n,BASE[i],n-1)){
    			return 0;
    		}
    	}
    	return 1;
    }
    int main(){
    	for(int i=1;i<=100000;++i){
    		if(Miller_Rabin(i)){
    			printf("%d ",i);
    		}
    	}
    	return 0;
    }
  • 相关阅读:
    leetcode 子集
    leetcode 1111. 有效括号的嵌套深度
    leetcode289 生命游戏
    关于三次握手和四次挥手,发送方和接收方处于的状态的问题。
    面试题:随意取数
    2020/3/31
    01背包和完全背包
    USACO Agri-Net 3.1
    mfc小计
    static 成员小记
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/6593780.html
Copyright © 2011-2022 走看看