2016-06-26 3 views
0

^5 + 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); 
      } 
     } 
    } 

나는 오일러의 추측의 반례를 찾고 있어요. 나는이 방법을 사용하여 다섯 번째 힘을 얻었으며, 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에 counterexample을 찾으려고 노력 중입니다. n = 5에서 작동하지만, 반올림 오류로 인해 n = 4에서 작동하지 않습니다. '20k^4 + 1 = 20k^4'. – sixtytrees

+0

프리미티브 유형은 표현할 수있는 값 범위가 제한되어 있으며 float/double의 경우 값을 표현할 수있는 정확도도 제한됩니다 (n> 2^52 이상의 정수 값의 경우 n == n + 1 * true *가됩니다). 예를 들어 다음과 같은 임의의 정밀도 유형을 사용하도록 전환해야합니다. 이러한 한계를 극복하기위한 BigInteger (성능이 크게 저하 될 것으로 예상). – Durandal

답변

-2

Java에서 BigInteger lib를 사용해보십시오.

+4

* "이유"*에 대한 답변이 없습니다. 그리고 더 자세히 설명해주세요. (downvoter가 아님) – luk2302

+1

트랙 @ John으로 돌아가려면 매우 낮은 품질입니다. 당신이 지금까지 그 상황을 고치지 않았기 때문에 당신은 * 지금 * 내게도 downvote가 있습니다. 그냥 buzz 단어를 외치는 것은 OP에 도움이 될지 모르지만 여전히 나쁜 대답을 남깁니다.OP가 처음에 잘못되었을 때와 그 상황을 어떻게 'BigInteger'를 사용하여 바꿀 수 있는지에 대한 설명을 포함하십시오. – luk2302

+0

@ luk2302 왜 스스로 좋은 대답을 쓰지 않습니까? 예제를 제공하기 만하면됩니까? – sixtytrees

0

문제는 long 및 double 유형이 수행 할 수있는 (정확하게 수행되도록 정의 된) 것과 방정식에 대한 순전히 수학적 관점의 불일치입니다.

기본 유형에는 표현할 수있는 제한된 값 범위가 있습니다. 그게 뭐야 계산 해드립니다. Long는 Long.MAX_VALUE (2^63-1) 및 Long.MIN_VALUE - (2^63) 범위의 값을 나타낼 수 있습니다. double 유형은 의 더 큰 범위를 나타낼 수 있지만 정확도는입니다. double 형으로 표현 된 정수는 2^52까지만 표현 가능하며, 최하위 (2 진수) 이상의 숫자는 제외됩니다. 왜냐하면 이러한 유형은 메모리에서 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