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

与えられた数が素数であるかどうかをチェックするためのラビンミラー素数性テストを実装するC++プログラム


Rabin-Miller Primality Testは、指定された数値が素数であるかどうかを確認するために使用されます。これは、フォーマットの素数性とSolovay-Stressenテストに似ています。このテストは、ロシアの数学者M.M.Artjuhovによって最初に発見されました。

アルゴリズム

Begin
   ll mulmod(ll a, ll b, ll m)
   ll x = 0,y = a mod m
   while (b > 0)
      if (b mod 2 == 1)
         compute x = (x + y) mod m
         y = (y * 2) mod m
         b = b/ 2
   return x mod m.
End

Begin
   ll modulo(ll base, ll e, ll m)
   Initialize:
   ll x = 1
   ll y = base
   while (e > 0)
      if (e mod 2 == 1)
         x = (x * y) mod m
         y = (y * y) mod m
         e = e / 2;
   return x mod m
End

Begin
   bool Miller(ll p, int iteration)
   if (p < 2)
      return false
   if (p != 2 and p mod 2==0)
      return false;
      Compute: ll s = p - 1
   while (s mod 2 == 0)
      s = s/ 2;
      for i = 0 to iteration - 1
         Do
            ll a = rand() mod (p - 1) + 1, temp = s
            ll mod = modulo(a, temp, p)
            while (temp != p - 1 and mod != 1 and mod != p - 1)
               mod = mulmod(mod, mod, p);
               temp *= 2;
            if (mod != p - 1 && temp % 2 == 0)
               return false
            else
               return true
End

サンプルコード

#include <iostream>
#include<stdlib.h>
#define ll long long
using namespace std;
ll mulmod(ll a, ll b, ll m)//It returns true if number is prime otherwise false {
   ll x = 0,y = a % m;
   while (b > 0) {
      if (b % 2 == 1) {
         x = (x + y) % m;
      }
      y = (y * 2) % m;
      b /= 2;
   }
   return x % m;
}

ll modulo(ll base, ll e, ll m) {
   ll x = 1;
   ll y = base;
   while (e > 0) {
      if (e % 2 == 1)
         x = (x * y) % m;
         y = (y * y) % m;
         e = e / 2;
   }
   return x % m;
}

bool Miller(ll p, int iteration) {
   if (p < 2) {
      return false;
   }
   if (p != 2 && p % 2==0) {
      return false;
   }
   ll s = p - 1;
   while (s % 2 == 0) {
      s /= 2;
   }
   for (int i = 0; i < iteration; i++) {
      ll a = rand() % (p - 1) + 1, temp = s;
      ll mod = modulo(a, temp, p);
      while (temp != p - 1 && mod != 1 && mod != p - 1) {
         mod = mulmod(mod, mod, p);
         temp *= 2;
      }
      if (mod != p - 1 && temp % 2 == 0) {
         return false;
      }
   }
   return true;
}

int main() {
   int iteration = 10;
   ll num;
   cout<<"Enter integer to test primality: ";
   cin>>num;
   if (Miller(num, iteration))
      cout<<num<<" is prime"<<endl;
   else
      cout<<num<<" is not prime"<<endl;
   return 0;
}

出力

Enter integer to test primality: 26
26 is not prime

  1. 与えられた数がハッピー数であるかどうかをチェックするPythonプログラム

    特定の数値がハッピー数であるかどうかを確認する必要がある場合は、「%」演算子、「//」演算子、および「+」演算子を使用できます。 ハッピー数は、数値のすべての桁の2乗の合計に置き換えられると、最終的に1になる数値です。 以下は同じのデモンストレーションです- 例 def check_happy_num(my_num):    remaining = sum_val = 0    while(my_num > 0):       remaining = my_num%10       s

  2. 指定された番号がDisarium番号であるかどうかを確認するPythonプログラム

    特定のnmberがディサリウム番号であるかどうかを確認する必要がある場合は、それぞれの位置に電力が供給される桁の合計が計算されます。この前に、番号に存在する桁数が決定されます。 Disarium番号は、その桁の合計とそれぞれの位置の累乗が元の番号自体と等しい番号です。 以下は同じのデモンストレーションです- 例 def length_calculation(num_val):    length = 0    while(num_val != 0):       length = length + 1   &n