- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:計算量の少ないn乗根の求め方)
計算量の少ないn乗根の求め方
このQ&Aのポイント
- C++でクラスのインスタンスaのN乗根を求める関数を作成しているが、実行時間が長くなる問題がある。
- ニュートン法を使用しているが、累乗計算の部分で時間をロスしている。
- 累乗計算を使用せずにN乗根を求める方法や、計算量の少ない累乗計算の方法を知りたい。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ああ, そういうことですね.... じゃあ, (非負整数乗に限定して) べき乗を高速化する方法で: 普通は 2乗と乗算を組合せる方法を使うと思います. 「ロシア乗算」などと言われる方法のべき乗版です. 例えば double pow2(double x, unsigned int n) { double ans = 1; while (n) { if (n % 2) { ans *= x; } x *= x; n >>= 1; } return ans; } でしょうか. 全ての n に対して最適ということではない (n = 15 だと「3乗してから 5乗」の方が速い) のですが, たかだか log n 回の 2乗と同じくたかだか log n 回の乗算からなり, ほぼ最適です.
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
回答No.1
「クラスを使っている関係上 pow などの既存の関数は使えません」は謎だなぁ. その理由は?
質問者
補足
作成中のクラスは簡単にまとめると精度を任意に指定できるC#のDecimalのようなクラスです。 doubleに変換も一応はできるのでpowを使おうと思えばできるのですが、double以上の精度の場合丸め誤差が発生してしまうため使えないのです。
お礼
確認しました お陰様でほぼ問題のないレベルの速さにすることができました やはりオーダーがnからlognになると格段に速さが違います ありがとうございました
補足
なるほど、これは速そうですね。 ちょっと現在別のことで忙しいため確認できませんが、今週中くらいに試してみます。