Parece que este problema es equivalente a la cuadratura entera / polinómica:
1. Se sabe que la multiplicación polinómica es equivalente a la multiplicación entera .
2. Obviamente, ya redujo el problema a cuadratura polinómica / entera; por lo tanto, este problema es tan difícil como cuadrar.
Ahora reduciré la cuadratura entera a este problema:
Supongamos que tienes un algoritmo:
F(a⃗ )→P2(x),where P(x)=∑ai∈a⃗ xai
Este algoritmo es esencialmente el algoritmo que solicita en su pregunta. Por lo tanto, si tuviera un algoritmo mágico que pueda hacer esto, puedo hacer una función, que cuadrará el número entero y ( oh sí, amo 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 ( prueba con teclado ):
#/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. Por lo tanto, la cuadratura es tan difícil como este problema.
4. Por lo tanto, la cuadratura entera es equivalente a este problema. (cada uno es tan duro como el otro, debido a ( 2 , 3 , 1 ))
O(nlogn)O(nlognloglogn)O(nlogn2O(log∗n))Ω(nlogn)
O(nlogn)
5. Ahora, su problema no es exactamente la multiplicación, es la cuadratura. Entonces, ¿es más fácil la cuadratura? Bueno, es un problema abierto (no por ahora) : no se sabe que la cuadratura tenga un algoritmo más rápido que la multiplicación. Si pudiera encontrar un mejor algoritmo para su problema que usar la multiplicación; entonces esto probablemente sería un gran avance.
O(nlogn)O(nlogn)O(nlogn)O(nlogn) tampoco, ya que el mejor algoritmo de multiplicación solo se acerca a esa complejidad.