Tampaknya masalah ini setara dengan bilangan bulat / polinomial:
1. Diketahui bahwa perkalian polinomial sama dengan perkalian bilangan bulat .
2. Jelas, Anda sudah mengurangi masalah menjadi polinomial / bilangan bulat kuadrat; oleh karena itu masalah ini paling sulit seperti kuadrat.
Sekarang saya akan mengurangi bilangan bulat kuadrat untuk masalah ini:
Misalkan Anda memiliki algoritma:
F( a⃗ ) → P2( x ) ,dimana P( x ) = ∑Sebuahsaya∈ a⃗ xSebuahsaya
Algoritma ini pada dasarnya adalah algoritma yang Anda minta dalam pertanyaan Anda. Jadi, jika saya memiliki algoritma ajaib yang dapat melakukan ini, saya dapat membuat suatu fungsi, yang akan mengkuadratkan bilangan bulat y ( oh ya, saya memang suka mathjax: P ):S Q U A R E ( 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 ( uji dengan codepad ):
#/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. Jadi, mengkuadratkan paling keras seperti masalah ini.
4. Oleh karena itu, bilangan bulat integer setara dengan masalah ini. (mereka masing-masing paling keras seperti satu sama lain, karena ( 2 , 3 , 1 ))
Sekarang tidak diketahui apakah bilangan bulat / polinomial mengakui batas lebih baik daripada ; sebenarnya algoritma multiplikasi terbaik saat ini semuanya menggunakan FFT dan memiliki waktu-berjalan seperti O ( n log n log log n ) ( Algoritma Schönhage-Strassen ) dan O ( n log nO ( n logn)O(nlognloglogn) (Algoritma Fürer's). Arnold Schönhage dan Volker Strassen menduga batas bawahΩ ( n log n ) , dan sejauh ini tampaknya masih berlaku.O(nlogn2O(log∗n))Ω(nlogn)
Ini tidak berarti penggunaan FFT Anda lebih cepat; untuk FFT adalah jumlah operasi (saya pikir), bukan kompleksitas bit; karenanya ia mengabaikan beberapa faktor perkalian yang lebih kecil; ketika digunakan secara rekursif, itu akan menjadi lebih dekat dengan algoritma multiplikasi FFT yang tercantum di atas (lihat Di mana kesalahan dalam algoritma multiplikasi yang tampaknya-O (n lg n) ini? ).O(nlogn)
5. Sekarang, masalah Anda bukan multiplikasi, melainkan kuadrat. Jadi, apakah mengkuadratkan lebih mudah? Yah, ini adalah masalah terbuka (tidak untuk saat ini) : kuadrat tidak diketahui memiliki algoritma yang lebih cepat daripada perkalian. Jika Anda bisa menemukan algoritma yang lebih baik untuk masalah Anda daripada menggunakan perkalian; maka ini kemungkinan akan menjadi terobosan.
O(nlogn)O(nlogn)O(nlogn)O(nlogn) baik, karena algoritma multiplikasi terbaik hanya mendekati kompleksitas itu.