isprime?

153とか157とか素数かどうかと考えたとき、それをチェックするプログラムをAPL/J言語で作りたいと思いました。153は3で割れるので素数ではありませんが、157は多分素数です。

   q:153
3 3 17
   q:157
157

APL/J言語には素因数分解する関数q:(キューコロン)がありますので、わざわざ作るまでもないのですが、素数のリストを作って割ってみるとか、素数のリストに含まれているかをチェックするというのを考えたい。

   p:i.15
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47

APL/J言語の関数p:(ピーコロン)は引数番目の素数を返しますので、上記のように自然数の配列を与えれば相当大きな数まで素数リストを作ってくれます。

   4 e.p:i.15
0
   19 e.p:i.15
1

APL/J言語の関数e.(イードット)は左側引数が右側引数にあるなしを1、0で返しますので、上のように4ならば0、19ならば1を返します。
この考え方で15の部分を1000とか大きな数にとって、関数名を決めればプログラム完成の予定。

   isprime=: e.&(p:i.1000)
   isprime 153
0
   isprime 157
1
   isprime 2011
1
   isprime 7119
0
   isprime 7129
1
   isprime 7117
0
   q:7117
11 647

最後の例は、あれ、7117って素数じゃないの?と思ったので、素因数分解したら11*647だったということです。
おもしろいですね。


以上