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

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

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

समस्या को समझने के लिए एक उदाहरण लेते हैं,

Input : n = 4, p = 11
Output : 9

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

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

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

शैंक के टोनेली एल्गोरिथम का उपयोग करके वर्गमूल मोडुलो को खोजने के लिए एल्गोरिथ्म -

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

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

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

चरण 4 - 0 से अधिक m के लिए लूप का उपयोग करें और 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++ में दूषित बाइनरी ट्री में तत्वों का पता लगाएं

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

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

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

  1. सी ++ प्रोग्राम ऑर्डर-सांख्यिकीय एल्गोरिदम का उपयोग करके दी गई सूची से सबसे बड़ी संख्या खोजने के लिए

    ऑर्डर-सांख्यिकीय एल्गोरिथम का उपयोग करके दी गई सूची से सबसे बड़ी संख्या खोजने के लिए यह एक C++ प्रोग्राम है। एल्गोरिदम Begin    function Insert() to insert nodes into the tree:    Arguments:       root, d.       Body of the function:     &n