エマープでかつ上昇数である自然数を求める

 
エマープでかつ上昇数である自然数を列挙するプログラムです。
 
素数を逆転させた数もまた素数である自然数のことを 「エマープ(Emirp)」と言います。
例えば、167 は、素数ですが、これを反転した 761 も素数であり、この2つはエマープです。
Prime(素数)という単語を 反転させると Emirp になるので、そう呼ばれているそうです。
また、1479のように、左から右へどんどん大きな数字になってゆく数を、ここでは「上昇数」と呼ぶことにします。

実際に動くSilverlightプログラムを示します。
さて、この問題の解き方ですが、 1 から 123456789 までのすべての数字に対して、一つずつ条件を満たすかを調べていては、 効率が悪すぎます。
そのため、「上昇数を求め、それが、エマープかどうかを調べる」という 方法で、答えを見つけています。

簡単にコードの説明をします。(コードは最後に掲載しています)
まずは、素数を判定する IsPrime メソッドは、割り切れる数があるかを順に調べるという、ごくごくオーソドックスな方法で判断しています。

次の、IsEmirp は、文字列を反転する RevString と 上記 Isrimeメソッドを使い、エマープかどうかを判定しています。
RevStringメソッドは、LINQの Reverse拡張メソッドを利用し反転させ、文字列に直しています。
これを拡張メソッドとして定義すれば、 string rs = s.RevString(); なんて書けますね。

GetRisingNumbersが、上昇数を列挙するメソッドです。IEnumerable<string> 型を返す再帰メソッドとなっています。
メソッドの第1引数には、上昇数の途中結果が渡されます。初期値は 空文字列です。
第2引数には、上昇数で利用できる数字が小さい順に格納されている IEnumerable<int> 型です。
初期値は、 { 1,2,3,4,5,6,7,8,9 } です。
例えば、第1引数に "24" という文字列が渡された時には、 第2引数には、{ 5,6,7,8,9 } が渡されます。


再帰メソッドで、IEnumerable<T> を戻り値にする方法については、
僕のブログの記事「再帰メソッドで、yield returnしたい 」  を読んでください。 これらのメソッドができあがれば、Solveメソッドを書くのは簡単ですね。

以下、C#+Silverlightのコードです。

■RingNumber.cs
  

■MainPage.cs
 

■MainPage.xaml