func r32() *mathutil.FC32 { r, err := mathutil.NewFC32(math.MinInt32, math.MaxInt32, true) if err != nil { panic(err) } return r }
func TestModPow2(t *testing.T) { const N = 1e3 data := []struct{ e, m uint32 }{ // e == 0 -> x == 0 {0, 2}, {0, 3}, {0, 4}, {1, 2}, {1, 3}, {1, 4}, {1, 5}, {2, 2}, {2, 3}, {2, 4}, {2, 5}, {3, 2}, {3, 3}, {3, 4}, {3, 5}, {3, 6}, {3, 7}, {3, 8}, {3, 9}, {4, 2}, {4, 3}, {4, 4}, {4, 5}, {4, 6}, {4, 7}, {4, 8}, {4, 9}, } var got big.Int f := func(e, m uint32) { x := ModPow2(e, m) exp := ModPow(2, e, m) got.SetInt64(0) got.SetBit(&got, int(x), 1) if got.Cmp(exp) != 0 { t.Fatalf("\ne %d, m %d\ng: %s\ne: %s", e, m, &got, exp) } } for _, v := range data { f(v.e, v.m) } rg, _ := mathutil.NewFC32(2, 1<<10, true) for i := 0; i < N; i++ { f(uint32(rg.Next()), uint32(rg.Next())) } }
func TestMod(t *testing.T) { const N = 1e4 data := []struct { mod, n int64 exp uint32 }{ {0, 0x00, 3}, {1, 0x01, 3}, {3, 0x03, 3}, {0, 0x07, 3}, {1, 0x0f, 3}, {3, 0x1f, 3}, {0, 0x3f, 3}, {1, 0x7f, 3}, {3, 0xff, 3}, {0, 0x1ff, 3}, } var mod, n big.Int for _, v := range data { n.SetInt64(v.n) p := Mod(&mod, &n, v.exp) if p != &mod { t.Fatal(p) } if g, e := mod.Int64(), v.mod; g != e { t.Fatal(v.n, v.exp, g, e) } } f := func(in int64, exp uint32) { n.SetInt64(in) mod.Mod(&n, New(exp)) e := mod.Int64() Mod(&mod, &n, exp) g := mod.Int64() if g != e { t.Fatal(in, exp, g, e) } } r32, _ := mathutil.NewFC32(1, 1e6, true) r64, _ := mathutil.NewFCBig(_0, big.NewInt(math.MaxInt64), true) for i := 0; i < N; i++ { f(r64.Next().Int64(), uint32(r32.Next())) } }
func TestModPow(t *testing.T) { const N = 2e2 data := []struct{ b, e, m, r uint32 }{ {0, 1, 1, 0}, {0, 2, 1, 0}, {0, 3, 1, 0}, {1, 0, 1, 0}, {1, 1, 1, 0}, {1, 2, 1, 0}, {1, 3, 1, 0}, {2, 0, 1, 0}, {2, 1, 1, 0}, {2, 2, 1, 0}, {2, 3, 1, 0}, {2, 3, 4, 8}, {2, 3, 5, 4}, {2, 4, 3, 1}, {3, 3, 3, 3}, {3, 4, 5, 30}, } f := func(b, e, m uint32, expect *big.Int) { got := ModPow(b, e, m) if got.Cmp(expect) != 0 { t.Fatal(b, e, m, got, expect) } } var r big.Int for _, v := range data { r.SetInt64(int64(v.r)) f(v.b, v.e, v.m, &r) } rg, _ := mathutil.NewFC32(2, 1<<10, true) var bb big.Int for i := 0; i < N; i++ { b, e, m := uint32(rg.Next()), uint32(rg.Next()), uint32(rg.Next()) bb.SetInt64(int64(b)) f(b, e, m, mathutil.ModPowBigInt(&bb, New(e), New(m))) } }
// $ go run example2.go # view rand.png and rnd.png by your favorite pic viewer // // see http://www.boallen.com/random-numbers.html func main() { sqr := image.Rect(0, 0, 511, 511) r, err := mathutil.NewFC32(math.MinInt32, math.MaxInt32, true) if err != nil { log.Fatal("NewFC32", err) } img := image.NewGray(sqr) for y := 0; y < 512; y++ { for x := 0; x < 512; x++ { if r.Next()&1 != 0 { img.Set(x, y, image.White) } } } buf := bytes.NewBuffer(nil) if err := png.Encode(buf, img); err != nil { log.Fatal("Encode rnd.png ", err) } if err := ioutil.WriteFile("rnd.png", buf.Bytes(), 0666); err != nil { log.Fatal("ioutil.WriteFile/rnd.png ", err) } r2 := rand.New(rand.NewSource(0)) img = image.NewGray(sqr) for y := 0; y < 512; y++ { for x := 0; x < 512; x++ { if r2.Int()&1 != 0 { img.Set(x, y, image.White) } } } buf = bytes.NewBuffer(nil) if err := png.Encode(buf, img); err != nil { log.Fatal("Encode rand.png ", err) } if err := ioutil.WriteFile("rand.png", buf.Bytes(), 0666); err != nil { log.Fatal("ioutil.WriteFile/rand.png ", err) } }
/* $ # Usage e.g.: $ go run example.go -max 1024 > mathutil.dat # generate 1kB of "random" data */ func main() { r, err := mathutil.NewFC32(math.MinInt32, math.MaxInt32, true) if err != nil { log.Fatal(err) } var mflag uint64 flag.Uint64Var(&mflag, "max", 0, "limit output to max bytes") flag.Parse() stdout := bufio.NewWriter(os.Stdout) if mflag != 0 { for i := uint64(0); i < mflag; i++ { if err := stdout.WriteByte(byte(r.Next())); err != nil { log.Fatal(err) } } stdout.Flush() return } for stdout.WriteByte(byte(r.Next())) == nil { } }