Problem 10 "Summation of primes"
The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.
Find the sum of all the primes below two million.
問 10 「素数の和」
10以下の素数の和は 2 + 3 + 5 + 7 = 17 である.
200万以下の全ての素数の和を求めよ.
struct Index { i: usize, _ite: Box<dyn Iterator<Item = usize>>, } impl Index { fn increment(&mut self) { self.i += self._ite.next().unwrap(); } fn new() -> Self { Self { i: 5, _ite: Box::new(vec![2usize, 4].into_iter().cycle()), } } } fn rule_out(sieve: &mut [bool; 2_000_001], prime: usize) { for i in (prime * prime..sieve.len()).step_by(prime) { sieve[i] = false; } } fn main() { let mut sieve = [true; 2_000_001]; let sqrt = ((sieve.len() - 1) as f64).sqrt() as usize; let mut sum = 2u64 + 3; let mut index = Index::new(); while index.i <= sqrt { if sieve[index.i] { sum += index.i as u64; rule_out(&mut sieve, index.i); } index.increment(); } while index.i < sieve.len() { if sieve[index.i] { sum += index.i as u64; } index.increment(); } println!("{}", sum); assert_eq!(sum, 142913828922); }
mod index { pub struct Index { pub i: usize, ite: Box<dyn Iterator<Item = usize>>, } impl Index { pub fn increment(&mut self) { self.i += self.ite.next().unwrap(); } pub fn new() -> Self { Self { i: 5, ite: Box::new(vec![2usize, 4].into_iter().cycle()), } } } } fn rule_out(sieve: &mut [bool; 2_000_001], prime: usize) { for i in (prime * prime..sieve.len()).step_by(prime) { sieve[i] = false; } } fn main() { let mut sieve = [true; 2_000_001]; let sqrt = ((sieve.len() - 1) as f64).sqrt() as usize; let mut sum = 2u64 + 3; let mut index = index::Index::new(); while index.i <= sqrt { if sieve[index.i] { sum += index.i as u64; rule_out(&mut sieve, index.i); } index.increment(); } while index.i < sieve.len() { if sieve[index.i] { sum += index.i as u64; } index.increment(); } println!("{}", sum); assert_eq!(sum, 142913828922); }
package main
import (
"fmt"
"math"
"testing"
)
type Index struct {
i int
f uint8
}
func (i *Index) increment() {
i.i += 2 << i.f
i.f ^= 1
}
func ruleout(sieve []bool, p int) {
for i := p * p; i < len(sieve); i += p {
sieve[i] = true
}
}
func Example() {
n := 2_000_000
sieve := make([]bool, n+1)
side := int(math.Sqrt(float64(n)))
i := Index{i: 5}
sum := 2 + 3
for i.i <= side {
if !sieve[i.i] {
ruleout(sieve, i.i)
sum += i.i
}
i.increment()
}
for i.i < len(sieve) {
if !sieve[i.i] {
sum += i.i
}
i.increment()
}
fmt.Println(sum)
// Output: 142913828922
}
→ Go playground
function assert(condition: any, msg?: string): asserts condition {
if (!condition) {
throw new Error(msg);
}
}
class Index {
i: number;
#f: number;
constructor() {
this.i = 5;
this.#f = 0;
}
increment() {
this.i += 2 << this.#f;
this.#f ^= 1;
}
}
function ruleout(sieve: boolean[], p: number) {
for (let i = p * p; i < sieve.length; i += p) {
sieve[i] = false;
}
}
const n = 2_000_000;
let sieve = Array(n + 1).fill(true);
const side = Math.sqrt(n) | 0;
let sum = 2 + 3;
const i = new Index();
while (i.i <= side) {
if (sieve[i.i]) {
sum += i.i;
ruleout(sieve, i.i);
}
i.increment();
}
while (i.i < sieve.length) {
if (sieve[i.i]) {
sum += i.i;
}
i.increment();
}
console.log(sum);
assert(sum === 142913828922);
→ TypeScript playground