2010-11-10

問題1.26

オリジナルの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)。

1 件のコメント:

  1. 感覚的に計算量が増えるのはすぐ分かるけど、そこからきちんと説明するのはとても難しい。何度も何度も何度も、書いて、勘違いに気付いて書き直して、を繰り返した。正直、正しいかは自分でも自信がない。見落としや勘違いがありそう。安直な解答なら、脚注にlog2(n)って書いてあるから、2^log2(n)でn、で良いんだろうけども。

    返信削除