の中に書かれたコードは、私は、これはプログラミングで扱いやすい問題があるとは思わないのです。あなたのコードが遅い理由は、内部の数字が非常にと急成長するため、pythonは無限精度の整数を使用するため、結果を計算する時間がかかります。
倍精度の浮動小数点数で、あなたのコードを試してみてください。
は
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]
より小さくなります第1項の下限は第2項と比較して常に重要ではない)。、値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メガバイト以上かかることになります。
これらの整数を正確に処理しようとしているとすれば、時間がかかる理由と、なぜアプローチを再考すべきかを理解できます。あなたはその膨大な数を計算することができますか?あなたはそれで何をしますか?あなたのスクリーンにその数字を印刷するのにどれくらいの時間がかかりますか?これは決して簡単なことではないので、紙面で問題を解決しようとしたり、その問題を回避しようとすることをお勧めします。
あなたはあなたの問題があるいかに難しいかの感覚を得るためにpythonで、このような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)
これはしばらく時間がかかるだろうが、それはあなたを記入します画面ではQ[k]
の明示的な式がb0
のみをパラメーターとしています。正確な結果を得るためには、そのモンスターにあなたの値を代入する必要があります。また式の上にsym.simplify
を試すこともできますが、意味のある何かを返すのを待つことができませんでした。
私はあなたのループを実行して終了しました。結果はそうk=28
のための私の下限は、おそらく指数のオフによって-1のエラーに、少し大きい
>>> import math
>>> print(math.log10(c))
49287457.71120789
を持っています。この整数を格納するために必要なメモリは、約20 MBである
>>> import sys
>>> sys.getsizeof(c)
21830612
です。
「それは長すぎる」とはどういう意味ですか? –
@RoryDaultそれは本当にあります:数字が大きくなり、無限精度のpython intsが遅くなることがあります:) –
@AndrasDeak 0.68秒です。アンドロイドにとっては、それはほぼ永遠です... – ewcz