Supposons que l'on nous donne entiers distincts , tels que pour une constante , et pour tout .a 1 , a 2 , … , a n 0 ≤ a i ≤ k n k > 0 i
Nous souhaitons trouver les dénombrements de toutes les sommes par paire possibles . ( est autorisé). i = j
Un algorithme consiste à construire le polynôme de degré , et à calculer son carré en utilisant la méthode de transformée de Fourier et à lire les puissances avec leur coefficients dans le polynôme résultant. Il s'agit d'un algorithme de temps . ≤ k n O ( n log n )
J'ai deux questions:
Existe-t-il un algorithme qui n'utilise pas la FFT?
De meilleurs algorithmes sont-ils connus (c'est-à-dire )? (FFT autorisé).
algorithms
time-complexity
fourier-transform
Aryabhata
la source
la source
Réponses:
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:
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
Python ( test avec codepad ):
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 )
la source