※ ChatGPTを利用し、要約された質問です(原文:多倍長演算における実行時間と計算量の差)
多倍長演算における実行時間と計算量の差
このQ&Aのポイント
多倍長演算において、計算量と実行時間の差が生じる原因とは?
多倍長演算において、計算量と実行時間の関係を調査しました。
なぜ多倍長演算において、数を大きくすると実行時間が遅くなるのか?
数学の論文において数値実験が必要だったため,
多倍長演算をC++で実行したところ,計算量とのギャップが生じました.
その原因をコンピュータに詳しい方にアドバイスを頂きたいと思って質問させていただきました.
具体的には,n,m を同ビット として 以下の二つの演算を考えます.
演算(1) n * m
演算(2) n^2 % m (n^2は先に計算しておき,% (mod)の演算のみ)
--------------------------------------------------
■計算量評価
大雑把に(1)と(2)の計算量を比較すると
(1) lg n * lg m = (lg n)^2
(2) (2*lg n - lg m) * lg m = (lg n)^2
となるので,(1) と (2)はほぼ同じ計算量となります.
--------------------------------------------------
しかしながら,実際に計算をしてみると,
n,m が 1000bit ほどまでは,ほぼ同じ計算時間なのですが,
2000bit, 4000bit ,..., と数を大きくしていくと,大きくしただけ (2) の速度が遅くなります.
具体的な実験結果は画像で添付いたします.
画像 (http://puu.sh/6iBQf.png)
(1) と (2)の実行時間のギャップは何処から生じたものなのか,何かわかるかたがいらっしゃいましたら教えていただけたら嬉しいです.
よろしくお願い致します.
予想:
コンピュータの知識があまりないですが,自分なりの予想では,(2)のn^2という数が大きすぎるため,演算においてメモリ間とのデータのやり取りで何かのオーバーヘッドが生じているのではないかと予想していますが,確証がもてません.
お礼
ご回答ありがとうございます 小さな係数をかけて調整して,理論値と比べたのですね. これを参考にして,自分の実験結果を同じように比較しましたら, 乗算はカラツバ法(ビット長の1.585乗),除算はそのまま(ビット長の2乗) とすると,計算量と実験データがほぼ一致いたしました. 上昇の比率も (lg n)^2 / (lg n)^1.585 = (lg n)^0.415 として, 係数を調整して実験データと比較したらほぼ一致いたしました.(http://puu.sh/6kKc9.png) 論文のほうも無事にまとめられそうです. ありがとうございました.