佩尔方程
问题描述:
试求关于x,y的不定方程:x^2 - n*y^2 = 1的正整数解。(其中n为非平方正整数)
佩尔(Pell)方程是关于x,y的二次不定方程。当x=1或x=-1,y=0时,显然满足方程。常把x,y中有一个为零的解称为平凡解。
佩尔方程的非平凡解很多,这里只要求出它的最小非平凡解,即x,y为满足方程的最小正整数的解,又称基本解。求出了基本解,其他解可由基本解推出。
对于给定的非平方正整数n,试求出佩尔方程的基本解。
设计思想:
对y从1开始递增1取值枚举,每一个y值计算a=nyy后判别:
若a+1不是平方数,则y增1后再试。
若a+1为某一整数x的平方,则(x,y)即为所求方程的解。因为y是从1开始递增的,所得解是方程的基本解。
对于某些非平方数n,方程的解位数大大超过计算机语言有效数字的范围,枚举不可能给出正确的解,因此算法中加了另一个结束算法的条件“x>1000000000”(此结束条件可根据具体情形而定)。
具体实现:
#include <stdio.h>
#include <math.h>
int main()
{
int n,m,x,y;
double a;
printf(" 请输入非平方整数n:");
scanf("%d",&n);
m=(int)sqrt(n);
while (m*m==n) // 先判断输入的数是否为平方数
{
printf(" n须为非平方数!\n");
scanf("%d",&n);
}
y=0;
while (1)
{
y++; // 对y递增枚举
a=n*y*y;
x=(int)(sqrt(a+1));
if((x*x)==(a+1)) // 检测是否满足方程
{
printf(" 方程x^2-%dy^2=1的基本解为:",n);
printf(" x=%d, y=%d\n",x,y);
break;
}
if(x>1000000000)
{
printf(" 此算法不能解方程x^2-%dy^2=1\n",n);
break;
}
}
return 0;
}