题意:给出一个复数,判断是否能分解成两个复数相乘的形式,其中一个因式不能是1,-1,-i,i。如果可以,该复数为合数,如果不可以,该复数为素数。1,-1,i,-i,0,不是素数。
思路:数学界叫这个东西为高斯素数。
分情况讨论: 1.实部或虚部有一个为0。不妨设这个数为实数x。如果这个数是合数,那一定不是高斯素数。如果这个数是素数,但能表示成a ^2 + b^2的形式,可以得到因式
x = (a + bi)(a-bi),不是高斯素数。费马平方和定理 :形如4n+1形式的素数都可以表示成a^2 +b ^2 的形式,其中a,b为正整数。 所以,只有形如4n+3形式的素数才为高斯素数。
2.实部和虚部均不为零。
设待分解的复数为Z=a+bi,分解的因子为Z1 = a1+b1i,Z2 =a2+b2i; 则,Z= Z1 * Z2,Z^2 = Z1^2 * Z2^2; 如果Z不可以分解,那Z1,Z2中必有一个为i,-i,1,-1,可以得到,Z^2 = 1 * Z2^2 ,所以若Z为高斯素数,那Z^2 = a^2 + b^2为素数。可以证明这是一个充分必要条件。
代码如下:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
bool isprime(int n)
{
int limit = sqrt((double)n);
for (int i = 2; i <= limit; ++i)
if (n % i == 0)
return false;
return true;
}
int main(void)
{
int a, b;
while (scanf("%d %d", &a, &b) != EOF)
{
if (a == 0 || b == 0){
int sum = abs(a + b);
if (sum == 0 || sum == 1)
puts("NO");
else if (isprime(sum) && (sum - 3) % 4 == 0)
puts("YES");
else
puts("NO");
}
else if (isprime(a * a + b * b))
puts("YES");
else
puts("NO");
}
return 0;
}