FFT moins algorithme pour les montants par paires

14

Supposons que l'on nous donne entiers distincts , tels que pour une constante , et pour tout .a 1 , a 2 , , a n 0 a ik n k > 0 ina1,a2,,an0aiknk>0je

Nous souhaitons trouver les dénombrements de toutes les sommes par paire possibles . ( est autorisé). i = jSjej=uneje+unejje=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 )P(X)=j=1nXunejknO(nJournaln)

J'ai deux questions:

  • Existe-t-il un algorithme qui n'utilise pas la FFT?O(nJournaln)

  • De meilleurs algorithmes sont-ils connus (c'est-à-dire )? (FFT autorisé).o(nJournaln)

Aryabhata
la source
Pourquoi est-il important de ne pas utiliser la FFT? Il semble que vous ayez déjà une bonne solution à votre problème. D'où vient l'obligation de ne pas utiliser la FFT? Cela me semble être une exigence plutôt non naturelle à imposer.
DW
@DW: Parce qu'alors il n'y aura pas de question à poser? :-) Je suis simplement curieux de savoir s'il existe une approche différente.
Aryabhata
OK, j'ai compris! J'avoue que je suis aussi curieux. :-) Merci pour la question intéressante.
DW
@DW: Vous êtes les bienvenus :-)
Aryabhata

Réponses:

8

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(une)P2(X),où P(X)=unejeuneXuneje

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 ): ySQUUNERE(y)y

Algorithme 1 Squaring1.:procédure SQUUNERE(y):2.:une() une commence comme une séquence polynomiale vide3.:je04.:whjele y0 o Pause y vers le bas dans un polynôme de base 25.:jeF y & 1 then si lsb de y est réglé6.:uneuneje ajouter je à une (en ajoutant Xje)sept.:en jeF8.:jeje+19.:yy1 décalage y juste à côtédix.:en whjele11.:P2(X)F(une) obtenir le polynôme carré via F(une)12.:return P2(2) résume simplement le polynôme13.:procédure de fin

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(nJournaln)O(nJournalnJournalJournaln)O(nJournaln2O(Journaln))Ω(nJournaln)

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(nJournaln)

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(nJournaln)O(nJournaln)O(nJournaln)O(nJournaln)

Realz Slaw
la source