高速指数演算(Fast Exponentiation)の詳細解析
| 手法 | 時間計算量 | 空間計算量 | n=1000の場合の計算回数 |
|---|---|---|---|
| 単純な反復 | O(n) | O(1) | 1000回 |
| 高速指数演算 | O(log n) | O(log n) | 約10回 |
n < 0 の場合
x = 1/x, n = -n
exp === 0
return 1
exp % 2 === 0
half² を返す
exp % 2 === 1
base × fastPow(base, exp-1)
独自の値でテストしてみましょう:
奇数の指数は2で割り切れないため、直接半分にできません。そこで「1つ分を取り出して」偶数にします。
x^5 = x × x^4
x^7 = x × x^6
x^9 = x × x^8
n-1 は必ず偶数になる
→ 次のステップで半分に分割可能
2^5 = 2 × 2^4
2^4 = (2^2)^2 = 4^2 = 16
結果: 2 × 16 = 32
負の指数は「逆数の正の指数」として計算できます。
x^(-n) = 1 / x^n
= (1/x)^n
2^(-3) = 1 / 2^3
= (1/2)^3
= 0.5^3
負の指数を正に変換
→ 同じロジックで処理可能