天天看点

数学专项number_theory:LA 4079

学过复变函数的都知道,复数可以由模乘上辐角来表示。所以不难得出当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;
}