S = 1 + 1/2 + 1/3 + 1/4 +…. + 1/n………. というの。n –>∞だと 1/n –> 0 なのだから和は収束すると思ったらしないのだった。
S = 1 + 1/2 + 1/4 + 1/8 + …. これは収束する。
で、S = 1 + 1/2 + 1/3 + 1/4 +…. + 1/n………. を計算してみよう。てなわけでC/C++,Go言語、Julia言語、Pythonでやってみた。n = 1億ぐらいまでfor loopで回す。10億もやったが時間がかかりすぎるの矢田亜希子でヤダ。コンパイラとインタプリタの差が明確でしたわ。
で、Pythonには逆数和を求める関数があると知って試した次第である。
myData = np.arange(1.0,100000001.0,1.0) # 1億まで ここ整数だとダメなのよよん
inverse_myData = np.reciprocal(myData) # 逆数を計算
sum = np.sum(inverse_myData) # 逆数の和
print("sum = ", sum)
これがPythonの便利なところ。for loop要らん。素晴らしい!! C/C++並みに速いである。
よっしゃ、ならば 1兆まで計算してグラフだして収束はしないにしてもグラフの傾きはどうなるか見ようっと・・・・・
だが、ここで単純にエラーが出るのであった。np.arange( )でデータを10億まで用意するとメモリ食い過ぎてエラーですわ。DELL OPTIPLEX 7010SFF Win 11(非推奨PC) 22H2( Mem 12GB)では10億でもエセーが出た。8GB弱のデータになって割当て出来んと言われたのである。
うーむ。するってーと1超までの和だと・・・・for loop回して数時間 我慢するか(笑) しねーよん。
このようにfor loop使わないですむのだが代わりにメモリ大食いするってことを体験した次第である。
では、1兆まで計算する方法で最短時間での計算方法は? for loop 回してから散歩に出るとよかろう。帰ってきたら終わっているかもしれぬであるぞう。
てなわけで賢人が開発したであろう手法を探すとするか。
ちなみに上の問題は高校数学での話みたい。発散する証明がある。抽象的な思考が得意ならばトライするがよかろう(笑) ワタクシは実際の数字でどうなるかに興味があったのであーーーる。
posted by toinohni at 09:45| 東京 ☀|
Comment(0)
|
ソフト系雑学
|
|