2011-05-14 7 views
5

मैं सभी प्राकृतिक संख्याओं को एक प्रमुख दहलीज तक, प्रमुख कारकों में उनके अपघटन के साथ उत्पन्न करना चाहता हूं।आदेशित अनंत अनुक्रमों की एक अनबाउंड संख्या विलय करना

vGenerate :: [a]     -- generator set for monoid B* (Kleene star of B) 
      -> (a, (a -> a -> a)) -- (identity element, generating function) 
      -> (a -> Bool)  -- filter 
      -> [a]    -- B* filtered 
vGenerate [] (g0,_) _ = [g0] 
vGenerate (e:es) (g0,g) c = 
    let coEs = vGenerate es (g0,g) c 
     coE = takeWhile (c) $ iterate (g e) g0 
    in concatMap (\m -> takeWhile (c) $ map (g m) coE) coEs 

जनरल फिर एक साथ अपने प्रधानमंत्री कारकों के साथ सभी प्राकृतिक संख्या उत्पन्न करता है:

मैं निम्नलिखित समारोह के साथ आया था

gen threshold = 
    let b = map (\x -> (x,[x])) $ takeWhile (<= threshold) primes 
     condition = (<= threshold) . fst 
     g0 = (1,[]) 
     g = \(n,nl)(m,ml) -> ((n*m), nl ++ ml) 
    in vGenerate b (g0,g) condition 

primes = [2,3,5,7,11,.. ] -- pseudo code 

मैं निम्नलिखित प्रश्न हैं:

  • यह हमेशा पहले से ज्ञात नहीं है कि हमें कितनी संख्या की आवश्यकता होगी। क्या हम vGenerate को संशोधित कर सकते हैं जैसे कि यह प्राइम की आलसी अनंत सूची से शुरू होता है, और बढ़ते क्रम में सभी कारकों को उत्पन्न करता है? चुनौती यह है कि हमारे पास प्राइम की अनंत सूची है, प्रत्येक प्रधान के लिए उस प्राइम नंबर की शक्तियों की अनंत सूची है, और फिर सभी संभावित संयोजनों को लेना है। सूचियों को पहले तत्व को बढ़ाकर स्वाभाविक रूप से आदेश दिया जाता है, इसलिए उन्हें आलसी उत्पन्न किया जा सकता है।

  • मैंने इसे मोनोइड के संदर्भ में vGenerate दस्तावेज किया, इसे यथासंभव सार रखने के इरादे से, लेकिन शायद यह कोड को खराब कर देता है? मैं इसे बाद में सामान्य बनाना चाहता हूं (वास्तविक उपयोग के मुकाबले व्यायाम के रूप में अधिक), उदा। कुछ बाधाओं के भीतर रास्टर अंक उत्पन्न करने के लिए, जिसे मोनोइड संदर्भ में भी रखा जा सकता है, इसलिए मैंने सोचा कि समस्या स्थान के सभी संदर्भों से छुटकारा पाने के लिए यह एक अच्छी शुरुआत थी (casu: primes में)। लेकिन मुझे लगता है कि फ़िल्टरिंग फ़ंक्शन अबास्ट्रक्शन में अच्छी तरह से फिट नहीं होता है: पीढ़ी को उस क्रम में होना चाहिए जो सी द्वारा परीक्षण किए गए मीट्रिक के लिए एकनिष्ठ है, क्योंकि जैसे ही सी संतुष्ट नहीं होता है, रिकर्सन समाप्त हो जाता है। कोई सलाह?

उत्तर

6

data-ordlist पैकेज से mergeAll :: Ord a => [[a]] -> [a] पर एक नज़र डालें। जब तक अनुक्रमों का आदेश दिया जाता है, तब तक यह अनंत अनुक्रमों की एक अनबाउंड संख्या विलीन करता है, और अनुक्रमों के प्रमुखों का आदेश दिया जाता है। मैंने इसे पहले इसी तरह की समस्याओं के लिए उपयोग किया है, उदाहरण के लिए 2^i*3^j फॉर्म की सभी संख्याएं उत्पन्न करने के लिए।

> let numbers = mergeAll [[2^i*3^j | j <- [0..]] | i <- [0..]] 
> take 20 numbers 
[1,2,3,4,6,8,9,12,16,18,24,27,32,36,48,54,64,72,81,96] 

आपको अपने कारकों के साथ सभी संख्याएं उत्पन्न करने के लिए इसे विस्तारित करने में सक्षम होना चाहिए।

+0

धन्यवाद। यह वास्तव में गायब टुकड़ा है। – sleepyMonad

संबंधित मुद्दे