package sieve

import "log"

const (
	Maybe = iota
	Prime
	NotPrime
)

func Sieve(limit int) []int {
	all := make([]int, limit+1)
	all[0] = NotPrime
	all[1] = NotPrime
	for i := 2; i <= limit; i++ {
		all[i] = Maybe
	}

	for i := 2; i <= limit; i++ {
		if all[i] == NotPrime {
			continue
		}
		all[i] = Prime
		for j := 2; j <= limit/i; j++ {
			all[i*j] = NotPrime
		}
		log.Printf("After %3d: %v\n", i, all)
	}
	res := make([]int, 0, len(all))
	for i, v := range all {
		if v == Prime {
			res = append(res, i)
		}
	}
	return res
}
