有一个特殊的佩尔方程:x^2-61*y^2=1
下面我将编程求解它的最小解
如果直接枚举x和y的话,大约需要10秒
代码:
#include<iostream> using namespace std; int main() { long long x = 2, y = 0, flag = 3; //flag=x*x-61*y*y-1 while (flag) { if (flag > 0) { flag -= 61 * (2 * y + 1); y++; } else { flag += 2 * x + 1; x++; } } cout << x << " " << y << " " << x*x; system("pause>nul"); return 0; }
如果先数学求解的话,自然会快一些。
首先,x必定是奇数,y必定是偶数
设x=s*2+1,y=t*2
那么s(s+1)=61t*2
分解:有2种情况
第一种,s=61*a^2,s+1=b^2,那么b^2-61*a^2=1,与x,y是最小解矛盾。
第二种,s=a^2,s+1=61*b^2,那么a^2-61*b^2=-1,化成这种佩尔方程了。
如果这个方程有解的话,原方程也有解,而且这个方程的解比原方程的解小得多。
2个方程是几乎差不多的,代码只需要略略改改就可以了。
代码:
#include<iostream> using namespace std; int main() { long long x = 2, y = 0, flag = 5; while (flag) { if (flag > 0) { flag -= 61 * (2 * y + 1); y++; } else { flag += 2 * x + 1; x++; } } cout << x*x * 2 + 1; system("pause>nul"); return 0; }
这个不需要1秒就可以算完。
最后,附上PDF的截图
时间: 2024-11-01 13:46:26