입니다. 코드가 느린 이유는 숫자가 으로 매우 빠르게으로 증가하고 파이썬은 무한 정밀도 정수를 사용하기 때문에 결과를 계산하는 데 시간이 걸립니다.
배정 밀도 수레와 코드를보십시오 :
이
a=0.0
b=1.0
for i in range(28):
c=(a+b)*(a+b)
a=b
b=c
print(b)
대답은 inf
입니다. 이는 대답이 가장 큰 표현 가능한 배정 밀도 숫자 인 rougly 10^308보다 훨씬 크기 때문입니다. 유한 정밀도 정수를 사용해 볼 수도 있지만, 표현할 수있는 최대 값은 훨씬 작습니다. 복식을 사용하면 정밀도가 떨어질 수 있지만 분명히 당신의 huuuge 번호의 모든 한자리 수를 알고 싶지는 않습니다 (보조 메모 : I happen to know that you do, 직장을 더욱 어렵게 만듭니다).
그래서 여기 내 회의론에 대한 몇 가지 수학 배경 : 당신이 해결할 수있는 경우
P[k] = sqrt(Q[k])
P[k] = P[k-2]^2 + P[k-1]^2
: 귀하의 재발 관계가
Q[k] = (Q[k-2] + Q[k-1])^2
당신은이 순서의 제곱근에서 더 다루기 쉬운 순서를 공식화 할 수 있습니다 간다 P
의 경우 Q = P^2
을 알게 될 것입니다. 이제
,이 순서 고려해
R[k] = R[k-1]^2
같은 초기 값에서 시작을, 이것은 항상
P[k] = P[k-2]^2 + P[k-1]^2 >= P[k-1]^2
때문에, P[k]
보다 작아야합니다 (그러나 이것은 "아주 가까이"입니다 첫 번째 용어와 같은 하한은 두 번째 용어와 비교할 때 항상 중요하지 않습니다., 값 2
R[k] = R[k-1]^2 = R[k-2]^4 = R[k-3]^6 = R[k-m]^(2^m) = R[0]^(2^k)
P[1 give or take]
부터 시작, 우리는 P[k]
에 대한 하한으로
R[k] = 2^(2^k)
을 고려해야한다 제공하거나 이것이 k=28
2. 몇 지수를 가지고 : 우리는이 순서를 만들 수 있습니다 squar가 P
의 최종 값에 대해 적어도 80807124
숫자이다
P[28] > 2^(2^28) = 2^(268435456) = 10^(log10(2)*2^28) ~ 10^80807124
당신이 찾고있는 번호의 루트. 이로 인해 Q[28]
은 10^1.6e8
보다 커집니다. 이 번호를 텍스트 파일에 인쇄하면 150 메가 바이트 이상이 소요됩니다.
이러한 정수를 정확히 처리하려고한다고 생각하면 왜 그렇게 오래 걸리는 이유와 왜 접근 방식을 재고해야하는지 알 수 있습니다. 그 엄청난 숫자를 계산할 수 있다면 어떨까요? 너는 그걸로 무엇을 할 것인가? 화면에 그 숫자를 프린트하는 데 파이썬이 얼마나 걸릴까요? 이 중 어느 것도 사소한 것이 아니므로, 종이에 문제를 해결하거나 문제를 해결하는 방법을 찾으십시오. 당신이 파이썬에서 sympy
와 같은 상징적 인 수학 패키지를 사용할 수 있습니다
참고 문제가 얼마나 힘든 느낌 얻을 :
import sympy as sym
a,b,c,b0 = sym.symbols('a,b,c,b0')
a = 0
b = b0
for k in range(28):
c = (a+b)**2
a = b
b = c
print(c)
이 시간이 걸릴 것이다, 그러나 그것은 채울 것이다 화면에서 b0
을 매개 변수로 사용하는 Q[k]
의 명시 적 표현식을 사용하십시오. 정확한 결과를 얻으려면 그 몬스터로 값을 대체해야합니다. 표현식에 sym.simplify
을 시도해 볼 수도 있지만 의미있는 결과를 반환 할 때까지 기다릴 수 없습니다.
점심 시간 동안 나는 루프를 돌리고 완료되었습니다. 그 결과가
>>> import math
>>> print(math.log10(c))
49287457.71120789
그래서 내 낮은 k=28
위한 행 조금 큰, 아마도 오프별로 한 지수의 오류. 이 정수를 저장하는 데 필요한 메모리는 대략 20MB 인이 정수를 저장하는 데 필요한 메모리는
>>> import sys
>>> sys.getsizeof(c)
21830612
입니다.
"너무 오랫동안 말하고있다"는 것이 무슨 뜻입니까? –
@RoryDaulton 정말 그렇습니다 : 숫자가 커지면 무한 정밀도의 파이썬 ints가 느려질 수 있습니다. –
@AndrasDeak 0.68 seconds sir. 안드로이드에 대한 그것은 거의 영원한 것입니다 ... – ewcz