এই সমস্যায়, আমাদের দুটি মান 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