大数判断素数(2^63)

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

using namespace std;
typedef unsigned long long LL;
typedef unsigned long long ll;

ll add_mod(ll a,ll b,ll mod){    //快乘法 基于快速幂的二分思想 
    ll ans=0;                    //由于考虑到取模数很大 快速幂会溢出 
    while(b){                    //必须使用该方法 
        if(b&1)                    //我这里写的是非递归版 
            ans=(ans+a)%mod;
        a=a*2%mod;
        b>>=1;
    }
    return ans;
}

ll pow_mod(ll a,ll n,ll mod){            //快速幂 递归版 
    if(n>1){                            
        ll tmp=pow_mod(a,n>>1,mod)%mod;
        tmp=add_mod(tmp,tmp,mod);
        if(n&1) tmp=add_mod(tmp,a,mod);
        return tmp;
    }
    return a;
}

bool Miller_Rabbin(ll n,ll a){//米勒拉宾素数判断函数主体
    ll d=n-1,s=0,i;    
    while(!(d&1)){            // 先把(2^s)*d 算出来 
        d>>=1;
        s++;
    }
    ll t=pow_mod(a,d,n);    //a^d取一次余判断 
    if(t==1 || t==-1)        //一或负一则可以声明这可能是质数 
        return 1;
    for(i=0;itab[i] && !Miller_Rabbin(n,tab[i]))
            return 0;
    }
    return 1;
}

int T;
LL x;

int vis[100010], prime[100010], cnt = 0;
void PRIME(int n) {
	for(int i = 2; i <= n; ++i) {
		if(!vis[i]) prime[cnt++] = i;
		for(int j = 0; j < cnt && i * prime[j] <= n; ++j) {
			vis[i * prime[j]] = 1;
			if(i % prime[j] == 0) break;
		}
	}
}

void solve() {
	for(int i = 0; i < cnt; ++i)
		if(is_prime(x-prime[i])) {
			printf("%d %llu\n", prime[i], x-prime[i]);
			return;
		}
}

int main() {
	PRIME(100000);
	
	scanf("%d", &T);
	while(T--) {
		scanf("%llu", &x);
		solve();
	}
	
	return 0;
}

你可能感兴趣的:(素数)