二乗による累乗が O(log n) 乗算になる方法がわかりません。
log n 以上の乗算を行うことになるようです (n は指数のサイズです)。
例:
power(2,8)
/ \
pow(2,4) * pow(2,4)
/ \ / \
pow(2,2) * pow(2,2) pow(2,2) * pow(2,2)
/ \ / \
p(2,1)*p(2,1) p(2,1)*p(2,1) p(2,1)*p(2,1) p(2,1)*p(2,1)
これは、通常の累乗と同様に、7 つの乗算です。
私が試した方法は以下の3つです。
long pow(int base, int exp)
{
if(exp == 1)
return base;
else
return base * pow(base, exp-1);
}
long pow2(int base, int exp)
{
if(exp == 1)
return base;
else if(exp == 0)
return 1;
else
if(exp % 2 == 0)
return pow2(base * base, exp/2);
else
return base * pow2(base * base, exp/2) ;
}
long pow3(int base, int exp)
{
if(exp == 1)
return base;
int x = pow2(base,exp/2);
if(exp%2 == 0)
return x*x;
else
return base*x*x;
}
再帰が底をつくと、同じ数の乗算が実行されるようです...