エマープ(Emirp)とは、素数を逆転させた数もまた素数である自然数のことです。
例えば、167 は、素数ですが、これを反転した 761 も素数であり、この2つはエマープです。
Prime(素数)という単語を 反転させると Emirp になるので、そう呼ばれているそうです。

引用元:「エマープでかつ上昇数である自然数を求める」を掲載しました

エマープを求める

さてどうやればエマープを求めることができるのでしょうか?

素数を求める
素数を逆転させる
この数も素数か?

まず素数かどうかを判定するメソッドを示します。

1は素数ではない。
2,3は素数である。
2以外の偶数は素数ではない。
2で割り切れないならそれより大きな偶数でも割り切れない(奇数で割り切れるかのみ考える)。
調べようとしている数の平方根を切り上げた整数でも割りきれない場合、それ以上大きな整数では割りきれない(もし割り切れる数が見つかるのであれば商はそれよりも小さな数になる。それが見つからなかったということは割り切れる数は存在しないということになる)のでそれ以上調べるのは時間の無駄である

Reverseは数字を逆に並べ替えた数を取得するメソッドです。

IsEmirpは引数で与えられた整数がエマープかどうか判定するメソッドです。引数が素数であるなら数字を逆に並べ替え、これも素数なのか調べます。

GetEmirpsはエマープを取得するメソッドです。minは調査を開始する最小値、countは取得したいエマープの個数です。

ボタンをクリックしたらエマープかどうか調べて10,000個取得し、これを文字列に変換します。これをリッチテキストボックスに表示させます。

一桁なら並べ替えても同じなので11から調べています。10,000個取得であればすぐにおわります。10,000番目のエマープは942,811です。100,000個取得しようとすると時間がかかります。ネットショップで中古で購入したパソコン(X230)では17秒かかりました。100,000番目のエマープは11,240,387です。

回文素数を求める

エマープと回文数になっている素数を合わせたもの(つまり、逆から読んでも素数である素数全体)を回文素数と呼ばれることがあります。回文素数も求めてみましょう。

IsPalindromesは回文数かどうか調べるメソッドです。

IsPalindromesPrimeは回文素数かどうかを調べるメソッドです。まず回文数かどうか調べて、そのあと素数かどうかを調べます。

GetPalindromesPrimesは回文素数を取得するメソッドです。minは調査を開始する最小値、countは取得したい回文素数の個数です。

一桁なら回文にはならないので11から調べています。今度は10,000個取得しようとしても相当な時間が必要になりそうです。500個であればすぐに終わりますが、1,000個取得しようとしてもなかなか終わりません。取得できるまでに約60秒かかりました。1,000番目の回文素数は114,494,411です。

100,000番目のエマープが11,240,387であることと比較すると時間がかかるのもわかるような気がします。