それはまさにあなたが求めるものではありませんが、ここではSieve のより慣用的な (そしてはるかに高速な) バージョンがあります。
基本的に、必要なのは、どの数がどの数の倍数であるかを確認することです。これは、モジュロの表から取得できます。|/~
l =: 2 3 4 5 7 21 45 49 61
|/~ l
0 1 0 1 1 1 1 1 1
2 0 1 2 1 0 0 1 1
2 3 0 1 3 1 1 1 1
2 3 4 0 2 1 0 4 1
2 3 4 5 0 0 3 0 5
2 3 4 5 7 0 3 7 19
2 3 4 5 7 21 0 4 16
2 3 4 5 7 21 45 0 12
2 3 4 5 7 21 45 49 0
倍数のすべてのペアは0
、テーブルに を与えます。ここで、0
自己モジュロ (2 mod 2、3 mod 3 など。0
対角線上の s) に対応する s には関心がないので、それらを削除する必要があります。1
これを行う 1 つの方法は、次のように、その場所に sを追加することです。
=/~ l
1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0
0 0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 1
(=/~l) + (|/~l)
1 1 0 1 1 1 1 1 1
2 1 1 2 1 0 0 1 1
2 3 1 1 3 1 1 1 1
2 3 4 1 2 1 0 4 1
2 3 4 5 1 0 3 0 5
2 3 4 5 7 1 3 7 19
2 3 4 5 7 21 1 4 16
2 3 4 5 7 21 45 1 12
2 3 4 5 7 21 45 49 1
とも書ける(=/~ + |/~) l
。
このテーブルから、最終的な数字のリストを取得します。列に , が含まれるすべての数字0
が除外されます。
列を掛けるだけで、この除外リストを作成します。列に が含まれている場合0
、その積は0
それ以外の場合は正の数です。
*/ (=/~ + |/~) l
256 2187 0 6250 14406 0 0 0 18240
最後のステップを実行する前に、これを少し改善する必要があります。0
s とsだけに関心があるので、長い乗算を実行する理由はありませんnot-0
。したがって、テーブルを作成するときは、各数値の「符号」を使用して0
s とs のみを保持します (これは: です)。1
signum
*
* (=/~ + |/~) l
1 1 0 1 1 1 1 1 1
1 1 1 1 1 0 0 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 0 1 1
1 1 1 1 1 0 1 0 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
それで、
*/ * (=/~ + |/~) l
1 1 0 1 1 0 0 0 1
除外リストから、あなたはcopy
:#
最終的なリストへの数字:
l #~ */ * (=/~ + |/~) l
2 3 5 7 61
また、
(]#~[:*/[:*=/~+|/~) l
2 3 5 7 61