Parece que esse problema é equivalente ao número inteiro / quadrado polinomial:
1. Sabe-se que a multiplicação polinomial é equivalente à multiplicação inteira .
2. Obviamente, você já reduziu o problema ao quadrado polinomial / inteiro; portanto, esse problema é no máximo tão difícil quanto quadrático.
Agora vou reduzir o quadrado inteiro para esse problema:
Suponha que você tenha um algoritmo:
F( um⃗ ) → P2( X ) ,onde P( x ) = ∑umaEu∈ a⃗ xumaEu
Esse algoritmo é essencialmente o algoritmo que você solicita na sua pergunta. Assim, se eu tivesse um algoritmo mágico que possa fazer isso, eu posso criar uma função, que quadrará o número inteiro y ( oh sim, eu amo mathjax: P ):S Q U A R E ( y)y
1 .:2 .:3 .:4 .:5 .:6 .:7 .:8 .:9 .:10 .:11 .:12 .:13 .:Algoritmo 1 Quadraturaprocedimento S Q U A R E ( y) :uma⃗ ← ( )i ← 0w h i l e y ≠ 0 d o eu f 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⃗ (anexando xEu)▹ deslocamento y certo por um▹ obter o polinômio ao quadrado via F ( um⃗ )▹ simplesmente resuma o polinômio
Python ( teste com o 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. Portanto, a quadratura é no máximo tão difícil quanto esse problema.
4. Portanto, o quadrado inteiro é equivalente a esse problema. (cada um deles é tão duro quanto o outro, devido a ( 2 , 3 , 1 ))
O (nlogn )O (nlogn logregistron )O ( nlogn2O ( log∗n ))Ω ( n logn )
O ( nlogn )
5. Agora, seu problema não é exatamente a multiplicação, é o quadrado. Então, a quadratura é mais fácil? Bem, é um problema em aberto (não por enquanto) : sabe-se que o quadrado tem um algoritmo mais rápido que a multiplicação. Se você pudesse encontrar um algoritmo melhor para o seu problema do que usar multiplicação; então isso provavelmente seria um avanço.
O ( nlogn )O ( nlogn )O ( nlogn )O ( nlogn ) também, como o melhor algoritmo de multiplicação se aproxima apenas dessa complexidade.