オリジナルのexpmodにおいて、(evenp exp)が成り立つexpmodの呼び出しの数をaとすると、
なので、
(oddp exp)が成り立つexpmodの呼び出しの数をbとすると、
であるから、
(zerop exp)が成り立つexpmodの呼び出しは一回限りなので、expmodの呼び出しの合計は、
であり、プロセスはΘ(log n)。
これに対し、Louisのexpmodでは、まず、(evenp exp)が成り立つexpmodの呼び出しの数は、
(evenp exp)が成り立つごとにプロセスが二方向に分岐するため。
次に、(oddp exp)が成り立つexpmodの呼び出しの数はn。プロセスの過程でexpが1/2になるごとに、(oddp exp)が成り立つ呼び出しの数が2倍になり、結果的にnと等しくなる。
最後に、(zerop exp)が成り立つexpmodの呼び出しの回数は2a。本来プロセスの中で一回だけのものが、最終的に(evenp exp)が成り立つexpmodの呼び出しの数だけ2倍になる。
これより、Louisのexpmodでのexpmodの呼び出しの合計は、
となり、nに比例し、プロセスはΘ(n)。
感覚的に計算量が増えるのはすぐ分かるけど、そこからきちんと説明するのはとても難しい。何度も何度も何度も、書いて、勘違いに気付いて書き直して、を繰り返した。正直、正しいかは自分でも自信がない。見落としや勘違いがありそう。安直な解答なら、脚注にlog2(n)って書いてあるから、2^log2(n)でn、で良いんだろうけども。
返信削除