佩尔方程是关于x、y的二次不定方程,表述为:
x^2 - ny^2 = 1 (n为非平方正整数)
当x = 1或-1,y = 0时,满足方程。常把x、y中有一个零的解称为平凡解。
佩尔方程的非平凡解有很多,这里只要求出它的最小正整数解,又称基本解。
算法分析:
设a = n*y*y,设置y从1开始递增,每次+1
若a + 1为某一个整数x的平方,则(x,y)即为佩尔方程的基本解。
若a + 1 不是平方数,则y + 1后再试,直到找到解为止。
在这里我们给y设置一个最大上限10000000,当大于这个值,输出"求解无果"
代码实现:
package cn.qblank.enumeration;
import java.util.Scanner;
/**
* 解佩尔方程
* @author Administrator
*/
public class Demo2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("*****解佩尔方程:x^2 - ny^2 = 1*****");
System.out.println("请输入非平方正整数n:");
double n = input.nextInt();
input.close();
//是否为平方数
if (isSqareNum(n)) {
System.out.println("n为平方数,方程无正整数解");
return;
}
//初始化y的值
int y = 1;
while(y <= 10000000){
y++;
//定义x和a的值
double a = n*y*y;
//取整
double x = Math.floor(Math.sqrt((a + 1)));
//判断是否满足方程
if (x*x == a + 1) {
System.out.println("方程x^2 - " + n + "y^2 = 1的基本解为:");
System.out.println("x = " + x + ",y = " + y);
break;
}
}
}
/**
* 判断n是否是平方数
* @param n
* @return true 表示是平方数 false表示不是
*/
public static boolean isSqareNum(double n) {
double m = Math.floor(Math.sqrt(n + 1));
if (m * m == n) {
return true;
}
return false;
}
}
运行结果: