関数型プログラミング言語Haskell Part34 (667レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

82
(2): デフォルトの名無しさん [] 2022/02/14(月) 11:54:21.19 ID:4AqyxcJv(1/4) AAS
最近数値計算の勉強してるんですけど、よく最近高速フーリエ変換を用いた乗算の高速化なんて話が出てきます
サイズの大きい整数の掛け算とかを高速化する手法で桁数n同士の乗算のコストをn log(n)に抑えるのだとか
これGHCのInteger型の乗算には応用されてますかね?
やっぱりそこまで速さに拘りたいならご自分でのスタンス?
GHCのソースが読めるほどのスキルはないのでよくわからない
そもそもGHCのソースってどこに転がってます?
85: デフォルトの名無しさん [] 2022/02/14(月) 21:36:02.36 ID:4AqyxcJv(2/4) AAS
>>82
見つからないorz

>>83
ちょっと数値計算の練習したいんですよ
例えば円周率10万桁とか
さすがに10万桁とかだとghcはデフォルトでは対応してくれないのかなと
仮にできるにしても10万桁×10万桁の計算で桁数^2オーダーで計算したのではその一個の掛け算で何年もかかってしまうことになりかねません
ただのarrayやlistなら10万要素位は扱ってくれそうですけど
ただHaskellでその手の大量データを扱うのは色々難しい問題があるらしいと言う話は聞いてたので今までは「そういうのはHaskellは向かない、そういう時はC」とか使い分けてました
しかしやはりHaskellでできないのは面白くないのでHaskellでもそういうでかいデータを扱えるスキルを身につけたいなぁというのもあります
まぁまだFFTでの掛け算プログラム勉強し始めたばっかりなので先は長そうですけど
とりあえず[Double]のFFTと逆FFT作ったとこまではやったんです
でもそこまで作って「アレ?もしかしてこんなの自作しなくてもそもそもHaskellのIntegerが最初からFFTで掛け算してるとかあるかも?GHCの開発者メチャメチャ優秀っぽいし」と思った次第
86: デフォルトの名無しさん [] 2022/02/14(月) 21:36:29.77 ID:4AqyxcJv(3/4) AAS
あら、アンカー一個ずれ
88: デフォルトの名無しさん [] 2022/02/14(月) 23:13:34.14 ID:4AqyxcJv(4/4) AAS
>>87
おお、thx
なるほどGMPというのを使ってるんですね

--Stack excangeより
GMP appears to use Schonhage-Strassen, but not until you start dealing with numbers with 10s of thousands of decimal digits.

GMPではSchonhage-Strassenを使用しているようですが、小数点以下が何万桁もあるような数字を扱うようになるまでは、このようなことはないようです。

--wikiより
GMPは、どんなオペランドの大きさでも他の多倍長整数ライブラリよりも高速であることを目標としている。このために、以下の点を重視している。

基本算術型としてフルワードを使う。
オペランドの大きさによってそれぞれ異なるアルゴリズムを使う。非常に大きな数に有効なアルゴリズムは、小さい数では遅いことが多い。

----
要するに自分でわざわざSchonhage-Strassenのアルゴリズム実装しなくてもそもそもintegerで実装済みという事ですね
そうじゃないかと思ったw
そりゃそうでしょうねぇ、こんな優秀なソフトが数値計算理論の最新の成果取り入れてないわけがないw
10万桁とかIntegerで扱えるのかな?
実はData.FixedにあるFixed aで100桁くらいは余裕というのは確認済みなんです
週末にでも桁数増やして実験してみます
ありがとうございました
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.036s