वर्ग द्वारा घातांक: Difference between revisions
m (Abhishek moved page वर्ग करके घातांक to वर्ग द्वारा घातांक without leaving a redirect) |
No edit summary |
||
Line 1: | Line 1: | ||
{{short description|Algorithm for fast exponentiation}} | {{short description|Algorithm for fast exponentiation}}गणित और [[कंप्यूटर प्रोग्रामिंग]] में, वर्ग द्वारा घातांक एक [[संख्या]] की बड़ी [[सकारात्मक पूर्णांक]] शक्तियों की तेजी से गणना के लिए एक सामान्य विधि है, या अधिक सामान्यतः एक अर्धसमूह के एक अवयव की, जैसे [[बहुपद]] या वर्ग मैट्रिक्स द्वारा इसकी गणना की जा सकती है। कुछ वेरिएंट्स को सामान्यतः वर्ग-और-गुणा एल्गोरिदम या बाइनरी प्रतिपादक के रूप में संदर्भित किया जाता है। ये काफी सामान्य उपयोग के हो सकते हैं, उदाहरण के लिए [[मॉड्यूलर अंकगणित]] या मेट्रिसेस की शक्ति। [[ semigroup |अर्धसमूह]] के लिए जिसके लिए एबेलियन समूह नोटेशन का सामान्यतः उपयोग किया जाता है, जैसे [[क्रिप्टोग्राफी]] में उपयोग किए जाने वाले [[अण्डाकार वक्र|वक्राकार वक्र]], इस विधि को डबल-एंड-ऐड भी कहा जाता है। | ||
गणित और [[कंप्यूटर प्रोग्रामिंग]] में, वर्ग द्वारा घातांक एक [[संख्या]] की बड़ी [[सकारात्मक पूर्णांक]] शक्तियों की तेजी से गणना के लिए एक सामान्य विधि है, या अधिक सामान्यतः एक अर्धसमूह के एक | |||
== मूल विधि == | == मूल विधि == | ||
Line 23: | Line 19: | ||
exp_by_squaring (एक्स, एन) | exp_by_squaring (एक्स, एन) | ||
अगर एन <0 तो | |||
वापसी exp_by_squaring (1 / x, -n); | |||
वरना अगर n = 0 तब | |||
वापसी 1; | |||
अन्यथा यदि n तब भी है | |||
रिटर्न exp_by_squaring(x * x, n / 2); | |||
वरना अगर n विषम है तो | |||
वापसी x * exp_by_squaring (x * x, (n - 1) / 2); | |||
अंत | अंत फलन | ||
प्रत्येक पुनरावर्ती कॉल में, बाइनरी प्रतिनिधित्व के कम से कम महत्वपूर्ण अंक {{mvar|n}} हटा दिया गया। यह इस प्रकार है कि पुनरावर्ती कॉल की संख्या है <math>\lceil \log_2 n\rceil,</math> के बाइनरी प्रतिनिधित्व के [[ अंश ]] | प्रत्येक पुनरावर्ती कॉल में, बाइनरी प्रतिनिधित्व के कम से कम महत्वपूर्ण अंक {{mvar|n}} हटा दिया गया। यह इस प्रकार है कि पुनरावर्ती कॉल की संख्या है <math>\lceil \log_2 n\rceil,</math> के बाइनरी प्रतिनिधित्व के [[ अंश |अंश]] की संख्या {{mvar|n}}. तो यह एल्गोरिथ्म वर्गों की संख्या और गुणन की कम संख्या की गणना करता है, जो की संख्या के बराबर है, {{math|1}} के बाइनरी प्रतिनिधित्व में {{mvar|n}} संचालन की इस एल्गोरिथम संख्या की तुलना उस तुच्छ एल्गोरिथम से की जानी चाहिए जिसकी आवश्यकता {{math|''n'' − 1}} गुणन होती है। | ||
यह एल्गोरिदम [[टेल कॉल]] नहीं है | यह एल्गोरिदम [[टेल कॉल]] नहीं है, टेल-पुनरावर्ती इसका तात्पर्य यह है कि इसके लिए एक सहायक मेमोरी की आवश्यकता होती है जो पुनरावर्ती कॉल की संख्या के लगभग आनुपातिक (या उच्चतर, यदि कोई डेटा के बढ़ते आकार को ध्यान में रखता है) है। | ||
अगले खंड के एल्गोरिदम एक अलग दृष्टिकोण का उपयोग करते हैं, और परिणामी एल्गोरिदम को समान संख्या में संचालन की आवश्यकता होती है, लेकिन एक सहायक मेमोरी का उपयोग करें जो परिणाम को संग्रहीत करने के लिए आवश्यक मेमोरी के समान है। | अगले खंड के एल्गोरिदम एक अलग दृष्टिकोण का उपयोग करते हैं, और परिणामी एल्गोरिदम को समान संख्या में संचालन की आवश्यकता होती है, लेकिन इसमें एक सहायक मेमोरी का उपयोग करें जो परिणाम को संग्रहीत करने के लिए आवश्यक मेमोरी के समान है। | ||
=== निरंतर सहायक स्मृति के साथ === | === निरंतर सहायक स्मृति के साथ === | ||
Line 48: | Line 44: | ||
\end{cases} | \end{cases} | ||
</math> | </math> | ||
यदि कोई पुनरावर्ती रूप से इस सूत्र को लागू करता है, | यदि कोई पुनरावर्ती रूप से इस सूत्र को लागू करता है, {{math|1=''y'' = 1}} से प्रारम्भ करके, अंततः एक घातांक {{math|0}} के बराबर मिलता है, और फिर वांछित परिणाम बायाँ कारक है। | ||
इसे | इसे पुनरावर्ती कार्य के रूप में कार्यान्वित किया जा सकता है: | ||
<syntaxhighlight lang="pascal"> | <syntaxhighlight lang="pascal"> | ||
Function exp_by_squaring(x, n) | Function exp_by_squaring(x, n) | ||
Line 79: | Line 75: | ||
return x * y | return x * y | ||
</syntaxhighlight> | </syntaxhighlight> | ||
एल्गोरिदम की शुद्धता इस तथ्य से उत्पन्न होती है कि <math>yx^n</math> गणना के दौरान अपरिवर्तनीय है; यह | एल्गोरिदम की शुद्धता इस तथ्य से उत्पन्न होती है कि <math>yx^n</math> गणना के दौरान अपरिवर्तनीय है; यह <math>1\cdot x^n=x^n</math> है, प्रारम्भ में; और <math>yx^0=y </math> अंत में इसकी गणना की जा सकती है। | ||
ये एल्गोरिदम पूर्ववर्ती अनुभाग के एल्गोरिदम के समान ही संचालन की संख्या का उपयोग करते हैं, लेकिन गुणा एक अलग क्रम में किया जाता है। | ये एल्गोरिदम पूर्ववर्ती अनुभाग के एल्गोरिदम के समान ही संचालन की संख्या का उपयोग करते हैं, लेकिन गुणा एक अलग क्रम में किया जाता है। | ||
Line 85: | Line 81: | ||
== कम्प्यूटेशनल जटिलता == | == कम्प्यूटेशनल जटिलता == | ||
एक संक्षिप्त विश्लेषण से पता चलता है कि ऐसा एल्गोरिदम उपयोग करता है <math>\lfloor \log_2n\rfloor</math> स्क्वायरिंग और अधिक से अधिक <math>\lfloor \log_2n\rfloor</math> गुणन, | एक संक्षिप्त विश्लेषण से पता चलता है कि ऐसा एल्गोरिदम उपयोग करता है <math>\lfloor \log_2n\rfloor</math> स्क्वायरिंग और अधिक से अधिक <math>\lfloor \log_2n\rfloor</math> गुणन, जहाँ <math>\lfloor\;\rfloor</math> [[फर्श समारोह|फ्लोर फलन]] को दर्शाता है। अधिक सटीक रूप से, गुणन की संख्या n के बाइनरी विस्तार में सम्मिलित लोगों की संख्या से एक कम है। लगभग 4 से अधिक n के लिए यह आधार को बार-बार अपने आप से गुणा करने की तुलना में कम्प्यूटेशनल रूप से अधिक कुशल है। | ||
प्रत्येक वर्ग का परिणाम पिछले अंकों की संख्या का लगभग दोगुना होता है, और इसलिए, यदि दो डी-अंकों की संख्या का गुणन O(d) में कार्यान्वित किया जाता है<sup>k</sup>) संचालन कुछ निश्चित k के लिए, फिर कंप्यूटिंग x | प्रत्येक वर्ग का परिणाम पिछले अंकों की संख्या का लगभग दोगुना होता है, और इसलिए, यदि दो डी-अंकों की संख्या का गुणन O(d) में कार्यान्वित किया जाता है<sup>k</sup>) संचालन कुछ निश्चित k के लिए, फिर कंप्यूटिंग x<sup>n</sup> की जटिलता द्वारा दिया गया है | ||
: <math> | : <math> | ||
Line 95: | Line 91: | ||
==2<sup>k</sup>-आरी विधि == | ==2<sup>k</sup>-आरी विधि == | ||
यह एल्गोरिथ्म x | यह एल्गोरिथ्म x<sup>n</sup> के मान की गणना करता है बेस 2 में घातांक को बढ़ाने के बाद यह पहली बार 1939 में [[ब्राउर]] द्वारा प्रस्तावित किया गया था। नीचे दिए गए एल्गोरिदम में हम निम्नलिखित फलन f(0) = (k,0) और f(m) = (s,u) का उपयोग करते हैं, जहां m = u·2S U विषम के साथ उपयोग किया जाता है। | ||
कलन विधि: | '''कलन विधि:''' | ||
इनपुट: G का एक | '''इनपुट:''' G का एक अवयव x, एक पैरामीटर k > 0, एक गैर-ऋणात्मक पूर्णांक {{math|1=''n'' = (''n''<sub>''l''−1</sub>, ''n''<sub>''l''−2</sub>, ..., ''n''<sub>0</sub>)<sub>2<sup>''k''</sup></sub>}} और पूर्व संगणित मान <math>x^3, x^5, ... , x^{2^k-1}</math>. | ||
आउटपुट: | '''आउटपुट:''' अवयव X<sup>n</sup> G में | ||
वाई: = 1; मैं := एल - 1 | वाई: = 1; मैं := एल - 1 | ||
'जबकि' मैं ≥ 0 करते हैं | 'जबकि' मैं ≥ 0 करते हैं | ||
(एस, यू)�:= एफ (एन<sub>i</sub>) | |||
j के लिए�:= 1 से k-s करते हैं | |||
यः= य<sup>2</उप> | |||
यः= य*x<sup>यू</sup> | |||
j के लिए�:= 1 से s करें | |||
यः= य<sup>2</उप> | |||
मैं:= मैं - 1 | |||
वापसी वाई | वापसी वाई | ||
इष्टतम दक्षता के लिए, '' k '' सबसे छोटा पूर्णांक संतोषजनक होना चाहिए<ref name="frey">{{cite book |editor1-last=Cohen |editor1-first=H. |editor2-last=Frey, G. |date=2006 |title=अण्डाकार और हाइपरेलिप्टिक वक्र क्रिप्टोग्राफी की पुस्तिका|series=Discrete Mathematics and Its Applications |publisher=Chapman & Hall/CRC |isbn=9781584885184}}</ref>{{Clarify|reason=It should be specified if this logarithm is in base 2, base 2^k, or base e.|date=May 2020}} | इष्टतम दक्षता के लिए, ''k'' सबसे छोटा पूर्णांक संतोषजनक होना चाहिए<ref name="frey">{{cite book |editor1-last=Cohen |editor1-first=H. |editor2-last=Frey, G. |date=2006 |title=अण्डाकार और हाइपरेलिप्टिक वक्र क्रिप्टोग्राफी की पुस्तिका|series=Discrete Mathematics and Its Applications |publisher=Chapman & Hall/CRC |isbn=9781584885184}}</ref>{{Clarify|reason=It should be specified if this logarithm is in base 2, base 2^k, or base e.|date=May 2020}} | ||
: <math>\log n < \frac{k(k + 1) \cdot 2^{2k}}{2^{k+1} - k - 2} + 1.</math> | : <math>\log n < \frac{k(k + 1) \cdot 2^{2k}}{2^{k+1} - k - 2} + 1.</math> | ||
Line 120: | Line 116: | ||
== स्लाइडिंग-विंडो विधि == | == स्लाइडिंग-विंडो विधि == | ||
यह विधि 2 का एक कुशल रूप है<sup>k</sup>-आर्य विधि। उदाहरण के लिए, | यह विधि 2 का एक कुशल रूप है<sup>k</sup>-आर्य विधि। उदाहरण के लिए, घातांक 398 की गणना करने के लिए, जिसमें बाइनरी एक्सपेंशन (110 001 110) है<sub>2</sub>, हम 2 का उपयोग करके लंबाई 3<sup>k</sup> की विंडो लेते हैं-आर्य विधि एल्गोरिदम और 1, x<sup>3 की गणना करें, एक्स<sup>6, एक्स<sup>12, एक्स<sup>24, एक्स<sup>48, एक्स<sup>49, एक्स<sup>98, एक्स<sup>99, एक्स<sup>198, x<sup>199, एक्स<sup>398. | ||
लेकिन, हम 1, x की गणना भी कर सकते हैं | |||
लेकिन, हम 1, x<sup>3 की गणना भी कर सकते हैं, एक्स<sup>6, एक्स<sup>12, एक्स<sup>24, एक्स<sup>48, एक्स<sup>96, एक्स<sup>192, एक्स<sup>199, एक्स<sup>398, जो एक गुणन बचाता है और मानांकन के बराबर होता है (110 001 110)<sub>2</sub> | |||
यहाँ सामान्य एल्गोरिथ्म है: | यहाँ सामान्य एल्गोरिथ्म है: | ||
कलन विधि: | '''कलन विधि:''' | ||
इनपुट: G का एक | इनपुट: G का एक अवयव x, एक गैर नकारात्मक पूर्णांक {{math|1=''n''=(''n''<sub>''l''−1</sub>, ''n''<sub>''l''−2</sub>, ..., ''n''<sub>0</sub>)<sub>2</sub>}}, एक पैरामीटर k > 0 और पूर्व-परिकलित मान <math>x^3, x^5, ... ,x^{2^k-1}</math>. | ||
आउटपुट: | '''आउटपुट:''' अवयव X<sup>n</sup> ∈ G. | ||
कलन विधि: | '''कलन विधि:''' | ||
वाई: = 1; मैं := एल - 1 | वाई: = 1; मैं := एल - 1 | ||
'जबकि' मैं > -1 'करो' | 'जबकि' मैं > -1 'करो' | ||
'अगर' एन<sub>i</sub> = 0 तब | |||
यः= य<sup>2</sup>' i := i - 1 | |||
अन्य | |||
s := अधिकतम {i - k + 1, 0} | |||
जबकि एन<sub>s</sub> = 0 करो | |||
स := स + 1<ref group="notes">In this line, the loop finds the longest string of length less than or equal to ''k'' ending in a non-zero value. Not all odd powers of 2 up to <math>x^{2^k-1}</math> need be computed, and only those specifically involved in the computation need be considered.</ref> | |||
h के लिए := 1 से i - s + 1 करते हैं | h के लिए := 1 से i - s + 1 करते हैं | ||
यः= य<sup>2</उप> | |||
में�:= (एन<sub>i</sub>, एन<sub>i-1</sub>, ..., एन<sub>s</sub>)<sub>2</sub> | |||
यः= य*x<sup>यू</sup> | यः= य*x<sup>यू</sup> | ||
मैं := एस - 1 | |||
वापसी वाई | वापसी वाई | ||
== मोंटगोमरी की | == मोंटगोमरी की सोपान तकनीक == | ||
घातांक के लिए कई एल्गोरिदम साइड-चैनल हमलों के खिलाफ सुरक्षा प्रदान नहीं करते हैं। अर्थात्, एक | घातांक के लिए कई एल्गोरिदम साइड-चैनल हमलों के खिलाफ सुरक्षा प्रदान नहीं करते हैं। अर्थात्, एक आक्रमणकारी वर्ग और गुणा के अनुक्रम को देखकर (आंशिक रूप से) गणना में सम्मिलित घातांक को पुनर्प्राप्त कर सकता है। यह एक समस्या है और इस प्रतिपादक को गुप्त रहना चाहिए, जैसा कि कई सार्वजनिक-कुंजी क्रिप्टोग्राफ़ी सार्वजनिक-कुंजी क्रिप्टो सिस्टम में होता है। पीटर मोंटगोमरी (गणितज्ञ) नामक एक तकनीक मोंटगोमरी की सोपान<ref name="ladder">{{cite journal |last=Montgomery |first=Peter L. |date=1987 |title=स्पीडिंग द पोलार्ड एंड एलिप्टिक कर्व मेथड्स ऑफ फैक्टराइजेशन|journal=Math. Comput. |volume=48 |number=177 |pages=243–264 |doi=10.1090/S0025-5718-1987-0866113-7 |url=https://www.ams.org/journals/mcom/1987-48-177/S0025-5718-1987-0866113-7/S0025-5718-1987-0866113-7.pdf |doi-access=free }}</ref> इस चिंता को संबोधित करता है। | ||
एक धनात्मक, शून्येतर पूर्णांक n = (n<sub>''k''−1</sub>... | एक धनात्मक, शून्येतर पूर्णांक n = (n<sub>''k''−1</sub>...n<sub>0</sub>)<sub>2,</sub> n<sub>k−1</sub> = 1 के साथ, हम x<sup>n</sup> की गणना कर सकते हैं, इस प्रकार है: | ||
एक्स<sub>1</sub> = एक्स; एक्स<sub>2</sub> = एक्स<sup>2</उप> | एक्स<sub>1</sub> = एक्स; एक्स<sub>2</sub> = एक्स<sup>2</उप> | ||
i = k - 2 से 0 के लिए | i = k - 2 से 0 के लिए | ||
अगर एन<sub>i</sub> = 0 तब | |||
एक्स�<sub>2</sub> = एक्स<sub>1</sub> * एक्स<sub>2</sub>; एक्स<sub>1</sub> = एक्स<sub>1</sub><sup>2</उप> | |||
अन्य | |||
एक्स<sub>1</sub> = एक्स<sub>1</sub> * एक्स<sub>2</sub>; एक्स<sub>2</sub> = एक्स<sub>2</sub><sup>2</उप> | |||
वापसी एक्स<sub>1</sub> | |||
एल्गोरिथ्म संचालन का एक निश्चित अनुक्रम करता है (लॉगन [[तक]]): बिट के विशिष्ट | एल्गोरिथ्म संचालन का एक निश्चित अनुक्रम करता है (लॉगन [[तक]]): बिट के विशिष्ट मान की परवाह किए बिना, प्रतिपादक में प्रत्येक बिट के लिए एक गुणन और वर्ग होता है। दोहरीकरण द्वारा गुणन के लिए एक समान एल्गोरिथ्म सम्मिलित है। | ||
मॉन्टगोमरी की | मॉन्टगोमरी की सोपान का यह विशिष्ट कार्यान्वयन अभी तक कैश टाइमिंग हमलों के खिलाफ सुरक्षित नहीं है: मेमोरी एक्सेस लेटेंसी अभी भी एक आक्रमणकारी के लिए देखी जा सकती है, क्योंकि गुप्त प्रतिपादक के बिट्स के मान के आधार पर विभिन्न चर का उपयोग किया जाता है। आधुनिक क्रिप्टोग्राफ़िक कार्यान्वयन यह सुनिश्चित करने के लिए एक स्कैटर तकनीक का उपयोग करते हैं कि प्रोसेसर सदैव तेज कैश को मेमोरी में स्टोर करता है।<ref>{{cite journal |last1=Gueron |first1=Shay |title=मॉड्यूलर घातांक का कुशल सॉफ्टवेयर कार्यान्वयन|journal=Journal of Cryptographic Engineering |date=5 April 2012 |volume=2 |issue=1 |pages=31–43 |doi=10.1007/s13389-012-0031-5 |s2cid=7629541 |url=https://eprint.iacr.org/2011/239.pdf}}</ref> | ||
== फिक्स्ड-बेस | == फिक्स्ड-बेस घातांक == | ||
एक्स की गणना करने के लिए कई विधियां नियोजित की जा सकती हैं | एक्स<sup>n</sup> की गणना करने के लिए कई विधियां नियोजित की जा सकती हैं जब आधार निश्चित होता है और घातांक बदलता रहता है। जैसा कि कोई देख सकता है, इन एल्गोरिदम में [[पूर्वगणना]] एक महत्वपूर्ण भूमिका निभाते हैं। | ||
=== याओ की विधि === | === याओ की विधि === | ||
याओ की | याओ की {{math|2<sup>''k''</sup>}} विधि ओर्थोगोनल है - आर्य पद्धति जहां घातांक को {{math|1=''b'' = 2<sup>''k''</sup>}} मूलांक में विस्तारित किया जाता है, और गणना उपरोक्त एल्गोरिथम में की गई है। मान लीजिये कि {{mvar|n}}, {{mvar|n<sub>i</sub>}}, {{mvar|b}}, और {{mvar|b<sub>i</sub>}} पूर्णांक हो। | ||
प्रतिपादक को | प्रतिपादक को मान लीजिये कि {{mvar|n}} के रूप में लिखा जाए | ||
: <math> n = \sum_{i=0}^{w-1} n_i b_i,</math> | : <math> n = \sum_{i=0}^{w-1} n_i b_i,</math> | ||
जहाँ <math>0 \leqslant n_i < h</math> सभी के लिए <math>i \in [0, w-1]</math>. | |||
मान लीजिये कि {{math|1=''x<sub>i</sub>'' = ''x<sup>b<sub>i</sub></sup>''}}. | |||
तब एल्गोरिथ्म समानता का उपयोग करता है | तब एल्गोरिथ्म समानता का उपयोग करता है | ||
: <math>x^n = \prod_{i=0}^{w-1} x_i^{n_i} = \prod_{j=1}^{h-1} \bigg[\prod_{n_i=j} x_i\bigg]^j.</math> | : <math>x^n = \prod_{i=0}^{w-1} x_i^{n_i} = \prod_{j=1}^{h-1} \bigg[\prod_{n_i=j} x_i\bigg]^j.</math> | ||
अवयव {{mvar|x}} का {{mvar|G}}, और प्रतिपादक {{mvar|n}} पूर्व संगणित मानों के साथ {{math|1=''x''<sup>''b''<sub>0</sub></sup>...''x''<sup>''b''<sub>''w''−1</sub></sup>}} उपरोक्त रूप में लिखा गया है, अवयव {{mvar|x<sup>n</sup>}} की गणना नीचे एल्गोरिथम का उपयोग करके की जाती है: | |||
वाई = 1, यू = 1, जे = एच -1 | वाई = 1, यू = 1, जे = एच -1 | ||
जबकि j > 0 करते हैं | जबकि j > 0 करते हैं | ||
i = 0 से w - 1 के लिए | |||
अगर एन<sub>i</sub> = जे फिर | |||
यू = यू × एक्स<sup>b<sub>i</sub></सुप> | |||
वाई = वाई × यू | |||
जे = जे - 1 | |||
वापसी वाई | वापसी वाई | ||
अगर हम | अगर हम {{math|1=''h'' = 2<sup>''k''</sup>}} सेट करते हैं और {{math|1=''b<sub>i</sub>'' = ''h<sup>i</sup>''}}, फिर {{mvar|n<sub>i</sub>}} मान केवल अंक हैं {{mvar|n}} बेस में {{mvar|h}}. याओ की विधि उन सबसे पहले आप में {{mvar|x<sub>i</sub>}} एकत्रित होती है, जो उच्चतम शक्ति {{tmath|h - 1}} को दिखाई देते हैं, अगले दौर में सत्ता के साथ {{tmath|h - 2}} में {{mvar|u}} एकत्र किया जाता है, साथ ही y चर को गुणा किया जाता है {{tmath|h - 1}} बार प्रारंभिक के साथ {{mvar|u}}, {{tmath|h - 2}} बार अगली उच्चतम शक्तियों के साथ, और इसी तरह एल्गोरिथम {{tmath|w + h - 2}} उपयोग करता है, गुणन और {{tmath|w + 1}} अवयवों को {{mvar|x<sup>n</sup>}} गणना करने के लिए संग्रहित किया जाना चाहिए।<ref name=frey /> | ||
एल्गोरिथम | |||
=== यूक्लिडियन विधि === | === यूक्लिडियन विधि === | ||
यूक्लिडियन पद्धति को पहली बार पीडी रूइज द्वारा प्रीकंप्यूटेशन और वेक्टर एडिशन चेन का उपयोग करके कुशल | यूक्लिडियन पद्धति को पहली बार पीडी रूइज द्वारा प्रीकंप्यूटेशन और वेक्टर एडिशन चेन का उपयोग करके कुशल प्रतिपादक में पेश किया गया था। | ||
कंप्यूटिंग के लिए यह तरीका <math>x^n</math> समूह में {{math|'''G'''}}, | कंप्यूटिंग के लिए यह तरीका <math>x^n</math> समूह में {{math|'''G'''}}, जहाँ {{mvar|n}} एक प्राकृतिक पूर्णांक है, जिसका एल्गोरिदम नीचे दिया गया है, निम्नलिखित समानता का पुनरावर्ती उपयोग कर रहा है: | ||
: <math>x_0^{n_0} \cdot x_1^{n_1} = \left(x_0 \cdot x_1^q\right)^{n_0} \cdot x_1^{n_1 \mod n_0},</math> | : <math>x_0^{n_0} \cdot x_1^{n_1} = \left(x_0 \cdot x_1^q\right)^{n_0} \cdot x_1^{n_1 \mod n_0},</math> | ||
जहाँ <math>q = \left\lfloor \frac{n_1}{n_0} \right\rfloor</math> | |||
दूसरे शब्दों में, प्रतिपादक का एक यूक्लिडियन विभाजन {{math|''n''<sub>1</sub>}} द्वारा {{math|''n''<sub>0</sub>}} का उपयोग भागफल लौटाने के लिए किया जाता है {{mvar|q}} और | |||
दूसरे शब्दों में, प्रतिपादक का एक यूक्लिडियन विभाजन {{math|''n''<sub>1</sub>}} द्वारा {{math|''n''<sub>0</sub>}} का उपयोग भागफल लौटाने के लिए किया जाता है {{mvar|q}} और विराम {{math|''n''<sub>1</sub> mod ''n''<sub>0</sub>}}. | |||
आधार | आधार अवयव दिया {{mvar|x}} समूह में {{math|'''G'''}}, और प्रतिपादक <math>n</math> याओ की विधि, अवयव के रूप में लिखा गया है <math>x^n</math> का उपयोग करके गणना की जाती है <math>l</math> पूर्व संगणित मान <math>x^{b_0}, ..., x^{b_{l_i}}</math> और फिर नीचे एल्गोरिथ्म उपयोग किया जाता है। | ||
लूप | लूप प्रारम्भ करें | ||
{{nowrap|Find <math>M \in [0, l - 1]</math>,}} {{nowrap|such that <math>\forall i \in [0, l - 1], n_M \ge n_i</math>.}} | {{nowrap|Find <math>M \in [0, l - 1]</math>,}} {{nowrap|such that <math>\forall i \in [0, l - 1], n_M \ge n_i</math>.}} | ||
{{nowrap|Find <math>N \in \big([0, l - 1] - M\big)</math>,}} {{nowrap|such that <math>\forall i \in \big([0, l - 1] - M\big), n_N \ge n_i</math>.}} | {{nowrap|Find <math>N \in \big([0, l - 1] - M\big)</math>,}} {{nowrap|such that <math>\forall i \in \big([0, l - 1] - M\big), n_N \ge n_i</math>.}} | ||
ब्रेक लूप {{nowrap|if <math>n_N = 0</math>.}} | |||
{{nowrap|'''Let''' <math>q = \lfloor n_M / n_N \rfloor</math>,}} {{nowrap|and then '''let''' <math>n_N = (n_M \bmod n_N)</math>.}} | {{nowrap|'''Let''' <math>q = \lfloor n_M / n_N \rfloor</math>,}} {{nowrap|and then '''let''' <math>n_N = (n_M \bmod n_N)</math>.}} | ||
{{nowrap|Compute recursively <math>x_M^q</math>,}} {{nowrap|and then '''let''' <math>x_N = x_N \cdot x_M^q</math>.}} | {{nowrap|Compute recursively <math>x_M^q</math>,}} {{nowrap|and then '''let''' <math>x_N = x_N \cdot x_M^q</math>.}} | ||
अंत पाश; | अंत पाश; | ||
{{nowrap|'''Return''' <math>x^n = x_M^{n_M}</math>.}} | {{nowrap|'''Return''' <math>x^n = x_M^{n_M}</math>.}} | ||
एल्गोरिथ्म सबसे पहले सबसे बड़ा | एल्गोरिथ्म सबसे पहले सबसे बड़ा मान {{math|''n''<sub>''i''</sub>}} पाता है और फिर के सेट के भीतर सुप्रीमम {{math|{{(}} ''n''<sub>''i''</sub> \ ''i'' ≠ ''M'' {{)}}}} | ||
फिर यह उठता है {{math|''x''<sub>''M''</sub>}} सत्ता में {{mvar|q}}, इस मान को इससे | |||
फिर यह उठता है {{math|''x''<sub>''M''</sub>}} सत्ता में {{mvar|q}}, इस मान को इससे {{math|''x''<sub>''N''</sub>}} गुणा करता है, और फिर असाइन करें {{math|''x''<sub>''N''</sub>}} इस गणना का परिणाम और {{math|''n''<sub>''M''</sub>}} मान {{math|''n''<sub>''M''</sub>}} मापांक {{math|''n''<sub>''N''</sub>}}. | |||
== आगे के आवेदन == | == आगे के आवेदन == | ||
Line 221: | Line 220: | ||
विधि प्रत्येक सेमिग्रुप में काम करती है और अक्सर [[मैट्रिक्स (गणित)]] की शक्तियों की गणना करने के लिए प्रयोग की जाती है। | विधि प्रत्येक सेमिग्रुप में काम करती है और अक्सर [[मैट्रिक्स (गणित)]] की शक्तियों की गणना करने के लिए प्रयोग की जाती है। | ||
उदाहरण के लिए, का | उदाहरण के लिए, का मानांकन | ||
:13789<sup>722341</sup> (मॉड 2345) = 2029 | :13789<sup>722341</sup> (मॉड 2345) = 2029 | ||
भोली विधि का उपयोग करने पर बहुत लंबा समय और अधिक संग्रहण स्थान लगेगा | भोली विधि का उपयोग करने पर बहुत लंबा समय और अधिक संग्रहण स्थान लगेगा, 13789<sup>722341</sup> की गणना करें, फिर 2345 से विभाजित करने पर [[शेष]]फल लें। अधिक प्रभावी विधि का उपयोग करने में भी अधिक समय लगेगा: वर्ग 13789, शेषफल को 2345 से विभाजित करने पर, [[परिणाम]] को 13789 से गुणा करें, और इसी तरह इससे कम समय लगेगा <math>2\log_2(722340) \leq 40</math> मॉड्यूलर गुणन। | ||
उपरोक्त ऍक्स्प-बाय-स्क्वैरिंग एल्गोरिथम को लागू करने के साथ, * x * y = xy mod 2345 के रूप में व्याख्या की गई है (अर्थात, शेष के साथ एक विभाजन के बाद एक गुणा) केवल 27 गुणा और पूर्णांकों के विभाजन की ओर जाता है, जो सभी को एक में संग्रहीत किया जा सकता | उपरोक्त ऍक्स्प-बाय-स्क्वैरिंग एल्गोरिथम को लागू करने के साथ, * x * y = xy mod 2345 के रूप में व्याख्या की गई है (अर्थात, शेष के साथ एक विभाजन के बाद एक गुणा) केवल 27 गुणा और पूर्णांकों के विभाजन की ओर जाता है, जो सभी एकल मशीन शब्द को एक में संग्रहीत किया जा सकता है। | ||
== हस्ताक्षरित-अंकों की रीकोडिंग == | == हस्ताक्षरित-अंकों की रीकोडिंग == | ||
कुछ संगणनाओं में नकारात्मक गुणांकों की अनुमति देना अधिक कुशल हो सकता है और इसलिए आधार के व्युत्क्रम का उपयोग किया जाता है, बशर्ते कि | कुछ संगणनाओं में नकारात्मक गुणांकों की अनुमति देना अधिक कुशल हो सकता है और इसलिए आधार के व्युत्क्रम का उपयोग किया जाता है, बशर्ते कि व्युत्क्रम हो {{mvar|'''G'''}} तेज है या पूर्व संगणित किया गया है। उदाहरण के लिए, गणना करते समय {{math|''x''<sup>2<sup>''k''</sup>−1</sup>}}, बाइनरी विधि {{math|''k''−1}} की आवश्यकता है, गुणन और {{math|''k''−1}} वर्ग {{mvar|k}} हालांकि कोई प्रदर्शन कर सकता था, प्राप्त करने के लिए वर्ग {{math|''x''<sup>2<sup>''k''</sup></sup>}} और {{math|''x''<sup>−1</sup>}} प्राप्त करने के लिए फिर से गुणा करें। | ||
इसके लिए हम एक पूर्णांक के हस्ताक्षरित अंकों के प्रतिनिधित्व को | इसके लिए हम एक पूर्णांक के हस्ताक्षरित अंकों के प्रतिनिधित्व को {{mvar|n}} रेडिक्स में {{mvar|b}} जैसा परिभाषित करते हैं, | ||
: <math>n = \sum_{i=0}^{l-1} n_i b^i \text{ with } |n_i| < b.</math> | : <math>n = \sum_{i=0}^{l-1} n_i b^i \text{ with } |n_i| < b.</math> | ||
हस्ताक्षरित बाइनरी प्रतिनिधित्व विशेष पसंद से | हस्ताक्षरित बाइनरी प्रतिनिधित्व विशेष पसंद से समानता रखता है {{math|1=''b'' = 2}} और <math>n_i \in \{-1, 0, 1\}</math> द्वारा <math>(n_{l-1} \dots n_0)_s</math> निरूपित किया जाता है, इस प्रतिनिधित्व की गणना के लिए कई तरीके हैं। प्रतिनिधित्व अद्वितीय नहीं है। उदाहरण के लिए, ले लो {{math|1=''n'' = 478}}: दो अलग-अलग हस्ताक्षरित-द्विआधारी प्रतिनिधित्व इसके द्वारा दिए गए हैं <math>(10\bar 1 1100\bar 1 10)_s</math> और <math>(100\bar 1 1000\bar 1 0)_s</math>, जहाँ <math>\bar 1</math> निरूपित करने के लिए प्रयोग किया जाता है {{math|−1}}. चूंकि बाइनरी विधि आधार -2 प्रतिनिधित्व में प्रत्येक गैर-शून्य प्रविष्टि के लिए गुणन की गणना करती है {{mvar|n}}, हम गैर-शून्य प्रविष्टियों की सबसे छोटी संख्या के साथ हस्ताक्षरित-बाइनरी प्रतिनिधित्व खोजने में रुचि रखते हैं, जो कि न्यूनतम [[हैमिंग वजन]] वाला है। ऐसा करने का एक तरीका गैर-निकटवर्ती रूप में प्रतिनिधित्व की गणना करना है, या संक्षेप में NAF है, जो संतुष्ट करता है <math>n_i n_{i+1} = 0 \text{ for all } i \geqslant 0</math> और द्वारा दर्शाया गया <math>(n_{l-1} \dots n_0)_\text{NAF}</math>. उदाहरण के लिए, NAF 478 का प्रतिनिधित्व है <math>(1000\bar 1 000\bar 1 0)_\text{NAF}</math>. इस प्रतिनिधित्व में सदैव न्यूनतम हैमिंग वजन होता है। किसी दिए गए पूर्णांक के NAF प्रतिनिधित्व की गणना करने के लिए एक सरल एल्गोरिथम <math>n = (n_l n_{l-1} \dots n_0)_2</math> साथ <math>n_l = n_{l-1} = 0</math> निम्नलखित में से कोई: | ||
{{nowrap|<math>c_0=0</math>}} | {{nowrap|<math>c_0=0</math>}} | ||
के लिए {{math|1=''i'' = 0}} को {{math|''l'' − 1}} करना | के लिए {{math|1=''i'' = 0}} को {{math|''l'' − 1}} करना | ||
{{nowrap|<math>c_{i+1} = \left\lfloor\frac{1}{2}(c_i + n_i + n_{i+1})\right\rfloor</math>}} | {{nowrap|<math>c_{i+1} = \left\lfloor\frac{1}{2}(c_i + n_i + n_{i+1})\right\rfloor</math>}} | ||
{{nowrap|<math>n_i' = c_i + n_i - 2c_{i+1}</math>}} | {{nowrap|<math>n_i' = c_i + n_i - 2c_{i+1}</math>}} | ||
{{nowrap|return <math>(n_{l-1}' \dots n_0')_\text{NAF}</math>}} | {{nowrap|return <math>(n_{l-1}' \dots n_0')_\text{NAF}</math>}} | ||
Line 245: | Line 244: | ||
== विकल्प और सामान्यीकरण == | == विकल्प और सामान्यीकरण == | ||
{{main| | {{main|जोड़-श्रृंखला घातांक}} | ||
स्क्वेरिंग द्वारा | |||
स्क्वेरिंग द्वारा प्रतिपादक को एक सबऑप्टिमल [[अतिरिक्त-श्रृंखला घातांक]] एल्गोरिथम के रूप में देखा जा सकता है: यह घातांक की गणना एक [[अतिरिक्त श्रृंखला]] द्वारा करता है जिसमें बार-बार घातांक दोहरीकरण (स्क्वायरिंग) और/या केवल एक (x से गुणा करके) घातांक बढ़ाना सम्मिलित है। अधिक सामान्यतः, यदि कोई पहले से गणना किए गए घातांक को (x की उन शक्तियों को गुणा करके) अभिव्यक्त करने की अनुमति देता है, तो कभी-कभी कम गुणन (लेकिन सामान्यतः अधिक मेमोरी का उपयोग करके) प्रतिपादक का प्रदर्शन किया जा सकता है। सबसे छोटी शक्ति जहां ऐसा होता है वह n = 15 के लिए है: | |||
: <math>x^{15} = x \times (x \times [x \times x^2]^2)^2</math>(वर्गीकरण, 6 गुणा), | : <math>x^{15} = x \times (x \times [x \times x^2]^2)^2</math>(वर्गीकरण, 6 गुणा), | ||
: <math>x^{15} = x^3 \times ([x^3]^2)^2</math>(इष्टतम जोड़ श्रृंखला, x के 5 गुणक<sup>3</sup> का पुन: उपयोग किया जाता है)। | : <math>x^{15} = x^3 \times ([x^3]^2)^2</math>(इष्टतम जोड़ श्रृंखला, x के 5 गुणक<sup>3</sup> का पुन: उपयोग किया जाता है)। | ||
सामान्यतः, किसी दिए गए घातांक के लिए इष्टतम जोड़ श्रृंखला खोजना एक कठिन समस्या है, जिसके लिए कोई कुशल एल्गोरिदम ज्ञात नहीं है, इसलिए इष्टतम श्रृंखलाएं सामान्यतः केवल छोटे घातांकों के लिए उपयोग की जाती हैं (उदाहरण के लिए [[संकलक]] में जहां छोटी शक्तियों के लिए जंजीरों को पूर्व-सारणीबद्ध किया गया है)). हालांकि, ऐसे कई [[अनुमानी]] एल्गोरिदम हैं, जो इष्टतम नहीं होने के बावजूद अतिरिक्त बहीखाता पद्धति के काम और मेमोरी उपयोग की लागत पर घातांक की तुलना में कम गुणन करते हैं। इसके बावजूद, बिग-ओ नोटेशन Θ (लॉग एन) की तुलना में गुणन की संख्या कभी भी अधिक धीरे-धीरे नहीं बढ़ती है, इसलिए ये एल्गोरिदम केवल एक स्थिर कारक द्वारा सर्वोत्तम रूप से वर्ग करके घातांक पर स्पर्शोन्मुख रूप से सुधार करते हैं। | |||
== यह भी देखें == | == यह भी देखें == |
Revision as of 21:52, 21 March 2023
गणित और कंप्यूटर प्रोग्रामिंग में, वर्ग द्वारा घातांक एक संख्या की बड़ी सकारात्मक पूर्णांक शक्तियों की तेजी से गणना के लिए एक सामान्य विधि है, या अधिक सामान्यतः एक अर्धसमूह के एक अवयव की, जैसे बहुपद या वर्ग मैट्रिक्स द्वारा इसकी गणना की जा सकती है। कुछ वेरिएंट्स को सामान्यतः वर्ग-और-गुणा एल्गोरिदम या बाइनरी प्रतिपादक के रूप में संदर्भित किया जाता है। ये काफी सामान्य उपयोग के हो सकते हैं, उदाहरण के लिए मॉड्यूलर अंकगणित या मेट्रिसेस की शक्ति। अर्धसमूह के लिए जिसके लिए एबेलियन समूह नोटेशन का सामान्यतः उपयोग किया जाता है, जैसे क्रिप्टोग्राफी में उपयोग किए जाने वाले वक्राकार वक्र, इस विधि को डबल-एंड-ऐड भी कहा जाता है।
मूल विधि
पुनरावर्ती संस्करण
विधि अवलोकन पर आधारित है कि, किसी भी पूर्णांक के लिए , किसी के पास:
में: एक पूर्णांक x; एक पूर्णांक एन आउट: एक्सएन exp_by_squaring (एक्स, एन) अगर एन <0 तो वापसी exp_by_squaring (1 / x, -n); वरना अगर n = 0 तब वापसी 1; अन्यथा यदि n तब भी है रिटर्न exp_by_squaring(x * x, n / 2); वरना अगर n विषम है तो वापसी x * exp_by_squaring (x * x, (n - 1) / 2); अंत फलन
प्रत्येक पुनरावर्ती कॉल में, बाइनरी प्रतिनिधित्व के कम से कम महत्वपूर्ण अंक n हटा दिया गया। यह इस प्रकार है कि पुनरावर्ती कॉल की संख्या है के बाइनरी प्रतिनिधित्व के अंश की संख्या n. तो यह एल्गोरिथ्म वर्गों की संख्या और गुणन की कम संख्या की गणना करता है, जो की संख्या के बराबर है, 1 के बाइनरी प्रतिनिधित्व में n संचालन की इस एल्गोरिथम संख्या की तुलना उस तुच्छ एल्गोरिथम से की जानी चाहिए जिसकी आवश्यकता n − 1 गुणन होती है।
यह एल्गोरिदम टेल कॉल नहीं है, टेल-पुनरावर्ती इसका तात्पर्य यह है कि इसके लिए एक सहायक मेमोरी की आवश्यकता होती है जो पुनरावर्ती कॉल की संख्या के लगभग आनुपातिक (या उच्चतर, यदि कोई डेटा के बढ़ते आकार को ध्यान में रखता है) है।
अगले खंड के एल्गोरिदम एक अलग दृष्टिकोण का उपयोग करते हैं, और परिणामी एल्गोरिदम को समान संख्या में संचालन की आवश्यकता होती है, लेकिन इसमें एक सहायक मेमोरी का उपयोग करें जो परिणाम को संग्रहीत करने के लिए आवश्यक मेमोरी के समान है।
निरंतर सहायक स्मृति के साथ
इस खंड में वर्णित वेरिएंट सूत्र पर आधारित हैं
यदि कोई पुनरावर्ती रूप से इस सूत्र को लागू करता है, y = 1 से प्रारम्भ करके, अंततः एक घातांक 0 के बराबर मिलता है, और फिर वांछित परिणाम बायाँ कारक है।
इसे पुनरावर्ती कार्य के रूप में कार्यान्वित किया जा सकता है:
Function exp_by_squaring(x, n)
return exp_by_squaring2(1, x, n)
Function exp_by_squaring2(y, x, n)
if n < 0 then return exp_by_squaring2(y, 1 / x, - n);
else if n = 0 then return y;
else if n is even then return exp_by_squaring2(y, x * x, n / 2);
else if n is odd then return exp_by_squaring2(x * y, x * x, (n - 1) / 2).
एल्गोरिथम का पुनरावृत्ति संस्करण भी एक बाध्य सहायक स्थान का उपयोग करता है, और इसके द्वारा दिया जाता है
Function exp_by_squaring_iterative(x, n)
if n < 0 then
x := 1 / x;
n := -n;
if n = 0 then return 1
y := 1;
while n > 1 do
if n is even then
x := x * x;
n := n / 2;
else
y := x * y;
x := x * x;
n := (n – 1) / 2;
return x * y
एल्गोरिदम की शुद्धता इस तथ्य से उत्पन्न होती है कि गणना के दौरान अपरिवर्तनीय है; यह है, प्रारम्भ में; और अंत में इसकी गणना की जा सकती है।
ये एल्गोरिदम पूर्ववर्ती अनुभाग के एल्गोरिदम के समान ही संचालन की संख्या का उपयोग करते हैं, लेकिन गुणा एक अलग क्रम में किया जाता है।
कम्प्यूटेशनल जटिलता
एक संक्षिप्त विश्लेषण से पता चलता है कि ऐसा एल्गोरिदम उपयोग करता है स्क्वायरिंग और अधिक से अधिक गुणन, जहाँ फ्लोर फलन को दर्शाता है। अधिक सटीक रूप से, गुणन की संख्या n के बाइनरी विस्तार में सम्मिलित लोगों की संख्या से एक कम है। लगभग 4 से अधिक n के लिए यह आधार को बार-बार अपने आप से गुणा करने की तुलना में कम्प्यूटेशनल रूप से अधिक कुशल है।
प्रत्येक वर्ग का परिणाम पिछले अंकों की संख्या का लगभग दोगुना होता है, और इसलिए, यदि दो डी-अंकों की संख्या का गुणन O(d) में कार्यान्वित किया जाता हैk) संचालन कुछ निश्चित k के लिए, फिर कंप्यूटिंग xn की जटिलता द्वारा दिया गया है
2k-आरी विधि
यह एल्गोरिथ्म xn के मान की गणना करता है बेस 2 में घातांक को बढ़ाने के बाद यह पहली बार 1939 में ब्राउर द्वारा प्रस्तावित किया गया था। नीचे दिए गए एल्गोरिदम में हम निम्नलिखित फलन f(0) = (k,0) और f(m) = (s,u) का उपयोग करते हैं, जहां m = u·2S U विषम के साथ उपयोग किया जाता है।
कलन विधि:
इनपुट: G का एक अवयव x, एक पैरामीटर k > 0, एक गैर-ऋणात्मक पूर्णांक n = (nl−1, nl−2, ..., n0)2k और पूर्व संगणित मान .
आउटपुट: अवयव Xn G में
वाई: = 1; मैं := एल - 1 'जबकि' मैं ≥ 0 करते हैं (एस, यू)�:= एफ (एनi) j के लिए�:= 1 से k-s करते हैं यः= य2</उप> यः= य*xयू j के लिए�:= 1 से s करें यः= य2</उप> मैं:= मैं - 1 वापसी वाई
इष्टतम दक्षता के लिए, k सबसे छोटा पूर्णांक संतोषजनक होना चाहिए[1][clarification needed]
स्लाइडिंग-विंडो विधि
यह विधि 2 का एक कुशल रूप हैk-आर्य विधि। उदाहरण के लिए, घातांक 398 की गणना करने के लिए, जिसमें बाइनरी एक्सपेंशन (110 001 110) है2, हम 2 का उपयोग करके लंबाई 3k की विंडो लेते हैं-आर्य विधि एल्गोरिदम और 1, x3 की गणना करें, एक्स6, एक्स12, एक्स24, एक्स48, एक्स49, एक्स98, एक्स99, एक्स198, x199, एक्स398.
लेकिन, हम 1, x3 की गणना भी कर सकते हैं, एक्स6, एक्स12, एक्स24, एक्स48, एक्स96, एक्स192, एक्स199, एक्स398, जो एक गुणन बचाता है और मानांकन के बराबर होता है (110 001 110)2
यहाँ सामान्य एल्गोरिथ्म है:
कलन विधि:
इनपुट: G का एक अवयव x, एक गैर नकारात्मक पूर्णांक n=(nl−1, nl−2, ..., n0)2, एक पैरामीटर k > 0 और पूर्व-परिकलित मान .
आउटपुट: अवयव Xn ∈ G.
कलन विधि:
वाई: = 1; मैं := एल - 1 'जबकि' मैं > -1 'करो' 'अगर' एनi = 0 तब यः= य2' i := i - 1 अन्य s := अधिकतम {i - k + 1, 0} जबकि एनs = 0 करो स := स + 1[notes 1]
h के लिए := 1 से i - s + 1 करते हैं
यः= य2</उप> में�:= (एनi, एनi-1, ..., एनs)2
यः= य*xयू
मैं := एस - 1 वापसी वाई
मोंटगोमरी की सोपान तकनीक
घातांक के लिए कई एल्गोरिदम साइड-चैनल हमलों के खिलाफ सुरक्षा प्रदान नहीं करते हैं। अर्थात्, एक आक्रमणकारी वर्ग और गुणा के अनुक्रम को देखकर (आंशिक रूप से) गणना में सम्मिलित घातांक को पुनर्प्राप्त कर सकता है। यह एक समस्या है और इस प्रतिपादक को गुप्त रहना चाहिए, जैसा कि कई सार्वजनिक-कुंजी क्रिप्टोग्राफ़ी सार्वजनिक-कुंजी क्रिप्टो सिस्टम में होता है। पीटर मोंटगोमरी (गणितज्ञ) नामक एक तकनीक मोंटगोमरी की सोपान[2] इस चिंता को संबोधित करता है।
एक धनात्मक, शून्येतर पूर्णांक n = (nk−1...n0)2, nk−1 = 1 के साथ, हम xn की गणना कर सकते हैं, इस प्रकार है:
एक्स1 = एक्स; एक्स2 = एक्स2</उप> i = k - 2 से 0 के लिए अगर एनi = 0 तब एक्स�2 = एक्स1 * एक्स2; एक्स1 = एक्स12</उप> अन्य एक्स1 = एक्स1 * एक्स2; एक्स2 = एक्स22</उप> वापसी एक्स1
एल्गोरिथ्म संचालन का एक निश्चित अनुक्रम करता है (लॉगन तक): बिट के विशिष्ट मान की परवाह किए बिना, प्रतिपादक में प्रत्येक बिट के लिए एक गुणन और वर्ग होता है। दोहरीकरण द्वारा गुणन के लिए एक समान एल्गोरिथ्म सम्मिलित है।
मॉन्टगोमरी की सोपान का यह विशिष्ट कार्यान्वयन अभी तक कैश टाइमिंग हमलों के खिलाफ सुरक्षित नहीं है: मेमोरी एक्सेस लेटेंसी अभी भी एक आक्रमणकारी के लिए देखी जा सकती है, क्योंकि गुप्त प्रतिपादक के बिट्स के मान के आधार पर विभिन्न चर का उपयोग किया जाता है। आधुनिक क्रिप्टोग्राफ़िक कार्यान्वयन यह सुनिश्चित करने के लिए एक स्कैटर तकनीक का उपयोग करते हैं कि प्रोसेसर सदैव तेज कैश को मेमोरी में स्टोर करता है।[3]
फिक्स्ड-बेस घातांक
एक्सn की गणना करने के लिए कई विधियां नियोजित की जा सकती हैं जब आधार निश्चित होता है और घातांक बदलता रहता है। जैसा कि कोई देख सकता है, इन एल्गोरिदम में पूर्वगणना एक महत्वपूर्ण भूमिका निभाते हैं।
याओ की विधि
याओ की 2k विधि ओर्थोगोनल है - आर्य पद्धति जहां घातांक को b = 2k मूलांक में विस्तारित किया जाता है, और गणना उपरोक्त एल्गोरिथम में की गई है। मान लीजिये कि n, ni, b, और bi पूर्णांक हो।
प्रतिपादक को मान लीजिये कि n के रूप में लिखा जाए
जहाँ सभी के लिए .
मान लीजिये कि xi = xbi.
तब एल्गोरिथ्म समानता का उपयोग करता है
अवयव x का G, और प्रतिपादक n पूर्व संगणित मानों के साथ xb0...xbw−1 उपरोक्त रूप में लिखा गया है, अवयव xn की गणना नीचे एल्गोरिथम का उपयोग करके की जाती है:
वाई = 1, यू = 1, जे = एच -1 जबकि j > 0 करते हैं i = 0 से w - 1 के लिए अगर एनi = जे फिर यू = यू × एक्सbi</सुप> वाई = वाई × यू जे = जे - 1 वापसी वाई
अगर हम h = 2k सेट करते हैं और bi = hi, फिर ni मान केवल अंक हैं n बेस में h. याओ की विधि उन सबसे पहले आप में xi एकत्रित होती है, जो उच्चतम शक्ति को दिखाई देते हैं, अगले दौर में सत्ता के साथ में u एकत्र किया जाता है, साथ ही y चर को गुणा किया जाता है बार प्रारंभिक के साथ u, बार अगली उच्चतम शक्तियों के साथ, और इसी तरह एल्गोरिथम उपयोग करता है, गुणन और अवयवों को xn गणना करने के लिए संग्रहित किया जाना चाहिए।[1]
यूक्लिडियन विधि
यूक्लिडियन पद्धति को पहली बार पीडी रूइज द्वारा प्रीकंप्यूटेशन और वेक्टर एडिशन चेन का उपयोग करके कुशल प्रतिपादक में पेश किया गया था।
कंप्यूटिंग के लिए यह तरीका समूह में G, जहाँ n एक प्राकृतिक पूर्णांक है, जिसका एल्गोरिदम नीचे दिया गया है, निम्नलिखित समानता का पुनरावर्ती उपयोग कर रहा है:
जहाँ
दूसरे शब्दों में, प्रतिपादक का एक यूक्लिडियन विभाजन n1 द्वारा n0 का उपयोग भागफल लौटाने के लिए किया जाता है q और विराम n1 mod n0.
आधार अवयव दिया x समूह में G, और प्रतिपादक याओ की विधि, अवयव के रूप में लिखा गया है का उपयोग करके गणना की जाती है पूर्व संगणित मान और फिर नीचे एल्गोरिथ्म उपयोग किया जाता है।
लूप प्रारम्भ करें
Find , such that . Find , such that .
ब्रेक लूप if .
Let , and then let . Compute recursively , and then let .
अंत पाश;
Return .
एल्गोरिथ्म सबसे पहले सबसे बड़ा मान ni पाता है और फिर के सेट के भीतर सुप्रीमम { ni \ i ≠ M }
फिर यह उठता है xM सत्ता में q, इस मान को इससे xN गुणा करता है, और फिर असाइन करें xN इस गणना का परिणाम और nM मान nM मापांक nN.
आगे के आवेदन
यही विचार किसी संख्या के बड़े मॉड्यूलर घातांक की तीव्र संगणना की अनुमति देता है। विशेष रूप से क्रिप्टोग्राफी में, मॉड्यूलर अंकगणित के एक रिंग (गणित) में शक्तियों की गणना करना उपयोगी होता है। इसका उपयोग नियम का उपयोग करके समूह (गणित) में पूर्णांक शक्तियों की गणना करने के लिए भी किया जा सकता है
- पावर (एक्स, -एन) = (पावर (एक्स, एन))-1.
विधि प्रत्येक सेमिग्रुप में काम करती है और अक्सर मैट्रिक्स (गणित) की शक्तियों की गणना करने के लिए प्रयोग की जाती है।
उदाहरण के लिए, का मानांकन
- 13789722341 (मॉड 2345) = 2029
भोली विधि का उपयोग करने पर बहुत लंबा समय और अधिक संग्रहण स्थान लगेगा, 13789722341 की गणना करें, फिर 2345 से विभाजित करने पर शेषफल लें। अधिक प्रभावी विधि का उपयोग करने में भी अधिक समय लगेगा: वर्ग 13789, शेषफल को 2345 से विभाजित करने पर, परिणाम को 13789 से गुणा करें, और इसी तरह इससे कम समय लगेगा मॉड्यूलर गुणन।
उपरोक्त ऍक्स्प-बाय-स्क्वैरिंग एल्गोरिथम को लागू करने के साथ, * x * y = xy mod 2345 के रूप में व्याख्या की गई है (अर्थात, शेष के साथ एक विभाजन के बाद एक गुणा) केवल 27 गुणा और पूर्णांकों के विभाजन की ओर जाता है, जो सभी एकल मशीन शब्द को एक में संग्रहीत किया जा सकता है।
हस्ताक्षरित-अंकों की रीकोडिंग
कुछ संगणनाओं में नकारात्मक गुणांकों की अनुमति देना अधिक कुशल हो सकता है और इसलिए आधार के व्युत्क्रम का उपयोग किया जाता है, बशर्ते कि व्युत्क्रम हो G तेज है या पूर्व संगणित किया गया है। उदाहरण के लिए, गणना करते समय x2k−1, बाइनरी विधि k−1 की आवश्यकता है, गुणन और k−1 वर्ग k हालांकि कोई प्रदर्शन कर सकता था, प्राप्त करने के लिए वर्ग x2k और x−1 प्राप्त करने के लिए फिर से गुणा करें।
इसके लिए हम एक पूर्णांक के हस्ताक्षरित अंकों के प्रतिनिधित्व को n रेडिक्स में b जैसा परिभाषित करते हैं,
हस्ताक्षरित बाइनरी प्रतिनिधित्व विशेष पसंद से समानता रखता है b = 2 और द्वारा निरूपित किया जाता है, इस प्रतिनिधित्व की गणना के लिए कई तरीके हैं। प्रतिनिधित्व अद्वितीय नहीं है। उदाहरण के लिए, ले लो n = 478: दो अलग-अलग हस्ताक्षरित-द्विआधारी प्रतिनिधित्व इसके द्वारा दिए गए हैं और , जहाँ निरूपित करने के लिए प्रयोग किया जाता है −1. चूंकि बाइनरी विधि आधार -2 प्रतिनिधित्व में प्रत्येक गैर-शून्य प्रविष्टि के लिए गुणन की गणना करती है n, हम गैर-शून्य प्रविष्टियों की सबसे छोटी संख्या के साथ हस्ताक्षरित-बाइनरी प्रतिनिधित्व खोजने में रुचि रखते हैं, जो कि न्यूनतम हैमिंग वजन वाला है। ऐसा करने का एक तरीका गैर-निकटवर्ती रूप में प्रतिनिधित्व की गणना करना है, या संक्षेप में NAF है, जो संतुष्ट करता है और द्वारा दर्शाया गया . उदाहरण के लिए, NAF 478 का प्रतिनिधित्व है . इस प्रतिनिधित्व में सदैव न्यूनतम हैमिंग वजन होता है। किसी दिए गए पूर्णांक के NAF प्रतिनिधित्व की गणना करने के लिए एक सरल एल्गोरिथम साथ निम्नलखित में से कोई:
के लिए i = 0 को l − 1 करना
return
कोयामा और त्सुरुओका द्वारा एक और एल्गोरिदम को उस स्थिति की आवश्यकता नहीं है ; यह अभी भी हैमिंग वजन को कम करता है।
विकल्प और सामान्यीकरण
स्क्वेरिंग द्वारा प्रतिपादक को एक सबऑप्टिमल अतिरिक्त-श्रृंखला घातांक एल्गोरिथम के रूप में देखा जा सकता है: यह घातांक की गणना एक अतिरिक्त श्रृंखला द्वारा करता है जिसमें बार-बार घातांक दोहरीकरण (स्क्वायरिंग) और/या केवल एक (x से गुणा करके) घातांक बढ़ाना सम्मिलित है। अधिक सामान्यतः, यदि कोई पहले से गणना किए गए घातांक को (x की उन शक्तियों को गुणा करके) अभिव्यक्त करने की अनुमति देता है, तो कभी-कभी कम गुणन (लेकिन सामान्यतः अधिक मेमोरी का उपयोग करके) प्रतिपादक का प्रदर्शन किया जा सकता है। सबसे छोटी शक्ति जहां ऐसा होता है वह n = 15 के लिए है:
- (वर्गीकरण, 6 गुणा),
- (इष्टतम जोड़ श्रृंखला, x के 5 गुणक3 का पुन: उपयोग किया जाता है)।
सामान्यतः, किसी दिए गए घातांक के लिए इष्टतम जोड़ श्रृंखला खोजना एक कठिन समस्या है, जिसके लिए कोई कुशल एल्गोरिदम ज्ञात नहीं है, इसलिए इष्टतम श्रृंखलाएं सामान्यतः केवल छोटे घातांकों के लिए उपयोग की जाती हैं (उदाहरण के लिए संकलक में जहां छोटी शक्तियों के लिए जंजीरों को पूर्व-सारणीबद्ध किया गया है)). हालांकि, ऐसे कई अनुमानी एल्गोरिदम हैं, जो इष्टतम नहीं होने के बावजूद अतिरिक्त बहीखाता पद्धति के काम और मेमोरी उपयोग की लागत पर घातांक की तुलना में कम गुणन करते हैं। इसके बावजूद, बिग-ओ नोटेशन Θ (लॉग एन) की तुलना में गुणन की संख्या कभी भी अधिक धीरे-धीरे नहीं बढ़ती है, इसलिए ये एल्गोरिदम केवल एक स्थिर कारक द्वारा सर्वोत्तम रूप से वर्ग करके घातांक पर स्पर्शोन्मुख रूप से सुधार करते हैं।
यह भी देखें
- मॉड्यूलर घातांक
- वेक्टर अतिरिक्त श्रृंखला
- मोंटगोमरी कमी
- गैर-निकटवर्ती रूप
- अतिरिक्त श्रृंखला
टिप्पणियाँ
- ↑ In this line, the loop finds the longest string of length less than or equal to k ending in a non-zero value. Not all odd powers of 2 up to need be computed, and only those specifically involved in the computation need be considered.
संदर्भ
- ↑ 1.0 1.1 Cohen, H.; Frey, G., eds. (2006). अण्डाकार और हाइपरेलिप्टिक वक्र क्रिप्टोग्राफी की पुस्तिका. Discrete Mathematics and Its Applications. Chapman & Hall/CRC. ISBN 9781584885184.
- ↑ Montgomery, Peter L. (1987). "स्पीडिंग द पोलार्ड एंड एलिप्टिक कर्व मेथड्स ऑफ फैक्टराइजेशन" (PDF). Math. Comput. 48 (177): 243–264. doi:10.1090/S0025-5718-1987-0866113-7.
- ↑ Gueron, Shay (5 April 2012). "मॉड्यूलर घातांक का कुशल सॉफ्टवेयर कार्यान्वयन" (PDF). Journal of Cryptographic Engineering. 2 (1): 31–43. doi:10.1007/s13389-012-0031-5. S2CID 7629541.