3
1

More than 3 years have passed since last update.

JavaScript: 「エラトステネスの篩」を読んで関数にしてみた

Last updated at Posted at 2020-08-07

とくに必要というわけではないのですが、最近、素数づいてるので書きます。

「エラトステネスの篩」の説明の記事を読んで、全然頭に入ってこなくてもやっとしてしまったので。
(記事のせいではないです。だんだん理解力が...)

...困ったときの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
]
*/

ああ、こういうことね。これだったらわかるわ...

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1