逐次計算で平方根、立方根を求める

北海道大学 北村正直

 先ごろ、中村さんの「ルートを開こう」という記事がこの"数学のいずみ"に掲載されました。今は手軽に電卓が使えるようになり、小学生でもそれに頼っています。それはそれなりに良いことです。しかし、昔のように紙の上で手で計算をする経験は数に対する概念の形成という点でも、さらに数学的思考の育成という面でも生徒にとり非常に大切だと私は思っています。中村さんの記事はとてもまとまっており、平均的な高校生でも直ぐに理解できる、優れた教材だと感心いたしました。

 私も別な角度から生徒の計算練習になり、数列の収斂を実感できる実習問題を紹介いたします。1962年に海外留学から帰国した私は、国際基督教大学の物理教室で、カシオという耳慣れない会社の製造したリレー式計算機に出会ったのです。この計算機は羽の付いた円盤(厚紙?)の羽を切り取ってプログラムを作る計算機でした。24ステップか28ステップのプログラムが作れました。四則演算の機能があるだけの簡単なもの(今の基準からすると)でしたが、涙が出るほど便利な機械でした。ハンドルをぐるぐる回すタイガー計算機よりもはるかに高級な機械に見えました。しかし、開平の機能も、勿論立方根も求めることはできませんでした。そこで、同じプログラムを繰り返し使って平方根を計算するプログラムを考案したのです。

 それから10年以上が経過し、北大に戻っていた私はマイコンに出会います。最初は機械語だけ、その内に簡単なBASICが付いた機械が出始めました。あるとき企業の業務用プログラムを作っていたソフト屋さんが、研究室に私を訪ねてきて平方根を求めるプログラムは作れないかと相談しました。そこでカシオのリレー式計算機で作った開平計算のプログラムを、その場で、BASICで組んで渡しました。彼らが帰った後で、HPの電卓でメモリーを利用して、手計算でこのアルゴリズムを確かめました。

 数年後に私の研究室では、リスト処理言語LAPLASという人工知能言語を開発しました。これは再帰処理ができるので、この開平プログラムと立方根を求めるプログラムを作り、この言語の学習パックの一部といたしました。それはほんの数行の簡単なプログラムです。

平方根を求める逐次計算:ある数Aの平方根を求める

 Aの平方根の第0近似値をa0と置きます。そして次の近似値a1
    a1 = (A/a0 + a0)/2
とします。一般の n+1-th 近似値は n-th 近似値より
an+1 =(A/an + an)/2
により求めます。この初期値(第0近似値)の選び方により、収束の早さは異なりますが、この近似法はかなり収束が早く、実用上は5回ぐらいで十分な値が得られます。7,8回で通常のパソコンの精度では同じ値しか得られないほどです。nを無限大にもっていった極限では、数列{an}の極限値をaとすると
    a = (A/a + a)/2
が得られます。従って
    2a2 = A + a2
これより
    a2 = A
となります。

 BASICでプログラムを作るときは、繰り返しの回数を変数として実行の最初に与えるようにしておくと効率的です。得られる数列の収斂を数学的に証明するのは高校生には期待できませんが、誤差がだんだん減少することだけは数学好きの生徒ならば証明できるでしょう。

立方根を求める逐次計算:ある数Aの立方根を求める

 平方根の場合と同様に、Aの立方根の第0近似値を a0 と置きます。そして次の近似値 a1
    a1 = (A/a02 + 2a0)/3
とします。一般の n+1-th 近似値は n-th 近似値より
    an+1 =(A/an2 + 2an )/3
により求めます。立方根の場合の収斂は平方根の場合より少し遅くなりますが、それでも実用上は十分に早い収斂が得られます。括弧の中の第一項を2倍とし、第2項は2倍としないということも考えられますが、なぜか収束が悪くお勧めできません。

   このアルゴリズムはプログラミングの実習に利用するのも面白いでしょう。なお、言語LAPLASのWindows版はまだ作っておりません。

計算の実例:3529の平方根 (電卓を使って計算)

	a0 = 100
  	a1 = (3529/100 + 100)/2 = 67.645
	a2 = (3529/67.645 + 67.645)/2 = 59.90720692586296104664054992978
	a3 = (3529/59.907 + 59.907・・)/2 = 59.407488738932143348990673805071
	a4 = (3529/59.407 + 59.407・・)/2 = 59.405386998295985359668526247912
	a5 = (3529/59.405 + 59.405・・)/2 = 59.40538696111658190081640103178
	a6 = (3529/59.405 + 59.405・・)/2 = 59.405386961116581889181866587447
	a7 = (3529/59.405 + 59.405・・)/2 = 59.405386961116581889181866587447
 上記の計算式で a3 以降は小数点以下3桁しか記入されていないが実際の計算では右辺のすべての桁を用いて計算した。これだけの桁数でも a7 で十分であることが分かる。ついでにan2を計算するといかのような結果が得られる。

	a12 = 4575.846025
	a22 = 3588.8734416581631276043647032463
	a32 = 3529.2497182663494236595990067065
	a42 = 3529.000004417313701677789652848
	a52 = 3529.0000000000000013823080415561
	a62 = 3529
	a72 = 3529