कुशलता से प्राकृतिक संख्याओं के एक सेट के अधिकतम जोड़ीदार जीसीडी को खोजना


9

निम्नलिखित समस्या पर विचार करें:

बता दें कि प्राकृतिक संख्याओं का एक सीमित उपसमुच्चय है।S={s1,s2,...sn}

Let | जहां और का सबसे बड़ा सामान्य विभाजक हैG={ gcd(si,sj)si,sjS, sisj}gcd(x,y)xy

का अधिकतम तत्व ज्ञात ।G

यूक्लिड के एल्गोरिथ्म का उपयोग करके और सबसे बड़े एक का ट्रैक रखते हुए प्रत्येक जोड़ी का सबसे बड़ा सामान्य विभाजक लेकर इस समस्या को हल किया जा सकता है।

क्या इसे हल करने का अधिक कुशल तरीका है?


3
आप खनन आपके पीएस और क्यूएस की धारा 3.3 : नेटवर्क डिवाइसेस में व्यापक कमजोर कुंजी का पता लगाना चाहते हैं (हेनिंग एट अल, यूज़निक्स सिक्योरिटी 2012)। वे एक निश्चित सेटिंग में, उत्पाद वृक्षों और शेष पेड़ों का उपयोग करते हुए, एक निश्चित सेटिंग में, युग्मक gcd's की में गणना के लिए एक एल्गोरिथ्म का वर्णन करते हैं। मुझे नहीं पता कि यह आपकी समस्या तक फैली है, हालांकि। O(nlgn)
DW

क्या आपने प्रधान कारकों के साथ कुछ भी करने की कोशिश की है?
रयान

1
मान लीजिए कि सभी संख्या अपेक्षाकृत प्रमुख हैं, लेकिन कारक के लिए कठिन हैं (उदाहरण के लिए प्रत्येक बड़े अलग-अलग primes लिए बराबर है )। तब सभी जोड़ीदार जीसीडी की जांच करने से बचना मुश्किल लगता है। (कहो कि मैं आपको बताता हूं कि सभी जोड़ियों की जाँच करने के बाद लेकिन कि सभी जोड़ीदार GCDs । आप अनुमान बिना अनुमान कैसे लगा सकते हैं ?)sipiqipi,qi(sn1,sn)1gcd(sn1,sn)
usul

@usul डीडब्ल्यू का लिंक ठीक यही समस्या है। एक बड़ी संख्या, कहते हैं कि एक अरब, एन्क्रिप्शन कुंजी सभी दो अलग-अलग primes के उत्पाद होने चाहिए। लेकिन हमें संदेह है कि कुछ एन्क्रिप्शन कुंजी में एक सामान्य कारक होता है (जो कि दोनों कुंजी की gcd होगी, जिससे दोनों को कारक बनाना आसान होगा)। वह एल्गोरिथ्म आपको n (n-1) / 2 gcd की n = 1 बिलियन की गणना के बिना सामान्य कारक के साथ कुंजी खोजने देता है।
gnasher729

जवाबों:


-2

यहां एक कुशल एल्गोरिदम ( पायथन में ) है। कृपया नीचे दिए गए स्पष्टीकरण का पता लगाएं।

def max_gcd_pair(S):
    # Assumption 1: S is the list of numbers
    # Assumption 2: There are no duplicates in S

    s = set(S)
    m = max(S)

    res = 0
    i = m

    while(i > 0):
        a = i
        cnt = 0
        while (a<=m): # a maxed at max of the list
            if a in s:   
               cnt += 1
            a += i

        if cnt >= 2:  # we have found the result
            res = i
            break

        i = i -1 

    return res

उपरोक्त कोड स्निपेट की व्याख्या:

हम इस समस्या में निम्नलिखित का पालन करते हैं:

  1. परिणाम इससे अधिक नहीं हो सकता max(S)
  2. परिणाम एक संख्या है, जिसमें इस सूची में दो या अधिक गुणक हैं S
  3. वास्तव में, परिणाम maxउपरोक्त वर्णित संपत्ति के साथ ऐसी सभी संख्याओं का है।

इन टिप्पणियों के साथ, कार्यक्रम निम्नलिखित करता है:

  1. setसूची बनाओ । के रूप में सेट में कुशलता से खोजा जा सकता हैO(log(n))
  2. सूची की अधिकतम ज्ञात करें और इसे चर में संग्रहीत करें m
  3. mतब से शुरू करें 1, पहली संख्या ज्ञात करें जिसमें सेट में दो या अधिक गुणक हों। इस तरह की पहली संख्या का परिणाम है।

मुझे लगता है, यह स्पष्ट है। कृपया मुझे बताएं कि क्या आपको अधिक विस्तृत स्पष्टीकरण की आवश्यकता है।


1
क्या आप अपने एल्गोरिथ्म को शब्दों में समझा सकते हैं? यह कोई प्रोग्रामिंग साइट नहीं है।
युवल फिल्मस

@YuvalFilmus मैंने स्पष्टीकरण जोड़ा है। उम्मीद है की यह मदद करेगा।
सुभेंदु रंजन मिश्र

2
क्या होगा यदि सभी तत्व अद्वितीय हैं? इसका मतलब यह नहीं है कि अधिकतम जीसीडी 1 है। उदाहरण के लिए सेट पर विचार करें , जहां अधिकतम जीसीडी 2 है।{2,4}
युवल फिल्मस

हर के लिए @YuvalFilmus iके साथ शुरू mतक 1हम जांच यदि दो या अधिक गुणकों के iसेट में हैं। इस निर्वासन में 2 के 2 गुणक सेट 2 और 4` में होते हैं। तो जवाब 2. आंतरिक है whileपाश चेकों सभी की multples iतक m' as m` सूची के masx है।
सुभेंदु रंजन मिश्र

1
खैर, यह एक भयानक एल्गोरिथ्म है। दो नंबर की एक सरणी के लिएx,y लंबाई की nबिट्स प्रत्येक, जीसीडी की गणना बहुपद समय लेती है, जबकि आपका एल्गोरिथ्म सबसे खराब स्थिति में (जब संख्या अपेक्षाकृत प्रमुख होती है) घातीय समय लेता है।
युवल फिल्मस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.