見出し画像

京大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のアルゴリズムということになる。興味があれば見てください。

(つづく)

この記事が気に入ったらサポートをしてみませんか?