与えられた数が素数であるかどうかをチェックするためのラビンミラー素数性テストを実装する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
-
与えられた数がハッピー数であるかどうかをチェックするPythonプログラム
特定の数値がハッピー数であるかどうかを確認する必要がある場合は、「%」演算子、「//」演算子、および「+」演算子を使用できます。 ハッピー数は、数値のすべての桁の2乗の合計に置き換えられると、最終的に1になる数値です。 以下は同じのデモンストレーションです- 例 def check_happy_num(my_num): remaining = sum_val = 0 while(my_num > 0): remaining = my_num%10 s
-
指定された番号がDisarium番号であるかどうかを確認するPythonプログラム
特定のnmberがディサリウム番号であるかどうかを確認する必要がある場合は、それぞれの位置に電力が供給される桁の合計が計算されます。この前に、番号に存在する桁数が決定されます。 Disarium番号は、その桁の合計とそれぞれの位置の累乗が元の番号自体と等しい番号です。 以下は同じのデモンストレーションです- 例 def length_calculation(num_val): length = 0 while(num_val != 0): length = length + 1 &n