C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++のnを法とする素数nの原始根


この問題では、素数Nが与えられます。私たちのタスクは、Nを法とする素数Nの原始根を出力することです。

原始根 素数Nは、[1、n-1]の間にある整数xであり、kが[0、n-2]にあるxk(mod n)のすべての値は一意です。

問題を理解するために例を見てみましょう

Input: 13
Output: 2

この問題を解決するには、オイラーのトーティエント関数と呼ばれる数学関数を使用する必要があります。 。

オイラーのトーティエント関数は、数nに対して互いに素である1からnまでの数の数です。

GCD(i、n)=1の場合、数iは互いに素です。

解法では、nを法とするxの乗法次数がオイラーのトーティエント関数に等しい場合、その数は原始根になります。それ以外の場合はそうではありません。すべての互いに素をチェックします。

注:素数のオイラーのトーティエント関数 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++でフルプライムであるかどうかを確認します

    ここでは、数値が完全素数であるかどうかを確認する方法を説明します。数が素数であり、そのすべての桁も素数である場合、その数は完全な素数であると言われます。数が37であるとすると、これは完全な素数です。しかし、9は素数ではないため、97は完全な素数ではありません。 効率的なアプローチの1つはそれです。まず、素数ではない数字が存在するかどうかを確認する必要があります。数字は0から9でなければなりません。その範囲では、2、3、5、および7が素数であり、その他は素数ではありません。すべてが素数の場合は、その数が素数であるかどうかを確認します。 例 #include <iostream> u

  2. 数値がピタゴラス素数であるかどうかをC++で確認します

    ここでは、数値がピタゴラス素数であるかどうかを確認する別のプログラムを表示します。論理に飛び込む前に、ピタゴラス素数は何ですか?ピタゴラス素数は素数であり、4n+1として表すことができます。 そのような数を検出するには、その数が素数であるかどうかを確認する必要があります。素数の場合は、その数を4で割り、余りが1の場合は、ピタゴラス素数になります。いくつかのピタゴラス素数は{5、13、17、29、37、41、53、…}です。 例 #include <iostream> using namespace std; bool isPrime(int n){    fo