0

ループの速度が線形であると仮定して、平均的なコンピューターでこのコードを実行するのにかかるおおよその時間を計算する必要がありました (私の先生はそれを仮定するように言いました。それが真実ではないことは知っていますが、私たちは初心者なので.. ):

num = 2**100
cnt = 0
import time
t0 = time.clock()
for i in range(num):
    cnt = cnt+1

t1 = time.clock()
print("running time: ", t1-t0, " sec") 

3時間待っても何も得られなかったので、人々が私にアドバイスしたように、より小さな入力で計算しました: 2**20. これには 0.24478681215692052 秒かかりました。

ここで、同じ結果が得られると思われる 2 つの方法で計算を続けようとしましたが、そうではありません。

  1. ループの速度が線形であると仮定すると、計算する2**100には を計算するだけ(0.24478681215692052)^5です(2**20)**5 = 2**100

    私が得た結果は次のとおりです: 0.000878901251447358 秒 (これは実際には論理的ではありません)

  2. 別の方法を試しました:

    • 2**20- 0.24478681215692052 秒
    • 2**100- ?

    次のように乗算します。

    2**100 * 0.24478681215692052 / 2**20
    

    そして得た: 296101054897497890198453.29788130608283648 秒この計算機を大きな数に使用して.

2つの異なる答えが得られる可能性はありますか? どちらも本当に論理的に見えませんか?

4

1 に答える 1

1
    x**y * x**z = x**(y + z)

証明しよう

    x**y + x**z = (x * ...y times... * x) * (x * ...z times... * x) = 
    = (x * ...y+1 times... * x) * (x * ...z-1 times... * x) = 
    = ... = (x * ...y+z times... * x) = x**(y + z)

それが理由です

    2**100 = 2**(20 + 80) = 2**20 * 2**80

そう、

    f(2**100) = f(2**20) * 2**80 = 0.24478681215692052 * 0.24478681215692052 =
    = 2.9592909751765742e+23 seconds
于 2013-10-25T17:18:08.053 に答える