楽しくなってきたんで続けます。
会社のプログラム見ていたら、平方根を求める関数があったので、
Pythonで書いてみました。(中略)
reduceを使えば、2行で書けることが判明しました…!
なんと便利な。早速真似して僕も実践。Newton法を用いてある数の平方根を求める関数mysqrtを作成する。繰り返しの回数が精度を決めるが、とりあえず10回を初期値としておく。
mysqrt.py
from __future__ import division def mysqrt(x,loop=10): return reduce((lambda a,x: a - (a**2 - x) / (2 * a)),[x]*loop)
実行結果。
>>> mysqrt(2) 1.4142135623730951 >>> mysqrt(3) 1.7320508075688772 >>> mysqrt(5) 2.2360679774997898 >>> mysqrt(10) 3.1622776601683791 >>> mysqrt(625) 25.0 >>> mysqrt(1024) 32.000000000000803
from __future__ import divisionをきちんと書かないと、割り算の結果が全て切り捨てられてしまうのでご注意を。今気付いたけど、これだと繰り返し9回が初期値か。まあいいや。
何年ぶりかに手書きでもニュートン法を計算してみましたが、プログラムのありがたさがよく分かります。
ちなみに以下のようにmathモジュールをインポートしても、sqrt関数が使えないんだけど何でなんだろう。マニュアル見てもこれで良さそうなのだが。
>>> import math >>> sqrt(10) Traceback (most recent call last): File "<pyshell#56>", line 1, in -toplevel- sqrt(10) NameError: name 'sqrt' is not defined
追記:
ちなみに同じ関数をループ使って書くとこんな感じになった。やっぱりスマートじゃないな。
def mysqrt(x): a = x cnt = 0 while cnt < 10: a = a - (a**2 - x) / (2 * a) cnt += 1 return a