2012-09-24 41 views
13

जेनरेटिंग प्राइम नंबर एक खिलौना समस्या है जिसे मैं अक्सर समय-समय पर प्रयास करता हूं, खासकर जब एक नई प्रोग्रामिंग भाषा, मंच या शैली के साथ प्रयोग करते हैं।प्राइम नंबर जेनरेट करने के लिए समांतर एल्गोरिदम (संभवतः हडोप के मानचित्र का उपयोग करने के लिए)

मैं हाडोप (मानचित्र कम करने) का उपयोग करके प्राइम नंबर जेनरेशन एल्गोरिदम या प्राइम नंबर टेस्ट एल्गोरिदम लिखने का प्रयास कर रहा था।

मैंने सोचा कि मैं इस सवाल को सुझाव, संदर्भ, एल्गोरिदम, दृष्टिकोण प्राप्त करने के लिए पोस्ट करूंगा।

हालांकि मेरी प्राथमिक हित एक मानचित्र में कमी आधारित एल्गोरिथ्म मैं नए Hadoop प्रोग्रामिंग मॉडल को देखकर कोई फ़र्क नहीं पड़ेगा या उदाहरण के लिए का उपयोग कर PiCloud

मैं प्रधान संख्या पीढ़ी पर यहाँ कुछ दिलचस्प सवाल लगता है पर देख रहा है: here, here और here, लेकिन समांतर दृष्टिकोण से संबंधित कुछ भी मेरी आंख को पकड़ा नहीं।

अग्रिम धन्यवाद।

+0

http://www.mersenne.org और http://en.wikipedia.org/wiki/Great_Internet_Mersenne_Prime_Search देखें, वहां एक चीनी समूह भी है जो बहुत बड़े प्राइम नंबर पाता है और मुझे पूरा यकीन है कि वे दोनों – pyCthon

उत्तर

11

यहां an algorithm है जो मानचित्रण और घटाने पर बनाया गया है (folding)। यह व्यक्त करता sieve of Eratosthenes

        पी = {3,5,7, ...} \ यू {{पी , पी + 2p, पी + 4 पी, ...} | पी}

अजीब अभाज्य संख्या के लिए

हैं (यानी 2 के बिना) में पी। तह अनिश्चित काल के लिए सही करने के लिए मजबूत बनाने की है, इस तरह:

tree-like folding

जहां प्रत्येक अभाज्य संख्या है कि प्रधानमंत्री, उदा की विषम गुणकों की एक धारा के निशान के लिए: 49, 49 + 14, 49 + 28, ..., सभी सभी संयुक्त संख्या प्राप्त करने के लिए बनाए गए हैं, जो है, और फिर अभाज्य संख्या अंतराल में पाए जाते हैं संयुक्त संख्या के बीच। यह हास्केल में है, इसलिए समय को आलसी मूल्यांकन तंत्र (और एल्गोरिदमिक समायोजन) द्वारा समेकित रूप से देखभाल की जाती है, जहां प्रत्येक तुलना नोड हमेशा को दाएं से दाएं से नंबर की मांग किए बिना बाईं ओर नंबर देता है, क्योंकि यह है वैसे भी बड़ा होने की गारंटी)

बाधाएं चीजों को सरल बनाने के लिए विषम प्राइम्स के बजाय विषम प्राइम्स के बजाय बाधाओं का उपयोग किया जा सकता है (स्पष्ट प्रदर्शन प्रभाव के साथ)।

काम स्वाभाविक रूप से लगातार प्राइम के वर्गों के बीच खंडों में विभाजित किया जा सकता है।हास्केल कोड इस प्रकार है, लेकिन हम एक निष्पादन योग्य स्यूडोकोड के रूप में यह मानते हैं कर सकते हैं भी (जहां : एक सूची नोड आलसी निर्माता, एक समारोह कॉल f(x)f x लिखा है, और कोष्ठक केवल समूहीकरण के लिए उपयोग किया जाता है):

primes() = 2 : ([3,5..] `minus` unionAll [[p*p, p*p+2*p..] | p <- prs]) 
    where 
    prs = 3 : ([5,7..] `minus` unionAll [[p*p, p*p+2*p..] | p <- prs]) 
    unionAll ((x:xs):t) = x : union xs (unionAll (pairs t)) 
    pairs ((x:xs):ys:t) = (x : union xs ys) : pairs t 

union (x:xs) (y:ys) = case compare x y of 
    LT -> x : union xs (y:ys) 
    EQ -> x : union xs ys 
    GT -> y : union (x:xs) ys 

minus (x:xs) (y:ys) = case compare x y of 
    LT -> x : minus xs (y:ys) 
    EQ ->  minus xs ys 
    GT ->  minus (x:xs) ys 

एक चर्चा here है। अधिक परिष्कृत, आलसी शेड्यूलिंग here है। इसके अलावा this SO answer जनरेटर के संदर्भ में (संबंधित) हास्केल कोड का अनुमानित अनुवाद दिखाता है।

+0

ऐसा करने के लिए एक सभ्य समांतर एल्गोरिदम (एमपीआई/वितरित) है, बस एक तरफ ध्यान दें कि इसकी जटिलता बड़ी ओ (एन एलएन (एलएन (एन)) होगी? – pyCthon

+0

यह एक वितरित कोड के लिए भी बुरा नहीं होगा – pyCthon

+1

मुझे ऐसा नहीं लगता है, नहीं। 'N लॉग (लॉग एन) 'को * एड्रेस * के रूप में मूल्य का उपयोग करने की क्षमता पर अनुमानित किया गया है, ताकि ओ (1) समय में एकाधिक के साथ प्रविष्टि को समग्र रूप से जोड़ा जा सके। लेकिन यहां मूल्यों की तुलना की जाती है और डुप्लीकेट हटा दिए जाते हैं। यह पूर्णांक सॉर्टिंग और तुलनात्मक प्रकारों के बीच भेद की तरह है, जो हमेशा 'कम से कम' अतिरिक्त 'लॉग एन' कारक लेते हैं। [अनुभवजन्य] (http://en.wikipedia.org/ wiki/Analysis_of_algorithms # अनुभवजन्य _orders_of_growth) यह [~ n^1.2 .. 1.25'] (http://ideone.com/p0e81) पर चलता है (पहले कुछ लाखों प्राइम का उत्पादन करने के लिए, और खराब होने पर _TMWE_ प्रविष्टि देखें)। –