この問題は整数/多項式の二乗に等しいと思われます:
1. 多項式の乗算は整数の乗算と同等であることが知られています。
2.明らかに、問題はすでに多項式/整数の2乗に縮小されています。したがって、この問題はせいぜい二乗と同じくらい困難です。
次に、この問題に対する整数の二乗を減らします。
アルゴリズムがあるとします:
F(a⃗ )→P2(x),where P(x)=∑ai∈a⃗ xai
このアルゴリズムは、基本的に質問で要求するアルゴリズムです。したがって、これを実行できるマジックアルゴリズムがあれば、整数を2乗する関数を作成できます(そうそう、mathjaxが大好きです) :P): ySQUARE(y)y
1.:2.:3.:4.:5.:6.:7.:8.:9.:10.:11.:12.:13.:Algorithm 1 Squaringprocedure SQUARE(y):a⃗ ←()i←0while y≠0 doif y & 1 thena⃗ ←a⃗ iend ifi←i+1y←y≫1end whileP2(x)←F(a⃗ )return P2(2)end procedure▹ a⃗ starts as empty polynomial sequence▹ break y down into a polynomial of base 2▹ if lsb of y is set▹ append i to a⃗ (appending xi)▹ shift y right by one▹ obtain the squared polynomial via F(a⃗ )▹ simply sum up the polynomial
Python(コードパッドでテスト):
#/cs//q/11418/2755
def F(a):
n = len(a)
for i in range(n):
assert a[i] >= 0
# (r) => coefficient
# coefficient \cdot x^{r}
S = {}
for ai in a:
for aj in a:
r = ai + aj
if r not in S:
S[r] = 0
S[r] += 1
return list(S.items())
def SQUARE(x):
x = int(x)
a = []
i = 0
while x != 0:
if x & 1 == 1:
a += [i]
x >>= 1
i += 1
print 'a:',a
P2 = F(a)
print 'P^2:',P2
s = 0
for e,c in P2:
s += (1 << e)*c
return s
3. したがって、二乗はこの問題と同じくらい困難です。
4. したがって、整数の2乗はこの問題と同等です。(それらは、(による、それぞれ、他のハードとして最大でそれぞれ2、3、1))
現在、整数/多項式の乗算がよりも良い範囲を許可するかどうかは不明です。実際、現在最高の乗算アルゴリズムはすべてFFTを使用しており、(Schönhage-Strassenアルゴリズム)およびようなランタイムを持っています(Fürerのアルゴリズム)。ArnoldSchönhageとVolker Strassenは下限を推測しましたが、これまでのところこれが成り立っているようです。O(nログn )O(nログn ログログn )O( n ログn2O(ログ∗n ))Ω (n logn )
これは、FFTの使用が速いという意味ではありません。FFTのは操作の数(私が思うに)であり、ビットの複雑さではありません。したがって、より小さい乗算のいくつかの要因は無視されます。再帰的に使用すると、上記のFFT乗算アルゴリズムに近づきます(この明らかにO(n lg n)乗算アルゴリズムの誤りはどこにありますか?を参照)。O( n ログn )
5.さて、あなたの問題は乗算ではなく、二乗です。それで、平方は簡単ですか?まあ、それは未解決の問題です(今のところはありません):二乗は乗算よりも速いアルゴリズムを持っていることは知られていません。乗算を使用するよりも問題に適したアルゴリズムを見つけることができる場合。これはおそらく突破口になるでしょう。
したがって、今のところ、両方の質問に対する答えは次のとおりです。no、今のところ、すべての〜乗算アルゴリズムはFFTを使用しています。そして現在、二乗は乗算と同じくらい難しいです。そして、無乗のためのより高速なアルゴリズムが見つかった、または乗算ブレークされていない限り、障壁を、あなたの問題は、より速く解くことができない ; 実際、最良の乗算アルゴリズムはその複雑さにしか近づかないため、でも現在解決できません。O( n ログn )O( n ログn )O( n ログn )O( n ログn )