কম্পিউটার

C++ এ মডুলো প্রাইম আদিম মূলের সংখ্যা খুঁজুন।


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

একটি সংখ্যার আদিম মূল − এটি একটি সংখ্যা (r) N এর থেকে ছোট যার r^x(mod N) এর সমস্ত মান রয়েছে [0, n-2] রেঞ্জের সমস্ত X এর জন্য আলাদা।

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

Input : N = 5
Output : 2

সমাধান পদ্ধতি

সমস্যার একটি সহজ সমাধান একটি ট্রায়াল পদ্ধতির উপর ভিত্তি করে। আমরা 2 থেকে (N-1) পর্যন্ত সমস্ত সংখ্যার জন্য পরীক্ষা করব যেখানে x থেকে [0, n-2] পরিসরের শর্ত রয়েছে এবং যদি এমন একটি মান পাওয়া যায় যা শর্ত পূরণ করে।

এই সমাধানটি নিষ্পাপ এবং কার্যকর করা সহজ কিন্তু সমাধানের সময় জটিলতা হল 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++ ব্যবহার করে পঞ্চভুজ পিরামিডাল নম্বর খুঁজুন

  2. C++ ব্যবহার করে Pell নম্বর খুঁজুন

  3. C++ ব্যবহার করে একটি স্ট্রিং এর সাবস্ট্রিং এর সংখ্যা খুঁজুন

  4. C++ ব্যবহার করে স্টপিং স্টেশনের সংখ্যা খুঁজুন