FFT-less


14

मान लीजिए कि हमें दिया जाता है अलग पूर्णांकों एक 1 , एक 2 , ... , एक n , जैसे कि 0 एक मैंकश्मीर n कुछ निरंतर के लिए कश्मीर > 0 , और सभी के लिए मैंna1,a2,,an0aiknk>0i

हम सभी संभव जोड़ो में रकम की गिनती कर रहे हैं ढूँढने में दिलचस्पी । ( i = j की अनुमति है)।Sij=ai+aji=j

एक एल्गोरिथ्म बहुपद के निर्माण के लिए है डिग्री के कश्मीर एन , और फूरियर विधि को बदलने और बहुपद जिसके परिणामस्वरूप में अपने गुणांक के साथ शक्तियों दूर पढ़ का उपयोग कर अपने वर्ग की गणना। यह एक O ( n log n ) टाइम एल्गोरिथम है।P(x)=j=1nxajknO(nlogn)

मेरे दो सवाल हैं:

  • क्या कोई एल्गोरिथ्म है जो एफएफटी का उपयोग नहीं करता है?O(nlogn)

  • क्या बेहतर एल्गोरिदम ज्ञात हैं (यानी )? (एफएफटी की अनुमति है)।o(nlogn)


एफएफटी का उपयोग नहीं करना क्यों महत्वपूर्ण है? ऐसा लगता है कि आपके पास पहले से ही आपकी समस्या का एक अच्छा समाधान है। एफएफटी का उपयोग नहीं करने की आवश्यकता कहां से आती है? यह मुझे लगता है कि थोपने की बजाय एक स्वाभाविक-स्वाभाविक आवश्यकता है।
डीडब्ल्यू

@ डब्लू: क्योंकि तब कोई सवाल नहीं पूछा जाएगा? :-) मैं यह जानने के लिए उत्सुक हूं कि क्या कोई अलग तरीका है।
आर्यभट्ट

ठीक मिल गया! मैं मानता हूं कि मैं भी उत्सुक हूं। :-) दिलचस्प सवाल के लिए धन्यवाद।
डीडब्ल्यू

@DW: आपका स्वागत है :-)
आर्यभट्ट

जवाबों:


8

ऐसा लगता है कि यह समस्या पूर्णांक / बहुपद वर्ग के बराबर है:

1. यह ज्ञात है कि बहुपद गुणन पूर्णांक गुणन के बराबर है

2. जाहिर है, आपने पहले से ही बहुपद / पूर्णांक वर्ग के लिए समस्या को कम कर दिया है; इसलिए यह समस्या स्क्वेरिंग के रूप में अधिक से अधिक कठिन है।

अब मैं इस समस्या के पूर्णांक को कम करूँगा:

मान लीजिए कि आपके पास एक एल्गोरिथ्म था:

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

यह एल्गोरिथ्म अनिवार्य रूप से एल्गोरिथ्म है जिसे आप अपने प्रश्न में अनुरोध करते हैं। इस प्रकार, अगर मेरे पास एक जादू एल्गोरिथ्म है जो ऐसा कर सकता है, तो मैं एक फ़ंक्शन बना सकता हूं, जो पूर्णांक y को पार करेगा ( ओह हां, मैं मैथजैक्स प्यार करता हूं: पी ):SQUARE(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(a)12.:return P2(2) simply sum up the polynomial13.:end procedure

अजगर ( कोडपैड के साथ परीक्षण ):

#/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 , 3 , 1 ) के कारण एक-दूसरे की तरह कठोर होते हैं )

O(nlogn)O(nlognloglogn)O(nlogn2O(logn))Ω(nlogn)

O(nlogn)

5. अब, आपकी समस्या बिल्कुल गुणा नहीं है, यह चुकता है। तो चुकता करना आसान है? खैर, यह एक खुली समस्या है (अब के लिए नहीं) : स्क्वैरिंग को गुणन की तुलना में अधिक तेज़ एल्गोरिथम होने का पता नहीं है। यदि आप गुणा का उपयोग करने की तुलना में अपनी समस्या के लिए एक बेहतर एल्गोरिथ्म पा सकते हैं; तो यह संभवतः एक सफलता होगी।

O(nlogn) multiplication algorithms use FFT; and as of now squaring is as hard as multiplication. And no, unless a faster algorithm for squaring is found, or multiplication breaks the O(nlogn) barrier, your problem cannot be solved faster than O(nlogn); in fact, it cannot currently be solved in O(nlogn) either, as the best multiplication algorithm only approaches that complexity.

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.