কম্পিউটার

C++ এ একটি মৌলিক সংখ্যা n মডিউল n এর আদিম মূল


এই সমস্যায়, আমাদের একটি মৌলিক সংখ্যা N দেওয়া হয়েছে। আমাদের কাজ হল মৌলিক সংখ্যা N মডুলো N-এর আদিম মূল প্রিন্ট করা।

আদি মূল মৌলিক সংখ্যার N হল একটি পূর্ণসংখ্যা x যা [1, n-1] এর মধ্যে থাকে যাতে xk (mod n) এর সমস্ত মান যেখানে k থাকে [0, n-2]-এ থাকে অনন্য।

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

Input: 13
Output: 2

এই সমস্যাটি সমাধান করার জন্য, আমাদেরকে অয়লার টোটিয়েন্ট ফাংশন নামে গাণিতিক ফাংশন ব্যবহার করতে হবে। .

অয়লারের টোটিয়েন্ট ফাংশন হল 1 থেকে n পর্যন্ত সংখ্যার গণনা যা n সংখ্যার তুলনামূলকভাবে প্রধান।

একটি সংখ্যা i অপেক্ষাকৃত মৌলিক যদি GCD (i, n) =1।

সমাধানে, যদি x মডুলো 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++ এ Mersenne প্রাইম নম্বর।

  2. একটি সংখ্যা C++ এ কোয়ার্টান প্রাইম কিনা তা পরীক্ষা করুন

  3. একটি সংখ্যা C++ এ ফুল প্রাইম কিনা তা পরীক্ষা করুন

  4. একটি সংখ্যা সি++ এ পাইথাগোরিয়ান প্রাইম কিনা তা পরীক্ষা করুন