Il semblerait que ce problème soit équivalent à la quadrature entière / polynomiale:
1. On sait que la multiplication polynomiale est équivalente à la multiplication entière .
2. De toute évidence, vous avez déjà réduit le problème à la quadrature polynomiale / entière; ce problème est donc tout au plus aussi difficile que la quadrature.
Maintenant, je vais réduire la quadrature entière à ce problème:
Supposons que vous disposiez d'un algorithme:
F( a⃗ ) → P2( x ) ,où P( x ) = ∑uneje∈ a⃗ Xuneje
Cet algorithme est essentiellement l'algorithme que vous demandez dans votre question. Ainsi, si j'avais un algorithme magique qui peut le faire, je peux créer une fonction, qui mettra au carré l'entier ( oh oui, j'adore mathjax : P ): yS Q U A R E ( y)y
1 .:2 .:3 .:4. :5 .:6 .:7 .:8 .:9 .:10 .:11 .:12 .:13 .:Algorithme 1 Squaringprocédure S Q U A R E ( y) :une⃗ ← ( )i ← 0w h i l e y≠ 0 d o je f y & 1 t h e n une⃗ ← a⃗ jee n d i f i ← i + 1y← y≫ 1e n d w h i l e P2( x ) ← F( a⃗ )r e t u r n P 2( 2 )procédure de fin▹ a ⃗ commence comme une séquence polynomiale vide▹ casser y vers le bas dans un polynôme de base 2▹ si lsb de y est réglé▹ ajouter i à un ⃗ (en ajoutant xje)▹ déplacer y juste à côté▹ obtenir le polynôme carré via F ( a⃗ )▹ résume simplement le polynôme
Python ( test avec 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. Ainsi, la quadrature est au plus aussi difficile que ce problème.
4. Par conséquent, la mise au carré des nombres entiers équivaut à ce problème. (ils sont chacun aussi durs les uns que les autres, en raison de ( 2 , 3 , 1 ))
Maintenant, on ne sait pas si la multiplication entier / polynomial admet mieux les bornes que ; en fait, les meilleurs algorithmes de multiplication utilisent actuellement la FFT et ont des temps d'exécution comme ( algorithme de Schönhage-Strassen ) et ( algorithme de Fürer ). Arnold Schönhage et Volker Strassen ont conjecturé une limite inférieure de , et jusqu'à présent, cela semble tenir.O ( n logn )O ( n logn journalJournaln )O ( n logn2O ( log∗n ))Ω ( n logn )
Cela ne signifie pas que votre utilisation de la FFT est plus rapide; pour FFT est le nombre d'opérations (je pense), pas la complexité des bits; il ignore donc certains facteurs de multiplications plus petites; utilisé de manière récursive, il se rapprocherait des algorithmes de multiplication FFT énumérés ci-dessus (voir Où est l'erreur dans cet algorithme de multiplication apparemment O (n lg n)? ).O ( n logn )
5. Maintenant, votre problème n'est pas exactement la multiplication, c'est la quadrature. La quadrature est-elle donc plus facile? Eh bien, c'est un problème ouvert (non pour l'instant) : la quadrature n'est pas connue pour avoir un algorithme plus rapide que la multiplication. Si vous pouviez trouver un meilleur algorithme pour votre problème que d'utiliser la multiplication; alors ce serait probablement une percée.
Donc, à partir de maintenant, la réponse à vos deux questions est: non , à partir de maintenant, tous les algorithmes de multiplication ~ utilisent la FFT; et à partir de maintenant la quadrature est aussi difficile que la multiplication. Et non , à moins qu'un algorithme de mise au carré plus rapide ne soit trouvé ou que la multiplication ne brise la barrière , votre problème ne peut pas être résolu plus rapidement que ; en fait, il ne peut pas non plus être résolu actuellement dans , car le meilleur algorithme de multiplication ne se rapproche que de cette complexité.O ( n logn )O ( n logn )O ( n logn )O ( n logn )