2016-06-26 14 views
0

^a + b^5 = c^5となるa、b、cを探しています。私のプログラムは、2000^5 + 1 = 2000^5となる。なぜこれが起こっていて、それを修正するのですか?"largeNumber^5 + 1 = largeNumber^5"をJavaで修正する方法

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); 
      } 
     } 
    } 

私はオイラーの予想の反例を探しています。私はこの方法を使用して5度で成功しました。これは6秒かかっています(Lander & Parkkin、1966)。私は5800^4 + 217519^4 + 414560^4 = 422481^4(Roger Frye、1988)を取得しようとしていますが、このモジュールをテストすると私のプログラムは2000^5 + 1 = 2000^5になります。それは問題です。

+2

あなたはhttps://en.wikipedia.org/wiki/Fermat%27s_Last_Theoremを知っていますか? – luk2302

+0

確かに、私は知っています。私はhttps://en.wikipedia.org/wiki/Euler%27s_sum_of_powers_conjectureに反例を見つけようとしており、n = 5で動作させていますが、丸め誤差のためにn = 4で動作させることはできません'20k^4 + 1 = 20k^4 'である。 – sixtytrees

+0

プリミティブ型は、表現可能な値の範囲が限定されており、float/doubleの場合に値を表現できる精度も制限されています(n> 2^52以上の整数値の場合はn == n + 1 *真*になる)。たとえば、次のような任意の精度タイプを使用するように切り替える必要があります。 BigIntegerはこれらの制限を克服します(ただし、パフォーマンスに著しい落ち込みが予想されます)。 – Durandal

答えて

-2

JavaでBigInteger libを使用するようにしてください。

+4

それは* "なぜ" *に答えません。そしてもっと詳しく教えてください。 (downvoterではない) – luk2302

+1

トラック@Johnに戻るには - あなたの答えはとても低いです。今まであなたはその状況を修正していないので、あなたは今*私にダウンハンドをもらっています。話題の言葉を叫ぶだけで、OPのための助けになるかもしれないが、それでも悪い答えが残る。OPが最初に間違っていたことと、その状況が 'BigInteger'を使ってどのように変更できるのかを説明してください。 – luk2302

+0

@ luk2302自分で良い答えを書いてみませんか?例を提供するだけですか? – sixtytrees

0

あなたの問題は、long型とdouble型が行うことができます(正確に定義されています)と方程式の純粋な数学的見解の不一致です。

プリミティブ型には、表現できる値の範囲が限られています。それはあなたの計算を引き上げるものです。 longは、Long.MAX_VALUE(2^63-1)とLong.MIN_VALUE - (2^63)の範囲の値を表すことができます。ダブルタイプは、より広い範囲を表すことができますが、精度はです。倍精度として表現される整数は、最下位(2進)桁を上回る2^52までしか正確に表現できません。これらの型はメモリ内で64ビットの固定サイズを持ち、それらのビットでは2^64以上の状態を表すことが不可能なためです。

問題の解決策は、これらの型を使用するのではなく、切り捨てまたは丸めを行わずに大量の数値を表すことのできる任意の精度型です。この目的のためにBigIntegerクラスとBigDecimalクラスがあります。 BigDecimalはとなり、ラウンドとなります(例:1/3を表すことはできません)。ラウンドする場所を選択するだけです。

また、これらはオブジェクト型です。つまり、方程式を書くことができないため、それらのメソッドを呼び出して演算を実行する必要があります。利用可能な操作もやや制限されており、解決するためにいくつかの問題を再配置する必要があります。

編集:long型とdouble型の動作に固有のJavaはありません。と全く同じ問題があります。同じ型を提供する言語です。ダブルビヘイビアは指定された標準(IEEE-754)であり、longsプロパティは2の補数ルール(およびそのサイズは64ビット)によって決定されます。

+0

私はジョンのコメントから得ました。 BigIntegerとはどのように連携しますか?私は 'BigInteger a = 1;'を試みましたが、コンパイルはしません。 – sixtytrees

+0

@sixtytrees私が書いたように、方程式を書くのではなく、それらのメソッドを呼び出さなければならないので、それを文書化するjavadocがあります。それだけでは簡単な検索では、次のようなサンプルコードが見つかります:http://compsci.ca/v3/viewtopic.php?t=13193 – Durandal

関連する問題