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

C++の素数のmodの下で力の力を見つける


この問題では、4つの値A、B、C、M(素数)が与えられます。私たちの仕事は、素数のmodの下で力の力を見つけることです。

(A ^(B ^ C))(mod M)の値を見つける必要があります。

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

入力

A = 3, B = 6, C = 2, M = 11

出力

3

説明

(A ^(B ^ C))=(3 ^(6 ^ 2))=(3 ^(36))(mod 11)=3

ソリューションアプローチ

この問題の簡単な解決策は、(A ^(B ^ C))の値を直接計算することです。これは、最初に(B ^ C)の値を計算し、次に(A ^(B ^ C))を計算することによって行われます。そのmodを取る。 (B ^ C)は、タスクになる可能性のある巨大なフィギュアの保存になります。そして、計算はオーバーフローにつながる可能性があります。

したがって、より効率的なアプローチは、フェルマーの小定理を使用して値を見つけることです。

定理は、

a^(m-1) = 1 (mod M) where m is a prime number.

これを使用して、問題のbcをいくつかの形式に変換します

x *(M-1)+ y、指定されたMの値。

フェルマーの定理を使用すると、部分A ^(x *(M-1))は1になります。

これにより、計算がに減り、A y の値が見つかります。 。

yの値は、次のように計算できます。

B c =x *(M-1)+ y

これにより、B c を除算したときにyが余りになります。 (M-1)、

したがって、y =B c %(M-1)

これにより、見つける必要があるため、結果が非​​常に簡単になります。

(A ^ ((B^C) %( M-1)) % M

ソリューションの動作を説明するプログラム

#include<iostream>
using namespace std;
int calcPowerMod(int x, int y, int p) {
   int powMod = 1;
   x = x % p;
   while (y > 0) {
      if (y & 1)
         powMod = (powMod*x) % p;
      y /=2; // y = y/2
      x = (x*x) % p;
   }
   return powMod;
}
int findPowerOfPowerMod(int A, int B, int C, int M) {
   return calcPowerMod(A, calcPowerMod(B, C, M-1), M);
}
int main() {
   int A = 3, B = 6, C = 2, M = 11;
   cout<<"The power of power under modulo is "<<findPowerOfPowerMod(A, B, C, M);
   return 0;
}

出力

The power of power under modulo is 3

  1. C++の平衡素数

    平衡素数 numberは、前の素数と次の素数で同じ差がある素数です。つまり、最も近い次の素数と前の素数の平均です。 素数が平衡素数になるには、次の式に従う必要があります- P n =(P(n-1)+ P(n + 1))/ 2 ここで、nは、順序付けられた素数のセット内の素数pnのインデックスです。 素数の順序集合:2、3、5、7、11、13、…。 まず、平衡素数は5、53、157、173、… この問題では、数nが与えられ、n番目の平衡素数を見つける必要があります。 例を見てみましょう Input : n = 3 Output : 157 このため、素数を生成し、配列に

  2. nCrがC++で指定された素数で割り切れるかどうかを調べます

    3つの変数N、R、およびPがあるとします。NとRは、 Nを取得するために使用されます。 C R Pは素数です。 Nかどうかを確認する必要があります C R はPで割り切れる。いくつかの数N=7、R =2、P =3があるとすると、 7 C 2 =21、これは3で割り切れるので、出力はtrueになります。 N C R R! +(N-R)! 例 #include <iostream> using namespace std; int getPower(int n, int p) {    int pow = 0;    w