SwiftでPlaygroundを使って双子素数のリストを取得する

SwiftでPlaygroundを使って双子素数のリストを取得する
Pocket

背景

素数のリストを配列で取得したいなと思い、Playgroundを使ってサクッと試したら、なんだか楽しくなったので双子素数のリストも取得してみました。

 

Playgroundを使う

Playgroundなんて今までほとんど使ったことなかったけど、軽い動作確認をするときは便利だった。
何と言っても使うのが簡単!

Xcodeを開いてPlaygroundを選択して、

 

名前を決めて、

ファイルの保存場所を決めたら、

出来た!

簡単に、素早く開けた!

Playgroundでコードを書くと実行結果がすぐに与えられるのもすごく便利だった。

 

素数の配列を取得する。

まず素数とは何かというと、「1と自分自身以外の数で割り切ることは出来ない数」である。
「これ以上素因数分解できない数」と言ってもいいかもしれない。
そして「どんな素数で割った余りも0ではない」のなら、その数は素数であることが言える。

素数をどうやって生み出していこうかという問題だが、

素数の配列をまず作って、2を入れておく。
3から10000のすべての数字については、「今まで得た素数の配列全てで割切れることがなければ素数であり(素数の配列に追加し)、どれかで割切れることができれば素数ではない。」という操作を小さい方から順番に実行することで素数のリストを得ている!
これで、10000までの全ての素数のリストが手に入った。

ただこのやり方で50000までの素数のリストを作成すると30分ぐらい時間がかかったので、もっと効率的なプログラムにしなければもっと大きい素数のリストを手に入れることはできない。

今回はとりあえず100000(10万)までの素数を求めようと思ったが、このペースで作ろうとすると確実に1時間はかかりそうだ。

とりあえずループの回数を半分にすればいいやと思って、奇数だけでループを回すと、こっちもだいたい30分ぐらいで計算が終了した。

これで、10万までの全ての素数のリストを手に入れることができた。

 

文字列処理

今回は素数のリストを文字列で取得したかったので、文字列の処理が必要となった。

こちらの記事を参考にして、

こんな感じのコードを書くと、配列の文字列を出力できた。
文字列の中のある文字にアクセスするときに「インデックス(何番目の文字か)を考える必要がある」というのがポイントだ。

 

双子素数のリストを取得する

双子素数というのは「差が2の素数のペア」のことだ。
例えば、「11と13」や「29と31」が双子素数である。

素数のリストが手に入っているので、双子素数のリストを取得するためには、

上のように、ある素数とその次の素数の差が2であることを条件にしてループを回せば良い。

完了!(下の画像は10000の時のスクリーンショット)

こちらは割り算がないので計算時間がだいぶ短い。

ちなみに100000以下の双子素数は1224組があった。意外といっぱいある。
100000以下で一番大きい双子素数は99989と99991のようだ。
いやあ、パソコンって便利だなあ。

今回作成した100000までの素数のリストとその中にある双子素数のリストをテキストファイルでここに貼っておくので、自由に使ってください。

prime_and_twin

 

最後に

今回はSwiftで数式の処理をしたけれど、計算が遅いなと感じたので、他の言語でも試してみたい。

Pocket