blob: 3ff277e3851f879251d6f25a659371129168dad4 [file] [log] [blame]
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
}