वर्ग द्वारा घातांक: Difference between revisions

From Vigyanwiki
(Created page with "{{short description|Algorithm for fast exponentiation}} {{confusing|talk=talk:Exponentiation by squaring#Least significant bit is first|date=May 2022}} {{more citations needed...")
 
No edit summary
 
(11 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{short description|Algorithm for fast exponentiation}}
{{short description|Algorithm for fast exponentiation}}गणित और [[कंप्यूटर प्रोग्रामिंग]] में, वर्ग द्वारा घातांक एक [[संख्या]] की बड़ी [[सकारात्मक पूर्णांक]] शक्तियों की तेजी से गणना के लिए एक सामान्य विधि है, या अधिक सामान्यतः एक अर्धसमूह के एक अवयव की, जैसे [[बहुपद]] या वर्ग मैट्रिक्स द्वारा इसकी गणना की जा सकती है। कुछ वेरिएंट्स को सामान्यतः वर्ग-और-गुणा एल्गोरिदम या बाइनरी प्रतिपादक के रूप में संदर्भित किया जाता है। ये काफी सामान्य उपयोग के हो सकते हैं, उदाहरण के लिए [[मॉड्यूलर अंकगणित]] या मेट्रिसेस की शक्ति। [[ semigroup |अर्धसमूह]] के लिए जिसके लिए एबेलियन समूह नोटेशन का सामान्यतः उपयोग किया जाता है, जैसे [[क्रिप्टोग्राफी]] में उपयोग किए जाने वाले [[अण्डाकार वक्र|वक्राकार वक्र]], इस विधि को डबल-एंड-ऐड भी कहा जाता है।
{{confusing|talk=talk:Exponentiation by squaring#Least significant bit is first|date=May 2022}}
{{more citations needed|date=February 2018}}
 
गणित और [[कंप्यूटर प्रोग्रामिंग]] में, वर्ग द्वारा घातांक एक [[संख्या]] की बड़ी [[सकारात्मक पूर्णांक]] शक्तियों की तेजी से गणना के लिए एक सामान्य विधि है, या अधिक सामान्यतः एक अर्धसमूह के एक तत्व की, जैसे [[बहुपद]] या वर्ग मैट्रिक्स। कुछ वेरिएंट्स को आमतौर पर वर्ग-और-गुणा एल्गोरिदम या बाइनरी एक्सपोनेंटिएशन के रूप में संदर्भित किया जाता है। ये काफी सामान्य उपयोग के हो सकते हैं, उदाहरण के लिए [[मॉड्यूलर अंकगणित]] या मेट्रिसेस की शक्ति। [[ semigroup ]]्स के लिए जिसके लिए एबेलियन समूह#नोटेशन का आमतौर पर उपयोग किया जाता है, जैसे [[क्रिप्टोग्राफी]] में उपयोग किए जाने वाले [[अण्डाकार वक्र]], इस विधि को डबल-एंड-ऐड भी कहा जाता है।


== मूल विधि ==
== मूल विधि ==
Line 19: Line 15:
साथ में, इन्हें निम्नलिखित पुनरावर्तन (कंप्यूटर विज्ञान) के रूप में सीधे लागू किया जा सकता है:
साथ में, इन्हें निम्नलिखित पुनरावर्तन (कंप्यूटर विज्ञान) के रूप में सीधे लागू किया जा सकता है:


   में: एक पूर्णांक x; एक पूर्णांक एन
   In: an integer x; an integer n
   आउट: एक्स<sup>एन</sup>
   Out: x<sup>n</sup>
    
    
   exp_by_squaring (एक्स, एन)
   exp_by_squaring(x, n)
     अगर एन <0 तो
     if n < 0 then
       वापसी exp_by_squaring (1 / x, -n);
       return exp_by_squaring(1 / x, -n);
     वरना अगर n = 0 तब
     else if n = 0 then
       वापसी 1;
       return 1;
     अन्यथा यदि n तब भी है
     else if n is even then
       रिटर्न exp_by_squaring(x * x, n / 2);
       return exp_by_squaring(x * x, n / 2);
     वरना अगर n विषम है तो
     else if n is odd then
       वापसी x * exp_by_squaring (x * x, (n - 1) / 2);
       return x * exp_by_squaring(x * x, (n - 1) / 2);
   अंत समारोह
   end function
 
प्रत्येक पुनरावर्ती कॉल में, बाइनरी प्रतिनिधित्व के कम से कम महत्वपूर्ण अंक {{mvar|n}} हटा दिया गया। यह इस प्रकार है कि पुनरावर्ती कॉल की संख्या है <math>\lceil \log_2 n\rceil,</math> के बाइनरी प्रतिनिधित्व के [[ अंश |अंश]] की संख्या {{mvar|n}}. तो यह एल्गोरिथ्म वर्गों की संख्या और गुणन की कम संख्या की गणना करता है, जो की संख्या के बराबर है, {{math|1}} के बाइनरी प्रतिनिधित्व में {{mvar|n}} संचालन की इस एल्गोरिथम संख्या की तुलना उस तुच्छ एल्गोरिथम से की जानी चाहिए जिसकी आवश्यकता {{math|''n'' − 1}}  गुणन होती है।
 
यह एल्गोरिदम [[टेल कॉल]] नहीं है, टेल-पुनरावर्ती इसका तात्पर्य यह है कि इसके लिए एक सहायक मेमोरी की आवश्यकता होती है जो पुनरावर्ती कॉल की संख्या के लगभग आनुपातिक (या उच्चतर, यदि कोई डेटा के बढ़ते आकार को ध्यान में रखता है) है।
 
अगले खंड के एल्गोरिदम एक अलग दृष्टिकोण का उपयोग करते हैं, और परिणामी एल्गोरिदम को समान संख्या में संचालन की आवश्यकता होती है, लेकिन इसमें एक सहायक मेमोरी का उपयोग करें जो परिणाम को संग्रहीत करने के लिए आवश्यक मेमोरी के समान है।
 
 
 
 
 
 
 
 


प्रत्येक पुनरावर्ती कॉल में, बाइनरी प्रतिनिधित्व के कम से कम महत्वपूर्ण अंक {{mvar|n}} हटा दिया गया। यह इस प्रकार है कि पुनरावर्ती कॉल की संख्या है <math>\lceil \log_2 n\rceil,</math> के बाइनरी प्रतिनिधित्व के [[ अंश ]]्स की संख्या {{mvar|n}}. तो यह एल्गोरिथ्म वर्गों की संख्या और गुणन की कम संख्या की गणना करता है, जो की संख्या के बराबर है {{math|1}} के बाइनरी प्रतिनिधित्व में {{mvar|n}}. संचालन की इस लॉगरिदमिक संख्या की तुलना उस तुच्छ एल्गोरिथम से की जानी चाहिए जिसकी आवश्यकता होती है {{math|''n'' − 1}} गुणन।


यह एल्गोरिदम [[टेल कॉल]] नहीं है | टेल-रिकर्सिव। इसका तात्पर्य यह है कि इसके लिए एक सहायक मेमोरी की आवश्यकता होती है जो रिकर्सिव कॉल की संख्या के लगभग आनुपातिक (या उच्चतर, यदि कोई डेटा के बढ़ते आकार को ध्यान में रखता है) है।


अगले खंड के एल्गोरिदम एक अलग दृष्टिकोण का उपयोग करते हैं, और परिणामी एल्गोरिदम को समान संख्या में संचालन की आवश्यकता होती है, लेकिन एक सहायक मेमोरी का उपयोग करें जो परिणाम को संग्रहीत करने के लिए आवश्यक मेमोरी के समान है।


=== निरंतर सहायक स्मृति के साथ ===
=== निरंतर सहायक स्मृति के साथ ===
Line 48: Line 55:
     \end{cases}
     \end{cases}
</math>
</math>
यदि कोई पुनरावर्ती रूप से इस सूत्र को लागू करता है, से शुरू करके {{math|1=''y'' = 1}}, अंततः एक घातांक के बराबर मिलता है {{math|0}}, और फिर वांछित परिणाम बायाँ कारक है।
यदि कोई पुनरावर्ती रूप से इस सूत्र को लागू करता है, {{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 86:
     return x * y
     return x * y
</syntaxhighlight>
</syntaxhighlight>
एल्गोरिदम की शुद्धता इस तथ्य से उत्पन्न होती है कि <math>yx^n</math> गणना के दौरान अपरिवर्तनीय है; यह है <math>1\cdot x^n=x^n</math> शुरू में; और यह है <math>yx^0=y </math> अंत में।
एल्गोरिदम की शुद्धता इस तथ्य से उत्पन्न होती है कि <math>yx^n</math> गणना के दौरान अपरिवर्तनीय है; यह <math>1\cdot x^n=x^n</math> है, प्रारम्भ में; और <math>yx^0=y </math> अंत में इसकी गणना की जा सकती है।


ये एल्गोरिदम पूर्ववर्ती अनुभाग के एल्गोरिदम के समान ही संचालन की संख्या का उपयोग करते हैं, लेकिन गुणा एक अलग क्रम में किया जाता है।
ये एल्गोरिदम पूर्ववर्ती अनुभाग के एल्गोरिदम के समान ही संचालन की संख्या का उपयोग करते हैं, लेकिन गुणा एक अलग क्रम में किया जाता है।


== कम्प्यूटेशनल जटिलता ==
== कम्प्यूटेशनल जटिलता ==


एक संक्षिप्त विश्लेषण से पता चलता है कि ऐसा एल्गोरिदम उपयोग करता है <math>\lfloor \log_2n\rfloor</math> स्क्वायरिंग और अधिक से अधिक <math>\lfloor \log_2n\rfloor</math> गुणन, कहाँ <math>\lfloor\;\rfloor</math> [[फर्श समारोह]] को दर्शाता है। अधिक सटीक रूप से, गुणन की संख्या n के बाइनरी विस्तार में मौजूद लोगों की संख्या से एक कम है। लगभग 4 से अधिक n के लिए यह आधार को बार-बार अपने आप से गुणा करने की तुलना में कम्प्यूटेशनल रूप से अधिक कुशल है।
एक संक्षिप्त विश्लेषण से पता चलता है कि ऐसा एल्गोरिदम उपयोग करता है <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 की जटिलता<sup>n</sup> द्वारा दिया गया है
प्रत्येक वर्ग का परिणाम पिछले अंकों की संख्या का लगभग दोगुना होता है, और इसलिए, यदि दो डी-अंकों की संख्या का गुणन O(d) में कार्यान्वित किया जाता है<sup>k</sup>) संचालन कुछ निश्चित k के लिए, फिर कंप्यूटिंग x<sup>n</sup> की जटिलता द्वारा दिया गया है


: <math>
: <math>
Line 95: Line 113:


==2<sup>k</sup>-आरी विधि ==
==2<sup>k</sup>-आरी विधि ==
यह एल्गोरिथ्म x के मान की गणना करता है<sup>n</sup> बेस 2 में एक्सपोनेंट को बढ़ाने के बाद<sup>क</सुप>. यह पहली बार 1939 में [[ब्राउर]] द्वारा प्रस्तावित किया गया था। नीचे दिए गए एल्गोरिदम में हम निम्नलिखित फ़ंक्शन f(0) = (k,0) और f(m) = (s,u) का उपयोग करते हैं, जहां m = u·2<sup>एस</sup> यू विषम के साथ।
यह एल्गोरिथ्म x<sup>n</sup> के मान की गणना करता है बेस 2 में घातांक को बढ़ाने के बाद यह पहली बार 1939 में [[ब्राउर]] द्वारा प्रस्तावित किया गया था। नीचे दिए गए एल्गोरिदम में हम निम्नलिखित फलन f(0) = (k,0) और f(m) = (s,u) का उपयोग करते हैं, जहां m = u·2S U विषम के साथ उपयोग किया जाता है।


कलन विधि:
'''कलन विधि:'''


इनपुट: 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>.
'''इनपुट:''' 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>.


आउटपुट: तत्व एक्स<sup>n</sup> जी में
'''आउटपुट:''' अवयव X<sup>n</sup> G में


  वाई: = 1; मैं := एल - 1
  y := 1; i := l - 1
  'जबकि' मैं ≥ 0 करते हैं
  '''while''' i ≥ 0 do
     (एस, यू) := एफ (एन<sub>i</sub>)
     (s, u) := f(n<sub>i</sub>)
     j के लिए := 1 से k-s करते हैं
     '''for''' j := 1 '''to''' k - s '''do'''
         यः= <sup>2</उप>
         y := y<sup>2</sup>
     यः= *x<sup>यू</sup>
     y := y * x<sup>u</sup>
     j के लिए := 1 से s करें
     '''for''' j := 1 '''to''' s '''do'''
         यः= <sup>2</उप>
         y := y<sup>2</sup>
     मैं:= मैं - 1
     i := i - 1
  वापसी वाई
  '''return''' y


इष्टतम दक्षता के लिए, '' 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>




== स्लाइडिंग-विंडो विधि ==
== स्लाइडिंग-विंडो विधि ==
यह विधि 2 का एक कुशल रूप है<sup>k</sup>-आर्य विधि। उदाहरण के लिए, एक्सपोनेंट 398 की गणना करने के लिए, जिसमें बाइनरी एक्सपेंशन (110 001 110) है<sub>2</sub>, हम 2 का उपयोग करके लंबाई 3 की विंडो लेते हैं<sup>k</sup>-आर्य विधि एल्गोरिदम और 1, x की गणना करें<sup>3</सुप>, एक्स<sup>6</sup>, एक्स<sup>12</sup>, एक्स<sup>24</sup>, एक्स<sup>48</sup>, एक्स<sup>49</sup>, एक्स<sup>98</sup>, एक्स<sup>99</sup>, एक्स<sup>198</sup>, x<sup>199</sup>, एक्स<sup>398</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 की गणना भी कर सकते हैं<sup>3</सुप>, एक्स<sup>6</sup>, एक्स<sup>12</sup>, एक्स<sup>24</sup>, एक्स<sup>48</sup>, एक्स<sup>96</sup>, एक्स<sup>192</sup>, एक्स<sup>199</sup>, एक्स<sup>398</sup>, जो एक गुणन बचाता है और मूल्यांकन के बराबर होता है (110 001 110)<sub>2</sub>
 
लेकिन, हम 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 का एक अवयव 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.
 
'''कलन विधि:'''
 
y := 1; i := l - 1
'''while''' i > -1 '''do'''
    '''if''' n<sub>i</sub> = 0 '''then'''
        y := y<sup>2</sup>' i := i - 1
    '''else'''
        s := max{i - k + 1, 0}
        '''while''' n<sub>s</sub> = 0 '''do'''
            s := s + 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>
        '''for''' h := 1 '''to''' i - s + 1 '''do'''
            y := y<sup>2</sup>
        u := (n<sub>i</sub>, n<sub>i-1</sub>, ..., n<sub>s</sub>)<sub>2</sub>
        y := y * x<sup>u</sup>
        i := s - 1
'''return''' y
 
 
 
 
 


इनपुट: 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>.


आउटपुट: तत्व एक्स<sup>n</sup> ∈ जी.


कलन विधि:


वाई: = 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 करते हैं
            यः= य<sup>2</उप>
        में := (एन<sub>i</sub>, एन<sub>i-1</sub>, ..., एन<sub>s</sub>)<sub>2</sub>
यः= य*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>...एन<sub>0</sub>)<sub>2</sub> एन के साथ<sub>k−1</sub> = 1, हम x की गणना कर सकते हैं<sup>n</sup> इस प्रकार है:
एक्स<sub>1</sub> = एक्स; एक्स<sub>2</sub> = एक्स<sup>2</उप>
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>
== मोंटगोमरी की सोपान तकनीक ==
घातांक के लिए कई एल्गोरिदम साइड-चैनल हमलों के खिलाफ सुरक्षा प्रदान नहीं करते हैं। अर्थात्, एक आक्रमणकारी वर्ग और गुणा के अनुक्रम को देखकर (आंशिक रूप से) गणना में सम्मिलित घातांक को पुनर्प्राप्त कर सकता है। यह एक समस्या है और इस प्रतिपादक को गुप्त रहना चाहिए, जैसा कि कई सार्वजनिक-कुंजी क्रिप्टोग्राफ़ी सार्वजनिक-कुंजी क्रिप्टो सिस्टम में होता है। पीटर मोंटगोमरी (गणितज्ञ) नामक एक तकनीक मोंटगोमरी की सोपान<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> इस चिंता को संबोधित करता है।


Given the [[binary expansion]] of a positive, non-zero integer ''n'' = (''n''<sub>''k''−1</sub>...''n''<sub>0</sub>)<sub>2</sub> with ''n''<sub>k−1</sub> = 1, we can compute ''x<sup>n</sup>'' as follows:
x<sub>1</sub> = x; x<sub>2</sub> = x<sup>2</sup>
'''for''' i = k - 2 to 0 '''do'''
    '''if''' n<sub>i</sub> = 0 '''then'''
        x<sub>2</sub> = x<sub>1</sub> * x<sub>2</sub>; x<sub>1</sub> = x<sub>1</sub><sup>2</sup>
    '''else'''
        x<sub>1</sub> = x<sub>1</sub> * x<sub>2</sub>; x<sub>2</sub> = x<sub>2</sub><sup>2</sup>
'''return''' x<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> जब आधार निश्चित होता है और घातांक बदलता रहता है। जैसा कि कोई देख सकता है, इन एल्गोरिदम में [[पूर्वगणना]] एक महत्वपूर्ण भूमिका निभाते हैं।
 
 
 
 
 
 
 
 
 
 
 
 
== फिक्स्ड-बेस घातांक ==
एक्स<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>}} पूर्णांक हो।
याओ की {{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}} के रूप में लिखा जाए
प्रतिपादक को मान लीजिये कि {{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>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|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>}} की गणना नीचे एल्गोरिथम का उपयोग करके की जाती है:
अवयव {{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>}} की गणना नीचे एल्गोरिथम का उपयोग करके की जाती है:
 
y = 1, u = 1, j = h - 1
'''while''' j > 0 '''do'''
    '''for''' i = 0 '''to''' w - 1 '''do'''
        '''if''' n<sub>i</sub> = j '''then'''
            u = u × x<sup>b<sub>i</sub></sup>
    y = y × u
    j = j - 1
'''return''' y
 
अगर हम {{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 />
 
 
 
 
 
 
 
 


वाई = 1, यू = 1, जे = एच -1
जबकि 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'''}}, कहाँ {{mvar|n}} एक प्राकृतिक पूर्णांक है, जिसका एल्गोरिदम नीचे दिया गया है, निम्नलिखित समानता का पुनरावर्ती उपयोग कर रहा है:
कंप्यूटिंग के लिए यह तरीका <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>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> mod ''n''<sub>0</sub>}}.
 
दूसरे शब्दों में, प्रतिपादक का एक यूक्लिडियन विभाजन {{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> और फिर नीचे एल्गोरिथ्म उपयोग किया जाता है।
 
'''Begin loop'''
    {{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>.}}
    '''Break loop''' {{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|Compute recursively <math>x_M^q</math>,}} {{nowrap|and then '''let''' <math>x_N = x_N \cdot x_M^q</math>.}}
'''End loop''';
{{nowrap|'''Return''' <math>x^n = x_M^{n_M}</math>.}}
 
The algorithm first finds the largest value among the {{math|''n''<sub>''i''</sub>}} and then the supremum within the set of {{math|{{(}} ''n''<sub>''i''</sub> \ ''i'' ≠ ''M'' {{)}}}}.
Then it raises {{math|''x''<sub>''M''</sub>}} to the power {{mvar|q}}, multiplies this value with {{math|''x''<sub>''N''</sub>}}, and then assigns {{math|''x''<sub>''N''</sub>}} the result of this computation and {{math|''n''<sub>''M''</sub>}} the value {{math|''n''<sub>''M''</sub>}} modulo {{math|''n''<sub>''N''</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>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|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>.}}


एल्गोरिथ्म सबसे पहले सबसे बड़ा मूल्य पाता है {{math|''n''<sub>''i''</sub>}} और फिर के सेट के भीतर सुप्रीमम {{math|{{(}} ''n''<sub>''i''</sub> \ ''i'' ≠ ''M'' {{)}}}}.
फिर यह उठता है {{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 293:
विधि प्रत्येक सेमिग्रुप में काम करती है और अक्सर [[मैट्रिक्स (गणित)]] की शक्तियों की गणना करने के लिए प्रयोग की जाती है।
विधि प्रत्येक सेमिग्रुप में काम करती है और अक्सर [[मैट्रिक्स (गणित)]] की शक्तियों की गणना करने के लिए प्रयोग की जाती है।


उदाहरण के लिए, का मूल्यांकन
उदाहरण के लिए, का मानांकन


: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> मॉड्यूलर गुणन।
भोली विधि का उपयोग करने पर बहुत लंबा समय और अधिक संग्रहण स्थान लगेगा, 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>}} प्राप्त करने के लिए {{math|''x''<sup>2<sup>''k''</sup>−1</sup>}}.
कुछ संगणनाओं में नकारात्मक गुणांकों की अनुमति देना अधिक कुशल हो सकता है और इसलिए आधार के व्युत्क्रम का उपयोग किया जाता है, बशर्ते कि व्युत्क्रम हो {{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}} जैसा
इसके लिए हम एक पूर्णांक के हस्ताक्षरित अंकों के प्रतिनिधित्व को {{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> निम्नलखित में से कोई:  
हस्ताक्षरित बाइनरी प्रतिनिधित्व विशेष पसंद से समानता रखता है {{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 317:


== विकल्प और सामान्यीकरण ==
== विकल्प और सामान्यीकरण ==
{{main|Addition-chain exponentiation}}
{{main|जोड़-श्रृंखला घातांक}}
स्क्वेरिंग द्वारा एक्सपोनेंटिएशन को एक सबऑप्टिमल [[अतिरिक्त-श्रृंखला घातांक]] एल्गोरिथम के रूप में देखा जा सकता है: यह एक्सपोनेंट की गणना एक [[अतिरिक्त श्रृंखला]] द्वारा करता है जिसमें बार-बार एक्सपोनेंट दोहरीकरण (स्क्वायरिंग) और/या केवल एक (x से गुणा करके) एक्सपोनेंट बढ़ाना शामिल है। अधिक आम तौर पर, यदि कोई पहले से गणना किए गए एक्सपोनेंट को (x की उन शक्तियों को गुणा करके) अभिव्यक्त करने की अनुमति देता है, तो कभी-कभी कम गुणन (लेकिन आमतौर पर अधिक मेमोरी का उपयोग करके) एक्सपोनेंटिएशन का प्रदर्शन किया जा सकता है। सबसे छोटी शक्ति जहां ऐसा होता है वह n = 15 के लिए है:
 
स्क्वेरिंग द्वारा प्रतिपादक को एक सबऑप्टिमल [[अतिरिक्त-श्रृंखला घातांक]] एल्गोरिथम के रूप में देखा जा सकता है: यह घातांक की गणना एक [[अतिरिक्त श्रृंखला]] द्वारा करता है जिसमें बार-बार घातांक दोहरीकरण (स्क्वायरिंग) और/या केवल एक (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> का पुन: उपयोग किया जाता है)।


सामान्य तौर पर, किसी दिए गए घातांक के लिए इष्टतम जोड़ श्रृंखला खोजना एक कठिन समस्या है, जिसके लिए कोई कुशल एल्गोरिदम ज्ञात नहीं है, इसलिए इष्टतम श्रृंखलाएं आमतौर पर केवल छोटे घातांकों के लिए उपयोग की जाती हैं (उदाहरण के लिए [[संकलक]] में जहां छोटी शक्तियों के लिए जंजीरों को पूर्व-सारणीबद्ध किया गया है) ). हालांकि, ऐसे कई [[अनुमानी]] एल्गोरिदम हैं, जो इष्टतम नहीं होने के बावजूद अतिरिक्त बहीखाता पद्धति के काम और मेमोरी उपयोग की लागत पर घातांक की तुलना में कम गुणन करते हैं। इसके बावजूद, बिग-ओ नोटेशन | Θ (लॉग एन) की तुलना में गुणन की संख्या कभी भी अधिक धीरे-धीरे नहीं बढ़ती है, इसलिए ये एल्गोरिदम केवल एक स्थिर कारक द्वारा सर्वोत्तम रूप से वर्ग करके घातांक पर स्पर्शोन्मुख रूप से सुधार करते हैं।
सामान्यतः, किसी दिए गए घातांक के लिए इष्टतम जोड़ श्रृंखला खोजना एक कठिन समस्या है, जिसके लिए कोई कुशल एल्गोरिदम ज्ञात नहीं है, इसलिए इष्टतम श्रृंखलाएं सामान्यतः केवल छोटे घातांकों के लिए उपयोग की जाती हैं (उदाहरण के लिए [[संकलक]] में जहां छोटी शक्तियों के लिए जंजीरों को पूर्व-सारणीबद्ध किया गया है)). हालांकि, ऐसे कई [[अनुमानी]] एल्गोरिदम हैं, जो इष्टतम नहीं होने के बावजूद अतिरिक्त बहीखाता पद्धति के काम और मेमोरी उपयोग की लागत पर घातांक की तुलना में कम गुणन करते हैं। इसके बावजूद, बिग-ओ नोटेशन Θ (लॉग एन) की तुलना में गुणन की संख्या कभी भी अधिक धीरे-धीरे नहीं बढ़ती है, इसलिए ये एल्गोरिदम केवल एक स्थिर कारक द्वारा सर्वोत्तम रूप से वर्ग करके घातांक पर स्पर्शोन्मुख रूप से सुधार करते हैं।


== यह भी देखें ==
== यह भी देखें ==
Line 266: Line 339:
==संदर्भ==
==संदर्भ==
{{Reflist}}
{{Reflist}}
[[Category: घातांक]] [[Category: कंप्यूटर अंकगणितीय एल्गोरिदम]] [[Category: कंप्यूटर अंकगणित]]


[[Category: Machine Translated Page]]
[[Category:Articles with hatnote templates targeting a nonexistent page]]
[[Category:Articles with invalid date parameter in template]]
[[Category:Created On 17/03/2023]]
[[Category:Created On 17/03/2023]]
[[Category:Lua-based templates]]
[[Category:Machine Translated Page]]
[[Category:Pages with script errors]]
[[Category:Short description with empty Wikidata description]]
[[Category:Template documentation pages|Short description/doc]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates that add a tracking category]]
[[Category:Templates that generate short descriptions]]
[[Category:Templates using TemplateData]]
[[Category:Wikipedia articles needing clarification from May 2020]]
[[Category:कंप्यूटर अंकगणित]]
[[Category:कंप्यूटर अंकगणितीय एल्गोरिदम]]
[[Category:घातांक]]

Latest revision as of 13:22, 24 March 2023

गणित और कंप्यूटर प्रोग्रामिंग में, वर्ग द्वारा घातांक एक संख्या की बड़ी सकारात्मक पूर्णांक शक्तियों की तेजी से गणना के लिए एक सामान्य विधि है, या अधिक सामान्यतः एक अर्धसमूह के एक अवयव की, जैसे बहुपद या वर्ग मैट्रिक्स द्वारा इसकी गणना की जा सकती है। कुछ वेरिएंट्स को सामान्यतः वर्ग-और-गुणा एल्गोरिदम या बाइनरी प्रतिपादक के रूप में संदर्भित किया जाता है। ये काफी सामान्य उपयोग के हो सकते हैं, उदाहरण के लिए मॉड्यूलर अंकगणित या मेट्रिसेस की शक्ति। अर्धसमूह के लिए जिसके लिए एबेलियन समूह नोटेशन का सामान्यतः उपयोग किया जाता है, जैसे क्रिप्टोग्राफी में उपयोग किए जाने वाले वक्राकार वक्र, इस विधि को डबल-एंड-ऐड भी कहा जाता है।

मूल विधि

पुनरावर्ती संस्करण

विधि अवलोकन पर आधारित है कि, किसी भी पूर्णांक के लिए , किसी के पास:

यदि घातांक शून्य है तो उत्तर 1 है और यदि घातांक ऋणात्मक है तो हम धनात्मक घातांक का उपयोग करके मान को फिर से लिखकर पिछले सूत्र का पुन: उपयोग कर सकते हैं। वह है,
साथ में, इन्हें निम्नलिखित पुनरावर्तन (कंप्यूटर विज्ञान) के रूप में सीधे लागू किया जा सकता है:

 In: an integer x; an integer n
 Out: xn
 
 exp_by_squaring(x, n)
   if n < 0 then
      return exp_by_squaring(1 / x, -n);
   else if n = 0 then 
      return 1;
   else if n is even then 
      return exp_by_squaring(x * x, n / 2);
   else if n is odd then 
      return x * exp_by_squaring(x * x, (n - 1) / 2);
 end function 

प्रत्येक पुनरावर्ती कॉल में, बाइनरी प्रतिनिधित्व के कम से कम महत्वपूर्ण अंक 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 में

y := 1; i := l - 1
while i ≥ 0 do
    (s, u) := f(ni)
    for j := 1 to k - s do
        y := y2
    y := y * xu
    for j := 1 to s do
        y := y2
    i := i - 1
return y

इष्टतम दक्षता के लिए, 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.

कलन विधि:

y := 1; i := l - 1
while i > -1 do
    if ni = 0 then
        y := y2' i := i - 1
    else
        s := max{i - k + 1, 0}
        while ns = 0 do
            s := s + 1[notes 1]
        for h := 1 to i - s + 1 do
            y := y2
        u := (ni, ni-1, ..., ns)2
        y := y * xu
        i := s - 1
return y







मोंटगोमरी की सोपान तकनीक

घातांक के लिए कई एल्गोरिदम साइड-चैनल हमलों के खिलाफ सुरक्षा प्रदान नहीं करते हैं। अर्थात्, एक आक्रमणकारी वर्ग और गुणा के अनुक्रम को देखकर (आंशिक रूप से) गणना में सम्मिलित घातांक को पुनर्प्राप्त कर सकता है। यह एक समस्या है और इस प्रतिपादक को गुप्त रहना चाहिए, जैसा कि कई सार्वजनिक-कुंजी क्रिप्टोग्राफ़ी सार्वजनिक-कुंजी क्रिप्टो सिस्टम में होता है। पीटर मोंटगोमरी (गणितज्ञ) नामक एक तकनीक मोंटगोमरी की सोपान[2] इस चिंता को संबोधित करता है।

Given the binary expansion of a positive, non-zero integer n = (nk−1...n0)2 with nk−1 = 1, we can compute xn as follows:

x1 = x; x2 = x2
for i = k - 2 to 0 do
    if ni = 0 then
        x2 = x1 * x2; x1 = x12
    else
        x1 = x1 * x2; x2 = x22
return x1

एल्गोरिथ्म संचालन का एक निश्चित अनुक्रम करता है (लॉगन तक): बिट के विशिष्ट मान की परवाह किए बिना, प्रतिपादक में प्रत्येक बिट के लिए एक गुणन और वर्ग होता है। दोहरीकरण द्वारा गुणन के लिए एक समान एल्गोरिथ्म सम्मिलित है।

मॉन्टगोमरी की सोपान का यह विशिष्ट कार्यान्वयन अभी तक कैश टाइमिंग हमलों के खिलाफ सुरक्षित नहीं है: मेमोरी एक्सेस लेटेंसी अभी भी एक आक्रमणकारी के लिए देखी जा सकती है, क्योंकि गुप्त प्रतिपादक के बिट्स के मान के आधार पर विभिन्न चर का उपयोग किया जाता है। आधुनिक क्रिप्टोग्राफ़िक कार्यान्वयन यह सुनिश्चित करने के लिए एक स्कैटर तकनीक का उपयोग करते हैं कि प्रोसेसर सदैव तेज कैश को मेमोरी में स्टोर करता है।[3]







फिक्स्ड-बेस घातांक

एक्सn की गणना करने के लिए कई विधियां नियोजित की जा सकती हैं जब आधार निश्चित होता है और घातांक बदलता रहता है। जैसा कि कोई देख सकता है, इन एल्गोरिदम में पूर्वगणना एक महत्वपूर्ण भूमिका निभाते हैं।

याओ की विधि

याओ की 2k विधि ओर्थोगोनल है - आर्य पद्धति जहां घातांक को b = 2k मूलांक में विस्तारित किया जाता है, और गणना उपरोक्त एल्गोरिथम में की गई है। मान लीजिये कि n, ni, b, और bi पूर्णांक हो।

प्रतिपादक को मान लीजिये कि n के रूप में लिखा जाए

जहाँ सभी के लिए .

मान लीजिये कि xi = xbi.

तब एल्गोरिथ्म समानता का उपयोग करता है

अवयव x का G, और प्रतिपादक n पूर्व संगणित मानों के साथ xb0...xbw−1 उपरोक्त रूप में लिखा गया है, अवयव xn की गणना नीचे एल्गोरिथम का उपयोग करके की जाती है:

y = 1, u = 1, j = h - 1
while j > 0 do
    for i = 0 to w - 1 do
        if ni = j then
            u = u × xbi
    y = y × u
    j = j - 1
return y

अगर हम h = 2k सेट करते हैं और bi = hi, फिर ni मान केवल अंक हैं n बेस में h. याओ की विधि उन सबसे पहले आप में xi एकत्रित होती है, जो उच्चतम शक्ति को दिखाई देते हैं, अगले दौर में सत्ता के साथ में u एकत्र किया जाता है, साथ ही y चर को गुणा किया जाता है बार प्रारंभिक के साथ u, बार अगली उच्चतम शक्तियों के साथ, और इसी तरह एल्गोरिथम उपयोग करता है, गुणन और अवयवों को xn गणना करने के लिए संग्रहित किया जाना चाहिए।[1]







यूक्लिडियन विधि

यूक्लिडियन पद्धति को पहली बार पीडी रूइज द्वारा प्रीकंप्यूटेशन और वेक्टर एडिशन चेन का उपयोग करके कुशल प्रतिपादक में पेश किया गया था।

कंप्यूटिंग के लिए यह तरीका समूह में G, जहाँ n एक प्राकृतिक पूर्णांक है, जिसका एल्गोरिदम नीचे दिया गया है, निम्नलिखित समानता का पुनरावर्ती उपयोग कर रहा है:

जहाँ

दूसरे शब्दों में, प्रतिपादक का एक यूक्लिडियन विभाजन n1 द्वारा n0 का उपयोग भागफल लौटाने के लिए किया जाता है q और विराम n1 mod n0.

आधार अवयव दिया x समूह में G, और प्रतिपादक याओ की विधि, अवयव के रूप में लिखा गया है का उपयोग करके गणना की जाती है पूर्व संगणित मान और फिर नीचे एल्गोरिथ्म उपयोग किया जाता है।

Begin loop
    Find , such that .
    Find , such that .
    Break loop if .
    Let , and then let .
    Compute recursively , and then let .
End loop;
Return .

The algorithm first finds the largest value among the ni and then the supremum within the set of { ni \ iM }. Then it raises xM to the power q, multiplies this value with xN, and then assigns xN the result of this computation and nM the value nM modulo 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 का पुन: उपयोग किया जाता है)।

सामान्यतः, किसी दिए गए घातांक के लिए इष्टतम जोड़ श्रृंखला खोजना एक कठिन समस्या है, जिसके लिए कोई कुशल एल्गोरिदम ज्ञात नहीं है, इसलिए इष्टतम श्रृंखलाएं सामान्यतः केवल छोटे घातांकों के लिए उपयोग की जाती हैं (उदाहरण के लिए संकलक में जहां छोटी शक्तियों के लिए जंजीरों को पूर्व-सारणीबद्ध किया गया है)). हालांकि, ऐसे कई अनुमानी एल्गोरिदम हैं, जो इष्टतम नहीं होने के बावजूद अतिरिक्त बहीखाता पद्धति के काम और मेमोरी उपयोग की लागत पर घातांक की तुलना में कम गुणन करते हैं। इसके बावजूद, बिग-ओ नोटेशन Θ (लॉग एन) की तुलना में गुणन की संख्या कभी भी अधिक धीरे-धीरे नहीं बढ़ती है, इसलिए ये एल्गोरिदम केवल एक स्थिर कारक द्वारा सर्वोत्तम रूप से वर्ग करके घातांक पर स्पर्शोन्मुख रूप से सुधार करते हैं।

यह भी देखें

  • मॉड्यूलर घातांक
  • वेक्टर अतिरिक्त श्रृंखला
  • मोंटगोमरी कमी
  • गैर-निकटवर्ती रूप
  • अतिरिक्त श्रृंखला

टिप्पणियाँ

  1. 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. 1.0 1.1 Cohen, H.; Frey, G., eds. (2006). अण्डाकार और हाइपरेलिप्टिक वक्र क्रिप्टोग्राफी की पुस्तिका. Discrete Mathematics and Its Applications. Chapman & Hall/CRC. ISBN 9781584885184.
  2. Montgomery, Peter L. (1987). "स्पीडिंग द पोलार्ड एंड एलिप्टिक कर्व मेथड्स ऑफ फैक्टराइजेशन" (PDF). Math. Comput. 48 (177): 243–264. doi:10.1090/S0025-5718-1987-0866113-7.
  3. Gueron, Shay (5 April 2012). "मॉड्यूलर घातांक का कुशल सॉफ्टवेयर कार्यान्वयन" (PDF). Journal of Cryptographic Engineering. 2 (1): 31–43. doi:10.1007/s13389-012-0031-5. S2CID 7629541.