乗算で


10

私が探していたここで、と私は2つの乗算のための最高の実行時に気づいたの数字を-bitsすることであるO (nは⋅ ログインN ⋅ 2 O (ログ* nで)が、私は簡単にその中に実行するアルゴリズムに気づくことができますO (N ⋅ log n )。nO(n⋅log⁡n⋅2O(log∗⁡n)O(n⋅log⁡n)

すべての後、我々は度から2つの多項式を乗算する方法を知っているにO (N ログN )実行時。しかし、多項式を乗算することは、2つのnビット数を乗算することと同じです。したがって、O (n log n )の 2つのnビット数を乗算するアルゴリズムがあります。発生する可能性のある唯一の問題はキャリーですが、各フェーズでO (n )時間でそれを修正でき、最後まで右端のビットとその左隣に移動します。つまり、私たちのランタイムが残っているものとO (N ⋅ ログのnnO(nlog⁡n)nnO(nlog⁡n)O(n)。O(n⋅log⁡n)

それで私は新しい(そしてかなり明白な)発見をしましたか?または、ウィキペディアのページは古くなっていますか?それとも私はいくつかの間違いをしていますか?


「度から2つの多項式を乗算し、「私たちが知っている」という方法は何であるにO (N ログN )実行時には、」?nO(nlog⁡n)

回答:


8

@DavidRicherbyがすでに指摘しているように、複雑さの異なる測定値が混同されているため、混乱が生じます。しかし、少し詳しく説明しましょう。

通常、任意のリング上の多項式乗算のアルゴリズムを研究する場合、アルゴリズムが使用するリング内の算術演算の数に関心があります。特に、いくつかの(可換、ユニタリ)リングと2つの多項式fR未満度 N、Schönhage-Strassenのアルゴリズムが必要 Oを(N ログNログログN)に乗算と加算を R計算するために、F 、G ∈ R [ X ]f,g∈R[X]nO(nlog⁡nlog⁡log⁡n)Rfg∈R[X]隣接し、概ね、によってに統一番目の原始根Rいくつかの大きな環取得するD ⊃ Rを高速フーリエ変換を用いた上、次いで及びD内の製品の計算、Dを。nRD⊃RDD

リングに1の番目の根が含まれている場合、R上で直接高速フーリエ変換を使用することにより、これをRのO (n log n )演算まで高速化できます。より具体的には、上にZ ⊂ Cは、この使用して行うことができるO (N ログN )リング操作(これは複素数上の正確な計算を必要とするという事実を無視します)。nO(nlog⁡n)RRZ⊂CO(nlog⁡n)

考慮できるもう1つの方法は、操作のビットの複雑さです。そして、これは、ビット長 2つの整数を乗算するときに私たちが関心を持っているものです。ここでは、プリミティブ演算は2桁の乗算と加算(キャリー付き)です。したがって、2つの多項式をZで乗算する場合、計算中に発生する数は定数のプリミティブ演算を使用して乗算できないという事実を実際に考慮する必要があります。これと、Zにn > 2のnの 1の原始根がないという事実により、O (n log n )を適用できなくなります。nZZnn>2O(nlog⁡n)アルゴリズム。リングからの係数でを考慮することでこれを克服しますf,g製品多項式の係数を超えないので、この結合しました。そこで( nが2の累乗である場合)、1の n番目の根として(の合同クラス) 2があり、係数乗算のアルゴリズムを再帰的に呼び出すことにより、合計 O (n log n log log n )プリミティブ(ビット)操作。その後、整数乗算に引き継がれます。Z/⟨2n+1⟩n2nO(nlog⁡nlog⁡log⁡n)

リング演算とプリミティブ演算の違いの重要性をうまく強調する例として、多項式を評価するための2つの方法、ホーナー法とエストリン法を考えてみましょう。ホーナーの方法は多項式一部で X ∈ Zを識別利用することによって Fを(X )= (... (F N X + F N - 1)X + ... + ... )+f 0 を評価し、エストリンの方法はfを2つの部分に分割します H = n / 2 ∑ i = 1 f n / 2 + i X iおよび L = n / 2 ∑f=∑i=0nfiXix∈Z

f(x)=(…(fnx+fn−1)x+…+…)+f0
f
H=∑i=1n/2fn/2+iXi
すなわち、Hは次数の項を含みます>N/2及びL程度の点≤N/2(想定N
L=∑i=0n/2fiXi
H>n/2L≤n/2n 簡単にするために、2の累乗です)。

次に、f (x )= H (x )x n / 2 + L (x ) を使用してを 計算し、アルゴリズムを再帰的に適用できます。f(x)

f(x)=H(x)xn/2+L(x)

前者は、加算と乗算を使用しており、加算と乗算(つまり、リング演算)の数に対して最適であることが証明されており、後者はさらに(少なくともn + log n)必要です。nn+log⁡n

n/2n/2Ω(n2)nO(n)O(nlogc⁡n)=O~(n)c>0


9

時間 2次多項式を時間O (n log n )で乗算できると言うことは、特に、次数0の多項式、つまり定数を定数時間で乗算できることを意味します。したがって、明らかに、「nビット数の乗算には時間がかかりますO (2 log ∗nO(nlog⁡n)nO(2log∗⁡nnlog⁡n)nO(nlog⁡n)


5
これは問題ではないと思います。数値を、「x」を底とする多項式、たとえば2と考えると、通常、次数0の多項式(底よりも小さい数値)を一定の時間で乗算できます。問題は、O(n * log n)アルゴリズムがFFTを使用しており、FFTアルゴリズム内に漸近的に大きな数が現れる可能性があることだと思います。
— jkff 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.