博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【枚举算法】佩尔方程
阅读量:2057 次
发布时间:2019-04-28

本文共 1197 字,大约阅读时间需要 3 分钟。

佩尔方程是关于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;	}}

运行结果:

你可能感兴趣的文章