জোড়ের যোগফলের জন্য FFT- কম


14

ধরুন আমরাও তা প্রদত্ত হই n স্বতন্ত্র পূর্ণসংখ্যার a1,a2,…,an , যেমন যে 0≤ai≤kn কিছু ধ্রুবক জন্য k>0 , এবং সবার জন্য i ।

আমরা সব সম্ভব pairwise অঙ্কের এর গন্য পেতে আগ্রহী হন । ( অনুমোদিত)Sij=ai+aji=j

এক অ্যালগরিদম বহুপদী গঠন করা হয় ডিগ্রী ≤ ট এন , এবং ফুরিয়ার পদ্ধতি রুপান্তর এবং বহুপদী ফলে তাদের কোফিসিয়েন্টস সঙ্গে ক্ষমতা বন্ধ পড়া ব্যবহার তার বর্গ গনা। এটি একটি ও ( এন লগ এন ) সময়ের অ্যালগরিদম।P(x)=∑j=1nxaj≤knO(nlog⁡n)

আমার দুটি প্রশ্ন আছে:

  • এমন কোনও অ্যালগরিদম আছে যা এফএফটি ব্যবহার করে না?O(nlog⁡n)

  • আরও ভাল অ্যালগরিদম পরিচিত (যেমন )? (এফএফটি অনুমোদিত)।o(nlog⁡n)


কেন এফএফটি ব্যবহার না করা গুরুত্বপূর্ণ? মনে হচ্ছে আপনার সমস্যার সমাধান ইতিমধ্যে আপনার কাছে রয়েছে। এফএফটি ব্যবহার না করার প্রয়োজনীয়তা কোথা থেকে এসেছে? এটি আমার জন্য চাপিয়ে দেওয়ার মতো একটি অপ্রাকৃত প্রাকৃতিক প্রয়োজনের মতো মনে হয়।
— DW

@ ডাব্লুডাব্লু: কারণ তখন জিজ্ঞাসা করার মতো প্রশ্ন থাকবে না? :-) আমি ভিন্ন আগ্রহ আছে কিনা তা জানতে আগ্রহী।
— আর্যভট্ট

ঠিক আছে বুঝেছি! আমি স্বীকার করি আমিও কৌতূহলী। :-) আকর্ষণীয় প্রশ্নের জন্য আপনাকে ধন্যবাদ।
— DW

@ ডাব্লুডাব্লু: আপনাকে স্বাগতম :-)
— আর্যভট্ট

উত্তর:


8

দেখে মনে হবে এই সমস্যাটি পূর্ণসংখ্যা / বহুভুজ স্কোয়ারিংয়ের সমতুল্য:

1. এটি বহুল পরিমাণ গুণফল পূর্ণসংখ্যার গুণকের সমান বলে জানা যায় ।

২ স্পষ্টতই, আপনি ইতিমধ্যে সমস্যাটিকে বহুবর্ষ / পূর্ণসংখ্যার স্কোয়ারিংয়ে কমিয়ে দিয়েছেন; সুতরাং এই সমস্যাটি স্কোয়ারিংয়ের মতো সর্বাধিক শক্ত।

এখন আমি এই সমস্যার পূর্ণসংখ্যা স্কোয়ারিং হ্রাস করব:

মনে করুন আপনার একটি অ্যালগোরিদম ছিল:

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

এই অ্যালগরিদমটি মূলত আপনার প্রশ্নের আপনার অনুরোধ করা অ্যালগরিদম। সুতরাং, যদি আমার কাছে এমন কোনও যাদু অ্যালগরিদম থাকে যা এটি করতে পারে তবে আমি একটি ফাংশন তৈরি করতে পারি, যা পূর্ণসংখ্য y এর বর্গাকার করবে ( ওঁ হ্যাঁ, আমি গণিতকে ভালবাসি: পি ):SQUARE(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.: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

৩. সুতরাং, স্কোয়ারিং এ সমস্যাটি যতটা শক্ত।

4. সুতরাং, পূর্ণসংখ্যা স্কোয়ারিং এই সমস্যার সমতুল্য। (তারা ( 2 , 3 , 1 ) এর কারণে একে অপরের তুলনায় সবচেয়ে কঠোর )

O(nlog⁡n)O(nlog⁡nlog⁡log⁡n)O(nlog⁡n2O(log∗⁡n))Ω(nlog⁡n)

O(nlog⁡n)

৫. এখন, আপনার সমস্যাটি হুবহু গুণ নয়, এটি স্কোয়ারিং। সুতরাং স্কোয়ারিং সহজ? ঠিক আছে, এটি একটি উন্মুক্ত সমস্যা (এখনকার জন্য নয় ) : স্কোয়ারিংয়ের গুণণের চেয়ে দ্রুত অ্যালগরিদম আছে বলে জানা যায় না। আপনি যদি গুণটির ব্যবহারের চেয়ে আপনার সমস্যার জন্য আরও ভাল অ্যালগরিদম খুঁজে পেতে পারেন; তাহলে এটি সম্ভবত একটি যুগান্তকারী হবে।

এখন হিসাবে আপনার উভয় প্রশ্নের উত্তর হ'ল: না , এখন পর্যন্ত সমস্ত ~হে(এনলগ⁡এন)গুণের অ্যালগোরিদমগুলি এফএফটি ব্যবহার করে; এবং এখন স্কোয়ারিং গুণফল হিসাবে শক্ত। এবং না , যদি না স্কোয়ারিংয়ের জন্য একটি দ্রুত অ্যালগরিদম না পাওয়া যায়, বা গুণনটি ব্রেক হয়হে(এনলগ⁡এন) বাধা, আপনার সমস্যাটির চেয়ে দ্রুত সমাধান করা যায় না হে(এনলগ⁡এন); আসলে, এটি বর্তমানে সমাধান করা যায় নাহে(এনলগ⁡এন) উভয়ই, সেরা গুণিত অ্যালগরিদম হিসাবে কেবল সেই জটিলতার দিকেই যায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.