詳しくはリンク先参照。とりあえずRustで書いてみた。
- C#で「エラトステネスの篩」で「2.6秒で百万個」の素数を計算できる「無限シーケンス」を作ってみた
- Golangで「エラトステネスの篩」で「2.1秒で百万個」の素数を計算できる「無限シーケンス」を作ってみた
use std::collections::HashMap;
fn main() {
let mut dict = HashMap::new();
let mut iter = (1..).filter_map(|j| {
let i = 2 * j + 1;
let (factor, is_prime) = match dict.remove(&i) {
Some(f) => (f, false),
None => (i * 2, true),
};
let key = (1..)
.filter_map(|j| {
let k = i + j * factor;
if dict.contains_key(&k) { None } else { Some(k) }
})
.next()
.unwrap();
dict.insert(key, factor);
if is_prime { Some(i) } else { None }
});
println!("{}", iter.nth(1000_000 - 2).unwrap());
}
step_byが欲しかった。