ペアワイズ和のFFTなしの


14

仮定し、私たちは、与えられたの異なる整数はように、いくつかの定数の、およびすべてのための。1、2、... 、nは 0 ≤ I ≤ K N K > 0 Ina1,a2,…,an0≤ai≤knk>0i

可能なすべてのペアワイズ和のカウントを見つけることに興味があります。(が許可されます)。 i = jSij=ai+aji=j

1つのアルゴリズムは、次数の多項式をし、フーリエ変換法を使用してその平方を計算し、結果の多項式の係数。これは、時間アルゴリズムです。 ≤ K N O (N ログN )P(x)=∑j=1nxaj≤knO(nlog⁡n)

2つの質問があります。

  • そこで FFTを使用していないアルゴリズムは?O(nlog⁡n)

  • より良いアルゴリズムは知られていますか(すなわち)?(FFTが許可されます)。o(nログ⁡n)


FFTを使用しないことが重要なのはなぜですか?あなたはすでにあなたの問題に対する良い解決策を持っているようです。FFTを使用しないという要件はどこから来るのですか?それは課すというかなり不自然な要件のように思えます。
— DW

@DW:それでは、質問する必要はありませんか?:-)別のアプローチがあるかどうか知りたいだけです。
— アルヤバタ

はい、わかった!私も興味があります。:-)興味深い質問をありがとう。
— DW

@DW:あなたは大歓迎です:-)
— アリヤバータ

回答:


8

この問題は整数/多項式の二乗に等しいと思われます:

1. 多項式の乗算は整数の乗算と同等であることが知られています。

2.明らかに、問題はすでに多項式/整数の2乗に縮小されています。したがって、この問題はせいぜい二乗と同じくらい困難です。

次に、この問題に対する整数の二乗を減らします。

アルゴリズムがあるとします:

F(a→)→P2(x),where P(x)=∑ai∈a→xai

このアルゴリズムは、基本的に質問で要求するアルゴリズムです。したがって、これを実行できるマジックアルゴリズムがあれば、整数を2乗する関数を作成できます(そうそう、mathjaxが大好きです) :P): ySQUARE(y)y

Algorithm 1 Squaring1.:procedure SQUARE(y):2.:a→←()▹ a→ starts as empty polynomial sequence3.:i←04.:while y≠0 do▹ break y down into a polynomial of base 25.:if y & 1 then▹ if lsb of y is set6.:a→←a→i▹ append i to a→ (appending xi)7.:end if8.:i←i+19.:y←y≫1▹ shift y right by one10.:end while11.:P2(x)←F(a→)▹ obtain the squared polynomial via F(a→)12.:retあなたはrn P2(2)▹ 単に多項式を合計する13。:終了手順

Python(コードパッドでテスト):

#/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. したがって、二乗はこの問題と同じくらい困難です。

4. したがって、整数の2乗はこの問題と同等です。(それらは、(による、それぞれ、他のハードとして最大でそれぞれ2、3、1))

現在、整数/多項式の乗算がよりも良い範囲を許可するかどうかは不明です。実際、現在最高の乗算アルゴリズムはすべてFFTを使用しており、(Schönhage-Strassenアルゴリズム)およびようなランタイムを持っています(Fürerのアルゴリズム)。ArnoldSchönhageとVolker Strassenは下限を推測しましたが、これまでのところこれが成り立っているようです。O(nログ⁡n)O(nログ⁡nログ⁡ログ⁡n)O(nログ⁡n2O(ログ∗⁡n))Ω(nログ⁡n)

これは、FFTの使用が速いという意味ではありません。FFTのは操作の数(私が思うに)であり、ビットの複雑さではありません。したがって、より小さい乗算のいくつかの要因は無視されます。再帰的に使用すると、上記のFFT乗算アルゴリズムに近づきます(この明らかにO(n lg n)乗算アルゴリズムの誤りはどこにありますか?を参照)。O(nログ⁡n)

5.さて、あなたの問題は乗算ではなく、二乗です。それで、平方は簡単ですか?まあ、それは未解決の問題です(今のところはありません):二乗は乗算よりも速いアルゴリズムを持っていることは知られていません。乗算を使用するよりも問題に適したアルゴリズムを見つけることができる場合。これはおそらく突破口になるでしょう。

したがって、今のところ、両方の質問に対する答えは次のとおりです。no、今のところ、すべての〜乗算アルゴリズムはFFTを使用しています。そして現在、二乗は乗算と同じくらい難しいです。そして、無乗のためのより高速なアルゴリズムが見つかった、または乗算ブレークされていない限り、障壁を、あなたの問題は、より速く解くことができない ; 実際、最良の乗算アルゴリズムはその複雑さにしか近づかないため、でも現在解決できません。O(nログ⁡n)O(nログ⁡n)O(nログ⁡n)O(nログ⁡n)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.