কম্পিউটার

C++ এ Modulo p (Shanks Tonelli অ্যালগরিদম) এর অধীনে স্কয়ার রুট খুঁজুন


এই সমস্যায়, আমাদের দুটি মান n এবং একটি মৌলিক সংখ্যা p দেওয়া হয়েছে। আমাদের কাজ হল Modulo p.

এর অধীনে স্কয়ার রুট খুঁজে বের করা

সমস্যাটি বোঝার জন্য একটি উদাহরণ নেওয়া যাক,

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

সমাধান পদ্ধতি

এখানে, আমরা Tonelli-Shanks Algorithm ব্যবহার করব .

টোনেলি-শ্যাঙ্কস অ্যালগরিদম 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৷ − 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++ এ দূষিত বাইনারি ট্রিতে উপাদান খুঁজুন

  2. C++ এ একটি সংখ্যার ঘনমূল খুঁজুন

  3. C++ এ বর্গমূল না খুঁজে একটি সংখ্যা নিখুঁত বর্গ কিনা তা পরীক্ষা করুন

  4. অর্ডার-স্ট্যাটিস্টিক অ্যালগরিদম ব্যবহার করে প্রদত্ত তালিকা থেকে সবচেয়ে বড় সংখ্যা খুঁজে পেতে C++ প্রোগ্রাম