2017-08-10 1 views
0

私はAlgorithmsのテキストでこのトピックを勉強しています。実際にFFTを使用して多項式乗算を実装するにはどうすればよいですか?

結束の複雑なルーツの巧妙な使い方は、数学的に作用しているようです。しかし、私は実際にどのようにコンピュータでこれを表すことができるか分かりません。

私は2つのことを考えることができます:

  • は、複素数を表現するために実数/虚数分解を使用してください。しかし、これは浮動小数点数を使用することを意味します。これは、私のアルゴリズムを数値エラーに開放することを意味し、2つの多項式に整数係数を乗算したい場合でも精度が失われます。
  • exp(i 2pi/n)をnと表します。だから、私は最終的にオメガのタプルを取得し、このフォームでそれを保持しなければならないと、私は基本的に再びオメガの多項式乗算を行い、正方形に戻します。

このアルゴリズムの実装は、おなじみのプログラミング言語で見たいと思っています。

+0

「Numerical Recipes in C」は、すべての栄光の中でFFTを実装しています。 NumPy/SciPyにはPythonのバージョンがあります。 Javaのオープンソースライブラリがあります。あなたが知っている言語を見つけ、ソースをダウンロードしてください。 – duffymo

+0

おそらくhttps://math.stackexchange.com/questions/764727/concrete-fft-polynomial-multiplication-example? –

答えて

3

実際、あなたが確認したように、団結のルーツは、通常、コンピュータにうまく収まる素敵な数字ではありません。数値エラーは小さいので、出力が整数であることがわかっている場合は、通常、丸めを行うと正しい結果が得られます。

これに頼りたくない(またはできない)場合、正確なオプションはNumber Theoretic Transformです。それは、複素平面内の単一性の根を、有限体ρ/ p in(ここで、pは適切な素数である)の単一性の根で置き換える。 pはすべての必要な根が存在するのに十分な大きさでなければならず、効率はpの性質に影響される。フェルマープライムを選択した場合、単一性のルーツは便利な形になり、通常よりも効率的にモジュロpを減少させるトリックがあります。これはすべての整数演算であり、値は小さく留まるので、コンピュータに実装するのに問題はありません。

この技法はSchönhage-Strassenアルゴリズムで使用されているので、そこでの詳細を調べることができます。

+0

$ p $は素数である必要はなく、実際にSchönhageは素数性について論じていません。フェルマーの素数のように見える形式だけが重要です。これは、単一性の根と同等のものを容易に提供するからです。 – LutzL

+0

はい、いくつかの複合材は問題ありません。本当に必要なのは、根が存在することだけです。しかし、私は、そのような細部が不必要にウサギの穴のところでここに来ていると思う。 – harold

+0

はい文字列乗算のC++の例では、[Modular arthmeticsとNTT(Finite Field DFT)最適化](https://stackoverflow.com/q/18577076/2521214)を参照してください。 – Spektre

関連する問題