@DavidRicherbyがすでに指摘しているように、複雑さの異なる測定値が混同されているため、混乱が生じます。しかし、少し詳しく説明しましょう。
通常、任意のリング上の多項式乗算のアルゴリズムを研究する場合、アルゴリズムが使用するリング内の算術演算の数に関心があります。特に、いくつかの(可換、ユニタリ)リングと2つの多項式fR未満度 N、Schönhage-Strassenのアルゴリズムが必要 Oを(N ログNログログN)に乗算と加算を R計算するために、F 、G ∈ R [ X ]f、g∈ R [ X]んO (n ログnログログn)Rfg∈ R [ X]隣接し、概ね、によってに統一番目の原始根Rいくつかの大きな環取得するD ⊃ Rを高速フーリエ変換を用いた上、次いで及びD内の製品の計算、Dを。nRD⊃RDD
リングに1の番目の根が含まれている場合、R上で直接高速フーリエ変換を使用することにより、これをRのO (n log n )演算まで高速化できます。より具体的には、上にZ ⊂ Cは、この使用して行うことができるO (N ログN )リング操作(これは複素数上の正確な計算を必要とするという事実を無視します)。nO(nlogn)RRZ⊂CO(nlogn)
考慮できるもう1つの方法は、操作のビットの複雑さです。そして、これは、ビット長 2つの整数を乗算するときに私たちが関心を持っているものです。ここでは、プリミティブ演算は2桁の乗算と加算(キャリー付き)です。したがって、2つの多項式をZで乗算する場合、計算中に発生する数は定数のプリミティブ演算を使用して乗算できないという事実を実際に考慮する必要があります。これと、Zにn > 2のnの 1の原始根がないという事実により、O (n log n )を適用できなくなります。nZZnn>2O(nlogn)アルゴリズム。リングからの係数でを考慮することでこれを克服しますf,g製品多項式の係数を超えないので、この結合しました。そこで( nが2の累乗である場合)、1の n番目の根として(の合同クラス) 2があり、係数乗算のアルゴリズムを再帰的に呼び出すことにより、合計 O (n log n log log n )プリミティブ(ビット)操作。その後、整数乗算に引き継がれます。Z/⟨2n+1⟩n2nO(nlognloglogn)
リング演算とプリミティブ演算の違いの重要性をうまく強調する例として、多項式を評価するための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=∑ni=0fiXix∈Z
f(x)=(…(fnx+fn−1)x+…+…)+f0
fH=∑i=1n/2fn/2+iXi
すなわち、
Hは次数の項を含みます
>N/2及び
L程度の点
≤N/2(想定
NL=∑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+logn
n/2n/2Ω(n2)nO(n)O(nlogcn)=O~(n)c>0