【枚举算法】佩尔方程

来源:互联网 发布:阿尔布雷特 丢勒 知乎 编辑:程序博客网 时间:2024/04/28 05:44

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


运行结果:








原创粉丝点击