(私は問題の説明を理解しているので、入力数は定数によって制限されているので、制限への依存を追跡しません。)
この問題は、対数の合計を使用して線形時間および対数空間で解決できます。より詳細には、アルゴリズムは次のとおりです。
- バイナリカウンターを使用して、両方のリストで考えられる各入力番号の出現数をカウントします。
これには時間がかかり、各カウンターは値のによって制限されるため、カウンターはスペース使用します。O(n)O(logn)n
ましょう以下の素数もに結合しました。数の各カウンタを分配することにより、の素因数に(適切な多重度を持つ)、および他のリストから1つのリストのためのカウントを減算し、我々は、時間内に次のように得:p1,…,pkO(1)aaO(logn)
問題がの符号を決定することと同等になるように、ビットで整数を計算します。β1,…,βkO(logn)Λ:=∑ki=1βilogpi
もしの製品が同じであること、答え。β1=⋯=βk=0
それ以外の場合は。ベイカーの定理により
、特定の定数下限を下限にでき
。したがって、以下は符号を正しく計算します。Λ≠0
|Λ|>2−Clogn
CΛ
- の符号を出力し。ここで、はをビットの精度に近似したものです。∑ki=1βiπiπilogpim:=Clogn+k+1
してみましょう 2の乗算のコストもビットの整数。現在の最良の境界はですが、ここでは、ささいな乗算アルゴリズム。AGM反復を使用してをビットの精度で時間計算し(たとえば、ここを参照)、次に評価に時間がかかります。全体として、ステップ4には時間がかかります。M(m)mM(m)=O(mlogm2O(log∗m))O(m2)logpimO(M(m)logm)∑iβiπiO(M(m))O(M(m)logm)⊆O(lognpoly(loglogn))
したがって、アルゴリズムの実行時間は、最初のステップのによって支配されます。O(n)