学过复变函数的都知道,复数可以由模乘上辐角来表示。所以不难得出当a*a+2*b*b为素数时,该数为高斯素数。但是还得考虑a或b为0的情况,这里我用了枚举的方法,若a或b能表示为x*x+2*y*y的形式且为为素数时,该数也为高斯素数。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int isprime(int x)
{
int m=sqrt(x*1.0);
for(int i=2;i<=m;i++) if(x%i==0) return 0;
return 1;
}
int judge(int x)
{
int m=sqrt(x*1.0);
for(int i=0;i<=m;i++)
{
double t=sqrt((x-i*i*1.0)/2.0);
if(ceil(t)==floor(t)) return 1;
}
return 0;
}
int main()
{
int T;
cin>>T;
while(T--)
{
int a,b;
cin>>a>>b;
if(abs(a)<=1&&b==0) {cout<<"No"<<endl;continue;}
if(a==0)
{
if(isprime(abs(b))&&!judge(abs(b))) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
continue;
}
if(b==0)
{
if(isprime(abs(a))&&!judge(abs(a))) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
continue;
}
int t=a*a+2*b*b;
if(!isprime(t)) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
return 0;
}