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

C++ में एक अभाज्य संख्या n मोडुलो n का आदिम मूल

इस समस्या में, हमें एक अभाज्य संख्या 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

  1. जांचें कि कोई नंबर क्वार्टन प्राइम है या नहीं C++

    यहां हम यह जांचने के लिए एक और प्रोग्राम देखेंगे कि कोई नंबर क्वार्टन प्राइम है या नहीं। तर्क में गोता लगाने से पहले, आइए देखें कि क्वार्टन प्राइम नंबर क्या हैं? क्वार्टन अभाज्य अभाज्य संख्याएँ हैं, जिन्हें x4 . के रूप में दर्शाया जा सकता है + y4 0. एक संख्या का पता लगाने के लिए ऐसा है, हमें यह जां

  1. जाँच करें कि C++ में कोई संख्या पूर्ण प्रधान है या नहीं

    यहां हम देखेंगे कि कैसे जांचा जाता है कि कोई संख्या पूर्ण अभाज्य है या नहीं। एक संख्या को पूर्ण अभाज्य कहा जाता है, यदि वह अभाज्य है, और उसके सभी अंक भी अभाज्य हैं। मान लीजिए एक संख्या 37 है, यह पूर्ण अभाज्य है। लेकिन 97 पूर्ण अभाज्य नहीं है क्योंकि 9 एक अभाज्य संख्या नहीं है। एक कुशल तरीका यह है क

  1. जाँच करें कि कोई संख्या पाइथागोरस प्राइम है या नहीं C++ में

    यहां हम यह जांचने के लिए एक और प्रोग्राम देखेंगे कि कोई संख्या पाइथागोरस प्राइम है या नहीं। तर्क में गोता लगाने से पहले, आइए देखें कि पाइथागोरस अभाज्य संख्याएँ क्या हैं? पाइथागोरस अभाज्य अभाज्य संख्याएँ हैं, जिन्हें 4n + 1 के रूप में दर्शाया जा सकता है। एक संख्या का पता लगाने के लिए, हमें यह जांचना