package gcd import ( "math/big" "testing" "testing/quick" ) func TestGCD(t *testing.T) { f := func(u, v uint8) bool { if u == 0 || v == 0 { return true } result := GCD(uint64(u), uint64(v)) bigU := big.NewInt(int64(u)) bigV := big.NewInt(int64(v)) bigU.GCD(nil, nil, bigU, bigV) ok := bigU.Int64() == int64(result) if !ok { t.Logf("we got %d, they got %d", result, bigU.Int64()) } return ok } err := quick.Check(f, &quick.Config{}) if err != nil { t.Fatal(err) } } func BenchmarkBigGCD(b *testing.B) { for i := 0; i < b.N; i++ { u := big.NewInt(int64(i * 2)) v := big.NewInt(int64(i * 3)) u.GCD(nil, nil, u, v) } } // BenchmarkBigGCD-4 3000000 467 ns/op 320 B/op 8 allocs/op // BenchmarkBinaryGCD-4 100000000 12.2 ns/op 0 B/op 0 allocs/op func BenchmarkBinaryGCD(b *testing.B) { for i := 0; i < b.N; i++ { u := uint64(i * 2) v := uint64(i * 3) math.GCD(u, v) } }