collatz with go 1.22

This commit is contained in:
Bedir Tuğra Karaabalı 2025-08-27 19:46:59 +03:00
commit 9f035e5f0b
2 changed files with 88 additions and 0 deletions

3
go.mod Normal file
View File

@ -0,0 +1,3 @@
module main
go 1.22.2

85
main.go Normal file
View File

@ -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)
}