commit 9f035e5f0b9fa03a704f3591e18e8fcf837c9bb5 Author: bdrtr Date: Wed Aug 27 19:46:59 2025 +0300 collatz with go 1.22 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..020ef36 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module main + +go 1.22.2 diff --git a/main.go b/main.go new file mode 100644 index 0000000..f457038 --- /dev/null +++ b/main.go @@ -0,0 +1,85 @@ +/* + Bedir T. Karaabalı + https://github.com/bdrtr + 2025 + +*/ + +package main + +import ( + "fmt" + "sync" +) + + +type Results struct { + n uint64 + steps uint64 + peak uint64 + xor uint64 +} + +func collatzLenAndPeak(x uint64) (uint64, uint64) { + steps := uint64(0) + peak := x + n := x + + for n != 1 { + if n&1 != 0 { + n = 3*n + 1 + } else { + n >>= 1 + } + + if n > peak { + peak = n + } + steps++ + } + return steps, peak +} + +func main() { + n := uint64(1_000_000) + concurrency := 8 + batchSize := n / uint64(concurrency) + + results := make(chan Results, concurrency) + var wg sync.WaitGroup + + for i := 0; i < concurrency; i++ { + wg.Add(1) + go func(start, end uint64) { + defer wg.Done(); + var localresult Results; + + for j := start; j < end; j++ { + steps, peak := collatzLenAndPeak(j) + if steps > localresult.steps { + localresult = Results{n: j, steps: steps, peak: peak, xor: 0} + } + } + + results <- localresult + }(uint64(i)*batchSize+1, uint64((i+1))*batchSize) + } + + wg.Wait() + close(results) + + bestN := uint64(0) + bestSteps := uint64(0) + bestPeak := uint64(0) + + for res := range results { + + if res.steps > bestSteps { + bestSteps = res.steps + bestN = res.n + bestPeak = res.peak + } + } + + fmt.Printf("Number with the longest Collatz sequence under %d is %d with %d steps and peak %d\n", n, bestN, bestSteps, bestPeak) +} \ No newline at end of file