Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

मॉड्यूलो p के तहत वर्गमूल ज्ञात करें (शैंक्स टोनेली एल्गोरिथम) C++ में


इस समस्या में, हमें दो मान n और एक अभाज्य संख्या p दिए गए हैं। हमारा कार्य मॉड्यूलो p के तहत वर्गमूल ज्ञात करना है।

उदाहरण से समझते हैं:

इनपुट: n = 4, p = 11 आउटपुट: 9

समाधान दृष्टिकोण

यहां, हम टोनेली-शैंक्स एल्गोरिथम का उपयोग करेंगे।

टोनेली-शैंक्स एल्गोरिथम मॉड्यूलर अंकगणित में x के मान के लिए x² = n (mod p) रूप के सर्वांगसमता को हल करने के लिए उपयोग किया जाता है।

शैंक्स के टोनेली एल्गोरिथम का उपयोग करके मॉड्यूलो वर्गमूल ज्ञात करने का एल्गोरिथम:

चरण 1 - $(n^{((p-1)/2)})(mod\:p)$ का मान ज्ञात करें, यदि इसका मान p - 1 है, तो मॉड्यूलर वर्गमूल संभव नहीं है।

चरण 2 - फिर, हम मान p - 1 को (s * 2e) के रूप में उपयोग करेंगे। जहां s विषम और धनात्मक है और e धनात्मक है।

चरण 3 - q^((p-1)/2)(mod p) = -1 का मान गणना करें।

चरण 4 - m > 0 के लिए लूप का उपयोग करें और x के मान को अपडेट करें,

m ढूंढें जैसे कि b^(2^m) - 1(mod p) जहां 0 ≤ m ≤ r-1।

यदि M 0 है, तो x लौटाएं अन्यथा मान अपडेट करें,

x = x * (g^(2 ^ (r - m - 1)) b = b * (g^(2 ^ (r - m)) g = (g^(2 ^ (r - m - 1)) r = m

उदाहरण

हमारे समाधान के कार्य को दर्शाने वाला प्रोग्राम:

#include <iostream> #include <math.h> using namespace std; int powerMod(int base, int exponent, int modulus) {    int result = 1;    base = base % modulus;    while (exponent > 0) {       if (exponent % 2 == 1)       result = (result * base)% modulus;       exponent = exponent >> 1;       base = (base * base) % modulus;    }    return result; } int gcd(int a, int b) {    if (b == 0)    return a;    else    return gcd(b, a % b); } int orderValues(int p, int b) {    if (gcd(p, b) != 1) {       return -1;    }    int k = 3;    while (1) {       if (powerMod(b, k, p) == 1)       return k;       k++;    } } int findx2e(int x, int& e) {    e = 0;    while (x % 2 == 0) {       x /= 2;       e++;    }    return x; } int calcSquareRoot(int n, int p) {    if (gcd(n, p) != 1) {       return -1;    }    if (powerMod(n, (p - 1) / 2, p) == (p - 1)) {       return -1;    }    int s, e;    s = findx2e(p - 1, e);    int q;    for (q = 2; ; q++) {       if (powerMod(q, (p - 1) / 2, p) == (p - 1))       break;    }    int x = powerMod(n, (s + 1) / 2, p);    int b = powerMod(n, s, p);    int g = powerMod(q, s, p);    int r = e;    while (1) {       int m;       for (m = 0; m < r; m++) {          if (orderValues(p, b) == -1)          return -1;          if (orderValues(p, b) == pow(2, m))          break;       }       if (m == 0)       return x;       x = (x * powerMod(g, pow(2, r - m - 1), p)) % p;       g = powerMod(g, pow(2, r - m), p);       b = (b * g) % p;       if (b == 1)       return x;       r = m;    } } int main() {    int n = 3;    int p = 13;    int sqrtVal = calcSquareRoot(n, p);    if (sqrtVal == -1)       cout<<"Modular square root is not exist";    else cout<<"Modular square root of the number is "<<sqrtVal; }

आउटपुट

Modular square root of the number is 9

  1. C++ में दूषित बाइनरी ट्री में तत्व खोजें C++ में दूषित बाइनरी ट्री में तत्व खोजें

    मान लीजिए हमारे पास एक बाइनरी ट्री है। उस ट्री के नियम इस प्रकार हैं: root.val == 0 यदि treeNode.val x है और treeNode.left null नहीं है, तो treeNode.left.val = 2 * x + 1 यदि treeNode.val x है और treeNode.right null नहीं है, तो treeNode.right.val = 2 * x + 2 अब चूंकि बाइनरी ट्री दूषित है। यह इंगि

  1. - C++ में वर्गमूल निकाले बिना जांचें कि संख्या पूर्ण वर्ग है या नहीं

    मान लीजिए एक संख्या दी गई है, हमें जांचना है कि संख्या पूर्ण वर्ग है या नहीं। हम इसकी जांच के लिए वर्गमूल ऑपरेशन का उपयोग नहीं करेंगे। मान लीजिए संख्या 1024 है, यह एक पूर्ण वर्ग है, लेकिन 1000 पूर्ण वर्ग नहीं है। तर्क सरल है, हमें परिणाम प्राप्त करने के लिए इस एल्गोरिदम का पालन करना होगा।एल्गोरिदमis

  1. - C++ प्रोग्राम: ऑर्डर-स्टैटिस्टिक एल्गोरिदम द्वारा ith लार्जेस्ट नंबर खोजना

    यह C++ प्रोग्राम ऑर्डर-स्टैटिस्टिक ट्री (Order-Statistic Tree) का उपयोग करके दी गई लिस्ट से kth लार्जेस्ट (kवां सबसे बड़ा) एलिमेंट खोजता है। प्रत्येक नोड को उसकी रैंक (इनऑर्डर ट्रैवर्सल में पोजीशन) असाइन की जाती है। एल्गोरिदम k है, तो लेफ्ट चाइल्ड में सर्च करें - अन्यथा राइट चाइल्ड में सर्च