এই সমস্যায়, আমাদের একটি মৌলিক সংখ্যা 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