Wydaje się, że ten problem jest równoważny kwadratowi całkowitemu / wielomianowemu:
1. Wiadomo, że mnożenie wielomianowe jest równoważne mnożeniu liczb całkowitych .
2. Oczywiście, zredukowałeś już problem do kwadratu wielomianowego / całkowitego; dlatego ten problem jest co najwyżej tak trudny jak wyprostowanie.
Teraz zredukuję kwadrat całkowity do tego problemu:
Załóżmy, że masz algorytm:
F(a⃗ )→P2(x),where P(x)=∑ai∈a⃗ xai
Ten algorytm jest zasadniczo algorytmem, o który prosisz w swoim pytaniu. Tak więc, jeśli mam magiczny algorytm, który może to zrobić, mogę wykonać funkcję która wyrówna liczbę całkowitą y ( o tak, kocham mathjax: P ):SQUARE(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 ( test przy pomocy 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. Zatem kwadratowanie jest co najwyżej tak trudne, jak ten problem.
4. Dlatego kwadratowanie liczb całkowitych jest równoważne temu problemowi. (każda z nich jest co najwyżej tak trudna ze względu na ( 2 , 3 , 1 ))
O(nlogn)O(nlognloglogn)O(nlogn2O(log∗n))Ω(nlogn)
O(nlogn)
5. Teraz twój problem nie polega na mnożeniu, lecz na kwadracie. Czy kwadratura jest łatwiejsza? Cóż, jest to otwarty problem (na razie nie) : nie wiadomo, że w kwadracie występuje szybszy algorytm niż mnożenie. Jeśli możesz znaleźć lepszy algorytm dla swojego problemu niż użycie mnożenia; to prawdopodobnie byłby przełom.
O(nlogn)O(nlogn)O(nlogn)O(nlogn) albo, ponieważ najlepszy algorytm mnożenia zbliża się tylko do tej złożoności.