I'm trying to implement univariate polynomials using ZDDs, as suggested in a comment in an other question.
I've read the paper of S. Minato(you may download it here), but I don't understand how to implement the operations on these ZDDs.
この論文の考え方は、変数として使用して多項式を表すことができるということx^(2^i)
です。たとえば、 のx^5 + x^3 + x
ように書き換えることができます。変数x^4x^1 + x^2x^1 + x^1
ごとにノードを作成x^(2^i)
し、乗算された "1 エッジ" 変数と加算された "0 エッジ" 変数を接続すると、その多項式を表すグラフを簡単に取得できます。 . ZDD は、グラフに何らかの条件を適用するこの種のグラフです (詳細については、湊の記事と BDD に関するウィキペディアのページを参照してください)。
係数は、2 のべき乗の合計を使用して同様に表すことができます (たとえば、5 = 2^2 + 2^0
すべて2^i
が変数であり、ノードは同じ方法で 1 エッジと 0 エッジで接続されます)。
さて、私の問題は、2 つの ZDD を加算するアルゴリズムです。アルゴリズムは非常に単純に見えます。
F と G (ZDDs) に共通する組み合わせがない場合、それらをマージするだけで加算 (F + G) を完了できます。それらにいくつかの一般的な組み合わせが含まれている場合、次の式を計算します: (F + G) = S + (Cx2)、ここで C = F ∩ G、S = (FUG) \ C . このプロセスを繰り返すことで、最終的に共通の組み合わせがなくなり、手順が完了します。
問題は、「C」と「S」を効率的に見つけるにはどうすればよいかということです。
著者は乗算のコードを提供していますが、以前のアルゴリズムを実装すれば、コードは実際には簡単です。また、これらのアルゴリズムは提供されていないため、乗算も「役に立たない」ものです。
また、「マージ」ZDD の概念は十分に説明されていませんが、変数の順序が一貫していなければならないという事実を考慮すると、グラフをマージする方法は 1 つしかなく、この順序を維持するためのルールはおそらく単純です。十分です(まだ形式化していませんが、これらが何であるかについては大まかな考えがあります)。