<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mathematics on kenji.blog</title><link>http://kenji.blog/hi/categories/mathematics/</link><description>Recent content in Mathematics on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>hi</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 22:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/hi/categories/mathematics/index.xml" rel="self" type="application/rss+xml"/><item><title>फर्मेट के छोटे प्रमेय का उपयोग करते हुए क्रिप्टोग्राफी के मूल सिद्धांत और कार्यान्वयन</title><link>http://kenji.blog/hi/p/fermats-little-theorem-cryptography-implementation/</link><pubDate>Fri, 11 Sep 2026 22:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/fermats-little-theorem-cryptography-implementation/</guid><description>&lt;img src="http://kenji.blog/p/fermats-little-theorem-cryptography-implementation/img/eyecatch.jpg" alt="Featured image of post फर्मेट के छोटे प्रमेय का उपयोग करते हुए क्रिप्टोग्राफी के मूल सिद्धांत और कार्यान्वयन" />&lt;h2 id="1-परचय-आधनक-करपटगरफ-क-समरथन-करन-वल-गणत-क-रहसय">1. परिचय: आधुनिक क्रिप्टोग्राफी का समर्थन करने वाले गणित का रहस्य
&lt;/h2>&lt;p>आधुनिक डिजिटल समाज में, विशेष रूप से इंटरनेट के माध्यम से संचार में, &amp;lsquo;क्रिप्टोग्राफी&amp;rsquo; (एन्क्रिप्शन) एक अपरिहार्य आधारभूत तकनीक बन गई है। हम वेब ब्राउज़र में HTTPS के माध्यम से सुरक्षित रूप से वेबसाइट ब्राउज़ कर सकते हैं, ऑनलाइन बैंकिंग में वित्तीय लेनदेन कर सकते हैं, और मैसेजिंग ऐप्स पर निजी बातचीत कर सकते हैं, यह सब उन्नत गणितीय सिद्धांतों द्वारा समर्थित क्रिप्टोग्राफ़िक प्रोटोकॉल के बैकग्राउंड में काम करने के कारण संभव है। इनमें से &amp;lsquo;पब्लिक-की क्रिप्टोग्राफी&amp;rsquo; (सार्वजनिक-कुंजी क्रिप्टोग्राफी) एक बहुत ही महत्वपूर्ण भूमिका निभाती है, और इसका सबसे प्रमुख उदाहरण &lt;strong>RSA क्रिप्टोग्राफी&lt;/strong> है।&lt;/p>
&lt;p>RSA सहित कई क्रिप्टोग्राफिक एल्गोरिदम की सुरक्षा और वैधता 17वीं सदी के फ्रांसीसी गणितज्ञ पियरे डी फर्मेट (Pierre de Fermat) द्वारा खोजे गए एक अत्यंत सुंदर और शक्तिशाली प्रमेय पर काफी हद तक निर्भर करती है। यह &lt;strong>फर्मेट का छोटा प्रमेय (Fermat&amp;rsquo;s Little Theorem)&lt;/strong> है। इसके अलावा, लियोनहार्ड यूलर (Leonhard Euler) का प्रमेय, जो कि इसका सामान्यीकरण है, भी क्रिप्टोग्राफिक सिद्धांत में एक निर्णायक भूमिका निभाता है।&lt;/p>
&lt;p>इस लेख में, हम शुरुआत से गहराई से बताएंगे कि कैसे फर्मेट के छोटे प्रमेय, जो कि शुद्ध गणित की एक खोज है, को आधुनिक व्यावहारिक क्रिप्टोग्राफिक तकनीकों, विशेष रूप से &amp;lsquo;अभाज्य संख्या परीक्षण&amp;rsquo; (Primality Test) और &amp;lsquo;RSA क्रिप्टोग्राफी&amp;rsquo; में लागू किया जाता है। यह एक बहुत विस्तृत तकनीकी मार्गदर्शिका होगी, जिसमें गणितीय प्रमाण, एन्क्रिप्शन और डिक्रिप्शन के तंत्र, और C++ और Python का उपयोग करके विशिष्ट एल्गोरिदम के कार्यान्वयन को शामिल किया गया है।&lt;/p>
&lt;hr>
&lt;h2 id="2-सरवगसमत-congruence-और-मडयलर-अकगणत-क-मल-सदधत">2. सर्वांगसमता (Congruence) और मॉड्यूलर अंकगणित के मूल सिद्धांत
&lt;/h2>&lt;p>फर्मेट के छोटे प्रमेय को समझने के लिए, सबसे पहले &amp;lsquo;मॉड्यूलर अंकगणित (सर्वांगसमता)&amp;rsquo; की गणितीय अवधारणा से परिचित होना आवश्यक है। मॉड्यूलर अंकगणित गणना की एक प्रणाली है जो किसी निश्चित संख्या (जिसे मॉड्यूलस कहा जाता है) से विभाजित करने पर प्राप्त &amp;lsquo;शेषफल&amp;rsquo; (remainder) पर केंद्रित होती है। चूंकि यह घड़ी के डायल (जो 12 घंटे में एक चक्कर पूरा करता है) की तरह एक गणना है, इसे अक्सर &amp;lsquo;घड़ी का गणित&amp;rsquo; भी कहा जाता है।&lt;/p>
&lt;p>जब पूर्णांक $a$ और $b$ को धनात्मक पूर्णांक $n$ से विभाजित करने पर शेषफल समान होता है, तो गणितीय रूप से इसे इस प्रकार लिखा जाता है:&lt;/p>
$$
a \equiv b \pmod n
$$
&lt;p>इसे इस प्रकार पढ़ा जाता है: &amp;ldquo;$a$ और $b$ मॉड्यूलो $n$ सर्वांगसम (congruent) हैं&amp;rdquo;। उदाहरण के लिए, 17 को 5 से भाग देने पर शेषफल 2 आता है, और 12 को 5 से भाग देने पर भी शेषफल 2 आता है। इसलिए, इसे इस प्रकार लिखा जा सकता है:&lt;/p>
$$
17 \equiv 12 \pmod 5 \equiv 2 \pmod 5
$$
&lt;p>मॉड्यूलर अंकगणित में, सामान्य बुनियादी अंकगणितीय संक्रियाएँ (जोड़, घटाव, गुणा) वैसे ही लागू होती हैं:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>जोड़ (Addition)&lt;/strong>: यदि $a \equiv b \pmod n$ और $c \equiv d \pmod n$, तो $a + c \equiv b + d \pmod n$&lt;/li>
&lt;li>&lt;strong>घटाव (Subtraction)&lt;/strong>: यदि $a \equiv b \pmod n$ और $c \equiv d \pmod n$, तो $a - c \equiv b - d \pmod n$&lt;/li>
&lt;li>&lt;strong>गुणा (Multiplication)&lt;/strong>: यदि $a \equiv b \pmod n$ और $c \equiv d \pmod n$, तो $a \times c \equiv b \times d \pmod n$&lt;/li>
&lt;li>&lt;strong>घातांक (Exponentiation)&lt;/strong>: यदि $a \equiv b \pmod n$, तो किसी भी प्राकृतिक संख्या $k$ के लिए $a^k \equiv b^k \pmod n$&lt;/li>
&lt;/ol>
&lt;p>हालाँकि, &lt;strong>भाग (Division)&lt;/strong> के संबंध में सावधानी बरतने की आवश्यकता है। सामान्य तौर पर, यदि $a \times c \equiv b \times c \pmod n$ है, तो इसका मतलब यह नहीं है कि हम दोनों पक्षों को $c$ से भाग देकर $a \equiv b \pmod n$ कर सकते हैं। यह केवल तभी सत्य होता है जब $c$ और $n$ सह-अभाज्य (coprime) हों (यानी, उनका महत्तम समापवर्तक 1 हो)। &amp;lsquo;मॉड्यूलर व्युत्क्रम (Modular inverse)&amp;rsquo; की यह अवधारणा RSA क्रिप्टोग्राफी में कुंजी निर्माण (key generation) के लिए अत्यंत महत्वपूर्ण है, जिस पर हम बाद में चर्चा करेंगे।&lt;/p>
&lt;hr>
&lt;h2 id="3-फरमट-क-छट-परमय-क-गणतय-पषठभम-और-परमण">3. फर्मेट के छोटे प्रमेय की गणितीय पृष्ठभूमि और प्रमाण
&lt;/h2>&lt;p>मॉड्यूलर अंकगणित के मूल सिद्धांतों को समझने के बाद, आइए हमारे मुख्य विषय, फर्मेट के छोटे प्रमेय (Fermat&amp;rsquo;s Little Theorem) पर नज़र डालते हैं।&lt;/p>
&lt;h3 id="31-परमय-क-परभष">3.1 प्रमेय की परिभाषा
&lt;/h3>&lt;p>फर्मेट के छोटे प्रमेय को इस प्रकार तैयार किया गया है:&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>फर्मेट का छोटा प्रमेय (Fermat&amp;rsquo;s Little Theorem)&lt;/strong>
मान लीजिए कि $p$ एक अभाज्य संख्या (prime number) है, और $a$ कोई ऐसा पूर्णांक है जो $p$ का गुणज नहीं है (अर्थात $a$ और $p$ सह-अभाज्य हैं)। इस स्थिति में, निम्नलिखित सर्वांगसमता (congruence) सत्य होगी:
&lt;/p>
$$ a^{p-1} \equiv 1 \pmod p $$
&lt;/blockquote>
&lt;p>इसके अलावा, &amp;ldquo;$a$, $p$ का गुणज नहीं है&amp;rdquo; की शर्त को हटाकर इसे एक ऐसे रूप में व्यक्त करना भी आम है जो सभी पूर्णांकों $a$ के लिए सही है। उस स्थिति में, दोनों पक्षों को $a$ से गुणा करने पर निम्नलिखित प्राप्त होता है:&lt;/p>
$$
a^p \equiv a \pmod p
$$
&lt;h3 id="32-वशषट-उदहरण-क-सथ-सतयपन">3.2 विशिष्ट उदाहरणों के साथ सत्यापन
&lt;/h3>&lt;p>आइए विशिष्ट संख्याओं का उपयोग करके जांचें कि क्या यह प्रमेय वास्तव में काम करता है।
मान लें कि अभाज्य संख्या $p = 5$ है। तो $p-1 = 4$ होगा। हम $a$ के रूप में एक पूर्णांक चुनते हैं जो $p$ का गुणज नहीं है।&lt;/p>
&lt;ul>
&lt;li>यदि $a = 2$: $2^{5-1} = 2^4 = 16$. $16 \div 5 = 3$ शेषफल $1$. अतः $16 \equiv 1 \pmod 5$. (सत्यापित)&lt;/li>
&lt;li>यदि $a = 3$: $3^{5-1} = 3^4 = 81$. $81 \div 5 = 16$ शेषफल $1$. अतः $81 \equiv 1 \pmod 5$. (सत्यापित)&lt;/li>
&lt;li>यदि $a = 4$: $4^{5-1} = 4^4 = 256$. $256 \div 5 = 51$ शेषफल $1$. अतः $256 \equiv 1 \pmod 5$. (सत्यापित)&lt;/li>
&lt;/ul>
&lt;p>इस प्रकार, हम जो भी $a$ चुनते हैं (जब तक कि वह 5 का गुणज न हो), उसे घात 4 तक बढ़ाने और 5 से भाग देने पर शेषफल हमेशा 1 होगा। यह जादू जैसा लग सकता है, लेकिन यह अभाज्य संख्याओं के सुंदर गुणों से उत्पन्न होता है।&lt;/p>
&lt;h3 id="33-परमय-क-गणतय-परमण">3.3 प्रमेय का गणितीय प्रमाण
&lt;/h3>&lt;p>ऐसा क्यों होता है? यहाँ हम अवशिष्ट वर्गों (residue classes) के सेट का उपयोग करते हुए एक सुरुचिपूर्ण प्रमाण प्रस्तुत करते हैं।&lt;/p>
&lt;p>मान लीजिए एक सेट $S = \{1, 2, 3, \dots, p-1\}$ है। ये उन पूर्णांकों के प्रतिनिधि हैं जिन्हें $p$ से विभाजित करने पर शेषफल $1$ से $p-1$ तक आते हैं।
अब, एक नए सेट $T$ पर विचार करें जहाँ $S$ के प्रत्येक तत्व को $p$ के साथ सह-अभाज्य पूर्णांक $a$ से गुणा किया गया है:
&lt;/p>
$$ T = \{1a, 2a, 3a, \dots, (p-1)a\} $$
&lt;p>इस सेट $T$ के प्रत्येक तत्व को $p$ से विभाजित करने पर प्राप्त शेषफलों पर विचार करें। आश्चर्यजनक रूप से, ये शेषफल, भले ही उनका क्रम बदल गया हो, मूल सेट $S$ के तत्वों से पूरी तरह मेल खाएंगे।
ऐसा इसलिए है क्योंकि:&lt;/p>
&lt;ol>
&lt;li>$T$ का कोई भी तत्व $p$ का गुणज नहीं हो सकता (क्योंकि न तो $a$ और न ही मूल तत्व $p$ के गुणज हैं)।&lt;/li>
&lt;li>$T$ में ऐसे कोई दो भिन्न तत्व नहीं हैं जो मॉड्यूलो $p$ सर्वांगसम हों। यदि $ia \equiv ja \pmod p$ (जहाँ $i \neq j$) है, तो चूंकि $a$ और $p$ सह-अभाज्य हैं, हम $a$ से भाग दे सकते हैं और $i \equiv j \pmod p$ प्राप्त कर सकते हैं, जो एक विरोधाभास है।&lt;/li>
&lt;/ol>
&lt;p>इसलिए, $S$ के सभी तत्वों का गुणनफल और $T$ के सभी तत्वों का गुणनफल मॉड्यूलो $p$ सर्वांगसम होंगे।&lt;/p>
$$
(1a) \times (2a) \times \dots \times ((p-1)a) \equiv 1 \times 2 \times \dots \times (p-1) \pmod p
$$
&lt;p>बायें पक्ष को व्यवस्थित करने पर, चूंकि $a$, $p-1$ बार है:&lt;/p>
$$
a^{p-1} \cdot (p-1)! \equiv (p-1)! \pmod p
$$
&lt;p>चूंकि $(p-1)!$ और $p$ सह-अभाज्य हैं, हम दोनों पक्षों को $(p-1)!$ से भाग दे सकते हैं, जिससे अंततः निम्नलिखित प्रमेय प्राप्त होता है:&lt;/p>
$$
a^{p-1} \equiv 1 \pmod p
$$
&lt;p>यह फर्मेट के छोटे प्रमेय का प्रमाण है।&lt;/p>
&lt;hr>
&lt;h2 id="4-यलर-क-टटएट-फलन-eulers-totient-function-और-यलर-क-परमय">4. यूलर का टोटिएंट फलन (Euler&amp;rsquo;s Totient Function) और यूलर का प्रमेय
&lt;/h2>&lt;p>फर्मेट का छोटा प्रमेय &amp;lsquo;अभाज्य संख्या $p$&amp;rsquo; के बारे बारे में है, लेकिन लियोनहार्ड यूलर ने इसे &amp;lsquo;किसी भी धनात्मक पूर्णांक $n$&amp;rsquo; के लिए सामान्यीकृत किया। RSA क्रिप्टोग्राफी को समझने के लिए यह विस्तार आवश्यक है।&lt;/p>
&lt;h3 id="41-यलर-क-टटएट-फलन-phin">4.1 यूलर का टोटिएंट फलन $\phi(n)$
&lt;/h3>&lt;p>यूलर का टोटिएंट फलन (या यूलर का $\phi$ फलन) $\phi(n)$ एक ऐसा फलन है जो &amp;ldquo;$1$ से $n$ तक के उन पूर्णांकों की संख्या को दर्शाता है जो $n$ के साथ सह-अभाज्य हैं&amp;rdquo;।&lt;/p>
&lt;ul>
&lt;li>किसी अभाज्य संख्या $p$ के लिए, $1$ से $p-1$ तक के सभी पूर्णांक $p$ के साथ सह-अभाज्य होते हैं, इसलिए $\phi(p) = p - 1$ होगा।&lt;/li>
&lt;li>दो भिन्न अभाज्य संख्याओं $p, q$ के लिए, यदि उनका गुणनफल $n = p \times q$ है, तो $\phi(n)$ को एक बहुत ही सरल सूत्र द्वारा निकाला जा सकता है:
$$ \phi(p \times q) = \phi(p) \times \phi(q) = (p - 1)(q - 1) $$&lt;/li>
&lt;/ul>
&lt;p>यह गुण RSA क्रिप्टोग्राफी में कुंजी निर्माण का मूल तर्क (logic) बन जाता है।&lt;/p>
&lt;h3 id="42-यलर-क-परमय">4.2 यूलर का प्रमेय
&lt;/h3>&lt;p>यूलर ने फर्मेट के छोटे प्रमेय को इस प्रकार सामान्यीकृत किया:&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>यूलर का प्रमेय (Euler&amp;rsquo;s Theorem)&lt;/strong>
एक धनात्मक पूर्णांक $n$ और उसके साथ सह-अभाज्य पूर्णांक $a$ के लिए, निम्नलिखित सत्य है:
&lt;/p>
$$ a^{\phi(n)} \equiv 1 \pmod n $$
&lt;/blockquote>
&lt;p>यदि $n$ एक अभाज्य संख्या $p$ है, तो $\phi(p) = p - 1$, जिसका अर्थ है कि यह स्वयं फर्मेट का छोटा प्रमेय ($a^{p-1} \equiv 1 \pmod p$) बन जाता है। दूसरे शब्दों में, फर्मेट का छोटा प्रमेय यूलर के प्रमेय का ही एक विशेष मामला है।&lt;/p>
&lt;hr>
&lt;h2 id="5-वशल-अभजय-सखयए-ढढन-फरमट-क-अभजय-परकषण-primality-test">5. विशाल अभाज्य संख्याएँ ढूँढना: फर्मेट का अभाज्य परीक्षण (Primality Test)
&lt;/h2>&lt;p>क्रिप्टोग्राफी (जैसे RSA क्रिप्टोग्राफी और डिफी-हेलमैन (Diffie-Hellman) कुंजी विनिमय) में, सैकड़ों अंकों की &amp;lsquo;विशाल अभाज्य संख्याएँ&amp;rsquo; तेज़ी से खोजना आवश्यक है। हालाँकि, यह निर्धारित करने के लिए कि क्या एक विशाल संख्या $N$ अभाज्य है, &amp;lsquo;परीक्षण विभाजन विधि&amp;rsquo; (Trial division), जिसमें $2$ से $\sqrt{N}$ तक की सभी संख्याओं से भाग देकर जाँचा जाता है, में ब्रह्मांड के जीवनकाल जितना समय लग सकता है।&lt;/p>
&lt;p>यहीं पर फर्मेट के छोटे प्रमेय का उपयोग करने वाला &amp;lsquo;प्रायिकतात्मक अभाज्य परीक्षण&amp;rsquo; (Probabilistic primality test), जिसे &lt;strong>फर्मेट टेस्ट (Fermat Primality Test)&lt;/strong> कहा जाता है, सामने आता है।&lt;/p>
&lt;h3 id="51-परयकततमक-अभजय-परकषण-कय-ह">5.1 प्रायिकतात्मक अभाज्य परीक्षण क्या है?
&lt;/h3>&lt;p>फर्मेट के छोटे प्रमेय के अनुसार, यदि $p$ अभाज्य है, तो किसी भी $a$ ($1 &lt; a &lt; p$) के लिए, $a^{p-1} \equiv 1 \pmod p$ हमेशा सत्य होगा।
इसका प्रतिलोम (contrapositive) लेने पर हम कह सकते हैं, &amp;ldquo;यदि किसी $a$ के लिए $a^{p-1} \not\equiv 1 \pmod p$ है, तो $p$ &lt;strong>निश्चित रूप से अभाज्य नहीं है (यह एक भाज्य संख्या (composite number) है)&lt;/strong>&amp;quot;।&lt;/p>
&lt;p>इसलिए, यदि हम परीक्षण करना चाहते हैं कि क्या $N$ अभाज्य है, तो हम यादृच्छिक रूप से कुछ $a$ चुनते हैं, $a^{N-1} \pmod N$ की गणना करते हैं, और जांचते हैं कि क्या यह $1$ है। यदि उत्तर एक बार भी $1$ के अलावा कुछ और आता है, तो $N$ निश्चित रूप से एक भाज्य संख्या है। यदि कई बार परीक्षण करने के बाद भी यह $1$ आता है, तो हम उच्च संभावना के साथ कह सकते हैं कि $N$ &amp;ldquo;संभवतः अभाज्य (probably prime)&amp;rdquo; है।&lt;/p>
&lt;h3 id="52-एलगरदम-क-ववरण-और-फलचरट">5.2 एल्गोरिदम का विवरण और फ़्लोचार्ट
&lt;/h3>&lt;p>फर्मेट टेस्ट का एल्गोरिदम इस प्रकार है:&lt;/p>
&lt;div class="mermaid">flowchart TD
Start["प्रारंभ"] --> Input["परीक्षण की जाने वाली संख्या p और परीक्षणों की संख्या k इनपुट करें"]
Input --> LoopStart["i = 0 से k-1 तक लूप"]
LoopStart --> Condition{"i &lt; k ?"}
Condition -- "हाँ" --> RandomA["1 &lt; a &lt; p-1 के बीच एक यादृच्छिक पूर्णांक a चुनें"]
RandomA --> Calc["मॉड्यूलर घातांक a^(p-1) mod p की गणना करें"]
Calc --> CheckPrime{"क्या परिणाम 1 है?"}
CheckPrime -- "नहीं" --> ReturnComposite["p एक भाज्य संख्या है (निश्चित)"]
CheckPrime -- "हाँ" --> Increment["i को बढ़ाएँ (increment)"]
Increment --> Condition
Condition -- "नहीं" --> ReturnPrime["p संभवतः अभाज्य है (प्रायिकतात्मक)"]
ReturnComposite --> End["समाप्त"]
ReturnPrime --> End&lt;/div>
&lt;h3 id="53-करमइकल-सखयए-pseudoprimes-क-जल">5.3 कारमाइकल संख्याएँ (Pseudoprimes) का जाल
&lt;/h3>&lt;p>फर्मेट टेस्ट बहुत तेज़ है, लेकिन इसमें एक गंभीर दोष है। कुछ ऐसी दुष्ट संख्याएँ होती हैं जो भाज्य (composite) होने के बावजूद, सभी $a$ के लिए $a^{N-1} \equiv 1 \pmod N$ को संतुष्ट करती हैं। इन्हें &lt;strong>कारमाइकल संख्याएँ (Carmichael numbers)&lt;/strong> कहा जाता है। सबसे छोटी कारमाइकल संख्या $561$ ($3 \times 11 \times 17$) है।&lt;/p>
&lt;p>कारमाइकल संख्याओं के अस्तित्व के कारण, केवल शुद्ध फर्मेट टेस्ट से पूर्ण अभाज्य परीक्षण नहीं किया जा सकता है। इसलिए, वास्तविक एन्क्रिप्शन सिस्टम (जैसे OpenSSL) मानक के रूप में &lt;strong>मिलर-राबिन (Miller-Rabin) अभाज्य परीक्षण&lt;/strong> का उपयोग करते हैं, जो फर्मेट टेस्ट का एक उन्नत संस्करण है। मिलर-राबिन परीक्षण कारमाइकल संख्याओं का पता लगा सकता है, जिससे गलत निर्णय की संभावना लगभग शून्य हो जाती है।&lt;/p>
&lt;h3 id="54-तज-मडयलर-घतक-exponentiation-by-squaring">5.4 तेज़ मॉड्यूलर घातांक (Exponentiation by Squaring)
&lt;/h3>&lt;p>अभाज्य परीक्षण एल्गोरिदम में, $a^{N-1} \pmod N$ की गणना करना आवश्यक है, लेकिन यदि $N$ बहुत बड़ा है, तो $a^{N-1}$ खगोलीय अंकों में होगा और कंप्यूटर की मेमोरी में फिट नहीं होगा।
इसका समाधान &lt;strong>निरंतर वर्ग विधि (Exponentiation by Squaring)&lt;/strong> या मॉड्यूलर घातांक (modular exponentiation) है। गणना के प्रत्येक चरण में मॉड्यूलो (mod N) लेने से, मान हमेशा $N$ से छोटा रखा जाता है, जिससे गणना बहुत तेज़ी से (समय जटिलता $O(\log N)$ में) की जा सकती है।&lt;/p>
&lt;hr>
&lt;h2 id="6-अभजय-परकषण-और-मडयलर-घतक-क-करयनवयन">6. अभाज्य परीक्षण और मॉड्यूलर घातांक का कार्यान्वयन
&lt;/h2>&lt;p>तो चलिए C++ और Python में फर्मेट अभाज्य परीक्षण और निरंतर वर्ग विधि (exponentiation by squaring) को लागू करते हैं।&lt;/p>
&lt;h3 id="61-c-म-करयनवयन">6.1 C++ में कार्यान्वयन
&lt;/h3>&lt;p>C++ में, मानक पूर्णांक प्रकार (standard integer types) आसानी से ओवरफ़्लो हो जाते हैं, इसलिए बड़ी संख्याओं को संभालने के लिए मल्टी-प्रिसिजन इंटीजर लाइब्रेरी (जैसे GMP) की आवश्यकता होती है, लेकिन यहाँ हम एल्गोरिदम को समझने के लिए 64-बिट पूर्णांक (&lt;code>unsigned long long&lt;/code>) की सीमा के भीतर एक कार्यान्वयन दिखाएंगे।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;random&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="k">namespace&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// तेज़ मॉड्यूलर घातांक (a^b mod m) - निरंतर वर्ग विधि (Exponentiation by squaring)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="nf">power_mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// यदि b का सबसे निचला बिट 1 है, तो परिणाम को a से गुणा करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">__int128&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">result&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// ओवरफ़्लो रोकने के लिए 128-बिट विस्तार
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// a का वर्ग करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">__int128&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">a&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// b को राइट शिफ्ट करें (आधा करें)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">/=&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">result&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// फर्मेट का अभाज्य परीक्षण
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kt">bool&lt;/span> &lt;span class="nf">fermat_is_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">iterations&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">random_device&lt;/span> &lt;span class="n">rd&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mt19937_64&lt;/span> &lt;span class="n">gen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rd&lt;/span>&lt;span class="p">());&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">uniform_int_distribution&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">dis&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">iterations&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="o">++&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">dis&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">gen&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// यदि a^(p-1) mod p, 1 नहीं है, तो यह भाज्य संख्या है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">power_mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// संभवतः अभाज्य
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">num&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1000000007&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// ज्ञात अभाज्य
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">fermat_is_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">num&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">num&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; is probably prime.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">num&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; is composite.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="62-python-म-करयनवयन">6.2 Python में कार्यान्वयन
&lt;/h3>&lt;p>Python का मानक पूर्णांक प्रकार (standard integer type) मनमाने आकार की संख्याओं (arbitrary-precision integers) का समर्थन करता है, इसलिए ओवरफ्लो के बारे में चिंता करने की कोई आवश्यकता नहीं है। इसके अलावा, Python का अंतर्निहित फ़ंक्शन &lt;code>pow(a, b, m)&lt;/code> आंतरिक रूप से निरंतर वर्ग विधि का उपयोग करता है, इसलिए यह बहुत तेज़ है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">random&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">fermat_is_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">iterations&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> फर्मेट के अभाज्य परीक्षण का उपयोग करके प्रायिकतात्मक अभाज्य परीक्षण
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">_&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iterations&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 2 से p-2 के बीच एक यादृच्छिक संख्या a चुनें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">randint&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># a^(p-1) mod p की गणना करें। अंतर्निहित pow बहुत तेज़ है।&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span> &lt;span class="c1"># निश्चित भाज्य&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span> &lt;span class="c1"># संभवतः अभाज्य&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># परीक्षण&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">number_to_test&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">104729&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="n">fermat_is_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">number_to_test&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">number_to_test&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> संभवतः अभाज्य है।&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">number_to_test&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> एक भाज्य संख्या है।&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="7-rsa-करपटगरफ-म-अनपरयग-जह-फरमट-और-यलर-फलभत-हत-ह">7. RSA क्रिप्टोग्राफी में अनुप्रयोग: जहाँ फर्मेट और यूलर फलीभूत होते हैं
&lt;/h2>&lt;p>फर्मेट के छोटे प्रमेय (और यूलर के प्रमेय) का सबसे बड़ा अनुप्रयोग 1977 में रिवेस्ट, शमीर और एडलमैन द्वारा विकसित &lt;strong>RSA क्रिप्टोग्राफी&lt;/strong> है।
RSA क्रिप्टोग्राफी एक क्रांतिकारी प्रणाली है जिसे &amp;lsquo;पब्लिक-की क्रिप्टोग्राफी&amp;rsquo; (public-key cryptography) कहा जाता है। यह एक ऐसा तंत्र प्रदान करता है जहाँ एन्क्रिप्ट करने के लिए कुंजी (पब्लिक की/सार्वजनिक कुंजी) दुनिया के सामने सार्वजनिक की जा सकती है, जबकि डिक्रिप्ट करने वाली कुंजी (प्राइवेट की/निजी कुंजी) केवल प्राप्तकर्ता को ही पता होती है।&lt;/p>
&lt;p>यह विषमता (asymmetry) इस कम्प्यूटेशनल सुरक्षा पर आधारित है कि &amp;ldquo;विशाल भाज्य संख्याओं का अभाज्य गुणनखंडन (prime factorization) अत्यंत कठिन है&amp;rdquo;।&lt;/p>
&lt;h3 id="71-rsa-करपटगरफ-ततर-कज-नरमण-एनकरपशन-डकरपशन">7.1 RSA क्रिप्टोग्राफी तंत्र (कुंजी निर्माण, एन्क्रिप्शन, डिक्रिप्शन)
&lt;/h3>&lt;p>आइए मर्मेड (Mermaid) अनुक्रम आरेख (sequence diagram) के माध्यम से RSA क्रिप्टोग्राफी के समग्र संचार प्रवाह की जांच करें।&lt;/p>
&lt;div class="mermaid">sequenceDiagram
participant Alice["ऐलिस (प्राप्तकर्ता)"]
participant Bob["बॉब (प्रेषक)"]
Alice->>Alice: "विशाल अभाज्य संख्याएँ p, q जनरेट करें"
Alice->>Alice: "N = p * q, φ(N) = (p-1)(q-1) की गणना करें"
Alice->>Alice: "पब्लिक की e और प्राइवेट की d की गणना करें (e*d ≡ 1 mod φ(N))"
Alice->>Bob: "पब्लिक की (N, e) भेजें"
Note over Bob: "सादा पाठ (Plaintext) M तैयार करें (M &lt; N)"
Bob->>Bob: "सिफरटेक्स्ट (Ciphertext) C = M^e mod N की गणना करें"
Bob->>Alice: "सिफरटेक्स्ट C भेजें"
Alice->>Alice: "सादा पाठ M = C^d mod N की गणना करके डिक्रिप्ट करें"&lt;/div>
&lt;p>नीचे गणितीय चरणों का विस्तृत विवरण दिया गया है।&lt;/p>
&lt;h4 id="चरण-1-कज-नरमण-परपतकरत-ऐलस-क-करय">चरण 1: कुंजी निर्माण (प्राप्तकर्ता ऐलिस का कार्य)
&lt;/h4>&lt;ol>
&lt;li>दो विशाल अभाज्य संख्याएँ $p$ और $q$ यादृच्छिक रूप से जनरेट करें (यहाँ पहले उल्लिखित अभाज्य परीक्षण विधि का उपयोग किया जाता है)।&lt;/li>
&lt;li>उनके गुणनफल $N = p \times q$ की गणना करें। यह $N$ सार्वजनिक किया जाता है।&lt;/li>
&lt;li>यूलर के टोटिएंट फलन का उपयोग करते हुए, $\phi(N) = (p-1)(q-1)$ की गणना करें।&lt;/li>
&lt;li>$\phi(N)$ के साथ सह-अभाज्य एक पूर्णांक $e$ (सार्वजनिक घातांक/public exponent) चुनें (अक्सर $e = 65537$ का उपयोग किया जाता है)।&lt;/li>
&lt;li>$e$ के मॉड्यूलर व्युत्क्रम (modular inverse) $d$ (निजी घातांक/private exponent) की गणना करें। अर्थात, ऐसा $d$ खोजें जो निम्नलिखित को संतुष्ट करे:
$$ e \cdot d \equiv 1 \pmod{\phi(N)} $$
इस गणना के लिए &lt;strong>विस्तारित यूक्लिडियन एल्गोरिदम (Extended Euclidean Algorithm)&lt;/strong> का उपयोग किया जाता है।&lt;/li>
&lt;/ol>
&lt;p>इसके साथ, &lt;strong>पब्लिक की (सार्वजनिक कुंजी) $(N, e)$&lt;/strong> और &lt;strong>प्राइवेट की (निजी कुंजी) $(N, d)$&lt;/strong> हो जाती है। ($p, q,$ और $\phi(N)$ को तुरंत नष्ट कर दिया जाना चाहिए या सख्ती से छिपाकर रखा जाना चाहिए)।&lt;/p>
&lt;h4 id="चरण-2-एनकरपशन-परषक-बब-क-करय">चरण 2: एन्क्रिप्शन (प्रेषक बॉब का कार्य)
&lt;/h4>&lt;p>मान लें कि बॉब ऐलिस को एक संदेश $M$ भेजना चाहता है ($M$ वर्णों (characters) का एक संख्यात्मक प्रतिनिधित्व है, जहाँ $0 \le M &lt; N$ है)।
बॉब ऐलिस की पब्लिक की $(N, e)$ का उपयोग करता है और सिफरटेक्स्ट (Ciphertext) $C$ बनाने के लिए निम्नलिखित गणना करता है:&lt;/p>
$$
C \equiv M^e \pmod N
$$
&lt;p>वह इस $C$ को नेटवर्क के माध्यम से ऐलिस को भेजता है।&lt;/p>
&lt;h4 id="चरण-3-डकरपशन-परपतकरत-ऐलस-क-करय">चरण 3: डिक्रिप्शन (प्राप्तकर्ता ऐलिस का कार्य)
&lt;/h4>&lt;p>सिफरटेक्स्ट $C$ प्राप्त करने के बाद, ऐलिस अपनी गुप्त प्राइवेट की $d$ का उपयोग करके निम्नलिखित गणना करती है:&lt;/p>
$$
M' \equiv C^d \pmod N
$$
&lt;p>आश्चर्यजनक रूप से, यह गणना परिणाम $M'$ मूल संदेश $M$ से पूरी तरह मेल खाता है।&lt;/p>
&lt;h3 id="72-इस-डकरपट-कय-कय-ज-सकत-ह-गणतय-परमण">7.2 इसे डिक्रिप्ट क्यों किया जा सकता है? (गणितीय प्रमाण)
&lt;/h3>&lt;p>यहीं पर फर्मेट का छोटा प्रमेय (यूलर का प्रमेय) अपनी वास्तविक शक्ति दिखाता है। $C^d \pmod N$, $M$ में वापस क्यों बदल जाता है?&lt;/p>
&lt;p>आइए डिक्रिप्शन समीकरण का विस्तार करें:
चूंकि $C \equiv M^e \pmod N$ है,
&lt;/p>
$$ C^d \equiv (M^e)^d \equiv M^{ed} \pmod N $$
&lt;p>कुंजी निर्माण चरण में, हमने $d$ को इस प्रकार चुना था कि $e \cdot d \equiv 1 \pmod{\phi(N)}$ हो। इसका मतलब है कि एक ऐसा पूर्णांक $k$ मौजूद है जिसे इस प्रकार लिखा जा सकता है:
&lt;/p>
$$ e \cdot d = 1 + k \cdot \phi(N) $$
&lt;p>इसे उपरोक्त समीकरण में प्रतिस्थापित (substitute) करने पर:
&lt;/p>
$$ M^{ed} = M^{1 + k \cdot \phi(N)} = M \cdot M^{k \cdot \phi(N)} = M \cdot (M^{\phi(N)})^k \pmod N $$
&lt;p>यहीं पर &lt;strong>यूलर का प्रमेय&lt;/strong> ($M^{\phi(N)} \equiv 1 \pmod N$) लागू होता है। (※कड़ाई से कहें तो, $M$ और $N$ का सह-अभाज्य होना आवश्यक है, लेकिन RSA में, $M$ और $N$ के सह-अभाज्य न होने की संभावना खगोलीय रूप से कम है, और यह सिद्ध किया जा सकता है कि चाइनीज़ रिमाइंडर थ्योरम (Chinese Remainder Theorem) का उपयोग करके यह सह-अभाज्य न होने पर भी काम करता है)।&lt;/p>
&lt;p>यूलर के प्रमेय को लागू करने पर, चूंकि $M^{\phi(N)} \equiv 1$ है:
&lt;/p>
$$ M \cdot (1)^k \equiv M \pmod N $$
&lt;p>सफलतापूर्वक $M$ को बहाल कर लिया गया है! संख्याओं के वे गुण, जिन्हें फर्मेट और यूलर ने सैकड़ों साल पहले खोजा था, आज आधुनिक डिजिटल संचार की गोपनीयता की पूरी तरह से गारंटी देते हैं।&lt;/p>
&lt;hr>
&lt;h2 id="8-rsa-करपटगरफ-क-टय-इमपलमटशन-python">8. RSA क्रिप्टोग्राफी का टॉय इम्प्लीमेंटेशन (Python)
&lt;/h2>&lt;p>केवल सिद्धांत के साथ इसे महसूस करना मुश्किल हो सकता है, तो चलिए Python का उपयोग करके वास्तविक RSA कुंजी जनरेशन, एन्क्रिप्शन और डिक्रिप्शन प्रक्रिया को लागू करते हैं। यह एक शैक्षिक &amp;ldquo;टॉय इम्प्लीमेंटेशन (toy implementation)&amp;rdquo; है, लेकिन इसमें प्रयुक्त गणित बिल्कुल वास्तविक के समान है।&lt;/p>
&lt;p>हम मॉड्यूलर व्युत्क्रम (modular inverse) $d$ खोजने के लिए &amp;ldquo;विस्तारित यूक्लिडियन एल्गोरिदम (Extended Euclidean Algorithm)&amp;rdquo; को भी कार्यान्वयन में शामिल करेंगे।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;span class="lnt">55
&lt;/span>&lt;span class="lnt">56
&lt;/span>&lt;span class="lnt">57
&lt;/span>&lt;span class="lnt">58
&lt;/span>&lt;span class="lnt">59
&lt;/span>&lt;span class="lnt">60
&lt;/span>&lt;span class="lnt">61
&lt;/span>&lt;span class="lnt">62
&lt;/span>&lt;span class="lnt">63
&lt;/span>&lt;span class="lnt">64
&lt;/span>&lt;span class="lnt">65
&lt;/span>&lt;span class="lnt">66
&lt;/span>&lt;span class="lnt">67
&lt;/span>&lt;span class="lnt">68
&lt;/span>&lt;span class="lnt">69
&lt;/span>&lt;span class="lnt">70
&lt;/span>&lt;span class="lnt">71
&lt;/span>&lt;span class="lnt">72
&lt;/span>&lt;span class="lnt">73
&lt;/span>&lt;span class="lnt">74
&lt;/span>&lt;span class="lnt">75
&lt;/span>&lt;span class="lnt">76
&lt;/span>&lt;span class="lnt">77
&lt;/span>&lt;span class="lnt">78
&lt;/span>&lt;span class="lnt">79
&lt;/span>&lt;span class="lnt">80
&lt;/span>&lt;span class="lnt">81
&lt;/span>&lt;span class="lnt">82
&lt;/span>&lt;span class="lnt">83
&lt;/span>&lt;span class="lnt">84
&lt;/span>&lt;span class="lnt">85
&lt;/span>&lt;span class="lnt">86
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">random&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># महत्तम समापवर्तक (GCD) खोजें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">a&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># विस्तारित यूक्लिडियन एल्गोरिदम (ax + by = gcd(a,b) के x, y खोजें)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># e*d ≡ 1 (mod φ(N)) के लिए d खोजने के लिए उपयोग किया जाता है&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">extended_gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">g&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">extended_gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">g&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">mod_inverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">g&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">extended_gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">g&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">raise&lt;/span> &lt;span class="ne">Exception&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;व्युत्क्रम मौजूद नहीं है&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">phi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># अभाज्य जनरेशन फ़ंक्शन (सरलीकृत संस्करण: छोटी अभाज्य संख्याएँ जनरेट करें)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">generate_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bits&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="kc">True&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">p&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getrandbits&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bits&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># पहले बताए गए फर्मेट टेस्ट के बजाय सरल परीक्षण&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">p&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># RSA कुंजी जनरेशन&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">generate_keypair&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bits&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">16&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">p&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">generate_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bits&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">q&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">generate_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bits&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># सुनिश्चित करें कि p और q समान न हों&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">q&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">q&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">generate_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bits&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">q&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">phi&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">q&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># e के लिए अक्सर 65537 जैसी अभाज्य संख्या का उपयोग किया जाता है, लेकिन यहाँ इसे यादृच्छिक रूप से चुना गया है&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">e&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">randrange&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">g&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">g&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">e&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">randrange&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">g&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># प्राइवेट की d की गणना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod_inverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># पब्लिक की (e, n), प्राइवेट की (d, n)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">((&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pk&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">plaintext&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pk&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># plaintext^e mod n की गणना करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cipher&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">ord&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">char&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">char&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">plaintext&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">cipher&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">decrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sk&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ciphertext&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">sk&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># cipher^d mod n की गणना करें, और वापस वर्णों में बदलें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">plain&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="nb">chr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">char&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">char&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">ciphertext&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># निष्पादन उदाहरण&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s1">&amp;#39;__main__&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;--- RSA क्रिप्टोग्राफी टॉय इम्प्लीमेंटेशन ---&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">public_key&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">private_key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">generate_keypair&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bits&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">12&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 12-बिट अभाज्य संख्याओं का उपयोग&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;पब्लिक की (e, n): &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">public_key&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;प्राइवेट की (d, n): &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">private_key&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">message&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;Hello Math!&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">मूल संदेश: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">message&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># एन्क्रिप्शन&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">encrypted_msg&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">public_key&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">message&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;सिफरटेक्स्ट: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">encrypted_msg&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># डिक्रिप्शन&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">decrypted_msg&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">decrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">private_key&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">encrypted_msg&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;डिक्रिप्ट किया गया संदेश: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">decrypted_msg&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>जब आप यह कोड चलाते हैं, तो आप देख सकते हैं कि वर्णों की एक सरणी अज्ञात संख्याओं की एक सरणी (सिफरटेक्स्ट) में परिवर्तित हो जाती है, जिसे बाद में प्राइवेट की का उपयोग करके सफलतापूर्वक मूल स्ट्रिंग में बहाल कर लिया जाता है।&lt;/p>
&lt;hr>
&lt;h2 id="9-नषकरष-गणत-क-सदरत-और-वयवहरकत-क-परतचछदन-intersection">9. निष्कर्ष: गणित की सुंदरता और व्यावहारिकता का प्रतिच्छेदन (Intersection)
&lt;/h2>&lt;p>17वीं शताब्दी में जब पियरे डी फर्मेट ने इस &amp;lsquo;छोटे प्रमेय&amp;rsquo; की खोज की थी, तब किसी ने नहीं सोचा था कि यह किसी काम आएगा। खुद फर्मेट ने शुद्ध गणितीय जिज्ञासा से संख्या सिद्धांत (number theory) पर शोध किया था।&lt;/p>
&lt;p>हालाँकि, लगभग 300 साल बाद 1970 के दशक में, कंप्यूटर नेटवर्क के शुरुआती दिनों में, सुरक्षित संचार प्रोटोकॉल स्थापित करने के लिए आवश्यक क्रिप्टोग्राफिक तकनीक के रूप में फर्मेट के प्रमेय का नाटकीय रूप से पुनरुत्थान हुआ। फर्मेट के छोटे प्रमेय पर आधारित अभाज्य परीक्षण तकनीक और यूलर के प्रमेय पर आधारित RSA क्रिप्टोग्राफी आज के इंटरनेट बुनियादी ढांचे को सचमुच में सहारा देती है।&lt;/p>
&lt;p>हमारे द्वारा प्रतिदिन भेजे जाने वाले LINE या WhatsApp संदेश, या Amazon पर हमारी खरीदारी, यह सब इसी सरल और सुंदर सूत्र $a^{p-1} \equiv 1 \pmod p$ के इर्द-गिर्द घूमती है। फर्मेट का छोटा प्रमेय हमें सिखाता है कि गणित चाहे कितना भी अमूर्त क्यों न हो, एक समय ऐसा ज़रूर आएगा जब यह मानवता के काम आएगा।&lt;/p>
&lt;p>प्रोग्रामिंग या क्रिप्टोग्राफिक सिद्धांत सीखते समय, इसके अंतर्निहित गणितीय ढांचे को समझना उन पुस्तकालयों (libraries) के व्यवहार को गहराई से समझने में एक बड़ा हथियार होगा जो ब्लैक बॉक्स के रूप में प्रदान किए जाते हैं, और यह अधिक सुरक्षित सिस्टम डिज़ाइन करने में मदद करेगा।&lt;/p></description></item><item><title>जाली-आधारित क्रिप्टोग्राफी (Lattice-based cryptography) का गणितीय अंतर्ज्ञान</title><link>http://kenji.blog/hi/p/lattice-based-cryptography-math-intuition/</link><pubDate>Fri, 11 Sep 2026 21:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/lattice-based-cryptography-math-intuition/</guid><description>&lt;img src="http://kenji.blog/p/lattice-based-cryptography-math-intuition/img/eyecatch.jpg" alt="Featured image of post जाली-आधारित क्रिप्टोग्राफी (Lattice-based cryptography) का गणितीय अंतर्ज्ञान" />&lt;h1 id="1-परचय-पसट-कवटम-करपटगरफ-pqc-क-शरआत-और-जल-आधरत-करपटगरफ-lattice-based-cryptography-क-उदय">1. परिचय: पोस्ट-क्वांटम क्रिप्टोग्राफी (PQC) की शुरुआत और जाली-आधारित क्रिप्टोग्राफी (Lattice-based cryptography) का उदय
&lt;/h1>&lt;p>आधुनिक समाज के डिजिटल बुनियादी ढांचे का आधार RSA और एलिप्टिक कर्व क्रिप्टोग्राफी (ECC) जैसी पब्लिक-की क्रिप्टोग्राफी (Public-key cryptography) तकनीकें हैं। इन क्रिप्टोग्राफी विधियों की सुरक्षा &amp;ldquo;प्राइम फैक्टराइजेशन प्रॉब्लम (Prime Factorization Problem)&amp;rdquo; और &amp;ldquo;डिस्क्रीट लॉगरिथम प्रॉब्लम (Discrete Logarithm Problem)&amp;rdquo; जैसी गणितीय कठिनाइयों पर निर्भर करती है, जिनके बारे में माना जाता है कि पारंपरिक क्लासिकल कंप्यूटरों द्वारा उन्हें कुशलतापूर्वक हल नहीं किया जा सकता है (इसमें एक्सपोनेंशियल समय लगता है)।&lt;/p>
&lt;p>हालाँकि, 1994 में पीटर शोर (Peter Shor) द्वारा प्रस्तुत &amp;ldquo;शोर का एल्गोरिदम (Shor&amp;rsquo;s Algorithm)&amp;rdquo; ने क्रिप्टोग्राफी की दुनिया में तहलका मचा दिया। इस एल्गोरिदम ने गणितीय रूप से यह साबित कर दिया कि जब बड़े पैमाने पर क्वांटम कंप्यूटर वास्तविकता बन जाएंगे, तो वे प्राइम फैक्टराइजेशन और डिस्क्रीट लॉगरिथम समस्याओं को पॉलीनोमियल समय (Polynomial time) में हल कर देंगे। इसका अर्थ है कि वर्तमान में व्यापक रूप से उपयोग की जाने वाली पब्लिक-की क्रिप्टोग्राफी भविष्य में पूरी तरह से डिक्रिप्ट (decrypt) की जा सकेगी।&lt;/p>
&lt;p>इस तरह के &amp;ldquo;क्वांटम खतरे (Quantum Threat)&amp;rdquo; का मुकाबला करने के लिए, नई क्रिप्टोग्राफिक विधियों पर शोध करना एक तत्काल आवश्यकता बन गई, जिन्हें क्वांटम कंप्यूटरों का उपयोग करके भी तोड़ना मुश्किल हो। इस क्षेत्र को &amp;ldquo;पोस्ट-क्वांटम क्रिप्टोग्राफी (Post-Quantum Cryptography: PQC)&amp;rdquo; या &amp;ldquo;क्वांटम-प्रतिरोधी क्रिप्टोग्राफी&amp;rdquo; कहा जाता है।&lt;/p>
&lt;p>PQC के लिए कई मजबूत उम्मीदवार मौजूद हैं। इनमें हैश-आधारित क्रिप्टोग्राफी, कोड-आधारित क्रिप्टोग्राफी, मल्टीवेरिएट पॉलीनोमियल क्रिप्टोग्राफी, और आइसोजेनी-आधारित क्रिप्टोग्राफी शामिल हैं। लेकिन इनमें से जिसने वर्तमान में सबसे अधिक ध्यान आकर्षित किया है और जो NIST (नेशनल इंस्टीट्यूट ऑफ स्टैंडर्ड्स एंड टेक्नोलॉजी, USA) की PQC मानकीकरण प्रक्रिया के केंद्र में है, वह &amp;ldquo;जाली-आधारित क्रिप्टोग्राफी (Lattice-based cryptography)&amp;rdquo; है। अन्य विधियों की तुलना में, जाली-आधारित क्रिप्टोग्राफी में एन्क्रिप्शन और डिक्रिप्शन की गति बहुत तेज है। इसके अलावा, इसकी एक उत्कृष्ट विशेषता यह है कि इसमें &amp;ldquo;सबसे खराब स्थिति की जटिलता (Worst-case complexity)&amp;rdquo; से &amp;ldquo;औसत स्थिति की जटिलता (Average-case complexity)&amp;rdquo; में कमी (reduction) का गुण है, जो क्रिप्टोग्राफिक सिद्धांत में सुरक्षा का एक अत्यंत शक्तिशाली प्रमाण प्रदान करता है।&lt;/p>
&lt;p>इस लेख में, हम जाली-आधारित क्रिप्टोग्राफी की नींव, &amp;ldquo;जाली (Lattice)&amp;rdquo; की गणितीय परिभाषा से शुरू करेंगे, और फिर जाली पर कठिन समस्याओं जैसे कि SVP (सबसे छोटा वेक्टर समस्या / Shortest Vector Problem) और CVP (सबसे करीबी वेक्टर समस्या / Closest Vector Problem) पर चर्चा करेंगे। अंत में, हम &amp;ldquo;LWE समस्या (Learning With Errors)&amp;rdquo; के बारे में विस्तार से जानेंगे, जिसे आधुनिक जाली-आधारित क्रिप्टोग्राफी का हृदय कहा जा सकता है। हम गणितीय सूत्रों, ज्यामितीय अंतर्ज्ञान और ठोस संख्यात्मक उदाहरणों के साथ इसका गहराई से विश्लेषण करेंगे।&lt;/p>
&lt;h1 id="2-जल-lattice-क-गणतय-परभष-और-जयमतय-अतरजञन">2. जाली (Lattice) की गणितीय परिभाषा और ज्यामितीय अंतर्ज्ञान
&lt;/h1>&lt;h2 id="21-वकटर-सपस-और-जल">2.1 वेक्टर स्पेस और जाली
&lt;/h2>&lt;p>गणित में, &amp;ldquo;जाली (Lattice)&amp;rdquo; $n$-आयामी वास्तविक वेक्टर स्पेस $\mathbb{R}^n$ के भीतर नियमित रूप से व्यवस्थित असतत (discrete) बिंदुओं का एक सेट है। यह लीनियर अलजेब्रा में सीखे गए वेक्टर स्पेस (Vector Space) के समान है, लेकिन इनमें एक महत्वपूर्ण अंतर है। जबकि एक वेक्टर स्पेस एक सतत (continuous) स्थान है जिसे बेसिस (आधार) वेक्टरों के &amp;ldquo;वास्तविक संख्या (real number) गुणांक&amp;rdquo; वाले रैखिक संयोजन (linear combination) द्वारा दर्शाया जाता है, एक जाली एक असतत स्थान है जिसे बेसिस वेक्टरों के &amp;ldquo;पूर्णांक (integer) गुणांक&amp;rdquo; वाले रैखिक संयोजन द्वारा दर्शाया जाता है।&lt;/p>
&lt;p>आइए एक सख्त गणितीय परिभाषा दें। $m$-आयामी वास्तविक वेक्टर स्पेस $\mathbb{R}^m$ में $n$ ($n \le m$) रैखिक रूप से स्वतंत्र (linearly independent) वेक्टरों $\mathbf{b}_1, \mathbf{b}_2, \dots, \mathbf{b}_n$ पर विचार करें। मान लें कि एक मैट्रिक्स $B = [\mathbf{b}_1, \mathbf{b}_2, \dots, \mathbf{b}_n] \in \mathbb{R}^{m \times n}$ है, जिसके कॉलम में ये वेक्टर हैं। इस $B$ को जाली का &amp;ldquo;बेसिस (Basis)&amp;rdquo; कहा जाता है।&lt;/p>
&lt;p>इस बेसिस $B$ द्वारा उत्पन्न जाली $\mathcal{L}(B)$ को इस प्रकार परिभाषित किया गया है:&lt;/p>
$$
\mathcal{L}(B) = \left\{ \sum_{i=1}^{n} x_i \mathbf{b}_i \mathrel{\bigg|} x_i \in \mathbb{Z} \right\} = \{ B \mathbf{x} \mid \mathbf{x} \in \mathbb{Z}^n \}
$$
&lt;p>यहाँ महत्वपूर्ण बात यह है कि गुणांक $x_i$ वास्तविक संख्याओं $\mathbb{R}$ तक सीमित नहीं हैं, बल्कि पूर्णांकों $\mathbb{Z}$ तक सीमित हैं। इसके परिणामस्वरूप, अंतरिक्ष में मौजूद अनगिनत सतत बिंदुओं के बजाय, समान दूरी पर स्थित चौराहों की तरह &amp;ldquo;असतत बिंदुओं का एक सेट&amp;rdquo; बनता है।&lt;/p>
&lt;h2 id="22-जयमतय-छव">2.2 ज्यामितीय छवि
&lt;/h2>&lt;p>आइए 2-आयामी तल $\mathbb{R}^2$ के एक उदाहरण पर विचार करें। यदि हम बेसिस वेक्टर के रूप में $\mathbf{b}_1 = \begin{pmatrix} 1 \\ 0 \end{pmatrix}$ और $\mathbf{b}_2 = \begin{pmatrix} 0 \\ 1 \end{pmatrix}$ चुनते हैं, तो उनके द्वारा उत्पन्न जाली, निर्देशांक तल पर सभी पूर्णांक निर्देशांकों $(x, y) \in \mathbb{Z}^2$ का सेट होगी। यह सबसे सरल &amp;ldquo;वर्गाकार जाली (square lattice)&amp;rdquo; है।&lt;/p>
&lt;p>हालाँकि, जालियाँ हमेशा ऑर्थोगोनल (समकोण पर) नहीं होती हैं। उदाहरण के लिए, यदि हम बेसिस $\mathbf{b}_1 = \begin{pmatrix} 2 \\ 1 \end{pmatrix}$ और $\mathbf{b}_2 = \begin{pmatrix} 1 \\ 3 \end{pmatrix}$ पर विचार करें, तो उत्पन्न बिंदु एक तिरछे (skewed) जाल के चौराहों की तरह दिखेंगे।&lt;/p>
&lt;h2 id="23-बसस-क-गर-अदवतयत-non-uniqueness-और-यनमडयलर-टरसफरमशन">2.3 बेसिस की गैर-अद्वितीयता (Non-uniqueness) और यूनिमॉड्युलर ट्रांसफॉर्मेशन
&lt;/h2>&lt;p>जाली-आधारित क्रिप्टोग्राफी की सुरक्षा के मूल में एक महत्वपूर्ण गुण निहित है: &amp;ldquo;एक ही जाली उत्पन्न करने वाले अनगिनत बेसिस मौजूद होते हैं।&amp;rdquo;&lt;/p>
&lt;p>उदाहरण के लिए, ऊपर बताई गई बेसिस $\mathbf{b}_1 = (1, 0)^T, \mathbf{b}_2 = (0, 1)^T$ द्वारा उत्पन्न $\mathbb{Z}^2$ जाली, बिल्कुल उसी $\mathbb{Z}^2$ जाली को उत्पन्न करती है जिसे बेसिस $\mathbf{b}'_1 = (1, 1)^T, \mathbf{b}'_2 = (2, 3)^T$ का उपयोग करके भी उत्पन्न किया जा सकता है।&lt;/p>
&lt;p>एक बेसिस $B$ और दूसरे बेसिस $B'$ द्वारा समान जाली उत्पन्न करने के लिए आवश्यक और पर्याप्त शर्त (necessary and sufficient condition) यह है कि एक पूर्णांक घटकों वाला मैट्रिक्स $U \in \mathbb{Z}^{n \times n}$ मौजूद हो, जिसका डिटरमिनेंट $\det(U) = \pm 1$ हो, और जिसे इस प्रकार व्यक्त किया जा सके:
&lt;/p>
$$ B' = B U $$
&lt;p>
इस प्रकार के मैट्रिक्स $U$ को &amp;ldquo;यूनिमॉड्युलर मैट्रिक्स (Unimodular matrix)&amp;rdquo; कहा जाता है।&lt;/p>
&lt;p>क्रिप्टोग्राफी में इसके अनुप्रयोग का मूल विचार एक &amp;ldquo;अच्छे बेसिस&amp;rdquo; (जो लगभग ऑर्थोगोनल हो और छोटे वेक्टरों से बना हो) को सीक्रेट की (गुप्त कुंजी) के रूप में उपयोग करना है, और एक &amp;ldquo;बुरे बेसिस&amp;rdquo; (जो अत्यधिक तिरछा हो और बहुत लंबे वेक्टरों से बना हो) को पब्लिक की (सार्वजनिक कुंजी) के रूप में उपयोग करना है। उच्च आयामों में एक बुरे बेसिस से एक अच्छे बेसिस की गणना करना बहुत मुश्किल हो जाता है। यही जाली-आधारित क्रिप्टोग्राफी का मूलभूत अंतर्ज्ञान है।&lt;/p>
&lt;h1 id="3-जल-म-गणन-सबध-कठन-समसयए">3. जाली में गणना संबंधी कठिन समस्याएं
&lt;/h1>&lt;p>जाली-आधारित क्रिप्टोग्राफी की सुरक्षा जाली पर कुछ गणितीय समस्याओं को हल करने की कठिनाई पर निर्भर करती है। यहाँ हम दो सबसे बुनियादी और प्रसिद्ध समस्याओं का परिचय देंगे।&lt;/p>
&lt;h2 id="31-सबस-छट-वकटर-समसय-shortest-vector-problem-svp">3.1 सबसे छोटा वेक्टर समस्या (Shortest Vector Problem: SVP)
&lt;/h2>&lt;p>SVP जाली सिद्धांत में सबसे शास्त्रीय और प्रसिद्ध समस्या है।&lt;/p>
&lt;p>&lt;strong>परिभाषा (SVP):&lt;/strong>
मान लें कि कोई भी जाली बेसिस $B$ दिया गया है, तो उस जाली $\mathcal{L}(B)$ से संबंधित सभी गैर-शून्य वेक्टरों में से, उस वेक्टर $\mathbf{v}$ का पता लगाएं जिसका यूक्लिडियन नॉर्म (लंबाई) सबसे कम हो।&lt;/p>
&lt;p>सूत्र रूप में, यह वह $\mathbf{v}$ खोजने की समस्या है जो $\min_{\mathbf{v} \in \mathcal{L}(B) \setminus \{\mathbf{0}\}} \| \mathbf{v} \|$ को संतुष्ट करता हो। इस न्यूनतम लंबाई को $\lambda_1(\mathcal{L})$ के रूप में लिखा जाता है और इसे &amp;ldquo;जाली का पहला क्रमिक न्यूनतम मान (First successive minimum)&amp;rdquo; कहा जाता है।&lt;/p>
&lt;p>2D या 3D जैसे निचले आयामों में, आप एक चित्र बनाकर सबसे छोटे वेक्टर को अपनी आँखों से देख सकते हैं। या आप इसे गॉस (Gauss) के जाली रिडक्शन एल्गोरिदम का उपयोग करके कुशलतापूर्वक हल कर सकते हैं। हालाँकि, जब आयाम $n$ सैकड़ों से हजारों जैसे उच्च आयामों तक पहुँचता है, तो SVP को सटीक रूप से हल करना NP-हार्ड माना जाता है।&lt;/p>
&lt;p>वास्तविक क्रिप्टोग्राफी में, सटीक सबसे छोटे वेक्टर के बजाय, &amp;ldquo;लगभग सबसे छोटे वेक्टर&amp;rdquo; को खोजने वाली समस्या, एप्रोक्सिमेट SVP ($\gamma$-SVP) का उपयोग किया जाता है। यदि एप्रोक्सिमेशन फैक्टर (सन्निकटन कारक) $\gamma$ पॉलीनोमियल आकार का है, तो इस समस्या को अभी भी बहुत कठिन माना जाता है।&lt;/p>
&lt;h2 id="32-सबस-करब-वकटर-समसय-closest-vector-problem-cvp">3.2 सबसे करीबी वेक्टर समस्या (Closest Vector Problem: CVP)
&lt;/h2>&lt;p>CVP भी जाली-आधारित क्रिप्टोग्राफी में एक अत्यंत महत्वपूर्ण समस्या है।&lt;/p>
&lt;p>&lt;strong>परिभाषा (CVP):&lt;/strong>
मान लें कि कोई भी जाली बेसिस $B$ और अंतरिक्ष में कोई लक्ष्य वेक्टर $\mathbf{t} \in \mathbb{R}^m$ (जो जरूरी नहीं कि जाली बिंदु हो) दिया गया है, तो जाली के बिंदुओं में से वह जाली बिंदु $\mathbf{v} \in \mathcal{L}(B)$ खोजें जो $\mathbf{t}$ के सबसे करीब हो।&lt;/p>
&lt;p>सूत्र रूप में, यह वह जाली बिंदु $\mathbf{v}$ खोजने की समस्या है जो $\min_{\mathbf{v} \in \mathcal{L}(B)} \| \mathbf{v} - \mathbf{t} \|$ को संतुष्ट करता हो।&lt;/p>
&lt;p>SVP की तरह, उच्च आयामों में CVP भी NP-हार्ड है। क्रिप्टोग्राफिक अनुप्रयोगों के दृष्टिकोण से, LWE समस्या (जिसकी चर्चा बाद में की जाएगी) CVP के एक विशेष संस्करण (Bounded Distance Decoding: BDD) से निकटता से संबंधित है।&lt;/p>
&lt;h2 id="33-उचच-आयम-म-इनह-हल-करन-असभव-कय-ह-lll-और-bkz-क-समए">3.3 उच्च आयामों में इन्हें हल करना असंभव क्यों है? (LLL और BKZ की सीमाएँ)
&lt;/h2>&lt;p>उच्च-आयामी जाली समस्याओं को हल करने के लिए एक प्रसिद्ध एल्गोरिदम LLL एल्गोरिदम (Lenstra-Lenstra-Lovász algorithm) है। LLL एल्गोरिदम पॉलीनोमियल समय में काम करता है और जाली बेसिस को कुछ हद तक &amp;ldquo;अच्छे बेसिस&amp;rdquo; में घटा (रिड्यूस) सकता है। हालाँकि, LLL एल्गोरिदम द्वारा खोजा जाने वाला सबसे छोटा वेक्टर, वास्तविक सबसे छोटे वेक्टर की लंबाई के सापेक्ष एक एक्सपोनेंशियल ($2^{\mathcal{O}(n)}$) एप्रोक्सिमेशन फैक्टर (सन्निकटन कारक) रखता है, इसलिए यह क्रिप्टोग्राफी की सुरक्षा को तोड़ने के लिए पर्याप्त नहीं है।&lt;/p>
&lt;p>यदि LLL का उन्नत संस्करण BKZ (Block Korkine-Zolotarev) एल्गोरिदम जैसे अधिक शक्तिशाली बेसिस रिडक्शन एल्गोरिदम का उपयोग किया जाए, तो छोटे वेक्टर पाए जा सकते हैं, लेकिन इसकी कम्प्यूटेशनल जटिलता (computational complexity) ब्लॉक आकार के संबंध में एक्सपोनेंशियल रूप से बढ़ जाती है। जाली-आधारित क्रिप्टोग्राफी में, सुरक्षित पैरामीटर (जैसे आयाम $n$ का आकार) इस BKZ एल्गोरिदम के निष्पादन समय का अनुमान लगाकर निर्धारित किए जाते हैं। वर्तमान PQC मानक मापदंडों में, आयाम $n$ को 500 से 1000 या उससे अधिक के मानों के लिए चुना जाता है, और यह माना जाता है कि भविष्य के सुपर कंप्यूटरों या क्वांटम कंप्यूटरों का उपयोग करके भी इसे डिक्रिप्ट करने में ब्रह्मांड की आयु से अधिक समय लगेगा।&lt;/p>
&lt;h1 id="4-lwe-समसय-learning-with-errors-क-गणतय-नरपण">4. LWE समस्या (Learning With Errors) का गणितीय निरूपण
&lt;/h1>&lt;p>आधुनिक जाली-आधारित क्रिप्टोग्राफी का अधिकांश हिस्सा &amp;ldquo;LWE समस्या (Learning With Errors)&amp;rdquo; पर आधारित है, जिसे 2005 में ओडेड रेगेव (Oded Regev) द्वारा प्रस्तावित किया गया था। LWE समस्या की सुंदरता इसके निर्माण की सरलता और इसके शक्तिशाली गणितीय प्रमाण में निहित है, जिसे &amp;ldquo;सबसे खराब स्थिति की जटिलता से औसत स्थिति की जटिलता में कमी&amp;rdquo; कहा जाता है।&lt;/p>
&lt;h2 id="41-बन-शर-क-रखय-समकरण-क-परणल">4.1 बिना शोर के रेखीय समीकरणों की प्रणाली
&lt;/h2>&lt;p>LWE समस्या को समझने के लिए, आइए पहले बिना शोर वाले रेखीय समीकरणों की एक सरल प्रणाली पर विचार करें।
मान लें कि हमारे पास एक अज्ञात गुप्त वेक्टर $\mathbf{s} \in \mathbb{Z}_q^n$ (प्रत्येक घटक $0$ से $q-1$ तक का एक पूर्णांक है) है। यहाँ, मान लें कि $q$ एक अभाज्य संख्या है।&lt;/p>
&lt;p>हम यादृच्छिक (random) गुणांक वेक्टर $\mathbf{a}_1, \mathbf{a}_2, \dots \in \mathbb{Z}_q^n$ चुनते हैं, और गुप्त वेक्टर $\mathbf{s}$ के साथ इसके डॉट प्रोडक्ट की गणना मॉड्युलो $q$ पर करते हैं।
$b_1 = \langle \mathbf{a}_1, \mathbf{s} \rangle \pmod q$
$b_2 = \langle \mathbf{a}_2, \mathbf{s} \rangle \pmod q$
$\vdots$&lt;/p>
&lt;p>यदि हमें पर्याप्त संख्या में (कम से कम $n$) $(\mathbf{a}_i, b_i)$ के जोड़े दिए जाते हैं, तो हम लीनियर अलजेब्रा में &amp;ldquo;गौसियन एलिमिनेशन (Gaussian elimination)&amp;rdquo; का उपयोग करके गुप्त वेक्टर $\mathbf{s}$ को आसानी से पुनर्प्राप्त कर सकते हैं। यह एक ऐसी समस्या है जिसे पॉलीनोमियल समय में आसानी से हल किया जा सकता है।&lt;/p>
&lt;h2 id="42-lwe-समसय-क-परभष-शर-जडन">4.2 LWE समस्या की परिभाषा: शोर जोड़ना
&lt;/h2>&lt;p>तो, यदि हम इस समस्या में थोड़ा सा &amp;ldquo;शोर (त्रुटि / error)&amp;rdquo; जोड़ दें तो क्या होगा?
यही LWE समस्या का सार है।&lt;/p>
&lt;p>अज्ञात गुप्त वेक्टर $\mathbf{s} \in \mathbb{Z}_q^n$ के लिए, हम प्रत्येक समीकरण के परिणाम में एक छोटी सी त्रुटि $e_i \in \mathbb{Z}_q$ जोड़ते हैं।
$b_i = \langle \mathbf{a}_i, \mathbf{s} \rangle + e_i \pmod q$&lt;/p>
&lt;p>यहाँ, $e_i$ एक छोटा पूर्णांक मान है जिसका औसत 0 है और जिसका मानक विचलन (standard deviation) अपेक्षाकृत छोटा है (उदाहरण के लिए, सामान्य वितरण की तरह एक डिस्क्रीट गॉसियन वितरण (discrete Gaussian distribution) से चुना गया)।
प्रदान की गई जानकारी यादृच्छिक वेक्टर $\mathbf{a}_i$ और त्रुटि जोड़ने के बाद गणना किए गए $b_i$ के जोड़े की एक सूची है।
$( \mathbf{a}_1, b_1 ), ( \mathbf{a}_2, b_2 ), \dots, ( \mathbf{a}_m, b_m )$&lt;/p>
&lt;p>इसे मैट्रिक्स का उपयोग करके बहुत स्पष्ट रूप से दर्शाया जा सकता है।
यादृच्छिक मैट्रिक्स $A \in \mathbb{Z}_q^{m \times n}$, गुप्त वेक्टर $\mathbf{s} \in \mathbb{Z}_q^n$, और त्रुटि वेक्टर $\mathbf{e} \in \mathbb{Z}_q^m$ का उपयोग करके, हम इसे इस प्रकार लिख सकते हैं:
&lt;/p>
$$ \mathbf{b} = A \mathbf{s} + \mathbf{e} \pmod q $$
&lt;p>
हमें केवल $A$ और $\mathbf{b}$ दिए जाते हैं। यहाँ से $\mathbf{s}$ ज्ञात करना &amp;ldquo;सर्च LWE समस्या (Search LWE problem)&amp;rdquo; कहलाता है।&lt;/p>
&lt;p>चूंकि इसमें त्रुटि $e_i$ शामिल है, इसलिए यदि हम गौसियन एलिमिनेशन का उपयोग करने का प्रयास करते हैं, तो समीकरणों को जोड़ने और घटाने की प्रक्रिया में त्रुटि एक्सपोनेंशियल रूप से बढ़ जाती है, जिससे सही उत्तर तक पहुँचना असंभव हो जाता है। पहली नज़र में, यह रेखीय समीकरणों की एक सरल प्रणाली की तरह लगता है, लेकिन इस छोटे से शोर के जुड़ने से ही समस्या की कठिनाई NP-हार्ड स्तर तक पहुँच जाती है।&lt;/p>
&lt;h2 id="43-डसजन-lwe-समसय-decision-lwe">4.3 डिसीजन LWE समस्या (Decision LWE)
&lt;/h2>&lt;p>क्रिप्टोग्राफिक सिद्धांत के प्रमाणों में अक्सर जिसका उपयोग किया जाता है, वह सर्च LWE समस्या का एक संस्करण है, जिसे &amp;ldquo;डिसीजन LWE समस्या (Decision LWE problem)&amp;rdquo; कहा जाता है।&lt;/p>
&lt;p>डिसीजन LWE समस्या यह निर्धारित करने की समस्या है कि नीचे दिए गए दो वितरणों (distributions) में से प्राप्त नमूनों की सूची किस वितरण से आई है:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>LWE वितरण&lt;/strong>: जानबूझकर गणना की गई $(A, \mathbf{b} = A\mathbf{s} + \mathbf{e} \pmod q)$&lt;/li>
&lt;li>&lt;strong>यूनिफ़ॉर्म रैंडम वितरण&lt;/strong>: पूरी तरह से यादृच्छिक रूप से चुने गए मैट्रिक्स $A$ और वेक्टर $\mathbf{u}$ से मिलकर बना $(A, \mathbf{u})$&lt;/li>
&lt;/ol>
&lt;p>आश्चर्यजनक रूप से, यदि LWE समस्या के मापदंडों को ठीक से चुना जाता है, तो LWE वितरण से प्राप्त जोड़े पूरी तरह से यादृच्छिक डेटा के जोड़े से &amp;ldquo;कम्प्यूटेशनल रूप से अप्रभेद्य (Computationally Indistinguishable)&amp;rdquo; हो जाते हैं। यही गुण LWE-आधारित क्रिप्टोग्राफी का आधार है, जो ऐसे &amp;ldquo;सिफरटेक्स्ट (ciphertext) उत्पन्न करता है जिन्हें यादृच्छिक संख्याओं (random numbers) से अलग नहीं किया जा सकता है।&amp;rdquo;&lt;/p>
&lt;h2 id="44-सबस-खरब-सथत-स-औसत-सथत-क-जटलत-म-कम-regevs-theorem">4.4 सबसे खराब स्थिति से औसत स्थिति की जटिलता में कमी (Regev&amp;rsquo;s Theorem)
&lt;/h2>&lt;p>ओडेड रेगेव (Oded Regev) की सबसे बड़ी उपलब्धि इस LWE समस्या की कठिनाई को ऊपर बताई गई जाली समस्याओं (SVP और CVP) की कठिनाई से गणितीय रूप से जोड़ना था।&lt;/p>
&lt;p>क्वांटम रिडक्शन (Quantum reduction) का उपयोग करते हुए, उन्होंने साबित किया कि &amp;ldquo;यदि कोई पॉलीनोमियल-टाइम एल्गोरिदम मौजूद है जो औसत रूप से LWE समस्या को हल कर सकता है (यादृच्छिक रूप से चुने गए $A$ और $\mathbf{e}$ के लिए), तो एक पॉलीनोमियल-टाइम क्वांटम एल्गोरिदम भी मौजूद होगा जो किसी भी जाली के सबसे खराब स्थिति (सबसे कठिन मामले) में Gap-SVP को हल कर सकता है।&amp;rdquo; (बाद में, Peikert और अन्य लोगों द्वारा क्लासिकल रिडक्शन भी दिखाया गया है)।&lt;/p>
&lt;p>यह क्रिप्टोग्राफिक सिद्धांत में एक सपने जैसी विशेषता है। ऐसा इसलिए है क्योंकि यह इस चिंता को दूर करता है कि &amp;ldquo;हो सकता है कि क्रिप्टोग्राफी टूट गई हो क्योंकि हमने संयोग से एक कमजोर कुंजी (औसत मामलों में से एक) चुन ली हो,&amp;rdquo; और यह एक शक्तिशाली गारंटी प्रदान करता है कि &amp;ldquo;यदि औसत LWE को हल किया जा सकता है, तो जाली की सभी कठिन समस्याओं को हल किया जा सकता है (इसलिए LWE निश्चित रूप से कठिन है)।&amp;rdquo;&lt;/p>
&lt;div class="mermaid">graph TD
A["सबसे खराब स्थिति वाली जाली समस्याएं (Gap-SVP, SIVP)"] -->|Quantum/Classical Reduction| B["औसत स्थिति वाली LWE समस्या"]
B -->|Cryptographic Construction| C["LWE-आधारित क्रिप्टोसिस्टम (PKE, KEM, FHE)"]
style A fill:#ffcccc,stroke:#ff0000,stroke-width:2px,color:#000
style B fill:#ccffcc,stroke:#00aa00,stroke-width:2px,color:#000
style C fill:#ccccff,stroke:#0000ff,stroke-width:2px,color:#000&lt;/div>
&lt;h1 id="5-lwe-क-उपयग-करक-पबलक-क-करपटगरफ-रगव-करपटगरफ---regev-cryptosystem-क-नरमण">5. LWE का उपयोग करके पब्लिक-की क्रिप्टोग्राफी (रेगेव क्रिप्टोग्राफी - Regev Cryptosystem) का निर्माण
&lt;/h1>&lt;p>अब जब हम LWE समस्या की कठिनाई को समझ चुके हैं, तो आइए ओडेड रेगेव द्वारा प्रस्तावित बुनियादी पब्लिक-की क्रिप्टोग्राफी प्रणाली (Public-key cryptosystem) को देखें कि यह एन्क्रिप्शन और डिक्रिप्शन करने के लिए इसका उपयोग कैसे करती है। यहाँ हम 1-बिट संदेश $M \in \{0, 1\}$ को एन्क्रिप्ट करने के सबसे बुनियादी तंत्र की व्याख्या करेंगे।&lt;/p>
&lt;h2 id="51-कज-नरमण-key-generation">5.1 कुंजी निर्माण (Key Generation)
&lt;/h2>&lt;ol>
&lt;li>सिस्टम पैरामीटर के रूप में, एक अभाज्य संख्या $q$ (मॉड्यूलस), एक आयाम $n$, और समीकरणों की संख्या $m$ ($m > n \log q$) निर्धारित करें।&lt;/li>
&lt;li>गुप्त कुंजी (Secret Key) के रूप में एक वेक्टर $\mathbf{s} \in \mathbb{Z}_q^n$ को यादृच्छिक रूप से चुनें।&lt;/li>
&lt;li>एक यादृच्छिक मैट्रिक्स $A \in \mathbb{Z}_q^{m \times n}$ उत्पन्न करें।&lt;/li>
&lt;li>एक छोटा त्रुटि वेक्टर $\mathbf{e} \in \mathbb{Z}_q^m$ एक त्रुटि वितरण जैसे कि डिस्क्रीट गॉसियन वितरण से चुनें।&lt;/li>
&lt;li>वेक्टर $\mathbf{b} = A \mathbf{s} + \mathbf{e} \pmod q$ की गणना करें।&lt;/li>
&lt;li>पब्लिक की (Public Key) $(A, \mathbf{b})$ होगी।&lt;/li>
&lt;li>सीक्रेट की (Secret Key) $\mathbf{s}$ होगी।&lt;/li>
&lt;/ol>
&lt;p>पब्लिक की वस्तुतः &amp;ldquo;LWE समस्या का एक इंस्टेंस (instance)&amp;rdquo; है। चूँकि पब्लिक की $(A, \mathbf{b})$ से सीक्रेट की $\mathbf{s}$ ज्ञात करना सर्च LWE समस्या को हल करने के बराबर है, इसलिए सुरक्षा की गारंटी है।&lt;/p>
&lt;h2 id="52-एनकरपशन-encryption">5.2 एन्क्रिप्शन (Encryption)
&lt;/h2>&lt;p>ऐलिस, बॉब की पब्लिक की $(A, \mathbf{b})$ का उपयोग करके 1-बिट संदेश $M \in \{0, 1\}$ को एन्क्रिप्ट करती है।&lt;/p>
&lt;ol>
&lt;li>एक यादृच्छिक बाइनरी वेक्टर (जिसके घटक 0 या 1 हैं) $\mathbf{r} \in \{0, 1\}^m$ चुनें।&lt;/li>
&lt;li>सिफरटेक्स्ट (ciphertext) के पहले भाग के रूप में, वेक्टर $\mathbf{u} = A^T \mathbf{r} \pmod q$ की गणना करें। ($A^T$, $A$ का ट्रांसपोज़ मैट्रिक्स (transpose matrix) है। अर्थात्, हम $A$ की उन पंक्तियों को जोड़ रहे हैं जहाँ $\mathbf{r}$ का घटक 1 है)।&lt;/li>
&lt;li>सिफरटेक्स्ट के दूसरे भाग के रूप में, स्केलर $v = \mathbf{b}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor \pmod q$ की गणना करें।
(यदि संदेश $M$ 0 है तो कुछ भी नहीं जोड़ा जाता है, और यदि $1$ है तो हम $q$ का ठीक आधा मान $\lfloor \frac{q}{2} \rfloor$ जोड़ते हैं)।&lt;/li>
&lt;li>सिफरटेक्स्ट (Ciphertext) $(\mathbf{u}, v)$ होगा।&lt;/li>
&lt;/ol>
&lt;p>एन्क्रिप्शन का सहज अर्थ पब्लिक की के मैट्रिक्स $A$ और वेक्टर $\mathbf{b}$ के लिए &amp;ldquo;यादृच्छिक उपसमूह का योग (sum of a random subset)&amp;rdquo; लेना है। डिसीजन LWE समस्या की कठिनाई के कारण, यह सिफरटेक्स्ट $(\mathbf{u}, v)$ एक पूरी तरह से यादृच्छिक वेक्टर और एक समान यादृच्छिक संख्या (uniform random number) से अप्रभेद्य (indistinguishable) प्रतीत होता है (सिमेंटिक सिक्योरिटी: Semantic Security)।&lt;/p>
&lt;div class="mermaid">flowchart LR
M["संदेश M {0,1} में"] --> Enc
PK["पब्लिक की (A, b)"] --> Enc
r["यादृच्छिक बाइनरी वेक्टर r"] --> Enc
subgraph Enc ["एन्क्रिप्शन प्रक्रिया"]
direction TB
u_calc["u = A^T * r mod q"]
v_calc["v = b^T * r + M * floor(q/2) mod q"]
end
Enc --> CT["सिफरटेक्स्ट (u, v)"]&lt;/div>
&lt;h2 id="53-डकरपशन-decryption">5.3 डिक्रिप्शन (Decryption)
&lt;/h2>&lt;p>बॉब अपनी गुप्त कुंजी $\mathbf{s}$ का उपयोग करके सिफरटेक्स्ट $(\mathbf{u}, v)$ को डिक्रिप्ट करता है।&lt;/p>
&lt;ol>
&lt;li>निम्नलिखित मान की गणना करें: $D = v - \mathbf{s}^T \mathbf{u} \pmod q$&lt;/li>
&lt;li>यदि गणना किया गया परिणाम $0$ के करीब है, तो $M=0$ आउटपुट करें, और यदि यह $\lfloor \frac{q}{2} \rfloor$ के करीब है, तो $M=1$ आउटपुट करें।&lt;/li>
&lt;/ol>
&lt;p>आइए गणितीय रूप से इसका विस्तार करें कि इसे इस प्रकार डिक्रिप्ट क्यों किया जा सकता है।
याद रखें कि $\mathbf{b} = A \mathbf{s} + \mathbf{e}$ था।&lt;/p>
$$
\begin{aligned}
v - \mathbf{s}^T \mathbf{u} &amp;= (\mathbf{b}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor) - \mathbf{s}^T (A^T \mathbf{r}) \\
&amp;= ((A \mathbf{s} + \mathbf{e})^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor) - \mathbf{s}^T A^T \mathbf{r} \\
&amp;= (\mathbf{s}^T A^T \mathbf{r} + \mathbf{e}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor) - \mathbf{s}^T A^T \mathbf{r} \\
&amp;= \mathbf{e}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor \pmod q
\end{aligned}
$$
&lt;p>यहाँ, सूत्र में से $\mathbf{s}^T A^T \mathbf{r}$ पूरी तरह से कट कर (cancel out) समाप्त हो गया!
बचा हुआ हिस्सा $\mathbf{e}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor$ है।&lt;/p>
&lt;p>$\mathbf{e}$ एक शोर वेक्टर है जिसके घटक बहुत छोटे हैं, और $\mathbf{r}$ एक बाइनरी वेक्टर है जिसके घटक 0 या 1 हैं। इसलिए, उनका डॉट प्रोडक्ट $\mathbf{e}^T \mathbf{r}$ भी अपेक्षाकृत छोटा मान (यदि पैरामीटर ठीक से चुने गए हैं) ही रहेगा।&lt;/p>
&lt;ul>
&lt;li>यदि $M=0$ है, तो परिणाम $\mathbf{e}^T \mathbf{r}$ होगा, जो $0$ के करीब एक छोटा मान होगा।&lt;/li>
&lt;li>यदि $M=1$ है, तो परिणाम $\mathbf{e}^T \mathbf{r} + \lfloor \frac{q}{2} \rfloor$ होगा, जो $q$ के आधे मान $\lfloor \frac{q}{2} \rfloor$ के आसपास स्थित होगा।&lt;/li>
&lt;/ul>
&lt;p>यदि मापदंडों को इस तरह से डिज़ाइन किया गया है कि त्रुटि $\mathbf{e}^T \mathbf{r}$ का निरपेक्ष मान (absolute value) $\frac{q}{4}$ से कम रहे, तो बॉब केवल यह देखकर संदेश $M$ को सटीक रूप से निर्धारित (डिक्रिप्ट) कर सकता है कि गणना का परिणाम $0$ के अधिक करीब है या $\lfloor \frac{q}{2} \rfloor$ के। यही वह सुंदर तंत्र है जिसके द्वारा LWE-आधारित क्रिप्टोग्राफी काम करती है।&lt;/p>
&lt;div class="mermaid">flowchart LR
CT["सिफरटेक्स्ट (u, v)"] --> Dec
SK["गुप्त कुंजी s"] --> Dec
subgraph Dec ["डिक्रिप्शन प्रक्रिया"]
direction TB
calc["गणना करें D = v - s^T * u mod q"]
check["जांचें कि क्या D, 0 या q/2 के करीब है"]
end
calc --> check
Dec --> M_out["पुनर्प्राप्त संदेश M"]&lt;/div>
&lt;h1 id="6-वशषट-सखयतमक-मन-क-उपयग-करत-हए-lwe-करपटगरफ-क-एक-टय-उदहरण-toy-example">6. विशिष्ट संख्यात्मक मानों का उपयोग करते हुए LWE क्रिप्टोग्राफी का एक टॉय उदाहरण (Toy Example)
&lt;/h1>&lt;p>सूत्रों की एक श्रृंखला के साथ इसे समझना मुश्किल हो सकता है, इसलिए आइए वास्तव में बहुत छोटे संख्यात्मक मापदंडों को सेट करके एन्क्रिप्शन से डिक्रिप्शन तक की गणनाओं का पालन करें।
(※ वास्तविक क्रिप्टोग्राफ़िक प्रणालियों में, सुरक्षा सुनिश्चित करने के लिए $n$ के लिए 500 या उससे अधिक और $q$ के लिए हजारों या उससे अधिक मान का उपयोग किया जाता है)&lt;/p>
&lt;p>&lt;strong>【पैरामीटर सेटिंग्स】&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>मॉड्यूलस $q = 17$ (अभाज्य संख्या। इसलिए मान $0$ से $16$ तक की सीमा में होंगे)&lt;/li>
&lt;li>आयाम $n = 2$&lt;/li>
&lt;li>समीकरणों की संख्या $m = 4$&lt;/li>
&lt;li>मान लें कि हम संदेश $M = 1$ को एन्क्रिप्ट कर रहे हैं।&lt;/li>
&lt;li>संदेश का शिफ्ट मान: $\lfloor \frac{q}{2} \rfloor = \lfloor \frac{17}{2} \rfloor = 8$&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>【1. कुंजी निर्माण चरण (Key Generation Phase)】&lt;/strong>
बॉब गुप्त कुंजी $\mathbf{s}$, मैट्रिक्स $A$, और त्रुटि वेक्टर $\mathbf{e}$ को यादृच्छिक रूप से चुनता है।
&lt;/p>
$$ \mathbf{s} = \begin{pmatrix} 3 \\ 4 \end{pmatrix} \in \mathbb{Z}_{17}^2 $$
$$ A = \begin{pmatrix} 2 &amp; 15 \\ 1 &amp; 8 \\ 14 &amp; 5 \\ 9 &amp; 10 \end{pmatrix} \in \mathbb{Z}_{17}^{4 \times 2} $$
$$ \mathbf{e} = \begin{pmatrix} 1 \\ -1 \\ 0 \\ 2 \end{pmatrix} \equiv \begin{pmatrix} 1 \\ 16 \\ 0 \\ 2 \end{pmatrix} \pmod{17} $$
&lt;p>इसके बाद, पब्लिक की $\mathbf{b}$ की गणना करें।
&lt;/p>
$$ A \mathbf{s} = \begin{pmatrix} 2 &amp; 15 \\ 1 &amp; 8 \\ 14 &amp; 5 \\ 9 &amp; 10 \end{pmatrix} \begin{pmatrix} 3 \\ 4 \end{pmatrix} = \begin{pmatrix} 2\times 3 + 15\times 4 \\ 1\times 3 + 8\times 4 \\ 14\times 3 + 5\times 4 \\ 9\times 3 + 10\times 4 \end{pmatrix} = \begin{pmatrix} 6 + 60 \\ 3 + 32 \\ 42 + 20 \\ 27 + 40 \end{pmatrix} = \begin{pmatrix} 66 \\ 35 \\ 62 \\ 67 \end{pmatrix} $$
&lt;p>
इसकी गणना मॉड्युलो 17 में करें। (जैसे $66 = 17 \times 3 + 15$)
&lt;/p>
$$ A \mathbf{s} \pmod{17} = \begin{pmatrix} 15 \\ 1 \\ 11 \\ 16 \end{pmatrix} $$
&lt;p>
त्रुटि वेक्टर $\mathbf{e}$ जोड़ें।
&lt;/p>
$$ \mathbf{b} = A \mathbf{s} + \mathbf{e} = \begin{pmatrix} 15 \\ 1 \\ 11 \\ 16 \end{pmatrix} + \begin{pmatrix} 1 \\ 16 \\ 0 \\ 2 \end{pmatrix} = \begin{pmatrix} 16 \\ 17 \\ 11 \\ 18 \end{pmatrix} \equiv \begin{pmatrix} 16 \\ 0 \\ 11 \\ 1 \end{pmatrix} \pmod{17} $$
&lt;p>पब्लिक की $A$ और $\mathbf{b} = (16, 0, 11, 1)^T$ होगी।&lt;/p>
&lt;p>&lt;strong>【2. एन्क्रिप्शन चरण (Encryption Phase)】&lt;/strong>
ऐलिस संदेश $M = 1$ को एन्क्रिप्ट करती है।
वह एक यादृच्छिक वेक्टर $\mathbf{r}$ चुनती है। यहाँ मान लें कि $\mathbf{r} = (1, 0, 1, 0)^T$ है।&lt;/p>
&lt;p>$\mathbf{u}$ की गणना करें।
&lt;/p>
$$ \mathbf{u} = A^T \mathbf{r} = \begin{pmatrix} 2 &amp; 1 &amp; 14 &amp; 9 \\ 15 &amp; 8 &amp; 5 &amp; 10 \end{pmatrix} \begin{pmatrix} 1 \\ 0 \\ 1 \\ 0 \end{pmatrix} = \begin{pmatrix} 2 \times 1 + 14 \times 1 \\ 15 \times 1 + 5 \times 1 \end{pmatrix} = \begin{pmatrix} 16 \\ 20 \end{pmatrix} \equiv \begin{pmatrix} 16 \\ 3 \end{pmatrix} \pmod{17} $$
&lt;p>$v$ की गणना करें।
&lt;/p>
$$ \mathbf{b}^T \mathbf{r} = (16, 0, 11, 1) \begin{pmatrix} 1 \\ 0 \\ 1 \\ 0 \end{pmatrix} = 16 \times 1 + 11 \times 1 = 27 \equiv 10 \pmod{17} $$
&lt;p>
संदेश $M=1$ के अनुरूप मान $\lfloor 17/2 \rfloor = 8$ जोड़ें।
&lt;/p>
$$ v = \mathbf{b}^T \mathbf{r} + M \cdot 8 = 10 + 1 \times 8 = 18 \equiv 1 \pmod{17} $$
&lt;p>ऐलिस सिफरटेक्स्ट के रूप में $(\mathbf{u}, v) = \left( \begin{pmatrix} 16 \\ 3 \end{pmatrix}, 1 \right)$ बॉब को भेजती है।&lt;/p>
&lt;p>&lt;strong>【3. डिक्रिप्शन चरण (Decryption Phase)】&lt;/strong>
सिफरटेक्स्ट प्राप्त करने के बाद, बॉब गुप्त कुंजी $\mathbf{s} = (3, 4)^T$ का उपयोग करके इसे डिक्रिप्ट करता है।
डिक्रिप्शन प्रक्रिया सूत्र: $D = v - \mathbf{s}^T \mathbf{u} \pmod{17}$ की गणना करें।&lt;/p>
$$ \mathbf{s}^T \mathbf{u} = (3, 4) \begin{pmatrix} 16 \\ 3 \end{pmatrix} = 3 \times 16 + 4 \times 3 = 48 + 12 = 60 \equiv 9 \pmod{17} $$
$$ D = v - \mathbf{s}^T \mathbf{u} = 1 - 9 = -8 \pmod{17} $$
&lt;p>यहाँ, मॉड्युलो 17 की दुनिया में, $-8$, $9$ के बराबर है ($-8 + 17 = 9$)।
प्राप्त मान $D = 9$ का मूल्यांकन यह निर्धारित करने के लिए करें कि यह $0$ के अधिक करीब है या $8$ ($\lfloor 17/2 \rfloor$) के।
चूँकि $9$ स्पष्ट रूप से $0$ की तुलना में $8$ के अधिक करीब है, बॉब ने $M = 1$ को सफलतापूर्वक और सही ढंग से पुनर्प्राप्त कर लिया!&lt;/p>
&lt;p>यह $9$ क्यों हुआ? आइए पहले के प्रमाण को याद करें।
त्रुटि भाग $\mathbf{e}^T \mathbf{r} = (1, -1, 0, 2) (1, 0, 1, 0)^T = 1 \times 1 + 0 \times 1 = 1$ है।
इसलिए, गणना का परिणाम $\mathbf{e}^T \mathbf{r} + M \cdot 8 = 1 + 8 = 9$ है, और यह पुष्टि हो गई है कि सैद्धांतिक रूप से सही मान की गणना की गई है।&lt;/p>
&lt;h1 id="7-वयवहरक-अनपरयग-क-दश-म-वकस-ring-lwe-और-module-lwe">7. व्यावहारिक अनुप्रयोग की दिशा में विकास: Ring-LWE और Module-LWE
&lt;/h1>&lt;p>अब तक समझाई गई मानक LWE समस्या (Standard LWE) में बहुत मजबूत सुरक्षा प्रमाण है, लेकिन व्यावहारिक अनुप्रयोग में इसकी एक घातक कमजोरी है: &amp;ldquo;कुंजी का आकार विशाल हो जाता है&amp;rdquo; और &amp;ldquo;कम्प्यूटेशनल लागत अधिक होती है।&amp;rdquo;&lt;/p>
&lt;p>Standard LWE में, पब्लिक की में एक विशाल मैट्रिक्स $A \in \mathbb{Z}_q^{m \times n}$ शामिल होता है। जब पैरामीटर $n$ सैकड़ों से हजारों तक पहुँच जाता है, तो इस मैट्रिक्स का आकार कई मेगाबाइट तक पहुँच जाता है, जो इंटरनेट संचार प्रोटोकॉल (जैसे TLS) में हर बार प्रसारित और प्राप्त करने के लिए बहुत भारी होता है। इसके अलावा, मैट्रिक्स और वेक्टर के गुणन के लिए $\mathcal{O}(n^2)$ कम्प्यूटेशनल जटिलता की आवश्यकता होती है।&lt;/p>
&lt;p>इस समस्या को हल करने के लिए, &amp;ldquo;Ring-LWE (RLWE)&amp;rdquo; और &amp;ldquo;Module-LWE (MLWE)&amp;rdquo; को पेश किया गया, जो जाली में पॉलीनोमियल रिंग्स (Polynomial rings) नामक बीजीय संरचनाओं (algebraic structures) को शामिल करते हैं।&lt;/p>
&lt;h2 id="71-ring-lwe-क-अतरजञन">7.1 Ring-LWE का अंतर्ज्ञान
&lt;/h2>&lt;p>Ring-LWE में, वेक्टर और मैट्रिक्स को पॉलीनोमियल रिंग $\mathcal{R}_q = \mathbb{Z}_q[X]/(X^n + 1)$ पर तत्वों (बहुपदों / polynomials) से बदल दिया जाता है। (जहाँ $n$ को 2 की घात के रूप में चुना जाता है)।&lt;/p>
&lt;p>Standard LWE में जहाँ पब्लिक की एक मैट्रिक्स $A$ थी, वहीं Ring-LWE में एकल बहुपद $a(x)$ का उपयोग किया जाता है। गुप्त कुंजी $s(x)$ और त्रुटि $e(x)$ भी बहुपद बन जाते हैं।
समीकरण इस प्रकार है:
&lt;/p>
$$ b(x) = a(x) \cdot s(x) + e(x) \pmod q $$
&lt;p>चूँकि यह बहुपदों का गुणन है, फास्ट फूरियर ट्रांसफॉर्म (FFT) के समान &amp;ldquo;नंबर थियोरेटिक ट्रांसफॉर्म (Number Theoretic Transform: NTT)&amp;rdquo; का उपयोग करके कम्प्यूटेशनल जटिलता को नाटकीय रूप से $\mathcal{O}(n \log n)$ तक कम किया जा सकता है। इसके अलावा, चूंकि पब्लिक की का आकार एक मैट्रिक्स से एकल बहुपद तक छोटा हो जाता है, इसलिए डेटा का आकार $\mathcal{O}(n)$ तक कम हो जाता है। यह संचार बैंडविड्थ के मामले में एक बड़ा लाभ प्रदान करता है।&lt;/p>
&lt;p>गणितीय दृष्टिकोण से, Ring-LWE एक सामान्य जाली नहीं है, बल्कि यह एक विशेष समरूपता (symmetry) वाली जाली की समस्या में बदल जाती है, जिसे &amp;ldquo;आइडियल लैटिस (Ideal Lattice)&amp;rdquo; कहा जाता है।&lt;/p>
&lt;h2 id="72-module-lwe-और-nist-क-मनककरण-kyber--ml-kem">7.2 Module-LWE और NIST का मानकीकरण (Kyber / ML-KEM)
&lt;/h2>&lt;p>हालाँकि Ring-LWE कुशल है, लेकिन यह चिंता थी कि आइडियल लैटिस की विशेष बीजीय संरचना भविष्य में हमलों का एक प्रारंभिक बिंदु बन सकती है। इसलिए, &amp;ldquo;Module-LWE (MLWE)&amp;rdquo; को पेश किया गया, जो Standard LWE की रूढ़िवादी (conservative) सुरक्षा और Ring-LWE की दक्षता का &amp;ldquo;सर्वश्रेष्ठ संयोजन (best of both worlds)&amp;rdquo; है।&lt;/p>
&lt;p>Module-LWE में, हम बहुपदों वाले छोटे मैट्रिक्स और वेक्टरों पर विचार करते हैं। दूसरे शब्दों में, हम एक रिंग पर मॉड्यूल से निपटते हैं।
वर्तमान में, NIST द्वारा PQC कुंजी-विनिमय एल्गोरिदम (KEM) के मानक के रूप में चुना गया &amp;ldquo;CRYSTALS-Kyber&amp;rdquo; (मानकीकृत नाम: ML-KEM), पूरी तरह से इस Module-LWE समस्या की कठिनाई पर आधारित है।&lt;/p>
&lt;h1 id="8-यह-कवटम-कपयटर-क-खलफ-सरकषत-कय-ह">8. यह क्वांटम कंप्यूटरों के खिलाफ सुरक्षित क्यों है?
&lt;/h1>&lt;p>अंत में, आइए इस मुख्य प्रश्न को छूते हैं: &amp;ldquo;ऐसा क्यों माना जाता है कि क्वांटम कंप्यूटरों का उपयोग करके भी जाली-आधारित क्रिप्टोग्राफी को नहीं तोड़ा जा सकता है?&amp;rdquo;&lt;/p>
&lt;p>Shor का एल्गोरिदम, जो क्वांटम कंप्यूटरों को RSA और एलिप्टिक कर्व क्रिप्टोग्राफी को तोड़ने की अनुमति देता है, अनिवार्य रूप से &amp;ldquo;हिडन सबग्रुप प्रॉब्लम (Hidden Subgroup Problem: HSP)&amp;rdquo; को हल करने के लिए एक एल्गोरिदम है। RSA और ECC (परिमित एबेलियन समूह / finite Abelian groups) के पीछे की गणितीय संरचना में आवधिकता (periodicity) होती है, और क्वांटम फूरियर ट्रांसफॉर्म (QFT) नामक क्वांटम एल्गोरिदम के लिए विशिष्ट ऑपरेशन का उपयोग करके इस अवधि (छिपे हुए उपसमूह) को एक बार में निकाला जा सकता है।&lt;/p>
&lt;p>हालाँकि, जाली की समस्याएं मौलिक रूप से भिन्न हैं। हालांकि जालियों में भी आवधिकता होती है, SVP और CVP के लिए &amp;ldquo;सबसे कम दूरी&amp;rdquo; और &amp;ldquo;शोर हटाने&amp;rdquo; जैसे ज्यामितीय, गैर-रेखीय (non-linear) गुणों की आवश्यकता होती है। Shor के एल्गोरिदम की तरह &amp;ldquo;एबेलियन समूह पर क्वांटम फूरियर ट्रांसफॉर्म&amp;rdquo; को सीधे लागू करने से जाली समस्याओं को हल करने के लिए उपयोगी जानकारी को कुशलतापूर्वक नहीं निकाला जा सकता है। आज तक, SVP या LWE को पॉलीनोमियल समय में हल करने वाला कोई क्वांटम एल्गोरिदम नहीं खोजा गया है। यह व्यापक रूप से माना जाता है कि क्वांटम कंप्यूटरों की समानांतर कंप्यूटिंग क्षमता के साथ भी, ब्रूट-फोर्स सर्च (Brute-force search) के करीब का तरीका (ग्रोवर के एल्गोरिदम का उपयोग करके वर्गमूल गति वृद्धि / square root speedup तक ही) एकमात्र प्रभावी साधन है।&lt;/p>
&lt;h1 id="9-नषकरष">9. निष्कर्ष
&lt;/h1>&lt;p>इस लेख में, हमने जाली-आधारित क्रिप्टोग्राफी के गणितीय अंतर्ज्ञान के बारे में विस्तार से बताया है, जिसकी शुरुआत जाली की ज्यामितीय परिभाषा से हुई, उसके बाद LWE समस्या का निरूपण किया गया, और अंततः पब्लिक-की क्रिप्टोग्राफी के निर्माण को समझाया गया।&lt;/p>
&lt;ol>
&lt;li>&lt;strong>जाली (Lattice)&lt;/strong> एक असतत स्थान (discrete space) है जिसे बेसिस वेक्टरों के पूर्णांक गुणांकों वाले रैखिक संयोजन द्वारा दर्शाया जाता है। उच्च आयामों में एक &amp;ldquo;अच्छा बेसिस&amp;rdquo; खोजना (जो लगभग ऑर्थोगोनल हो) मुश्किल हो जाता है (SVP)।&lt;/li>
&lt;li>&lt;strong>LWE समस्या (Learning With Errors)&lt;/strong> शोर (noise) के साथ रेखीय समीकरणों की प्रणाली को हल करने की समस्या है। चूँकि यह जाली की सबसे खराब स्थिति (worst-case) वाली समस्याओं की कठिनाई से जुड़ी है, इसलिए यह सुरक्षा का एक मजबूत आधार प्रदान करती है।&lt;/li>
&lt;li>LWE समस्या का उपयोग करते हुए, जानबूझकर शोर जोड़ने या हटाने के एक सरल तंत्र के माध्यम से एन्क्रिप्शन और डिक्रिप्शन (&lt;strong>रेगेव क्रिप्टोग्राफी - Regev Cryptosystem&lt;/strong>) प्राप्त किया जाता है।&lt;/li>
&lt;li>वास्तविक प्रोटोकॉल में, संचार दक्षता और कम्प्यूटेशनल गति में सुधार करने के लिए पॉलीनोमियल रिंग्स का उपयोग करने वाले &lt;strong>Ring-LWE&lt;/strong> और &lt;strong>Module-LWE&lt;/strong> को अपनाया गया है। ये NIST के मानक &lt;strong>ML-KEM&lt;/strong> की नींव बनाते हैं।&lt;/li>
&lt;/ol>
&lt;p>जैसे-जैसे क्वांटम कंप्यूटर के रूप में अभूतपूर्व कंप्यूटिंग प्रतिमान बदलाव (paradigm shift) आ रहा है, यह बहुत ही रोमांचक है कि क्लासिकल लीनियर अलजेब्रा और नंबर थ्योरी (number theory) की गहराइयों से जन्मी &amp;ldquo;जाली-आधारित क्रिप्टोग्राफी&amp;rdquo; भविष्य की इंटरनेट सुरक्षा की नींव रखेगी। जाली-आधारित क्रिप्टोग्राफी की आधारभूत गणित बहुत अधिक जटिल नहीं है; लीनियर अलजेब्रा और प्रोबेबिलिटी (probability) के बुनियादी ज्ञान के साथ, इसकी सुंदर संरचना को पूरी तरह से समझा जा सकता है। हमें उम्मीद है कि यह लेख PQC के मूल में स्थित जाली-आधारित क्रिप्टोग्राफी को समझने में आपकी मदद करेगा।&lt;/p></description></item><item><title>रीमैन परिकल्पना और अभाज्य संख्याओं का वितरण: आधुनिक क्रिप्टोग्राफी के साथ गहरा संबंध</title><link>http://kenji.blog/hi/p/riemann-hypothesis-prime-distribution-cryptography/</link><pubDate>Fri, 11 Sep 2026 16:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/riemann-hypothesis-prime-distribution-cryptography/</guid><description>&lt;img src="http://kenji.blog/p/riemann-hypothesis-prime-distribution-cryptography/img/eyecatch.jpg" alt="Featured image of post रीमैन परिकल्पना और अभाज्य संख्याओं का वितरण: आधुनिक क्रिप्टोग्राफी के साथ गहरा संबंध" />&lt;h1 id="1-परचय-अभजय-सखयओ-क-लकक-रहसय-और-रमन-परकलपन">1. परिचय: अभाज्य संख्याओं का लौकिक रहस्य और रीमैन परिकल्पना
&lt;/h1>&lt;p>&amp;ldquo;अभाज्य संख्याएँ (Prime Numbers)&amp;rdquo; प्राकृतिक संख्याएँ हैं जो केवल 1 और स्वयं से विभाज्य होती हैं, और उन्हें गणित की दुनिया का &amp;ldquo;परमाणु&amp;rdquo; भी कहा जाता है। अनुक्रम 2, 3, 5, 7, 11, 13&amp;hellip; पहली नज़र में अव्यवस्थित और यादृच्छिक प्रतीत होता है। प्राचीन यूनानी गणितज्ञ यूक्लिड ने यह साबित किया था कि &amp;ldquo;अभाज्य संख्याएँ अनंत हैं,&amp;rdquo; तब से अनगिनत गणितज्ञों ने अभाज्य संख्याओं के इस क्रम में छिपी नियमितता को उजागर करने का प्रयास किया है।&lt;/p>
&lt;p>इस अभाज्य संख्या के रहस्य के सबसे करीब 1859 में जर्मन गणितज्ञ बर्नहार्ड रीमैन (Bernhard Riemann) द्वारा प्रस्तावित &lt;strong>&amp;ldquo;रीमैन परिकल्पना (Riemann Hypothesis)&amp;rdquo;&lt;/strong> है। रीमैन परिकल्पना आधुनिक गणित में सबसे महत्वपूर्ण और अनसुलझी समस्याओं में से एक है, और यह क्ले मैथमेटिक्स इंस्टीट्यूट द्वारा निर्धारित मिलेनियम प्राइज समस्याओं में से एक है, जिस पर 1 मिलियन डॉलर का इनाम है।&lt;/p>
&lt;p>पहली नज़र में, अभाज्य संख्याओं के वितरण से संबंधित शुद्ध गणित की यह कठिन समस्या हमारे दैनिक जीवन से असंबंधित लग सकती है। हालाँकि, इंटरनेट की सुरक्षा जो आधुनिक समाज के बुनियादी ढांचे का समर्थन करती है, विशेष रूप से &lt;strong>आधुनिक क्रिप्टोग्राफी जैसे RSA और एलिप्टिक कर्व क्रिप्टोग्राफी (ECC)&lt;/strong>, विशाल अभाज्य संख्याओं के गुणों पर गहराई से निर्भर करती है।&lt;/p>
&lt;p>इस लेख में, हम अभाज्य संख्याओं के वितरण से लेकर अभाज्य संख्या प्रमेय, रीमैन ज़ेटा फ़ंक्शन और रीमैन परिकल्पना के मूल तक एक गणितीय यात्रा करेंगे, और यह कैसे आधुनिक क्रिप्टोग्राफी से जुड़ा है, और यदि रीमैन परिकल्पना सिद्ध हो जाती है तो दुनिया कैसी होगी, इसके बारे में बहुत विस्तृत और गहन व्याख्या करेंगे।&lt;/p>
&lt;hr>
&lt;h1 id="2-अभजय-सखय-परमय-और-अभजय-सखयओ-क-वतरण-गस-क-खज">2. अभाज्य संख्या प्रमेय और अभाज्य संख्याओं का वितरण: गॉस की खोज
&lt;/h1>&lt;p>अभाज्य संख्याएँ कैसे वितरित होती हैं, यह समझने के लिए, गणितज्ञों ने &lt;strong>अभाज्य-गणना फलन (Prime-counting function)&lt;/strong> $\pi(x)$ पर विचार किया, जो दर्शाता है कि &amp;ldquo;किसी संख्या $x$ के बराबर या उससे कम कितनी अभाज्य संख्याएँ हैं।&amp;rdquo;&lt;/p>
&lt;p>उदाहरण के लिए:&lt;/p>
&lt;ul>
&lt;li>$\pi(10) = 4$ (2, 3, 5, 7)&lt;/li>
&lt;li>$\pi(100) = 25$&lt;/li>
&lt;li>$\pi(1000) = 168$&lt;/li>
&lt;/ul>
&lt;p>15 वर्षीय प्रतिभाशाली गणितज्ञ कार्ल फ्रेडरिक गॉस (Carl Friedrich Gauss) ने अभाज्य संख्याओं की विशाल तालिकाओं की गणना की और पाया कि अभाज्य संख्याओं की आवृत्ति प्राकृतिक लघुगणक (natural logarithm) $\ln x$ के व्युत्क्रमानुपाती होकर कम हो जाती है। अर्थात्, उन्होंने अनुमान लगाया कि किसी संख्या $x$ के आसपास अभाज्य संख्या मिलने की प्रायिकता लगभग $\frac{1}{\ln x}$ है।&lt;/p>
&lt;p>इसे समाकलन (integration) का उपयोग करके व्यक्त किया गया है, जिसे &lt;strong>लघुगणकीय समाकलन (Logarithmic integral)&lt;/strong> $\text{Li}(x)$ कहा जाता है।&lt;/p>
$$ \text{Li}(x) = \int_{2}^{x} \frac{dt}{\ln t} $$
&lt;p>गॉस के अनुमान को बाद में 1896 में जैक्स हैडमार्ड और चार्ल्स जीन डे ला वैली-पूसिन द्वारा स्वतंत्र रूप से सिद्ध किया गया था, और इसे &lt;strong>अभाज्य संख्या प्रमेय (Prime Number Theorem, PNT)&lt;/strong> के रूप में स्थापित किया गया।&lt;/p>
$$ \lim_{x \to \infty} \frac{\pi(x)}{\text{Li}(x)} = 1 $$
&lt;p>या अनुमानित रूप से इसे इस प्रकार व्यक्त किया जाता है:&lt;/p>
$$ \pi(x) \sim \frac{x}{\ln x} $$
&lt;p>इस प्रमेय से, यह पता चला कि यदि स्थूल रूप से देखा जाए, तो अभाज्य संख्याओं का वितरण बहुत सहज और अनुमानित होता है। हालाँकि, यदि सूक्ष्म रूप से देखा जाए, तो $\pi(x)$ और $\text{Li}(x)$ के बीच हमेशा &amp;ldquo;त्रुटि&amp;rdquo; अर्थात् &amp;ldquo;उतार-चढ़ाव&amp;rdquo; होता है। इस उतार-चढ़ाव का वास्तविक स्वरूप ही वह सबसे बड़ा रहस्य है जिसे रीमैन परिकल्पना सुलझाने का प्रयास कर रही है।&lt;/p>
&lt;hr>
&lt;h1 id="3-रमन-जट-फकशन-और-यलर-उतपद">3. रीमैन ज़ेटा फ़ंक्शन और यूलर उत्पाद
&lt;/h1>&lt;p>अभाज्य संख्याओं के वितरण का विश्लेषण करने के लिए सबसे शक्तिशाली हथियार &lt;strong>रीमैन ज़ेटा फ़ंक्शन (Riemann Zeta Function)&lt;/strong> है। यह मूल रूप से लियोनहार्ड यूलर (Leonhard Euler) द्वारा वास्तविक संख्याओं $s > 1$ के लिए परिभाषित एक अनंत श्रृंखला थी।&lt;/p>
$$ \zeta(s) = \sum_{n=1}^\infty \frac{1}{n^s} = 1 + \frac{1}{2^s} + \frac{1}{3^s} + \frac{1}{4^s} + \dots $$
&lt;p>यूलर की सबसे बड़ी उपलब्धियों में से एक यह साबित करना था कि इस अनंत श्रृंखला को सभी अभाज्य संख्याओं $p$ पर एक अनंत उत्पाद के रूप में व्यक्त किया जा सकता है। यह &lt;strong>यूलर उत्पाद सूत्र (Euler Product Formula)&lt;/strong> है।&lt;/p>
$$ \zeta(s) = \prod_{p \text{ prime}} \frac{1}{1 - p^{-s}} = \left( \frac{1}{1 - 2^{-s}} \right) \left( \frac{1}{1 - 3^{-s}} \right) \left( \frac{1}{1 - 5^{-s}} \right) \dots $$
&lt;p>प्रमाण की सहज समझ यह है कि दाईं ओर के प्रत्येक पद को एक गुणोत्तर श्रेणी के रूप में विस्तारित करके और उन्हें गुणा करके, अंकगणित के मूलभूत प्रमेय (सभी प्राकृतिक संख्याओं को अभाज्य संख्याओं के उत्पाद के रूप में विशिष्ट रूप से दर्शाया जाता है) के कारण, बाईं ओर की प्राकृतिक संख्याओं के व्युत्क्रमों का योग पूरी तरह से पुनर्गठित हो जाता है।&lt;/p>
&lt;p>&lt;strong>यह एक ही सूत्र विश्लेषण (अनंत श्रृंखला और निरंतर कार्य) और संख्या सिद्धांत (अभाज्य संख्या और असतत संख्या) को जोड़ने वाला सेतु बन गया।&lt;/strong> ज़ेटा फ़ंक्शन की जांच करना अभाज्य संख्याओं के वितरण की जांच करने के समान है।&lt;/p>
&lt;hr>
&lt;h1 id="4-वशलषणतमक-नरतरत-और-सममशर-तल-म-वसतर">4. विश्लेषणात्मक निरंतरता और सम्मिश्र तल में विस्तार
&lt;/h1>&lt;p>रीमैन की प्रतिभा इस बात में निहित है कि उन्होंने चर $s$ को, जिसे यूलर ने केवल वास्तविक संख्याओं के लिए $\zeta(s)$ में माना था, &lt;strong>सम्मिश्र संख्या $s = \sigma + it$ ($\sigma$ वास्तविक भाग है, $t$ काल्पनिक भाग है)&lt;/strong> में विस्तारित किया।&lt;/p>
&lt;p>मूल अनंत श्रृंखला केवल $\sigma > 1$ के लिए अभिसरण करती है, लेकिन रीमैन ने &amp;ldquo;विश्लेषणात्मक निरंतरता (Analytic Continuation)&amp;rdquo; नामक तकनीक का उपयोग करके परिभाषा का विस्तार किया ताकि $\zeta(s)$ का अर्थ पूरे सम्मिश्र तल पर हो, सिवाय $s = 1$ के पोल के।&lt;/p>
&lt;p>उन्होंने ज़ेटा फ़ंक्शन द्वारा संतुष्ट एक सुंदर कार्यात्मक समीकरण (Functional equation) भी प्राप्त किया।&lt;/p>
$$ \zeta(s) = 2^s \pi^{s-1} \sin\left(\frac{\pi s}{2}\right) \Gamma(1-s) \zeta(1-s) $$
&lt;p>यहाँ $\Gamma(x)$ गामा फ़ंक्शन है। इस समीकरण के साथ, हम दाहिने आधे तल के गुणों से बाएं आधे तल के गुणों को जान सकते हैं।&lt;/p>
&lt;h3 id="शनय-zeros-of-the-zeta-function">शून्य (Zeros of the Zeta Function)
&lt;/h3>&lt;p>सम्मिश्र संख्या $s$ जहाँ ज़ेटा फ़ंक्शन का मान 0 हो जाता है, उसे &amp;ldquo;शून्य&amp;rdquo; कहा जाता है।
कार्यात्मक समीकरण से, जब $s$ एक ऋणात्मक सम संख्या ($-2, -4, -6, \dots$) होती है, $\sin(\pi s / 2)$ 0 हो जाता है, इसलिए $\zeta(s) = 0$ होता है। इन्हें &lt;strong>तुच्छ शून्य (Trivial zeros)&lt;/strong> कहा जाता है।&lt;/p>
&lt;p>हालाँकि, अभाज्य संख्याओं के वितरण में जो महत्वपूर्ण है वह अन्य शून्य हैं, अर्थात् &lt;strong>गैर-तुच्छ शून्य (Non-trivial zeros)&lt;/strong> जो $0 \le \sigma \le 1$ के &amp;ldquo;महत्वपूर्ण क्षेत्र (Critical strip)&amp;rdquo; में मौजूद हैं।&lt;/p>
&lt;hr>
&lt;h1 id="5-रमन-परकलपन-क-मल-और-सपषट-सतर">5. रीमैन परिकल्पना का मूल और स्पष्ट सूत्र
&lt;/h1>&lt;p>रीमैन ने कुछ शून्यों की गणना की और एक आश्चर्यजनक परिकल्पना प्रस्तुत की। यह &lt;strong>रीमैन परिकल्पना&lt;/strong> है।&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>रीमैन परिकल्पना (Riemann Hypothesis)&lt;/strong>
रीमैन ज़ेटा फ़ंक्शन $\zeta(s)$ के सभी गैर-तुच्छ शून्य उस रेखा पर स्थित होते हैं जिसका वास्तविक भाग $1/2$ है ($\text{Re}(s) = 1/2$)।&lt;/p>
&lt;/blockquote>
&lt;p>इस वास्तविक भाग $1/2$ वाली रेखा को &amp;ldquo;महत्वपूर्ण रेखा (Critical line)&amp;rdquo; कहा जाता है।&lt;/p>
&lt;div class="mermaid">graph TD
A["रीमैन ज़ेटा फ़ंक्शन ζ(s)"] --> B["विश्लेषणात्मक निरंतरता द्वारा सम्मिश्र तल में विस्तार"]
B --> C["तुच्छ शून्य (s = -2, -4, -6 ...)"]
B --> D["गैर-तुच्छ शून्य (0 &lt;= Re(s) &lt;= 1)"]
D --> E["रीमैन परिकल्पना"]
E --> F["सभी गैर-तुच्छ शून्य Re(s) = 1/2 पर स्थित हैं"]
F --> G["अभाज्य वितरण की त्रुटि अवधि की सीमा के प्रमाण की ओर"]&lt;/div>
&lt;p>रीमैन परिकल्पना इतनी महत्वपूर्ण क्यों है? ऐसा इसलिए है क्योंकि ज़ेटा फ़ंक्शन के शून्य अभाज्य संख्याओं के वितरण को &lt;strong>पूरी तरह से&lt;/strong> निर्धारित करते हैं।&lt;/p>
&lt;p>रीमैन और बाद के गणितज्ञ वॉन मैंगोल्ड्ट ने अभाज्य संख्याओं के वितरण का सटीक वर्णन करने के लिए एक &amp;ldquo;स्पष्ट सूत्र (Explicit formula)&amp;rdquo; प्राप्त किया। चेबीशेव फ़ंक्शन $\psi(x)$ का उपयोग करते हुए, इसे इस प्रकार व्यक्त किया जाता है:&lt;/p>
$$ \psi(x) = x - \sum_{\rho} \frac{x^\rho}{\rho} - \ln(2\pi) - \frac{1}{2}\ln(1 - x^{-2}) $$
&lt;p>यहाँ $\rho$ ज़ेटा फ़ंक्शन के सभी गैर-तुच्छ शून्यों पर योग है।
मुख्य पद $x$ है (जो अभाज्य संख्या प्रमेय से मेल खाता है), और वहां से, शून्य $\rho$ पर निर्भर तरंग जैसे पदों को जोड़ने और घटाने से, अभाज्य संख्याओं का सटीक सीढ़ी जैसा वितरण बहाल हो जाता है। यह कहा जा सकता है कि गैर-तुच्छ शून्य अभाज्य संख्याओं के वितरण की &amp;ldquo;आवृत्ति (तरंग)&amp;rdquo; का प्रतिनिधित्व करते हैं।&lt;/p>
&lt;p>यदि रीमैन परिकल्पना सही है और सभी गैर-तुच्छ शून्यों $\rho$ का वास्तविक भाग ठीक $1/2$ है, तो अभाज्य संख्या प्रमेय का त्रुटि पद सैद्धांतिक रूप से संभव न्यूनतम सीमा के भीतर होगा।&lt;/p>
$$ |\pi(x) - \text{Li}(x)| \le \frac{1}{8\pi} \sqrt{x} \ln x \quad \text{for} \quad x \ge 2657 $$
&lt;p>दूसरे शब्दों में, &lt;strong>यदि रीमैन परिकल्पना सत्य है, तो यह सिद्ध हो जाएगा कि अभाज्य संख्याएँ सबसे &amp;ldquo;नियमित और सुंदर&amp;rdquo; तरीके से वितरित हैं जिसकी हम कल्पना कर सकते हैं&lt;/strong>।&lt;/p>
&lt;hr>
&lt;h1 id="6-आधनक-करपटगरफ-और-अभजय-सखयओ-क-बच-अवभजय-सबध">6. आधुनिक क्रिप्टोग्राफी और अभाज्य संख्याओं के बीच अविभाज्य संबंध
&lt;/h1>&lt;p>अब तक यह शुद्ध गणित की एक गहरी दुनिया थी, लेकिन अभाज्य संख्याओं के ये गुण मूल रूप से आधुनिक डिजिटल समाज का समर्थन करते हैं। एक विशिष्ट उदाहरण पब्लिक-की क्रिप्टोग्राफी है, जैसे कि &lt;strong>RSA क्रिप्टोग्राफी&lt;/strong>।&lt;/p>
&lt;p>इंटरनेट पर क्रेडिट कार्ड भुगतान, पासवर्ड का प्रसारण और ब्लॉकचेन के डिजिटल हस्ताक्षर जैसे सभी संचारों की सुरक्षा &amp;ldquo;अभाज्य संख्याओं&amp;rdquo; पर निर्भर करती है।&lt;/p>
&lt;h3 id="rsa-करपटगरफ-कस-कम-करत-ह">RSA क्रिप्टोग्राफी कैसे काम करती है
&lt;/h3>&lt;p>RSA क्रिप्टोग्राफी की सुरक्षा इस गणितीय तथ्य (पूर्णांक गुणनखंड समस्या) पर आधारित है कि &amp;ldquo;कई अंकों वाली एक समग्र संख्या का गुणनखंड करना बेहद मुश्किल है।&amp;rdquo;&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>कुंजी निर्माण&lt;/strong>:
विशाल अभाज्य संख्याएँ $p$ और $q$ (उदाहरण के लिए, प्रत्येक 2048 बिट) यादृच्छिक रूप से चुनी जाती हैं।
उन्हें गुणा करके $N = p \times q$ की गणना की जाती है। यह $N$ सार्वजनिक कुंजी का हिस्सा बन जाता है।
यूलर के टॉटिएंट फ़ंक्शन $\phi(N) = (p-1)(q-1)$ का उपयोग करके, एक गुप्त कुंजी $d$ उत्पन्न की जाती है।&lt;/p>
$$ e \times d \equiv 1 \pmod{\phi(N)} $$
&lt;/li>
&lt;li>
&lt;p>&lt;strong>एन्क्रिप्शन और डिक्रिप्शन&lt;/strong>:
सादा पाठ $M$ को सार्वजनिक कुंजी $e, N$ का उपयोग करके सिफरटेक्स्ट $C$ में परिवर्तित किया जाता है।
&lt;/p>
$$ C \equiv M^e \pmod{N} $$
&lt;p>
केवल गुप्त कुंजी $d$ वाला व्यक्ति ही इसे डिक्रिप्ट कर सकता है।
&lt;/p>
$$ M \equiv C^d \pmod{N} $$
&lt;/li>
&lt;/ol>
&lt;div class="mermaid">graph LR
A["सादा पाठ (Plaintext)"] --> B["सार्वजनिक कुंजी (e, N) के साथ एन्क्रिप्ट करें"]
B --> C["सिफरटेक्स्ट (Ciphertext)"]
C --> D["गुप्त कुंजी (d) के साथ डिक्रिप्ट करें"]
D --> E["मूल सादा पाठ"]
F["हमलावर (Attacker)"] -- "N का गुणनखंड करने का प्रयास करता है" --> C
F -.-> G["p और q के बिना d की गणना नहीं की जा सकती"]&lt;/div>
&lt;p>RSA क्रिप्टोग्राफी को तोड़ने के लिए, विशाल $N$ से मूल अभाज्य संख्याओं $p$ और $q$ को खोजना (गुणनखंड करना) आवश्यक है। यहां तक ​​कि वर्तमान मुख्यधारा के एल्गोरिदम (जैसे जनरल नंबर फील्ड सीव: GNFS) का उपयोग करके, सुपर कंप्यूटर का उपयोग करके सैकड़ों अंकों की संख्या का गुणनखंड करने में ब्रह्मांड की आयु से बहुत अधिक समय लगने की उम्मीद है।&lt;/p>
&lt;hr>
&lt;h1 id="7-करपटगरफ-पर-रमन-परकलपन-क-परभव">7. क्रिप्टोग्राफी पर रीमैन परिकल्पना का प्रभाव
&lt;/h1>&lt;p>तो, &amp;ldquo;रीमैन परिकल्पना&amp;rdquo; (शुद्ध गणित का शिखर) और &amp;ldquo;क्रिप्टोग्राफी&amp;rdquo; एक दूसरे को कैसे पार करते हैं?&lt;/p>
&lt;h3 id="71-अभजय-सखय-जनरशन-एलगरदम-परइमलट-टसटग-और-जनरलइजड-रमन-परकलपन-grh">7.1. अभाज्य संख्या जनरेशन एल्गोरिदम (प्राइमलिटी टेस्टिंग) और जनरलाइज्ड रीमैन परिकल्पना (GRH)
&lt;/h3>&lt;p>RSA क्रिप्टोग्राफी को संचालित करने के लिए, पहले विशाल अभाज्य संख्याएँ $p$ और $q$ उत्पन्न करनी होंगी। हालाँकि, यह निश्चित रूप से और तेज़ी से निर्धारित करना आसान नहीं है कि &amp;ldquo;क्या कोई संख्या अभाज्य है।&amp;rdquo;&lt;/p>
&lt;p>वर्तमान में, व्यावहारिक उपयोग में आने वाला &lt;strong>मिलर-राबिन प्राइमलिटी टेस्ट (Miller-Rabin primality test)&lt;/strong> एक संभाव्य एल्गोरिथ्म है। यह एल्गोरिथ्म तेज़ है, लेकिन एक &amp;ldquo;छद्म-अभाज्य&amp;rdquo; जोखिम है जहाँ यह एक समग्र संख्या को बहुत कम संभावना के साथ अभाज्य संख्या के रूप में गलत रूप से आंक सकता है।&lt;/p>
&lt;p>हालाँकि, यदि हम मान लें कि डिरिचलेट के L-फ़ंक्शंस तक रीमैन परिकल्पना का विस्तार &lt;strong>&amp;ldquo;जनरलाइज्ड रीमैन परिकल्पना (Generalized Riemann Hypothesis, GRH)&amp;rdquo;&lt;/strong> सत्य है, तो कहानी नाटकीय रूप से बदल जाती है।
यदि GRH सत्य है, तो मिलर-राबिन परीक्षण में परीक्षणों की अधिकतम संख्या की गणितीय रूप से गारंटी होती है, और यह एक संभाव्य एल्गोरिथ्म से &lt;strong>&amp;ldquo;नियतात्मक बहुपद-समय एल्गोरिथ्म&amp;rdquo; में परिवर्तित&lt;/strong> हो जाता है (यह AKS प्राइमलिटी परीक्षण की खोज से पहले भी ज्ञात एक महत्वपूर्ण तथ्य था)।&lt;/p>
&lt;p>दूसरे शब्दों में, रीमैन परिकल्पना (और इसका विस्तार) सीधे तौर पर इस बात की गारंटी देता है कि &amp;ldquo;क्या हम पूर्ण विश्वास के साथ और उच्च गति पर विशाल अभाज्य संख्याएँ उत्पन्न कर सकते हैं&amp;rdquo;, जो क्रिप्टोग्राफी की नींव उत्पन्न करने के लिए आवश्यक है।&lt;/p>
&lt;h3 id="72-गणनखड-एलगरदम-क-सथ-सबध">7.2. गुणनखंड एल्गोरिदम के साथ संबंध
&lt;/h3>&lt;p>क्रिप्टोग्राफी को क्रैक करने वाले एल्गोरिदम (जैसे कि जनरल नंबर फील्ड सीव) की कम्प्यूटेशनल जटिलता का मूल्यांकन करते समय, अभाज्य संख्याओं के वितरण का ज्ञान अपरिहार्य है। कई गुणनखंड एल्गोरिदम &amp;ldquo;सहज संख्याओं (Smooth numbers: वे संख्याएँ जिनमें केवल छोटे अभाज्य गुणनखंड होते हैं)&amp;rdquo; के वितरण पर निर्भर करते हैं।&lt;/p>
&lt;p>सहज संख्याएँ कितनी बार दिखाई देती हैं, इसका कड़ाई से मूल्यांकन करने के लिए, अभाज्य संख्याओं के वितरण की गहरी समझ आवश्यक है, और यहाँ भी, विश्लेषणात्मक संख्या सिद्धांत की तकनीकों का उपयोग किया जाता है जो सीधे ज़ेटा फ़ंक्शन और रीमैन परिकल्पना से जुड़ी हैं। यदि रीमैन परिकल्पना सिद्ध हो जाती है और अभाज्य वितरण की त्रुटि पूरी तरह से निर्धारित हो जाती है, तो गुणनखंड एल्गोरिदम की प्रदर्शन सीमाओं का अधिक सटीक आकलन करना संभव होगा।&lt;/p>
&lt;hr>
&lt;h1 id="8-यद-रमन-परकलपन-सदध-ह-जए-त-कय-करपटगरफ-टट-जएग">8. यदि रीमैन परिकल्पना सिद्ध हो जाए, तो क्या क्रिप्टोग्राफी टूट जाएगी?
&lt;/h1>&lt;p>एक शहरी किंवदंती की तरह, यह कभी-कभी कहा जाता है कि &amp;ldquo;यदि रीमैन परिकल्पना हल हो जाती है, तो RSA क्रिप्टोग्राफी तुरंत ढह जाएगी&amp;rdquo;, लेकिन &lt;strong>यह गणितीय रूप से गलत है&lt;/strong>।&lt;/p>
&lt;p>रीमैन परिकल्पना का प्रमाण अपने आप में कोई जादुई एल्गोरिथ्म नहीं बना देगा जो तुरंत गुणनखंड को नाटकीय रूप से तेज कर दे। ऐसा इसलिए है क्योंकि रीमैन परिकल्पना केवल अभाज्य संख्याओं के &amp;ldquo;स्थूल वितरण की नियमितता&amp;rdquo; के बारे में एक प्रमेय है, और यह हमें सीधे यह नहीं बताती है कि एक व्यक्तिगत संख्या $N$ को किस अभाज्य संख्या से विभाजित किया जा सकता है (स्थानीय गुण)।&lt;/p>
&lt;p>हालाँकि, इसका प्रभाव शून्य नहीं है।
ऐसा इसलिए है क्योंकि यह अत्यधिक संभव है कि रीमैन परिकल्पना को सिद्ध करने की प्रक्रिया में &lt;strong>&amp;ldquo;नए गणितीय उपकरण&amp;rdquo; और &amp;ldquo;अज्ञात विश्लेषणात्मक तरीके&amp;rdquo; खोजे जाएंगे&lt;/strong>। इतिहास को देखते हुए, जब फर्मेट का अंतिम प्रमेय और पोइंकारे अनुमान सिद्ध हुए थे, तो इस प्रक्रिया में विकसित नए सिद्धांतों ने पूरे गणित को एक बड़ी छलांग दी थी।&lt;/p>
&lt;p>यदि बीजीय ज्यामिति या गैर-विनिमेय ज्यामिति के अज्ञात तरीके स्थापित हो जाते हैं जो रीमैन ज़ेटा फ़ंक्शन के शून्यों के गुणों को पूरी तरह से हेरफेर कर सकते हैं, तो इस संभावना से इंकार नहीं किया जा सकता है कि इससे एक ग्राउंडब्रेकिंग गुणनखंडन एल्गोरिथ्म (उदाहरण के लिए, एक शास्त्रीय एल्गोरिथ्म जो बहुपद समय में कम्प्यूटेशनल जटिलता को कम करता है) की खोज हो सकती है। इस अर्थ में, क्रिप्टोग्राफर कभी भी रीमैन परिकल्पना के घटनाक्रमों से अपनी आँखें नहीं हटा सकते हैं।&lt;/p>
&lt;h3 id="कवटम-कपयटर-और-शर-क-एलगरथम">क्वांटम कंप्यूटर और शोर का एल्गोरिथ्म
&lt;/h3>&lt;p>क्रिप्टोग्राफी के लिए एक अधिक प्रत्यक्ष और यथार्थवादी खतरा रीमैन परिकल्पना का प्रमाण नहीं है बल्कि &lt;strong>क्वांटम कंप्यूटर&lt;/strong> है। 1994 में पीटर शोर (Peter Shor) द्वारा प्रकाशित &amp;ldquo;शोर का एल्गोरिथ्म&amp;rdquo; ने साबित कर दिया कि यदि पर्याप्त प्रदर्शन वाला क्वांटम कंप्यूटर है, तो गुणनखंडन को बहुपद समय में हल किया जा सकता है। इससे RSA क्रिप्टोग्राफी और एलिप्टिक कर्व क्रिप्टोग्राफी मौलिक रूप से टूट जाएगी।&lt;/p>
&lt;p>वर्तमान में, दुनिया भर में &amp;ldquo;पोस्ट-क्वांटम क्रिप्टोग्राफी (Post-Quantum Cryptography, PQC)&amp;rdquo; (जैसे लैटिस-आधारित क्रिप्टोग्राफी) का संक्रमण चल रहा है जिसे क्वांटम कंप्यूटर भी डिक्रिप्ट नहीं कर सकते हैं। अभाज्य संख्याओं पर निर्भर क्रिप्टोग्राफ़िक तकनीकें एक मायने में अपने स्वर्ण युग को समाप्त कर रही हैं, लेकिन स्वयं अभाज्य संख्याओं का गणितीय मूल्य कभी नष्ट नहीं होगा।&lt;/p>
&lt;hr>
&lt;h1 id="9-नषकरष-गणत-क-अमरतकरण-और-वसतवक-समज-क-चरह">9. निष्कर्ष: गणित के अमूर्तीकरण और वास्तविक समाज का चौराहा
&lt;/h1>&lt;div class="mermaid">graph TD
A["शुद्ध गणित की खोज"] --> B["रीमैन परिकल्पना का स्पष्टीकरण"]
B --> C["अभाज्य वितरण की पूर्ण समझ"]
C --> D["संख्या सिद्धांत और बीजीय ज्यामिति में तेजी से विकास"]
D -.-> E["नए गुणनखंडन एल्गोरिदम की संभावना"]
E -.-> F["क्रिप्टोग्राफी के सुरक्षा मूल्यांकन का अद्यतन"]
A --> G["अनुप्रयुक्त गणित और कंप्यूटर विज्ञान"]
G --> H["प्राइमलिटी टेस्टिंग और कुंजी जनरेशन की दक्षता"]
H --> F&lt;/div>
&lt;p>प्राचीन ग्रीस से अभाज्य संख्याओं की अथक खोज को रीमैन नाम के एक जीनियस द्वारा सम्मिश्र तल (ज़ेटा फ़ंक्शन के शून्य) पर एक सुंदर सिम्फनी में बदल दिया गया था। और आश्चर्यजनक रूप से, सदियों बाद, शुद्ध गणित के उस क्रिस्टल को इंटरनेट समाज की सुरक्षा की गारंटी देने के लिए सबसे मजबूत ढाल के रूप में लागू किया जा रहा है।&lt;/p>
&lt;p>रीमैन परिकल्पना एक ही समय में गणित की &amp;ldquo;अमूर्त सुंदरता&amp;rdquo; और &amp;ldquo;भौतिक दुनिया और वास्तविक समाज के लिए इसकी आश्चर्यजनक प्रयोज्यता&amp;rdquo; का प्रतीक है।&lt;/p>
&lt;p>जब गणित के इस विशाल पर्वत पर अंततः विजय प्राप्त कर ली जाएगी, जिस पर अभी तक कोई नहीं पहुंच पाया है, तो हम अभाज्य संख्याओं की लौकिक सच्चाई को पूरी तरह से समझ लेंगे, और साथ ही सूचना समाज की नींव पर एक नया दृष्टिकोण प्राप्त करेंगे। क्रिप्टोग्राफी सीखना स्वयं मानवता के ज्ञान के इतिहास का पता लगाने की यात्रा है।&lt;/p></description></item><item><title>C++ में लागू तेज़ अभाज्य संख्या परीक्षण एल्गोरिदम (मिलर-राबिन आदि)</title><link>http://kenji.blog/hi/p/cpp-fast-prime-testing-miller-rabin/</link><pubDate>Fri, 11 Sep 2026 14:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/cpp-fast-prime-testing-miller-rabin/</guid><description>&lt;img src="http://kenji.blog/p/cpp-fast-prime-testing-miller-rabin/img/eyecatch.jpg" alt="Featured image of post C++ में लागू तेज़ अभाज्य संख्या परीक्षण एल्गोरिदम (मिलर-राबिन आदि)" />&lt;h1 id="परचय-हम-तज-अभजय-सखय-परकषण-क-आवशयकत-कय-ह">परिचय: हमें तेज़ अभाज्य संख्या परीक्षण की आवश्यकता क्यों है?
&lt;/h1>&lt;p>सूचना विज्ञान, क्रिप्टोग्राफी, और प्रतिस्पर्धात्मक प्रोग्रामिंग की दुनिया में, &amp;ldquo;क्या कोई दी गई संख्या अभाज्य है या नहीं&amp;rdquo; का तेज़ी से और सटीक रूप से परीक्षण करना एक अत्यंत महत्वपूर्ण और मौलिक कार्य है। उदाहरण के लिए, RSA जैसी सार्वजनिक-कुंजी क्रिप्टोग्राफी, जो आधुनिक इंटरनेट समाज की सुरक्षा को बनाए रखती है, बड़ी अभाज्य संख्याओं के निर्माण और उनके गुणन की कठिनाई (अभाज्य गुणनखंडन की कठिनाई) पर अपनी सुरक्षा के लिए निर्भर करती है। इसलिए, यह कहना अतिशयोक्ति नहीं होगी कि किसी विशाल संख्या के अभाज्य होने की तुरंत पहचान करने की तकनीक हमारी डिजिटल दुनिया की नींव का समर्थन करने वाली तकनीक है।&lt;/p>
&lt;p>इसके अलावा, प्रतिस्पर्धात्मक प्रोग्रामिंग (जैसे AtCoder और Codeforces) में अभाज्य संख्या परीक्षण एक लगातार आने वाला विषय है। ऐसे परिदृश्यों में जहाँ आपको 1 सेकंड के भीतर $N \le 10^{18}$ जैसे विशाल इनपुट बाधाओं के लिए हज़ारों बार अभाज्य परीक्षण करने होते हैं, पारंपरिक और सरल एल्गोरिदम पूरी तरह से विफल हो जाएंगे और समय सीमा पार (Time Limit Exceeded: TLE) हो जाएगी।&lt;/p>
&lt;p>इस लेख में, हम एक सरल अभाज्य परीक्षण एल्गोरिदम से शुरुआत करेंगे, संभाव्य अभाज्य परीक्षण पद्धति &amp;ldquo;फर्मेंट टेस्ट (Fermat Primality Test)&amp;rdquo; पर जाएंगे, और फिर &amp;ldquo;मिलर-राबिन (Miller-Rabin) अभाज्य परीक्षण पद्धति&amp;rdquo; को कवर करेंगे, जो एक व्यावहारिक रूप से शक्तिशाली और तेज़ एल्गोरिदम है जिसने फर्मेंट टेस्ट की कमजोरियों को दूर किया है। हम गणितीय पृष्ठभूमि से लेकर C++ में अत्यधिक अनुकूलित कार्यान्वयन तक सब कुछ विस्तार से समझाएंगे। विशेष रूप से, 64-बिट पूर्णांकों ($N &lt; 2^{64}$) के लिए, हम न केवल संभाव्य परीक्षण की व्याख्या करेंगे, बल्कि एक &amp;ldquo;नियतात्मक परीक्षण (Deterministic Test)&amp;rdquo; की भी व्याख्या करेंगे जो 100% निश्चितता के साथ अभाज्य परीक्षण कर सकता है, और अभ्यास में उपयोग के लिए तैयार C++ सोर्स कोड प्रदान करेंगे।&lt;/p>
&lt;hr>
&lt;h1 id="1-अभजय-परकषण-क-मल-बत-और-परकषण-वभजन-वध-trial-division">1. अभाज्य परीक्षण की मूल बातें और परीक्षण विभाजन विधि (Trial Division)
&lt;/h1>&lt;p>अभाज्य संख्या (Prime number) 2 या उससे बड़ी वह प्राकृत संख्या है जिसके 1 और स्वयं के अलावा कोई धनात्मक भाजक नहीं होते हैं। अभाज्य संख्या की परिभाषा का कड़ाई से पालन करते हुए, यह निर्धारित करने के लिए कि कोई पूर्णांक $N$ अभाज्य है या नहीं, हम $N$ को $2$ से $N-1$ तक के सभी पूर्णांकों से विभाजित करने का प्रयास कर सकते हैं। यदि यह किसी से भी विभाज्य नहीं है, तो यह एक अभाज्य संख्या है; यदि यह एक बार भी विभाज्य हो जाता है, तो इसे एक भाज्य संख्या (अभाज्य नहीं) माना जा सकता है।&lt;/p>
&lt;p>हालाँकि, इस पद्धति की समय जटिलता $O(N)$ है, और जब $N$ $10^{18}$ जैसी विशाल संख्या होती है, तो आधुनिक कंप्यूटरों को भी इसकी गणना करने में बहुत अधिक समय लगेगा।&lt;/p>
&lt;h2 id="परकषण-वभजन-क-अनकलन-sqrtn-तक-खजन">परीक्षण विभाजन का अनुकूलन: $\sqrt{N}$ तक खोजना
&lt;/h2>&lt;p>जब एक भाज्य संख्या $N$ को $a \times b = N$ ($a \le b$) के रूप में व्यक्त किया जाता है, तो यह हमेशा सत्य होता है कि $a \le \sqrt{N}$। इसलिए, अभाज्य परीक्षण लूप को $N-1$ तक चलाने की कोई आवश्यकता नहीं है; $\sqrt{N}$ तक जाँचना पर्याप्त है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// परीक्षण विभाजन विधि द्वारा अभाज्य परीक्षण (O(sqrt(N)))
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kt">bool&lt;/span> &lt;span class="nf">is_prime_trial_division&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// केवल 3 या उससे बड़ी विषम संख्याओं की जाँच करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इस एल्गोरिदम की समय जटिलता $O(\sqrt{N})$ है। यदि $N \le 10^{12}$ है, तो इसकी गणना तुरंत की जा सकती है। हालाँकि, जब $N \approx 10^{18}$ होता है, तो लूप पुनरावृत्तियों की संख्या लगभग $10^9$ हो जाती है। यहाँ तक कि C++ के साथ भी, इसमें सैकड़ों मिलीसेकंड से लेकर कुछ सेकंड तक का समय लगता है, जो इसे कई परीक्षणों के लिए अनुपयुक्त बनाता है।&lt;/p>
&lt;hr>
&lt;h1 id="2-फरमट-टसट-सभवय-अभजय-परकषण-क-शरआत">2. फर्मेंट टेस्ट: संभाव्य अभाज्य परीक्षण की शुरुआत
&lt;/h1>&lt;p>परीक्षण विभाजन विधि की सीमाओं को पार करने के लिए, संख्या सिद्धांत के प्रमेयों का उपयोग करके &amp;ldquo;संभाव्य एल्गोरिदम (Probabilistic Algorithm)&amp;rdquo; तैयार किए गए थे। इसका एक प्रमुख उदाहरण &amp;ldquo;फर्मेंट टेस्ट (Fermat Primality Test)&amp;rdquo; है, जो फर्मेंट के छोटे प्रमेय (Fermat&amp;rsquo;s Little Theorem) का उपयोग करता है।&lt;/p>
&lt;h2 id="फरमट-क-छट-परमय-fermats-little-theorem">फर्मेंट का छोटा प्रमेय (Fermat&amp;rsquo;s Little Theorem)
&lt;/h2>&lt;p>पियरे डी फर्मेंट (Pierre de Fermat) द्वारा खोजा गया यह प्रमेय निम्नलिखित बताता है:&lt;/p>
&lt;blockquote>
&lt;p>किसी भी अभाज्य संख्या $p$ और किसी भी पूर्णांक $a$ जो कि $p$ का गुणज नहीं है (अर्थात् $a$ और $p$ सह-अभाज्य हैं), के लिए निम्नलिखित सर्वांगसमता (congruence) लागू होती है:
&lt;/p>
$$ a^{p-1} \equiv 1 \pmod p $$
&lt;/blockquote>
&lt;p>इस प्रमेय का प्रतिधनात्मक (contrapositive) लेने पर, हम कह सकते हैं कि &amp;ldquo;यदि कोई पूर्णांक $N$ और एक पूर्णांक $a$ जो $N$ के साथ सह-अभाज्य है, ऐसा है कि $a^{N-1} \not\equiv 1 \pmod N$, तो $N$ निश्चित रूप से एक भाज्य संख्या है।&amp;rdquo; इस गुण का उपयोग करते हुए, फर्मेंट टेस्ट परीक्षण की जाने वाली संख्या $N$ के लिए एक यादृच्छिक आधार (base) $a$ चुनता है, $a^{N-1} \pmod N$ की गणना करता है, और जाँचता है कि क्या यह $1$ के बराबर है।&lt;/p>
&lt;h2 id="तज-मडयलर-एकसपनशएशन-बइनर-एकसपनशएशन">तेज़ मॉड्यूलर एक्सपोनेंशिएशन (बाइनरी एक्सपोनेंशिएशन)
&lt;/h2>&lt;p>फर्मेंट टेस्ट करने के लिए, हमें $a^{N-1} \pmod N$ की विशाल घात की तेज़ी से गणना करने की आवश्यकता है। इसके लिए, हम &amp;ldquo;बाइनरी एक्सपोनेंशिएशन (Modular Exponentiation / Binary Exponentiation)&amp;rdquo; का उपयोग करते हैं। इसकी समय जटिलता $O(\log N)$ है, जो बहुत तेज़ है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// बाइनरी एक्सपोनेंशिएशन का उपयोग करके a^b mod m की गणना
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="nf">mod_pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">res&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span> &lt;span class="o">%=&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">res&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">__int128_t&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">res&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">__int128_t&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">a&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">b&lt;/span> &lt;span class="o">&amp;gt;&amp;gt;=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">res&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>※ यहाँ, अतिप्रवाह (overflow) को रोकने के लिए, हम मध्यवर्ती गुणनफलों को बनाए रखने के लिए GCC/Clang एक्सटेंशन &lt;code>__int128_t&lt;/code> (128-बिट पूर्णांक) का उपयोग करते हैं।&lt;/p>
&lt;h2 id="छदम-अभजय-pseudoprimes-और-करमइकल-सखयए-carmichael-numbers">छद्म अभाज्य (Pseudoprimes) और कार्माइकल संख्याएँ (Carmichael Numbers)
&lt;/h2>&lt;p>फर्मेंट टेस्ट बहुत शक्तिशाली है, लेकिन इसकी एक बड़ी कमजोरी है। ऐसी संख्याएँ मौजूद हैं जहाँ $N$ एक भाज्य संख्या है, फिर भी सभी $a$ ($N$ के साथ सह-अभाज्य) के लिए $a^{N-1} \equiv 1 \pmod N$ सत्य होता है।&lt;/p>
&lt;p>ऐसी संख्याओं को &amp;ldquo;निरपेक्ष छद्म अभाज्य (Absolute Pseudoprimes)&amp;rdquo; या &amp;ldquo;कार्माइकल संख्याएँ (Carmichael Numbers)&amp;rdquo; कहा जाता है। सबसे छोटी कार्माइकल संख्या $561 = 3 \times 11 \times 17$ है।
कार्माइकल संख्याओं के अस्तित्व के कारण, अकेले फर्मेंट टेस्ट &amp;ldquo;100% संभाव्यता&amp;rdquo; के साथ नियतात्मक परीक्षण नहीं कर सकता है। आप कितने भी अलग-अलग $a$ आज़मा लें, $561$ जैसी संख्या हमेशा अभाज्य संख्या होने का नाटक करके आपको धोखा देगी।&lt;/p>
&lt;hr>
&lt;h1 id="3-मलर-रबन-अभजय-परकषण-miller-rabin-primality-test">3. मिलर-राबिन अभाज्य परीक्षण (Miller-Rabin Primality Test)
&lt;/h1>&lt;p>&amp;ldquo;मिलर-राबिन अभाज्य परीक्षण&amp;rdquo;, जिसे गैरी एल. मिलर (Gary L. Miller) और माइकल ओ. राबिन (Michael O. Rabin) द्वारा तैयार किया गया था, फर्मेंट टेस्ट की कमजोरी (कार्माइकल संख्याओं का अस्तित्व) को शानदार ढंग से पार करता है।
वर्तमान में, यह विभिन्न प्रोग्रामिंग भाषाओं की आंतरिक लाइब्रेरीज़ और क्रिप्टोग्राफ़िक प्रणालियों में कुंजी निर्माण के लिए एक व्यावहारिक, तेज़ अभाज्य परीक्षण एल्गोरिदम के रूप में सबसे व्यापक रूप से उपयोग किया जाता है।&lt;/p>
&lt;h2 id="गणतय-सदधत">गणितीय सिद्धांत
&lt;/h2>&lt;p>मिलर-राबिन एल्गोरिदम फर्मेंट के छोटे प्रमेय का उपयोग करता है, साथ ही इस गुण का भी कि &amp;ldquo;एक अभाज्य संख्या पर आधारित परिमित क्षेत्र ($\mathbb{Z}/p\mathbb{Z}$) में, $x^2 \equiv 1 \pmod p$ के समाधान केवल $x \equiv 1$ या $x \equiv -1$ तक ही सीमित हैं&amp;rdquo; (जब मापांक एक भाज्य संख्या है, तो अन्य गैर-तुच्छ वर्गमूल मौजूद हो सकते हैं)।&lt;/p>
&lt;p>जिस विषम संख्या $N$ का हम परीक्षण करना चाहते हैं, उसमें से $1$ घटाने पर $N-1$ हमेशा एक सम संख्या होगी। इसलिए, हम $N-1$ को $2$ से तब तक विभाजित करते हैं जब तक संभव हो, और इसे निम्न रूप में व्यक्त करते हैं:
&lt;/p>
$$ N-1 = d \cdot 2^s $$
&lt;p>
(जहाँ $d$ एक विषम संख्या है, और $s \ge 1$)&lt;/p>
&lt;p>किसी भी आधार $a$ ($1 &lt; a &lt; N-1$) के लिए, हम फर्मेंट के छोटे प्रमेय के अनुसार जाँचते हैं कि क्या $a^{N-1} \equiv 1 \pmod N$ है, लेकिन हम इस गणना को चरणों में करते हैं।
विशेष रूप से, हम बार-बार वर्ग करते हैं: $a^d, a^{d \cdot 2}, a^{d \cdot 4}, \ldots, a^{d \cdot 2^s}$ क्रम में।&lt;/p>
&lt;p>मिलर-राबिन परीक्षण $N$ को &amp;ldquo;एक अभाज्य&amp;rdquo; (या &amp;ldquo;प्रबल संभावना के साथ एक अभाज्य&amp;rdquo;) मानता है यदि निम्न स्थितियों में से &lt;strong>कोई भी&lt;/strong> सत्य है:&lt;/p>
&lt;ol>
&lt;li>$a^d \equiv 1 \pmod N$&lt;/li>
&lt;li>एक ऐसा $r$ ($0 \le r &lt; s$) मौजूद है जिसके लिए $a^{d \cdot 2^r} \equiv -1 \pmod N$ लागू होता है।
※ C++ में मॉड्यूलर अंकगणित में, $-1 \pmod N$, $N-1$ के बराबर होता है।&lt;/li>
&lt;/ol>
&lt;p>यदि $N$ एक अभाज्य संख्या है, तो यह स्थिति निश्चित रूप से किसी भी $a$ के लिए पूरी होगी। इसके विपरीत, यदि $N$ एक भाज्य संख्या है, तो गणितीय रूप से यह सिद्ध हो चुका है कि जब यादृच्छिक रूप से $a$ चुना जाता है, तो इस स्थिति के पूरा होने (धोखा खाने) की संभावना $\frac{1}{4}$ या उससे कम होती है।
यदि आप $k$ स्वतंत्र परीक्षण करते हैं, तो गलत सकारात्मक (false positive) की संभावना $\left(\frac{1}{4}\right)^k$ या उससे कम हो जाती है, जिसे व्यावहारिक रूप से शून्य माना जा सकता है। कार्माइकल संख्याओं जैसी कोई &amp;ldquo;ऐसी संख्याएँ नहीं हैं जो हमेशा धोखा दे सकें&amp;rdquo;।&lt;/p>
&lt;h2 id="मलर-रबन-एलगरदम-क-परवह-मरमड-फलचरट">मिलर-राबिन एल्गोरिदम का प्रवाह (मर्मेड फ़्लोचार्ट)
&lt;/h2>&lt;p>नीचे दिया गया आरेख मिलर-राबिन अभाज्य परीक्षण में एक एकल परीक्षण (एक आधार $a$ के लिए परीक्षण) के तार्किक प्रवाह को दर्शाता है।&lt;/p>
&lt;div class="mermaid">graph TD
Start["परीक्षण प्रारंभ (इनपुट: N, a)"] --> CalcDS["d (विषम) और s की गणना करें ताकि N-1 = d * 2^s हो"]
CalcDS --> CalcX["x = a^d mod N की गणना करें"]
CalcX --> CheckX1{"क्या x == 1 या x == N-1 ?"}
CheckX1 -- "हाँ" --> ReturnTrue["संभवतः अभाज्य (Probably Prime)"]
CheckX1 -- "नहीं" --> LoopStart["r = 1 से s-1 तक लूप प्रारंभ करें"]
LoopStart --> LoopCondition{"क्या r &lt; s ?"}
LoopCondition -- "नहीं" --> ReturnFalse["निश्चित रूप से भाज्य (Composite)"]
LoopCondition -- "हाँ" --> SquareX["x = (x * x) mod N की गणना करें"]
SquareX --> CheckXMinus1{"क्या x == N - 1 ?"}
CheckXMinus1 -- "हाँ" --> ReturnTrue
CheckXMinus1 -- "नहीं" --> CheckXOne{"क्या x == 1 ?"}
CheckXOne -- "हाँ" --> ReturnFalse
CheckXOne -- "नहीं" --> LoopNext["r को 1 बढ़ाएं और आगे बढ़ें"]
LoopNext --> LoopCondition&lt;/div>
&lt;hr>
&lt;h1 id="4-64-बट-परणक-क-लए-नयततमक-परकषण-deterministic-testing">4. 64-बिट पूर्णांकों के लिए नियतात्मक परीक्षण (Deterministic Testing)
&lt;/h1>&lt;p>मिलर-राबिन अभाज्य परीक्षण मूल रूप से एक &amp;ldquo;संभाव्य&amp;rdquo; एल्गोरिदम है, लेकिन यदि $N$ की ऊपरी सीमा तय है, तो आप विशिष्ट $a$ (आधार) के सेट का परीक्षण करके &amp;ldquo;100% निश्चितता&amp;rdquo; के साथ अभाज्य परीक्षण कर सकते हैं।
इसे &lt;strong>नियतात्मक मिलर-राबिन परीक्षण (Deterministic Miller-Rabin Test)&lt;/strong> कहा जाता है।&lt;/p>
&lt;p>जिम सिंक्लेयर (Jim Sinclair) और अन्य लोगों के शोध से पता चला है कि $N &lt; 2^{64}$ (लगभग $1.8 \times 10^{19}$) के सभी पूर्णांकों के लिए, आधार $a$ के रूप में निम्नलिखित $7$ अभाज्य संख्याओं का परीक्षण करना एक पूर्ण और पूरी तरह से नियतात्मक निर्णय लेने के लिए पर्याप्त है।&lt;/p>
&lt;p>&lt;strong>परीक्षण किए जाने वाले आधार $a$ की सूची:&lt;/strong>
&lt;code>{2, 325, 9375, 28178, 450775, 9780504, 1795265022}&lt;/code>&lt;/p>
&lt;p>वैकल्पिक रूप से, एक अन्य प्रसिद्ध सेट के रूप में, निम्नलिखित $12$ अभाज्य संख्याओं का उपयोग करना भी $N &lt; 2^{64}$ से नीचे के परीक्षणों के लिए पूरी तरह से काम करता है।
&lt;code>{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37}&lt;/code>&lt;/p>
&lt;p>इस बार, एल्गोरिदम की सादगी और विश्वसनीयता में सुधार करने के लिए, हम एक ऐसा दृष्टिकोण अपनाएंगे जो आधार के रूप में बाद की $12$ अभाज्य संख्याओं (या अधिक अनुकूलित $7$ आधारों) का उपयोग करता है। C++ कार्यान्वयन में, हम सशर्त शाखाओं के साथ श्रेणियों को विभाजित करके परीक्षणों की संख्या को कम करने के लिए इसे अनुकूलित करेंगे।&lt;/p>
&lt;hr>
&lt;h1 id="5-c-क-सथ-अतयधक-अनकलत-करयनवयन-highly-optimized-c-implementation">5. C++ के साथ अत्यधिक अनुकूलित कार्यान्वयन (Highly Optimized C++ Implementation)
&lt;/h1>&lt;p>अब, चलिए अब तक के गणितीय सिद्धांत और एल्गोरिदम डिज़ाइन को संकलित करते हैं, और आधुनिक C++ में उच्चतम स्तर के मिलर-राबिन अभाज्य परीक्षण फ़ंक्शन के कार्यान्वयन कोड को प्रस्तुत करते हैं।&lt;/p>
&lt;h2 id="करयनवयन-क-मखय-बद">कार्यान्वयन के मुख्य बिंदु
&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>64-बिट पूर्णांक गुणन में अतिप्रवाह से बचना:&lt;/strong>
जब $N \approx 10^{18}$, मॉड्यूलर गुणन में $x \times x$ अधिकतम $10^{36}$ तक पहुँच सकता है, जो सामान्य 64-बिट पूर्णांकों (&lt;code>uint64_t&lt;/code> या &lt;code>long long&lt;/code>) के अधिकतम मान $1.8 \times 10^{19}$ को आसानी से पार कर जाएगा।
इस समस्या को हल करने के लिए, हम GCC और Clang एक्सटेंशन प्रकार &lt;code>__int128_t&lt;/code> (या &lt;code>unsigned __int128&lt;/code>) का उपयोग करते हैं ताकि 128-बिट सटीकता के साथ गणना की जा सके और फिर मॉड्यूलो लिया जा सके। यह बिना जटिल एल्गोरिदम के तेज़ मॉड्यूलर गुणन को संभव बनाता है।&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>नियतात्मक आधारों का चयन:&lt;/strong>
जब $N$ का मान छोटा होता है, तो हम इसे अनुकूलित करते हैं ताकि हमें केवल कुछ आधारों का परीक्षण करना पड़े।&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h2 id="सपरण-c-सरस-कड">संपूर्ण C++ सोर्स कोड
&lt;/h2>&lt;p>नीचे उत्पादन के लिए तैयार संपूर्ण सोर्स कोड दिया गया है। आप इस कोड को सीधे कॉपी करके प्रतिस्पर्धात्मक प्रोग्रामिंग जैसे वातावरण में उपयोग कर सकते हैं।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;span class="lnt">55
&lt;/span>&lt;span class="lnt">56
&lt;/span>&lt;span class="lnt">57
&lt;/span>&lt;span class="lnt">58
&lt;/span>&lt;span class="lnt">59
&lt;/span>&lt;span class="lnt">60
&lt;/span>&lt;span class="lnt">61
&lt;/span>&lt;span class="lnt">62
&lt;/span>&lt;span class="lnt">63
&lt;/span>&lt;span class="lnt">64
&lt;/span>&lt;span class="lnt">65
&lt;/span>&lt;span class="lnt">66
&lt;/span>&lt;span class="lnt">67
&lt;/span>&lt;span class="lnt">68
&lt;/span>&lt;span class="lnt">69
&lt;/span>&lt;span class="lnt">70
&lt;/span>&lt;span class="lnt">71
&lt;/span>&lt;span class="lnt">72
&lt;/span>&lt;span class="lnt">73
&lt;/span>&lt;span class="lnt">74
&lt;/span>&lt;span class="lnt">75
&lt;/span>&lt;span class="lnt">76
&lt;/span>&lt;span class="lnt">77
&lt;/span>&lt;span class="lnt">78
&lt;/span>&lt;span class="lnt">79
&lt;/span>&lt;span class="lnt">80
&lt;/span>&lt;span class="lnt">81
&lt;/span>&lt;span class="lnt">82
&lt;/span>&lt;span class="lnt">83
&lt;/span>&lt;span class="lnt">84
&lt;/span>&lt;span class="lnt">85
&lt;/span>&lt;span class="lnt">86
&lt;/span>&lt;span class="lnt">87
&lt;/span>&lt;span class="lnt">88
&lt;/span>&lt;span class="lnt">89
&lt;/span>&lt;span class="lnt">90
&lt;/span>&lt;span class="lnt">91
&lt;/span>&lt;span class="lnt">92
&lt;/span>&lt;span class="lnt">93
&lt;/span>&lt;span class="lnt">94
&lt;/span>&lt;span class="lnt">95
&lt;/span>&lt;span class="lnt">96
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;vector&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;cstdint&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;initializer_list&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="k">namespace&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 128-बिट पूर्णांक का उपयोग करके तेज़ (a * b) mod m
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kr">inline&lt;/span> &lt;span class="kt">uint64_t&lt;/span> &lt;span class="nf">mod_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">uint64_t&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">uint64_t&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">uint64_t&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">uint64_t&lt;/span>&lt;span class="p">)((&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="n">__int128&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">a&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// बाइनरी एक्सपोनेंशिएशन द्वारा (base^exp) mod m की गणना
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kt">uint64_t&lt;/span> &lt;span class="nf">mod_pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">uint64_t&lt;/span> &lt;span class="n">base&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">uint64_t&lt;/span> &lt;span class="n">exp&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">uint64_t&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint64_t&lt;/span> &lt;span class="n">res&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">base&lt;/span> &lt;span class="o">%=&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">exp&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">exp&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">res&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">res&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">base&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">base&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">base&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">base&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exp&lt;/span> &lt;span class="o">&amp;gt;&amp;gt;=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">res&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// मिलर-राबिन अभाज्य परीक्षण द्वारा 64-बिट पूर्णांकों का नियतात्मक परीक्षण
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kt">bool&lt;/span> &lt;span class="nf">is_prime_miller_rabin&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">uint64_t&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// सीमा मानों और छोटी अभाज्य संख्याओं की पूर्व-जाँच
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">3&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">5&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">3&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">5&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">7&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// n-1 को d * 2^s के रूप में विघटित करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint64_t&lt;/span> &lt;span class="n">d&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">s&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="p">((&lt;/span>&lt;span class="n">d&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d&lt;/span> &lt;span class="o">&amp;gt;&amp;gt;=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">s&lt;/span>&lt;span class="o">++&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// परीक्षण के लिए उपयोग किए जाने वाले आधारों (bases) की सूची
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// N के आकार के अनुसार परीक्षण किए जाने वाले आधारों की संख्या को कम करने के लिए अनुकूलन
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">uint64_t&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">bases&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">4759123141ULL&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bases&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">61&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">1122004669633ULL&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bases&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">13&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">23&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1662803&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// N &amp;lt; 2^64 की सभी संख्याओं के लिए नियतात्मक होने वाले 7 आधार
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">bases&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">325&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">9375&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">28178&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">450775&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">9780504&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1795265022&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// प्रत्येक आधार के लिए परीक्षण चलाएँ
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">uint64_t&lt;/span> &lt;span class="nl">a&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="n">bases&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span> &lt;span class="o">%=&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">continue&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// यदि a, n का गुणज है, तो परीक्षण अनिश्चित है, लेकिन यह अभाज्य नहीं है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint64_t&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod_pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">continue&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// पहली शर्त पूरी हो गई, अगले आधार पर जाएँ
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">bool&lt;/span> &lt;span class="n">composite&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// s-1 बार लूप करें (x = x^2 mod n)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">s&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="o">++&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">composite&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// दूसरी शर्त पूरी हो गई, अभाज्य होने की संभावना है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">break&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// यदि कोई भी शर्त पूरी नहीं होती है, तो यह निश्चित रूप से भाज्य है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">composite&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// यदि सभी आधारों के लिए शर्तें पूरी हो जाती हैं, तो यह निश्चित रूप से अभाज्य है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// परीक्षण के लिए नमूने
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">uint64_t&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">test_cases&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">1000000007&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">// प्रसिद्ध अभाज्य संख्या
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="mi">998244353&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">// प्रसिद्ध अभाज्य संख्या
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="mi">1000000000000000003&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">// 10^18 के आसपास अभाज्य संख्या
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="mi">1000000000000000007&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">// भाज्य संख्या (10^18 + 7)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="mi">561&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">// कार्माइकल संख्या (भाज्य)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="mi">18446744073709551557ULL&lt;/span> &lt;span class="c1">// 2^64 के आसपास की सबसे बड़ी अभाज्य संख्याओं में से एक
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">uint64_t&lt;/span> &lt;span class="nl">n&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="n">test_cases&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; is &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">is_prime_miller_rabin&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="s">&amp;#34;Prime&amp;#34;&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="s">&amp;#34;Composite&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h1 id="6-एलगरदम-समय-जटलत-और-परदरशन-मलयकन">6. एल्गोरिदम समय जटिलता और प्रदर्शन मूल्यांकन
&lt;/h1>&lt;p>आइए हमारे द्वारा कार्यान्वित किए गए एल्गोरिदम के प्रदर्शन पर विचार करें।&lt;/p>
&lt;h2 id="समय-जटलत-time-complexity">समय जटिलता (Time Complexity)
&lt;/h2>&lt;ul>
&lt;li>&lt;strong>परीक्षण विभाजन विधि:&lt;/strong> $O(\sqrt{N})$&lt;/li>
&lt;li>&lt;strong>फर्मेंट टेस्ट:&lt;/strong> घातांक की गणना $O(\log N) \times k$ ($k$ परीक्षणों की संख्या है)&lt;/li>
&lt;li>&lt;strong>मिलर-राबिन विधि:&lt;/strong> घातांक और लूप की गणना $O(\log N) \times k$&lt;/li>
&lt;/ul>
&lt;p>64-बिट वातावरण ($N \le 2^{64}$) में, ऊपर दी गई नियतात्मक मिलर-राबिन विधि अधिकतम केवल $7$ आधारों की पुष्टि करती है। इसलिए, $k \le 7$ को एक स्थिरांक माना जा सकता है, और समग्र समय जटिलता सख्ती से $O(\log N)$ बन जाती है।
यहाँ तक कि अधिकतम मामले ($N \approx 10^{19}$) में भी, निष्पादन के चरणों की संख्या अधिकतम $7 \times 64 = 448$ बुनियादी परिचालनों के भीतर रहती है, और निष्पादन का समय कुछ माइक्रोसेकंड ($10^{-6}$ सेकंड) या उससे कम है। परीक्षण विभाजन विधि की $O(\sqrt{N})$ (लूप पुनरावृत्तियाँ $\approx 4 \times 10^9$ बार) की तुलना में, &lt;strong>लाखों गुना की गति में वृद्धि&lt;/strong> प्राप्त की गई है।&lt;/p>
&lt;h2 id="आग-क-अनकलन-मटगमर-गणन-montgomery-multiplication">आगे का अनुकूलन: मोंटगोमरी गुणन (Montgomery Multiplication)
&lt;/h2>&lt;p>इस लेख के कार्यान्वयन में, हम विभाजन (मॉड्यूलो ऑपरेशन &lt;code>%&lt;/code>) करने के लिए 128-बिट पूर्णांक एक्सटेंशन प्रकार &lt;code>__int128_t&lt;/code> का उपयोग कर रहे हैं। यहाँ तक कि आधुनिक CPU में भी, पूर्णांक विभाजन (DIV निर्देश) एक महँगा निर्देश है जिसमें जोड़ या गुणा की तुलना में दर्जनों चक्र लगते हैं।&lt;/p>
&lt;p>लाइब्रेरी निर्माता और प्रतिस्पर्धी प्रोग्रामर जो और भी अधिक चरम अनुकूलन चाहते हैं, वे कभी-कभी &lt;strong>मोंटगोमरी गुणन (Montgomery Multiplication)&lt;/strong> नामक एक तकनीक अपनाते हैं। मोंटगोमरी गुणन एक अद्भुत एल्गोरिदम है जो संख्याओं को एक विशेष &amp;ldquo;मोंटगोमरी स्पेस&amp;rdquo; में मैप करके महँगे मॉड्यूलर ऑपरेशन्स (विभाजन) को &amp;ldquo;केवल बिट शिफ्ट्स और गुणन&amp;rdquo; से बदल देता है।
इसे मिलर-राबिन परीक्षण के मॉड्यूलर गुणन में शामिल करके, निष्पादन की गति को 2 से 3 गुना और बढ़ाया जा सकता है। चूँकि यह बहुत ही गहरा विषय है, मैं इसे किसी अन्य लेख में विस्तार से समझाना चाहूँगा।&lt;/p>
&lt;hr>
&lt;h1 id="7-नषकरष">7. निष्कर्ष
&lt;/h1>&lt;p>इस लेख में, हमने एक ही बार में अभाज्य परीक्षण की मूल बातों से लेकर उन्नत विषयों तक सब कुछ समझाया है।
आइए मुख्य बिंदुओं को दोहराते हैं:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>परीक्षण विभाजन विधि (Trial Division)&lt;/strong> निश्चित है, लेकिन इसकी समय जटिलता $O(\sqrt{N})$ है, जो $N$ के $10^{12}$ से अधिक होने पर इसे अव्यावहारिक बना देती है।&lt;/li>
&lt;li>&lt;strong>फर्मेंट टेस्ट&lt;/strong> बहुत तेज़ है, $O(\log N)$, लेकिन इसकी एक बड़ी कमजोरी है कि यह कार्माइकल संख्याओं जैसे निरपेक्ष छद्म अभाज्यों से धोखा खा जाता है।&lt;/li>
&lt;li>&lt;strong>मिलर-राबिन अभाज्य परीक्षण&lt;/strong> एक व्यावहारिक और बहुत शक्तिशाली एल्गोरिदम है जो फर्मेंट टेस्ट की कमजोरी को दूर करता है।&lt;/li>
&lt;li>C++ कार्यान्वयन में, &lt;code>__int128_t&lt;/code> का उपयोग 64-बिट पूर्णांक गुणन अतिप्रवाह को सुरक्षित रूप से संभालने की अनुमति देता है।&lt;/li>
&lt;li>64-बिट पूर्णांक सीमा ($N &lt; 2^{64}$) के भीतर, आधार के रूप में $7$ या $12$ विशिष्ट अभाज्य संख्याओं का चयन करके, संभाव्य के बजाय &lt;strong>नियतात्मक रूप से (100% सटीक) अभाज्य परीक्षण करना संभव है&lt;/strong>।&lt;/li>
&lt;/ol>
&lt;p>बड़ी संख्याओं से जुड़ी गणनाओं में तेज़ अभाज्य परीक्षण एक अपरिहार्य तकनीक है। इस लेख में दिया गया C++ मिलर-राबिन सोर्स कोड मज़बूत है और इसे अभ्यास में उसी तरह उपयोग किया जा सकता है। कृपया बेझिझक इसे अपनी स्वयं की परियोजनाओं या एल्गोरिदम प्रतियोगिताओं में उपयोग करें।&lt;/p>
&lt;div class="mermaid">graph LR
TrialDivision["परीक्षण विभाजन विधि (O(√N))"] --> Fermat["फर्मेंट टेस्ट (O(log N), कमजोरियाँ हैं)"]
Fermat --> MillerRabin["मिलर-राबिन विधि (O(log N), नियतात्मक बनाया जा सकता है)"]
MillerRabin --> Montgomery["+ मोंटगोमरी गुणन (स्थिरांक-गुणक गति वृद्धि)"]
style MillerRabin fill:#f9f,stroke:#333,stroke-width:2px&lt;/div>
&lt;p>एल्गोरिदम की दुनिया, जहाँ प्रोग्रामिंग और गणित प्रतिच्छेद करते हैं, बहुत सुंदर और गहरी है। मुझे आशा है कि यह लेख आपके भविष्य के अध्ययन में मदद करेगा।&lt;/p>
&lt;hr>
&lt;p>&lt;em>Reference:&lt;/em>&lt;/p>
&lt;ul>
&lt;li>&lt;em>Pomerance, C., Selfridge, J. L., &amp;amp; Wagstaff, S. S. (1980). The pseudoprimes to 25.10^9. Mathematics of Computation.&lt;/em>&lt;/li>
&lt;li>&lt;em>Sinclair, J. (2011). Deterministic Miller-Rabin primality testing.&lt;/em>&lt;/li>
&lt;/ul></description></item><item><title>【गणित व्याख्या】 हाई स्कूल के छात्रों के लिए RSA एन्क्रिप्शन तंत्र की सरल व्याख्या</title><link>http://kenji.blog/hi/p/rsa-encryption-math-explained-for-beginners/</link><pubDate>Fri, 11 Sep 2026 13:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/rsa-encryption-math-explained-for-beginners/</guid><description>&lt;img src="http://kenji.blog/p/rsa-encryption-math-explained-for-beginners/img/eyecatch.jpg" alt="Featured image of post 【गणित व्याख्या】 हाई स्कूल के छात्रों के लिए RSA एन्क्रिप्शन तंत्र की सरल व्याख्या" />&lt;p>इंटरनेट समाज की सुरक्षा को बुनियादी रूप से समर्थन देने वाली तकनीकों में से एक &amp;ldquo;RSA एन्क्रिप्शन&amp;rdquo; है। ऑनलाइन शॉपिंग में क्रेडिट कार्ड से भुगतान, दोस्तों के साथ सोशल मीडिया पर बातचीत, कंपनी की गोपनीय जानकारी का आदान-प्रदान, आदि—जिन संचारों का हम प्रतिदिन जाने-अनजाने उपयोग करते हैं, उनमें से अधिकांश इस RSA एन्क्रिप्शन या इसकी उत्तराधिकारी तकनीकों द्वारा सुरक्षित होते हैं।&lt;/p>
&lt;p>हालाँकि, &amp;ldquo;एन्क्रिप्शन&amp;rdquo; शब्द सुनकर आप शायद जासूसी फिल्मों में दिखने वाली जटिल एन्क्रिप्शन मशीनों या अति-उन्नत गणित की कल्पना करें जिसे केवल कुछ प्रतिभाशाली लोग ही समझ सकते हैं। यह सच है कि आधुनिक एन्क्रिप्शन सिद्धांत उन्नत गणित पर आधारित है, लेकिन &lt;strong>RSA एन्क्रिप्शन का मूल तंत्र इतना सरल है कि यदि आपको हाई स्कूल के गणित (पूर्णांकों के गुण, अभाज्य संख्याएँ, सर्वांगसमता आदि) का ज्ञान है, तो आप इसे पूरी तरह से समझ सकते हैं।&lt;/strong>&lt;/p>
&lt;p>इस लेख में, हम हाई स्कूल के गणितीय ज्ञान को शुरुआती बिंदु मानते हुए, चरण-दर-चरण विस्तार से बताएंगे कि RSA एन्क्रिप्शन किस गणितीय सिद्धांत पर काम करता है और इसे डिक्रिप्ट करना इतना कठिन क्यों है। जो लोग गणित में थोड़े कमज़ोर हैं, उन्हें भी समझ में आ सके, इसके लिए हम ठोस उदाहरणों के साथ इसे स्पष्ट रूप से समझाएंगे।&lt;/p>
&lt;hr>
&lt;h2 id="1-सममत-कज-एनकरपशन-और-सरवजनक-कज-एनकरपशन">1. सममित कुंजी एन्क्रिप्शन और सार्वजनिक कुंजी एन्क्रिप्शन
&lt;/h2>&lt;p>RSA एन्क्रिप्शन के गणितीय तंत्र में जाने से पहले, आइए एन्क्रिप्शन की बुनियादी अवधारणाओं को समझ लें। एन्क्रिप्शन विधियों को मोटे तौर पर दो प्रकारों में बांटा जा सकता है: &amp;ldquo;सममित कुंजी एन्क्रिप्शन&amp;rdquo; और &amp;ldquo;सार्वजनिक कुंजी एन्क्रिप्शन&amp;rdquo;।&lt;/p>
&lt;h3 id="11-सममत-कज-एनकरपशन-परणल-क-समए">1.1 सममित कुंजी एन्क्रिप्शन प्रणाली की सीमाएँ
&lt;/h3>&lt;p>प्राचीन काल से उपयोग की जाने वाली अधिकांश एन्क्रिप्शन प्रणालियाँ &amp;ldquo;सममित कुंजी एन्क्रिप्शन प्रणाली&amp;rdquo; कहलाती हैं। यह एक ऐसी प्रणाली है जिसमें &lt;strong>&amp;ldquo;एन्क्रिप्शन (संदेश को गुप्त सिफरटेक्स्ट में बदलना)&amp;rdquo; और &amp;ldquo;डिक्रिप्शन (सिफरटेक्स्ट को मूल संदेश में वापस लाना)&amp;rdquo; के लिए एक ही कुंजी का उपयोग किया जाता है।&lt;/strong>&lt;/p>
&lt;p>उदाहरण के लिए, मान लें कि ऐलिस, बॉब को एक गुप्त पत्र भेजना चाहती है। ऐलिस एक पैडलॉक (सममित कुंजी) का उपयोग करके पत्र को एक बक्से में बंद कर देती है। बॉब को उस बक्से को खोलने के लिए उसी कुंजी की आवश्यकता होगी जिसका ऐलिस ने उपयोग किया था।&lt;/p>
&lt;p>इस प्रणाली में एक बड़ी समस्या है: &amp;ldquo;कुंजी वितरण समस्या&amp;rdquo;। जब दूर बैठे ऐलिस और बॉब पहली बार संवाद करते हैं, तो वे बिना किसी के द्वारा सुने गए कुंजी को कैसे साझा कर सकते हैं? यदि मेल द्वारा भेजे जाते समय किसी तीसरे पक्ष द्वारा कुंजी चुरा ली जाती है, तो उसके बाद के सभी एन्क्रिप्टेड संचार लीक हो जाएंगे।&lt;/p>
&lt;h3 id="12-एक-करतकर-आवषकर-सरवजनक-कज-एनकरपशन-परणल">1.2 एक क्रांतिकारी आविष्कार: &amp;ldquo;सार्वजनिक कुंजी एन्क्रिप्शन प्रणाली&amp;rdquo;
&lt;/h3>&lt;p>कुंजी वितरण की इस समस्या को हल करने के लिए &amp;ldquo;सार्वजनिक कुंजी एन्क्रिप्शन प्रणाली&amp;rdquo; का आविष्कार किया गया था। RSA एन्क्रिप्शन भी इसी का एक प्रकार है।&lt;/p>
&lt;p>सार्वजनिक कुंजी एन्क्रिप्शन प्रणाली में, &lt;strong>&amp;ldquo;एन्क्रिप्ट करने के लिए कुंजी (सार्वजनिक कुंजी)&amp;rdquo; और &amp;ldquo;डिक्रिप्ट करने के लिए कुंजी (निजी कुंजी)&amp;rdquo; नामक दो अलग-अलग कुंजियों&lt;/strong> का उपयोग किया जाता है।&lt;/p>
&lt;ol>
&lt;li>प्राप्तकर्ता बॉब &amp;ldquo;सार्वजनिक कुंजी&amp;rdquo; और &amp;ldquo;निजी कुंजी&amp;rdquo; का एक जोड़ा बनाता है।&lt;/li>
&lt;li>बॉब &amp;ldquo;सार्वजनिक कुंजी&amp;rdquo; को दुनिया भर में प्रकाशित करता है (कोई भी इसे प्राप्त कर सकता है)।&lt;/li>
&lt;li>प्रेषक ऐलिस, बॉब की &amp;ldquo;सार्वजनिक कुंजी&amp;rdquo; का उपयोग करके संदेश को एन्क्रिप्ट करती है और उसे भेज देती है।&lt;/li>
&lt;li>एन्क्रिप्टेड संदेश को केवल &amp;ldquo;निजी कुंजी&amp;rdquo; से ही डिक्रिप्ट किया जा सकता है जो केवल बॉब के पास है।&lt;/li>
&lt;/ol>
&lt;p>यदि इसे पैडलॉक से समझा जाए, तो बॉब बहुत सारे &amp;ldquo;खुले हुए पैडलॉक (सार्वजनिक कुंजी)&amp;rdquo; बनाता है और उन्हें दुनिया भर में बाँट देता है। ऐलिस बॉब के लिए संदेश को बक्से में डालती है, और बॉब का जो पैडलॉक उसे मिला है, उससे बक्से को बंद कर देती है। एक बार ताला बंद हो जाने के बाद, इसे केवल &amp;ldquo;मास्टर कुंजी (निजी कुंजी)&amp;rdquo; से ही खोला जा सकता है जो बॉब के पास है। भले ही कोई बीच में बक्सा चुरा ले, वह उसे नहीं खोल सकता क्योंकि उसके पास मास्टर कुंजी नहीं है।&lt;/p>
&lt;div class="mermaid">graph TD
A["ऐलिस (प्रेषक)"] --> B["प्लेनटेक्स्ट (संदेश)"]
B --> C["एन्क्रिप्शन प्रक्रिया"]
D["बॉब की सार्वजनिक कुंजी (कोई भी प्राप्त कर सकता है)"] --> C
C --> E["इंटरनेट के माध्यम से भेजा गया: सिफरटेक्स्ट (एन्क्रिप्टेड)"]
E --> F["डिक्रिप्शन प्रक्रिया"]
G["बॉब की निजी कुंजी (केवल बॉब के पास)"] --> F
F --> H["पुनर्प्राप्त प्लेनटेक्स्ट (संदेश)"]
H --> I["बॉब (प्राप्तकर्ता)"]&lt;/div>
&lt;p>इस क्रांतिकारी प्रणाली को साकार करने के लिए, किसी प्रकार के &lt;strong>&amp;ldquo;एक-तरफ़ा फ़ंक्शन (वन-वे गणितीय पहेली)&amp;rdquo;&lt;/strong> की आवश्यकता होती है, जिसका अर्थ है कि सार्वजनिक कुंजी के साथ एन्क्रिप्ट करना आसान है, लेकिन निजी कुंजी के बिना इसे डिक्रिप्ट करना बिल्कुल असंभव है। उस पहेली के हिस्से के रूप में जिस चीज़ पर ध्यान दिया गया, वह हमारी परिचित &amp;ldquo;अभाज्य संख्याएँ&amp;rdquo; थीं।&lt;/p>
&lt;hr>
&lt;h2 id="2-rsa-एनकरपशन-क-समरथन-करन-वल-गणतय-आधर-1-अभजय-सखयए-और-अभजय-गणनखडन">2. RSA एन्क्रिप्शन का समर्थन करने वाला गणितीय आधार 1: अभाज्य संख्याएँ और अभाज्य गुणनखंडन
&lt;/h2>&lt;p>RSA एन्क्रिप्शन की सुरक्षा इस गणितीय तथ्य पर आधारित है कि &lt;strong>&amp;ldquo;विशाल संख्याओं का अभाज्य गुणनखंडन करना बहुत कठिन है।&amp;rdquo;&lt;/strong>&lt;/p>
&lt;h3 id="21-अभजय-सखयए-कय-ह">2.1 अभाज्य संख्याएँ क्या हैं?
&lt;/h3>&lt;p>अभाज्य संख्याएँ वे &amp;ldquo;1 से बड़ी प्राकृत संख्याएँ हैं जो केवल 1 और स्वयं से विभाज्य हैं।&amp;rdquo;
उदाहरण: $2, 3, 5, 7, 11, 13, 17, 19, 23...$&lt;/p>
&lt;p>अभाज्य संख्याएँ सभी पूर्णांकों के &amp;ldquo;परमाणुओं&amp;rdquo; की तरह हैं। किसी भी प्राकृत संख्या को अभाज्य संख्याओं के गुणा के रूप में तोड़ा जा सकता है। इसे &lt;strong>अभाज्य गुणनखंडन&lt;/strong> कहा जाता है। उदाहरण के लिए, $60 = 2^2 \times 3 \times 5$, यह सर्वविदित है कि यदि हम क्रम को अनदेखा करें तो गुणनखंडन केवल एक ही अद्वितीय तरीके से किया जा सकता है (अंकगणित का मूलभूत प्रमेय)।&lt;/p>
&lt;h3 id="22-अभजय-गणनखडन-क-कठनई-एक-तरफ-फकशन">2.2 अभाज्य गुणनखंडन की कठिनाई (एक-तरफ़ा फ़ंक्शन)
&lt;/h3>&lt;p>यहाँ जो बात महत्वपूर्ण है वह है विषमता: &lt;strong>&amp;ldquo;गुणा करना आसान है, लेकिन अभाज्य गुणनखंडन करना कठिन है।&amp;rdquo;&lt;/strong>&lt;/p>
&lt;p>उदाहरण के लिए, निम्नलिखित दो अभाज्य संख्याओं के गुणनफल की गणना अपने दिमाग में करने का प्रयास करें।
$11 \times 13 = ?$
यह आसान है। उत्तर $143$ है।&lt;/p>
&lt;p>तो, इस संख्या के बारे में क्या खयाल है?
$323$ का अभाज्य गुणनखंडन करें।
कैसा लगा? इसमें थोड़ा समय लगना चाहिए। (उत्तर $17 \times 19$ है)।&lt;/p>
&lt;p>यदि संख्याएँ छोटी हैं, तो मनुष्य भी किसी तरह गणना कर सकते हैं, लेकिन जब संख्याएँ बड़ी हो जाती हैं, Math तो कंप्यूटर का उपयोग करने पर भी गणना अत्यधिक कठिन हो जाती है। वर्तमान में मुख्यधारा के RSA एन्क्रिप्शन में, हम एक संख्या $N = p \times q$ का उपयोग करते हैं, जो दो अविश्वसनीय रूप से विशाल अभाज्य संख्याओं $p$ और $q$ को गुणा करके बनती है, जो 2048 बिट्स (दशमलव में लगभग 600 अंक) की होती हैं।&lt;/p>
&lt;p>दिए गए दो विशाल अभाज्य संख्याओं $p$ और $q$ के लिए, $N$ की गणना करना कंप्यूटर के लिए पल भर (मिलीसेकंड से भी कम) का काम है। हालाँकि, यदि केवल $N$ दिया गया हो, तो मूल $p$ और $q$ को वापस खोजना इतना समय लेने वाला है कि इसे वर्तमान के सबसे तेज़ सुपरकंप्यूटरों का उपयोग करके भी खरबों वर्षों में हल नहीं किया जा सकता।&lt;/p>
&lt;p>यही &lt;strong>&amp;ldquo;कम्प्यूटेशनल विषमता (एक तरफा आसान, दूसरी तरफा कठिन)&amp;rdquo;&lt;/strong> सार्वजनिक कुंजी और निजी कुंजी के बीच संबंध बनाने की नींव बनाती है।&lt;/p>
&lt;hr>
&lt;h2 id="3-rsa-एनकरपशन-क-समरथन-करन-वल-गणतय-आधर-2-सरवगसमत-मडयलर-अकगणत">3. RSA एन्क्रिप्शन का समर्थन करने वाला गणितीय आधार 2: सर्वांगसमता (मॉड्यूलर अंकगणित)
&lt;/h2>&lt;p>RSA एन्क्रिप्शन में गणना साधारण जोड़ या गुणा की तरह नहीं होती जहाँ संख्याएँ अनंत रूप से बड़ी हो जाती हैं, बल्कि यह किसी संख्या से विभाजित करने पर बचे &amp;ldquo;शेषफल&amp;rdquo; की दुनिया में होती है। इसे &lt;strong>सर्वांगसमता (मॉड्यूलर अंकगणित)&lt;/strong> कहा जाता है।&lt;/p>
&lt;h3 id="31-घड-क-गणत">3.1 घड़ी का गणित
&lt;/h3>&lt;p>मॉड्यूलर अंकगणित की तुलना अक्सर &amp;ldquo;घड़ी के गणित&amp;rdquo; से की जाती है। मान लें कि अभी 10 बज रहे हैं, तो 5 घंटे बाद क्या समय होगा? $10 + 5 = 15$ बजे, लेकिन एक सामान्य 12-घंटे की घड़ी में हम उत्तर देते हैं &amp;ldquo;3 बजे&amp;rdquo;। ऐसा इसलिए है क्योंकि 15 को 12 से भाग देने पर शेषफल 3 आता है।&lt;/p>
&lt;p>गणित की दुनिया में, इसे इस प्रकार लिखा जाता है:
&lt;/p>
$$ 15 \equiv 3 \pmod{12} $$
&lt;p>
इसे ऐसे पढ़ा जाता है: &amp;ldquo;15 और 3, मॉड्युलो 12 के सर्वांगसम हैं (यानी 12 से भाग देने पर शेषफल समान है)।&amp;rdquo;&lt;/p>
&lt;h3 id="32-सरवगसमत-क-मल-गण">3.2 सर्वांगसमता के मूल गुण
&lt;/h3>&lt;p>सर्वांगसमता में कुछ बहुत ही उपयोगी गुण होते हैं जो समीकरणों ($=$) के समान होते हैं। मान लीजिए कि भाजक $N$ है।
जब $a \equiv b \pmod N$ और $c \equiv d \pmod N$ हो, तो निम्नलिखित सत्य है:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>जोड़:&lt;/strong> $a + c \equiv b + d \pmod N$&lt;/li>
&lt;li>&lt;strong>घटाव:&lt;/strong> $a - c \equiv b - d \pmod N$&lt;/li>
&lt;li>&lt;strong>गुणा:&lt;/strong> $a \times c \equiv b \times d \pmod N$&lt;/li>
&lt;li>&lt;strong>घातांक:&lt;/strong> $a^k \equiv b^k \pmod N$ ($k$ एक प्राकृत संख्या है)&lt;/li>
&lt;/ol>
&lt;p>&amp;ldquo;घातांक&amp;rdquo; का गुण विशेष रूप से महत्वपूर्ण है। इसका मतलब है कि &lt;strong>&amp;ldquo;शेषफल का घातांक, घातांक के शेषफल के बराबर है।&amp;rdquo;&lt;/strong>
उदाहरण के लिए, मान लें कि हम $7^{100}$ को $5$ से विभाजित करने पर शेषफल ज्ञात करना चाहते हैं। 7 को 100 बार गुणा करना और फिर उसे 5 से भाग देना बहुत मुश्किल काम है, लेकिन सर्वांगसमता के गुणों का उपयोग करके, चूँकि $7 \equiv 2 \pmod 5$ है, यह $7^{100} \equiv 2^{100} \pmod 5$ हो जाता है, जिससे गणना को काफी आसान किया जा सकता है। एन्क्रिप्शन की दुनिया में, यह गुण अपरिहार्य है क्योंकि हम बहुत बड़ी संख्याओं के घातांक से निपटते हैं।&lt;/p>
&lt;hr>
&lt;h2 id="4-rsa-एनकरपशन-क-समरथन-करन-वल-गणतय-आधर-3-यलर-क-टशट-फकशन-और-यलर-क-परमय">4. RSA एन्क्रिप्शन का समर्थन करने वाला गणितीय आधार 3: यूलर का टॉशेंट फ़ंक्शन और यूलर का प्रमेय
&lt;/h2>&lt;p>यहाँ से जादुई गणित शुरू होता है जो RSA एन्क्रिप्शन का मूल है। &amp;ldquo;यूलर का प्रमेय&amp;rdquo; सामने आता है, जो &amp;ldquo;फर्मेट के छोटे प्रमेय&amp;rdquo; का एक सामान्यीकरण है।&lt;/p>
&lt;h3 id="41-यलर-क-टशट-फकशन-phin">4.1 यूलर का टॉशेंट फ़ंक्शन $\phi(N)$
&lt;/h3>&lt;p>यूलर का टॉशेंट फ़ंक्शन ($\phi$ फ़ंक्शन) एक ऐसा फ़ंक्शन है जो किसी भी प्राकृत संख्या $N$ के लिए, &lt;strong>&amp;ldquo;1 से $N$ तक की उन प्राकृत संख्याओं की गिनती देता है, जो $N$ के साथ सह-अभाज्य (जिनका महत्तम समापवर्तक 1 है) हैं।&amp;rdquo;&lt;/strong>&lt;/p>
&lt;p>आइए कुछ उदाहरण देखें:&lt;/p>
&lt;ul>
&lt;li>$\phi(5)$: 1, 2, 3, 4, 5 में से, 5 के साथ सह-अभाज्य 1, 2, 3, 4 हैं, जो कुल 4 हैं। इसलिए $\phi(5) = 4$।&lt;/li>
&lt;li>$\phi(6)$: 1, 2, 3, 4, 5, 6 में से, 6 के साथ सह-अभाज्य केवल 1, 5 हैं, जो कुल 2 हैं। इसलिए $\phi(6) = 2$।&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>【अभाज्य संख्याओं के लिए विशेष गुण】&lt;/strong>
जब $p$ एक अभाज्य संख्या है, तो 1 से $p-1$ तक की सभी संख्याएँ $p$ के साथ सह-अभाज्य होती हैं। इसलिए,
&lt;/p>
$$ \phi(p) = p - 1 $$
&lt;p>
होता है।&lt;/p>
&lt;p>&lt;strong>【अभाज्य संख्याओं के गुणनफल के लिए विशेष गुण】&lt;/strong>
दो अलग-अलग अभाज्य संख्याओं $p$ और $q$ के लिए, यदि हम $N = p \times q$ मान लें, तो $\phi(N)$ को निम्नलिखित गणना द्वारा आसानी से निकाला जा सकता है:
&lt;/p>
$$ \phi(N) = \phi(p) \times \phi(q) = (p - 1)(q - 1) $$
&lt;p>
यह गुण RSA एन्क्रिप्शन के &amp;ldquo;गुप्त पिछले दरवाजे (ट्रैपडोर)&amp;rdquo; के रूप में कार्य करता है। एक व्यक्ति जो $p$ और $q$ (कुंजी का निर्माता) जानता है, वह पल भर में $\phi(N)$ की गणना कर सकता है, लेकिन कोई तीसरा पक्ष जो केवल $N$ जानता है, वह $\phi(N)$ नहीं खोज सकता, जब तक कि वह $N$ का अभाज्य गुणनखंडन न कर ले।&lt;/p>
&lt;h3 id="42-यलर-क-परमय">4.2 यूलर का प्रमेय
&lt;/h3>&lt;p>लियोनहार्ड यूलर ने इस $\phi(N)$ का उपयोग करके निम्नलिखित सुंदर प्रमेय सिद्ध किया:&lt;/p>
&lt;p>&lt;strong>यूलर का प्रमेय:&lt;/strong>
जब पूर्णांक $a$ और $N$ सह-अभाज्य होते हैं, तो निम्नलिखित सर्वांगसमता सत्य होती है:
&lt;/p>
$$ a^{\phi(N)} \equiv 1 \pmod N $$
&lt;p>यह एक आश्चर्यजनक गुण है कि &amp;ldquo;यदि हम किसी संख्या $a$ को $\phi(N)$ बार गुणा करते हैं और $N$ से विभाजित करते हैं, तो शेषफल हमेशा $1$ होगा।&amp;rdquo; (जब $N$ एक अभाज्य संख्या $p$ है, तो यह $a^{p-1} \equiv 1 \pmod p$ बन जाता है, जिसे फर्मेट का छोटा प्रमेय कहा जाता है)।&lt;/p>
&lt;p>आइए इस यूलर के प्रमेय को थोड़ा संशोधित करें। दोनों पक्षों को फिर से $a$ से गुणा करें:
&lt;/p>
$$ a^{\phi(N) + 1} \equiv a \pmod N $$
&lt;p>इसके अलावा, किसी भी पूर्णांक $k$ के लिए, $a^{k \cdot \phi(N)}$ भी $1^k = 1$ होगा, इसलिए निम्नलिखित समीकरण सत्य है:
&lt;/p>
$$ a^{k \cdot \phi(N) + 1} \equiv a \pmod N $$
&lt;p>यह समीकरण ही वह मूल सिद्धांत है जो RSA एन्क्रिप्शन के इस जादू को काम करने देता है: &lt;strong>&amp;ldquo;जब आप इसे एन्क्रिप्ट करते हैं और फिर डिक्रिप्ट करते हैं, तो यह अपनी मूल अवस्था में वापस आ जाता है।&amp;rdquo;&lt;/strong>&lt;/p>
&lt;hr>
&lt;h2 id="5-rsa-एनकरपशन-एलगरथम-कज-नरमण-एनकरपशन-और-डकरपशन-क-चरण">5. RSA एन्क्रिप्शन एल्गोरिथम: कुंजी निर्माण, एन्क्रिप्शन और डिक्रिप्शन के चरण
&lt;/h2>&lt;p>अब जब हमारे पास बुनियादी ज्ञान है, तो आइए अंततः RSA एन्क्रिप्शन के विशिष्ट चरणों को देखें। RSA एन्क्रिप्शन मोटे तौर पर तीन चरणों में बंटा हुआ है: &amp;ldquo;1. कुंजी निर्माण&amp;rdquo;, &amp;ldquo;2. एन्क्रिप्शन&amp;rdquo;, और &amp;ldquo;3. डिक्रिप्शन&amp;rdquo;।&lt;/p>
&lt;div class="mermaid">flowchart TD
A1["1. अभाज्य संख्याएँ p, q चुनें"] --> A2["N = p × q की गणना करें"]
A1 --> A3["φ(N) = (p-1)(q-1) की गणना करें"]
A3 --> A4["φ(N) के साथ सह-अभाज्य e चुनें"]
A3 --> A5["ऐसे d की गणना करें कि e × d ≡ 1 (mod φ(N)) हो"]
A2 --> A6["सार्वजनिक कुंजी (N, e)"]
A4 --> A6
A5 --> A7["निजी कुंजी d"]
B1["2. प्लेनटेक्स्ट संदेश M"] --> B2["C ≡ M^e (mod N) की गणना करें"]
A6 -.-> B2
B2 --> B3["सिफरटेक्स्ट C भेजें"]
B3 --> C1["3. प्राप्त सिफरटेक्स्ट C"]
C1 --> C2["M ≡ C^d (mod N) की गणना करें"]
A7 -.-> C2
C2 --> C3["मूल प्लेनटेक्स्ट संदेश M प्राप्त करें"]&lt;/div>
&lt;h3 id="51-कज-नरमण-key-generation">5.1 कुंजी निर्माण (Key Generation)
&lt;/h3>&lt;p>प्राप्तकर्ता बॉब, अपने लिए एक &amp;ldquo;सार्वजनिक कुंजी&amp;rdquo; और एक &amp;ldquo;निजी कुंजी&amp;rdquo; बनाता है।&lt;/p>
&lt;ol>
&lt;li>&lt;strong>अभाज्य संख्याओं का चयन:&lt;/strong> दो बड़ी अभाज्य संख्याएँ $p$ और $q$ यादृच्छिक रूप से चुनें।&lt;/li>
&lt;li>&lt;strong>$N$ की गणना:&lt;/strong> $N = p \times q$ की गणना करें। यह $N$ सार्वजनिक किया जाएगा।&lt;/li>
&lt;li>&lt;strong>$\phi(N)$ की गणना:&lt;/strong> यूलर फ़ंक्शन $\phi(N) = (p - 1)(q - 1)$ की गणना करें। यह बॉब का गुप्त नंबर है।&lt;/li>
&lt;li>&lt;strong>सार्वजनिक कुंजी $e$ का चयन:&lt;/strong> एक ऐसा पूर्णांक $e$ चुनें जो $1 &lt; e &lt; \phi(N)$ हो और $\phi(N)$ के साथ सह-अभाज्य हो।&lt;/li>
&lt;li>&lt;strong>निजी कुंजी $d$ की गणना:&lt;/strong> एक ऐसा पूर्णांक $d$ खोजें जो निम्नलिखित शर्त को पूरा करता हो:
$$ e \times d \equiv 1 \pmod{\phi(N)} $$
दूसरे शब्दों में, यह एक ऐसी संख्या $d$ है जहाँ &amp;ldquo;$e \times d$ को $\phi(N)$ से भाग देने पर शेषफल $1$ होता है।&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;p>इसके साथ ही कुंजियों की तैयारी पूरी हो जाती है।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>सार्वजनिक कुंजी:&lt;/strong> $(N, e)$ का जोड़ा। इसे पूरी दुनिया के लिए सार्वजनिक किया जाता है।&lt;/li>
&lt;li>&lt;strong>निजी कुंजी:&lt;/strong> $d$। इसे किसी को भी नहीं बताया जाता।&lt;/li>
&lt;/ul>
&lt;h3 id="52-एनकरपशन-encryption">5.2 एन्क्रिप्शन (Encryption)
&lt;/h3>&lt;p>मान लें कि ऐलिस, बॉब को एक गुप्त संदेश $M$ भेजना चाहती है। ($M$ पाठ को संख्यात्मक रूप में परिवर्तित करने से बनता है, और हम मान कर चलते हैं कि $0 \le M &lt; N$ है)। ऐलिस बॉब की सार्वजनिक कुंजी $(N, e)$ का उपयोग करके निम्नानुसार गणना करती है:&lt;/p>
$$ C \equiv M^e \pmod N $$
&lt;p>&amp;ldquo;संदेश $M$ को $e$ की घात तक उठाएँ, और $N$ से भाग देने पर शेषफल $C$ प्राप्त करें।&amp;rdquo; यह $C$ एन्क्रिप्टेड संदेश (सिफरटेक्स्ट) है।&lt;/p>
&lt;h3 id="53-डकरपशन-decryption">5.3 डिक्रिप्शन (Decryption)
&lt;/h3>&lt;p>बॉब को सिफरटेक्स्ट $C$ प्राप्त होता है। बॉब अपनी निजी कुंजी $d$ का उपयोग करके निम्नानुसार गणना करता है:&lt;/p>
$$ M \equiv C^d \pmod N $$
&lt;p>यदि आप &amp;ldquo;सिफरटेक्स्ट $C$ को $d$ की घात तक बढ़ाते हैं, और $N$ से भाग देने पर शेषफल&amp;rdquo; की गणना करते हैं, तो आश्चर्यजनक रूप से मूल संदेश $M$ पुनर्प्राप्त हो जाता है!&lt;/p>
&lt;hr>
&lt;h2 id="6-डकरपशन-इस-मल-अवसथ-म-वपस-कय-लत-ह-गणतय-परमण">6. डिक्रिप्शन इसे मूल अवस्था में वापस क्यों लाता है? (गणितीय प्रमाण)
&lt;/h2>&lt;p>आप सोच रहे होंगे, &amp;ldquo;$C$ की घात $d$ करने से, यह मूल $M$ में कैसे वापस आ जाता है?&amp;rdquo; यहीं पर पहले वर्णित &amp;ldquo;यूलर का प्रमेय&amp;rdquo; अपनी शक्ति दिखाता है।&lt;/p>
&lt;p>आइए डिक्रिप्शन के सूत्र $C^d \pmod N$ में एन्क्रिप्शन के सूत्र $C = M^e$ को प्रतिस्थापित करें:
&lt;/p>
$$ C^d \equiv (M^e)^d \equiv M^{ed} \pmod N $$
&lt;p>यहाँ, कुंजी निर्माण के चरण 5 को याद करें। जब बॉब ने $d$ बनाया, तो उसने इसे इस तरह चुना कि $e \times d \equiv 1 \pmod{\phi(N)}$ हो। इसका मतलब है कि &amp;ldquo;$ed$, $\phi(N)$ के गुणज में $1$ जोड़ने से बनी संख्या है।&amp;rdquo; एक पूर्णांक $k$ का उपयोग करके, इसे इस प्रकार लिखा जा सकता है:
&lt;/p>
$$ ed = k \cdot \phi(N) + 1 $$
&lt;p>इसे घातांक वाले भाग में रखें और घातांक के नियमों का उपयोग करके इसे हल करें:
&lt;/p>
$$ M^{ed} = M^{k \cdot \phi(N) + 1} = M^{k \cdot \phi(N)} \times M^1 = (M^{\phi(N)})^k \times M $$
&lt;p>यहाँ, यदि हम मान लें कि संदेश $M$ और $N$ सह-अभाज्य हैं, तो &lt;strong>यूलर के प्रमेय&lt;/strong> से, $M^{\phi(N)} \equiv 1 \pmod N$ होता है।
&lt;/p>
$$ (M^{\phi(N)})^k \times M \equiv 1^k \times M \equiv M \pmod N $$
&lt;p>इसलिए, निम्नलिखित समीकरण पूरी तरह से सत्य होता है:
&lt;/p>
$$ C^d \equiv M \pmod N $$
&lt;p>ऐलिस $d$ को नहीं जानती, और छिपकर बातें सुनने वाला भी $d$ को नहीं जानता, इसलिए केवल बॉब, जिसके पास $d$ है, $C$ से $M$ को निकाल सकता है।&lt;/p>
&lt;hr>
&lt;h2 id="7-एक-ठस-उदहरण-आइए-छट-अभजय-सखयओ-क-उपयग-करक-हथ-स-rsa-क-गणन-कर">7. एक ठोस उदाहरण: आइए छोटी अभाज्य संख्याओं का उपयोग करके हाथ से RSA की गणना करें
&lt;/h2>&lt;p>आइए वास्तव में छोटी संख्याओं (अभाज्य संख्याओं) का उपयोग करके ऐलिस से बॉब तक एन्क्रिप्टेड संचार का प्रयास करें।&lt;/p>
&lt;p>&lt;strong>【बॉब का कुंजी निर्माण चरण】&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>दो अभाज्य संख्याएँ चुनें, $p=11$ और $q=13$।&lt;/li>
&lt;li>$N = 11 \times 13 = 143$ की गणना करें।&lt;/li>
&lt;li>$\phi(N) = (11 - 1) \times (13 - 1) = 10 \times 12 = 120$ की गणना करें।&lt;/li>
&lt;li>एक सार्वजनिक कुंजी $e$ चुनें जो $\phi(N)=120$ के साथ सह-अभाज्य हो। यहाँ हम $e=7$ का उपयोग करेंगे।&lt;/li>
&lt;li>निजी कुंजी $d$ ज्ञात करें। ऐसा $d$ खोजें कि $7 \times d \equiv 1 \pmod{120}$ हो।
समीकरण $7d = 120k + 1$ में, जब $k=6$ होता है, तो मान $721$ हो जाता है, और $721 \div 7 = 103$ होता है।
इसलिए, $d = 103$ हो जाता है।&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>सार्वजनिक कुंजी: $(N=143, e=7)$&lt;/li>
&lt;li>निजी कुंजी: $d=103$&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>【ऐलिस का एन्क्रिप्शन चरण】&lt;/strong>
मान लीजिए कि ऐलिस संदेश $M = 9$ भेजना चाहती है।
सूत्र: $C \equiv 9^7 \pmod{143}$
$9^7 = 4,782,969$। जब इसे 143 से भाग दिया जाता है, तो भागफल 33447 और शेषफल 48 होता है।
तो एन्क्रिप्टेड संदेश $C = 48$ हो गया।&lt;/p>
&lt;p>&lt;strong>【बॉब का डिक्रिप्शन चरण】&lt;/strong>
बॉब को एन्क्रिप्टेड संदेश $C = 48$ मिलता है और वह इसे डिक्रिप्ट करने के लिए अपनी निजी कुंजी $d = 103$ का उपयोग करता है।
सूत्र: $M \equiv 48^{103} \pmod{143}$
यदि आप कैलकुलेटर पर &lt;code>(48 ** 103) % 143&lt;/code> चलाते हैं, तो परिणाम आश्चर्यजनक रूप से &amp;ldquo;&lt;strong>9&lt;/strong>&amp;rdquo; आएगा! बॉब सफलतापूर्वक मूल संदेश प्राप्त करने में सक्षम हो गया।&lt;/p>
&lt;hr>
&lt;h2 id="8-नज-कज-d-कस-जञत-कर-वसतरत-यकलडयन-एलगरथम">8. निजी कुंजी $d$ कैसे ज्ञात करें: विस्तारित यूक्लिडियन एल्गोरिथम
&lt;/h2>&lt;p>मैन्युअल गणना के उदाहरण में, हमने अनुमान लगाकर $k$ का मान खोजा और $d=103$ प्राप्त किया, लेकिन जब संख्याएँ सैकड़ों अंकों की हो जाती हैं, तो यह विधि असंभव है। वास्तविक प्रोग्रामों में, &lt;strong>&amp;ldquo;विस्तारित यूक्लिडियन एल्गोरिथम&amp;rdquo;&lt;/strong> नामक एल्गोरिथम का उपयोग किया जाता है।&lt;/p>
&lt;p>$7d \equiv 1 \pmod{120}$ को हल करने का मतलब ऐसे पूर्णांक $d, y$ ज्ञात करना है जो $7d + 120y = 1$ को संतुष्ट करते हों। यूक्लिडियन एल्गोरिथम को उल्टे क्रम में लागू करके, इसकी गणना व्यवस्थित तरीके से की जा सकती है।&lt;/p>
&lt;ol>
&lt;li>$120 \div 7 = 17$ शेषफल $1$&lt;/li>
&lt;li>इसे पुनः व्यवस्थित करने पर, $1 = 120 - 17 \times 7$&lt;/li>
&lt;li>यानी, $-17 \times 7 \equiv 1 \pmod{120}$&lt;/li>
&lt;/ol>
&lt;p>मॉड्युलो 120 की दुनिया में $-17$ का अर्थ $120 - 17 = 103$ के समान ही है। इसलिए, $d = 103$ पल भर में मिल जाता है। यह विधि बहुत तेज़ी से गणना कर सकती है, चाहे संख्या कितनी भी विशाल क्यों न हो।&lt;/p>
&lt;hr>
&lt;h2 id="9-rsa-एनकरपशन-क-एक-और-चहर-डजटल-हसतकषर">9. RSA एन्क्रिप्शन का एक और चेहरा: डिजिटल हस्ताक्षर
&lt;/h2>&lt;p>RSA एन्क्रिप्शन के बारे में सबसे अच्छी बात यह है कि सार्वजनिक और निजी कुंजियों की भूमिकाओं को उलट कर इसे &lt;strong>&amp;ldquo;डिजिटल हस्ताक्षर&amp;rdquo;&lt;/strong> के रूप में भी इस्तेमाल किया जा सकता है।&lt;/p>
&lt;p>एन्क्रिप्शन में, प्रक्रिया थी &amp;ldquo;सार्वजनिक कुंजी के साथ एन्क्रिप्ट करें $\Rightarrow$ निजी कुंजी के साथ डिक्रिप्ट करें&amp;rdquo;।
डिजिटल हस्ताक्षर में, प्रक्रिया है &amp;ldquo;निजी कुंजी के साथ एन्क्रिप्ट करें $\Rightarrow$ सार्वजनिक कुंजी के साथ डिक्रिप्ट करें&amp;rdquo;।&lt;/p>
&lt;div class="mermaid">flowchart TD
A1["1. ऐलिस अपनी निजी कुंजी से हस्ताक्षर बनाती है"] --> A2["S ≡ M^d (mod N)"]
A2 --> A3["संदेश M और हस्ताक्षर S भेजें"]
A3 --> B1["2. बॉब सार्वजनिक कुंजी के साथ हस्ताक्षर सत्यापित करता है"]
B1 --> B2["M' ≡ S^e (mod N) की गणना करें"]
B2 --> B3["जांचें कि क्या M' और M मेल खाते हैं"]&lt;/div>
&lt;p>ऐलिस अपनी निजी कुंजी $d$ का उपयोग करके संदेश को बदलती है (यह हस्ताक्षर $S$ है) और इसे बॉब को भेजती है। बॉब सत्यापन गणना करने के लिए ऐलिस की सार्वजनिक कुंजी $e$ का उपयोग करता है। यदि गणना का परिणाम मूल संदेश से मेल खाता है, तो यह एक साथ साबित करता है कि &amp;ldquo;यह डेटा केवल ऐलिस की निजी कुंजी से ही बनाया जा सकता था&amp;rdquo; और &amp;ldquo;संदेश से रास्ते में छेड़छाड़ नहीं की गई है।&amp;rdquo;&lt;/p>
&lt;hr>
&lt;h2 id="10-एक-परगरम-क-सथ-rsa-एनकरपशन-क-अनभव-करन">10. एक प्रोग्राम के साथ RSA एन्क्रिप्शन का अनुभव करना
&lt;/h2>&lt;p>हाथ से घातांक की गणना करना कठिन है, लेकिन यदि आप Python का उपयोग करते हैं, तो इसे लागू करना बहुत आसान है। नीचे दिया गया Python कोड आपको RSA एन्क्रिप्शन के मुख्य तर्क का अनुभव करने की अनुमति देता है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;महत्तम समापवर्तक ज्ञात करें&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">a&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">mod_inverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;निजी कुंजी d ज्ञात करें (Python 3.8+ के बिल्ट-इन फ़ंक्शन का उपयोग करके)&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. कुंजी निर्माण&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">p&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">q&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">11&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">13&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">N&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">q&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">phi&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">q&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">e&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">7&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">d&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod_inverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;सार्वजनिक कुंजी: (N=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">N&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">, e=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">), निजी कुंजी: d=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. एन्क्रिप्शन&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">message&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">9&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ciphertext&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">message&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;एन्क्रिप्टेड संदेश: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">ciphertext&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. डिक्रिप्शन&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">decrypted_message&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ciphertext&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;डिक्रिप्टेड संदेश: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">decrypted_message&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>चूँकि Python का &lt;code>pow(base, exp, mod)&lt;/code> फ़ंक्शन आंतरिक रूप से एक तेज़ एल्गोरिथम का उपयोग करता है जिसे &amp;ldquo;पुनरावृत्त वर्ग विधि (Exponentiation by squaring)&amp;rdquo; कहा जाता है, यह एक पल में गणना पूरी कर लेता है, भले ही संख्याएँ सैकड़ों अंकों की हों।&lt;/p>
&lt;hr>
&lt;h2 id="11-नषकरष-और-भवषय-क-एनकरपशन-तकनक">11. निष्कर्ष और भविष्य की एन्क्रिप्शन तकनीक
&lt;/h2>&lt;p>हमने हाई स्कूल के गणितीय ज्ञान के आधार पर RSA एन्क्रिप्शन के तंत्र का खुलासा किया है।&lt;/p>
&lt;ol>
&lt;li>&lt;strong>अभाज्य गुणनखंडन की कठिनाई:&lt;/strong> $p \times q = N$ खोजना आसान है, लेकिन $N$ से $p, q$ खोजना बहुत मुश्किल है।&lt;/li>
&lt;li>&lt;strong>सर्वांगसमता और यूलर का प्रमेय:&lt;/strong> $a^{\phi(N)} \equiv 1 \pmod N$ नियम के माध्यम से, &amp;ldquo;एक निश्चित संख्या की घात तक बढ़ाने पर मूल अवस्था में वापस आने&amp;rdquo; का जादुई ट्रैपडोर पूरा हो जाता है।&lt;/li>
&lt;li>&lt;strong>सार्वजनिक और निजी कुंजियाँ:&lt;/strong> कोई भी एन्क्रिप्ट कर सकता है, लेकिन केवल वैध प्राप्तकर्ता ही इसे डिक्रिप्ट कर सकता है।&lt;/li>
&lt;/ol>
&lt;p>वर्तमान में उपयोग किए जाने वाले RSA एन्क्रिप्शन में 600 से अधिक अंकों का $N$ होता है, और दुनिया के सभी सुपर कंप्यूटरों को एक साथ काम में लगा दिया जाए, तो भी इसके अभाज्य गुणनखंडन में ब्रह्मांड की आयु से अधिक समय लगेगा। हालाँकि, यदि हाल ही में शोध किए जा रहे &amp;ldquo;क्वांटम कंप्यूटर&amp;rdquo; भविष्य में व्यावहारिक उपयोग में आते हैं, तो ऐसी संभावना है कि यह अभाज्य गुणनखंडन &amp;ldquo;शोर के एल्गोरिथम&amp;rdquo; द्वारा पल भर में हल हो जाएगा। इस कारण से, दुनिया भर में &amp;ldquo;क्वांटम-प्रतिरोधी एन्क्रिप्शन&amp;rdquo; विकसित करने के लिए तेज़ गति से काम चल रहा है, जिसे क्वांटम कंप्यूटर भी डिक्रिप्ट नहीं कर सकते।&lt;/p>
&lt;p>उन्नत गणित जिसे अक्सर &amp;ldquo;बेकार&amp;rdquo; माना जाता है, वास्तव में हमारे दैनिक जीवन को उसकी जड़ों से सुरक्षित रखता है। RSA एन्क्रिप्शन इस तरह के गणित की गहराई और सुंदरता सिखाने वाली सबसे बेहतरीन शिक्षण सामग्री है। हमें उम्मीद है कि इस लेख के माध्यम से आप एन्क्रिप्शन और गणित के आकर्षण को थोड़ा भी महसूस कर पाए होंगे।&lt;/p></description></item><item><title>पूर्ण समरूप एन्क्रिप्शन (FHE) क्या है? अगली पीढ़ी की सुरक्षा के मूल तत्व की व्याख्या</title><link>http://kenji.blog/hi/p/fully-homomorphic-encryption-fhe-explained/</link><pubDate>Fri, 11 Sep 2026 11:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/fully-homomorphic-encryption-fhe-explained/</guid><description>&lt;img src="http://kenji.blog/p/fully-homomorphic-encryption-fhe-explained/img/eyecatch.jpg" alt="Featured image of post पूर्ण समरूप एन्क्रिप्शन (FHE) क्या है? अगली पीढ़ी की सुरक्षा के मूल तत्व की व्याख्या" />&lt;p>चूंकि क्लाउड कंप्यूटिंग और एआई तकनीक समाज की नींव के रूप में स्थापित हो रही है, &amp;ldquo;डेटा गोपनीयता (Data Privacy)&amp;rdquo; और &amp;ldquo;डेटा उपयोग (Data Utilization)&amp;rdquo; के बीच का ट्रेड-ऑफ सबसे महत्वपूर्ण चुनौतियों में से एक बन गया है। अत्यधिक गोपनीय डेटा, जैसे मेडिकल डेटा, वित्तीय जानकारी, और व्यक्तिगत बायोमेट्रिक जानकारी का क्लाउड पर एआई द्वारा विश्लेषण कराने की मांग बढ़ रही है, लेकिन सुरक्षा चिंताओं के कारण कई कंपनियां डेटा को बाहर भेजने में संकोच करती हैं।&lt;/p>
&lt;p>पारंपरिक एन्क्रिप्शन तकनीकें (जैसे AES और RSA) स्टोरेज में सहेजे गए डेटा (Data at Rest) और नेटवर्क पर प्रवाहित होने वाले डेटा (Data in Transit) की सुरक्षा करने में उत्कृष्ट हैं। हालाँकि, जब सर्वर डेटा पर खोज या मशीन लर्निंग जैसी &lt;strong>प्रक्रियाएँ (गणनाएँ) करता है (Data in Use), तो एन्क्रिप्शन को डिक्रिप्ट करके उसे वापस प्लेनटेक्स्ट में बदलना आवश्यक होता है&lt;/strong>। यदि इस डिक्रिप्शन के समय सर्वर हैक हो जाता है, या कोई दुर्भावनापूर्ण आंतरिक प्रशासक डेटा देख लेता है, तो यह सीधे सूचना रिसाव का कारण बन सकता है।&lt;/p>
&lt;p>इस &amp;ldquo;प्रोसेसिंग के दौरान डिक्रिप्शन&amp;rdquo; की मूलभूत कमजोरी को दूर करने वाली सपनों की तकनीक &lt;strong>पूर्ण समरूप एन्क्रिप्शन (Fully Homomorphic Encryption: FHE)&lt;/strong> है। FHE का उपयोग करके, डेटा को डिक्रिप्ट किए बिना एन्क्रिप्टेड अवस्था में ही गणना प्रक्रियाएं करना संभव है, और केवल परिणामी सिफरटेक्स्ट (ciphertext) को क्लाइंट को वापस किया जाता है।&lt;/p>
&lt;p>इस लेख में, हम FHE की अवधारणा से लेकर इसके इतिहास, क्रेग जेंट्री (Craig Gentry) की ऐतिहासिक सफलता, गणितीय आधार (जैसे Ring-LWE), सबसे बड़ी चुनौती &amp;ldquo;शोर (Noise)&amp;rdquo; और इसके समाधान (बूटस्ट्रैपिंग), और नवीनतम कार्यान्वयन पुस्तकालयों (implementation libraries) तक सब कुछ कवर करेंगे, जो अगली पीढ़ी की सुरक्षा के प्रमुख तत्व FHE की गहराई से व्याख्या करता है।&lt;/p>
&lt;hr>
&lt;h2 id="1-समरप-एनकरपशन-कय-ह-बनयद-अवधरण">1. समरूप एन्क्रिप्शन क्या है? बुनियादी अवधारणा
&lt;/h2>&lt;p>&amp;ldquo;समरूप (Homomorphic)&amp;rdquo; एक बीजगणितीय शब्द है, जो किसी संरचना वाले सेट के बीच एक मैपिंग को संदर्भित करता है जो ऑपरेशनों की संरचना को बरकरार रखता है। क्रिप्टोग्राफी में &amp;ldquo;समरूपता (Homomorphism)&amp;rdquo; का अर्थ यह गुण है कि &lt;strong>प्लेनटेक्स्ट स्पेस में ऑपरेशन्स सिफरटेक्स्ट स्पेस में ऑपरेशन्स के अनुरूप होते हैं&lt;/strong>।&lt;/p>
&lt;p>सरल गणितीय शब्दों में, मान लें कि प्लेनटेक्स्ट $m_1$ और $m_2$ के लिए एन्क्रिप्शन फ़ंक्शन $E(\cdot)$ है, और डिक्रिप्शन फ़ंक्शन $D(\cdot)$ है। प्लेनटेक्स्ट पर होने वाले ऑपरेशन (जैसे जोड़ या गुणा) को $\circ$ के रूप में, और सिफरटेक्स्ट पर होने वाले ऑपरेशन को $\diamond$ के रूप में दर्शाया गया है, तो निम्नलिखित संबंध लागू होता है:&lt;/p>
$$ D(E(m_1) \diamond E(m_2)) = m_1 \circ m_2 $$
&lt;p>दूसरे शब्दों में, यदि आप सिफरटेक्स्ट $E(m_1)$ और $E(m_2)$ पर कोई ऑपरेशन $\diamond$ लागू करते हैं और परिणाम को डिक्रिप्ट करते हैं, तो यह मूल प्लेनटेक्स्ट के बीच ऑपरेशन $\circ$ लागू करने के परिणाम से मेल खाएगा।&lt;/p>
&lt;h3 id="कलउड-कपयटग-म-डट-परवह-data-flow-in-cloud-computing">क्लाउड कंप्यूटिंग में डेटा प्रवाह (Data Flow in Cloud Computing)
&lt;/h3>&lt;p>FHE का उपयोग करने वाली क्लाउड प्रोसेसिंग का आर्किटेक्चर पारंपरिक वाले से बिल्कुल अलग है। नीचे दिया गया चित्र FHE का उपयोग करते हुए सुरक्षित डेटा प्रोसेसिंग प्रवाह को दर्शाता है।&lt;/p>
&lt;div class="mermaid">graph TD
A["क्लाइंट (निजी कुंजी रखता है)"] -->|1. प्लेनटेक्स्ट x को एन्क्रिप्ट करें: E(x)| B["क्लाउड सर्वर (केवल एन्क्रिप्टेड डेटा)"]
B -->|2. सिफरटेक्स्ट के रूप में फ़ंक्शन f लागू करें: E(f(x))| B
B -->|3. गणना परिणाम का सिफरटेक्स्ट E(y)| A
A -->|4. निजी कुंजी के साथ डिक्रिप्ट करें: y = f(x)| A
style A fill:#d4edda,stroke:#28a745
style B fill:#f8d7da,stroke:#dc3545&lt;/div>
&lt;p>सर्वर एन्क्रिप्टेड डेटा $E(x)$ प्राप्त करता है, लेकिन चूंकि उसके पास निजी कुंजी (private key) नहीं है, इसलिए वह कभी भी डेटा की सामग्री नहीं जान सकता। हालांकि, FHE के गुणों का उपयोग करके, यह सिफरटेक्स्ट पर एक फ़ंक्शन $f$ (उदाहरण के लिए, मशीन लर्निंग अनुमान मॉडल) लागू कर सकता है और $E(f(x))$ उत्पन्न कर सकता है। क्लाइंट इसे प्राप्त करता है और वांछित परिणाम $y = f(x)$ प्राप्त करने के लिए इसे अपनी निजी कुंजी के साथ डिक्रिप्ट करता है।&lt;/p>
&lt;hr>
&lt;h2 id="2-समरप-एनकरपशन-क-वकस-क-इतहस-phe-she-fhe">2. समरूप एन्क्रिप्शन के विकास का इतिहास: PHE, SHE, FHE
&lt;/h2>&lt;p>समरूप एन्क्रिप्शन एक ही बार में अपने वर्तमान &amp;ldquo;पूर्ण&amp;rdquo; रूप में विकसित नहीं हुआ था। इसे सक्षम किए जा सकने वाले ऑपरेशनों के प्रकार और संख्या के आधार पर मोटे तौर पर तीन चरणों में वर्गीकृत किया जाता है।&lt;/p>
&lt;h3 id="आशक-रप-स-समरप-एनकरपशन-partially-homomorphic-encryption---phe">आंशिक रूप से समरूप एन्क्रिप्शन (Partially Homomorphic Encryption - PHE)
&lt;/h3>&lt;p>PHE एक एन्क्रिप्शन पद्धति है जो बिना किसी सीमा के जोड़ या गुणा में से &lt;strong>केवल एक&lt;/strong> को करने की अनुमति देती है। वास्तव में, इस गुण वाले एन्क्रिप्शन लंबे समय से मौजूद हैं।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>RSA एन्क्रिप्शन (गुणा के लिए समरूपता)&lt;/strong>
RSA एन्क्रिप्शन में अनजाने में गुणात्मक समरूपता थी। मान लें कि प्लेनटेक्स्ट $m_1, m_2$ है, और सार्वजनिक कुंजी $(e, N)$ है:
$$ E(m_1) = m_1^e \pmod N $$
$$ E(m_2) = m_2^e \pmod N $$
यदि हम इन्हें गुणा करते हैं:
$$ E(m_1) \times E(m_2) = (m_1 \cdot m_2)^e \pmod N = E(m_1 \times m_2) $$
इस प्रकार, सिफरटेक्स्ट का गुणा प्लेनटेक्स्ट के गुणा के अनुरूप होता है।&lt;/li>
&lt;li>&lt;strong>Paillier एन्क्रिप्शन (जोड़ के लिए समरूपता)&lt;/strong>
1999 में तैयार किए गए पैलिएर (Paillier) एन्क्रिप्शन में योगात्मक समरूपता (additive homomorphism) होती है। इसे इलेक्ट्रॉनिक वोटिंग (जहां एन्क्रिप्टेड वोटों को जोड़ा जाता है, और केवल अंतिम परिणाम को डिक्रिप्ट किया जाता है) जैसी चीजों में व्यावहारिक रूप से उपयोग किया गया है।&lt;/li>
&lt;/ul>
&lt;h3 id="कछ-हद-तक-समरप-एनकरपशन-somewhat-homomorphic-encryption---she">कुछ हद तक समरूप एन्क्रिप्शन (Somewhat Homomorphic Encryption - SHE)
&lt;/h3>&lt;p>यह एक ऐसी विधि है जो जोड़ और गुणा &lt;strong>दोनों&lt;/strong> को निष्पादित कर सकती है, लेकिन किए जा सकने वाले &lt;strong>ऑपरेशनों की संख्या (सर्किट की गहराई) पर एक सीमा&lt;/strong> होती है। &amp;ldquo;शोर (noise)&amp;rdquo; के संचय के कारण (जिसकी चर्चा बाद में की गई है), यदि किसी निश्चित संख्या से अधिक गुणा किया जाता है, तो डिक्रिप्शन असंभव हो जाता है। 2005 का BGN (Boneh-Goh-Nissim) एन्क्रिप्शन इस श्रेणी में आता है, लेकिन व्यावहारिक और जटिल गणनाएं (जैसे डीप लर्निंग) करने में इसकी सीमाएं थीं।&lt;/p>
&lt;h3 id="परण-समरप-एनकरपशन-fully-homomorphic-encryption---fhe">पूर्ण समरूप एन्क्रिप्शन (Fully Homomorphic Encryption - FHE)
&lt;/h3>&lt;p>यह एक एन्क्रिप्शन विधि है जहां जोड़ और गुणा दोनों को &lt;strong>असीमित बार&lt;/strong> निष्पादित किया जा सकता है। सूचना सिद्धांत में ट्यूरिंग-पूर्णता के समान, यदि जोड़ (XOR के समतुल्य) और गुणा (AND के समतुल्य) को अनिश्चित काल तक जोड़ा जा सकता है, तो इसका अर्थ है कि सिद्धांत रूप में कोई भी गणना योग्य फ़ंक्शन या एल्गोरिदम एन्क्रिप्टेड अवस्था में निष्पादित किया जा सकता है।&lt;/p>
&lt;p>लंबे समय तक, FHE को &amp;ldquo;क्रिप्टोग्राफी का पवित्र कंठ (Holy Grail of Cryptography)&amp;rdquo; कहा जाता था, और यहां तक कहा जाता था कि इसे साकार करना असंभव हो सकता है। हालाँकि, 2009 में, स्टैनफोर्ड विश्वविद्यालय के एक तत्कालीन पीएचडी छात्र &lt;strong>क्रेग जेंट्री (Craig Gentry)&lt;/strong> ने आदर्श जालक (Ideal Lattices) का उपयोग करते हुए पहली FHE योजना प्रस्तावित की और दुनिया को चौंका दिया।&lt;/p>
&lt;hr>
&lt;h2 id="3-fhe-क-गणतय-आधर-lwe-समसय-और-ring-lwe">3. FHE का गणितीय आधार: LWE समस्या और Ring-LWE
&lt;/h2>&lt;p>कई मुख्यधारा की FHE योजनाएँ आज &lt;strong>LWE (Learning With Errors) समस्या&lt;/strong> पर आधारित हैं, जो &amp;ldquo;लैटिस-आधारित क्रिप्टोग्राफी (Lattice-based Cryptography)&amp;rdquo; में एक कठिन गणितीय समस्या है, जिसे पोस्ट-क्वांटम क्रिप्टोग्राफी के रूप में भी जाना जाता है।&lt;/p>
&lt;h3 id="lwe-समसय-क-सहज-समझ">LWE समस्या की सहज समझ
&lt;/h3>&lt;p>गॉसियन उन्मूलन (Gaussian elimination) जैसी विधियों का उपयोग करके रैखिक समीकरणों की प्रणालियों को हल करना आसान है।&lt;/p>
$$ \begin{cases} 3s_1 + 4s_2 + 2s_3 \equiv 12 \pmod{17} \\ 1s_1 + 9s_2 + 5s_3 \equiv 8 \pmod{17} \\ \vdots \end{cases} $$
&lt;p>हालाँकि, क्या होगा यदि हम इस समीकरण के परिणाम में थोड़ी सी &amp;ldquo;यादृच्छिक त्रुटि (शोर)&amp;rdquo; $e$ जोड़ दें?&lt;/p>
$$ \begin{cases} 3s_1 + 4s_2 + 2s_3 + e_1 \equiv 13 \pmod{17} \\ 1s_1 + 9s_2 + 5s_3 + e_2 \equiv 7 \pmod{17} \\ \vdots \end{cases} $$
&lt;p>केवल इस त्रुटि $e$ को जोड़ने से, गुप्त चर सदिश (secret variable vector) $\vec{s}$ को खोजने की समस्या एक NP-hard समस्या में बदल जाती है जिसे वर्तमान सुपर कंप्यूटर या क्वांटम कंप्यूटर का उपयोग करके भी डिक्रिप्ट करना मुश्किल है। यह LWE समस्या है।&lt;/p>
&lt;h3 id="ring-lwe-समसय-rlwe">Ring-LWE समस्या (RLWE)
&lt;/h3>&lt;p>चूंकि मानक LWE समस्या में मैट्रिक्स संचालन शामिल होता है, इसलिए इसमें ऐसी समस्याएं थीं कि कुंजी का आकार बहुत बड़ा (कभी-कभी गीगाबाइट में) था और कम्प्यूटेशनल दक्षता खराब थी। इसे हल करने के लिए, &lt;strong>Ring-LWE (RLWE) समस्या&lt;/strong>, जो बहुपद वलय (polynomial rings) पर संचालन का उपयोग करती है, पेश की गई थी।&lt;/p>
&lt;p>RLWE में, तत्व बहुपद वलय $R_q = \mathbb{Z}_q[x] / (x^N + 1)$ से संबंधित होते हैं (जहाँ $N$ 2 की घात है, और $q$ एक अभाज्य मापांक (prime modulus) है)।
मान लें कि गुप्त कुंजी एक बहुपद $s(x)$ है, $a(x)$ एक यादृच्छिक बहुपद है, और $e(x)$ एक छोटा शोर बहुपद है, तो सार्वजनिक कुंजी (public key) निम्न जोड़ी बन जाती है:&lt;/p>
$$ (a(x), b(x)) \quad \text{where} \quad b(x) = -a(x) \cdot s(x) + e(x) \pmod q $$
&lt;p>एन्क्रिप्शन के दौरान, इस बहुपद के गुणों का उपयोग प्लेनटेक्स्ट $m(x)$ को एनकोड करने और सिफरटेक्स्ट उत्पन्न करने के लिए किया जाता है।&lt;/p>
&lt;hr>
&lt;h2 id="4-सबस-बड-बध-शर-noise-और-जटर-क-बटसटरपग">4. सबसे बड़ी बाधा &amp;ldquo;शोर (Noise)&amp;rdquo; और जेंट्री की बूटस्ट्रैपिंग
&lt;/h2>&lt;p>FHE को समझने में सबसे महत्वपूर्ण अवधारणा &lt;strong>&amp;ldquo;शोर प्रबंधन (Noise Management)&amp;rdquo;&lt;/strong> है।&lt;/p>
&lt;p>LWE/RLWE-आधारित एन्क्रिप्शन में, सुरक्षा सुनिश्चित करने के लिए जानबूझकर एक छोटा &amp;ldquo;शोर (त्रुटि)&amp;rdquo; शामिल किया जाता है।
मोटे तौर पर कहें সমগ্র, प्लेनटेक्स्ट $m$ के सिफरटेक्स्ट $c$ को डिक्रिप्ट करने की प्रक्रिया को निम्नलिखित सूत्र द्वारा व्यक्त किया जा सकता है:&lt;/p>
$$ D(c) = (c \cdot s) \pmod q = m + \text{noise} $$
&lt;p>डिक्रिप्शन के दौरान, सही प्लेनटेक्स्ट $m$ प्राप्त करने के लिए इस &lt;code>noise&lt;/code> को राउंडिंग जैसी प्रक्रियाओं द्वारा हटा दिया जाता है। हालाँकि, जब सिफरटेक्स्ट के बीच समरूप संचालन (विशेष रूप से गुणा) किया जाता है, तो यह शोर नाटकीय रूप से बढ़ जाता है।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>समरूप जोड़ (Homomorphic Addition)&lt;/strong>: शोर संयोजी रूप से बढ़ता है ($e_1 + e_2$)। यह अपेक्षाकृत क्रमिक वृद्धि है।&lt;/li>
&lt;li>&lt;strong>समरूप जोड़ द्वारा समरूपता की गणितीय अभिव्यक्ति&lt;/strong>:
$$ E(m_1) \oplus E(m_2) = E(m_1 + m_2) $$&lt;/li>
&lt;li>&lt;strong>समरूप गुणा (Homomorphic Multiplication)&lt;/strong>: शोर गुणात्मक रूप से विस्फोटित होता है (क्योंकि इसमें $e_1 \times e_2$ आदि शामिल हैं)। केवल कुछ गुणा के बाद, शोर $q/2$ की सीमा से अधिक हो जाता है, जिससे उचित राउंडिंग प्रक्रिया विफल हो जाती है और डिक्रिप्शन असंभव हो जाता है।&lt;/li>
&lt;li>&lt;strong>समरूप गुणा द्वारा समरूपता की गणितीय अभिव्यक्ति&lt;/strong>:
$$ E(m_1) \otimes E(m_2) = E(m_1 \times m_2) $$&lt;/li>
&lt;/ul>
&lt;p>यही कारण है कि FHE को लंबे समय तक महसूस नहीं किया जा सका, और यह SHE (सीमित संख्या में संचालन के साथ) तक ही सीमित रहा।&lt;/p>
&lt;h3 id="बटसटरपग-bootstrapping-क-जद">बूटस्ट्रैपिंग (Bootstrapping) का जादू
&lt;/h3>&lt;p>क्रेग जेंट्री का सबसे प्रतिभाशाली योगदान &lt;strong>&amp;ldquo;बूटस्ट्रैपिंग&amp;rdquo;&lt;/strong> नामक शोर कम करने वाली तकनीक का आविष्कार था। यह क्रिप्टोग्राफी में एक प्रतिमान बदलाव (paradigm shift) था।&lt;/p>
&lt;p>सहज रूप से, यह एक ऐसा ऑपरेशन है जो &amp;ldquo;सिफरटेक्स्ट के शोर से भर जाने और टूटने से पहले, इसे एन्क्रिप्टेड अवस्था में ही &amp;lsquo;डिक्रिप्ट&amp;rsquo; करके साफ करता है, और इसे एक नए सिफरटेक्स्ट में डालता है।&amp;rdquo;&lt;/p>
&lt;ol>
&lt;li>मान लें कि हमारे पास एक उच्च-शोर वाला सिफरटेक्स्ट $C_{noisy}$ है।&lt;/li>
&lt;li>क्लाइंट पहले से ही सर्वर को निजी कुंजी $sk$ का &amp;ldquo;सार्वजनिक कुंजी द्वारा एन्क्रिप्टेड संस्करण&amp;rdquo; $E_{pk}(sk)$ (जिसे बूटस्ट्रैपिंग कुंजी कहा जाता है) प्रदान करता है।&lt;/li>
&lt;li>सर्वर $C_{noisy}$ पर समरूप रूप से &lt;strong>डिक्रिप्शन सर्किट (Decryption Circuit)&lt;/strong> को निष्पादित करता है।&lt;/li>
&lt;li>विशेष रूप से, यह $E_{pk}(sk)$ का उपयोग करके $E_{pk}(C_{noisy})$ पर &amp;ldquo;एन्क्रिप्टेड स्पेस के भीतर डिक्रिप्शन&amp;rdquo; करता है।&lt;/li>
&lt;li>चूंकि यह डिक्रिप्शन सर्किट स्वयं एक समरूप संचालन है, यह नया शोर पैदा करता है, लेकिन आउटपुट के रूप में उत्पन्न नए सिफरटेक्स्ट $C_{fresh}$ का शोर एक निश्चित &amp;ldquo;निश्चित स्तर (fixed level)&amp;rdquo; पर रीसेट हो जाता है।&lt;/li>
&lt;/ol>
&lt;div class="mermaid">graph LR
A["उच्च-शोर सिफरटेक्स्ट C_noisy"] --> B["समरूप डिक्रिप्शन सर्किट (Eval_Dec)"]
C["एन्क्रिप्टेड निजी कुंजी E(sk)"] --> B
B --> D["निम्न-शोर सिफरटेक्स्ट C_fresh"]
style B fill:#ffeeba,stroke:#ffc107&lt;/div>
&lt;p>गणना के दौरान समय-समय पर इस बूटस्ट्रैपिंग को निष्पादित करके, सिद्धांत रूप में अनंत गहराई के सर्किट की गणना करना संभव हो गया (FHE की उपलब्धि)। हालाँकि, जेंट्री की शुरुआती पद्धति निराशाजनक रूप से महंगी थी, जिसमें बूटस्ट्रैपिंग प्रक्रिया में हर बार कई मिनटों से लेकर कई घंटों तक का समय लगता था।&lt;/p>
&lt;hr>
&lt;h2 id="5-fhe-क-पढय-और-परमख-यजनओ-क-वकस">5. FHE की पीढ़ियाँ और प्रमुख योजनाओं का विकास
&lt;/h2>&lt;p>FHE के व्यावहारिक अनुप्रयोग के लिए, दुनिया भर के क्रिप्टोग्राफर इसके एल्गोरिदम को बेहतर बनाने के लिए प्रतिस्पर्धा कर रहे हैं। वर्तमान में, FHE को मुख्य रूप से 4 पीढ़ियों/श्रेणियों में वर्गीकृत किया गया है।&lt;/p>
&lt;h3 id="दसर-पढ-परणक-पर-सटक-सचलन-bgv-bfv">दूसरी पीढ़ी: पूर्णांकों पर सटीक संचालन (BGV, BFV)
&lt;/h3>&lt;p>&lt;strong>BGV (Brakerski-Gentry-Vaikuntanathan)&lt;/strong> और &lt;strong>BFV (Brakerski/Fan-Vercauteren)&lt;/strong> योजनाएँ 2011 से 2012 के बीच उभरीं। ये RLWE पर आधारित हैं और पूर्णांकों (सटीक गणना) के मॉड्यूलर अंकगणित के लिए उपयुक्त हैं।
वे SIMD (Single Instruction, Multiple Data) जैसी बैचिंग तकनीक का समर्थन करते हैं, जो एक ही विशाल बहुपद सिफरटेक्स्ट में हजारों डेटा स्लॉट पैक करने और एक ही समय में समानांतर गणना करने की अनुमति देता है।&lt;/p>
&lt;h3 id="तसर-पढ-बटसटरपग-क-तवरण-gsw-fhew-tfhe">तीसरी पीढ़ी: बूटस्ट्रैपिंग का त्वरण (GSW, FHEW, TFHE)
&lt;/h3>&lt;p>2013 की &lt;strong>GSW (Gentry-Sahai-Waters)&lt;/strong> योजना ने FHE संरचना को बहुत सरल बना दिया। इससे विकसित होकर वर्तमान मुख्यधारा की योजनाओं में से एक &lt;strong>TFHE (Fast Fully Homomorphic Encryption over the Torus)&lt;/strong> बनी।
TFHE की विशेषता इसकी बहुत तेज़ बूटस्ट्रैपिंग (मिलीसेकंड में) है। यह गेट स्तर (तार्किक सर्किट जैसे AND, XOR) पर संचालन में बहुत प्रभावी है, और सिफरटेक्स्ट का आकार भी अपेक्षाकृत छोटा है, जिससे यह किसी भी तार्किक सर्किट का तेज़ी से मूल्यांकन करने के लिए उपयुक्त हो जाता है।&lt;/p>
&lt;h3 id="चथ-पढ-अनमनत-गणन-और-मशन-लरनग-पर-धयन-कदरत-ckks">चौथी पीढ़ी: अनुमानित गणना और मशीन लर्निंग पर ध्यान केंद्रित (CKKS)
&lt;/h3>&lt;p>2017 में चेओन एट अल. द्वारा प्रस्तावित &lt;strong>CKKS (Cheon-Kim-Kim-Song)&lt;/strong> योजना को वर्तमान AI और मशीन लर्निंग गोपनीयता सुरक्षा में निश्चित तकनीक माना जा सकता है।
जबकि पिछली FHE योजनाओं ने &amp;ldquo;सटीक पूर्णांक गणना&amp;rdquo; पर ध्यान केंद्रित किया, CKKS एन्क्रिप्टेड अवस्था में &lt;strong>&amp;ldquo;फ़्लोटिंग-पॉइंट संख्याओं की अनुमानित गणना&amp;rdquo;&lt;/strong> का समर्थन करता है। यह वास्तविक संख्या गणनाओं में भारी प्रदर्शन प्रदान करता है जहां छोटी त्रुटियां स्वीकार्य हैं, जैसे तंत्रिका नेटवर्क (neural networks) का प्रशिक्षण और अनुमान।&lt;/p>
&lt;p>नीचे दी गई तालिका उद्देश्य के अनुसार योजनाओं को चुनने का सारांश देती है:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">योजना का नाम&lt;/th>
&lt;th style="text-align:left">डेटा प्रकार&lt;/th>
&lt;th style="text-align:left">अनुशंसित उपयोग के मामले&lt;/th>
&lt;th style="text-align:left">विशेषताएँ&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>BFV / BGV&lt;/strong>&lt;/td>
&lt;td style="text-align:left">पूर्णांक (Integer)&lt;/td>
&lt;td style="text-align:left">सटीक सांख्यिकीय गणना, वित्तीय डेटा एकत्रीकरण, DB खोज&lt;/td>
&lt;td style="text-align:left">SIMD बैचिंग के माध्यम से उच्च थ्रूपुट&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>CKKS&lt;/strong>&lt;/td>
&lt;td style="text-align:left">वास्तविक संख्या (Real/Complex)&lt;/td>
&lt;td style="text-align:left">मशीन लर्निंग (DNN, लॉजिस्टिक रिग्रेशन), सिग्नल प्रोसेसिंग&lt;/td>
&lt;td style="text-align:left">अनुमानित गणना के माध्यम से त्वरण, रीस्केलिंग&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>TFHE&lt;/strong>&lt;/td>
&lt;td style="text-align:left">बूलियन (Boolean)&lt;/td>
&lt;td style="text-align:left">मनमाना तार्किक सर्किट, स्ट्रिंग खोज, गैर-रेखीय फ़ंक्शन मूल्यांकन&lt;/td>
&lt;td style="text-align:left">अल्ट्रा-फास्ट बूटस्ट्रैपिंग (मिलीसेकंड स्तर)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="6-वयवहर-म-fhe-लइबरर-और-वचरक-कड">6. व्यवहार में: FHE लाइब्रेरी और वैचारिक कोड
&lt;/h2>&lt;p>आजकल, कई ओपन-सोर्स लाइब्रेरी उपलब्ध हैं जो आपको क्रिप्टोग्राफी के गहरे ज्ञान के बिना FHE का उपयोग करने की अनुमति देती हैं।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Microsoft SEAL (Simple Encrypted Arithmetic Library)&lt;/strong>: BFV, BGV और CKKS का समर्थन करने वाली एक C++ लाइब्रेरी। उद्योग के मानकों में से एक। इसका पायथन बाइंडिंग, &lt;strong>TenSEAL&lt;/strong>, AI इंजीनियरों के बीच बहुत लोकप्रिय है।&lt;/li>
&lt;li>&lt;strong>Zama (Concrete)&lt;/strong>: TFHE पर आधारित एक फ्रेमवर्क। इसे रस्ट/पायथन (Rust/Python) में लिखा जा सकता है और यह मौजूदा PyTorch मॉडल को संकलित (compile) करने और उन्हें FHE (Concrete ML) पर चलाने की सुविधा प्रदान करता है।&lt;/li>
&lt;li>&lt;strong>OpenFHE&lt;/strong>: PALISADE का उत्तराधिकारी, एक व्यापक C++ लाइब्रेरी जो सभी प्रमुख योजनाओं का समर्थन करती है।&lt;/li>
&lt;/ul>
&lt;h3 id="पयथन-tenseal-क-उपयग-करत-हए-fhe-परगरमग-क-उदहरण">पायथन (TenSEAL) का उपयोग करते हुए FHE प्रोग्रामिंग का उदाहरण
&lt;/h3>&lt;p>यहां एक वैचारिक पायथन कोड का उदाहरण दिया गया है जो CKKS योजना का उपयोग करके वास्तविक संख्या वैक्टरों को एन्क्रिप्टेड अवस्था में जोड़ने और गुणा करने को दर्शाता है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">tenseal&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">ts&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. संदर्भ सेटअप (कुंजी पीढ़ी सहित)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># CKKS योजना का उपयोग करें, और बहुपद की डिग्री को 8192 पर सेट करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">context&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ts&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">context&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ts&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">SCHEME_TYPE&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">CKKS&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">poly_modulus_degree&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">8192&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">coeff_mod_bit_sizes&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">60&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">40&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">40&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">60&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">context&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">generate_galois_keys&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">context&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">global_scale&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="mi">40&lt;/span> &lt;span class="c1"># वास्तविक संख्याओं के लिए स्केलिंग कारक&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. क्लाइंट पक्ष: डेटा एन्क्रिप्शन&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">vector1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mf">1.5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">2.5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">3.5&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">vector2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mf">2.0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">3.0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">4.0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># प्लेनटेक्स्ट वेक्टर को सिफरटेक्स्ट में बदलें (मूल रूप से क्लाइंट साइड पर निष्पादित)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">enc_v1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ts&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ckks_vector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">context&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">vector1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">enc_v2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ts&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ckks_vector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">context&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">vector2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. सर्वर पक्ष: एन्क्रिप्टेड अवस्था में गणना (Data in Use की सुरक्षा)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># सर्वर प्लेनटेक्स्ट को नहीं जानता है, लेकिन जोड़ और गुणा कर सकता है&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">enc_add&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">enc_v1&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">enc_v2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">enc_mul&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">enc_v1&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">enc_v2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4. क्लाइंट पक्ष: परिणाम डिक्रिप्शन&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># केवल निजी कुंजी वाला क्लाइंट ही परिणाम देख सकता है&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">res_add&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">enc_add&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decrypt&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">res_mul&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">enc_mul&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decrypt&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;डिक्रिप्टेड जोड़ परिणाम: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">res_add&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># आउटपुट उदाहरण: [3.5000001, 5.5000001, 7.5000002] (अनुमानित गणना के कारण छोटी त्रुटियां शामिल हैं)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;डिक्रिप्टेड गुणा परिणाम: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">res_mul&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># आउटपुट उदाहरण: [3.0000002, 7.5000005, 14.0000003]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>जैसा कि आप उपरोक्त कोड से देख सकते हैं, आप &lt;code>enc_v1 + enc_v2&lt;/code> जैसे नियमित पायथन ऑपरेटरों को ओवरलोड कर सकते हैं, जिससे आप सहज रूप से सिफरटेक्स्ट के बीच गणना लिख सकते हैं। सर्वर पक्ष पर, वेक्टर गणना वेक्टर की सामग्री को जाने बिना पूरी हो जाती है।&lt;/p>
&lt;hr>
&lt;h2 id="7-fhe-क-चनतय-परदरशन-और-हरडवयर-तवरण-hardware-acceleration">7. FHE की चुनौतियाँ: प्रदर्शन और हार्डवेयर त्वरण (Hardware Acceleration)
&lt;/h2>&lt;p>यद्यपि FHE सैद्धांतिक रूप से पूर्ण सुरक्षा प्रदान करता है, व्यावहारिक अनुप्रयोग में सबसे बड़ी चुनौती &lt;strong>&amp;ldquo;प्रदर्शन ओवरहेड (Performance Overhead)&amp;rdquo;&lt;/strong> है।&lt;/p>
&lt;ol>
&lt;li>&lt;strong>कम्प्यूटेशनल ओवरहेड&lt;/strong>: प्लेनटेक्स्ट में गणना की तुलना में, सीपीयू पर सिफरटेक्स्ट में गणना हजारों से दसियों हजार गुना धीमी होती है। बहुपद गुणा और बूटस्ट्रैपिंग के लिए भारी मात्रा में FFT (फास्ट फूरियर ट्रांसफॉर्म) और NTT (नंबर थ्योरेटिक ट्रांसफॉर्म) गणनाओं की आवश्यकता होती है।&lt;/li>
&lt;li>&lt;strong>डेटा आकार का विस्तार (Ciphertext Expansion)&lt;/strong>: कुछ बाइट्स का प्लेनटेक्स्ट एन्क्रिप्ट होने पर कई मेगाबाइट का हो सकता है। यह मेमोरी बैंडविड्थ और नेटवर्क बैंडविड्थ पर बहुत अधिक दबाव डालता है।&lt;/li>
&lt;/ol>
&lt;h3 id="हरडवयर-आधरत-समधन-क-दषटकण">हार्डवेयर-आधारित समाधान का दृष्टिकोण
&lt;/h3>&lt;p>इस ओवरहेड को दूर करने के लिए, दुनिया भर में FHE-विशिष्ट हार्डवेयर त्वरक (ASIC, FPGA, GPU समर्थन) विकसित किए जा रहे हैं।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>GPU त्वरण (GPU Acceleration)&lt;/strong>: NVIDIA जैसे शक्तिशाली GPU का उपयोग करके NTT गणनाओं और बूटस्ट्रैपिंग को समानांतर करने के प्रयास चल रहे हैं, जिसमें सॉफ्टवेयर कार्यान्वयन की तुलना में दसियों गुना गति में वृद्धि की सूचना है (उदाहरण: 100x.ai, Zama का TFHE-rs CUDA बैकएंड)।&lt;/li>
&lt;li>&lt;strong>DARPA DPRIVE प्रोजेक्ट&lt;/strong>: US डिफेंस एडवांस्ड रिसर्च प्रोजेक्ट्स एजेंसी (DARPA) &amp;ldquo;DPRIVE (Data Protection in Virtual Environments)&amp;rdquo; नामक एक समर्पित हार्डवेयर विकास परियोजना चला रही है, जिसका उद्देश्य FHE की गणना गति को प्लेनटेक्स्ट प्रोसेसिंग गति (10 गुना के ओवरहेड के भीतर) के बराबर स्तर तक बढ़ाना है, जिसमें इंटेल (Intel), माइक्रोसॉफ्ट (Microsoft), और इंटेलेक्चुअल वेंचर्स (Intellectual Ventures) भाग ले रहे हैं।&lt;/li>
&lt;li>&lt;strong>FPU (FHE Processing Unit) का आगमन&lt;/strong>: कॉर्नमी (Cornami) और ऑप्टालिसिस (Optalysys) जैसे स्टार्टअप ऑप्टिकल कंप्यूटिंग और विशेष सिलिकॉन आर्किटेक्चर का उपयोग करके समर्पित FHE चिप्स विकसित कर रहे हैं।&lt;/li>
&lt;/ul>
&lt;p>निकट भविष्य में, ऐसा समय आ सकता है जब AI में NPU (Neural Processing Unit) की तरह सर्वर और क्लाउड इन्फ्रास्ट्रक्चर में &amp;ldquo;FPU&amp;rdquo; मानक उपकरण के रूप में स्थापित हो जाएंगे।&lt;/p>
&lt;hr>
&lt;h2 id="8-अपकषत-उपयग-क-ममल-expected-use-cases">8. अपेक्षित उपयोग के मामले (Expected Use Cases)
&lt;/h2>&lt;p>अब जब FHE व्यावहारिक गति तक पहुँच रहा है, तो निम्नलिखित क्षेत्रों में विनाशकारी नवाचारों (disruptive innovations) की उम्मीद है:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>चिकित्सा और जीनोमिक विश्लेषण में गोपनीयता संरक्षण&lt;/strong>:
विभिन्न अस्पतालों से रोगियों के मेडिकल रिकॉर्ड और डीएनए डेटा को FHE का उपयोग करके एन्क्रिप्टेड अवस्था में क्लाउड AI द्वारा प्रशिक्षित किया जा सकता है, जो गोपनीयता कानूनों (जैसे HIPAA और GDPR) का उल्लंघन किए बिना अत्यधिक सटीक कैंसर निदान मॉडल और नई दवा के विकास को सक्षम करता है।&lt;/li>
&lt;li>&lt;strong>वित्तीय संस्थानों में धोखाधड़ी का पता लगाना और एंटी-मनी लॉन्ड्रिंग (AML)&lt;/strong>:
प्रतिस्पर्धी बैंक ग्राहकों के खाते की जानकारी और लेन-देन के इतिहास को प्रकट किए बिना, एन्क्रिप्टेड अवस्था में एक-दूसरे के डेटा को क्रॉस-चेक कर सकते हैं, जिससे विशाल धन शोधन नेटवर्क का पता लगाने के लिए क्रॉस-बैंक विश्लेषण संभव हो जाता है।&lt;/li>
&lt;li>&lt;strong>सुरक्षित AI अनुमान API (MaaS: Model as a Service)&lt;/strong>:
उपयोगकर्ता अपनी आवाज़, चेहरे की छवियों और संकेतों (prompts) को एन्क्रिप्ट कर सकते हैं और उन्हें AI सेवाओं (जैसे कि ChatGPT जैसे LLM) में भेज सकते हैं। AI प्रदाता उपयोगकर्ता के इनपुट को जाने बिना उत्तर उत्पन्न करते हैं और इसे सिफरटेक्स्ट के रूप में वापस करते हैं। यह &amp;ldquo;AI द्वारा व्यक्तिगत जानकारी सीखने या झाँकने&amp;rdquo; की चिंताओं को पूरी तरह से दूर करता है।&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="9-नषकरष-करपटगरफ-क-भवषय-अदशय-गणन-invisible-computing-क-ओर">9. निष्कर्ष: क्रिप्टोग्राफी का भविष्य &amp;ldquo;अदृश्य गणना (Invisible Computing)&amp;rdquo; की ओर
&lt;/h2>&lt;p>जिस तरह 1970 के दशक में सार्वजनिक कुंजी एन्क्रिप्शन (RSA) के आविष्कार ने इंटरनेट पर सुरक्षित संचार (जैसे HTTPS) को संभव बनाया, उसी तरह क्रेग जेंट्री द्वारा FHE का आविष्कार क्रिप्टोग्राफी के इतिहास में सबसे महत्वपूर्ण मील के पत्थरों में से एक है।&lt;/p>
&lt;p>वर्तमान में, पूर्ण समरूप एन्क्रिप्शन (FHE) प्रयोगशाला के सिद्धांत से बाहर आ गया है और ऐसे चरण में प्रवेश कर गया है जहां Microsoft, IBM, Intel, Google और कई स्टार्टअप इसे व्यावहारिक बनाने के लिए प्रतिस्पर्धा कर रहे हैं। हालांकि कम्प्यूटेशनल लागत और डेटा आकार की चुनौतियां अभी भी मौजूद हैं, एल्गोरिदम के शोधन और हार्डवेयर त्वरक के विकास के कारण, मूर के नियम (Moore&amp;rsquo;s Law) से अधिक गति से प्रदर्शन में सुधार जारी है।&lt;/p>
&lt;p>कुछ ही वर्षों में, &amp;ldquo;एन्क्रिप्टेड रहने के दौरान डेटा की गणना करना&amp;rdquo; कोई विशेष बात नहीं होगी, बल्कि यह क्लाउड सेवाओं में एक मानक डेटा सुरक्षा सर्वोत्तम अभ्यास बन जाएगा। FHE अगली पीढ़ी की सुरक्षा का प्रमुख तत्व है, जो डेटा-संचालित समाज में &lt;strong>परम गोपनीयता और डेटा उपयोग के बीच संतुलन&lt;/strong> को साकार करता है।&lt;/p></description></item><item><title>एलिप्टिक कर्व क्रिप्टोग्राफी (ECC) का गणितीय आधार और C++ में इसका कार्यान्वयन</title><link>http://kenji.blog/hi/p/elliptic-curve-cryptography-math-cpp/</link><pubDate>Fri, 11 Sep 2026 10:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/elliptic-curve-cryptography-math-cpp/</guid><description>&lt;img src="http://kenji.blog/p/elliptic-curve-cryptography-math-cpp/img/eyecatch.jpg" alt="Featured image of post एलिप्टिक कर्व क्रिप्टोग्राफी (ECC) का गणितीय आधार और C++ में इसका कार्यान्वयन" />&lt;h1 id="एलपटक-करव-करपटगरफ-ecc-क-गणतय-आधर-और-c-म-इसक-करयनवयन">एलिप्टिक कर्व क्रिप्टोग्राफी (ECC) का गणितीय आधार और C++ में इसका कार्यान्वयन
&lt;/h1>&lt;p>आधुनिक क्रिप्टोग्राफी में, &lt;strong>एलिप्टिक कर्व क्रिप्टोग्राफी (Elliptic Curve Cryptography: ECC)&lt;/strong> अत्यंत महत्वपूर्ण भूमिका निभाती है। हमारे दैनिक इंटरनेट संचार (HTTPS/TLS) से लेकर, स्मार्टफोन के सुरक्षित एन्क्लेव, SSH के माध्यम से सर्वर प्रमाणीकरण, FIDO जैसे पासवर्ड रहित प्रमाणीकरण, और यहाँ तक कि बिटकॉइन और एथेरियम जैसी क्रिप्टो संपत्तियों तक, यह कहना अतिशयोक्ति नहीं होगी कि आधुनिक डिजिटल समाज का विश्वास आधार ECC द्वारा समर्थित है।&lt;/p>
&lt;p>इस लेख में, हम विस्तार से समझाएंगे कि एलिप्टिक कर्व क्रिप्टोग्राफी कैसे काम करती है, इसके पीछे के सुंदर लेकिन जटिल गणितीय सिद्धांत (परिमित क्षेत्र पर बीजगणितीय ज्यामिति) से शुरू करते हुए, वास्तविक C++ का उपयोग करके कार्यान्वयन विधि, और यहां तक कि साइड-चैनल हमलों (टाइमिंग हमलों) को रोकने के लिए सुरक्षित कोडिंग तकनीक तक।&lt;/p>
&lt;hr>
&lt;h2 id="1-एलपटक-करव-करपटगरफ-कय-rsa-क-सथ-तलन">1. एलिप्टिक कर्व क्रिप्टोग्राफी क्यों? (RSA के साथ तुलना)
&lt;/h2>&lt;p>पब्लिक-की क्रिप्टोग्राफी का पर्याय लंबे समय से &lt;strong>RSA एन्क्रिप्शन&lt;/strong> रहा है। RSA एन्क्रिप्शन अपनी सुरक्षा के आधार के रूप में &amp;ldquo;बड़े समग्र संख्याओं के अभाज्य गुणनखंडन की कठिनाई&amp;rdquo; पर निर्भर करता है। हालांकि, कंप्यूटर की गणना क्षमता में सुधार के साथ, सुरक्षा बनाए रखने के लिए RSA की कुंजी की लंबाई (मोडुलस के बिट्स की संख्या) को लगातार बढ़ाने की आवश्यकता उत्पन्न हुई है। वर्तमान में, कम से कम 2048 बिट्स, और अधिक सुरक्षित होने के लिए 3072 बिट्स या 4096 बिट्स की कुंजी की लंबाई की सिफारिश की जाती है।&lt;/p>
&lt;p>इसके विपरीत, एलिप्टिक कर्व क्रिप्टोग्राफी (ECC) अपनी सुरक्षा के लिए &lt;strong>&amp;ldquo;एलिप्टिक कर्व पर असतत लघुगणक समस्या (Discrete Logarithm Problem on Elliptic Curves - ECDLP)&amp;rdquo;&lt;/strong> नामक एक अलग गणितीय कठिनाई पर निर्भर करता है। ECDLP को हल करने के लिए आज तक कोई कुशल एल्गोरिदम (जैसे सब-एक्सपोनेंशियल टाइम एल्गोरिदम) नहीं खोजा जा सका है, और यहां तक कि ज्ञात सबसे कुशल हमले के तरीके भी घातांकीय (exponential) समय लेते हैं।&lt;/p>
&lt;p>इस गुण के कारण, ECC का यह निर्णायक लाभ है कि यह &lt;strong>बहुत छोटी कुंजी की लंबाई के साथ RSA के समान सुरक्षा शक्ति प्राप्त कर सकता है&lt;/strong>।&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:center">सुरक्षा शक्ति (बिट्स)&lt;/th>
&lt;th style="text-align:center">RSA एन्क्रिप्शन कुंजी की लंबाई (बिट्स)&lt;/th>
&lt;th style="text-align:center">एलिप्टिक कर्व क्रिप्टोग्राफी कुंजी की लंबाई (बिट्स)&lt;/th>
&lt;th style="text-align:center">कुंजी की लंबाई का अनुपात&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:center">80&lt;/td>
&lt;td style="text-align:center">1024&lt;/td>
&lt;td style="text-align:center">160&lt;/td>
&lt;td style="text-align:center">1:6&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">112&lt;/td>
&lt;td style="text-align:center">2048&lt;/td>
&lt;td style="text-align:center">224&lt;/td>
&lt;td style="text-align:center">1:9&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">128&lt;/td>
&lt;td style="text-align:center">3072&lt;/td>
&lt;td style="text-align:center">256&lt;/td>
&lt;td style="text-align:center">1:12&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">192&lt;/td>
&lt;td style="text-align:center">7680&lt;/td>
&lt;td style="text-align:center">384&lt;/td>
&lt;td style="text-align:center">1:20&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">256&lt;/td>
&lt;td style="text-align:center">15360&lt;/td>
&lt;td style="text-align:center">512&lt;/td>
&lt;td style="text-align:center">1:30&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>जैसा कि ऊपर दी गई तालिका दिखाती है, 128-बिट सुरक्षा शक्ति (वर्तमान मानक शक्ति) प्राप्त करने के लिए, RSA को 3072-बिट कुंजी की आवश्यकता होती है, लेकिन ECC के साथ केवल 256 बिट्स की आवश्यकता होती है। इससे गणना को कम करना, मेमोरी के उपयोग को कम करना और नेटवर्क बैंडविड्थ को सहेजना संभव हो जाता है, जिससे यह विशेष रूप से सीमित संसाधनों वाले IoT उपकरणों और स्मार्ट कार्ड वातावरण में अत्यधिक फायदेमंद हो जाता है।&lt;/p>
&lt;hr>
&lt;h2 id="2-गणतय-तयर-समह-सदधत-group-theory-और-परमत-कषतर-finite-fields-क-दनय">2. गणितीय तैयारी: समूह सिद्धांत (Group Theory) और परिमित क्षेत्र (Finite Fields) की दुनिया
&lt;/h2>&lt;p>एलिप्टिक कर्व क्रिप्टोग्राफी को वास्तव में समझने के लिए, सार बीजगणित (समूह सिद्धांत और क्षेत्र सिद्धांत) की बुनियादी अवधारणाओं को समझना आवश्यक है। यहाँ हम ECC के निर्माण के लिए आवश्यक पूर्वज्ञान का संक्षेप में सारांश दे रहे हैं।&lt;/p>
&lt;h3 id="21-समह-group-और-एबलयन-समह-abelian-group">2.1. समूह (Group) और एबेलियन समूह (Abelian Group)
&lt;/h3>&lt;p>&lt;strong>समूह (Group)&lt;/strong> एक सेट $G$ और उस सेट पर एक बाइनरी ऑपरेशन (यहाँ हम जोड़ $+$ मानेंगे) का संयोजन $(G, +)$ है, जो निम्नलिखित 4 स्वयंसिद्धों (axioms) को पूरा करता है।&lt;/p>
&lt;ol>
&lt;li>&lt;strong>संवृतता (Closure)&lt;/strong>: किन्हीं $a, b \in G$ के लिए, $a + b \in G$ होता है।&lt;/li>
&lt;li>&lt;strong>साहचर्य (Associativity)&lt;/strong>: किन्हीं $a, b, c \in G$ के लिए, $(a + b) + c = a + (b + c)$ लागू होता है।&lt;/li>
&lt;li>&lt;strong>तत्समक अवयव का अस्तित्व (Identity element)&lt;/strong>: किसी भी $a \in G$ के लिए, एक ऐसा अवयव $e \in G$ मौजूद होता है कि $a + e = e + a = a$। एक योगात्मक समूह (additive group) के मामले में, इस तत्समक अवयव को आमतौर पर $0$ या $\mathcal{O}$ के रूप में दर्शाया जाता है।&lt;/li>
&lt;li>&lt;strong>प्रतिलोम अवयव का अस्तित्व (Inverse element)&lt;/strong>: किसी भी $a \in G$ के लिए, एक ऐसा अवयव $b \in G$ मौजूद होता है कि $a + b = b + a = e$। इस $b$ को $-a$ के रूप में दर्शाया जाता है।&lt;/li>
&lt;/ol>
&lt;p>इसके अलावा, एक समूह जिसमें संक्रियाओं के क्रम को बदलने से परिणाम नहीं बदलता है, अर्थात जो निम्नलिखित शर्त को पूरा करता है, उसे &lt;strong>एबेलियन समूह (Abelian group या क्रमविनिमेय समूह)&lt;/strong> कहा जाता है।&lt;/p>
&lt;ol start="5">
&lt;li>&lt;strong>क्रमविनिमेयता (Commutativity)&lt;/strong>: किन्हीं $a, b \in G$ के लिए, $a + b = b + a$ लागू होता है।&lt;/li>
&lt;/ol>
&lt;p>एलिप्टिक कर्व पर बिंदुओं का सेट, एक विशिष्ट जोड़ नियम को परिभाषित करके, इस &lt;strong>एबेलियन समूह&lt;/strong> का निर्माण करता है।&lt;/p>
&lt;h3 id="22-परमत-कषतर-finite-field">2.2. परिमित क्षेत्र (Finite Field)
&lt;/h3>&lt;p>क्रिप्टोग्राफी में, हम वास्तविक या सम्मिश्र संख्याओं जैसे निरंतर और असीम अवयवों वाले क्षेत्रों के बजाय &lt;strong>परिमित क्षेत्र (Finite Field)&lt;/strong> या गैलवा क्षेत्र (Galois Field) का उपयोग करते हैं, जिनमें अवयवों की संख्या परिमित होती है।&lt;/p>
&lt;p>सबसे बुनियादी परिमित क्षेत्र अभाज्य संख्या $p$ का उपयोग करने वाला &lt;strong>अभाज्य क्षेत्र (Prime Field) $\mathbb{F}_p$&lt;/strong> है। यह पूर्णांकों के सेट $\{0, 1, 2, \dots, p-1\}$ पर मॉड्यूलो $p$ (अर्थात $p$ से विभाजित करने पर शेषफल) के अंतर्गत चार बुनियादी अंकगणितीय संक्रियाओं (जोड़, घटाव, गुणा, भाग) को परिभाषित करता है।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>जोड़&lt;/strong>: $(a + b) \pmod p$&lt;/li>
&lt;li>&lt;strong>घटाव&lt;/strong>: $(a - b) \pmod p$&lt;/li>
&lt;li>&lt;strong>गुणा&lt;/strong>: $(a \times b) \pmod p$&lt;/li>
&lt;li>&lt;strong>भाग&lt;/strong>: $a \times b^{-1} \pmod p$ (जहाँ $b^{-1}$ मॉड्यूलो $p$ के तहत $b$ का गुणनात्मक प्रतिलोम है)&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>गुणनात्मक प्रतिलोम (Modular Multiplicative Inverse)&lt;/strong> की गणना क्रिप्टोग्राफ़िक कार्यान्वयन में बहुत महत्वपूर्ण है। $b \times b^{-1} \equiv 1 \pmod p$ को संतुष्ट करने वाले $b^{-1}$ को खोजने के लिए मुख्य रूप से निम्नलिखित दो एल्गोरिदम का उपयोग किया जाता है।&lt;/p>
&lt;ol>
&lt;li>&lt;strong>विस्तारित यूक्लिडियन एल्गोरिदम (Extended Euclidean Algorithm)&lt;/strong>: यह तेज़ है, लेकिन कार्यान्वयन के आधार पर, प्रसंस्करण समय इनपुट मान पर निर्भर कर सकता है, जिससे टाइमिंग हमलों का जोखिम होता है।&lt;/li>
&lt;li>&lt;strong>फ़र्मेट का छोटा प्रमेय (Fermat&amp;rsquo;s Little Theorem)&lt;/strong>: जब $p$ एक अभाज्य संख्या है और $b \neq 0$ है, तो $b^{p-1} \equiv 1 \pmod p$ लागू होता है। दोनों पक्षों को $b$ से विभाजित करने पर, हमें $b^{p-2} \equiv b^{-1} \pmod p$ मिलता है। दूसरे शब्दों में, $b$ की घात $p-2$ की गणना करके प्रतिलोम पाया जा सकता है। चूंकि घातांकीकरण (exponentiation) को निरंतर समय (constant time) में लागू करना आसान होता है, इसलिए क्रिप्टोग्राफ़िक कार्यान्वयन में इसे प्राथमिकता दी जाती है।&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="3-एलपटक-करव-क-समकरण-और-जयमत">3. एलिप्टिक कर्व के समीकरण और ज्यामिति
&lt;/h2>&lt;h3 id="31-वयरसटरस-क-समनय-रप-weierstrass-normal-form">3.1. वियरस्ट्रास का सामान्य रूप (Weierstrass Normal Form)
&lt;/h3>&lt;p>&lt;strong>एलिप्टिक कर्व (Elliptic Curve)&lt;/strong> आम तौर पर एक समतलीय वक्र (plane curve) होता है जिसे निम्नलिखित &lt;strong>वियरस्ट्रास के सामान्य रूप (Weierstrass normal form)&lt;/strong> नामक समीकरण द्वारा परिभाषित किया जाता है।&lt;/p>
$$ y^2 = x^3 + ax + b $$
&lt;p>यहाँ, $a$ और $b$ स्थिरांक हैं, और इस शर्त के रूप में कि वक्र में कोई एकवचन बिंदु (singular points जैसे स्व-प्रतिच्छेदन या कस्प) न हो (अर्थात यह एक चिकना वक्र हो), यह आवश्यक है कि निम्नलिखित &lt;strong>विविक्तकर (Discriminant) $\Delta$&lt;/strong> शून्य न हो।&lt;/p>
$$ \Delta = -16(4a^3 + 27b^2) \neq 0 $$
&lt;p>चूंकि एकवचन बिंदुओं वाले वक्र क्रिप्टोग्राफ़िक सुरक्षा से समझौता करते हैं, इसलिए गुणांक $a, b$ को हमेशा इस शर्त को पूरा करने के लिए चुना जाता है।&lt;/p>
&lt;h3 id="32-अनत-पर-बद-point-at-infinity">3.2. अनंत पर बिंदु (Point at Infinity)
&lt;/h3>&lt;p>एलिप्टिक कर्व को गणितीय रूप से पूर्ण समूह बनाने के लिए, हम समतल के बिंदुओं के अलावा &lt;strong>&amp;ldquo;अनंत पर बिंदु (Point at Infinity)&amp;rdquo;&lt;/strong> नामक एक आभासी बिंदु पेश करते हैं। इसे $\mathcal{O}$ (ओ) के रूप में दर्शाया जाता है।&lt;/p>
&lt;p>अनंत पर बिंदु $\mathcal{O}$ को उस बिंदु के रूप में परिभाषित किया गया है जहाँ सभी ऊर्ध्वाधर रेखाएँ अनंत में प्रतिच्छेद करती हैं। समूह सिद्धांत में, यह अनंत पर बिंदु $\mathcal{O}$ &lt;strong>जोड़ के तहत तत्समक अवयव&lt;/strong> (शून्य) के रूप में कार्य करता है।&lt;/p>
&lt;p>अर्थात, वक्र पर किसी भी बिंदु $P$ के लिए, निम्नलिखित लागू होता है।
&lt;/p>
$$ P + \mathcal{O} = \mathcal{O} + P = P $$
&lt;p>इसके अलावा, बिंदु $P = (x, y)$ का प्रतिलोम $-P$, x-अक्ष के सममित बिंदु $(x, -y)$ के रूप में परिभाषित किया गया है। इसलिए:
&lt;/p>
$$ P + (-P) = \mathcal{O} $$
&lt;p>
होता है।&lt;/p>
&lt;hr>
&lt;h2 id="4-एलपटक-करव-पर-समह-सचलन-बद-जड-और-दहरकरण">4. एलिप्टिक कर्व पर समूह संचालन (बिंदु जोड़ और दोहरीकरण)
&lt;/h2>&lt;p>एलिप्टिक कर्व क्रिप्टोग्राफी का मूल वक्र पर बिंदुओं के बीच &lt;strong>&amp;ldquo;जोड़ (Addition)&amp;rdquo;&lt;/strong> का संचालन है। यह सामान्य पूर्णांकों के जोड़ से अलग है और ज्यामितीय संचालन के आधार पर परिभाषित किया गया है।&lt;/p>
&lt;h3 id="41-जयमतय-जड-tangent-and-chord-method">4.1. ज्यामितीय जोड़ (Tangent and Chord Method)
&lt;/h3>&lt;p>वक्र पर दो अलग-अलग बिंदुओं $P$ और $Q$ को जोड़कर एक नया बिंदु $R$ ($R = P + Q$) खोजने की प्रक्रिया इस प्रकार है।&lt;/p>
&lt;ol>
&lt;li>बिंदु $P$ और बिंदु $Q$ से गुजरने वाली एक रेखा (जीवा/chord) खींचें।&lt;/li>
&lt;li>यह रेखा हमेशा एलिप्टिक कर्व को एक और बिंदु पर प्रतिच्छेद करेगी (आइए इसे $-R$ कहें)। (*बीजगणितीय ज्यामिति के एक प्रमेय के अनुसार)&lt;/li>
&lt;li>प्रतिच्छेदन बिंदु $-R$ को x-अक्ष पर प्रतिबिंबित करने (y-निर्देशांक के चिह्न को उलटने) से प्राप्त बिंदु, वांछित बिंदु $R$ है।&lt;/li>
&lt;/ol>
&lt;div class="mermaid">graph TD
Step1["P(x1, y1) और Q(x2, y2) को जोड़ने वाली एक रेखा खींचें"] --> Step2["वक्र के साथ तीसरे प्रतिच्छेदन बिंदु -R को खोजें"]
Step2 --> Step3["-R को x-अक्ष पर प्रतिबिंबित करें और R(x3, y3) प्राप्त करें"]
Step3 -.-> Result["यह R = P + Q है"]&lt;/div>
&lt;h3 id="42-बद-क-दहरकरण-point-doubling">4.2. बिंदु का दोहरीकरण (Point Doubling)
&lt;/h3>&lt;p>जब एक ही बिंदु $P$ को बिंदु $P$ में जोड़ा जाता है ($P + P = 2P$), तो दो बिंदुओं से गुजरने वाली रेखा खींचना संभव नहीं है। इस मामले में, हम &lt;strong>बिंदु $P$ पर वक्र की स्पर्शरेखा (Tangent)&lt;/strong> खींचते हैं।&lt;/p>
&lt;ol>
&lt;li>बिंदु $P$ पर वक्र की स्पर्शरेखा खींचें।&lt;/li>
&lt;li>यह स्पर्शरेखा वक्र को एक अन्य बिंदु $-R$ पर प्रतिच्छेद करती है।&lt;/li>
&lt;li>प्रतिच्छेदन बिंदु को x-अक्ष पर प्रतिबिंबित करने से प्राप्त बिंदु वांछित बिंदु $R = 2P$ है।&lt;/li>
&lt;/ol>
&lt;h3 id="43-बजगणतय-गणन-सतर">4.3. बीजगणितीय गणना सूत्र
&lt;/h3>&lt;p>ज्यामितीय संक्रियाओं को बीजगणितीय सूत्रों में बदला जाता है ताकि कंप्यूटर द्वारा उनकी गणना की जा सके।
सभी गणनाएँ &lt;strong>परिमित क्षेत्र $\mathbb{F}_p$ (मॉड्यूलो $p$) पर&lt;/strong> की जाती हैं।&lt;/p>
&lt;p>मान लें कि बिंदु $P = (x_1, y_1)$ और बिंदु $Q = (x_2, y_2)$ हैं।
यह भी मान लें कि गणना के परिणाम का बिंदु $R = P + Q = (x_3, y_3)$ है।&lt;/p>
&lt;p>मान लें कि रेखा का ढलान $\lambda$ (लैम्ब्डा) है।&lt;/p>
&lt;p>&lt;strong>【स्थिति 1: $P \neq Q$ होने पर (बिंदु जोड़)】&lt;/strong>
ढलान $\lambda$ दो बिंदुओं के बीच परिवर्तन की दर है।
&lt;/p>
$$ \lambda \equiv \frac{y_2 - y_1}{x_2 - x_1} \pmod p $$
$$ \lambda \equiv (y_2 - y_1) \cdot (x_2 - x_1)^{-1} \pmod p $$
&lt;p>इस $\lambda$ का उपयोग करके, $x_3, y_3$ निम्न प्रकार से ज्ञात किए जा सकते हैं।
&lt;/p>
$$ x_3 \equiv \lambda^2 - x_1 - x_2 \pmod p $$
$$ y_3 \equiv \lambda(x_1 - x_3) - y_1 \pmod p $$
&lt;p>&lt;strong>【स्थिति 2: $P = Q$ होने पर (बिंदु का दोहरीकरण)】&lt;/strong>
ढलान $\lambda$ स्पर्शरेखा का ढलान है जिसे अवकलन (differentiation) द्वारा पाया जाता है। (हम $y^2 = x^3 + ax + b$ का अंतर्निहित अवकलन करते हैं)
&lt;/p>
$$ 2y \cdot y' = 3x^2 + a \implies y' = \frac{3x^2 + a}{2y} $$
&lt;p>
इसलिए,
&lt;/p>
$$ \lambda \equiv (3x_1^2 + a) \cdot (2y_1)^{-1} \pmod p $$
&lt;p>$x_3, y_3$ के समीकरण जोड़ के समान रूप में हैं, लेकिन चूँकि $x_2 = x_1$ है, इसलिए वे निम्न प्रकार हो जाते हैं।
&lt;/p>
$$ x_3 \equiv \lambda^2 - 2x_1 \pmod p $$
$$ y_3 \equiv \lambda(x_1 - x_3) - y_1 \pmod p $$
&lt;blockquote>
&lt;p>[!IMPORTANT]
इन सूत्रों में $(x_2 - x_1)^{-1}$ और $(2y_1)^{-1}$ जैसे &lt;strong>विभाजन (मॉड्यूलर प्रतिलोम की गणना)&lt;/strong> शामिल हैं। मॉड्यूलर प्रतिलोम की गणना की कम्प्यूटेशनल लागत बहुत अधिक होती है, इसलिए वास्तविक कार्यान्वयन में, &lt;strong>&amp;ldquo;जैकोबियन कोऑर्डिनेट्स (Jacobian Coordinates)&amp;rdquo;&lt;/strong> जैसी प्रक्षेपीय समन्वय प्रणालियों (projective coordinate systems) का आमतौर पर उपयोग किया जाता है जो विभाजन को विलंबित करते हैं।&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="5-अदश-गणन-scalar-multiplication-और-एलपटक-करव-असतत-लघगणक-समसय-ecdlp">5. अदिश गुणन (Scalar Multiplication) और एलिप्टिक कर्व असतत लघुगणक समस्या (ECDLP)
&lt;/h2>&lt;p>एलिप्टिक कर्व क्रिप्टोग्राफी में, वह संक्रिया जिसमें सबसे अधिक गणना की आवश्यकता होती है और जो सुरक्षा का मूल है, वह &lt;strong>अदिश गुणन (Scalar Multiplication)&lt;/strong> है।&lt;/p>
&lt;h3 id="51-अदश-गणन-कय-ह">5.1. अदिश गुणन क्या है?
&lt;/h3>&lt;p>किसी बिंदु $P$ को $k$ बार जोड़ने की क्रिया को अदिश गुणन कहा जाता है, और इसे $kP$ के रूप में दर्शाया जाता है।
&lt;/p>
$$ kP = \underbrace{P + P + \dots + P}_{k\text{ बार}} $$
&lt;p>यहाँ, $k$ एक बहुत बड़ा पूर्णांक है (उदाहरण के लिए, 256-बिट पूर्णांक)।&lt;/p>
&lt;h3 id="52-एलपटक-करव-असतत-लघगणक-समसय-ecdlp">5.2. एलिप्टिक कर्व असतत लघुगणक समस्या (ECDLP)
&lt;/h3>&lt;p>एलिप्टिक कर्व क्रिप्टोग्राफी की सुरक्षा निम्नलिखित समस्या की कठिनाई पर निर्भर करती है।&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>एलिप्टिक कर्व असतत लघुगणक समस्या (Elliptic Curve Discrete Logarithm Problem: ECDLP)&lt;/strong>
एक ज्ञात बिंदु $P$ (आधार बिंदु) और एक गणना किए गए परिणामी बिंदु $Q$ को देखते हुए, अदिश (scalar) $k$ खोजें जो $Q = kP$ को संतुष्ट करता हो।&lt;/p>
&lt;/blockquote>
&lt;p>$k$ और $P$ से $Q$ की गणना करना (आगे की दिशा) बाद में वर्णित एल्गोरिदम का उपयोग करके आसान (बहुपद समय) है, लेकिन $P$ और $Q$ से $k$ की उल्टी गणना (विपरीत दिशा) करना लगभग असंभव है (यह एक वन-वे फ़ंक्शन है), सिवाय ब्रूट-फोर्स खोज के इसके लिए कोई कुशल समाधान नहीं है।
क्रिप्टोग्राफ़िक प्रोटोकॉल में, &lt;strong>$k$ &amp;ldquo;निजी कुंजी (Private Key)&amp;rdquo; से मेल खाता है, और $Q$ &amp;ldquo;सार्वजनिक कुंजी (Public Key)&amp;rdquo;&lt;/strong> से मेल खाता है।&lt;/p>
&lt;h3 id="53-डबल-एड-ऐड-double-and-add-एलगरदम">5.3. डबल-एंड-ऐड (Double-and-Add) एल्गोरिदम
&lt;/h3>&lt;p>यदि $k$ एक विशाल संख्या है (उदा: $2^{256}$), तो $P$ को सीधे $k$ बार जोड़ना ब्रह्मांड के जीवनकाल में भी पूरा नहीं होगा। इसलिए, अदिश गुणन को तेज़ी से करने के लिए &lt;strong>डबल-एंड-ऐड विधि (Double-and-Add method या बाइनरी विधि)&lt;/strong> का उपयोग किया जाता है।&lt;/p>
&lt;p>यह पूर्णांकों के घातांकीकरण को तेज़ी से गणना करने के लिए &amp;ldquo;स्क्वेयर-एंड-मल्टीप्लाई (square-and-multiply)&amp;rdquo; विधि का एलिप्टिक कर्व संस्करण है। यह अदिश $k$ को बाइनरी में दर्शाता है और सबसे महत्वपूर्ण बिट (MSB) से शुरू करके क्रमिक रूप से संसाधित करता है।&lt;/p>
&lt;ol>
&lt;li>परिणाम को संग्रहीत करने के लिए बिंदु $R$ को $\mathcal{O}$ से प्रारंभ करें।&lt;/li>
&lt;li>$k$ के सबसे महत्वपूर्ण बिट (MSB) से सबसे कम महत्वपूर्ण बिट (LSB) तक निम्न को दोहराएं:
&lt;ul>
&lt;li>$R$ को दोगुना करें (Point Doubling: $R = 2R$)&lt;/li>
&lt;li>यदि वर्तमान बिट &lt;code>1&lt;/code> है, तो $R$ में $P$ जोड़ें (Point Addition: $R = R + P$)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>इस एल्गोरिदम के माध्यम से, कम्प्यूटेशनल जटिलता $O(k)$ से $O(\log_2 k)$ तक नाटकीय रूप से कम हो जाती है, जिससे यथार्थवादी समय (मिलीसेकंड में) में गणना संभव हो जाती है।&lt;/p>
&lt;hr>
&lt;h2 id="6-एलपटक-करव-डफ-हलमन-ecdh-कज-वनमय-key-exchange">6. एलिप्टिक कर्व डिफी-हेलमैन (ECDH) कुंजी विनिमय (Key Exchange)
&lt;/h2>&lt;p>यहाँ हम &lt;strong>ECDH (Elliptic Curve Diffie-Hellman) कुंजी विनिमय प्रोटोकॉल&lt;/strong> के तंत्र की व्याख्या करेंगे, जो ECC का सबसे विशिष्ट अनुप्रयोग है। ECDH ऐलिस और बॉब को एक असुरक्षित संचार चैनल पर सुरक्षित रूप से एक सामान्य गुप्त कुंजी (सत्र कुंजी/session key) उत्पन्न करने और साझा करने की अनुमति देता है (यह TLS हैंडशेक का मूल है)।&lt;/p>
&lt;p>&lt;strong>【पूर्वापेक्षित पैरामीटर (डोमेन पैरामीटर)】&lt;/strong>
दोनों पक्ष पहले से उपयोग किए जाने वाले एलिप्टिक कर्व $E$, अभाज्य संख्या $p$, और आधार बिंदु $G$ को साझा करते हैं। (उदाहरण के लिए NIST P-256 या secp256k1 आदि)&lt;/p>
&lt;div class="mermaid">sequenceDiagram
participant Alice as "Alice (ऐलिस)"
participant Bob as "Bob (बॉब)"
Note over Alice,Bob: "सार्वजनिक पैरामीटर: वक्र E, आधार बिंदु G, अभाज्य संख्या p"
Alice->>Alice: "निजी कुंजी d_A (एक यादृच्छिक पूर्णांक) उत्पन्न करें"
Alice->>Alice: "सार्वजनिक कुंजी Q_A = d_A * G की गणना करें"
Bob->>Bob: "निजी कुंजी d_B (एक यादृच्छिक पूर्णांक) उत्पन्न करें"
Bob->>Bob: "सार्वजनिक कुंजी Q_B = d_B * G की गणना करें"
Alice->>Bob: "सार्वजनिक कुंजी Q_A भेजें (प्लेनटेक्स्ट में)"
Bob->>Alice: "सार्वजनिक कुंजी Q_B भेजें (प्लेनटेक्स्ट में)"
Alice->>Alice: "साझा रहस्य S = d_A * Q_B की गणना करें"
Bob->>Bob: "साझा रहस्य S = d_B * Q_A की गणना करें"
Note over Alice,Bob: "S = d_A * (d_B * G) = d_B * (d_A * G) = (d_A * d_B) * G"
Note over Alice,Bob: "दोनों पक्षों द्वारा गणना किया गया परिणाम S पूरी तरह से मेल खाता है!"&lt;/div>
&lt;p>एक छिपकर बातें सुनने वाला (ईव) संचार चैनल पर प्रवाहित होने वाले $G$, $Q_A$, $Q_B$ को रोक सकता है, लेकिन ECDLP की कठिनाई के कारण, वह $Q_A = d_A \cdot G$ से ऐलिस की निजी कुंजी $d_A$ का पता नहीं लगा सकता है। इसके अलावा, $Q_A$ और $Q_B$ को गुणा करने से साझा कुंजी $S$ नहीं मिलती है, इसलिए छिपकर बातें सुनने वाला $S$ की गणना नहीं कर सकता।&lt;/p>
&lt;hr>
&lt;h2 id="7-करयनवयन-क-कमय-सइड-चनल-हमल-और-उपय">7. कार्यान्वयन की कमियां: साइड-चैनल हमले और उपाय
&lt;/h2>&lt;p>भले ही एक क्रिप्टोग्राफ़िक एल्गोरिदम सैद्धांतिक रूप से परिपूर्ण हो, लेकिन इसे एक प्रोग्राम के रूप में लागू करने की प्रक्रिया में कमियां उत्पन्न हो सकती हैं। इसे &lt;strong>&amp;ldquo;साइड-चैनल अटैक (Side-Channel Attack)&amp;rdquo;&lt;/strong> कहा जाता है।&lt;/p>
&lt;h3 id="71-टइमग-अटक-timing-attack">7.1. टाइमिंग अटैक (Timing Attack)
&lt;/h3>&lt;p>आइए पहले बताए गए डबल-एंड-ऐड (Double-and-Add) एल्गोरिदम को फिर से देखें।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// असुरक्षित डबल-एंड-ऐड का छद्म कोड (pseudocode)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">Point&lt;/span> &lt;span class="n">R&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">Infinity&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">255&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="o">--&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">R&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">PointDoubling&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">R&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// हमेशा निष्पादित होता है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">bit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">k&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">R&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">PointAddition&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">R&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// केवल तभी निष्पादित होता है जब बिट 1 हो!
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इस कार्यान्वयन में एक घातक खामी है। जब बिट &lt;code>1&lt;/code> होता है, तो पॉइंट एडिशन निष्पादित होता है, इसलिए गणना का समय &lt;strong>थोड़ा लंबा हो जाता है&lt;/strong> तुलना में जब बिट &lt;code>0&lt;/code> होता है। इसके अतिरिक्त, प्रोसेसर की शाखा भविष्यवाणी (branch prediction) और कैश मेमोरी व्यवहार भी बदल जाते हैं।
हमलावर इस गणना समय (या बिजली की खपत) में मिनट के अंतर को हजारों बार सांख्यिकीय रूप से देखकर &lt;strong>निजी कुंजी $k$ के बिट अनुक्रम को बिट दर बिट पूरी तरह से पुनर्प्राप्त&lt;/strong> कर सकता है। यही टाइमिंग अटैक है।&lt;/p>
&lt;h3 id="72-नरतर-समय-constant-time-करयनवयन-मटगमर-लडर-montgomery-ladder">7.2. निरंतर-समय (Constant-Time) कार्यान्वयन: मोंटगोमेरी लैडर (Montgomery Ladder)
&lt;/h3>&lt;p>टाइमिंग हमलों को रोकने के लिए, ऐसे एल्गोरिदम को अपनाना आवश्यक है जहाँ &lt;strong>निष्पादित निर्देशों का अनुक्रम और गणना का समय हमेशा स्थिर (Constant-Time) होता है, चाहे निजी कुंजी का बिट मान कुछ भी हो&lt;/strong>।&lt;/p>
&lt;p>इसका एक प्रमुख उदाहरण &lt;strong>मोंटगोमेरी लैडर (Montgomery Ladder)&lt;/strong> है।&lt;/p>
&lt;div class="mermaid">graph TD
Start["आरंभीकरण: R0 = O, R1 = P"] --> LoopStart["प्रत्येक बिट i के लिए (MSB से)"]
LoopStart --> Cond{"k_i का मान क्या है?"}
Cond -->|0| Branch0["R1 = R0 + R1&lt;br>R0 = 2 * R0"]
Cond -->|1| Branch1["R0 = R0 + R1&lt;br>R1 = 2 * R1"]
Branch0 --> LoopEnd["अगले बिट पर जाएं"]
Branch1 --> LoopEnd
LoopEnd --> LoopStart
LoopStart -.->|"सभी बिट्स पूरे हुए"| End["अंत: R0 परिणाम (kP) है"]&lt;/div>
&lt;p>मोंटगोमेरी लैडर की सुंदरता इस बात में है कि चाहे बिट &lt;code>0&lt;/code> हो या &lt;code>1&lt;/code>, &lt;strong>&amp;ldquo;हमेशा एक पॉइंट एडिशन और एक पॉइंट डबलिंग&amp;rdquo;&lt;/strong> निष्पादित की जाती है। यह गणना समय की डेटा निर्भरता को पूरी तरह से समाप्त कर देता है।&lt;/p>
&lt;p>हालाँकि, यदि कोई शाखा (branch) (&lt;code>if (k_i == 0)&lt;/code>) स्वयं मौजूद है, तो यह जोखिम रहता है कि निष्पादन समय कंपाइलर अनुकूलन और CPU की शाखा भविष्यवाणी के कारण भिन्न हो सकता है। इसलिए, वास्तविक निरंतर-समय के कार्यान्वयन में, सशर्त शाखाओं (&lt;code>if&lt;/code> कथन) को समाप्त कर दिया जाता है और &lt;strong>बिटवाइज़ संचालन (bitwise operations) का उपयोग करके एक सशर्त स्वैप (Conditional Swap)&lt;/strong> का उपयोग किया जाता है।&lt;/p>
&lt;hr>
&lt;h2 id="8-c-क-उपयग-करक-एलपटक-करव-करपटगरफ-क-करयनवयन">8. C++ का उपयोग करके एलिप्टिक कर्व क्रिप्टोग्राफी का कार्यान्वयन
&lt;/h2>&lt;p>यहाँ से, हम सिद्धांत को C++ कोड में बदलेंगे। व्यावहारिक क्रिप्टोग्राफ़िक लाइब्रेरी (जैसे OpenSSL या libsodium) उन्नत असेंबली अनुकूलन और जैकोबियन निर्देशांक का उपयोग करती हैं, लेकिन यहाँ, गणितीय समझ को गहरा करने के लिए, हम &lt;strong>एफाइन निर्देशांक (Affine Coordinates) का उपयोग करके आसानी से समझे जाने वाले निरंतर-समय कार्यान्वयन&lt;/strong> की रूपरेखा दिखाएंगे।&lt;/p>
&lt;p>हम यह मानेंगे कि बड़े पूर्णांक संचालन के लिए &lt;code>boost::multiprecision::cpp_int&lt;/code> का उपयोग किया जाता है।&lt;/p>
&lt;h3 id="81-मडयलर-अकगणत-और-परतलम">8.1. मॉड्यूलर अंकगणित और प्रतिलोम
&lt;/h3>&lt;p>सबसे पहले, हम परिमित क्षेत्र पर संचालन के लिए सहायक कार्यों को परिभाषित करते हैं। हम फ़र्मेट के छोटे प्रमेय (Fermat&amp;rsquo;s Little Theorem) का उपयोग करके प्रतिलोम गणना को लागू करेंगे।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;vector&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;stdexcept&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;boost/multiprecision/cpp_int.hpp&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="k">namespace&lt;/span> &lt;span class="n">boost&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">multiprecision&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// उदाहरण के रूप में secp256k1 की अभाज्य संख्या p और पैरामीटर
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="nf">p&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">const&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">const&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// धनात्मक शेषफल लौटाने वाला मॉड्यूलो ऑपरेशन
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">cpp_int&lt;/span> &lt;span class="nf">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cpp_int&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nl">m&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// मॉड्यूलर घातांकीकरण (x^y mod m)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">cpp_int&lt;/span> &lt;span class="nf">powerMod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cpp_int&lt;/span> &lt;span class="n">base&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">exp&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">res&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">base&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">base&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">exp&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">exp&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">res&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">res&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">base&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">base&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">base&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">base&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exp&lt;/span> &lt;span class="o">/=&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">res&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// फ़र्मेट के छोटे प्रमेय का उपयोग करके मॉड्यूलर प्रतिलोम
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">cpp_int&lt;/span> &lt;span class="nf">modInverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cpp_int&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// यह मानकर कि m एक अभाज्य संख्या है: n^(m-2) ≡ n^(-1) mod m
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="n">powerMod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">m&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="82-बद-परतनधतव-और-समह-सचलन-जड--दहरकरण">8.2. बिंदु प्रतिनिधित्व और समूह संचालन (जोड़ / दोहरीकरण)
&lt;/h3>&lt;p>हम अनंत पर बिंदु को प्रबंधित करने के लिए एक ध्वज (flag) के साथ एक &lt;code>Point&lt;/code> संरचना, और जोड़ सूत्र को लागू करेंगे।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">struct&lt;/span> &lt;span class="nc">Point&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">bool&lt;/span> &lt;span class="n">isInfinity&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// अनंत पर बिंदु का निर्माण
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">isInfinity&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">true&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// सामान्य बिंदु का निर्माण
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cpp_int&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">isInfinity&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">false&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// एलिप्टिक कर्व पर बिंदु जोड़ (R = P + Q)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">Point&lt;/span> &lt;span class="nf">pointAdd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">isInfinity&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">isInfinity&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// P + (-P) = अनंत पर बिंदु
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">lambda&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Point Doubling (P = Q होने पर)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// lambda = (3x^2 + a) / 2y
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">num&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">den&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">modInverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lambda&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">num&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">den&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Point Addition (P != Q होने पर)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// lambda = (y2 - y1) / (x2 - x1)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">num&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">den&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">modInverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lambda&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">num&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">den&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">x3&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lambda&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">lambda&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">y3&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lambda&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">x3&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y3&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="83-नरतर-समय-constant-time-सशरत-सवप-conditional-swap-क-करयनवयन">8.3. निरंतर-समय (Constant-Time) सशर्त स्वैप (Conditional Swap) का कार्यान्वयन
&lt;/h3>&lt;p>निजी कुंजी के बिट मान के आधार पर चर (variables) की सामग्री की अदला-बदली करते समय, हम &lt;code>if&lt;/code> कथन का उपयोग किए बिना केवल बिटवाइज़ संचालन (मास्क) का उपयोग करके स्वैप करते हैं। यह सुनिश्चित करता है कि निष्पादन पथ (execution path) पूरी तरह से स्थिर रहे।&lt;/p>
&lt;blockquote>
&lt;p>[!TIP]
वास्तविक कार्यान्वयन में, &lt;code>cpp_int&lt;/code> जैसे गतिशील रूप से आवंटित बहु-सटीक (multi-precision) पूर्णांक वर्ग निरंतर-समय प्रसंस्करण के लिए उपयुक्त नहीं हैं। ऐसा इसलिए है क्योंकि मेमोरी आवंटन और सरणी आकार में भिन्नता के कारण टाइमिंग जानकारी लीक होती है। व्यावहारिक पुस्तकालयों में, उन्हें एक निश्चित लंबाई (उदाहरण के लिए, uint64_t का 4-तत्व सरणी) के साथ दर्शाया जाता है, और बिट-स्तरीय मास्किंग लागू की जाती है। निम्नलिखित एक वैचारिक उदाहरण है।&lt;/p>
&lt;/blockquote>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// वैचारिक निरंतर-समय स्वैप (निश्चित लंबाई के पूर्णांक मानकर)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// यदि bit 1 है, तो P1 और P2 को स्वैप करें; यदि 0 है, तो स्वैप न करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kt">void&lt;/span> &lt;span class="nf">cswap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Point&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">P1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">P2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">uint8_t&lt;/span> &lt;span class="n">bit&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// bit 0 या 1 है। यदि bit=1 है तो मास्क सभी 1 (0xFF..) है, और यदि 0 है तो सभी 0 है।
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// (स्पष्टीकरण के लिए, मान लें कि एक निश्चित लंबाई वाले BigInt वर्ग का प्रत्येक शब्द w है)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="cm">/*
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> uint64_t mask = 0 - (uint64_t)bit;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> for (int i = 0; i &amp;lt; NUM_WORDS; i++) {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> uint64_t dummy = mask &amp;amp; (P1.x.words[i] ^ P2.x.words[i]);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> P1.x.words[i] ^= dummy;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> P2.x.words[i] ^= dummy;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> // y-निर्देशांक और isInfinity ध्वज को भी इसी तरह संसाधित करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> }
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// * boost::multiprecision के साथ पूर्ण निरंतर-समय स्वैप मुश्किल है,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// इसलिए यहाँ तर्क को समझने के लिए हम केवल शाखाओं (branches) द्वारा इसका अनुकरण करते हैं।
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">bit&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">swap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">P1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">P2&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="84-मटगमर-लडर-montgomery-ladder-क-उपयग-करक-अदश-गणन">8.4. मोंटगोमेरी लैडर (Montgomery Ladder) का उपयोग करके अदिश गुणन
&lt;/h3>&lt;p>सुरक्षित अदिश गुणन को लागू करने के लिए हम पहले बताए गए &lt;code>pointAdd&lt;/code> और &lt;code>cswap&lt;/code> को जोड़ते हैं।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// अदिश गुणन k * P (मोंटगोमेरी लैडर विधि)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">Point&lt;/span> &lt;span class="nf">scalarMultiply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">k&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Point&lt;/span> &lt;span class="n">R0&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// अनंत पर बिंदु
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">Point&lt;/span> &lt;span class="n">R1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// k की बिट लंबाई प्राप्त करें (secp256k1 के लिए 256 बिट्स)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">numBits&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">256&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">numBits&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="o">--&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// i-वें बिट का मान प्राप्त करें (0 या 1)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint8_t&lt;/span> &lt;span class="n">bit&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">static_cast&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">uint8_t&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bit_test&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">k&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// यदि bit == 1, तो R0 और R1 को स्वैप करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cswap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">R0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">R1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">bit&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// हमेशा समान संक्रिया निष्पादित करें (पॉइंट एडिशन और पॉइंट डबलिंग)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">R1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pointAdd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">R0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">R1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">R0&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pointAdd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">R0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">R0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// यदि bit == 1 था, तो स्थिति को पुनर्स्थापित करने के लिए फिर से स्वैप करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cswap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">R0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">R1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">bit&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">R0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इस कार्यान्वयन तर्क के साथ, चाहे अदिश $k$ का प्रत्येक बिट &lt;code>0&lt;/code> हो या &lt;code>1&lt;/code>, प्रत्येक लूप पुनरावृत्ति (iteration) के भीतर निष्पादित संक्रियाएँ (&lt;code>cswap&lt;/code> $\to$ &lt;code>pointAdd&lt;/code> $\to$ &lt;code>pointAdd&lt;/code> $\to$ &lt;code>cswap&lt;/code>) बिल्कुल एक ही प्रवाह का पालन करती हैं, जो समय या कैश एक्सेस पैटर्न में अंतर के माध्यम से गुप्त जानकारी के रिसाव को दृढ़ता से रोकता है।&lt;/p>
&lt;hr>
&lt;h2 id="9-नषकरष">9. निष्कर्ष
&lt;/h2>&lt;p>एलिप्टिक कर्व क्रिप्टोग्राफी (ECC), पहली नज़र में अजीब लग सकती है कि &amp;ldquo;क्यों रेखाएँ खींचने और प्रतिच्छेदनों को प्रतिबिंबित करने जैसी ज्यामितीय संक्रियाएँ एन्क्रिप्शन बन जाती हैं?&amp;quot;। हालाँकि, यह गणित और क्रिप्टोग्राफी के एक चमत्कारी संलयन का परिणाम है जो इसे परिमित क्षेत्र के असतत (discrete) दुनिया में मैप करके एक शानदार वन-वे फ़ंक्शन (असतत लघुगणक समस्या) बनाने की अनुमति देता है।&lt;/p>
&lt;p>इस लेख में हमने निम्नलिखित महत्वपूर्ण बिंदुओं की व्याख्या की है:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>RSA पर लाभ&lt;/strong>: बहुत छोटी कुंजी की लंबाई के साथ मजबूत सुरक्षा प्रदान करता है, जो इसे आधुनिक मोबाइल और IoT युग के लिए आदर्श बनाता है।&lt;/li>
&lt;li>&lt;strong>समूह सिद्धांत और परिमित क्षेत्रों की मूल बातें&lt;/strong>: गणितीय संरचना जो ECC की नींव बनाती है।&lt;/li>
&lt;li>&lt;strong>जोड़ और दोहरीकरण सूत्र&lt;/strong>: वियरस्ट्रास समीकरण का उपयोग करके बीजगणितीय समूह संचालन को लागू करने के तरीके।&lt;/li>
&lt;li>&lt;strong>साइड-चैनल हमलों का खतरा&lt;/strong>: कैसे निजी कुंजी के बिट्स पर निर्भर सशर्त शाखाएं (conditional branches) घातक कमियां पैदा करती हैं।&lt;/li>
&lt;li>&lt;strong>निरंतर-समय (Constant-Time) कार्यान्वयन&lt;/strong>: मोंटगोमेरी लैडर और सशर्त स्वैप (Conditional Swap) का उपयोग करके हार्डवेयर-स्तरीय व्यवहार को सुसंगत बनाने और हमलों को रोकने के लिए C++ कोडिंग तकनीक।&lt;/li>
&lt;/ol>
&lt;p>उत्पादन वातावरण (production environment) में काम करने वाली अपनी खुद की क्रिप्टोग्राफ़िक लाइब्रेरी बनाने को सुरक्षा जोखिमों के कारण अत्यधिक हतोत्साहित किया जाता है (&amp;ldquo;अपना खुद का क्रिप्टो न बनाएं&amp;rdquo;)। हालाँकि, हुड के नीचे काम करने वाले एल्गोरिदम और गणितीय पृष्ठभूमि की गहरी समझ होना, अधिक सुरक्षित और उच्च-प्रदर्शन प्रणाली को डिजाइन और संचालित करने वाले इंजीनियरों के लिए एक अमूल्य और शक्तिशाली हथियार होगा।&lt;/p>
&lt;p>अगले लेख में, हम इस एलिप्टिक कर्व का उपयोग करने वाले डिजिटल हस्ताक्षर एल्गोरिदम &lt;strong>ECDSA (Elliptic Curve Digital Signature Algorithm)&lt;/strong> के तंत्र, और बिटकॉइन में प्रयुक्त &lt;strong>स्क्नोर (Schnorr) हस्ताक्षर&lt;/strong> के बारे में और गहराई से जानेंगे।&lt;/p></description></item><item><title>क्या GNFS (जनरल नंबर फील्ड सीव) से परे कोई एल्गोरिदम मौजूद है?</title><link>http://kenji.blog/hi/p/beyond-gnfs-integer-factorization-algorithms/</link><pubDate>Fri, 11 Sep 2026 09:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/beyond-gnfs-integer-factorization-algorithms/</guid><description>&lt;img src="http://kenji.blog/p/beyond-gnfs-integer-factorization-algorithms/img/eyecatch.jpg" alt="Featured image of post क्या GNFS (जनरल नंबर फील्ड सीव) से परे कोई एल्गोरिदम मौजूद है?" />&lt;h2 id="1-परचय-परणक-गणनखडन-और-आधनक-करपटगरफ-क-आधर">1. परिचय: पूर्णांक गुणनखंडन और आधुनिक क्रिप्टोग्राफी का आधार
&lt;/h2>&lt;p>आधुनिक समाज में इंटरनेट संचार की सुरक्षा काफी हद तक सार्वजनिक-कुंजी क्रिप्टोग्राफी, RSA के सुरक्षित होने पर निर्भर करती है। और RSA क्रिप्टोग्राफी की सुरक्षा &amp;ldquo;विशाल भाज्य संख्याओं के गुणनखंडन की कठिनाई&amp;rdquo; की गणितीय धारणा पर आधारित है। यदि एक अत्यंत कुशल गुणनखंडन एल्गोरिदम खोजा जाता है, तो दुनिया भर का संचार बुनियादी ढांचा मूल रूप से ढह जाएगा।&lt;/p>
&lt;p>वर्तमान में, क्लासिकल कंप्यूटर का उपयोग करके बड़े पूर्णांकों के गुणनखंडन के लिए सबसे तेज़ और सबसे शक्तिशाली एल्गोरिदम &lt;strong>जनरल नंबर फील्ड सीव (GNFS: General Number Field Sieve)&lt;/strong> है। GNFS का जन्म 1980 के दशक के अंत में प्रस्तावित स्पेशल नंबर फील्ड सीव (SNFS) के विस्तार के रूप में हुआ था, और आज तक इसने RSA-768 और RSA-250 जैसी विशाल भाज्य संख्याओं के गुणनखंडन के रिकॉर्ड बनाए हैं।&lt;/p>
&lt;p>हालाँकि, क्रिप्टोग्राफ़र और गणितज्ञ हमेशा निम्नलिखित प्रश्न पूछते हैं: &amp;ldquo;क्या GNFS से परे कोई क्लासिकल एल्गोरिदम मौजूद है?&amp;rdquo;, &amp;ldquo;क्लासिकल कंप्यूटर की सीमाएँ कहाँ हैं?&amp;rdquo;, और &amp;ldquo;क्वांटम कंप्यूटर इस स्थिति को कैसे तोड़ेंगे?&amp;rdquo;&lt;/p>
&lt;p>इस लेख में, हम GNFS के पीछे की गहरी गणितीय संरचना का पूरी तरह से विश्लेषण करेंगे और बहुपद चयन (polynomial selection), सीविंग प्रक्रिया (sieving processing), और ब्लॉक वीडमैन (Block Wiedemann) विधि का उपयोग करके रैखिक बीजगणित (linear algebra) चरणों जैसे विस्तृत तकनीकी विश्लेषण करेंगे। इसके अलावा, हम कॉपरस्मिथ (Coppersmith) के सुधारों के माध्यम से GNFS की विस्तार विधियों पर विचार करेंगे, और गणितीय दृष्टिकोण से क्लासिकल सब-एक्सपोनेंशियल टाइम (Sub-exponential time) एल्गोरिदम और क्वांटम पॉलीनोमियल टाइम (Polynomial time) एल्गोरिदम के बीच महत्वपूर्ण अंतर की तुलना और व्याख्या करेंगे।&lt;/p>
&lt;hr>
&lt;h2 id="2-एसमपटटक-कमपलकसट-और-l-नटशन-l-notation">2. एसिम्प्टोटिक कॉम्प्लेक्सिटी और L-नोटेशन (L-notation)
&lt;/h2>&lt;p>गुणनखंडन एल्गोरिदम की जटिलता का मूल्यांकन करते समय, मानक पॉलीनोमियल टाइम नोटेशन ($O(n^k)$ आदि) के बजाय इनपुट $n$ के अंकों की संख्या के सापेक्ष सब-एक्सपोनेंशियल समय को व्यक्त करने के लिए &lt;strong>L-नोटेशन (L-notation)&lt;/strong> का उपयोग किया जाता है। L-नोटेशन को इस प्रकार परिभाषित किया गया है:&lt;/p>
$$
L_n[\alpha, c] = \exp \left( (c + o(1)) (\ln n)^\alpha (\ln \ln n)^{1-\alpha} \right)
$$
&lt;p>जहाँ, $n$ वह पूर्णांक है जिसका गुणनखंड किया जाना है, और $\ln n$ प्राकृतिक लघुगणक (natural logarithm) है जो $n$ की बिट लंबाई के आनुपातिक है।&lt;/p>
&lt;ul>
&lt;li>$\alpha = 0$ के मामले में: $L_n[0, c] = \exp(c \ln \ln n) = (\ln n)^c$ होता है, जो बिट लंबाई के सापेक्ष &lt;strong>पॉलीनोमियल टाइम (Polynomial time)&lt;/strong> को दर्शाता है।&lt;/li>
&lt;li>$\alpha = 1$ के मामले में: $L_n[1, c] = \exp(c \ln n) = n^c$ होता है, जो बिट लंबाई के सापेक्ष &lt;strong>एक्सपोनेंशियल टाइम (Exponential time)&lt;/strong> को दर्शाता है।&lt;/li>
&lt;li>$0 &lt; \alpha &lt; 1$ के मामले में: यह पॉलीनोमियल टाइम और एक्सपोनेंशियल टाइम के बीच स्थित &lt;strong>सब-एक्सपोनेंशियल टाइम (Sub-exponential time)&lt;/strong> है।&lt;/li>
&lt;/ul>
&lt;p>अतीत में गुणनखंडन एल्गोरिदम का विकास धीरे-धीरे इस $\alpha$ के मान को कम करने का इतिहास रहा है।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>कंटीन्यूड फ्रैक्शन मेथड (CFRAC) और मल्टीपल पॉलीनोमियल क्वाड्रेटिक सीव (MPQS)&lt;/strong>: ये $\alpha = 1/2$ वर्ग से संबंधित हैं, और जटिलता लगभग $L_n[1/2, 1]$ है।&lt;/li>
&lt;li>&lt;strong>जनरल नंबर फील्ड सीव (GNFS)&lt;/strong>: इसने $\alpha = 1/3$ हासिल किया, और वर्तमान में ज्ञात क्लासिकल एल्गोरिदम में सबसे तेज़ $L_n[1/3, (64/9)^{1/3}]$ की जटिलता का दावा करता है।&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="3-gnfs-जनरल-नबर-फलड-सव-क-सपरण-एलगरदम-और-गणतय-सरचन">3. GNFS (जनरल नंबर फील्ड सीव) का संपूर्ण एल्गोरिदम और गणितीय संरचना
&lt;/h2>&lt;p>GNFS का गणितीय आधार बहुत ही जटिल और उन्नत है। मूल विचार फर्मेट के लिटिल थ्योरम (Fermat&amp;rsquo;s Little Theorem) और क्वाड्रेटिक सीव (QS) का विस्तार है, और सर्वांगसमता (congruence) $X^2 \equiv Y^2 \pmod n$ को संतुष्ट करने वाले और $X \not\equiv \pm Y \pmod n$ होने वाले गैर-तुच्छ (non-trivial) जोड़े $(X, Y)$ को खोजकर $n$ का गुणनखंड $\gcd(X-Y, n)$ प्राप्त करना है।&lt;/p>
&lt;p>हालाँकि, GNFS का सार यह है कि यह केवल परिमेय संख्या क्षेत्र (rational number field) $\mathbb{Q}$ में ऐसा नहीं करता है, बल्कि एक साथ परिमेय संख्या क्षेत्र और बीजगणितीय संख्या क्षेत्र (Algebraic Number Field) नामक विस्तार क्षेत्र $\mathbb{Q}(\alpha)$ दोनों में &amp;ldquo;स्मूद नंबर्स (Smooth numbers)&amp;rdquo; की खोज करता है, और होमोमोर्फिज्म (homomorphism) के माध्यम से सर्वांगसम संबंध बनाता है।&lt;/p>
&lt;p>GNFS की प्रक्रिया मोटे तौर पर 5 चरणों में विभाजित है।&lt;/p>
&lt;div class="mermaid">graph TD
A["गुणनखंडन समस्या (इनपुट n)"] --> B["1. बहुपद चयन (Polynomial Selection)"]
B --> C["2. सीविंग प्रक्रिया (Sieving Phase)"]
C --> D["3. फ़िल्टरिंग (Filtering Phase)"]
D --> E["4. रैखिक बीजगणित (Linear Algebra Phase)"]
E --> F["5. वर्गमूल (Square Root Phase)"]
F --> G["अभाज्य गुणनखंड p, q का आउटपुट"]&lt;/div>
&lt;h3 id="31-चरण-1-बहपद-चयन-polynomial-selection">3.1 चरण 1: बहुपद चयन (Polynomial Selection)
&lt;/h3>&lt;p>GNFS की सफलता बहुत हद तक उपयुक्त बहुपदों के चयन पर निर्भर करती है। लक्ष्य दो इरेड्यूसिबल बहुपदों (irreducible polynomials) $f_1(x)$ (परिमेय पक्ष) और $f_2(x)$ (बीजगणितीय पक्ष) को खोजना है जिनका एक उभयनिष्ठ मूल $m$ हो। अर्थात,
$f_1(m) \equiv f_2(m) \equiv 0 \pmod n$
को संतुष्ट करता हो।&lt;/p>
&lt;p>आमतौर पर, परिमेय पक्ष के बहुपद के लिए 1-डिग्री व्यंजक $f_1(x) = x - m$ चुना जाता है, और बीजगणितीय पक्ष के बहुपद $f_2(x)$ के लिए डिग्री $d$ (आमतौर কাহিনী 5 या 6) का एक मोनिक बहुपद चुना जाता है। सबसे क्लासिकल दृष्टिकोण &lt;strong>Base-$m$ विधि&lt;/strong> है।
$n$ की घात $1/(d+1)$ के करीब एक पूर्णांक $m = \lfloor n^{1/(d+1)} \rfloor$ चुना जाता है, और $n$ का बेस-$m$ विस्तार किया जाता है।
$n = c_d m^d + c_{d-1} m^{d-1} + \dots + c_1 m + c_0$
इससे, हमें बहुपद $f_2(x) = c_d x^d + c_{d-1} x^{d-1} + \dots + c_0$ प्राप्त होता है। स्पष्ट रूप से $f_2(m) = n \equiv 0 \pmod n$ होता है।&lt;/p>
&lt;p>हालाँकि, आधुनिक कार्यान्वयन में &lt;strong>Kleinjung का एल्गोरिदम&lt;/strong> उपयोग किया जाता है। यह बहुपदों के गुणांकों (coefficients) को अत्यधिक बड़ा होने से रोकता है (Skewness का अनुकूलन), बीजगणितीय गुणों (Murphy&amp;rsquo;s $E$ value और $\alpha$-value) को अनुकूलित करता है, और ऐसे बहुपदों की खोज करता है जो सीविंग प्रक्रिया में आसानी से स्मूद नंबर उत्पन्न करते हैं। अकेले इस चरण में बहुत सारे कम्प्यूटेशनल संसाधन लगाए जाते हैं।&lt;/p>
&lt;h3 id="32-चरण-2-सवग-परकरय-sieving-phase">3.2 चरण 2: सीविंग प्रक्रिया (Sieving Phase)
&lt;/h3>&lt;p>बहुपद निर्धारित होने के बाद, यह एल्गोरिदम के सबसे अधिक कम्प्यूटेशनल रूप से भारी &amp;ldquo;सीव (Sieving)&amp;rdquo; चरण में प्रवेश करता है। यहाँ, युग्म $(a, b)$ खोजा जाता है। यह युग्म को-प्राइम (coprime) होना चाहिए, और निम्नलिखित दो मानों का एक साथ &amp;ldquo;स्मूद (Smooth)&amp;rdquo; होना आवश्यक है:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>परिमेय पक्ष का मानदंड (Norm on rational side)&lt;/strong>: $F_1(a, b) = b \cdot f_1(a/b) = a - bm$&lt;/li>
&lt;li>&lt;strong>बीजगणितीय पक्ष का मानदंड (Norm on algebraic side)&lt;/strong>: $F_2(a, b) = b^d \cdot f_2(a/b)$&lt;/li>
&lt;/ol>
&lt;p>&amp;ldquo;स्मूद&amp;rdquo; होने का अर्थ है कि इसे केवल एक निर्दिष्ट ऊपरी सीमा (Sieve bound) या उससे छोटे अभाज्य संख्याओं द्वारा ही गुणनखंडित किया जा सकता है। परिमेय पक्ष के लिए एक फैक्टर बेस (Factor base) और बीजगणितीय पक्ष के लिए एक फैक्टर बेस तैयार किया जाता है, और इरेटोस्थनीज की छलनी (Sieve of Eratosthenes) की तरह एक विशाल खोज स्थान पर कुशलता से स्मूद नंबर खोजे जाते हैं।
वर्तमान में, &lt;strong>लैटिस सीविंग (Lattice Sieving)&lt;/strong> नामक तकनीक मुख्यधारा है, जहाँ एक विशिष्ट अभाज्य संख्या $q$ को तय किया जाता है, और केवल उस सब-लैटिस (sub-lattice) पर $(a, b)$ युग्मों को सीव किया जाता है जहाँ परिमेय और बीजगणितीय दोनों पक्ष $q$ के गुणज हों, जिससे अत्यधिक उच्च दक्षता प्राप्त होती है।&lt;/p>
&lt;h3 id="33-चरण-3-फलटरग-filtering-phase">3.3 चरण 3: फ़िल्टरिंग (Filtering Phase)
&lt;/h3>&lt;p>सीविंग प्रक्रिया में पाए गए स्मूद संबंधों (रिलेशन) की संख्या करोड़ों या अरबों में होती है। हालाँकि, इनमें बहुत सारी बेकार जानकारी भी शामिल होती है।
फ़िल्टरिंग का उद्देश्य एक विशाल विरल मैट्रिक्स (Sparse Matrix) का निर्माण करना है और साथ ही इसके आयाम (dimension) को जितना संभव हो उतना छोटा करना है।&lt;/p>
&lt;p>विशेष रूप से, निम्नलिखित ऑपरेशन किए जाते हैं:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Singleton removal&lt;/strong>: उन रिलेशन को हटा दें जिनमें केवल एक बार आने वाला अभाज्य गुणनखंड शामिल हो।&lt;/li>
&lt;li>&lt;strong>Clique removal / Merging&lt;/strong>: दो या अधिक बार आने वाले अभाज्य गुणनखंडों वाले रिलेशन को एक साथ गुणा करें, चरों (variables) को समाप्त करें, और उन्हें एक उच्च घनत्व वाले लेकिन छोटे आयाम के समीकरण प्रणाली में कम करें।&lt;/li>
&lt;/ul>
&lt;p>इसके परिणामस्वरूप, अरबों पंक्तियों का मैट्रिक्स कुछ करोड़ पंक्तियों के एक विशाल विरल मैट्रिक्स $\mathbf{A}$ (जिसके तत्व फील्ड $\mathbb{F}_2$ पर 0 और 1 हैं) में संकुचित हो जाता है।&lt;/p>
&lt;h3 id="34-चरण-4-रखक-बजगणत-linear-algebra-phase">3.4 चरण 4: रैखिक बीजगणित (Linear Algebra Phase)
&lt;/h3>&lt;p>यहाँ, हम समीकरण $\mathbf{A} \mathbf{x} \equiv \mathbf{0} \pmod 2$ का एक गैर-तुच्छ (non-trivial) समाधान वेक्टर $\mathbf{x}$ खोजते हैं। दूसरे शब्दों में, यह विशाल विरल मैट्रिक्स के लेफ्ट नलस्पेस (Left Nullspace) को खोजने की समस्या है।&lt;/p>
&lt;p>चूँकि मैट्रिक्स का आकार अत्यंत बड़ा है, सामान्य गाऊसीयन एलिमिनेशन (Gaussian elimination) ($O(N^3)$) के साथ इसकी गणना करना असंभव है। इसलिए, क्रिलोव सबस्पेस विधि (Krylov subspace method) का एक प्रकार, पुनरावृत्तीय विधि (iterative method) का उपयोग किया जाता है। ऐतिहासिक रूप से, &lt;strong>ब्लॉक लैंक्ज़ोस विधि (Block Lanczos)&lt;/strong> का उपयोग किया गया है, लेकिन वर्तमान वितरित कंप्यूटिंग (distributed computing) वातावरण में, &lt;strong>ब्लॉक वीडमैन विधि (Block Wiedemann Algorithm)&lt;/strong> मुख्यधारा है, जो संचार ओवरहेड को नाटकीय रूप से कम कर सकती है।&lt;/p>
&lt;p>ब्लॉक वीडमैन विधि मैट्रिक्स $\mathbf{A}$ और वेक्टर अनुक्रम से न्यूनतम बहुपद की गणना करती है, और नलस्पेस के आधार (basis) के निर्माण के लिए बर्लेकैम्प-मैसी (Berlekamp-Massey) एल्गोरिदम का उपयोग करती है। इस चरण को समानांतर (parallelize) करना बहुत मुश्किल है, और यह GNFS की सबसे बड़ी अड़चनों (bottlenecks) में से एक है, जिसके लिए सुपर कंप्यूटर या बड़े क्लस्टर के कसकर युग्मित (tightly coupled) संचार नेटवर्क की आवश्यकता होती है।&lt;/p>
&lt;h3 id="35-चरण-5-वरगमल-square-root-phase">3.5 चरण 5: वर्गमूल (Square Root Phase)
&lt;/h3>&lt;p>रैखिक बीजगणित के समाधान से, परिमेय पक्ष और बीजगणितीय पक्ष दोनों पर &amp;ldquo;पूर्ण वर्ग (perfect square)&amp;rdquo; बनने वाले गुणनफल (products) का निर्माण किया जाता है।
परिमेय पक्ष पर, $\prod (a-bm)$ एक पूर्णांक $X$ का वर्ग $X^2$ बन जाता है, और बीजगणितीय पक्ष पर, संबंधित आदर्शों (ideals) का गुणनफल बीजगणितीय क्षेत्र (algebraic field) पर पूर्ण वर्ग $\gamma^2$ बन जाता है।
बीजगणितीय क्षेत्र पर इस $\gamma$ की गणना करके और परिमेय पूर्णांक वलय (rational integer ring) में होमोमोर्फिज्म $\phi: \alpha \mapsto m \pmod n$ को लागू करके, सर्वांगसमता:
$X^2 \equiv \phi(\gamma)^2 \equiv Y^2 \pmod n$
प्राप्त होती है।&lt;/p>
&lt;p>बीजगणितीय क्षेत्र पर वर्गमूल की गणना करने के लिए &lt;strong>मोंटगोमरी की विधि (Montgomery&amp;rsquo;s Method)&lt;/strong> जैसे जटिल एल्गोरिदम का उपयोग किया जाता है, जिसके लिए बीजगणितीय संख्या सिद्धांत (algebraic number theory) के गहन ज्ञान की आवश्यकता होती है। अंत में, $\gcd(X-Y, n)$ की गणना की जाती है, और यदि एक गैर-तुच्छ गुणनखंड प्राप्त होता है, तो गुणनखंडन पूरा हो जाता है।&lt;/p>
&lt;hr>
&lt;h2 id="4-कय-gnfs-स-पर-कई-कलसकल-एलगरदम-मजद-ह">4. क्या GNFS से परे कोई क्लासिकल एल्गोरिदम मौजूद है?
&lt;/h2>&lt;p>अब तक, सामान्य पूर्णांकों के गुणनखंडन के लिए कोई ऐसा क्लासिकल एल्गोरिदम नहीं खोजा गया है जिसकी एसिम्प्टोटिक कॉम्प्लेक्सिटी $L_n[1/3, c]$ से कम हो। हालाँकि, सैद्धांतिक और व्यावहारिक सीमाओं को तोड़ने के लिए कई प्रयास और व्युत्पन्न (derivative) एल्गोरिदम मौजूद हैं।&lt;/p>
&lt;h3 id="41-मलटपल-नबर-फलड-सव-mnfs-multiple-number-field-sieve">4.1 मल्टीपल नंबर फील्ड सीव (MNFS: Multiple Number Field Sieve)
&lt;/h3>&lt;p>GNFS का विस्तार करने वाले एक दृष्टिकोण के रूप में, D. Coppersmith द्वारा &lt;strong>मल्टीपल नंबर फील्ड सीव (MNFS)&lt;/strong> है। जबकि GNFS दो बहुपदों (परिमेय पक्ष और बीजगणितीय पक्ष) का उपयोग करता है, MNFS एक परिमेय पक्ष बहुपद के विरुद्ध एक साथ कई अलग-अलग बीजगणितीय पक्ष बहुपदों का उपयोग करता है।&lt;/p>
$$ f_1(x), f_{2,1}(x), f_{2,2}(x), \dots, f_{2,V}(x) $$
&lt;p>कई बीजगणितीय क्षेत्रों का उपयोग करके, प्रत्येक सीविंग चरण में &amp;ldquo;किसी भी बीजगणितीय क्षेत्र में स्मूद होने&amp;rdquo; की संभावना को नाटकीय रूप से बढ़ाया जा सकता है। Coppersmith ने इस दृष्टिकोण के साथ जटिलता $L_n[1/3, c]$ के स्थिरांक (constant) $c$ को थोड़ा कम करने में सफलता प्राप्त की।
विशेष रूप से, जबकि GNFS के लिए स्थिरांक $c = (64/9)^{1/3} \approx 1.923$ है, यह सैद्धांतिक रूप से दिखाया गया है कि MNFS को अनुकूलित करके जटिलता को $c \approx 1.902$ तक कम किया जा सकता है।
हालाँकि, व्यवहार में, कई क्षेत्रों के प्रबंधन के कारण ओवरहेड बड़ा है, और व्यावहारिक पैमाने पर RSA मॉड्यूलस के लिए कोई निर्णायक सफलता नहीं मिली है।&lt;/p>
&lt;h3 id="42-कय-l_n14-वरग-क-एलगरदम-सभव-ह">4.2 क्या $L_n[1/4]$ वर्ग का एल्गोरिदम संभव है?
&lt;/h3>&lt;p>गणितज्ञों के बीच गुणनखंडन के क्लासिकल एल्गोरिदम की सीमा के बारे में लंबे समय से बहस का विषय रहा है: &amp;ldquo;क्या घातांक $\alpha = 1/4$ वाला कोई एल्गोरिदम मौजूद है?&amp;rdquo;
वर्तमान GNFS और इसके डेरिवेटिव्स सीविंग के माध्यम से &amp;ldquo;स्मूदनेस की खोज&amp;rdquo; के ढांचे से मजबूती से बंधे हैं, और व्यापक रूप से यह माना जाता है कि इस प्रतिमान (paradigm) के भीतर $\alpha = 1/3$ ही सीमा है। डिकमैन फ़ंक्शन (Dickman function) का उपयोग करके स्मूद पूर्णांकों की वितरण संभावना के विश्लेषण से भी यह माना जाता है कि वर्तमान बीजगणितीय क्षेत्र निर्माण विधियों और सीविंग के संयोजन को चाहे जितना भी अनुकूलित किया जाए, $O(L_n[1/3])$ की बाधा को पार नहीं किया जा सकता है।&lt;/p>
&lt;p>यदि $L_n[1/4]$, या कोई क्लासिकल पॉलीनोमियल टाइम एल्गोरिदम मौजूद है, तो इसे GNFS जैसे &amp;ldquo;स्मूदनेस-आधारित&amp;rdquo; दृष्टिकोण से पूरी तरह से अलग होना चाहिए, और ऐसी नई गणितीय संरचनाओं पर निर्भर होना चाहिए जिनकी मानवता वर्तमान में कल्पना नहीं कर सकती (उदाहरण के लिए, अण्डाकार वक्र क्रिप्टोग्राफी (Elliptic Curve Cryptography) के लिए Schoof के एल्गोरिदम की तरह अधिक उन्नत बीजगणितीय ज्यामितीय दृष्टिकोण)। हालाँकि, वर्तमान में ऐसे कोई संकेत नहीं हैं।&lt;/p>
&lt;hr>
&lt;h2 id="5-कवटम-कपयटर-क-सथ-सफलत-शर-क-एलगरदम-shors-algorithm">5. क्वांटम कंप्यूटर के साथ सफलता: शोर का एल्गोरिदम (Shor&amp;rsquo;s Algorithm)
&lt;/h2>&lt;p>जबकि क्लासिकल कंप्यूटर $L_n[1/3]$ की बाधा का सामना कर रहे हैं, कंप्यूटिंग मॉडल को मूल रूप से बदलकर इस बाधा को तोड़ने वाला एल्गोरिदम 1994 में पीटर शोर (Peter Shor) द्वारा प्रकाशित &lt;strong>शोर का एल्गोरिदम (Shor&amp;rsquo;s Algorithm)&lt;/strong> था।&lt;/p>
&lt;h3 id="51-कवटम-पलनमयल-टइम-क-परभव">5.1 क्वांटम पॉलीनोमियल टाइम का प्रभाव
&lt;/h3>&lt;p>शोर का एल्गोरिदम गुणनखंडन समस्या को &amp;ldquo;ऑर्डर फाइंडिंग प्रॉब्लम (Order Finding Problem)&amp;rdquo; में बदल देता है। यह किसी पूर्णांक $a$ के लिए फ़ंक्शन $f(x) = a^x \pmod n$ की अवधि (period) $r$ खोजने की समस्या है।
क्लासिकल कंप्यूटर पर इस अवधि को खोजने में घातीय (exponential) समय लगता है, लेकिन क्वांटम कंप्यूटर पर &lt;strong>क्वांटम फेज़ एस्टिमेशन (QPE: Quantum Phase Estimation)&lt;/strong> और &lt;strong>क्वांटम फूरियर ट्रांसफॉर्म (QFT: Quantum Fourier Transform)&lt;/strong> का उपयोग करके, सभी अवस्थाओं के सुपरपोज़िशन (Superposition) का समानांतर मूल्यांकन किया जा सकता है और उच्च संभावना के साथ अवधि $r$ को निकाला जा सकता है।&lt;/p>
&lt;p>कम्प्यूटेशनल जटिलता के दृष्टिकोण से, शोर के एल्गोरिदम का निष्पादन समय &lt;strong>क्वांटम पॉलीनोमियल टाइम&lt;/strong> है, विशेष रूप से यह इस प्रकार है:
&lt;/p>
$$ O((\log n)^3) $$
&lt;p>
हाल के वर्षों में अनुकूलित सर्किट कार्यान्वयन पर विचार ঘনত্ব करते हुए, इसे $O((\log n)^2 \log \log n)$ तक कम किया जा सकता है।&lt;/p>
&lt;div class="mermaid">graph LR
A["क्लासिकल एल्गोरिदम (GNFS)"] -->|सीमा| B["सब-एक्सपोनेंशियल टाइम L_n[1/3]"]
C["क्वांटम एल्गोरिदम (Shor)"] -->|सफलता| D["पॉलीनोमियल टाइम O((log n)^3)"]
B --> E["RSA क्रिप्टोग्राफी का निरंतर उपयोग (कुंजी की लंबाई बढ़ाना)"]
D --> F["RSA क्रिप्टोग्राफी का पूर्ण पतन"]&lt;/div>
&lt;h3 id="52-कलसकल-सब-एकसपनशयल-टइम-बनम-कवटम-पलनमयल-टइम">5.2 क्लासिकल सब-एक्सपोनेंशियल टाइम बनाम क्वांटम पॉलीनोमियल टाइम
&lt;/h3>&lt;p>इन दो जटिलता वर्गों के बीच का अंतर वास्तविक दुनिया की क्रिप्टोग्राफ़िक सुरक्षा में निर्णायक अर्थ रखता है।&lt;/p>
&lt;p>उदाहरण के लिए, RSA-2048 (2048-बिट भाज्य संख्या) के गुणनखंडन के मामले पर विचार करें।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>GNFS (क्लासिकल)&lt;/strong>: $n \approx 2^{2048}$ को $L_n[1/3, 1.923]$ में प्रतिस्थापित करने पर, लगभग $2^{112}$ ऑपरेशनों की आवश्यकता होगी। यह एक खगोलीय गणना राशि है जिसे ब्रह्मांड के जीवनकाल से अधिक समय लगेगा, भले ही वर्तमान में पृथ्वी पर सभी कम्प्यूटेशनल संसाधनों को जोड़ दिया जाए।&lt;/li>
&lt;li>&lt;strong>Shor&amp;rsquo;s Algorithm (क्वांटम)&lt;/strong>: $O((\log n)^3)$ एल्गोरिदम के साथ, केवल लगभग $2048^3 \approx 8.5 \times 10^9$ लॉजिक गेट ऑपरेशनों की आवश्यकता होगी। इसका मतलब यह है कि यदि उचित हार्डवेयर (लाखों भौतिक क्विबिट और त्रुटि सुधार क्षमताओं के साथ एक यूनिवर्सल क्वांटम कंप्यूटर) मौजूद है, तो गणना केवल कुछ घंटों से लेकर कुछ दिनों में पूरी की जा सकती है।&lt;/li>
&lt;/ul>
&lt;p>&amp;ldquo;घातांक $\alpha=1/3$&amp;rdquo; सब-एक्सपोनेंशियल से &amp;ldquo;पॉलीनोमियल टाइम&amp;rdquo; में प्रतिमान बदलाव (paradigm shift) पारंपरिक क्रिप्टोग्राफी की उस रणनीति को शक्तिहीन कर देता है जो कुंजी की लंबाई बढ़ाकर सुरक्षा सुनिश्चित करती है।&lt;/p>
&lt;hr>
&lt;h2 id="6-नषकरष-अगल-पढ-क-लए-दषटकण">6. निष्कर्ष: अगली पीढ़ी के लिए दृष्टिकोण
&lt;/h2>&lt;p>&amp;ldquo;क्या GNFS से परे कोई क्लासिकल एल्गोरिदम मौजूद है?&amp;rdquo; प्रश्न के लिए वैज्ञानिक समुदाय की वर्तमान आम सहमति इस प्रकार है:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>व्यावहारिक सुधार जारी रहेंगे, लेकिन एसिम्प्टोटिक छलांग नहीं लगेगी&lt;/strong>: MNFS, बहुपद चयन का अनुकूलन, ब्लॉक वीडमैन विधि का समानांतरकरण आदि जैसे GNFS के स्थिरांक पद $c$ को सुधारने के प्रयास जारी हैं। हालाँकि, इसकी बहुत कम संभावना है कि $\alpha = 1/3$ से कम वाला कोई क्लासिकल एल्गोरिदम खोजा जाएगा।&lt;/li>
&lt;li>&lt;strong>क्लासिकल कंप्यूटरों पर RSA की सुरक्षा मजबूत बनी हुई है&lt;/strong>: GNFS की कम्प्यूटेशनल जटिलता अभी भी बहुत बड़ी है, और RSA-2048 और RSA-4096 क्लासिकल कंप्यूटरों के हमलों के खिलाफ आने वाले कई दशकों तक सुरक्षित रहेंगे।&lt;/li>
&lt;li>&lt;strong>असली खतरा क्वांटम एल्गोरिदम है&lt;/strong>: क्वांटम यांत्रिकी के सिद्धांतों पर आधारित शोर का एल्गोरिदम कम्प्यूटेशनल जटिलता की बाधा को तोड़ता है। इसके कारण, दुनिया को पोस्ट-क्वांटम क्रिप्टोग्राफी (PQC: Post-Quantum Cryptography) में स्थानांतरित होने के लिए मजबूर होना पड़ रहा है। क्वांटम कंप्यूटरों (जो पॉलीनोमियल टाइम में हल नहीं किए जा सकते) के लिए भी कठिन मानी जाने वाली नई गणितीय समस्याओं, जैसे लैटिस-आधारित क्रिप्टोग्राफी और हैश-आधारित क्रिप्टोग्राफी में संक्रमण, वर्तमान क्रिप्टोग्राफी में सबसे आगे है।&lt;/li>
&lt;/ol>
&lt;p>जनरल नंबर फील्ड सीव (GNFS) &amp;ldquo;सर्वोच्च उपलब्धियों&amp;rdquo; में से एक है जिसे मानवता क्लासिकल गणित और एल्गोरिदम डिजाइन की सीमा तक पहुंचकर हासिल कर पाई है। GNFS की गहरी गणितीय संरचना को समझना न केवल क्रिप्टैनालिसिस (cryptanalysis) का इतिहास सीखना है, बल्कि यह कम्प्यूटेशनल कॉम्प्लेक्सिटी थ्योरी और बीजीय संख्या सिद्धांत (algebraic number theory) की सुंदरता का अनुभव करने के लिए एक बौद्धिक खोज की यात्रा भी है। उस दिन तक जब क्वांटम कंप्यूटर व्यावहारिक हो जाएंगे, GNFS संभवतः सबसे शक्तिशाली गुणनखंडन एल्गोरिदम के रूप में अपना सिंहासन बनाए रखेगा।&lt;/p></description></item><item><title>पायथन में शोर के एल्गोरिथ्म का सिमुलेशन</title><link>http://kenji.blog/hi/p/shors-algorithm-simulation-python/</link><pubDate>Fri, 11 Sep 2026 08:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/shors-algorithm-simulation-python/</guid><description>&lt;img src="http://kenji.blog/p/shors-algorithm-simulation-python/img/eyecatch.jpg" alt="Featured image of post पायथन में शोर के एल्गोरिथ्म का सिमुलेशन" />&lt;h1 id="1-परचय-कवटम-कपयटर-दवर-लय-गय-करपटगरफ-क-सकट">1. परिचय: क्वांटम कंप्यूटर द्वारा लाया गया क्रिप्टोग्राफी का संकट
&lt;/h1>&lt;p>आधुनिक इंटरनेट समाज में सुरक्षा का अधिकांश हिस्सा &lt;strong>सार्वजनिक कुंजी क्रिप्टोग्राफी (Public Key Cryptography)&lt;/strong> (विशेष रूप से RSA एन्क्रिप्शन) पर निर्भर करता है। जब हम ऑनलाइन शॉपिंग के दौरान क्रेडिट कार्ड की जानकारी भेजते हैं या अत्यधिक गोपनीय डेटा का आदान-प्रदान करते हैं, तो उस संचार की सामग्री को RSA एन्क्रिप्शन द्वारा दृढ़ता से सुरक्षित किया जाता है।&lt;/p>
&lt;p>RSA एन्क्रिप्शन की सुरक्षा का आधार इस गणितीय तथ्य पर निर्भर करता है कि &amp;ldquo;&lt;strong>एक बहुत बड़े पूर्णांक का अभाज्य गुणनखंडन शास्त्रीय कंप्यूटरों (जैसे पीसी या सुपरकंप्यूटर) के लिए अत्यंत कठिन है&lt;/strong>।&amp;rdquo; हालाँकि, 1994 में पीटर शोर (Peter Shor) द्वारा प्रकाशित &amp;ldquo;&lt;strong>शोर का एल्गोरिथ्म (Shor&amp;rsquo;s Algorithm)&lt;/strong>&amp;rdquo; इस आधार को पूरी तरह से पलट देता है। यह गणितीय रूप से सिद्ध हो चुका है कि यदि शोर के एल्गोरिथ्म को बड़े पैमाने के क्वांटम कंप्यूटर पर निष्पादित किया जाए, तो अभाज्य गुणनखंडन, जिसे शास्त्रीय कंप्यूटर पर हल करने में ब्रह्मांड की आयु से अधिक समय लग सकता है, उसे केवल कुछ मिनटों से लेकर कुछ घंटों में हल किया जा सकता है।&lt;/p>
&lt;p>इस लेख में, हम विस्तार से बताएंगे कि कैसे शोर का एल्गोरिथ्म अभाज्य गुणनखंडन को इतनी तेज़ी से करता है, इसके गणितीय तंत्र से लेकर, क्वांटम कंप्यूटिंग फ्रेमवर्क &lt;strong>Qiskit&lt;/strong> और Python का उपयोग करके इसके विशिष्ट सिमुलेशन कार्यान्वयन तक।&lt;/p>
&lt;hr>
&lt;h1 id="2-कमपयटशनल-जटलत-म-नटकय-बदलव-घतकय-स-बहपद-समय-तक">2. कम्प्यूटेशनल जटिलता में नाटकीय बदलाव: घातांकीय से बहुपद समय तक
&lt;/h1>&lt;p>अभाज्य गुणनखंडन इतना कठिन क्यों है? भले ही हम &amp;ldquo;सामान्य संख्या क्षेत्र चलनी (General Number Field Sieve, GNFS)&amp;rdquo; का उपयोग करें, जिसे शास्त्रीय कंप्यूटरों के लिए सबसे अच्छा अभाज्य गुणनखंडन एल्गोरिथ्म माना जाता है, इसकी कम्प्यूटेशनल जटिलता उप-घातांकीय (sub-exponential) है।&lt;/p>
&lt;p>$N$ अंकों की एक समग्र संख्या (composite number) का अभाज्य गुणनखंडन करने के लिए आवश्यक समय जटिलता (time complexity) शास्त्रीय तरीकों से इस प्रकार है:&lt;/p>
$$ O\left(\exp\left( c (\log N)^{1/3} (\log \log N)^{2/3} \right)\right) $$
&lt;p>इस वजह से, केवल कुंजी की लंबाई बढ़ाने (उदाहरण के लिए, इसे 2048 बिट्स या 4096 बिट्स करने) से शास्त्रीय कंप्यूटरों के लिए डिक्रिप्शन में हजारों या लाखों साल लग सकते हैं, जो कि अव्यावहारिक है।&lt;/p>
&lt;p>हालाँकि, जब क्वांटम कंप्यूटर पर &lt;strong>शोर के एल्गोरिथ्म&lt;/strong> का उपयोग किया जाता है, तो इनपुट बिट्स $\log N$ की संख्या के सापेक्ष कम्प्यूटेशनल जटिलता नाटकीय रूप से कम होकर बहुपद समय (polynomial time) में आ जाती है।&lt;/p>
$$ O((\log N)^3) $$
&lt;p>इसका मतलब यह है कि यदि बिट्स की संख्या दोगुनी कर दी जाए, तो शास्त्रीय कंप्यूटरों के लिए गणना का समय खगोलीय रूप से बढ़ जाता है, जबकि क्वांटम कंप्यूटरों के लिए गणना का समय केवल लगभग 8 गुना बढ़ जाता है। &lt;strong>घातांकीय समय से बहुपद समय तक जटिलता वर्ग में यह कमी (BQP वर्ग में शामिल होना)&lt;/strong> ही शोर के एल्गोरिथ्म की सच्ची महानता है।&lt;/p>
&lt;div class="mermaid">graph TD
A["इनपुट आकार (बिट्स की संख्या) N में वृद्धि"] --> B{"एल्गोरिथ्म का चयन"}
B -->|शास्त्रीय: सामान्य संख्या क्षेत्र चलनी| C["उप-घातांकीय वृद्धि O(exp(...))"]
B -->|क्वांटम: शोर का एल्गोरिथ्म| D["बहुपद समय O((log N)^3)"]
C --> E["हजारों से अरबों साल (डिक्रिप्ट करने में असमर्थ)"]
D --> F["कुछ मिनट से कुछ घंटे (व्यावहारिक समय में डिक्रिप्ट)"]&lt;/div>
&lt;hr>
&lt;h1 id="3-एलगरथम-क-अवलकन-और-गणतय-पषठभम">3. एल्गोरिथ्म का अवलोकन और गणितीय पृष्ठभूमि
&lt;/h1>&lt;p>असल में, शोर के एल्गोरिथ्म में सब कुछ क्वांटम कंप्यूटर पर नहीं किया जाता है। यह शास्त्रीय कंप्यूटर द्वारा प्री-प्रोसेसिंग और पोस्ट-प्रोसेसिंग, और क्वांटम कंप्यूटर द्वारा मुख्य भाग (अवधि खोजने का एल्गोरिथ्म - Period Finding Algorithm) के बीच सहयोग पर निर्भर करता है।&lt;/p>
&lt;p>एल्गोरिथ्म का समग्र प्रवाह इस प्रकार है:&lt;/p>
&lt;div class="mermaid">graph TD
A["इनपुट: वह समग्र संख्या N जिसका अभाज्य गुणनखंडन करना है"] --> B["यादृच्छिक संख्या a चुनें जहाँ a &lt; N"]
B --> C{"gcd(a, N) > 1 ?"}
C -- "Yes" --> D["तुच्छ गुणनखंड gcd(a, N) आउटपुट करें और समाप्त करें"]
C -- "No" --> E["क्वांटम एल्गोरिथ्म के साथ f(x) = a^x mod N की अवधि r खोजें"]
E --> F{"क्या r सम है और a^(r/2) ≢ -1 mod N ?"}
F -- "No" --> B
F -- "Yes" --> G["गुणनखंड p = gcd(a^(r/2) - 1, N), q = gcd(a^(r/2) + 1, N) की गणना करें"]
G --> H["आउटपुट: p, q"]&lt;/div>
&lt;h2 id="अभजय-गणनखडन-क-अवध-खजन-क-समसय-period-finding-problem-म-बदलन">अभाज्य गुणनखंडन को अवधि खोजने की समस्या (Period Finding Problem) में बदलना
&lt;/h2>&lt;p>शोर का प्रतिभाशाली विचार &amp;ldquo;&lt;strong>अभाज्य गुणनखंडन समस्या&lt;/strong>&amp;rdquo; को &amp;ldquo;&lt;strong>अवधि खोजने की समस्या (Order Finding Problem)&lt;/strong>&amp;rdquo; में परिवर्तित करना था।&lt;/p>
&lt;p>मान लीजिए कि एक पूर्णांक $N$ (वह संख्या जिसका अभाज्य गुणनखंडन किया जाना है) और एक सह-अभाज्य (coprime) पूर्णांक $a$ ($1 &lt; a &lt; N$) है। हम निम्नलिखित मॉड्यूलर एक्सपोनेंशियल फ़ंक्शन को परिभाषित करते हैं:&lt;/p>
$$ f(x) = a^x \bmod N $$
&lt;p>इस फ़ंक्शन की एक निश्चित अवधि $r$ होती है। अर्थात, किसी भी $x$ के लिए, $f(x+r) = f(x)$ सत्य होता है। विशेष रूप से, जब $x=0$ होता है,&lt;/p>
$$ a^r \equiv 1 \pmod N $$
&lt;p>सबसे छोटा धनात्मक पूर्णांक $r$ जो इसे संतुष्ट करता है, उसे &amp;ldquo;$N$ के मापांक में $a$ का क्रम (Order)&amp;rdquo; कहा जाता है। यदि हम इस अवधि $r$ को पा सकते हैं, तो हम अभाज्य गुणनखंडों को निम्न प्रकार से निकाल सकते हैं:&lt;/p>
&lt;p>समीकरण को बदलने पर,
&lt;/p>
$$ a^r - 1 \equiv 0 \pmod N $$
&lt;p>
यदि $r$ सम है, तो हम इसे वर्गों के अंतर के सूत्र का उपयोग करके गुणनखंडित कर सकते हैं:
&lt;/p>
$$ (a^{r/2} - 1)(a^{r/2} + 1) \equiv 0 \pmod N $$
&lt;p>यह इंगित करता है कि $N$ का $(a^{r/2} - 1)$ या $(a^{r/2} + 1)$ के साथ कोई सार्व भाजक (common divisor) है (बशर्ते कि शर्त $a^{r/2} \not\equiv -1 \pmod N$ संतुष्ट हो)। इसलिए, यूक्लिडियन एल्गोरिथ्म (Euclidean algorithm) का उपयोग करके,&lt;/p>
$$ p = \gcd(a^{r/2} - 1, N) $$
$$ q = \gcd(a^{r/2} + 1, N) $$
&lt;p>की गणना करके, हम $N$ के गैर-तुच्छ अभाज्य गुणनखंड (non-trivial prime factors) $p, q$ खोज सकते हैं। यह गणना (महत्तम समापवर्तक की गणना और यादृच्छिक संख्या का निर्माण) शास्त्रीय कंप्यूटरों पर बहुत तेजी से की जा सकती है। समस्या केवल इस बात पर केंद्रित हो जाती है कि &lt;strong>हम अवधि $r$ को तेजी से कैसे खोज सकते हैं&lt;/strong>। शास्त्रीय कंप्यूटरों के लिए, केवल इस अवधि $r$ को खोजने में ही घातांकीय समय लगता है। यहीं क्वांटम कंप्यूटर काम में आते हैं।&lt;/p>
&lt;hr>
&lt;h1 id="4-कवटम-एलगरथम-भग-अवध-खजन-क-ततर">4. क्वांटम एल्गोरिथ्म भाग: अवधि खोजने का तंत्र
&lt;/h1>&lt;p>क्वांटम कंप्यूटर का उपयोग करके अवधि $r$ खोजने के लिए सबरूटीन में निम्नलिखित 4 चरण शामिल हैं:&lt;/p>
&lt;div class="mermaid">graph LR
subgraph "क्वांटम अवस्था का संक्रमण"
S1["|0⟩|0⟩ (आरंभीकरण)"] --> S2["H गेट: सुपरपोजिशन Σ|x⟩|0⟩"]
S2 --> S3["ओरेकल U: Σ|x⟩|a^x mod N⟩"]
S3 --> S4["QFT: हस्तक्षेप द्वारा अवधि निष्कर्षण"]
S4 --> S5["माप: अनुमानित मान y प्राप्त करना"]
end&lt;/div>
&lt;h2 id="चरण-1-कवटम-रजसटर-क-आरभकरण-और-सपरपजशन">चरण 1: क्वांटम रजिस्टर का आरंभीकरण और सुपरपोजिशन
&lt;/h2>&lt;p>सबसे पहले, हम दो क्वांटम रजिस्टर तैयार करते हैं। पहला रजिस्टर अवस्था इनपुट करने के लिए है, और दूसरा रजिस्टर फ़ंक्शन के गणना परिणामों को संग्रहीत करने के लिए है।
प्रारंभिक अवस्था पूरी तरह से $|0\rangle$ है।&lt;/p>
$$ |\psi_0\rangle = |0\rangle_1 |0\rangle_2 $$
&lt;p>हम पहले रजिस्टर के सभी क्विबिट्स पर हैडमार्ड गेट (Hadamard Gate) लागू करते हैं ताकि सभी संभावित इनपुट्स $x$ ($0$ से $Q-1$ तक, $Q=2^n$) की समान संभावना वाली सुपरपोजिशन अवस्था (superposition state) बनाई जा सके।&lt;/p>
$$ |\psi_1\rangle = \frac{1}{\sqrt{Q}} \sum_{x=0}^{Q-1} |x\rangle_1 |0\rangle_2 $$
&lt;p>इसके साथ, क्वांटम कंप्यूटर एक ही ऑपरेशन में एक साथ सभी $Q$ इनपुट्स के लिए अवस्था को बनाए रखता है। यही &lt;strong>क्वांटम समानांतरता (quantum parallelism)&lt;/strong> का शक्तिशाली स्रोत है।&lt;/p>
&lt;h2 id="चरण-2-ओरकल-फकशन-मडयलर-एकसपनटएशन-लग-करन">चरण 2: ओरेकल फ़ंक्शन (मॉड्यूलर एक्सपोनेंटिएशन) लागू करना
&lt;/h2>&lt;p>इसके बाद, हम फ़ंक्शन $f(x) = a^x \bmod N$ की गणना करने के लिए क्वांटम ऑपरेशन सर्किट $U_f$ का उपयोग करते हैं और परिणाम को दूसरे रजिस्टर में संग्रहीत करते हैं।&lt;/p>
$$ |\psi_2\rangle = \frac{1}{\sqrt{Q}} \sum_{x=0}^{Q-1} |x\rangle_1 |a^x \bmod N\rangle_2 $$
&lt;p>इस बिंदु पर, पहला रजिस्टर और दूसरा रजिस्टर &lt;strong>क्वांटम एंटैंगलमेंट (quantum entanglement)&lt;/strong> की अवस्था में होते हैं। यदि हम (काल्पनिक रूप से) दूसरे रजिस्टर का अवलोकन करते हैं और एक विशिष्ट मान $k = a^{x_0} \bmod N$ प्राप्त करते हैं, तो पहले रजिस्टर की अवस्था उस $x$ की सुपरपोजिशन अवस्था में ढह जाएगी जो वह मान $k$ देता है। चूंकि फ़ंक्शन की अवधि $r$ है, शेष अवस्थाएं $x_0, x_0+r, x_0+2r, \dots$ जैसे मानों के $r$ छलांग पर होंगी।&lt;/p>
$$ |\psi_3\rangle = \sqrt{\frac{r}{Q}} \sum_{j=0}^{M-1} |x_0 + j r\rangle_1 |k\rangle_2 $$
&lt;p>हालाँकि, हम $x_0$ नहीं जानना चाहते हैं, बल्कि हम स्वयं अवधि $r$ जानना चाहते हैं। इस अवस्था से $r$ को सीधे मापना असंभव है। इसलिए, हम क्वांटम फूरियर ट्रांसफॉर्म (Quantum Fourier Transform) का उपयोग करते हैं।&lt;/p>
&lt;h2 id="चरण-3-कवटम-फरयर-टरसफरम-qft-क-मधयम-स-चरण-हसतकषप">चरण 3: क्वांटम फूरियर ट्रांसफॉर्म (QFT) के माध्यम से चरण हस्तक्षेप
&lt;/h2>&lt;p>हम पहले रजिस्टर पर &lt;strong>क्वांटम फूरियर ट्रांसफॉर्म (QFT)&lt;/strong> लागू करते हैं। QFT शास्त्रीय असतत फूरियर ट्रांसफॉर्म (discrete Fourier transform) का क्वांटम संस्करण है, जो अवस्था वेक्टर के आयाम (amplitude) को परिवर्तित करता है। आधार अवस्था (basis state) $|x\rangle$ पर QFT की क्रिया को इस प्रकार परिभाषित किया गया है:&lt;/p>
$$ QFT |x\rangle = \frac{1}{\sqrt{Q}} \sum_{y=0}^{Q-1} \omega^{xy} |y\rangle $$
&lt;p>यहाँ, $\omega = e^{2\pi i / Q}$ है।&lt;/p>
&lt;p>जब QFT लागू किया जाता है, तो अवस्थाओं के आयाम में हस्तक्षेप (interference) होता है। गणितीय विवरण को छोड़ते हुए, जब अवधि $r$ वाली अवस्था पर QFT लागू किया जाता है, तो तरंगों में &lt;strong>रचनात्मक हस्तक्षेप (Constructive Interference)&lt;/strong> केवल तभी होता है जब $y$ का मान $Q/r$ के पूर्णांक गुणज के बहुत करीब होता है। अन्य अवस्थाओं के लिए, संभावना आयाम (probability amplitude) &lt;strong>विनाशकारी हस्तक्षेप (Destructive Interference)&lt;/strong> द्वारा रद्द हो जाते हैं और शून्य के करीब पहुंच जाते हैं।&lt;/p>
&lt;h2 id="चरण-4-मपन-और-नरतर-भनन-वसतर">चरण 4: मापन और निरंतर भिन्न विस्तार
&lt;/h2>&lt;p>अंत में, हम पहले रजिस्टर को मापते हैं। माप से प्राप्त मान $y$ उच्च संभावना के साथ निम्नलिखित शर्त को पूरा करता है:&lt;/p>
$$ y \approx c \frac{Q}{r} \implies \frac{y}{Q} \approx \frac{c}{r} $$
&lt;p>($c$ एक अज्ञात पूर्णांक है जहाँ $0 \le c &lt; r$ है)&lt;/p>
&lt;p>प्राप्त परिमेय संख्या $y/Q$ पर शास्त्रीय एल्गोरिथ्म &lt;strong>निरंतर भिन्न विस्तार (Continued Fraction Expansion)&lt;/strong> लागू करके, हम सन्निकट भिन्न (approximate fraction) $c/r$ की गणना करते हैं और हर (denominator) से अवधि $r$ निकालते हैं।&lt;/p>
&lt;hr>
&lt;h1 id="5-python-और-qiskit-क-उपयग-करक-समलशन-करयनवयन">5. Python और Qiskit का उपयोग करके सिमुलेशन कार्यान्वयन
&lt;/h1>&lt;p>चूंकि केवल सिद्धांत से इसे समझना मुश्किल है, आइए वास्तव में Python और IBM के क्वांटम कंप्यूटिंग फ्रेमवर्क &lt;strong>Qiskit&lt;/strong> का उपयोग करके शोर के एल्गोरिथ्म का सिमुलेशन करें।&lt;/p>
&lt;p>यहाँ, हम सबसे क्लासिक और प्रसिद्ध परिदृश्य को लागू करेंगे: &lt;strong>&amp;quot;$a=7$ का उपयोग करके $N=15$ का अभाज्य गुणनखंडन करना।&amp;quot;&lt;/strong>&lt;/p>
&lt;h2 id="नषपदन-वतवरण-तयर-करन">निष्पादन वातावरण तैयार करना
&lt;/h2>&lt;p>कृपया सुनिश्चित करें कि आपने पहले ही Qiskit स्थापित कर लिया है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install qiskit qiskit-aer numpy
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="python-करयनवयन-कड-क-अवलकन">Python कार्यान्वयन कोड का अवलोकन
&lt;/h2>&lt;p>नीचे दिया गया कोड $N=15, a=7$ के लिए विशेषीकृत शोर के एल्गोरिथ्म कार्यान्वयन का एक उदाहरण है। चूंकि वर्तमान सिमुलेटर में सामान्य प्रयोजन के मॉड्यूलर घातांक सर्किट का निर्माण करना कम्प्यूटेशनल रूप से बहुत महंगा है, हम विशेष रूप से $a=7$ के मामले में गेट ऑपरेशंस को हार्डकोड कर रहे हैं।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt"> 10
&lt;/span>&lt;span class="lnt"> 11
&lt;/span>&lt;span class="lnt"> 12
&lt;/span>&lt;span class="lnt"> 13
&lt;/span>&lt;span class="lnt"> 14
&lt;/span>&lt;span class="lnt"> 15
&lt;/span>&lt;span class="lnt"> 16
&lt;/span>&lt;span class="lnt"> 17
&lt;/span>&lt;span class="lnt"> 18
&lt;/span>&lt;span class="lnt"> 19
&lt;/span>&lt;span class="lnt"> 20
&lt;/span>&lt;span class="lnt"> 21
&lt;/span>&lt;span class="lnt"> 22
&lt;/span>&lt;span class="lnt"> 23
&lt;/span>&lt;span class="lnt"> 24
&lt;/span>&lt;span class="lnt"> 25
&lt;/span>&lt;span class="lnt"> 26
&lt;/span>&lt;span class="lnt"> 27
&lt;/span>&lt;span class="lnt"> 28
&lt;/span>&lt;span class="lnt"> 29
&lt;/span>&lt;span class="lnt"> 30
&lt;/span>&lt;span class="lnt"> 31
&lt;/span>&lt;span class="lnt"> 32
&lt;/span>&lt;span class="lnt"> 33
&lt;/span>&lt;span class="lnt"> 34
&lt;/span>&lt;span class="lnt"> 35
&lt;/span>&lt;span class="lnt"> 36
&lt;/span>&lt;span class="lnt"> 37
&lt;/span>&lt;span class="lnt"> 38
&lt;/span>&lt;span class="lnt"> 39
&lt;/span>&lt;span class="lnt"> 40
&lt;/span>&lt;span class="lnt"> 41
&lt;/span>&lt;span class="lnt"> 42
&lt;/span>&lt;span class="lnt"> 43
&lt;/span>&lt;span class="lnt"> 44
&lt;/span>&lt;span class="lnt"> 45
&lt;/span>&lt;span class="lnt"> 46
&lt;/span>&lt;span class="lnt"> 47
&lt;/span>&lt;span class="lnt"> 48
&lt;/span>&lt;span class="lnt"> 49
&lt;/span>&lt;span class="lnt"> 50
&lt;/span>&lt;span class="lnt"> 51
&lt;/span>&lt;span class="lnt"> 52
&lt;/span>&lt;span class="lnt"> 53
&lt;/span>&lt;span class="lnt"> 54
&lt;/span>&lt;span class="lnt"> 55
&lt;/span>&lt;span class="lnt"> 56
&lt;/span>&lt;span class="lnt"> 57
&lt;/span>&lt;span class="lnt"> 58
&lt;/span>&lt;span class="lnt"> 59
&lt;/span>&lt;span class="lnt"> 60
&lt;/span>&lt;span class="lnt"> 61
&lt;/span>&lt;span class="lnt"> 62
&lt;/span>&lt;span class="lnt"> 63
&lt;/span>&lt;span class="lnt"> 64
&lt;/span>&lt;span class="lnt"> 65
&lt;/span>&lt;span class="lnt"> 66
&lt;/span>&lt;span class="lnt"> 67
&lt;/span>&lt;span class="lnt"> 68
&lt;/span>&lt;span class="lnt"> 69
&lt;/span>&lt;span class="lnt"> 70
&lt;/span>&lt;span class="lnt"> 71
&lt;/span>&lt;span class="lnt"> 72
&lt;/span>&lt;span class="lnt"> 73
&lt;/span>&lt;span class="lnt"> 74
&lt;/span>&lt;span class="lnt"> 75
&lt;/span>&lt;span class="lnt"> 76
&lt;/span>&lt;span class="lnt"> 77
&lt;/span>&lt;span class="lnt"> 78
&lt;/span>&lt;span class="lnt"> 79
&lt;/span>&lt;span class="lnt"> 80
&lt;/span>&lt;span class="lnt"> 81
&lt;/span>&lt;span class="lnt"> 82
&lt;/span>&lt;span class="lnt"> 83
&lt;/span>&lt;span class="lnt"> 84
&lt;/span>&lt;span class="lnt"> 85
&lt;/span>&lt;span class="lnt"> 86
&lt;/span>&lt;span class="lnt"> 87
&lt;/span>&lt;span class="lnt"> 88
&lt;/span>&lt;span class="lnt"> 89
&lt;/span>&lt;span class="lnt"> 90
&lt;/span>&lt;span class="lnt"> 91
&lt;/span>&lt;span class="lnt"> 92
&lt;/span>&lt;span class="lnt"> 93
&lt;/span>&lt;span class="lnt"> 94
&lt;/span>&lt;span class="lnt"> 95
&lt;/span>&lt;span class="lnt"> 96
&lt;/span>&lt;span class="lnt"> 97
&lt;/span>&lt;span class="lnt"> 98
&lt;/span>&lt;span class="lnt"> 99
&lt;/span>&lt;span class="lnt">100
&lt;/span>&lt;span class="lnt">101
&lt;/span>&lt;span class="lnt">102
&lt;/span>&lt;span class="lnt">103
&lt;/span>&lt;span class="lnt">104
&lt;/span>&lt;span class="lnt">105
&lt;/span>&lt;span class="lnt">106
&lt;/span>&lt;span class="lnt">107
&lt;/span>&lt;span class="lnt">108
&lt;/span>&lt;span class="lnt">109
&lt;/span>&lt;span class="lnt">110
&lt;/span>&lt;span class="lnt">111
&lt;/span>&lt;span class="lnt">112
&lt;/span>&lt;span class="lnt">113
&lt;/span>&lt;span class="lnt">114
&lt;/span>&lt;span class="lnt">115
&lt;/span>&lt;span class="lnt">116
&lt;/span>&lt;span class="lnt">117
&lt;/span>&lt;span class="lnt">118
&lt;/span>&lt;span class="lnt">119
&lt;/span>&lt;span class="lnt">120
&lt;/span>&lt;span class="lnt">121
&lt;/span>&lt;span class="lnt">122
&lt;/span>&lt;span class="lnt">123
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">numpy&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">np&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">qiskit&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">QuantumCircuit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">qiskit_aer&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">AerSimulator&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">qiskit.visualization&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">plot_histogram&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">fractions&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Fraction&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">math&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. व्युत्क्रम क्वांटम फूरियर ट्रांसफॉर्म (QFT†) बनाने का फलन&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">qft_dagger&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;n क्विबिट्स का इनवर्स क्वांटम फूरियर ट्रांसफॉर्म सर्किट बनाता है&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">QuantumCircuit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># क्रम को उलटने के लिए SWAP गेट&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">qubit&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="o">//&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">swap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">qubit&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">qubit&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># नियंत्रित फेज़ गेट और H गेट को लागू करना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">j&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">m&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">j&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cp&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pi&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="nb">float&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">j&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">m&lt;/span>&lt;span class="p">)),&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">j&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">h&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">j&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;QFT_dagger&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">qc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 7^x mod 15 के लिए नियंत्रित मॉड्यूलर एक्सपोनेंटिएशन ऑपरेशन बनाने का फलन&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">c_amod15&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">power&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;विशिष्ट &amp;#39;a&amp;#39; और &amp;#39;power&amp;#39; के लिए नियंत्रित U गेट बनाता है (केवल N=15 के लिए)&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">QuantumCircuit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">_&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">power&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># a=7 होने पर 7^x mod 15 के लिए हार्डकोडेड लॉजिक&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">13&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">swap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">swap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">swap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">swap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">swap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">swap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">11&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">swap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">swap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">11&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">13&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">q&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">q&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">to_gate&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">^&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">power&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> mod 15&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">c_U&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">U&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">control&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">c_U&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. मुख्य क्वांटम सर्किट विन्यास&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">shor_circuit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n_count&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># n_count: नियंत्रण रजिस्टर में बिट्स की संख्या&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># लक्ष्य रजिस्टर 0 से 15 तक दर्शाने के लिए 4 बिट्स का उपयोग करता है&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">QuantumCircuit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n_count&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n_count&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># पहले रजिस्टर (नियंत्रण रजिस्टर) का आरंभीकरण (सुपरपोजिशन उत्पन्न करना)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">q&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n_count&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">h&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">q&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># दूसरे रजिस्टर (लक्ष्य रजिस्टर) को |1&amp;gt; (0001) पर आरंभ करना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">n_count&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># नियंत्रित मॉड्यूलर एक्सपोनेंटिएशन (ओरेकल) को लागू करना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">q&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n_count&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 2^q घातांक ऑपरेशन लागू करना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c_amod15&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="n">q&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="n">q&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="n">n_count&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">)])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># पहले रजिस्टर पर इनवर्स क्वांटम फूरियर ट्रांसफॉर्म लागू करना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">qft_dagger&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n_count&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n_count&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># पहले रजिस्टर को मापना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">measure&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n_count&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n_count&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">qc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># --- निष्पादन अनुभाग ---&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">N&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">15&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">7&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n_count&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">8&lt;/span> &lt;span class="c1"># नियंत्रण रजिस्टर में 8 क्विबिट्स का उपयोग करें (Q=256)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;खोज सेटिंग्स: N=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">N&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">, a=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">, नियंत्रण क्विबिट्स की संख्या=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">n_count&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># सर्किट का निर्माण&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qc&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">shor_circuit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n_count&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># सिमुलेटर पर निष्पादन&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sim&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">AerSimulator&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># नवीनतम Qiskit में transpile की अनुशंसा की जाती है&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">qiskit&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">transpile&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">compiled_circuit&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">transpile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">qc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sim&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">job&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">sim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">run&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">compiled_circuit&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">shots&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">1024&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">job&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">counts&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_counts&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">माप परिणाम (बिट स्ट्रिंग: प्रेक्षणों की संख्या):&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">bitstring&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">count&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">counts&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">items&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34; &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">bitstring&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">count&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> बार&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># शास्त्रीय पोस्ट-प्रोसेसिंग: निरंतर भिन्न विस्तार (Continued fractions) का उपयोग करके अवधि r खोजना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">--- अवधि की गणना और अभाज्य गुणनखंडन ---&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">phases&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">output&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">counts&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># बिट स्ट्रिंग को दशमलव में परिवर्तित करना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">decimal&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">output&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># फेज़ (Phase) = मापा गया मान / 2^n_count&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">phase&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">decimal&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="n">n_count&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">phases&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">phase&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># निरंतर भिन्न विस्तार के माध्यम से सन्निकट भिन्न प्राप्त करें। हर (denominator) की ऊपरी सीमा N=15 है&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">frac&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Fraction&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">phase&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">limit_denominator&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">15&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">frac&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">denominator&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;प्रेक्षित मान: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">decimal&lt;/span>&lt;span class="si">:&lt;/span>&lt;span class="s2">3d&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> | फेज़: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">phase&lt;/span>&lt;span class="si">:&lt;/span>&lt;span class="s2">.4f&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> | भिन्न: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">frac&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> | अनुमानित अवधि r = &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># जांचें कि क्या अवधि r सम है और वैध परिणाम देती है&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">guess1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">math&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="o">//&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">guess2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">math&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="o">//&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">guess1&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="ow">or&lt;/span> &lt;span class="n">guess2&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34; =&amp;gt; सफलता! &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">N&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> के अभाज्य गुणनखंड &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">guess1&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> और &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">guess2&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> हैं।&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34; =&amp;gt; केवल तुच्छ गुणनखंड। पुनः प्रयास करें।&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34; =&amp;gt; विफलता क्योंकि अवधि विषम है।&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="कड-क-वयखय-और-नषपदन-परणम-क-वशलषण">कोड की व्याख्या और निष्पादन परिणामों का विश्लेषण
&lt;/h2>&lt;p>जब आप उपरोक्त कोड निष्पादित करते हैं, तो आपको उच्च संभावना के साथ नियंत्रण रजिस्टर के मापन परिणामों के रूप में विशिष्ट चोटियाँ (प्रेक्षित मान) प्राप्त होंगी। &lt;code>n_count=8&lt;/code> ($Q=256$) के मामले में, एक आदर्श क्वांटम कंप्यूटर (या सिमुलेटर) पर, भारी संभावना के साथ प्रेक्षित मानों के रूप में &lt;code>0&lt;/code>, &lt;code>64&lt;/code>, &lt;code>128&lt;/code>, और &lt;code>192&lt;/code> जैसी संख्याएं दिखाई देंगी।&lt;/p>
&lt;p>जब इन्हें $Q=256$ से विभाजित किया जाता है, तो चरण (phase) $y/Q$ क्रमशः $0.0$, $0.25$, $0.5$, और $0.75$ हो जाते हैं।
जब इन चरणों को निरंतर भिन्न (continued fraction) के रूप में विस्तारित किया जाता है:&lt;/p>
&lt;ul>
&lt;li>$0.25 \to 1/4$ (अनुमानित अवधि $r=4$)&lt;/li>
&lt;li>$0.50 \to 1/2$ (अनुमानित अवधि $r=2$)&lt;/li>
&lt;li>$0.75 \to 3/4$ (अनुमानित अवधि $r=4$)&lt;/li>
&lt;/ul>
&lt;p>यहां प्राप्त अवधि $r=4$ का उपयोग करके, हम अभाज्य गुणनखंडों की गणना करते हैं।
चूंकि $a=7, r=4$ है,
$p = \gcd(7^2 - 1, 15) = \gcd(48, 15) = 3$
$q = \gcd(7^2 + 1, 15) = \gcd(50, 15) = 5$&lt;/p>
&lt;p>शानदार ढंग से, हम सफलतापूर्वक $15 = 3 \times 5$ का अभाज्य गुणनखंडन कर चुके हैं।&lt;/p>
&lt;blockquote>
&lt;p>[!TIP]
यदि प्रेक्षित मान $y=128$ (चरण $0.5$) प्राप्त होता है, तो हर (denominator) $2$ होगा, और हमें सही अवधि $r=4$ के बजाय इसका एक विभाजक मिलेगा। ऐसे मामलों में, एल्गोरिथ्म को कई बार निष्पादित करके या प्राप्त $r$ के गुणकों की जाँच करके, सही अवधि तक पहुँचा जा सकता है।&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="6-वयवहरक-अनपरयग-क-लए-चनतय-और-nisq-यग-क-समए">6. व्यावहारिक अनुप्रयोग के लिए चुनौतियाँ और NISQ युग की सीमाएँ
&lt;/h1>&lt;p>हालाँकि एक सिमुलेटर पर $N=15$ का अभाज्य गुणनखंडन करना आसान था, वास्तविक दुनिया में उपयोग किए जा रहे RSA-2048 (617 अंकों की दशमलव संख्या) का अभाज्य गुणनखंडन करने के लिए वास्तविक क्वांटम कंप्यूटरों को अभी भी कई बाधाओं का सामना करना पड़ता है।&lt;/p>
&lt;p>जिस युग में हम वर्तमान में रह रहे हैं उसे &lt;strong>NISQ (Noisy Intermediate-Scale Quantum: शोरगुल वाले मध्यवर्ती-स्तरीय क्वांटम) युग&lt;/strong> कहा जाता है। क्वांटम बिट्स बाहरी वातावरण के शोर के प्रति बेहद संवेदनशील होते हैं, और गणना के बीच में &amp;ldquo;डिकोहेरेंस (decoherence)&amp;rdquo; के कारण उनकी अवस्था नष्ट हो जाती है।&lt;/p>
&lt;p>शोर के एल्गोरिथ्म जैसे गहरे (बड़ी संख्या में गेट्स वाले) सर्किट को सटीक रूप से निष्पादित करने के लिए, &lt;strong>क्वांटम त्रुटि सुधार (Quantum Error Correction)&lt;/strong> आवश्यक है जो शोर को ठीक करता है। एक शोर-मुक्त &amp;ldquo;लॉजिकल क्विबिट (logical qubit)&amp;rdquo; बनाने के लिए, सरफेस कोड (Surface Code) आदि के माध्यम से हजारों &amp;ldquo;फिजिकल क्विबिट्स (physical qubits)&amp;rdquo; को एन्कोड करना आवश्यक है।&lt;/p>
&lt;p>अनुमान है कि 2048-बिट RSA एन्क्रिप्शन को तोड़ने के लिए हजारों पूर्ण लॉजिकल क्विबिट्स की आवश्यकता होगी, और इसे प्राप्त करने के लिए &lt;strong>लाखों से करोड़ों फिजिकल क्विबिट्स&lt;/strong> से सुसज्जित एक फॉल्ट-टॉलरेंट (दोष-सहिष्णु) क्वांटम कंप्यूटर की आवश्यकता होगी। यहाँ तक कि आज के सबसे उन्नत क्वांटम प्रोसेसर में भी केवल कुछ सौ से कुछ हज़ार फिजिकल क्विबिट्स हैं, इसलिए दुनिया की एन्क्रिप्शन व्यवस्था तुरंत नहीं टूटेगी।&lt;/p>
&lt;blockquote>
&lt;p>[!WARNING]
हालाँकि, &amp;ldquo;Store Now, Decrypt Later (अभी सहेजें, बाद में डिक्रिप्ट करें)&amp;rdquo; नामक एक खतरे का मॉडल (threat model) मौजूद है। हमलावर वर्तमान में एन्क्रिप्टेड गोपनीय संचार डेटा को बड़ी मात्रा में सहेज सकते हैं, और 10 से 20 साल बाद एक शक्तिशाली क्वांटम कंप्यूटर पूरा होने के तुरंत बाद उन सभी को डिक्रिप्ट करने की रणनीति अपना सकते हैं।&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="7-पसट-कवटम-करपटगरफ-pqc-म-सथनतरण">7. पोस्ट-क्वांटम क्रिप्टोग्राफी (PQC) में स्थानांतरण
&lt;/h1>&lt;p>ऐसे &amp;ldquo;Q-Day (वह दिन जब क्वांटम कंप्यूटर एन्क्रिप्शन को तोड़ेंगे)&amp;rdquo; के आगमन की तैयारी में, अमेरिका के नेशनल इंस्टीट्यूट ऑफ स्टैंडर्ड्स एंड टेक्नोलॉजी (NIST) के नेतृत्व में, दुनिया भर के क्रिप्टोग्राफर &lt;strong>पोस्ट-क्वांटम क्रिप्टोग्राफी (Post-Quantum Cryptography, PQC)&lt;/strong> के लिए मानक विकसित कर रहे हैं।&lt;/p>
&lt;p>PQC नई गणितीय समस्याओं (जैसे कि जालक समस्याएँ (lattice problems), बहुभिन्नरूपी बहुपद समस्याएँ (multivariate polynomial problems), हैश फ़ंक्शन-आधारित आदि) पर आधारित है, जिनके बारे में गणितीय रूप से माना जाता है कि उन्हें शोर के एल्गोरिथ्म (या ग्रोवर के एल्गोरिथ्म) का उपयोग करके भी कुशलता से हल नहीं किया जा सकता है। &amp;ldquo;CRYSTALS-Kyber&amp;rdquo; और &amp;ldquo;CRYSTALS-Dilithium&amp;rdquo; जैसे एल्गोरिथ्म को पहले ही मानक विनिर्देशों के रूप में चुना जा चुका है, और इन्हें धीरे-धीरे Apple के iMessage और विभिन्न वेब ब्राउज़र के संचार प्रोटोकॉल में पेश किया जा रहा है।&lt;/p>
&lt;p>IT इन्फ्रास्ट्रक्चर का प्रबंधन करने वाले इंजीनियरों के लिए, मौजूदा RSA और इलिप्टिक कर्व क्रिप्टोग्राफी (elliptic curve cryptography) से PQC में सिस्टमिक बदलाव करना, अर्थात् &amp;ldquo;क्रिप्टो-एजिलिटी (Crypto-agility: एन्क्रिप्शन विधियों को तेज़ी से बदलने की क्षमता)&amp;rdquo; को सिस्टम में शामिल करना, भविष्य का एक बड़ा मिशन होगा।&lt;/p>
&lt;hr>
&lt;h1 id="8-नषकरष">8. निष्कर्ष
&lt;/h1>&lt;p>इस लेख में, हमने शोर के एल्गोरिथ्म की सैद्धांतिक गणितीय पृष्ठभूमि से शुरुआत करके, क्वांटम फूरियर ट्रांसफॉर्म का उपयोग करके अवधि निष्कर्षण तंत्र, और अंततः Python और Qiskit का उपयोग करके विशिष्ट सिमुलेशन कोड तक, 10,000 वर्णों के पैमाने पर एक विस्तृत व्याख्या प्रदान की है।&lt;/p>
&lt;p>यह तथ्य कि क्वांटम यांत्रिकी के सूक्ष्म विश्व के भौतिक नियम, मैक्रोस्कोपिक सूचना विज्ञान के मूल (जैसे कम्प्यूटेशनल जटिलता सिद्धांत और क्रिप्टोग्राफी सिद्धांत) को पूरी तरह से पलट सकते हैं, विज्ञान के इतिहास में सबसे रोमांचक प्रतिमान बदलावों (paradigm shifts) में से एक है। हमें क्वांटम कंप्यूटिंग तकनीक के चल ক্রিম विकास और इसके खिलाफ बचाव करने वाली नई एन्क्रिप्शन तकनीकों के बीच लड़ाई पर नज़र रखनी चाहिए।&lt;/p>
&lt;p>हम आपको इस लेख में प्रस्तुत Python कोड को अपने स्वयं के वातावरण में निष्पादित करने के लिए प्रोत्साहित करते हैं, और क्वांटम अवस्था सुपरपोजिशन (superposition) और हस्तक्षेप (interference) द्वारा बनाए गए &amp;ldquo;कम्प्यूटेशनल जादू (magic of computation)&amp;rdquo; का अनुभव करते हैं।&lt;/p>
&lt;hr>
&lt;p>&lt;strong>संदर्भ (References)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Shor, P. W. (1994). &amp;ldquo;Algorithms for quantum computation: discrete logarithms and factoring&amp;rdquo;. Proceedings 35th Annual Symposium on Foundations of Computer Science.&lt;/li>
&lt;li>Nielsen, M. A., &amp;amp; Chuang, I. L. (2010). &amp;ldquo;Quantum Computation and Quantum Information&amp;rdquo;. Cambridge University Press.&lt;/li>
&lt;li>Qiskit Documentation: &lt;a class="link" href="https://qiskit.org/documentation/" target="_blank" rel="noopener"
>https://qiskit.org/documentation/&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>【चित्रित PQC】 क्वांटम-प्रतिरोधी क्रिप्टोग्राफी के प्रमुख एल्गोरिदम की तुलना</title><link>http://kenji.blog/hi/p/post-quantum-cryptography-algorithms-comparison/</link><pubDate>Fri, 11 Sep 2026 07:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/post-quantum-cryptography-algorithms-comparison/</guid><description>&lt;img src="http://kenji.blog/p/post-quantum-cryptography-algorithms-comparison/img/eyecatch.jpg" alt="Featured image of post 【चित्रित PQC】 क्वांटम-प्रतिरोधी क्रिप्टोग्राफी के प्रमुख एल्गोरिदम की तुलना" />&lt;h2 id="1-परचय-कवटम-कपयटर-दवर-लय-गय-करपटगरफ-सकट">1. परिचय: क्वांटम कंप्यूटर द्वारा लाया गया &amp;lsquo;क्रिप्टोग्राफी संकट&amp;rsquo;
&lt;/h2>&lt;p>आधुनिक इंटरनेट समाज में, संचार की गोपनीयता और डेटा की अखंडता की रक्षा के लिए पब्लिक-की क्रिप्टोग्राफी तकनीक बुनियादी ढांचे के रूप में अपरिहार्य है। वर्तमान में व्यापक रूप से उपयोग की जाने वाली RSA क्रिप्टोग्राफी और एलिप्टिक कर्व क्रिप्टोग्राफी (ECC), क्रमशः &amp;lsquo;विशाल समग्र संख्याओं के अभाज्य गुणनखंड (prime factorization) की कठिनाई&amp;rsquo; और &amp;lsquo;एलिप्टिक कर्व पर असतत लघुगणक समस्या (discrete logarithm problem) की कठिनाई&amp;rsquo; जैसी गणितीय बाधाओं पर निर्भर करके सुरक्षा सुनिश्चित करती हैं। शास्त्रीय कंप्यूटरों (सुपर कंप्यूटर सहित वर्तमान में हम जिन कंप्यूटरों का उपयोग कर रहे हैं) के साथ, यह सिद्ध हो चुका है कि इन गणितीय समस्याओं को हल करने में ब्रह्मांड की आयु से भी अधिक समय लगेगा, और यही उनकी सुरक्षा का आधार रहा है।&lt;/p>
&lt;p>हालाँकि, यह मजबूत आधार &lt;strong>क्वांटम कंप्यूटर&lt;/strong> के सिद्धांत और व्यावसायीकरण की प्रगति से पूरी तरह से पलटने वाला है। 1994 में क्रिप्टोग्राफर पीटर शोर (Peter Shor) द्वारा प्रकाशित &amp;lsquo;&lt;strong>शोर का एल्गोरिदम (Shor's Algorithm)&lt;/strong>&amp;rsquo; सैद्धांतिक रूप से साबित करता है कि यदि इसे पर्याप्त प्रदर्शन वाले फॉल्ट-टॉलरेंट जनरल-परपज क्वांटम कंप्यूटर (CRQC: Cryptographically Relevant Quantum Computer) पर निष्पादित किया जाए, तो अभाज्य गुणनखंड समस्या और असतत लघुगणक समस्या को &amp;lsquo;बहुपद समय (polynomial time)&amp;rsquo; में डिक्रिप्ट किया जा सकता है। इसका मतलब है कि वर्तमान में उपयोग की जाने वाली सभी पब्लिक-की क्रिप्टोग्राफी बेकार हो जाएंगी।&lt;/p>
&lt;div class="mermaid">graph TD
A["बड़े पैमाने का क्वांटम कंप्यूटर (CRQC)"] -->|निष्पादन| B["शोर का एल्गोरिदम (Shor's Algorithm)"]
B -->|बहुपद समय में डिक्रिप्शन| C["अभाज्य गुणनखंड समस्या (RSA)"]
B -->|बहुपद समय में डिक्रिप्शन| D["असतत लघुगणक समस्या (ECC / ECDSA)"]
C --> E["क्रिप्टोग्राफ़िक संचार की छिपकर बातें सुनना, डेटा से छेड़छाड़, स्पूफिंग"]
D --> E
F["Store Now, Decrypt Later (SNDL)"] --> E&lt;/div>
&lt;p>यह सोचना कि &amp;lsquo;कोई समस्या नहीं है क्योंकि पूर्ण विकसित क्वांटम कंप्यूटर के पूरा होने में अभी दशकों बाकी हैं&amp;rsquo; बहुत खतरनाक है। क्योंकि, &lt;strong>Store Now, Decrypt Later (SNDL: अभी स्टोर करें, बाद में डिक्रिप्ट करें)&lt;/strong> नामक हमले का तरीका पहले ही एक वास्तविक खतरा बन चुका है। यह एक ऐसा हमला है जहाँ दुर्भावनापूर्ण राष्ट्र या हैकर संगठन वर्तमान एन्क्रिप्टेड संचार डेटा (जैसे TLS ट्रैफ़िक) को बड़ी मात्रा में स्टोरेज में सहेज कर रखते हैं, और भविष्य में जैसे ही शक्तिशाली क्वांटम कंप्यूटर उपलब्ध होंगे, वे उन सभी को डिक्रिप्ट कर देंगे। राष्ट्रीय रहस्य, बुनियादी ढांचे की जानकारी, और चिकित्सा डेटा जिन्हें लंबे समय तक संरक्षित किया जाना चाहिए, पहले से ही इस खतरे के संपर्क में हैं।&lt;/p>
&lt;p>इसके अलावा, सममित-कुंजी क्रिप्टोग्राफी (Symmetric-key cryptography जैसे AES) और हैश फ़ंक्शंस (जैसे SHA-256) के खिलाफ 1996 में खोजा गया &lt;strong>ग्रोवर का एल्गोरिदम (Grover&amp;rsquo;s Algorithm)&lt;/strong> मौजूद है। यह ब्रूट-फोर्स हमले (brute-force attack) की कम्प्यूटेशनल जटिलता को वर्गमूल (square root) तक कम कर देता है। दूसरे शब्दों में, AES-128 का सुरक्षा स्तर प्रभावी रूप से 2^64 तक आधा हो जाता है, इसलिए क्वांटम युग में AES-256 या SHA-384 जैसी लंबी कुंजियों या हैश लंबाई का उपयोग करने की सिफारिश की जाती है।&lt;/p>
&lt;p>इस अभूतपूर्व क्रिप्टोग्राफ़िक संकट का मुकाबला करने के लिए, &lt;strong>पोस्ट-क्वांटम क्रिप्टोग्राफी (PQC)&lt;/strong> का जन्म हुआ, जो नई गणितीय समस्याओं पर आधारित है जिन्हें क्वांटम कंप्यूटर का उपयोग करके भी हल करना मुश्किल है। इस लेख में, हम यू.एस. नेशनल इंस्टीट्यूट ऑफ स्टैंडर्ड एंड टेक्नोलॉजी (NIST) के नेतृत्व में PQC मानकीकरण प्रक्रिया के परिणामों के आधार पर प्रमुख PQC एल्गोरिदम के गणितीय पृष्ठभूमि, तंत्र और वास्तुकला की तुलना के बारे में विस्तार से बताएंगे।&lt;/p>
&lt;hr>
&lt;h2 id="2-nist-pqc-मनककरण-परयजन-क-पर-अवलकन-और-इतहस">2. NIST PQC मानकीकरण परियोजना का पूरा अवलोकन और इतिहास
&lt;/h2>&lt;p>क्रिप्टोग्राफ़िक तकनीक के संक्रमण में, प्रोटोकॉल के पुन: डिज़ाइन, सिस्टम अपडेट और हार्डवेयर प्रतिस्थापन आदि सहित कई वर्षों से लेकर दशकों तक का समय लगता है। इसलिए, दुनिया भर के क्रिप्टोग्राफ़रों ने बहुत पहले से PQC पर शोध करना शुरू कर दिया था। संयुक्त राज्य अमेरिका का NIST (नेशनल इंस्टीट्यूट ऑफ स्टैंडर्ड एंड टेक्नोलॉजी) इसमें केंद्रीय भूमिका निभा रहा है। NIST ने 2016 में PQC मानकीकरण प्रक्रिया के लिए आवेदन आमंत्रित किए और दुनिया भर के क्रिप्टोग्राफ़िक समुदाय से पूरी तरह से नए क्रिप्टोग्राफ़िक एल्गोरिदम के प्रस्ताव स्वीकार किए।&lt;/p>
&lt;p>मानकीकरण के लक्ष्य निम्नलिखित 2 मुख्य श्रेणियां थीं:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>पब्लिक-की क्रिप्टोग्राफी / की एनकैप्सुलेशन मैकेनिज्म (KEM: Key Encapsulation Mechanism)&lt;/strong>: TLS कनेक्शन आदि में संचार पथ को एन्क्रिप्ट करने के लिए सुरक्षित रूप से एक साझा कुंजी (common key) साझा (वितरित) करने का तंत्र।&lt;/li>
&lt;li>&lt;strong>डिजिटल हस्ताक्षर (Digital Signatures)&lt;/strong>: सॉफ़्टवेयर अपडेट और डिजिटल प्रमाणपत्रों में यह साबित करने का तंत्र कि डेटा के साथ कोई छेड़छाड़ नहीं की गई है और प्रेषक की पहचान सही है (प्रामाणिकता)।&lt;/li>
&lt;/ol>
&lt;p>लगभग 6 वर्षों के गहन मूल्यांकन, विश्लेषण और डिक्रिप्शन प्रतियोगिता (राउंड 1 से राउंड 3) के बाद, कुछ एल्गोरिदम के लिए राउंड 4 का अतिरिक्त मूल्यांकन किया गया। परिणामस्वरूप, 2024 में निम्नलिखित एल्गोरिदम औपचारिक संघीय सूचना प्रसंस्करण मानक (FIPS) के रूप में जारी किए गए और भविष्य के वैश्विक मानकों के रूप में स्थापित किए गए।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>FIPS 203 (ML-KEM)&lt;/strong>: CRYSTALS-Kyber पर आधारित KEM&lt;/li>
&lt;li>&lt;strong>FIPS 204 (ML-DSA)&lt;/strong>: CRYSTALS-Dilithium पर आधारित डिजिटल हस्ताक्षर&lt;/li>
&lt;li>&lt;strong>FIPS 205 (SLH-DSA)&lt;/strong>: SPHINCS+ पर आधारित स्टेटलेस हैश-आधारित हस्ताक्षर&lt;/li>
&lt;li>&lt;strong>(भविष्य की योजना) FN-DSA&lt;/strong>: FALCON पर आधारित डिजिटल हस्ताक्षर&lt;/li>
&lt;/ul>
&lt;p>ये चयनित एल्गोरिदम विभिन्न गणितीय &amp;lsquo;कठिनाई समस्याओं&amp;rsquo; पर निर्भर करते हैं, ताकि यदि भविष्य में किसी एक एल्गोरिदम में कोई गंभीर भेद्यता पाई जाती है, तो संपूर्ण सिस्टम ध्वस्त न हो और विविधता (Crypto Agility) सुनिश्चित की जा सके। मानकीकरण प्रक्रिया में, लैटिस-आधारित क्रिप्टोग्राफी (Lattice-based cryptography) ने मुख्य रूप से प्रदर्शन के मामले में प्रमुख भूमिका निभाई, लेकिन हैश-आधारित क्रिप्टोग्राफी और कोड-आधारित क्रिप्टोग्राफी को शक्तिशाली बैकअप के रूप में अपनाया गया है।&lt;/p>
&lt;hr>
&lt;h2 id="3-pqc-क-परमख-गणतय-दषटकण-क-वरगकरण">3. PQC के प्रमुख गणितीय दृष्टिकोणों का वर्गीकरण
&lt;/h2>&lt;p>PQC एल्गोरिदम को मुख्य रूप से 5 श्रेणियों में विभाजित किया गया है, जो उनकी सुरक्षा के आधार पर गणितीय समस्याओं पर निर्भर करते हैं। इस लेख में, हम विशेष रूप से शीर्ष 3 के बारे में विस्तार से जानेंगे।&lt;/p>
&lt;ol>
&lt;li>&lt;strong>लैटिस-आधारित क्रिप्टोग्राफी (Lattice-based Cryptography)&lt;/strong>:
यह बहुआयामी लैटिस स्पेस में शॉर्टेस्ट वेक्टर प्रॉब्लम (SVP) और क्लोजेस्ट वेक्टर प्रॉब्लम (CVP), और उनसे प्राप्त LWE समस्या पर आधारित है। यह NIST मानकीकरण का केंद्र है, और इसमें Kyber, Dilithium और FALCON शामिल हैं। यह प्रसंस्करण गति, पब्लिक कुंजी आकार और सिफरटेक्स्ट (ciphertext) आकार का सबसे अच्छा संतुलन प्रदान करता है, और सामान्य उद्देश्य के उपयोग के लिए उपयुक्त है।&lt;/li>
&lt;li>&lt;strong>हैश-आधारित क्रिप्टोग्राफी (Hash-based Cryptography)&lt;/strong>:
यह अपनी सुरक्षा को पूरी तरह से क्रिप्टोग्राफ़िक हैश फ़ंक्शंस (जैसे SHA-2 और SHAKE) के &amp;lsquo;कोलिजन रेजिस्टेंस (Collision Resistance)&amp;rsquo; और &amp;lsquo;वन-वेनेस (One-wayness)&amp;rsquo; पर आधारित करता है। यह केवल डिजिटल हस्ताक्षर (जैसे SPHINCS+) पर लागू होता है, लेकिन इसकी सुरक्षा का प्रमाण सबसे मजबूत है और यह अज्ञात गणितीय हमलों के प्रति अत्यधिक प्रतिरोधी है।&lt;/li>
&lt;li>&lt;strong>कोड-आधारित क्रिप्टोग्राफी (Code-based Cryptography)&lt;/strong>:
त्रुटि-सुधार कोड के सिद्धांत पर आधारित, यह सिंड्रोम डिकोडिंग समस्या (Syndrome Decoding Problem) की कठिनाई पर निर्भर करता है। 1970 के दशक में प्रस्तावित Classic McEliece इसका प्रतिनिधि है, जिसका इतिहास बहुत लंबा है और सुरक्षा का ट्रैक रिकॉर्ड सिद्ध है, लेकिन दूसरी ओर, पब्लिक-की का आकार बहुत बड़ा (मेगाबाइट में) होता है।&lt;/li>
&lt;li>&lt;strong>मल्टीवेरिएट पॉलीनोमियल क्रिप्टोग्राफी (Multivariate Polynomial Cryptography)&lt;/strong>:
परिमित क्षेत्र (finite field) पर मल्टीवेरिएट क्वाड्रैटिक समीकरणों की प्रणाली को हल करने की कठिनाई (MQ समस्या) पर आधारित है। इसे मुख्य रूप से डिजिटल हस्ताक्षर (जैसे Rainbow) के रूप में प्रस्तावित किया गया था, लेकिन NIST के अंतिम दौर के दौरान एक शक्तिशाली हमले की विधि खोजी गई जिसने इसे एक साधारण पीसी पर कुछ दिनों में क्रैक कर दिया, जिसके कारण कई एल्गोरिदम मानकीकरण से बाहर हो गए।&lt;/li>
&lt;li>&lt;strong>आइसोजेनी-आधारित क्रिप्टोग्राफी (Isogeny-based Cryptography)&lt;/strong>:
एलिप्टिक कर्व्स के आइसोजेनी ग्राफ पर पथ-खोज समस्या (Path-finding problem) पर आधारित है। कुंजी का आकार बहुत छोटा है, और इसे ECC का सही उत्तराधिकारी माना जा रहा था, लेकिन अंतिम उम्मीदवार &amp;lsquo;SIKE&amp;rsquo; को 2022 में क्लासिकल गणित (Castryck-Decru हमले आदि) का उपयोग करके एक साधारण पीसी पर कुछ ही घंटों में पूरी तरह से डिक्रिप्ट कर दिया गया, जो PQC डिजाइन की कठिनाई और खतरे का प्रतीक एक नाटकीय अंत था।&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="4-लटस-करपटगरफ-क-गहरई-lwe-समसय-और-module-lwe-क-गणतय-नव">4. लैटिस क्रिप्टोग्राफी की गहराई: LWE समस्या और Module-LWE की गणितीय नींव
&lt;/h2>&lt;p>वर्तमान में सबसे आशाजनक माना जाने वाला और मानकीकरण का केंद्र &lt;strong>लैटिस क्रिप्टोग्राफी (Lattice-based cryptography)&lt;/strong> है। इसकी सुरक्षा का आधार &lt;strong>LWE समस्या (Learning with Errors)&lt;/strong> है। इसे 2005 में ओडेड रेगेव (Oded Regev) द्वारा प्रस्तावित किया गया था, और इस ऐतिहासिक उपलब्धि के लिए उन्हें गोडेल पुरस्कार (Gödel Prize) से सम्मानित किया गया। LWE समस्या को समझे बिना आधुनिक PQC के बारे में बात करना असंभव है।&lt;/p>
&lt;h3 id="41-lwe-समसय-learning-with-errors-कय-ह">4.1. LWE समस्या (Learning with Errors) क्या है?
&lt;/h3>&lt;p>सबसे पहले, आइए एक सरल रैखिक समीकरण प्रणाली (linear equation system) पर विचार करें। मान लीजिए कि किसी मॉड्यूलस $q$ (मॉड्यूलो $q$) के तहत एक ज्ञात यादृच्छिक (random) मैट्रिक्स $A$ है, एक अज्ञात गुप्त वेक्टर $\vec{s}$ है, और उनका गुणनफल $\vec{b}$ दिया गया है।&lt;/p>
$$ \vec{b} = A\vec{s} \pmod q $$
&lt;p>इस समय, सार्वजनिक जानकारी $A$ और $\vec{b}$ से अज्ञात $\vec{s}$ को खोजना आसान है। यदि हम &amp;lsquo;गौसियन एलिमिनेशन (Gaussian elimination)&amp;rsquo; जैसे शास्त्रीय एल्गोरिदम का उपयोग करते हैं, तो हम आसानी से बहुपद समय में $\vec{s}$ की गणना कर सकते हैं।&lt;/p>
&lt;p>हालाँकि, यदि हम इस समीकरण में &amp;lsquo;छोटी जानबूझकर की गई त्रुटि (शोर/noise)&amp;rsquo; जोड़ते हैं, तो समस्या की कठिनाई नाटकीय रूप से बढ़ जाती है। यही &lt;strong>LWE समस्या&lt;/strong> है।&lt;/p>
&lt;p>एक अज्ञात गुप्त वेक्टर $\vec{s} \in \mathbb{Z}_q^n$ और एक बेतरतीब ढंग से चुना गया मैट्रिक्स $A \in \mathbb{Z}_q^{m \times n}$ तैयार करें। इसके अलावा, एक त्रुटि वेक्टर $\vec{e} \in \mathbb{Z}_q^m$ तैयार करें जिसे सामान्य वितरण (normal distribution) या द्विपद वितरण (binomial distribution) के अनुसार चुना गया हो और जिसके &amp;lsquo;तत्वों का मान पर्याप्त रूप से छोटा&amp;rsquo; हो, और $\vec{b}$ की गणना निम्नानुसार करें:&lt;/p>
$$ \vec{b} = A\vec{s} + \vec{e} \pmod q $$
&lt;p>&lt;strong>Search LWE समस्या&lt;/strong> वह समस्या है जिसमें &amp;lsquo;सार्वजनिक जानकारी $(A, \vec{b})$ से गुप्त जानकारी $\vec{s}$ को खोजना&amp;rsquo; होता है। इस त्रुटि $\vec{e}$ की उपस्थिति के कारण, यदि हम गौसियन एलिमिनेशन जैसे बीजगणितीय समाधान (algebraic solution) करने का प्रयास करते हैं, तो समीकरणों को जोड़ने और घटाने की प्रक्रिया में त्रुटि $\vec{e}$ बहुत अधिक बढ़ जाती है, और अंततः यह यादृच्छिक मूल्यों से अप्रभेद्य हो जाती है और विफल हो जाती है।&lt;/p>
&lt;p>LWE समस्या की महानता इस तथ्य में निहित है कि एक मजबूत सैद्धांतिक प्रमाण (reduction) मौजूद है कि जब तक कोई ऐसा क्वांटम एल्गोरिदम नहीं है जो लैटिस पर &amp;lsquo;वर्स्ट-केस हार्डनेस (Worst-case hardness)&amp;rsquo; समस्याओं जैसे कि GapSVP (Decision Shortest Vector Problem) या SIVP (Shortest Independent Vector Problem) को हल कर सके, LWE समस्या को भी औसत मामले (Average-case) में हल नहीं किया जा सकता है। दूसरे शब्दों में, भले ही क्रिप्टोग्राफ़िक कुंजी बेतरतीब ढंग से उत्पन्न हो, यह गारंटी दी जाती है कि इसमें सैद्धांतिक ऊपरी सीमा द्वारा समर्थित मजबूत सुरक्षा है।&lt;/p>
&lt;h3 id="42-ring-lwe-और-module-lwe-दवर-नटकय-दकषत-सधर">4.2. Ring-LWE और Module-LWE द्वारा नाटकीय दक्षता सुधार
&lt;/h3>&lt;p>सामान्य LWE समस्या (Standard LWE) में सुरक्षा का बहुत स्पष्ट आधार होता है, लेकिन मैट्रिक्स $A$ का आकार बहुत बड़ा हो जाता है, और कुंजी का आकार मेगाबाइट-श्रेणी का हो जाता है, जो व्यावहारिक नहीं है। इसलिए, पॉलीनोमियल रिंग्स (Polynomial Rings) का उपयोग करके एक बीजगणितीय संरचना बनाने का दृष्टिकोण प्रस्तावित किया गया था।&lt;/p>
&lt;p>&lt;strong>Ring-LWE समस्या&lt;/strong> में, साधारण वैक्टर या मैट्रिक्स के बजाय, हम एक निश्चित बहुपद वलय (polynomial ring) $R_q$ के तत्वों (बहुपद) का उपयोग करते हैं। NIST मानक आमतौर पर निम्नलिखित जैसे साइक्लोटोमिक बहुपद वलय (cyclotomic polynomial ring) का उपयोग करता है:&lt;/p>
$$ R_q = \mathbb{Z}_q[X]/(X^n + 1) $$
&lt;p>यहाँ, $n$ 2 की घात (power of 2) (जैसे: 256) है, और $q$ एक उपयुक्त अभाज्य संख्या (prime number) है। इस रिंग पर, हम $b = a \cdot s + e \pmod q$ की गणना करने के लिए तत्वों $a, s, e \in R_q$ का उपयोग करते हैं। चूंकि एक बहुपद $a$ में $n$ गुणांक (coefficients) होते हैं, डेटा को काफी संपीड़ित (compressed) किया जा सकता है। इसके अलावा, &lt;strong>NTT (Number Theoretic Transform)&lt;/strong> का उपयोग करके, जो कि फास्ट फूरियर ट्रांसफॉर्म (FFT) का एक परिमित क्षेत्र (finite field) संस्करण है, बहुपदों का गुणन $O(n \log n)$ की कम्प्यूटेशनल जटिलता के साथ बहुत तेज गति से संभव हो जाता है।&lt;/p>
&lt;p>हालाँकि, Ring-LWE के साथ यह चिंता थी कि &amp;lsquo;रिंग की विशेष बीजगणितीय संरचना के कारण अज्ञात कमजोरियाँ मौजूद हो सकती हैं&amp;rsquo;। इसके अलावा, जब सुरक्षा स्तर (जैसे AES-128, 192, 256 समतुल्य) बदलते हैं, तो बहुपद की डिग्री $n$ को ही बदलना पड़ता था, और इसके साथ NTT एल्गोरिदम आदि जैसे संपूर्ण कार्यान्वयन को फिर से लिखना पड़ता था, जो एक इंजीनियरिंग चुनौती थी।&lt;/p>
&lt;p>इसलिए, मानकीकृत एल्गोरिदम Kyber और Dilithium ने &lt;strong>Module-LWE (M-LWE) समस्या&lt;/strong> को अपनाया। Module-LWE संरचनाहीन Standard LWE और अत्यधिक संरचित Ring-LWE के बीच एक समझौता है, और बहुपद वलय $R_q$ के तत्वों से बने $k \times k$ मैट्रिक्स (मॉड्यूल) का उपयोग करता है।&lt;/p>
$$ \vec{b} = A\vec{s} + \vec{e} \pmod{R_q} \quad (A \in R_q^{k \times k}, \vec{s}, \vec{e} \in R_q^k) $$
&lt;p>Module-LWE का सबसे बड़ा लाभ यह है कि बहुपद की डिग्री $n$ (NIST मानक में $n=256$) को स्थिर रखते हुए, मैट्रिक्स के आयाम (dimension) $k$ को बदलकर सुरक्षा स्तर को आसानी से बढ़ाया या घटाया जा सकता है।
उदाहरण के लिए, Kyber के मामले में, आयाम $k$ को निम्नानुसार समायोजित किया गया है:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Kyber512 (Level 1)&lt;/strong>: $k = 2$ (AES-128 समतुल्य)&lt;/li>
&lt;li>&lt;strong>Kyber768 (Level 3)&lt;/strong>: $k = 3$ (AES-192 समतुल्य)&lt;/li>
&lt;li>&lt;strong>Kyber1024 (Level 5)&lt;/strong>: $k = 4$ (AES-256 समतुल्य)&lt;/li>
&lt;/ul>
&lt;p>इससे सभी सुरक्षा स्तरों पर बुनियादी NTT कोड और बहुपद गणना हार्डवेयर सर्किट का 100% पुन: उपयोग करना संभव हो गया, जिससे कार्यान्वयन की सुरक्षा और दक्षता में नाटकीय रूप से सुधार हुआ।&lt;/p>
&lt;hr>
&lt;h2 id="5-crystals-kyber-ml-kem-अगल-पढ-क-क-एनकपसलशन-मकनजम-key-encapsulation-mechanism">5. CRYSTALS-Kyber (ML-KEM): अगली पीढ़ी का की एनकैप्सुलेशन मैकेनिज्म (Key Encapsulation Mechanism)
&lt;/h2>&lt;p>&lt;strong>FIPS 203 (ML-KEM)&lt;/strong> के रूप में औपचारिक रूप से मानकीकृत CRYSTALS-Kyber, उपर्युक्त Module-LWE समस्या पर आधारित एक की एनकैप्सुलेशन मैकेनिज्म (KEM) है। यह भविष्य में TLS 1.3 और SSH आदि में सत्र कुंजियों (session keys) को सुरक्षित रूप से साझा करने के लिए वास्तविक वैश्विक मानक बन जाएगा।&lt;/p>
&lt;h3 id="51-kem-key-encapsulation-mechanism-वसतकल-architecture">5.1. KEM (Key Encapsulation Mechanism) वास्तुकला (Architecture)
&lt;/h3>&lt;p>PQC युग में, RSA की तरह &amp;lsquo;क्लाइंट एक साझा कुंजी बनाता है और इसे सर्वर की सार्वजनिक कुंजी के साथ एन्क्रिप्ट करके भेजता है&amp;rsquo; के सीधे दृष्टिकोण के बजाय, KEM का एनकैप्सुलेशन ढांचा मानक होगा।&lt;/p>
&lt;div class="mermaid">sequenceDiagram
participant Client as "क्लाइंट (Alice)"
participant Server as "सर्वर (Bob)"
Note over Client: "ML-KEM KeyGen()"
Client->>Client: "गुप्त कुंजी (sk) और सार्वजनिक कुंजी (pk) उत्पन्न करें"
Client->>Server: "सार्वजनिक कुंजी (pk) भेजें"
Note over Server: "ML-KEM Encaps()"
Server->>Server: "एक यादृच्छिक साझा कुंजी (K) उत्पन्न करें"
Server->>Server: "K को pk के साथ एनकैप्सुलेट करें और सिफरटेक्स्ट (c) बनाएं"
Server->>Client: "सिफरटेक्स्ट (c) भेजें"
Note over Client: "ML-KEM Decaps()"
Client->>Client: "गुप्त कुंजी (sk) का उपयोग करके सिफरटेक्स्ट (c) को डिक्रिप्ट करें"
Client->>Client: "एनकैप्सुलेशन हटाएं और साझा कुंजी (K) निकालें"
Note over Client, Server: "साझा की गई साझा कुंजी (K) का उपयोग करके AES आदि के साथ एन्क्रिप्टेड संचार शुरू करें"&lt;/div>
&lt;h3 id="52-kyber-क-आतरक-एलगरदम-क-ततर-और-फजसक-ओकमट-fujisaki-okamoto-टरसफरम">5.2. Kyber के आंतरिक एल्गोरिदम का तंत्र और फुजिसाकी-ओकामोटो (Fujisaki-Okamoto) ट्रांसफॉर्म
&lt;/h3>&lt;p>Kyber का डिज़ाइन बहुत ही परिष्कृत है। सबसे पहले, यह एक पब्लिक-की क्रिप्टोग्राफी सिस्टम (Kyber.CPAPKE) बनाता है जो केवल CPA (Chosen Plaintext Attack) के खिलाफ सुरक्षित है, और फिर उस पर &lt;strong>फुजिसाकी-ओकामोटो ट्रांसफॉर्म (Fujisaki-Okamoto Transform)&lt;/strong> नामक क्रिप्टोग्राफ़िक रूप से बहुत शक्तिशाली तकनीक को लागू करके, इसे एक पूर्ण KEM में अपग्रेड करने के लिए डिज़ाइन किया गया है जो CCA (Adaptive Chosen Ciphertext Attack) के खिलाफ भी सुरक्षित है।&lt;/p>
&lt;p>CPAPKE के मूल एन्क्रिप्शन और डिक्रिप्शन तंत्र इस प्रकार हैं:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>कुंजी निर्माण (Key Generation)&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>एक यादृच्छिक बीज (random seed) मान से, NTT डोमेन पर मैट्रिक्स $A \in R_q^{k \times k}$ उत्पन्न करें। मॉड्यूलस $q$ का उपयोग $3329$ किया जाता है।&lt;/li>
&lt;li>सेंटर्ड बाइनोमियल डिस्ट्रीब्यूशन (CBD) से, छोटे गुणांक वाले गुप्त वेक्टर $\vec{s}$ और त्रुटि वेक्टर $\vec{e}$ का नमूना लें।&lt;/li>
&lt;li>$\vec{t} = A\vec{s} + \vec{e}$ की गणना करें। सार्वजनिक कुंजी $(A, \vec{t})$ है, गुप्त कुंजी $\vec{s}$ है। (व्यवहार में $A$ को एक बीज मान के रूप में प्रकाशित किया जाता है ताकि बैंडविड्थ बचाई जा सके)।&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>एन्क्रिप्शन (Encryption)&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>32-बाइट संदेश ($m$) (साझा कुंजी की सामग्री) जिसे आप साझा करना चाहते हैं, उसे एक बहुपद में एनकोड करें।&lt;/li>
&lt;li>एक नया यादृच्छिक वेक्टर $\vec{r}$ और छोटी त्रुटियां $\vec{e_1}, e_2$ उत्पन्न करें।&lt;/li>
&lt;li>$\vec{u} = A^T\vec{r} + \vec{e_1}$&lt;/li>
&lt;li>$v = \vec{t}^T\vec{r} + e_2 + \lfloor q/2 \rceil \cdot m$&lt;/li>
&lt;li>सिफरटेक्स्ट $(\vec{u}, v)$ बन जाता है।&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>डिक्रिप्शन (Decryption)&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>प्राप्तकर्ता $v - \vec{s}^T\vec{u}$ की गणना करता है।&lt;/li>
&lt;li>इस समीकरण का विस्तार करने पर यह निम्न प्रकार से बन जाता है:
$v - \vec{s}^T\vec{u} = (\vec{t}^T\vec{r} + e_2 + \lfloor q/2 \rceil \cdot m) - \vec{s}^T(A^T\vec{r} + \vec{e_1})$&lt;/li>
&lt;li>यहाँ $\vec{t} = A\vec{s} + \vec{e}$ को प्रतिस्थापित करने पर, मुख्य पद $\vec{s}^TA^T\vec{r}$ रद्द हो जाता है।&lt;/li>
&lt;li>जो बचता है वह है $\lfloor q/2 \rceil \cdot m + (\vec{e}^T\vec{r} + e_2 - \vec{s}^T\vec{e_1})$।&lt;/li>
&lt;li>चूँकि कोष्ठक में दिए गए पद &amp;lsquo;छोटी त्रुटियों के उत्पाद और योग&amp;rsquo; हैं, इसलिए वे समग्र रूप से पर्याप्त छोटे मान (शोर) तक सीमित रहते हैं। इसलिए, प्रत्येक गुणांक $0$ के करीब है या $q/2$ के करीब है, इसकी थ्रेशोल्ड निर्णय (threshold judgment) करके, मूल संदेश $m$ के बिट्स (0 या 1) को बिना किसी त्रुटि के पूरी तरह से बहाल किया जा सकता है।&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>Kyber की सबसे बड़ी ताकत इसकी असाधारण &lt;strong>प्रसंस्करण गति&lt;/strong> और &lt;strong>मध्यम कुंजी का आकार&lt;/strong> है। Kyber768 के मामले में, सार्वजनिक कुंजी का आकार 1,184 बाइट्स है, और सिफरटेक्स्ट आकार 1,088 बाइट्स है, जो RSA-3072 (लगभग 384 बाइट्स के कुंजी आकार) की तुलना में बड़ा है, लेकिन यह आधुनिक इंटरनेट संचार के MTU (Maximum Transmission Unit) के भीतर पैकेट विखंडन (packet fragmentation) के बिना फिट हो सकता है, और इसका नेटवर्क लेटेंसी पर लगभग कोई प्रतिकूल प्रभाव नहीं पड़ता है।&lt;/p>
&lt;hr>
&lt;h2 id="6-crystals-dilithium-ml-dsa-लटस-आधरत-समनय-उददशय-डजटल-हसतकषर">6. CRYSTALS-Dilithium (ML-DSA): लैटिस-आधारित सामान्य-उद्देश्य डिजिटल हस्ताक्षर
&lt;/h2>&lt;p>डिजिटल हस्ताक्षरों के मानकीकरण में, समान लैटिस क्रिप्टोग्राफी दृष्टिकोण के भीतर भी विभिन्न डिजाइन दर्शन वाले एल्गोरिदम ने प्रतिस्पर्धा की। उनमें से, &lt;strong>CRYSTALS-Dilithium&lt;/strong> को एक सामान्य-उद्देश्य डिजिटल हस्ताक्षर के रूप में &lt;strong>FIPS 204 (ML-DSA)&lt;/strong> के लिए चुना गया था।&lt;/p>
&lt;h3 id="61-fiat-shamir-with-aborts-परडइम">6.1. Fiat-Shamir with Aborts पैराडाइम
&lt;/h3>&lt;p>Kyber की तरह ही, Dilithium भी Module-LWE (और Module-SIS समस्या) पर आधारित एक डिजिटल हस्ताक्षर योजना है। डिज़ाइन का आधार एक अत्यंत महत्वपूर्ण पैराडाइम का उपयोग करता है जिसे &amp;lsquo;&lt;strong>Fiat-Shamir with Aborts (रद्द करने के साथ फिएट-शमीर ट्रांसफॉर्म)&lt;/strong>&amp;rsquo; कहा जाता है।&lt;/p>
&lt;p>फिएट-शमीर ट्रांसफॉर्म अपने आप में एक इंटरेक्टिव ज़ीरो-नॉलेज प्रूफ़ (interactive zero-knowledge proof) प्रोटोकॉल को गैर-इंटरेक्टिव डिजिटल हस्ताक्षर में बदलने की एक मानक विधि है। प्रूवर (हस्ताक्षरकर्ता) एक कमिटमेंट $y$ उत्पन्न करता है, $w = Ay$ की गणना करता है और इसे एक हैश फ़ंक्शन के माध्यम से गुजार कर एक यादृच्छिक चुनौती (random challenge) $c$ प्राप्त करता है, और प्रतिक्रिया $z = y + cs$ की गणना करता है।&lt;/p>
&lt;p>हालाँकि, यदि इसे लैटिस क्रिप्टोग्राफी में सरलता से लागू किया जाता है, तो प्रतिक्रिया $z$ का वितरण गुप्त कुंजी $s$ के मान के आधार पर विकृत हो जाता है, और एक घातक समस्या (साइड-चैनल जैसी गणितीय जानकारी लीक होना) थी कि कई हस्ताक्षरों को देखने वाला हमलावर धीरे-धीरे गुप्त कुंजी $s$ की जानकारी लीक होते हुए प्राप्त कर लेगा।&lt;/p>
&lt;p>Dilithium की डिज़ाइन टीम (Lyubashevsky और अन्य) ने एक तकनीक पेश की जिसे &amp;lsquo;&lt;strong>रिजेक्शन सैंपलिंग (Rejection Sampling)&lt;/strong>&amp;rsquo; कहा जाता है, जिसमें यदि हस्ताक्षर की गणना के परिणाम $z$ के गुणांक पूर्व-निर्धारित सुरक्षित थ्रेशोल्ड सीमा के भीतर नहीं आते हैं, तो संपूर्ण हस्ताक्षर प्रक्रिया को छोड़ दिया जाता है (Abort) और एक नए यादृच्छिक संख्या $y$ का उपयोग करके खरोंच से गणना फिर से की जाती है।&lt;/p>
&lt;p>नतीजतन, अंतिम रूप से आउटपुट होने वाला हस्ताक्षर $z$ गुप्त कुंजी पर बिल्कुल निर्भर नहीं करता है और यह पूरी तरह से एक समान वितरण (uniform distribution) बन जाता है, जो गणितीय रूप से सूचना रिसाव को पूरी तरह से रोकने में सफल रहा।&lt;/p>
&lt;h3 id="62-dilithium-क-लभ-और-करयनवयन-म-आसन">6.2. Dilithium के लाभ और कार्यान्वयन में आसानी
&lt;/h3>&lt;p>Dilithium के डिजाइन का एक बड़ा फायदा यह है कि यह हस्ताक्षर निर्माण प्रक्रिया में जटिल &amp;lsquo;गाऊसी वितरण (Gaussian distribution) से सैंपलिंग&amp;rsquo; या &amp;lsquo;फ्लोटिंग-पॉइंट गणना&amp;rsquo; का &lt;strong>बिल्कुल उपयोग नहीं करता है&lt;/strong>। इसे केवल एक समान वितरण (uniform distribution) से सैंपलिंग, सरल पूर्णांक मॉड्यूलो अंकगणित, NTT और हैश फ़ंक्शंस (SHAKE) के साथ लागू किया जा सकता है, जिससे एम्बेडेड माइक्रोकंट्रोलर्स से लेकर क्लाउड सर्वर तक विभिन्न प्रकार के वातावरण में इसे सुरक्षित रूप से और निरंतर समय (constant-time) में लागू करना आसान हो जाता है। इसके कारण, यह टाइमिंग हमलों (timing attacks) जैसे भौतिक साइड-चैनल हमलों (side-channel attacks) के खिलाफ भी मजबूत प्रतिरोध रखता है।&lt;/p>
&lt;hr>
&lt;h2 id="7-falcon-fn-dsa-अतयधक-कमपकट-लटस-हसतकषर">7. FALCON (FN-DSA): अत्यधिक कॉम्पैक्ट लैटिस हस्ताक्षर
&lt;/h2>&lt;p>NIST ने Dilithium से भिन्न विशेषताओं वाले एक अन्य लैटिस-आधारित हस्ताक्षर के रूप में &lt;strong>FALCON (Fast-Fourier Lattice-based Compact Signatures over NTRU)&lt;/strong> को मानकीकरण उम्मीदवार के रूप में चुना (वर्तमान में FN-DSA के रूप में मसौदा तैयार किया जा रहा है)।&lt;/p>
&lt;h3 id="71-ntru-लटस-और-गऊस-सपलग-gaussian-sampling">7.1. NTRU लैटिस और गाऊसी सैंपलिंग (Gaussian Sampling)
&lt;/h3>&lt;p>FALCON की सबसे बड़ी विशेषता यह है कि यह LWE समस्या के बजाय &lt;strong>NTRU (N-th degree Truncated polynomial Ring Units) लैटिस&lt;/strong> का उपयोग करता है, जिसका इतिहास 1996 से काफी पुराना है। इसके अलावा, यह GPV (Gentry-Peikert-Vaikuntanathan) ढांचे पर आधारित &amp;lsquo;&lt;strong>हैश-एंड-साइन (Hash-and-Sign)&lt;/strong>&amp;rsquo; पैराडाइम को अपनाता है।&lt;/p>
&lt;p>Hash-and-Sign में, संदेश का हैश मान अंतरिक्ष में एक लक्ष्य बिंदु के रूप में सेट किया जाता है, और उस बिंदु के सबसे करीब लैटिस पर बिंदु (क्लोजेस्ट वेक्टर प्रॉब्लम का अनुमानित समाधान) खोजना हस्ताक्षर बन जाता है। इसके लिए, गुप्त कुंजी &amp;lsquo;अच्छी गुणवत्ता के छोटे आधार (good short basis)&amp;rsquo; का उपयोग करके असतत गाऊसी वितरण (discrete Gaussian distribution) के अनुसार बिंदुओं का नमूना लेना आवश्यक है।&lt;/p>
&lt;p>FALCON ने &amp;lsquo;&lt;strong>फास्ट फूरियर ऑर्थोगोनलाइज़ेशन (Fast Fourier Orthogonalization: FFO)&lt;/strong>&amp;rsquo; नामक तकनीक का उपयोग करके इस भारी गणना को नाटकीय रूप से तेज कर दिया।&lt;/p>
&lt;h3 id="72-falcon-क-फयद-और-नकसन">7.2. FALCON के फायदे और नुकसान
&lt;/h3>&lt;p>FALCON का जबरदस्त फायदा यह है कि इसका &lt;strong>हस्ताक्षर आकार और सार्वजनिक कुंजी का आकार बहुत छोटा (कॉम्पैक्ट)&lt;/strong> है। Dilithium3 का हस्ताक्षर आकार लगभग 3,309 बाइट्स है, जबकि FALCON-512 का हस्ताक्षर आकार केवल लगभग 666 बाइट्स है। सार्वजनिक कुंजी भी 897 बाइट्स पर बहुत छोटी है, जो इसे ऐसे वातावरणों में एक तारणहार बनाती है जहाँ संचार बैंडविड्थ बेहद सीमित है, या IoT उपकरणों और विशिष्ट नेटवर्क प्रोटोकॉल के लिए।&lt;/p>
&lt;p>हालाँकि, एक महत्वपूर्ण नुकसान भी है। चूँकि हस्ताक्षर उत्पन्न करते समय जटिल &lt;strong>फ्लोटिंग-पॉइंट गणना (64-बिट IEEE 754)&lt;/strong> के साथ असतत गाऊसी सैंपलिंग आवश्यक है, इसलिए समय रिसाव को रोकने के लिए निरंतर-समय कार्यान्वयन (Constant-time implementation) अत्यंत कठिन है, और कोड भी बड़ा हो जाता है। इस कारण से, FALCON को सामान्य-उद्देश्य के उपयोग (Dilithium) के विपरीत एक विशिष्ट अनुप्रयोग-केंद्रित शक्तिशाली विशेष एल्गोरिदम के रूप में रखा गया है।&lt;/p>
&lt;div class="mermaid">graph LR
A["डिजिटल हस्ताक्षर की आवश्यकताएं"] --> B{"सबसे महत्वपूर्ण बाधा क्या है?"}
B -->|"कार्यान्वयन की सरलता, बहुमुखी प्रतिभा, निरंतर-समय कार्यान्वयन में आसानी"| C["Dilithium (ML-DSA)"]
B -->|"संचार बैंडविड्थ का न्यूनीकरण, डेटा आकार की सघनता"| D["FALCON (FN-DSA)"]
C --> E["सामान्य-उद्देश्य TLS प्रमाणपत्र, सॉफ़्टवेयर इलेक्ट्रॉनिक हस्ताक्षर"]
D --> F["सख्त पैकेट आकार सीमा वाले प्रोटोकॉल, विशेष वातावरण"]&lt;/div>
&lt;hr>
&lt;h2 id="8-sphincs-slh-dsa-सबस-मजबत-सरकष-क-दव-करन-वल-हश-आधरत-हसतकषर">8. SPHINCS+ (SLH-DSA): सबसे मजबूत सुरक्षा का दावा करने वाला हैश-आधारित हस्ताक्षर
&lt;/h2>&lt;p>उस सबसे खराब स्थिति (एक दुर्लभ घटना) की तैयारी में कि भविष्य में एक प्रतिभाशाली गणितज्ञ की सफलता से लैटिस क्रिप्टोग्राफी की सुरक्षा टूट सकती है, NIST ने लैटिस क्रिप्टोग्राफी से बिल्कुल अलग दृष्टिकोण के साथ एक मानक के रूप में &lt;strong>FIPS 205 (SLH-DSA)&lt;/strong>, यानी &lt;strong>SPHINCS+&lt;/strong> तैयार किया।&lt;/p>
&lt;p>SPHINCS+ को &lt;strong>हैश-आधारित हस्ताक्षर&lt;/strong> के रूप में वर्गीकृत किया गया है। इसकी सुरक्षा का आधार केवल एक बात पर निर्भर करता है: &amp;lsquo;उपयोग किए जा रहे क्रिप्टोग्राफिक हैश फ़ंक्शंस (जैसे SHA-2 और SHAKE256) में कोलिजन रेजिस्टेंस (collision resistance) और वन-वेनेस (one-wayness) है&amp;rsquo;। चूँकि यह LWE या अभाज्य गुणनखंड जैसी किसी विशिष्ट बीजगणितीय संरचना वाली गणितीय समस्याओं पर निर्भर नहीं करता है, इसलिए यह अत्यंत मजबूत सुरक्षा (सबसे रूढ़िवादी सुरक्षा) का दावा करता है जिसका भविष्य में कोई भी शक्तिशाली क्वांटम एल्गोरिदम आने पर केवल हैश फ़ंक्शन की आउटपुट लंबाई बढ़ाकर मुकाबला किया जा सकता है।&lt;/p>
&lt;h3 id="81-wots-और-fors-दवर-सटटलस-वसतकल-stateless-architecture">8.1. WOTS+ और FORS द्वारा स्टेटलेस वास्तुकला (Stateless Architecture)
&lt;/h3>&lt;p>हैश-आधारित हस्ताक्षरों का एक लंबा इतिहास है, जो 1970 के दशक में लैम्पोर्ट सिग्नेचर (Lamport signatures) और विंटरनिट्ज़ वन-टाइम सिग्नेचर (WOTS) तक जाता है। ये डिस्पोजेबल कुंजियां (disposable keys) थीं जिन्हें &amp;lsquo;केवल एक बार सुरक्षित रूप से हस्ताक्षर&amp;rsquo; किया जा सकता था। इन्हें कई बार उपयोग करने योग्य बनाने के लिए, XMSS (eXtended Merkle Signature Scheme) और LMS जैसे एल्गोरिदम विकसित किए गए, जो अनगिनत वन-टाइम कुंजियों को एकल रूट हैश के साथ प्रबंधित करने के लिए मर्कल ट्री (Merkle Tree) को मिलाते हैं।&lt;/p>
&lt;p>हालाँकि, XMSS और LMS में एक बड़ी खामी थी कि वे &amp;lsquo;&lt;strong>स्टेटफुल (Stateful)&lt;/strong>&amp;rsquo; थे। हर बार हस्ताक्षर किए जाने पर गैर-वाष्पशील मेमोरी (non-volatile memory) में इंडेक्स स्टेट को कड़ाई से रिकॉर्ड करना आवश्यक था कि &amp;lsquo;कौन सी वन-टाइम कुंजी का उपयोग किया गया था&amp;rsquo;, और यदि वर्चुअल मशीन के स्नैपशॉट को पुनर्स्थापित करने के कारण स्टेट वापस आ जाता है और उसी वन-टाइम कुंजी का दो बार उपयोग किया जाता है, तो गुप्त कुंजी तुरंत लीक हो जाएगी और सिस्टम ढह जाएगा।&lt;/p>
&lt;p>SPHINCS+ एक &amp;lsquo;&lt;strong>स्टेटलेस (Stateless)&lt;/strong>&amp;rsquo; हैश-आधारित हस्ताक्षर है जिसने इस राज्य प्रबंधन (state management) की परेशानी को हल किया।
इसकी मुख्य तकनीक निम्नलिखित का संयोजन है:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>WOTS+ (Winternitz One-Time Signature Plus)&lt;/strong>: एक बुनियादी वन-टाइम हस्ताक्षर।&lt;/li>
&lt;li>&lt;strong>FORS (Forest of Random Subsets)&lt;/strong>: फ्यू-टाइम सिग्नेचर (Few-Time Signature) तकनीक। एक ही कुंजी को कुछ बार पुन: उपयोग करने पर भी सुरक्षा बनाए रखता है।&lt;/li>
&lt;li>&lt;strong>Hyper-Tree (विशाल वृक्ष संरचना)&lt;/strong>: एक विशाल संरचना जिसमें मर्कल ट्री को कई परतों में एक के ऊपर পুনরায় रखा गया है।&lt;/li>
&lt;/ol>
&lt;p>SPHINCS+ में, हस्ताक्षर करते समय स्टेट को प्रबंधित करने के बजाय, यह हाइपर-ट्री (Hyper-Tree) के आधार पर बड़ी संख्या में FORS कुंजियों में से एक को बेतरतीब ढंग से चुनने के लिए छद्म यादृच्छिक संख्याओं (pseudo-random numbers) का उपयोग करके हस्ताक्षर करता है। चूँकि पेड़ के पत्तों की संख्या खगोलीय रूप से बड़ी होती है, इसलिए संयोग से एक ही कुंजी को दो बार चुनने की संभावना (टकराव/collision) नगण्य रूप से छोटी हो जाती है, जिसके परिणामस्वरूप स्टेटलेस प्राप्त होता है।&lt;/p>
&lt;p>SPHINCS+ की एकमात्र और सबसे बड़ी कमजोरी यह है कि इसका &lt;strong>हस्ताक्षर आकार बहुत बड़ा है&lt;/strong>। मापदंडों के आधार पर, हस्ताक्षर का आकार 17 किलोबाइट से 49 किलोबाइट तक पहुँच सकता है, और हस्ताक्षर बनाने की गति लैटिस क्रिप्टोग्राफी की तुलना में बहुत धीमी है। इसलिए, यह रोजमर्रा के वेब ब्राउज़िंग में उपयोग किए जाने के बजाय, सॉफ़्टवेयर अपडेट सिग्नेचर या रूट सर्टिफ़िकेट अथॉरिटी (CA) सर्टिफ़िकेट जैसे अनुप्रयोगों में उपयोग किए जाने की उम्मीद है, जहाँ हस्ताक्षर अक्सर नहीं किए जाते हैं और लंबी अवधि के लिए पूर्ण सुरक्षा की दृढ़ता से आवश्यकता होती है।&lt;/p>
&lt;hr>
&lt;h2 id="9-कड-आधरत-करपटगरफ-classic-mceliece-नमक-एक-परन-अचछ-वशलकय-giant">9. कोड-आधारित क्रिप्टोग्राफी: Classic McEliece नामक एक पुराना अच्छा विशालकाय (Giant)
&lt;/h2>&lt;p>NIST की मानकीकरण प्रक्रिया में, राउंड 4 के अंतिम उम्मीदवार के रूप में अभी भी मूल्यांकन किए जा रहे महत्वपूर्ण दृष्टिकोणों में से एक &lt;strong>कोड-आधारित क्रिप्टोग्राफी&lt;/strong> का &lt;strong>Classic McEliece&lt;/strong> है।&lt;/p>
&lt;p>1978 में रॉबर्ट मैकएलीस (Robert McEliece) द्वारा प्रस्तावित यह एल्गोरिदम पब्लिक-की क्रिप्टोग्राफी के इतिहास में RSA के साथ सबसे पुराने एल्गोरिदम में से एक है। यह &amp;lsquo;गोप्पा कोड (Goppa code)&amp;rsquo; नामक एक बीजगणितीय ज्यामिति कोड (algebraic geometry code) का उपयोग करता है, और संदेश में जानबूझकर त्रुटियों (शोर वेक्टर) को जोड़कर इसे एन्क्रिप्ट करता है। यह &amp;lsquo;&lt;strong>सिंड्रोम डिकोडिंग समस्या (Syndrome Decoding Problem)&lt;/strong>&amp;rsquo; पर आधारित है जहाँ केवल वह व्यक्ति जिसके पास गुप्त कुंजी के रूप में गोप्पा कोड का पैरिटी-चेक मैट्रिक्स (parity-check matrix) है, वह शक्तिशाली त्रुटि-सुधार (error-correction) क्षमता का उपयोग करके त्रुटि को दूर कर सकता है और मूल संदेश को डिक्रिप्ट कर सकता है।&lt;/p>
$$ \vec{c} = \vec{m} G + \vec{e} $$
&lt;p>
(यहाँ $G$ एक स्क्रैम्बल्ड जनरेटर मैट्रिक्स है जो सार्वजनिक कुंजी है, $\vec{e}$ वजन $t$ का त्रुटि वेक्टर है)&lt;/p>
&lt;p>Classic McEliece की आश्चर्यजनक बात इसका प्रभावशाली ट्रैक रिकॉर्ड है: &lt;strong>प्रस्तावित किए जाने के 40 से अधिक वर्षों के बाद, और दुनिया भर के क्रिप्टोग्राफ़रों द्वारा तीव्र डिक्रिप्शन अनुसंधान के अधीन होने के बावजूद, इसकी कोई भी मौलिक भेद्यता कभी नहीं खोजी गई है&lt;/strong>। यह PQC के बीच सबसे अधिक &amp;lsquo;समय-परीक्षणित मजबूत सुरक्षा&amp;rsquo; रखता है।&lt;/p>
&lt;p>इसके अलावा, इसका यह लाभ है कि सिफरटेक्स्ट का आकार बहुत छोटा (केवल 100 से 200 बाइट्स) होता है। हालाँकि, एक घातक खामी है कि &lt;strong>सार्वजनिक कुंजी का आकार मेगाबाइट (MB) में होता है&lt;/strong>। सबसे निचले सुरक्षा स्तर (AES-128 समतुल्य) पर भी, सार्वजनिक कुंजी लगभग 250KB है, और उच्च स्तरों पर यह 1MB से अधिक हो जाती है।&lt;/p>
&lt;p>इस कारण से, यह उन अनुप्रयोगों के लिए बिल्कुल लागू नहीं है जो TLS हैंडशेक की तरह संचार के हर बार नेटवर्क पर सार्वजनिक कुंजी भेजते हैं। हालाँकि, विशेष उपयोग के मामलों में जहाँ सार्वजनिक कुंजी को पहले से सिस्टम में रखा जा सकता है, जैसे कि VPN प्री-शेयर्ड कुंजियों का आदान-प्रदान, फ़र्मवेयर में सार्वजनिक कुंजियों को हार्डकोडिंग करना, या उपग्रह संचार, इसकी मजबूत सुरक्षा के कारण इसे एक अत्यंत आशाजनक विकल्प के रूप में माना जाना जारी है।&lt;/p>
&lt;hr>
&lt;h2 id="10-परतयक-pqc-एलगरदम-क-परदरशन-क-तलन-और-टरड-ऑफ-trade-offs">10. प्रत्येक PQC एल्गोरिदम के प्रदर्शन की तुलना और ट्रेड-ऑफ़ (Trade-offs)
&lt;/h2>&lt;p>अब तक बताए गए प्रमुख एल्गोरिदम के संबंध में, सामान्य सुरक्षा स्तरों (NIST Level 2 से 3 समतुल्य, AES-128 से 192 स्तर) पर प्रदर्शन विशेषताओं को निम्न तालिका में संक्षेपित किया गया है।&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">एल्गोरिदम (मानक नाम)&lt;/th>
&lt;th style="text-align:left">श्रेणी&lt;/th>
&lt;th style="text-align:left">गणितीय आधार&lt;/th>
&lt;th style="text-align:left">सार्वजनिक कुंजी का आकार&lt;/th>
&lt;th style="text-align:left">गुप्त कुंजी का आकार&lt;/th>
&lt;th style="text-align:left">सिफरटेक्स्ट/हस्ताक्षर का आकार&lt;/th>
&lt;th style="text-align:left">प्रसंस्करण गति की प्रवृत्ति&lt;/th>
&lt;th style="text-align:left">मुख्य विशेषताएं और अनुप्रयोग&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Kyber768&lt;/strong>&lt;br>(ML-KEM)&lt;/td>
&lt;td style="text-align:left">KEM&lt;/td>
&lt;td style="text-align:left">Module-LWE&lt;/td>
&lt;td style="text-align:left">1,184 Bytes&lt;/td>
&lt;td style="text-align:left">2,400 Bytes&lt;/td>
&lt;td style="text-align:left">1,088 Bytes&lt;/td>
&lt;td style="text-align:left">बहुत तेज़&lt;/td>
&lt;td style="text-align:left">कुंजी के आकार और गति का सबसे अच्छा संतुलन। TLS 1.3 आदि के लिए सामान्य KEM मानक।&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Dilithium3&lt;/strong>&lt;br>(ML-DSA)&lt;/td>
&lt;td style="text-align:left">हस्ताक्षर&lt;/td>
&lt;td style="text-align:left">Module-LWE&lt;/td>
&lt;td style="text-align:left">1,952 Bytes&lt;/td>
&lt;td style="text-align:left">4,032 Bytes&lt;/td>
&lt;td style="text-align:left">3,309 Bytes&lt;/td>
&lt;td style="text-align:left">निर्माण और सत्यापन दोनों में तेज़&lt;/td>
&lt;td style="text-align:left">सरल कार्यान्वयन। सामान्य-उद्देश्य डिजिटल हस्ताक्षर मानक।&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>FALCON-512&lt;/strong>&lt;br>(FN-DSA)&lt;/td>
&lt;td style="text-align:left">हस्ताक्षर&lt;/td>
&lt;td style="text-align:left">NTRU लैटिस&lt;/td>
&lt;td style="text-align:left">897 Bytes&lt;/td>
&lt;td style="text-align:left">1,281 Bytes&lt;/td>
&lt;td style="text-align:left">666 Bytes&lt;/td>
&lt;td style="text-align:left">हस्ताक्षर निर्माण धीमा है, सत्यापन बहुत तेज़&lt;/td>
&lt;td style="text-align:left">अत्यंत छोटा हस्ताक्षर आकार। हालाँकि फ्लोटिंग-पॉइंट गणना आवश्यक है। एम्बेडेड/IoT के लिए।&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>SPHINCS+&lt;/strong>&lt;br>(SLH-DSA)&lt;/td>
&lt;td style="text-align:left">हस्ताक्षर&lt;/td>
&lt;td style="text-align:left">हैश फ़ंक्शन&lt;/td>
&lt;td style="text-align:left">32 Bytes&lt;/td>
&lt;td style="text-align:left">64 Bytes&lt;/td>
&lt;td style="text-align:left">लगभग 17,000 Bytes&lt;/td>
&lt;td style="text-align:left">निर्माण बहुत धीमा है&lt;/td>
&lt;td style="text-align:left">गणितीय विफलता का जोखिम लगभग शून्य है। रूट प्रमाणपत्र आदि जैसे उच्च-सुरक्षा अनुप्रयोग।&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Classic McEliece&lt;/strong>&lt;/td>
&lt;td style="text-align:left">KEM&lt;/td>
&lt;td style="text-align:left">Goppa कोड&lt;/td>
&lt;td style="text-align:left">&lt;strong>लगभग 1.04 MB&lt;/strong>&lt;/td>
&lt;td style="text-align:left">13,568 Bytes&lt;/td>
&lt;td style="text-align:left">&lt;strong>188 Bytes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">एनकैप्सुलेशन तेज़ है&lt;/td>
&lt;td style="text-align:left">40 वर्षों का सुरक्षा ट्रैक रिकॉर्ड। सार्वजनिक कुंजी विशाल है। उन वातावरणों के लिए जहाँ हार्डकोडिंग संभव है।&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="टरड-ऑफ-trade-offs-क-समझन">ट्रेड-ऑफ़ (Trade-offs) को समझना
&lt;/h3>&lt;p>PQC की दुनिया में, कोई एकल जादुई एल्गोरिदम नहीं है जो &amp;lsquo;आकार में छोटा, गति में तेज़, और गणितीय गारंटी में परिपूर्ण&amp;rsquo; हो।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>इंटरनेट मानक (Kyber / Dilithium)&lt;/strong>: इनके प्रदर्शन का संतुलन सबसे अच्छा है और ये वर्तमान RSA/ECC से ड्रॉप-इन रिप्लेसमेंट (सीधे प्रतिस्थापित करने) के लिए सबसे उपयुक्त हैं।&lt;/li>
&lt;li>&lt;strong>अत्यधिक रूढ़िवादिता (SPHINCS+)&lt;/strong>: यदि आप भविष्य की गणितीय सफलताओं के खिलाफ पूर्ण बीमा चाहते हैं, भले ही इसके लिए डेटा आकार और प्रसंस्करण गति का बलिदान देना पड़े, तो इसे चुना जाता है।&lt;/li>
&lt;li>&lt;strong>विशेष वातावरण के लिए (FALCON / Classic McEliece)&lt;/strong>: ये विशेष हथियार हैं जिन्हें पर्यावरणीय बाधाओं के अनुसार चुना जाता है, जैसे कि जब संचार बैंडविड्थ बेहद संकीर्ण होती है, या पूर्व-वितरण संभव होता है।&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="11-वयवसयकरण-क-चनतय-और-हइबरड-करपटगरफ-hybrid-cryptography-क-वयवहरक-समधन">11. व्यावसायीकरण की चुनौतियाँ और &amp;lsquo;हाइब्रिड क्रिप्टोग्राफी (Hybrid Cryptography)&amp;rsquo; का व्यावहारिक समाधान
&lt;/h2>&lt;p>NIST के मानकीकरण के पूरा होने और FIPS मानकों के आधिकारिक तौर पर जारी होने के साथ, दुनिया भर में IT बुनियादी ढांचे का PQC संक्रमण (&lt;strong>PQC माइग्रेशन&lt;/strong>) पूरी लगन से शुरू हो गया है। Google का क्रोम ब्राउज़र, Apple का iMessage (PQ3 प्रोटोकॉल), और Cloudflare जैसे नेटवर्क प्रदाताओं ने पहले ही अपने प्रोटोकॉल में PQC समर्थन लागू कर दिया है और वास्तविक संचालन शुरू कर दिया है।&lt;/p>
&lt;p>हालाँकि, अचानक पूरी तरह से नए क्रिप्टोग्राफ़िक एल्गोरिदम में स्विच करने में बहुत अधिक जोखिम शामिल है। यदि कुछ वर्षों में कोई प्रतिभाशाली गणितज्ञ Kyber जैसे लैटिस क्रिप्टोग्राफी के खिलाफ एक घातक हमले का तरीका (एक गणितीय दोष जिसे शास्त्रीय कंप्यूटर से भी हल किया जा सकता है) खोज लेता है, तो उस पर निर्भर संपूर्ण सिस्टम एक पल में पूरी तरह से कमजोर हो जाएगा।&lt;/p>
&lt;p>इस अनिश्चितता के जोखिम को कम करने के लिए एक व्यावहारिक और अनुशंसित दृष्टिकोण &amp;lsquo;&lt;strong>हाइब्रिड क्रिप्टोग्राफी (Hybrid Cryptography)&lt;/strong>&amp;rsquo; है।&lt;/p>
&lt;p>हाइब्रिड क्रिप्टोग्राफी में, कुंजियों का आदान-प्रदान वर्तमान क्लासिकल क्रिप्टोग्राफी के लंबे ट्रैक रिकॉर्ड (उदा: X25519 जैसी एलिप्टिक कर्व क्रिप्टोग्राफी) और नए PQC (उदा: Kyber768) दोनों का एक साथ उपयोग करके किया जाता है। प्रत्येक एल्गोरिदम अलग-अलग साझा कुंजी घटकों को उत्पन्न करता है, और अंततः दोनों घटकों को मिश्रित करने और अंतिम मास्टर सीक्रेट उत्पन्न करने के लिए एक सुरक्षित की डेरिवेशन फ़ंक्शन (Key Derivation Function: KDF) का उपयोग किया जाता है।&lt;/p>
&lt;div class="mermaid">graph TD
A["क्लाइंट"] -->|① X25519 सार्वजनिक कुंजी + Kyber सार्वजनिक कुंजी भेजें| B["सर्वर"]
B -->|② X25519 साझा कुंजी + Kyber एनकैप्सुलेटेड सिफरटेक्स्ट वापस भेजें| A
A --> C{"मास्टर सीक्रेट व्युत्पत्ति (KDF)"}
B --> C
C -->|इनपुट: (X25519 साझा कुंजी) || (Kyber साझा कुंजी)| D["सुरक्षित संचार कुंजी (AES-256 / ChaCha20)"]
D -->|"क्वांटम खतरों और क्लासिकल कमजोरियों दोनों के प्रति प्रतिरोधी"| E["सुरक्षित हाइब्रिड क्रिप्टोग्राफ़िक संचार (TLS 1.3)"]&lt;/div>
&lt;p>यह एक मजबूत टू-टियर सुरक्षा सुनिश्चित करता है, जहाँ &amp;lsquo;यदि क्वांटम कंप्यूटर एक वास्तविकता बन जाते हैं और ECC टूट जाता है, तो Kyber संचार की रक्षा करेगा&amp;rsquo;, और इसके विपरीत, &amp;lsquo;यदि Kyber में कोई अज्ञात गणितीय दोष पाया जाता है, तो ECC संचार की रक्षा करेगा&amp;rsquo;। एक विशिष्ट उदाहरण के रूप में, IETF द्वारा मानकीकृत किया जा रहा &lt;strong>X25519MLKEM768 (पूर्व में X25519Kyber768)&lt;/strong> मसौदा है, और वर्तमान में वेब ब्राउज़र और अत्याधुनिक सर्वरों के बीच संचार इस हाइब्रिड पद्धति का उपयोग करके किया जाता है।&lt;/p>
&lt;p>इसके अलावा, सिस्टम डिज़ाइन में, &lt;strong>क्रिप्टो एजिलिटी (Crypto Agility)&lt;/strong> की अवधारणा, जिसका अर्थ है &amp;lsquo;विशिष्ट क्रिप्टोग्राफ़िक एल्गोरिदम पर अत्यधिक निर्भर न होना, और यदि कोई एल्गोरिदम विफल हो जाता है तो जल्दी से किसी अन्य एल्गोरिदम (उदा: Kyber से McEliece, Dilithium से SPHINCS+) में स्विच करने में सक्षम वास्तुकला बनाना&amp;rsquo;, भविष्य के सिस्टम विकास के लिए एक आवश्यक आवश्यकता बन जाएगी।&lt;/p>
&lt;hr>
&lt;h2 id="12-नषकरष-करपटगरफक-तकनक-क-एक-नय-कषतज">12. निष्कर्ष: क्रिप्टोग्राफ़िक तकनीक का एक नया क्षितिज
&lt;/h2>&lt;p>क्वांटम कंप्यूटर, मानवता की स्वप्निल तकनीक, विडंबना यह है कि उन &amp;lsquo;अभाज्य गुणनखंड&amp;rsquo; और &amp;lsquo;असतत लघुगणक समस्या&amp;rsquo; की गणितीय बाधाओं को तोड़ने का सबसे बड़ा खतरा बन गई है जिन पर हमने कई वर्षों से भरोसा किया था। हालाँकि, इसके आगे झुकने के बजाय, दुनिया भर के क्रिप्टोग्राफ़रों ने लैटिस थ्योरी (lattice theory), हैश फ़ंक्शन ट्री और एरर-करेक्शन कोड जैसे अधिक जटिल और गहन बहुआयामी गणितीय क्षेत्रों का बीड़ा उठाया है, और पोस्ट-क्वांटम क्रिप्टोग्राफी (PQC) नामक एक नई बाधा बनाई है।&lt;/p>
&lt;p>NIST द्वारा FIPS 203 (ML-KEM), FIPS 204 (ML-DSA), और FIPS 205 (SLH-DSA) का मानकीकरण पूरा होना कोई लक्ष्य नहीं है। यह PQC माइग्रेशन नामक महाकाव्य यात्रा का पहला कदम है जो आने वाले दशकों तक जारी रहेगा। सॉफ्टवेयर इंजीनियरों और सिस्टम आर्किटेक्ट्स के लिए, नेटवर्क प्रोटोकॉल और सिस्टम के लिए इन नए एल्गोरिदम द्वारा लाए गए &amp;lsquo;कुंजी के आकार में वृद्धि&amp;rsquo; और &amp;lsquo;कम्प्यूटेशनल लागत में परिवर्तन&amp;rsquo; को कैसे अनुकूल रूप से ढालना है, यह आगे चलकर एक बड़ी तकनीकी चुनौती होगी।&lt;/p>
&lt;p>क्वांटम कंप्यूटर और क्रिप्टोग्राफी के बीच की लड़ाई एक रोमांचक क्षेत्र है जहाँ मानव का गणितीय अन्वेषण और तकनीकी विकास सबसे अधिक तीव्रता से मिलते हैं। मुझे उम्मीद है कि इस लेख के माध्यम से, आपको PQC के पीछे के सुंदर गणितीय सिद्धांत और साइबर सुरक्षा के भविष्य को आकार देने वाले प्रत्येक एल्गोरिदम के अद्भुत तंत्र की गहरी समझ प्राप्त हुई है।&lt;/p>
&lt;hr>
&lt;p>&lt;em>References:&lt;/em>&lt;/p>
&lt;ul>
&lt;li>&lt;em>NIST Post-Quantum Cryptography Standardization Program&lt;/em>&lt;/li>
&lt;li>&lt;em>FIPS 203: Module-Lattice-Based Key-Encapsulation Mechanism Standard&lt;/em>&lt;/li>
&lt;li>&lt;em>FIPS 204: Module-Lattice-Based Digital Signature Standard&lt;/em>&lt;/li>
&lt;li>&lt;em>FIPS 205: Stateless Hash-Based Digital Signature Standard&lt;/em>&lt;/li>
&lt;/ul></description></item><item><title>क्वांटम कंप्यूटर के व्यावहारिक उपयोग का दिन: 2026 में वर्तमान स्थिति</title><link>http://kenji.blog/hi/p/quantum-computing-2026-current-status/</link><pubDate>Fri, 11 Sep 2026 06:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/quantum-computing-2026-current-status/</guid><description>&lt;img src="http://kenji.blog/p/quantum-computing-2026-current-status/img/eyecatch.jpg" alt="Featured image of post क्वांटम कंप्यूटर के व्यावहारिक उपयोग का दिन: 2026 में वर्तमान स्थिति" />&lt;h2 id="1-परसतवन-2026-म-कवटम-कपयटर-कह-तक-पहच-चक-ह">1. प्रस्तावना: 2026 में, क्वांटम कंप्यूटर कहाँ तक पहुँच चुका है?
&lt;/h2>&lt;p>वर्तमान 2026 में, क्वांटम कंप्यूटिंग ने अतीत के &amp;ldquo;सैद्धांतिक सपने&amp;rdquo; से &amp;ldquo;इंजीनियरिंग वास्तविकता&amp;rdquo; की ओर एक निर्णायक छलांग लगाई है। कुछ वर्षों पहले तक मुख्यधारा रहे &lt;strong>NISQ (Noisy Intermediate-Scale Quantum)&lt;/strong> उपकरणों की सीमाएँ स्पष्ट होने के साथ, दुनिया भर के अनुसंधान संस्थानों और टेक दिग्गजों ने &amp;ldquo;फॉल्ट-टॉलरेंट क्वांटम कंप्यूटिंग (FTQC: Fault-Tolerant Quantum Computing)&amp;rdquo; को साकार करने की दिशा में कदम बढ़ाया है।&lt;/p>
&lt;p>इस लेख में, 2026 की नवीनतम सफलताओं के साथ-साथ क्वांटम कंप्यूटर की वर्तमान स्थिति पर गहराई से चर्चा की जाएगी। विशेष रूप से, क्वांटम त्रुटि सुधार (सरफेस कोड), भौतिक क्वांटम बिट (क्यूबिट) और तार्किक क्वांटम बिट के बीच का अंतर, टोपोलॉजिकल क्वांटम गणना में प्रगति, और सुपरकंडक्टिंग व आयन ट्रैप पद्धतियों के सबसे उन्नत मोर्चों को विस्तार से समझाया जाएगा।&lt;/p>
&lt;hr>
&lt;h2 id="2-कवटम-अवसथ-क-मल-बत-और-फडलट-वशवसनयत">2. क्वांटम अवस्था की मूल बातें और फिडेलिटी (विश्वसनीयता)
&lt;/h2>&lt;p>क्वांटम कंप्यूटर की मूल इकाई क्वांटम बिट (Qubit), शास्त्रीय बिट (0 या 1) के विपरीत, 0 और 1 की सुपरपोजिशन (Superposition) अवस्था ले सकती है। एकल क्वांटम बिट की अवस्था को हिल्बर्ट स्पेस (Hilbert space) पर एक वेक्टर के रूप में इस प्रकार दर्शाया जाता है:&lt;/p>
$$
|\psi\rangle = \alpha|0\rangle + \beta|1\rangle
$$
&lt;p>यहाँ, $\alpha$ और $\beta$ सम्मिश्र संभाव्यता आयाम (probability amplitudes) हैं, जो निम्नलिखित सामान्यीकरण शर्त को पूरा करते हैं:&lt;/p>
$$
|\alpha|^2 + |\beta|^2 = 1
$$
&lt;p>क्वांटम गणना के प्रदर्शन को मापने के लिए सबसे महत्वपूर्ण मीट्रिक &lt;strong>फिडेलिटी (Fidelity)&lt;/strong> है। आदर्श क्वांटम अवस्था $|\psi\rangle$ और शोर (noise) के कारण विकृत होकर मिश्रित अवस्था में बदल चुके वास्तविक घनत्व मैट्रिक्स (density matrix) $\rho$ के बीच फिडेलिटी $F$ को इस प्रकार परिभाषित किया जाता है:&lt;/p>
$$
F(\rho, |\psi\rangle) = \langle \psi | \rho | \psi \rangle
$$
&lt;p>वर्तमान 2026 में, 2-क्यूबिट गेट (जैसे: CNOT गेट या CZ गेट) की फिडेलिटी सुपरकंडक्टिंग पद्धति में &lt;strong>99.99%&lt;/strong> की बाधा (तथाकथित &amp;ldquo;4 नाइन&amp;rdquo;) को लगातार पार करने लगी है। यह सरफेस कोड द्वारा त्रुटि सुधार की सीमा (लगभग 99%) से काफी अधिक है, और यह व्यावहारिक उपयोग की दिशा में सबसे बड़ी सफलताओं में से एक है।&lt;/p>
&lt;hr>
&lt;h2 id="3-nisq-यग-क-समए-और-ftqc-क-ओर-परतमन-बदलव-paradigm-shift">3. NISQ युग की सीमाएँ और FTQC की ओर प्रतिमान बदलाव (Paradigm Shift)
&lt;/h2>&lt;p>2010 के दशक के उत्तरार्ध से 2020 के दशक के पूर्वार्ध तक का समय बिना त्रुटि सुधार वाले दसियों से लेकर सैकड़ों क्वांटम बिट वाले उपकरणों, अर्थात NISQ (Noisy Intermediate-Scale Quantum) का युग था। हालाँकि, NISQ की स्पष्ट सीमाएँ थीं।&lt;/p>
&lt;p>जैसे-जैसे सर्किट की गहराई (Depth) बढ़ती है, त्रुटियाँ घातांकीय रूप से (exponentially) जमा होती जाती हैं, जिससे सार्थक गणना परिणाम प्राप्त करना असंभव हो जाता है। सर्किट की गहराई $D$ पर समग्र सफलता की संभावना $P_{success}$, एकल गेट की फिडेलिटी $f$ और गेट्स की संख्या $N$ के सापेक्ष इस प्रकार घटती है:&lt;/p>
$$
P_{success} \approx f^N
$$
&lt;p>यदि $f = 0.99$ के साथ 1000 गेट्स लागू किए जाएं, तो परिणाम $0.99^{1000} \approx 4.3 \times 10^{-5}$ होगा, जो लगभग यादृच्छिक शोर (random noise) में दब जाता है। इस कारण से, 2026 में, NISQ एल्गोरिदम (जैसे VQE या QAOA) को सीधे स्केल अप करने के बजाय, &lt;strong>तार्किक क्वांटम बिट (Logical Qubit)&lt;/strong> उत्पन्न करने पर संसाधनों को केंद्रित किया जा रहा है।&lt;/p>
&lt;hr>
&lt;h2 id="4-कवटम-तरट-सधर-और-तरकक-कवटम-बट-सरफस-कड-क-उननत-मरच">4. क्वांटम त्रुटि सुधार और तार्किक क्वांटम बिट: सरफेस कोड का उन्नत मोर्चा
&lt;/h2>&lt;p>क्वांटम त्रुटि सुधार (QEC: Quantum Error Correction) एक ऐसी तकनीक है जो कई &amp;ldquo;भौतिक क्वांटम बिट्स&amp;rdquo; को एन्कोड करके एक &amp;ldquo;तार्किक क्वांटम बिट&amp;rdquo; बनाती है और त्रुटियों का पता लगाकर उन्हें सुधारती है। वर्तमान में सबसे आशाजनक तरीका &lt;strong>सरफेस कोड (Surface Code)&lt;/strong> माना जा रहा है।&lt;/p>
&lt;h3 id="41-सरफस-कड-surface-code-क-सरचन">4.1 सरफेस कोड (Surface Code) की संरचना
&lt;/h3>&lt;p>सरफेस कोड में, क्वांटम बिट्स को द्वि-आयामी (2D) ग्रिड में व्यवस्थित किया जाता है। डेटा क्वांटम बिट (जो वास्तविक जानकारी रखते हैं) और मापन क्वांटम बिट (सिंड्रोम मापन के लिए) चेकरबोर्ड पैटर्न (checkerboard pattern) में व्यवस्थित होते हैं।&lt;/p>
&lt;div class="mermaid">graph TD
A["डेटा क्यूबिट (D1)"] --- B["मापन क्यूबिट (M1)"]
B --- C["डेटा क्यूबिट (D2)"]
C --- D["मापन क्यूबिट (M2)"]
D --- E["डेटा क्यूबिट (D3)"]
B --- F["डेटा क्यूबिट (D4)"]
D --- G["डेटा क्यूबिट (D5)"]
style A fill:#e1f5fe,stroke:#039be5
style C fill:#e1f5fe,stroke:#039be5
style E fill:#e1f5fe,stroke:#039be5
style F fill:#e1f5fe,stroke:#039be5
style G fill:#e1f5fe,stroke:#039be5
style B fill:#fff3e0,stroke:#fb8c00
style D fill:#fff3e0,stroke:#fb8c00&lt;/div>
&lt;p>स्टेबलाइजर ऑपरेटर $S_x$ और $S_z$ का उपयोग करके, बिट फ्लिप (X त्रुटि) और फेज फ्लिप (Z त्रुटि) की लगातार निगरानी की जाती है।&lt;/p>
$$
S_x = \prod_{i \in \text{star}} X_i, \quad S_z = \prod_{j \in \text{plaquette}} Z_j
$$
&lt;p>2026 की महत्वपूर्ण प्रगति यह है कि &amp;ldquo;ब्रेक-ईवन पॉइंट (Break-even point)&amp;rdquo; को पूरी तरह से पार कर लिया गया है। इसका मतलब है कि त्रुटि सुधार के लिए आवश्यक अतिरिक्त सर्किट द्वारा उत्पन्न शोर की तुलना में, त्रुटि सुधार द्वारा हटाए गए शोर की मात्रा अधिक हो गई है, और तार्किक क्वांटम बिट का जीवनकाल भौतिक क्वांटम बिट के जीवनकाल से कई गुना अधिक हो गया है।&lt;/p>
&lt;h3 id="42-कवटम-तरट-सधर-चकर">4.2 क्वांटम त्रुटि सुधार चक्र
&lt;/h3>&lt;p>त्रुटि सुधार एक निरंतर फीडबैक लूप के रूप में कार्य करता है।&lt;/p>
&lt;div class="mermaid">sequenceDiagram
participant D as "डेटा क्यूबिट्स"
participant M as "एंसिला/मापन क्यूबिट्स"
participant C as "शास्त्रीय नियंत्रक"
loop "सिंड्रोम निष्कर्षण चक्र (लगभग 1 माइक्रोसेकंड)"
D->>M: "एंटैंगल (CNOT/CZ)"
M->>C: "स्थिति मापन (सिंड्रोम)"
C->>C: "सिंड्रोम डिकोड करें (जैसे: मिनिमम वेट परफेक्ट मैचिंग)"
C-->>D: "पाउली सुधार लागू करें (यदि आवश्यक हो)"
end&lt;/div>
&lt;p>वर्तमान में, इस शास्त्रीय डिकोडिंग प्रक्रिया (सिंड्रोम विश्लेषण) को नैनोसेकंड स्केल पर निष्पादित करने के लिए FPGA और समर्पित ASIC तकनीकें स्थापित हो चुकी हैं, और वास्तविक समय (real-time) में त्रुटि सुधार व्यावहारिक चरण में प्रवेश कर चुका है।&lt;/p>
&lt;hr>
&lt;h2 id="5-हरडवयर-आरकटकचर-क-वकस-2026-ससकरण">5. हार्डवेयर आर्किटेक्चर का विकास (2026 संस्करण)
&lt;/h2>&lt;p>2026 में क्वांटम हार्डवेयर मुख्य रूप से तीन दिशाओं में विकसित हो रहा है: &amp;ldquo;सुपरकंडक्टिंग विधि,&amp;rdquo; &amp;ldquo;आयन ट्रैप विधि,&amp;rdquo; और &amp;ldquo;टोपोलॉजिकल विधि।&amp;rdquo;&lt;/p>
&lt;h3 id="51-सपरकडकटग-कवटम-बट-क-एककरण-integration">5.1 सुपरकंडक्टिंग क्वांटम बिट का एकीकरण (Integration)
&lt;/h3>&lt;p>सुपरकंडक्टिंग विधि एक ऐसा क्षेत्र है जिसका नेतृत्व IBM और Google कर रहे हैं, और जोसेफसन जंक्शन (Josephson junction) का उपयोग करने वाले ट्रांसमोन (Transmon) क्वांटम बिट मुख्यधारा में हैं। 2026 में, एक ही चिप पर हजारों से लेकर दस हजार भौतिक क्वांटम बिट्स को एकीकृत करने वाले मेगाचिप साकार हो चुके हैं।&lt;/p>
&lt;p>विशेष रूप से उल्लेखनीय &lt;strong>मॉड्यूल के बीच क्वांटम संचार (Quantum Interconnects)&lt;/strong> की स्थापना है। माइक्रोवेव फोटॉन का उपयोग करते हुए चिप्स के बीच क्वांटम टेलीपोर्टेशन को व्यावसायिक स्तर पर लागू किया गया জ্ঞिा गया है, जिससे एकल डाइल्यूशन रेफ्रिजरेटर (dilution refrigerator) के आकार की सीमा से बचना संभव हो गया है।&lt;/p>
&lt;h3 id="52-आयन-टरप-क-2d-सकलग-और-ऑपटकल-इटरकनकट">5.2 आयन ट्रैप की 2D स्केलिंग और ऑप्टिकल इंटरकनेक्ट
&lt;/h3>&lt;p>आयन ट्रैप विधि (जिसका नेतृत्व Quantinuum और IonQ कर रहे हैं) में वैक्यूम में तैरते आयनों की आंतरिक ऊर्जा अवस्थाओं को क्वांटम बिट के रूप में उपयोग किया जाता है। सुपरकंडक्टिंग विधि की तुलना में, इसका T1/T2 कोहेरेंस (coherence) समय अत्यधिक लंबा होता है, और ऑल-टू-ऑल कनेक्टिविटी (All-to-All Connectivity) संभव है।&lt;/p>
&lt;p>2026 की सफलता QCCD (क्वांटम चार्ज कपल्ड डिवाइस) आर्किटेक्चर का द्वि-आयामी (2D) निर्माण और फोटोनिक इंटरकनेक्ट का उपयोग करके मल्टी-ट्रैप्स के बीच उच्च गति वाले एंटैंगलमेंट का निर्माण है। इससे आयन ट्रैप की कमजोरियां &amp;ldquo;धीमी गेट गति&amp;rdquo; और &amp;ldquo;स्केलेबिलिटी (scalability)&amp;rdquo; में नाटकीय रूप से सुधार हुआ है।&lt;/p>
&lt;h3 id="53-टपलजकल-कवटम-गणन-एनऑन-क-नयतरण">5.3 टोपोलॉजिकल क्वांटम गणना: एनीऑन का नियंत्रण
&lt;/h3>&lt;p>&lt;strong>टोपोलॉजिकल क्वांटम गणना&lt;/strong>, जिसे लंबे समय से केवल सैद्धांतिक माना जाता था, 2026 में अंततः प्रायोगिक प्रदर्शन के चरण में प्रवेश कर चुकी है। Microsoft और अन्य द्वारा संचालित यह विधि &amp;ldquo;मेजरना जीरो मोड्स (Majorana Zero Modes)&amp;rdquo; नामक गैर-अबेलियन एनीऑन्स (Non-Abelian Anyons) का उपयोग करती है।&lt;/p>
&lt;p>एनीऑन कणों की स्थिति बदलने के लिए &amp;ldquo;ब्रेडिंग (Braiding)&amp;rdquo; नामक ऑपरेशन का उपयोग करके क्वांटम गेट्स निष्पादित किए जाते हैं।&lt;/p>
$$
|\psi_{final}\rangle = B_{ij} |\psi_{initial}\rangle
$$
&lt;p>यहाँ $B_{ij}$ ब्रेडिंग ऑपरेटर है। टोपोलॉजिकल विधि में, सूचना का संरक्षण कणों की स्थानीय अवस्था पर निर्भर नहीं करता, बल्कि पूरी &amp;ldquo;गांठ&amp;rdquo; की टोपोलॉजी पर निर्भर करता है, इसलिए यह पर्यावरणीय शोर के प्रति स्वाभाविक रूप से प्रतिरोधी (हार्डवेयर-स्तर की त्रुटि सहनशीलता) है। 2026 में, दुनिया में पहली बार उच्च-फिडेलिटी वाले टोपोलॉजिकल तार्किक क्वांटम बिट के निर्माण की पुष्टि की गई थी, और यह FTQC के लिए एक शक्तिशाली शॉर्टकट के रूप में ध्यान आकर्षित कर रहा है।&lt;/p>
&lt;hr>
&lt;h2 id="6-वयवहरक-उपयग-क-दश-म-रडमप-और-भवषय-क-सभवनए">6. व्यावहारिक उपयोग की दिशा में रोडमैप और भविष्य की संभावनाएं
&lt;/h2>&lt;p>ताकि क्वांटम कंप्यूटर वास्तव में &lt;strong>क्वांटम सर्वोच्चता (Quantum Advantage)&lt;/strong> प्रदर्शित कर सके, जो &amp;ldquo;रासायनिक गणना,&amp;rdquo; &amp;ldquo;पदार्थ विज्ञान,&amp;rdquo; और &amp;ldquo;वित्तीय मॉडलिंग&amp;rdquo; जैसे क्षेत्रों में शास्त्रीय कंप्यूटर (सुपरकंप्यूटर) को मात दे, इसके लिए हजारों तार्किक क्वांटम बिट्स की आवश्यकता है।&lt;/p>
&lt;div class="mermaid">gantt
title "क्वांटम कंप्यूटिंग रोडमैप (संशोधित 2026)"
dateFormat YYYY
axisFormat %Y
section "NISQ युग"
"शोर वाले क्यूबिट्स (&lt;1000)" :done, 2018, 2024
section "प्रारंभिक FTQC"
"ब्रेक-ईवन पॉइंट प्रदर्शन" :done, 2024, 2026
"सैकड़ों तार्किक क्यूबिट्स" :active, 2026, 2028
section "पूर्ण-पैमाने पर FTQC"
"1000+ तार्किक क्यूबिट्स (व्यावसायिक ऐप)" : 2028, 2030
"यूनिवर्सल फॉल्ट-टॉलरेंट क्वांटम कंप्यूटर" : 2030, 2035&lt;/div>
&lt;h3 id="61-वरतमन-म-समन-क-ज-रह-चनतय-और-भवषय">6.1 वर्तमान में सामना की जा रही चुनौतियां और भविष्य
&lt;/h3>&lt;p>2026 तक की सबसे बड़ी चुनौती क्रायोस्टेट (डाइल्यूशन रेफ्रिजरेटर) की शीतलन क्षमता है, जो अत्यंत कम तापमान बनाए रखने के लिए आवश्यक है, और कमरे के तापमान नियंत्रण उपकरण को क्रायोजेनिक क्वांटम चिप से जोड़ने वाली वायरिंग (I/O बॉटलनेक) है। इसके जवाब में, क्रायोजेनिक वातावरण में काम करने में सक्षम CMOS (Cryo-CMOS) कंट्रोलर चिप्स का विकास तेजी से आगे बढ़ रहा है।&lt;/p>
&lt;h3 id="नषकरष">निष्कर्ष
&lt;/h3>&lt;p>2026 को क्वांटम कंप्यूटर के इतिहास में &amp;ldquo;तार्किक क्वांटम बिट स्केल-अप के प्रथम वर्ष&amp;rdquo; के रूप में दर्ज किया जाएगा। त्रुटि सुधार एल्गोरिदम के प्रदर्शन, हार्डवेयर के मॉडर्नाइजेशन और टोपोलॉजिकल दृष्टिकोण में तेजी से प्रगति के साथ, &amp;ldquo;व्यावहारिक उपयोग का दिन&amp;rdquo; अब दूर के भविष्य की बात नहीं है, बल्कि एक विशिष्ट मील का पत्थर है जिसे अगले कुछ वर्षों में देखा जा सकता है। क्वांटम एल्गोरिदम के डेवलपर्स और कंपनियों के लिए, यह क्वांटम-नेटिव समस्या-समाधान में गंभीरता से निवेश करने का सही समय है।&lt;/p>
&lt;hr>
&lt;p>&lt;em>यह लेख 2026 के नवीनतम क्वांटम कंप्यूटिंग शोध पत्रों और उद्योग के रुझानों के आधार पर लिखा गया है।&lt;/em>&lt;/p></description></item></channel></rss>