エミルプ数とは?定義と判定方法を徹底解説
与えられた数字がエミルプ数であるかどうかを判定する方法をわかりやすく解説します。エミルプ数の定義から、具体的な判定アルゴリズム、プログラミングコードまで、完全網羅的な内容でお届けします。
エミルプ数(Emirp Number)とは?
エミルプ数とは、以下の条件を満たす素数のことです。
- 素数であること: 1とその数自身以外に約数を持たない数。
- 逆から読んだ数も素数であること: 元の数を逆順に並べた数もまた素数であること。
- 回文素数ではないこと: 元の数と逆順にした数が異なること(例:11や101のような数を除く)。
例えば、13はエミルプ数です。なぜなら、13も31も素数であり、13と31は異なる数だからです。
エミルプ数の判定手順
エミルプ数かどうかを判定するには、以下の手順に従います。
-
素数判定: 与えられた数が素数であるかどうかを判定します。
-
逆順の数: 与えられた数を逆順に並べた数を作成します。
-
逆順の数の素数判定: 逆順に並べた数が素数であるかどうかを判定します。
-
最終判定: 以下の条件を満たす場合、エミルプ数であると判定します。
- 元の数が素数である。
- 逆順の数も素数である。
- 元の数と逆順の数が異なる。
エミルプ数判定のアルゴリズム例
具体的なアルゴリズムの例をC++で示します。
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
// 素数判定関数
bool is_prime(int num) {
if (num < 2) {
return false;
}
for (int i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
// 数を逆順にする関数
int reverse_number(int num) {
string str_num = to_string(num);
string rev_str_num = "";
for (int i = str_num.length() - 1; i >= 0; i--) {
rev_str_num += str_num[i];
}
return stoi(rev_str_num);
}
// エミルプ数判定関数
string is_emirp(int num) {
if (!is_prime(num)) {
return "Not Emirp";
}
int rev_num = reverse_number(num);
if (is_prime(rev_num) && num != rev_num) {
return "Emirp";
} else {
return "Not Emirp";
}
}
int main() {
int num = 27;
cout << is_emirp(num) << endl; // "Not Emirp" を出力
return 0;
}
各種プログラミング言語による実装例
上記アルゴリズムを、様々なプログラミング言語で実装した例を以下に示します。
- Java
- Python3
- C#
- JavaScript
- PHP
(上記言語でのコードは、元の記事に含まれているため、ここでは省略します。)
アルゴリズムのポイント
- 素数判定の効率化: 素数判定の際、平方根までの数で割り切れるかどうかをチェックすることで、計算量を削減できます。
- 数値の反転: 数値を文字列に変換し、反転させることで、簡単に逆順の数を作成できます。
まとめ
エミルプ数は、数学的に興味深い性質を持つ素数です。この記事では、エミルプ数の定義、判定方法、具体的なアルゴリズム、そして各種プログラミング言語による実装例を解説しました。これらの知識を活用することで、エミルプ数に関する問題を解決したり、独自のアルゴリズム開発に役立てることができます。