package main

// The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.
// Find the sum of all the primes below two million.

import (
	"fmt"
	"time"
)

func getRange(min, max int) (nums []int) {
	size := max - min
	nums = make([]int, size)
	for i := 0; i < size; i++ {
		nums[i] = i + min
	}
	return
}

func nextP(nums []int, p int) int {
	newIx := (p - 2) + 1
	for ; nums[newIx] == 0 && newIx < len(nums); newIx++ {
	}
	return nums[newIx]
}

func ithN(nums []int, targetIx int) int {
	for numsFound, vecIx := 0, 0; vecIx < len(nums); vecIx++ {
		if nums[vecIx] != 0 {
			if numsFound == targetIx {
				return nums[vecIx]
			}
			numsFound++
		}
	}
	return 0
}

func sieveTo(max int) (primes []int) {
	primes = getRange(2, max)
	for i, p := 0, 2; p * p < max; i++ {
		for multIx := (p * p) - 2; multIx + 2 < max; multIx += p {
			primes[multIx] = 0
		}
		p = ithN(primes, i + 1)
	}
	return
}

func sum(n []int) (sum uint64) {
	for i := 0; i < len(n); i++ {
		sum += uint64(n[i])
	}
	return
}

func main() {
	start := time.Now()
	fmt.Println(sum(sieveTo(200000)))
	bench := time.Now().Sub(start)
	fmt.Println(bench)
}