इस समस्या में, हमें एक अभाज्य संख्या N दिया जाता है। हमारा कार्य अभाज्य संख्या N modulo N के आदिम मूल को प्रिंट करना है।
आदिम जड़ अभाज्य संख्या N का एक पूर्णांक x है जो [1, n-1] के बीच स्थित है, जैसे कि xk (mod n) के सभी मान जहां k [0, n-2] में स्थित है, अद्वितीय हैं।
समस्या को समझने के लिए एक उदाहरण लेते हैं,
Input: 13 Output: 2
इस समस्या को हल करने के लिए, हमें यूलर के टोटिएंट फ़ंक्शन . नामक गणितीय फ़ंक्शन का उपयोग करना होगा ।
यूलर का टोटिएंट फंक्शन 1 से n तक की संख्याओं की संख्या है जो संख्या n से अपेक्षाकृत अभाज्य हैं।
यदि GCD (i, n) =1.
. है तो एक संख्या i अपेक्षाकृत अभाज्य हैसमाधान में, यदि x modulo n का गुणन क्रम यूलर के टोटिएंट फ़ंक्शन के बराबर है, तो संख्या आदिम मूल है अन्यथा नहीं। हम सभी सापेक्ष अभाज्य संख्याओं की जांच करेंगे।
नोट:एक अभाज्य संख्या का यूलर का योगफल कार्य n=n-1
नीचे दिया गया कोड हमारे समाधान के कार्यान्वयन को दिखाएगा,
उदाहरण
#include<bits/stdc++.h> using namespace std; bool isPrimeNumber(int n) { if (n <= 1) return false; if (n <= 3) return true; if (n%2 == 0 || n%3 == 0) return false; for (int i=5; i*i<=n; i=i+6) if (n%i == 0 || n%(i+2) == 0) return false; return true; } int power(int x, unsigned int y, int p) { int res = 1; x = x % p; while (y > 0){ if (y & 1) res = (res*x) % p; y = y >> 1; x = (x*x) % p; } return res; } void GeneratePrimes(unordered_set<int> &s, int n) { while (n%2 == 0){ s.insert(2); n = n/2; } for (int i = 3; i <= sqrt(n); i = i+2){ while (n%i == 0){ s.insert(i); n = n/i; } } if (n > 2) s.insert(n); } int findPrimitiveRoot(int n) { unordered_set<int> s; if (isPrimeNumber(n)==false) return -1; int ETF = n-1; GeneratePrimes(s, ETF); for (int r=2; r<=ETF; r++){ bool flag = false; for (auto it = s.begin(); it != s.end(); it++){ if (power(r, ETF/(*it), n) == 1){ flag = true; break; } } if (flag == false) return r; } return -1; } int main() { int n= 13; cout<<" Smallest primitive root of "<<n<<" is "<<findPrimitiveRoot(n); return 0; }
आउटपुट
Smallest primitive root of 13 is 2