京大Python教科書 平方根を求める 計算方法を変えてみた
前回の記事の続きである。
前回は、0.00000001を1億4142万1356回足し算して、2の平行根を探したわけである。これでもできないわけではないが、40秒もかかってしまう。
これは、あまりにも、あまりにも、長い!
というわけで別の案を考えた。
なんとなく、京大Python教科書はほったらかしの体だ。いつか戻ります(笑)。
こういうのはどうだろう
2の平方根を探すにあたって、まず、1の位から始める。
0の2乗は0
1の2乗は1
2の2乗は4
なので1の位は1であるはずである。
2を2乗すると目的の2を超えてしまうからだ(2ばっかりで何がなんやらな日本語だ)。
とにかく、1の位は決まった。
次は、0.1の位を考えてみる。
手計算では面倒であり、心許なくもあるので表計算に頑張ってもらう。
1.5の平方数は2.25。
これは2を超えてしまっている。
従って、0.1の位は4である。
これで、小数第1位まで求まった。
では、0.01の位。
同じ理屈で、1.41。
・・・
というようなことを繰り返していけばよい。
1桁を得るのに計算する回数は最大で10回。
10桁を求めたとしても、なんと、100回ですむ。
1億4142万1356回が、100回に短縮されるわけである。
これはスゴい!
というわけでプログラミングしてみる。
プログラミングしてみた
コードは次の通りである。
def root_digit(square, first, step):
r = first
for i in range(1, 10, 1):
if square < ((r + step) * (r + step)):
return r
r += step
def root(square):
r = 0
step = 1
for i in range(1, 10, 1):
r = root_digit(square, r, step)
step = step / 10
print('{:.15f}'.format(r))
return r
root2 = root(2)
print('{:.15f}'.format(root2))
・・・。
なんとなく、もっさりしたコードやなぁ。
「もっさりしたコード」がどういうコードかと聞かれても困るけど。
強いて言えば、変数が多すぎる感じ?
なんとなく再帰呼び出しもできそうな感じでもある。
という不満はあるものの、とにかく動く。
実行結果はこうなる。
1.000000000000000
1.400000000000000
1.410000000000000
1.414000000000000
1.414200000000000
1.414210000000000
1.414213000000000
1.414213500000000
1.414213560000000
1.414213560000000
まだ計算していない桁(1.41421356の後ろ)は綺麗に0になってるし。前回の計算ではここがよくわからない数値になっていた。
0.00000001ずつ足しているのに
1.414213569772496という結果になっていたわけで、後半の「9772496」とは何ぞやという感じであるが、これがいわゆる「丸め誤差」というものである。この「丸め誤差」とやらに足を踏み入れると抜け出せなくなるので、潔くスキップする。
とにかく、今回はこの丸め誤差にうんざりさせられずに済んだわけだ。
アルゴリズムとは何ぞや
前回は、0.00000001ずつ足し算しながら2の平方根を探した。
こんな感じだ。
0.00000001
0.00000002
0.00000003
:
1.41421356
今回は各位毎に決定していった。
こんな感じだ。
0.00000000
1.00000000
1.10000000
1.20000000
1.30000000
1.40000000
1.41000000
1.42000000
1.42100000
:
これをアルゴリズムの違いという。
アルゴリズムというのは、プログラミングで解を得るための方法である。2の平方根を求めるだけでも、その方法はいろいろとある。すなわち、アルゴリズムはいろいろとある、ということになる。
コンピュータで何かを解くといった場合、例えば二次方程式を解くような場合だと、人が「二次方程式を解く」というのとは違って、コンピュータでは「二次方程式の解を探す」という感じに近い。そして、如何に速く、効率よく、そして精度の高い解を探すことができるのか。そこが問題になる。
今回のように平方根を探すような数値計算の場合でも、アルゴリズムによって速さが違ったり精度が違ったりする。
ちなみに、
「2の平方根を求める」というのは、
「x^2-2=0」という方程式を解いていることに等しい。
(x^2は、xの2乗を意味する)
いろいろなアルゴリズムを見るのも結構面白い。
ちなみに、京大Python教科書の平方根の求め方は、先に書いた2つの方法のどちらとも違う。すなわち、第3のアルゴリズムということになる。興味があれば見てください。
(つづく)
続きはこちら。
この記事が気に入ったらサポートをしてみませんか?