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

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

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

現在C++であるクラスのインスタンスaのN乗根を求める関数を作成中なのですが、どうしても実行時間が長くなってしまいます。 現在ニュートン法に則って X(m+1)=((N-1)(Xm)^N+a)/(N*(Xm)^(N-1)) という漸化式を回して変化量が一定値以下になったら終了という関数なのですが、 値によっては累乗計算のところで時間を大幅にロスしてしまうようです。 原因としては累乗計算が同じ数をN回掛けるという単純な仕組みなため、 Nが大きすぎるとループがなかなか終わらないということがわかっています。 もしご存知であれば 1.極力累乗計算を使わないN乗根の求め方 2.計算量の少ない累乗計算の仕方 のどちらかを教えていただけないでしょうか? なお、クラスを使っている関係上powなどの既存の関数は使えません。 よろしくお願いいたします。

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

  • ベストアンサー
  • 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

  • 累乗根について

    n√aはなんと読みますか? ただし、ルートの前のnは累乗根です。 n乗根aでいいのですか? また 「n乗根a」と「aのn乗根」の違いはありますか? 累乗根すごい混乱しています。何かわかりやすいHPあったら教えてください。

  • 1のn乗根

    任意の自然数nに対し、1のn乗根は累乗根と四則だけで かけることが知られています。 (確かそうだったと思います。参考文献は示せませんが。) では、n=11のときにはどのように求めればよいのでしょうか? 高校で習うやり方では求められない最小のnです。 また、一般のnに対して求めるようなアルゴリズムはあるのでしょうか? ちなみに、Mathematica4にやらせたところ、 (-1)^(1/11)のように出力されます。

  • 数値計算 ニュートン法に関する問題です

    この問題のやり方を教えてください nの平方根をニュートン法で求める.n=1 √n が f(x)=(x^2)-n=0 の解であることを利用し、ニュートン法を用いて √n を求めるための漸化式を示せ. よろしくおねがいします 

  • 数値計算の問題です

    この問題のやり方を教えてください nの平方根をニュートン法で求める.n=1 (1) √n が f(x)=(x^2)-n=0 の解であることを利用し、ニュートン法を用いて √n を求めるための漸化式を示せ. (2) 許容誤差ε=10^(-6)、√nの値を求めるプログラムを作成.   おねがいします。

  • 4√16(四乗根16)を計算すると-2が入らないのはなぜ?

    授業で先日指数の計算をやりました。 4乗根16というものを計算するとき(n√a)に当てはめて考えると 【nが偶数でaは正の数であるとき正の数aのn乗根はn√aと-n√aである。】と書いてありました。 そう考えると4√16は±2となるような気がするのですが答えはすべて2でした。。。 な、なぜ・・・・? 初歩的な質問でホントごめんなさい。。。 回答おまちしています・・・。

  • 累乗根の話

    累乗根の話 n乗根a n√a のn は、自然数でなければいけない、と教科書には書かれてあるのですが、マイナスの整数では何か矛盾が起きるのでしょうか? たとえば、-3乗根2 などです。(添付画像参照)

  • 累乗根

    累乗根を表す、[n]√aのnは指数と 呼んでいいのでしょうか?

  • ちょっと難解な漸化式の問題です!

    ある関数の第n次導関数を求める際の計算過程で次の複雑な漸化式が出てきました。    a_(n+1)=-(n+1)×a_n+(-1)^n×n! この漸化式は一体どのようにすれば解けるのでしょうか?  ただし、a_(n+1)、a_nはそれぞれ第n+1項、第n項を表しています。

  • 原始n乗根

    FMTの話しの中に、nを偶数として、 整数ω>=2とすると、P=1+ω^(n/2)上でωは原始n乗根となる。 と書いてある。 たしかに、ωはn乗して初めて1とPを法として合同になる。 これは、Pが素数でなくても成立します。 しかし、 原始n乗根の性質として ω^0 + ω^j + ・・ + ω^((n-1)j) = 0 (j=1,2,...,n-1) が成立すると書いてある。 ω=2、n=6とすると、 j=1のときは 1+2+4+8+16+32=63=9*7≡0 mod(9) 9=2^(6/2)+1 j=2のときは、 1+4+16+64+256+1024=1365=151*9+6 アルゴリズムの設計と解析II (エイホ 他)の28ページには 原始n乗根の定義の中の条件として、原始n乗根は条件 ω^0 + ω^j + ・・ + ω^((n-1)j) = 0 (j=1,2,...,n-1) を満たさなくてはならない。 と書いてある。 さて、原始n乗根の定義は何でしょうか?  最初の2は原始n乗根なのでしょうか?  Pには他に条件が付くのでしょうか?  j に条件をつけるのでしょうか? 計算間違いなのか、誤解なのかよく分かりません。 混乱しています。よろしくお願いします。

  • 高校数学 累乗根のうちの奇数乗根について

    教えて下さい。 累乗根の計算でa>0,b>0のとき、  (ab)^(1/n)=a^(1/n)×b^(1/n) とありますが、nが奇数のときはa>0,b>0の条件は不要でしょうか。 例えは、a>0,b<0のとき、  (ab)^(1/n)=a^(1/n)×b^(1/n) としても正しいのでしょうか。 宜しくお願いします。