[SML 7879] Re: 連想計算というリフレクティブな手法
Masato Sumi
sumi @ seagreen.ocn.ne.jp
2010年 12月 16日 (木) 00:46:48 JST
成田さん。解説ありがとうございます。sumim です。
とりあえず大枠の部分だけですが、だいたい分かりました。
たとえば、Squeak で組み込みのなんちゃって Matrix において
Matrix >> raisedTo: n
| m |
n = 1 ifTrue: [^self].
n even ifTrue: [^(m := self raisedTo: n/2) +* m].
^(self raisedTo: n - 1) +* self
を定義しておけば、
| fibonacci |
fibonacci := [:n |
| T |
T := Matrix rows: 2 columns: 2 contents: #(1 1 1 0).
((3 to: n) inject: T into: [:Tn :idx | Tn +* T]) +* #(1 0) at: 1].
[fibonacci value: 10000] timeToRun "=> 758 ms "
というところを
| fibonacci |
fibonacci := [:n |
| T |
T := Matrix rows: 2 columns: 2 contents: #(1 1 1 0).
(T raisedTo: n - 1) +* #(1 0) at: 1].
[fibonacci value: 10000] timeToRun "=> 7 ms "
のように高速化できるということですね。
2010年12月15日17:04 Narita Takaoki <Narita.Takaoki @ exc.epson.co.jp>:
> 大枠は、特定の条件を満たした繰り返し作用に対する「逐次平方」の適用で
> す。フィボナッチ数列への適用は、フィボナッチと逐次平方でググると出てくる
> かな?
SML メーリングリストの案内