/*我的过程可能不太严密,只为得到本题结果
本题目的是求解两个素数m和n,并使得:
m*m+1 = 2*n*n
首先排除前面几个小值的情况,应该有m>n,m和n都是奇数
可做如下假设:
m = 2*(c+k+k)+1
n = 2*(c+k)+1
代到前面式子里简化后得到:
c*(c+1)/2 = k*k
等号前的是自然数c项和,等号后的是奇数k项和:
1+2+...+c = 1+3+...+(2*k-1)
所以程序实现上就是先搜索找到满足c*(c+1)/2 = k*k的情况
再判断m和n是否是素数
我程序里大数直接用了WinNTL-5_4_1库
如果自己实现一个简单的扩展加法与乘法也许速度会快一些
但考虑自己实现的素数判断函数可能不如它的效率高
*/
void main()
{
ZZ m,n,c,k,sc,sk;
LONG v;
DWORD nCount = 0;
c = 1;
k = 1;
sc = c;
sk = k;
while (1)
{
v = compare(sc,sk);
if (v < 0)
{
c += 1;
sc += c;
}
else if (v > 0)
{
k += 2;
sk += k;
}
else
{
n = 2*c+(k+1)+1;
m = 2*c+2*(k+1)+1;
if (ProbPrime(m) && ProbPrime(n))
{
cerr << "Result is ok:\n";
cerr << "m = " << m << ", n = " << n << "\n";
}
k += 2;
sk += k;
}
nCount++;
if (nCount > 0x4000000)
{
cerr << ".";
nCount = 0;
}
}
}
/*
Result is ok:
m = 7, n = 5
Result is ok:
m = 41, n = 29
Result is ok:
m = 63018038201, n = 44560482149
*/