式 (方程式) が循環的ではないと仮定しましょう。そうでなければ、それらを「ただ」評価することはできません。A、B、C が配列である A = B + C のようなベクトル化された方程式がある場合、それらを構成要素の方程式に概念的に分割して、配列サイズが 5 の場合、この方程式が次のように分割されるようにします。
a1 = b1 + c1
a2 = b2 + c2
...
a5 = b5 + c5
これを仮定すると、単純な量 (整数、有理数、またはその他のもの) に関する大量の方程式が得られます。
E と F の 2 つの方程式がある場合、たとえば、F の右辺が E の左辺に言及している場合、F は E に依存しているとします。
E: a = b + c
F: q = 2*a + y
これを計算する方法に進むために、次のアルゴリズムに従って、常にランダム化された反復を使用してこれを解決できます (これは説明の中間ステップにすぎません)。
1 while (there is at least one equation which has not been computed yet)
2 select one such pending equation E so that:
3 for every equation D such that E depends_on D:
4 D has been already computed
5 calculate the left-hand side of E
このプロセスは、// 2 でどのように選択したかに関係なく、正しい答えで終了します。ここで優れているのは、簡単に並列化できることです。任意の数のスレッドで実行できます! 必要なのは、前提条件 (方程式が依存するもの) が計算されているが、それ自体はまだ計算されていない方程式を保持する同時実行セーフ キューです。すべてのスレッドは、このキューから一度に 1 つの方程式を (スレッド セーフに) ポップアウトし、答えを計算してから、すべての前提条件が計算されるように新しい方程式があるかどうかを確認し、それらの方程式を (スレッド セーフに) 追加します。作業キューに。終わり。