読書会メモ 第2回 及び 第3回


先週末はネット環境にいなかったため、本日までの2回分まとめてメモを残します。


●消化内
【第2回】第1章 第2節 手続きとその生成するプロセス(p20〜p24)
【第3回】第1章 第2節 手続きとその生成するプロセス(p24〜p31)


●メモ
第1章第1節でSchemeの基本的な文法や特殊形式が解説された後、この第2節では様々な数学的アルゴリズムとそれにより生成されるプロセスについて述べられている。効率のいいアルゴリズムとは何か、如何にしてそのようなアルゴリズムを生み出せるのかを学ぶための節。この節を読んで、初めてアルゴリズムの本質に触れた気がした。ただし、自分の場合、数学の基礎知識がおぼつかないこと、再帰アルゴリズムの構成をまだ体で覚えていないことが足を引っ張り、理解するのに大変な時間がかかる。補助的な書籍を読みながら、だんだんと数学の知識を戻しつつあるが、まだまだ全然足りない。


増加の程度

ある関数F(n)への入力が増加していったとき、「プロセスのステップ数」と「必要とされる計算空間(スペース)」が増加する程度は以下の4種類に分類できる(下へ行くほど効率的)。

1. 指数的増加(α^n に比例)
2. 多項式的増加(n に比例)
3. 対数的増加(log n に比例)
4. 定数的増加(α に比例)


数学的世界では1番と2番の間に大きな線引きがなされる。すなわち、1は遅い、2〜3は充分速いと見なす。判断の根拠はアルゴリズムが実用に堪え得るかどうか(指数的増加を示すアルゴリズムは、容易に現実性を超えた量のステップ数を要求するようになる)。
一方、私たちが身を置く業務システムの世界では当然、よりシビアな線引きがなされる。データ件数に比例して応答時間が遅くなるシステムでは使い物にならない。


具体的に取り上げられていた例題は以下。

[Fibonacci数列のn番目の数を求めるアルゴリズム

木構造再帰の実装により生成されるステップ数は指数的増加を示し、反復的再帰の実装によるステップ数は多項式的増加を示す。指数的爆発の影響力がいかに大きいかが明らかになる。

[α^n(べき乗)を求めるアルゴリズム

直感的にはαをn回掛けるアルゴリズムが採用され、当然これはステップ数、スペース共にnに線形(つまり多項式的)な増加を示す。
一方、逐次平方(下記参照)を利用したアルゴリズムの実装はステップ数、スペース共にnに対数的な増加を示す。これは、再帰的計算プロセス内部において、(nが偶数でわたってくる度に)べき乗アルゴリズムのステップ数の根拠たる指数nを半分に減らすことが可能だからである。

逐次平方
α^n = (α^n/2)^2 = (α^2)^n/2 (nが偶数の場合)

α^n = α・α^n-1 (nが奇数の場合)

[逐次平方の応用]

当初木構造再帰で実装していたFibonacci数の計算式や、Fermatテスト(素数性テスト)を、逐次平方を応用し対数的ステップ数を生成するアルゴリズムとして実装可能であることを学ぶ。



●その他
数学の感覚が少しもどってきたので、ようやくポリアの『いかにして問題をとくか』を抵抗なく読み始められそう。。

いかにして問題をとくか

いかにして問題をとくか


数学ガールでも推薦図書に名を連ねていたので、是非読んでみようと思う。