बड़ी संख्या के साथ गणना मॉड्यूलो एन करते समय, उदाहरण के लिए mod (123456789^987654321) n
के दौरान आपको बड़ी प्रदर्शनता दंड का सामना करना पड़ेगा। इसके बजाय आपको अपने ^
का उपयोग करना होगा जो आंतरिक रूप से इंटरमीडिएट गणनाओं के लिए मॉड एन की भी गणना करता है।अभिव्यक्तियों की गणना मॉड्यूलो एन
निश्चित रूप से, मैं आसानी से अपने कार्यों को कार्यान्वित कर सकता हूं, लेकिन फिर मुझे प्रत्येक ऑपरेशन के लिए स्पष्ट रूप से "mod n" कहना होगा। इसके बजाय कोई एक संख्यात्मक अभिव्यक्ति वृक्ष का निर्माण कर सकता है और वास्तविक गणना को रोक सकता है, और अंत में राज्य मॉड्यूलो एन केवल एक बार। (नीचे मेरा कोड देखें)
मैंने स्पष्ट रूप से यह दिखाने के लिए शुरुआत की कि मेरा क्या मतलब है, लेकिन मुझे आश्चर्य है कि इसमें पहले से ही कार्यान्वयन मौजूद हैं, ऐसा लगता है कि किसी को इसे लागू करना चाहिए था।
module Modulo where
data Expr =
V Integer
| Plus Expr Expr
| Mult Expr Expr
deriving (Eq, Show)
instance Num Expr where
(+) = Plus
(*) = Mult
fromInteger = V
eval :: Integer -> Expr -> Integer
eval m (V i) = i `mod` m
eval m (Plus e1 e2) = (eval m e1 + eval m e2) `mod` m
eval m (Mult e1 e2) = (eval m e1 * eval m e2) `mod` m
fifteen :: Expr
fifteen = 10 + 5
test = eval 13 fifteen
क्या आपको 'एम' में 'एम' में रनटाइम पर बदलने योग्य होना चाहिए, या यह संकलन समय पर तय करने के लिए पर्याप्त है? यदि संकलन-समय पर्याप्त मामला है, तो आप बस कुछ नए टाइप किए गए 'इंटीगर' के लिए एक मॉड्यूलो-अरिथेमेटिक 'न्यू'-उदाहरण परिभाषित कर सकते हैं ... – hvr
मैं इसे रनटाइम पर बदलना चाहता हूं। क्षमा करें, मुझे इसका उल्लेख करना चाहिए था। – Tarrasch