// +build ignore,OMIT package main import ( "flag" "fmt" "sort" "sync" ) func main() { n := flag.Int("n", 10, "maximum number to consider") flag.Parse() type pair struct{ n, c int } var pairs []pair for n, c := range countFactorsWideSection(*n) { pairs = append(pairs, pair{n, c}) } sort.Slice(pairs, func(i, j int) bool { return pairs[i].n < pairs[j].n }) for _, p := range pairs { fmt.Printf("%3d: %3d\n", p.n, p.c) } } func countFactorsNarrowSection(n int) map[int]int { m := map[int]int{} var mu sync.Mutex var wg sync.WaitGroup wg.Add(n - 1) for i := 2; i <= n; i++ { go func(i int) { // NARROW OMIT for _, f := range factors(i) { mu.Lock() // HL m[f]++ mu.Unlock() // HL } wg.Done() }(i) } wg.Wait() return m } func countFactorsWideSection(n int) map[int]int { m := map[int]int{} var mu sync.Mutex var wg sync.WaitGroup wg.Add(n - 1) for i := 2; i <= n; i++ { go func(i int) { // WIDE OMIT mu.Lock() // HL for _, f := range factors(i) { m[f]++ } mu.Unlock() // HL wg.Done() }(i) } wg.Wait() return m } func countFactorsSeq(n int) map[int]int { m := map[int]int{} for i := 2; i <= n; i++ { for _, f := range factors(i) { // HL m[f]++ // HL } // HL } return m } func factors(v int) []int { var fs []int for v > 1 { for f := 2; f <= v; f++ { if v%f == 0 { v = v / f fs = append(fs, f) break } } } return fs }