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

C++ में आदिम मूल मॉड्यूलो प्राइम की संख्या ज्ञात कीजिए।

इस समस्या में, हमें एक अभाज्य संख्या N दी जाती है। हमारा कार्य आदिम जड़ों की संख्या ज्ञात करना modulo prime है। ।

किसी संख्या का आदिम मूल - यह एक संख्या (r) है जो N से छोटी है जिसमें r^x(mod N) के सभी मान [0, n-2] श्रेणी में सभी X के लिए भिन्न हैं।

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

Input : N = 5
Output : 2

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

समस्या का एक सरल समाधान परीक्षण पद्धति पर आधारित है। हम x से लेकर [0, n-2] तक की स्थितियों के लिए 2 से (N-1) तक के सभी नंबरों की जांच करेंगे और अगर कोई मान मिलता है जो शर्त को पूरा करता है तो हम उसे तोड़ देंगे।

यह समाधान अनुभवहीन है और इसे लागू करना आसान है लेकिन समाधान की समय जटिलता N 2 के क्रम की है . यह N के बड़े मान के मामले में लंबे समय तक चलने का कारण बन सकता है।

तो, समस्या का एक अधिक कुशल समाधान यूलर टोटिएंट फ़ंक्शन φ(N)

. का उपयोग करना है

तो, एक संख्या r के लिए N का आदिम मूल होना। मॉड्यूलो N के साथ इसका गुणन क्रम φ(N) के बराबर है। यहां अनुसरण करने के चरण दिए गए हैं -

हमें अभाज्य संख्या N के लिए (N-1) के सभी अभाज्य गुणनखंड खोजने होंगे। फिर (N-1) / अभाज्य गुणनखंडों का उपयोग करके सभी घातों की गणना करें। फिर अभाज्य संख्याओं के मान की जाँच करें शक्ति मोडुलो n। यदि इसका कभी भी 1 नहीं है तो i आदिम मूल है। पहला मान जो हम देखते हैं वह लौटाया हुआ मान होगा क्योंकि किसी संख्या के लिए एक से अधिक आदिम मूल हो सकते हैं लेकिन हमें केवल सबसे छोटी की आवश्यकता होती है।

उदाहरण

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

#include<bits/stdc++.h>
using namespace std;
int calcPowerMod(int x, unsigned int y, int p){
   int modVal = 1;
   x = x % p;
   while (y > 0){
      if (y & 1)
         modVal = (modVal*x) % p;
      y = y >> 1;
      x = (x*x) % p;
   }
   return modVal;
}
void findAllPrimeFactors(unordered_set<int> &s, int n){
   while (n%2 == 0){
      s.insert(2);
      n = n/2;
   }
   for (int i = 3; i*i <= n; i = i+2){
      while (n%i == 0){
         s.insert(i);
         n = n/i;
      }
   }
   if (n > 2)
      s.insert(n);
}
int findSmallestPrimitiveRoot(int n){
   unordered_set<int> primes;
   int phi = n-1;
   findAllPrimeFactors(primes, phi);
   for (int r=2; r<=phi; r++){
      bool flag = false;
      for (auto it = primes.begin(); it != primes.end(); it++){
         if (calcPowerMod(r, phi/(*it), n) == 1){
            flag = true;
            break;
         }
      }
      if (flag == false)
         return r;
   }
   return -1;
}
int main(){
   int n = 809;
   cout<<"The smallest primitive root is "<<findSmallestPrimitiveRoot(n);
   return 0;
}

आउटपुट

The smallest primitive root is 3

  1. C++ का उपयोग करके पंचकोणीय पिरामिड संख्या ज्ञात कीजिए

    एक पंचकोणीय पिरामिड संख्या एक पंचकोणीय आधार पिरामिड में मदों की संख्या के बराबर होती है। नीचे कुछ पंचकोणीय संख्याओं को देखें। N तक पंचकोणीय संख्याओं का योग Nवीं पंचकोणीय पिरामिड संख्या के बराबर होता है। इस लेख में, हम उदाहरण के लिए, Nth पंचकोणीय पिरामिड संख्या खोजने पर चर्चा करेंगे Input : N = 4

  1. C++ का उपयोग करके एक स्ट्रिंग के सबस्ट्रिंग की संख्या ज्ञात करें

    इस लेख में, आप किसी दिए गए स्ट्रिंग में बनाए जा सकने वाले सबस्ट्रिंग (गैर-रिक्त) की संख्या को खोजने के तरीकों के बारे में जानेंगे। Input : string = “moon” Output : 10 Explanation: Substrings are ‘m’, ‘o’, ‘o’, ‘n’, ‘mo’, &lsqu

  1. C++ . का उपयोग करके स्टॉपिंग स्टेशनों की संख्या ज्ञात कीजिए

    बिंदु X और Y के बीच मध्यवर्ती ट्रेन स्टेशनों की संख्या n है। गिनें कि अलग-अलग तरीकों से ट्रेनों को s स्टेशनों पर रुकने के लिए व्यवस्थित किया जा सकता है जैसे कि कोई भी दो स्टेशन एक दूसरे के बगल में नहीं हैं। तो इस लेख में, हम स्टॉपिंग स्टेशनों की संख्या का पता लगाने के लिए हर संभव तरीके की व्याख्या क