線形方程式系を解くための最速の方法


8

私は、10000までの未知数を含む最大10000の方程式のシステムをできるだけ速く(できれば数秒以内に)解かなければなりません。ガウスの消去はそのためには遅すぎることを知っているので、どのアルゴリズムがこのタスクに適していますか?

すべての係数と定数は、pを法とする非負の整数です(pは素数)。ソリューションは1つだけであることが保証されています。pを法とする解が必要です。

回答:


10

行列のLU分解は時間で計算できます。ここで、は2つの行列を乗算する時間です。したがって、時間で未知数の線形方程式のシステムに対する解を見つけることができます。例えば、Strassenののアルゴリズムを実現する高速ガウス消去よりも、。https://en.wikipedia.org/wiki/Invertible_matrix#Blockwise_inversionを参照してください×OMM×OMM=O2.8

これを自分で実装しようとするのではなく、BLASライブラリなどのライブラリを使用することをお勧めします。


また、計算の終わりにpを法として削減します。
fade2black 2017年

2
@ fade2black、実際には、mod p演算で使用するように設計された実装を使用する方がはるかに良いでしょう(つまり、最後だけでなく、各ステップでmod pを減らします)。
DW

ウィキペディアのリンクが変更された場合、そこに与えられた結果の参照は、たとえば、Cormenらの第3版のセクション28.2、Introduction to Algorithmsにあります。具体的には、行列の乗算と行列の反転の間の「アルゴリズムの等価性」を示しています。しかし、おそらく、行列の反転とLU分解をリンクできます。OM
Chill2Macht

4

あなたが達成したいことがあり、現実があり、時にはそれらが対立しています。最初に、問題が、スパースマトリックスなど、すばやく解決できる特殊なケースかどうかを確認します。次に、より高速なアルゴリズムを探します。LU分解は少し速くなります。次に、Strassenが何をできるかを調査します(これはそれほどではありません。問題のサイズに32を掛けると、操作の半分を節約できます)。

そして、あなたはブルートフォースを使用します。マルチスレッドのマルチプロセッサシステムを使用します。利用可能なベクトル単位を使用します。データと操作をキャッシュに適したものにする。固定されたpに対してpを法とする計算を行う最も速い方法は何かを調べます。また、pを法とする演算(結果は0≤結果<pの範囲)を行わず、少し緩和(たとえば、範囲-p <結果<pの結果)することで、多くの場合、演算を保存できます。


2

大きな線形方程式を解くための最良の方法は、並列化を使用するか、CPU間で計算を分散することです。

CUDA、OpenCL、OpenMPを参照してください。

多くの人が示唆してStrassen's algorithmいますが、非表示の定数が非常に大きいため、非効率的です。

ちなみに、線形方程式は非常にスパース(多くのゼロ)かもしれませんが、それらを並列に解くための非常にきちんとした最適化はほとんどありません。


行列のサイズは10,000 x 10,000なので、Strassenが何かを保存できると思います。それほどではありません。
gnasher729 2017年

1
@ gnasher729いくつか疑問があります。彼の講義の1つでAlex Stapanovは、Boingが本当に大きな行列(1Mx1M afair)にStrassenのアルゴリズムを使用していて、パフォーマンスに不満だったと述べています。しかし、私はこの情報は現代のハードウェアにとってはちょっと時代遅れだと思います。
Oleg Kovalov 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.