Emirp数とは?素数とその逆数の関係性を徹底解説!判定方法からコード例まで
エミルプ数(Emirp Number)という言葉を聞いたことがありますか?一見すると難解な数学用語のように感じられますが、実は非常にシンプルで美しい概念です。この記事では、エミルプ数について分かりやすく解説します。
エミルプ数とは何か?定義をわかりやすく解説
エミルプ数は、以下の2つの条件を満たす素数のことを指します。
- 条件1: その数自身が素数であること。
- 条件2: その数の桁を逆順に並べた数もまた素数であること。
ただし、元の数と逆順にした数が同じ場合は、エミルプ数とは呼びません。(例:11, 101)
例:
- 13はエミルプ数です。なぜなら、13も31も素数だからです。
- 17はエミルプ数です。なぜなら、17も71も素数だからです。
- 27はエミルプ数ではありません。なぜなら、27は素数ではないからです。
エミルプ数の判定方法:アルゴリズムと実装
エミルプ数を判定するには、以下のステップに従います。
- 素数判定: 与えられた数が素数かどうかを判定します。
- 逆順生成: 与えられた数の桁を逆順に並べた数を生成します。
- 素数判定(逆順): 逆順にした数が素数かどうかを判定します。
- 結果判定: 元の数と逆順にした数が共に素数であり、かつ異なる場合に、エミルプ数と判定します。
以下のコード例 (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);
}
// 数字がEmirpかどうかを調べる関数
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;
}
上記のコードは、与えられた数 num
がエミルプ数であるかどうかを判定し、結果を "Emirp"
または "Not Emirp"
として返します。
エミルプ数に関する考察:数学的な面白さ
エミルプ数は、私たちが普段何気なく使っている数字の中に隠された、美しい関係性を示しています。素数という基本的な概念と、桁の反転というシンプルな操作を組み合わせることで、このような面白い数が生まれることは、数学の奥深さを感じさせます。
まとめ:エミルプ数の魅力
エミルプ数について、その定義、判定方法、そして数学的な面白さを解説しました。 この記事を通して、少しでもエミルプ数に興味を持っていただけたら幸いです。 エミルプ数は、決して難解なものではなく、素数という身近な概念から派生した、魅力的な数なのです。