blob: c658340fd5d7a6ef3fadf5504103639d47489791 [file] [log] [blame]
// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
import (
"fmt"
"os"
)
func main() {
ss, sa := shared(23)
ps, pa := private(23)
es, ea := experiment(23)
fmt.Printf("shared s, a; private, s, a; experiment s, a = %d, %d; %d, %d; %d, %d\n", ss, sa, ps, pa, es, ea)
if ss != ps || ss != es || ea != pa || sa == pa {
os.Exit(11)
} else {
fmt.Println("PASS")
}
}
func experiment(x int) (int, int) {
sum := 0
var is []*int
for i := x; i != 1; i = i / 2 {
for j := 0; j < 10; j++ {
if i == j { // 10 skips
continue
}
sum++
}
i = i*3 + 1
if i&1 == 0 {
is = append(is, &i)
for i&2 == 0 {
i = i >> 1
}
} else {
i = i + i
}
}
asum := 0
for _, pi := range is {
asum += *pi
}
return sum, asum
}
func private(x int) (int, int) {
sum := 0
var is []*int
I := x
for ; I != 1; I = I / 2 {
i := I
for j := 0; j < 10; j++ {
if i == j { // 10 skips
I = i
continue
}
sum++
}
i = i*3 + 1
if i&1 == 0 {
is = append(is, &i)
for i&2 == 0 {
i = i >> 1
}
} else {
i = i + i
}
I = i
}
asum := 0
for _, pi := range is {
asum += *pi
}
return sum, asum
}
func shared(x int) (int, int) {
sum := 0
var is []*int
i := x
for ; i != 1; i = i / 2 {
for j := 0; j < 10; j++ {
if i == j { // 10 skips
continue
}
sum++
}
i = i*3 + 1
if i&1 == 0 {
is = append(is, &i)
for i&2 == 0 {
i = i >> 1
}
} else {
i = i + i
}
}
asum := 0
for _, pi := range is {
asum += *pi
}
return sum, asum
}