ペアワイズ和のFFTなしの


14

仮定し、私たちは、与えられたの異なる整数はように、いくつかの定数の、およびすべてのための。12... nは 0 IK N K > 0 Ina1,a2,,an0aiknk>0i

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

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

2つの質問があります。

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

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


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

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

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

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

回答:


8

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

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

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

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

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

F(a)P2(x),where P(x)=aiaxai

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

Algorithm 1 Squaring1.:procedure SQUARE(y):2.:a() a starts as empty polynomial sequence3.:i04.:while y0 do break y down into a polynomial of base 25.:if y & 1 then if lsb of y is set6.:aai append i to a (appending xi)7.:end if8.:ii+19.:yy1 shift y right by one10.:end while11.:P2(x)F(a) obtain the squared polynomial via F(a12.retあなたはrn P22 単に多項式を合計する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乗はこの問題と同等です。(それらは、(による、それぞれ、他のハードとして最大でそれぞれ231))

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

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

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

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

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