
現在C++であるクラスのインスタンスaのN乗根を求める関数を作成中なのですが、どうしても実行時間が長くなってしまいます。
現在ニュートン法に則って
X(m+1)=((N-1)(Xm)^N+a)/(N*(Xm)^(N-1))
という漸化式を回して変化量が一定値以下になったら終了という関数なのですが、
値によっては累乗計算のところで時間を大幅にロスしてしまうようです。
原因としては累乗計算が同じ数をN回掛けるという単純な仕組みなため、
Nが大きすぎるとループがなかなか終わらないということがわかっています。
もしご存知であれば
1.極力累乗計算を使わないN乗根の求め方
2.計算量の少ない累乗計算の仕方
のどちらかを教えていただけないでしょうか?
なお、クラスを使っている関係上powなどの既存の関数は使えません。
よろしくお願いいたします。
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 回の乗算からなり, ほぼ最適です.
確認しました
お陰様でほぼ問題のないレベルの速さにすることができました
やはりオーダーがnからlognになると格段に速さが違います
ありがとうございました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
VBAの再計算が反映されない件に...
-
構文解析を利用した計算プログ...
-
エクセルで特定のセルのみを任...
-
EXCELなどで「返す」という表現
-
傾いた四角形内の範囲の条件式
-
タクシー料金の問題です
-
モジュラス103の計算とは何でし...
-
C言語の課題で、1年の秒数を計...
-
C# C1FlexGrid SUBTOTAL で計算式
-
【fortran77】データ行数のカウ...
-
整数aを入力し、aの2乗、3乗...
-
C言語の勉強をしていて、for文...
-
y=(x^2 +3x+1)^4を微分の定義を...
-
排他的論理和 BCC(水平パリテ...
-
数値計算の高速化 (cos, sin, exp)
-
パソコン
-
VB6.0で時間の計算方法
-
matlabで計算終了
-
パチンコゲームを作りたいので...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
VBAの再計算が反映されない件に...
-
EXCELなどで「返す」という表現
-
matlabで計算終了
-
変化させるセルが変化しない
-
排他的論理和 BCC(水平パリテ...
-
モジュラス103の計算とは何でし...
-
傾いた四角形内の範囲の条件式
-
VBAで関数をつくる
-
[急募]Pythonについてです。
-
数値計算の高速化 (cos, sin, exp)
-
切り上げたい
-
C言語についての質問です。 ル...
-
DLL(VC++で作った)で稼動中の...
-
CとFORTRANの計算速度はどちら...
-
CGIの実行権限(ディスク容...
-
趣味で「乗換案内」みたいなソ...
-
エクセルで特定のセルのみを任...
-
functionを含んだプログラムを...
-
単価や利率などを設定画面を設...
おすすめ情報