reduce関数でニュートン法

楽しくなってきたんで続けます。

ゲームプログラムめも日記:平方根

会社のプログラム見ていたら、平方根を求める関数があったので、
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