とくに必要というわけではないのですが、最近、素数づいてるので書きます。
「エラトステネスの篩」の説明の記事を読んで、全然頭に入ってこなくてもやっとしてしまったので。
(記事のせいではないです。だんだん理解力が...)
...困ったときのwikipedia。
エラトステネスの篩
アルゴリズム
(中略)
ステップ 1
探索リストに2からxまでの整数を昇順で入れる。
ステップ 2
探索リストの先頭の数を素数リストに移動し、その倍数を探索リストから篩い落とす。
ステップ 3
上記の篩い落とし操作を探索リストの先頭値がxの平方根に達するまで行う。
ステップ 4
探索リストに残った数を素数リストに移動して処理終了。
だそうな。
やってみます。
たぶん末尾再帰案件だとあたりをつけました。
const primesInner = primes => sieveds =>
sieveds[0] > Math.sqrt(sieveds[sieveds.length-1]) ? [...primes, ...sieveds] //ステップ3>>4
: primesInner( [...primes, sieveds[0]] )(
sieveds.slice(1).filter( e => e % sieveds[0] != 0 )
) //ステップ2
const primesUpTo = n =>
primesInner( [] )( [ ...Array(n + 1).keys() ].slice(2) ) //ステップ1
primesUpTo(100)
/*
[
2, 3, 5, 7, 11, 13, 17, 19,
23, 29, 31, 37, 41, 43, 47, 53,
59, 61, 67, 71, 73, 79, 83, 89,
97
]
*/
ああ、こういうことね。これだったらわかるわ...