私は、10000までの未知数を含む最大10000の方程式のシステムをできるだけ速く(できれば数秒以内に)解かなければなりません。ガウスの消去はそのためには遅すぎることを知っているので、どのアルゴリズムがこのタスクに適していますか?
すべての係数と定数は、pを法とする非負の整数です(pは素数)。ソリューションは1つだけであることが保証されています。pを法とする解が必要です。
私は、10000までの未知数を含む最大10000の方程式のシステムをできるだけ速く(できれば数秒以内に)解かなければなりません。ガウスの消去はそのためには遅すぎることを知っているので、どのアルゴリズムがこのタスクに適していますか?
すべての係数と定数は、pを法とする非負の整数です(pは素数)。ソリューションは1つだけであることが保証されています。pを法とする解が必要です。
回答:
行列のLU分解は時間で計算できます。ここで、は2つの行列を乗算する時間です。したがって、時間で未知数の線形方程式のシステムに対する解を見つけることができます。例えば、Strassenののアルゴリズムを実現する高速ガウス消去よりも、。https://en.wikipedia.org/wiki/Invertible_matrix#Blockwise_inversionを参照してください。
これを自分で実装しようとするのではなく、BLASライブラリなどのライブラリを使用することをお勧めします。
あなたが達成したいことがあり、現実があり、時にはそれらが対立しています。最初に、問題が、スパースマトリックスなど、すばやく解決できる特殊なケースかどうかを確認します。次に、より高速なアルゴリズムを探します。LU分解は少し速くなります。次に、Strassenが何をできるかを調査します(これはそれほどではありません。問題のサイズに32を掛けると、操作の半分を節約できます)。
そして、あなたはブルートフォースを使用します。マルチスレッドのマルチプロセッサシステムを使用します。利用可能なベクトル単位を使用します。データと操作をキャッシュに適したものにする。固定されたpに対してpを法とする計算を行う最も速い方法は何かを調べます。また、pを法とする演算(結果は0≤結果<pの範囲)を行わず、少し緩和(たとえば、範囲-p <結果<pの結果)することで、多くの場合、演算を保存できます。
大きな線形方程式を解くための最良の方法は、並列化を使用するか、CPU間で計算を分散することです。
CUDA、OpenCL、OpenMPを参照してください。
多くの人が示唆してStrassen's algorithm
いますが、非表示の定数が非常に大きいため、非効率的です。
ちなみに、線形方程式は非常にスパース(多くのゼロ)かもしれませんが、それらを並列に解くための非常にきちんとした最適化はほとんどありません。