この辺りから、愚直に力任せのロジックを書くと処理時間が大変なことになり始める。
素数といえば「エラトステネスのふるい」
単純なのに高速なアルゴリズムの代表格だと思う。
「エラトステネスのふるい」の形で算出される素数はN以下の数字ということになる。
必要となるのはX番目の素数であり、その素数がどの程度の大きさか?と言うのは分からない。
なので、「エラトステネスのふるい」を使う場合でも【N以下】のNをいくつにすればいいか?が問題になってくる。
そもそも「エラトステネスのふるい」は高速ではあるが、メモリはそれなりに食うアルゴリズムである。
とは言え、所詮10001番めの素数なので気にせず100万までのエラトステネスのふるいをして、足りなければ試し割りで次の素数を・・・
みたいな感じでやればいいんじゃないすかね?
ちなみに、10001番目の素数は10万ちょっとくらいなので100万までの素数出しとけば余裕です。
100万までのエラトステネスのふるいをする場合のメモリ使用量だけ、考えておく。
1つの整数に1bit使うとすると1000000bit = 125000Byte = 約122KBとなる。
PCなら2桁くらい増やしても余裕そう!工夫すればメモリ抑えられるし。
なお「アトキンの篩」なる、より高速化されたアルゴリズムもあるらしい。(2003年発表とかなり新し目)
「エラトステネスの篩」と比較して10桁程度までの素数なら数倍程度の差がでるとのこと。
その他にも素数周りは様々な高速化テクニックがあるので、気になる人はGoogle先生に聞いて下さい。