• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:計算量の少ないn乗根の求め方)

計算量の少ないn乗根の求め方

このQ&Aのポイント
  • C++でクラスのインスタンスaのN乗根を求める関数を作成しているが、実行時間が長くなる問題がある。
  • ニュートン法を使用しているが、累乗計算の部分で時間をロスしている。
  • 累乗計算を使用せずにN乗根を求める方法や、計算量の少ない累乗計算の方法を知りたい。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.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 回の乗算からなり, ほぼ最適です.

temp5963
質問者

お礼

確認しました お陰様でほぼ問題のないレベルの速さにすることができました やはりオーダーがnからlognになると格段に速さが違います ありがとうございました

temp5963
質問者

補足

なるほど、これは速そうですね。 ちょっと現在別のことで忙しいため確認できませんが、今週中くらいに試してみます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「クラスを使っている関係上 pow などの既存の関数は使えません」は謎だなぁ. その理由は?

temp5963
質問者

補足

作成中のクラスは簡単にまとめると精度を任意に指定できるC#のDecimalのようなクラスです。 doubleに変換も一応はできるのでpowを使おうと思えばできるのですが、double以上の精度の場合丸め誤差が発生してしまうため使えないのです。

関連するQ&A