मैंने लिखा हैप्रिम फ़ंक्शन। यह जांचता है कि दिया गया नंबर प्राइम है या नहीं। अंतिम "प्राइम" सूची अलग से दी जाती है।समेकित फ़ंक्शन बहुत धीमा है
prime :: [Integer]
prime = 2 : filter isPrime [3..]
isPrime :: Integer -> Bool
isPrime n | n < 2 = False
isPrime n = all (\p -> n `mod` p /= 0) . takeWhile ((<=n) . (^2)) $ prime
मैंने सोचा कि यह हमेशा से एक में दो कार्यों को मजबूत करने की बेहतर था अगर possible..so मैं एक समारोह isPrime2 में isPrime और प्रधानमंत्री को समेकित किया। लेकिन isPrime2 का प्रदर्शन बहुत खराब है।
isPrime2 :: Integer -> Bool
isPrime2 n | n < 2 = False
isPrime2 n = all (\p -> n `mod` p /= 0) . takeWhile ((<=n) . (^2)) $ 2 : filter isPrime2 [3..]
isPrime 40000000000000000001
=> 0.5 सेकंड
isPrime2 40000000000000000001
=> 19.8 सेकंड
मेरे मशीन उबंटू 17.10 x86-64 है। मैं ghc 8.2.1 का उपयोग कर रहा हूँ। क्या किसी को पता है क्यों?
मेरा अनुमान यह होगा कि चूंकि 'प्राइम' निरंतर है, इसलिए यह ज्ञात हो जाता है, जबकि 'isPrime2' एक फ़ंक्शन है, इसलिए ऐसा नहीं होता है। यह केवल एक अनुमान है, हालांकि ... – MathematicalOrchid
धन्यवाद! आपकी व्याख्या ने मुझे अंतर्दृष्टि दी। – eii0000
@ eii0000 क्या आप इसे संकलित या व्याख्या का परीक्षण कर रहे हैं? यदि आप अपने 'isPrime2 n' को '' सभी (\ p -> n' mod' p/= 0) के रूप में सरल बनाते हैं तो इसकी तुलना कैसे की जाती है। TakeWhile ((<= n)। (^ 2)) $ 2: [3,5 ..] ''? –