【发布时间】:2016-06-26 17:38:20
【问题描述】:
我正在搜索 a、b 和 c,使得 a^5+b^5 = c^5。我的程序产生 2000^5+1= 2000^5。为什么会发生这种情况以及如何解决?
public class Euler {
public static void main(String[] args) {
long i=0;
int power = 5;
int a1 = 1;
int a2 = 2000;
boolean isSolved = false;
long sumOfPowers = 0;
double root = 0;
long roundDown = 0;
long roundDown2Power = 0;
sumOfPowers = (long) (Math.pow(a1, power) + Math.pow(a2, power));
root = Math.pow(sumOfPowers, 1.0/power);
roundDown = (long) root;
roundDown2Power = (long)Math.pow(roundDown, power);
if (sumOfPowers == roundDown2Power) {
isSolved = true;
System.out.println(isSolved + " " + a1 + "^" + power + " + " + a2 + "^" + power + " + " + "^" + power + " = " + roundDown + "^" + power );
}
}
}
我正在寻找欧拉猜想的反例。使用这种方法An error searching for a counterexample to Euler's conjecture我成功获得了五次幂 27^5 + 84^5 + 110^5 + 133^5 = 144^5 (Lander & Parkin, 1966),需要 6 秒。我试图得到 5800^4 + 217519^4 + 414560^4 = 422481^4(Roger Frye,1988 年),但是在测试这个模块时,我发现我的程序产生了 2000^5+1=2000^5。这是个问题。
【问题讨论】:
-
当然,我知道。我试图找到en.wikipedia.org/wiki/Euler%27s_sum_of_powers_conjecture 的反例,我让它适用于 n=5,但由于舍入错误
20k^4+1=20k^4,我无法使其适用于 n=4。 -
原始类型可以表示的值范围有限,在浮点/双精度的情况下,可以表示的值的精度也受到限制(对于大于 n>2^52 的整数值表达式 n==n+1 变为 true)。您将需要切换到使用任意精度类型,例如BigInteger 来克服这些限制(但预计性能会显着下降)。
-
BigInteger 没有开箱即用的计算根的方法。