#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define LL unsigned long long//注意这个longlong的定义,必须有 unsigned
using namespace std;
//米勒 罗宾算法模版 ==============//
LL prime[6] = {2, 3, 5, 233, 331};
LL qu(LL x, LL y, LL mod) {
LL ret = 0;
while(y) {
if(y & 1)
ret = (ret + x) % mod;
x = x * 2 % mod;
y >>= 1;
}
return ret;
}
LL qpow(LL a, LL n, LL mod) {
LL ret = 1;
while(n) {
if(n & 1) ret = qu(ret, a, mod);
a = qu(a, a, mod);
n >>= 1;
}
return ret;
}
bool MR(LL p) {
if(p < 2) return 0;
if(p != 2 && p % 2 == 0) return 0;
LL s = p - 1;
while(! (s & 1)) s >>= 1;
for(int i = 0; i < 5; ++i) {
if(p == prime[i]) return 1;
LL t = s, m = qpow(prime[i], s, p);
while(t != p - 1 && m != 1 && m != p - 1) {
m = qu(m, m, p);
t <<= 1;
}
if(m != p - 1 && !(t & 1)) return 0;
}
return 1;
}
//============================================//
int main()
{
// MR(p)用这个方法,判定大数p是不是素数
LL p;
int t;
cin>>t;
while (t)
{
cin>>p;
if (MR(p-2) ) {
cout<<"2"<< " "<<p-2; continue;
}
for(LL i=3;i<=p/2;i+=2){
if (MR(i) )
if(MR(p-i)){
cout<<i<<" "<<p-i<<endl;
break;
}
}
t--;
}
return 0;
}
米勒罗宾素数检测模板
最新推荐文章于 2022-04-24 17:01:00 发布