zoukankan      html  css  js  c++  java
  • 质数的判定 Miller_Rabin

    ----------- 10^18

    #include <bits/stdc++.h>
    #define min(a,b) ((a)<(b)?(a):(b))
    #define max(a,b) ((a)>(b)?(a):(b))
    using namespace std;
    typedef long long ll;
    inline int read() {
    	int f=1,sum=0;
    	char x=getchar();
    	for(;(x<'0'||x>'9');x=getchar()) if(x=='-') f=-1;
    	for(;x>='0'&&x<='9';x=getchar()) sum=sum*10+x-'0';
    	return f*sum;
    }
    
    int x_[10]={3,5,7,11,13,17,19,23};
    
    
    inline ll mul(ll x,ll y,ll mod) {
    	ll tmp=x*y-((ll)((long double)x/mod*y+0.5))*mod;
    	return tmp<0?tmp+mod:tmp;
    }
    
    inline ll qmul(ll x,ll ci,ll mod) {
    	ll sum=1;
    	for(;ci;ci>>=1,x=mul(x,x,mod))
    		if(ci&1) sum=mul(sum,x,mod);
    	return sum;
    }
    
    inline bool Miller_Rabin(ll n) {
    	if(n==1) return 0;
    	if(n==2) return 1;
    	if(!(n&1)) return 0;
    	ll t=n-1;
    	int now=0;
    	while (!(t&1)) t>>=1,++now;
    	
    	for(int i = 0; i <= 7; i++){
    		if(x_[i]==n) return 1;
    		ll x=qmul(x_[i],t,n),y=x;
    		for(int j = 1; j <= now; j++) {
    			x=mul(x,x,n);
    			if(x==1&&!(y==1||y==n-1)) return 0;
    			y=x;
    		}
    		if(x!=1) return 0;
    	}
    	return 1;
    }
    
    int main () {
    	//freopen("a.in","r",stdin);
    	ll x;
    	while (scanf("%lld",&x)==1) {
    		if(Miller_Rabin(x)) puts("Y");
    		else puts("N");
    	}
    }
    
    东北日出西边雨 道是无情却有情
  • 相关阅读:
    利用MFC获取网页内容
    IP地址 >实际地址 ,API 查询
    一个小时内学习 SQLite 数据库
    Sqlite c/c++ api 学习
    笔记
    Sqlite的操作(增加,删除,查询,修改)
    免费天气API
    ServerSocketChannel的使用例子
    各种模式一览
    什么事文件描述符
  • 原文地址:https://www.cnblogs.com/ccut-ry/p/9649957.html
Copyright © 2011-2022 走看看