C言語関係掲示板

過去ログ

No704 べき乗の計算で場合わけ

[戻る] [ホームページ]
No.8305

べき乗
投稿者---キャット(2003/07/12 22:26:30)


過去ログを見たのですがべき乗の計算で場合わけで
g(x,y)=1 (y=0のとき)
g(x,y)=g(x*x, y/2) (yが偶数のとき)
g(x,y)=g(x*x, (y-1)/2) (yが奇数のとき)
で 偶数 奇数のときの計算式がなぜこのように考えられるのかがわからないのですがおしえてください。

No.8307

Re:べき乗
投稿者---nop(2003/07/12 22:30:29)


>過去ログを見たのですがべき乗の計算で場合わけで
>g(x,y)=1 (y=0のとき)
>g(x,y)=g(x*x, y/2) (yが偶数のとき)
>g(x,y)=g(x*x, (y-1)/2) (yが奇数のとき)
>で 偶数 奇数のときの計算式がなぜこのように考えられるのかがわからないのですがおしえてください。

それは C 言語の問題と言うより数学の問題では?

No.8433

Re:べき乗
投稿者---かずま(2003/07/16 16:27:43)


過去ログをよく読みましたか?
その式は間違っています。正しくは、

g(x,y) = 1                     (y = 0 のとき)
g(x,y) = g(x*x, y/2)           (y が偶数のとき)
g(x,y) = x * g(x*x, (y-1)/2)   (y が奇数のとき)

意味は、具体例を考えれば分かるでしょう。

x の 0乗は、1。       (y = 0 のとき)

g(x,6) = g(x*x,3)     (y が偶数のとき)
すなわち、x * x * x * x * x * x = (x*x) * (x*x) * (x*x)

g(x,7) = x * g(x*x,3) (y が奇数のとき)
すなわち、x * x * x * x * x * x * x = x * ((x*x) * (x*x) * (x*x))

この説明で納得できますか。

x の 6乗を求めるのに掛け算を 5回しないといけないが、
g(x,6) = g(x*x,3) で、掛け算が 3回で済みますよ、ということです。


No.8436

Re:べき乗
投稿者---たいちう(2003/07/16 18:23:34)


> g(x,y) = 1                     (y = 0 のとき)
> g(x,y) = g(x*x, y/2)           (y が偶数のとき)
> g(x,y) = x * g(x*x, (y-1)/2)   (y が奇数のとき)

この式で再帰関数を作ると、
 
g(x,6) = g(x*x,3) 
       = (x*x) * g((x*x)*(x*x), 1)
       = (x*x) * ((x*x)*(x*x)) * g(((x*x)*(x*x))*((x*x)*(x*x)), 0)  ...(A)
       = (x*x) * ((x*x)*(x*x)) * 1
       = (x*x) * ((x*x)*(x*x))                                      ...(B)

(A)から(B)への推移を工夫しないと y=6 程度では掛け算の回数は増えてしまいますね。
もっと大きい y については確実に減るのでしょうが。


No.8439

Re:べき乗
投稿者---かずま(2003/07/16 19:13:57)


> (A)から(B)への推移を工夫しないと y=6 程度では掛け算の回数は増えて
> しまいますね。

そうですね。その工夫ですが、
    g(x,y) = x  (y = 1 のとき)
を追加するだけでよさそうです。