बैरेट रिडक्शन

From Vigyanwiki

मॉड्यूलर अंकगणित में बैरेट रिडक्शन 1986 में पी.डी. द्वारा प्रारम्भ किया गया एक रिडक्शन कलन विधि है। बैरेट[1] कंप्यूटिंग का सरल उपाय

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

ऐतिहासिक रूप से वैल्यू के लिए , बैरेट रिडक्शन को संचालित करके सम्पूर्ण प्रोडक्ट ab की गणना की गई। हाल ही में यह दिखाया गया कि यदि हम किसी ऑपरेंड पर पूर्वगणना कर सकते हैं। तो पूर्ण उत्पाद अनावश्यक होता है।[2][3]


सामान्य विचार

हम एक फ़ंक्शन कहते हैं एक पूर्णांक सन्निकटन यदि . एक मापांक के लिए और एक पूर्णांक सन्निकटन , हम परिभाषित करते हैं जैसा

.

के सामान्य विकल्प फर्श समारोह, छत समारोह और गोलाई फ़ंक्शन हैं।

आम तौर पर, बैरेट गुणन दो पूर्णांक सन्निकटन निर्दिष्ट करके प्रारम्भ होता है और एक यथोचित निकट सन्निकटन की गणना करता है जैसा

.

मामला पी.डी. द्वारा पेश किया गया था बैरेट [1]फ़्लोर-फ़ंक्शन मामले के लिए . के लिए सामान्य मामला संख्या सिद्धांत पुस्तकालय में पाया गया था।[2]पूर्णांक सन्निकटन दृश्य और मोंटगोमरी गुणन और बैरेट गुणन के बीच पत्राचार की खोज हनो बेकर, विंसेंट ह्वांग, मैथियास जे. कन्नविशर, बो-यिन यांग और शांग-यी यांग द्वारा की गई थी।[3]


एकल-शब्द बैरेट कमी

जब मान मशीनी शब्दों में फिट होते हैं तो बैरेट ने प्रारम्भ में उपरोक्त एल्गोरिदम के पूर्णांक संस्करण पर विचार किया। हम फ़्लोर-फ़ंक्शन केस के विचार का वर्णन करते हैं।

गणना करते समय अहस्ताक्षरित पूर्णांकों के लिए, स्पष्ट एनालॉग के लिए विभाजन का उपयोग करना होगा :

func reduce(a uint) uint {
    q:= a / n  // Division implicitly returns the floor of the result.
    return a - q * n
}

हालाँकि, विभाजन महंगा हो सकता है और, क्रिप्टोग्राफ़िक सेटिंग्स में, कुछ सीपीयू पर एक निरंतर-समय निर्देश नहीं हो सकता है, जो ऑपरेशन को समय पर हमला के अधीन करता है। इस प्रकार बैरेट कमी अनुमानित है एक मूल्य के साथ क्योंकि विभाजन द्वारा यह सिर्फ एक राइट-शिफ्ट है, और इसलिए यह सस्ता है।

के लिए सर्वोत्तम मूल्य की गणना करने के लिए दिया गया विचार करना:

के लिए पूर्णांक होने के लिए, हमें पूर्णांक बनाना होगा किसी तरह। निकटतम पूर्णांक तक पूर्णांकित करने से सर्वोत्तम सन्निकटन मिलेगा, लेकिन इसका परिणाम हो सकता है से बड़ा होना , जो अंडरफ्लो का कारण बन सकता है। इस प्रकार अहस्ताक्षरित अंकगणित के लिए उपयोग किया जाता है।

इस प्रकार हम निम्नलिखित के साथ उपरोक्त फ़ंक्शन का अनुमान लगा सकते हैं:

func reduce(a uint) uint {
    q := (a * m) >> k // ">> k" denotes bitshift by k.
    return a - q * n
}

हालाँकि, जब से , का मान है q उस फ़ंक्शन में अंत में एक बहुत छोटा हो सकता है, और इस प्रकार a केवल भीतर होने की गारंटी है इसके बजाय जैसा कि आम तौर पर आवश्यक है. एक सशर्त घटाव इसे ठीक करेगा:

func reduce(a uint) uint {
    q := (a * m) >> k
    a -= q * n
    if a >= n {
        a -= n
    }
    return a
}


एकल-शब्द बैरेट गुणन

कल्पना करना पूर्व से ज्ञात है. यह हमें पूर्व-गणना करने की अनुमति देता है तक पहुँचने से पहले . बैरेट गुणन गणना , के उच्च भाग का अनुमान लगाता है साथ

,

और सन्निकटन को घटा देता है। तब से

 का गुणज है ,

परिणामी मूल्य


का प्रतिनिधि है .

बैरेट और मोंटगोमरी गुणन के बीच पत्राचार

याद रखें कि अहस्ताक्षरित मोंटगोमरी गुणन एक प्रतिनिधि की गणना करता है जैसा

.

वास्तव में, यह मान बराबर है .

हम दावे को इस प्रकार साबित करते हैं।