本文共 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; }}
运行结果: