diff options
| author | Rob Pike <r@golang.org> | 2009-05-05 17:05:39 -0700 |
|---|---|---|
| committer | Rob Pike <r@golang.org> | 2009-05-05 17:05:39 -0700 |
| commit | b6708b2dad4af458e69fde7fc596ecdce03280d0 (patch) | |
| tree | 11cfc1b980ecce9cb0eec06f49cc53ce05faf350 /src/lib/bignum_test.go | |
| parent | 658b10477a16151de7e4d51657993f95445f11ee (diff) | |
| download | golang-b6708b2dad4af458e69fde7fc596ecdce03280d0.tar.gz | |
directory-per-package step 1: move files from lib/X.go to lib/X/X.go
no substantive changes except:
- new Makefiles, all auto-generated
- go/src/lib/Makefile has been extensively edited
R=rsc
OCL=28310
CL=28310
Diffstat (limited to 'src/lib/bignum_test.go')
| -rw-r--r-- | src/lib/bignum_test.go | 482 |
1 files changed, 0 insertions, 482 deletions
diff --git a/src/lib/bignum_test.go b/src/lib/bignum_test.go deleted file mode 100644 index 9351c2ebf..000000000 --- a/src/lib/bignum_test.go +++ /dev/null @@ -1,482 +0,0 @@ -// Copyright 2009 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 bignum_test - -import ( - bignum "bignum"; - fmt "fmt"; - testing "testing"; -) - -const ( - sa = "991"; - sb = "2432902008176640000"; // 20! - sc = "933262154439441526816992388562667004907159682643816214685929" - "638952175999932299156089414639761565182862536979208272237582" - "51185210916864000000000000000000000000"; // 100! - sp = "170141183460469231731687303715884105727"; // prime -) - -func natFromString(s string, base uint, slen *int) bignum.Natural { - x, _, len := bignum.NatFromString(s, base); - if slen != nil { - *slen = len; - } - return x; -} - - -func intFromString(s string, base uint, slen *int) *bignum.Integer { - x, _, len := bignum.IntFromString(s, base); - if slen != nil { - *slen = len; - } - return x; -} - - -func ratFromString(s string, base uint, slen *int) *bignum.Rational { - x, _, len := bignum.RatFromString(s, base); - if slen != nil { - *slen = len; - } - return x; -} - - -var ( - nat_zero = bignum.Nat(0); - nat_one = bignum.Nat(1); - nat_two = bignum.Nat(2); - - a = natFromString(sa, 10, nil); - b = natFromString(sb, 10, nil); - c = natFromString(sc, 10, nil); - p = natFromString(sp, 10, nil); - - int_zero = bignum.Int(0); - int_one = bignum.Int(1); - int_two = bignum.Int(2); - - ip = intFromString(sp, 10, nil); - - rat_zero = bignum.Rat(0, 1); - rat_half = bignum.Rat(1, 2); - rat_one = bignum.Rat(1, 1); - rat_two = bignum.Rat(2, 1); -) - - -var test_msg string; -var tester *testing.T; - -func test(n uint, b bool) { - if !b { - tester.Fatalf("TEST failed: %s (%d)", test_msg, n); - } -} - - -func nat_eq(n uint, x, y bignum.Natural) { - if x.Cmp(y) != 0 { - tester.Fatalf("TEST failed: %s (%d)\nx = %v\ny = %v", test_msg, n, &x, &y); - } -} - - -func int_eq(n uint, x, y *bignum.Integer) { - if x.Cmp(y) != 0 { - tester.Fatalf("TEST failed: %s (%d)\nx = %v\ny = %v", test_msg, n, x, y); - } -} - - -func rat_eq(n uint, x, y *bignum.Rational) { - if x.Cmp(y) != 0 { - tester.Fatalf("TEST failed: %s (%d)\nx = %v\ny = %v", test_msg, n, x, y); - } -} - -func TestNatConv(t *testing.T) { - tester = t; - test_msg = "NatConvA"; - nat_eq(0, a, bignum.Nat(991)); - nat_eq(1, b, bignum.Fact(20)); - nat_eq(2, c, bignum.Fact(100)); - test(3, a.String() == sa); - test(4, b.String() == sb); - test(5, c.String() == sc); - - test_msg = "NatConvB"; - var slen int; - nat_eq(10, natFromString("0", 0, nil), nat_zero); - nat_eq(11, natFromString("123", 0, nil), bignum.Nat(123)); - nat_eq(12, natFromString("077", 0, nil), bignum.Nat(7*8 + 7)); - nat_eq(13, natFromString("0x1f", 0, nil), bignum.Nat(1*16 + 15)); - nat_eq(14, natFromString("0x1fg", 0, &slen), bignum.Nat(1*16 + 15)); - test(4, slen == 4); - - test_msg = "NatConvC"; - tmp := c.Mul(c); - for base := uint(2); base <= 16; base++ { - nat_eq(base, natFromString(tmp.ToString(base), base, nil), tmp); - } - - test_msg = "NatConvD"; - x := bignum.Nat(100); - y, b, _ := bignum.NatFromString(fmt.Sprintf("%b", &x), 2); - nat_eq(100, y, x); -} - - -func TestIntConv(t *testing.T) { - tester = t; - test_msg = "IntConv"; - var slen int; - int_eq(0, intFromString("0", 0, nil), int_zero); - int_eq(1, intFromString("-0", 0, nil), int_zero); - int_eq(2, intFromString("123", 0, nil), bignum.Int(123)); - int_eq(3, intFromString("-123", 0, nil), bignum.Int(-123)); - int_eq(4, intFromString("077", 0, nil), bignum.Int(7*8 + 7)); - int_eq(5, intFromString("-077", 0, nil), bignum.Int(-(7*8 + 7))); - int_eq(6, intFromString("0x1f", 0, nil), bignum.Int(1*16 + 15)); - int_eq(7, intFromString("-0x1f", 0, &slen), bignum.Int(-(1*16 + 15))); - test(7, slen == 5); - int_eq(8, intFromString("+0x1f", 0, &slen), bignum.Int(+(1*16 + 15))); - test(8, slen == 5); - int_eq(9, intFromString("0x1fg", 0, &slen), bignum.Int(1*16 + 15)); - test(9, slen == 4); - int_eq(10, intFromString("-0x1fg", 0, &slen), bignum.Int(-(1*16 + 15))); - test(10, slen == 5); -} - - -func TestRatConv(t *testing.T) { - tester = t; - test_msg = "RatConv"; - var slen int; - rat_eq(0, ratFromString("0", 0, nil), rat_zero); - rat_eq(1, ratFromString("0/1", 0, nil), rat_zero); - rat_eq(2, ratFromString("0/01", 0, nil), rat_zero); - rat_eq(3, ratFromString("0x14/10", 0, &slen), rat_two); - test(4, slen == 7); - rat_eq(5, ratFromString("0.", 0, nil), rat_zero); - rat_eq(6, ratFromString("0.001f", 10, nil), bignum.Rat(1, 1000)); - rat_eq(7, ratFromString("10101.0101", 2, nil), bignum.Rat(0x155, 1<<4)); - rat_eq(8, ratFromString("-0003.145926", 10, &slen), bignum.Rat(-3145926, 1000000)); - test(9, slen == 12); -} - - -func add(x, y bignum.Natural) bignum.Natural { - z1 := x.Add(y); - z2 := y.Add(x); - if z1.Cmp(z2) != 0 { - tester.Fatalf("addition not symmetric:\n\tx = %v\n\ty = %t", x, y); - } - return z1; -} - - -func sum(n uint, scale bignum.Natural) bignum.Natural { - s := nat_zero; - for ; n > 0; n-- { - s = add(s, bignum.Nat(n).Mul(scale)); - } - return s; -} - - -func TestNatAdd(t *testing.T) { - tester = t; - test_msg = "NatAddA"; - nat_eq(0, add(nat_zero, nat_zero), nat_zero); - nat_eq(1, add(nat_zero, c), c); - - test_msg = "NatAddB"; - for i := uint(0); i < 100; i++ { - t := bignum.Nat(i); - nat_eq(i, sum(i, c), t.Mul(t).Add(t).Shr(1).Mul(c)); - } -} - - -func mul(x, y bignum.Natural) bignum.Natural { - z1 := x.Mul(y); - z2 := y.Mul(x); - if z1.Cmp(z2) != 0 { - tester.Fatalf("multiplication not symmetric:\n\tx = %v\n\ty = %t", x, y); - } - if !x.IsZero() && z1.Div(x).Cmp(y) != 0 { - tester.Fatalf("multiplication/division not inverse (A):\n\tx = %v\n\ty = %t", x, y); - } - if !y.IsZero() && z1.Div(y).Cmp(x) != 0 { - tester.Fatalf("multiplication/division not inverse (B):\n\tx = %v\n\ty = %t", x, y); - } - return z1; -} - - -func TestNatSub(t *testing.T) { - tester = t; - test_msg = "NatSubA"; - nat_eq(0, nat_zero.Sub(nat_zero), nat_zero); - nat_eq(1, c.Sub(nat_zero), c); - - test_msg = "NatSubB"; - for i := uint(0); i < 100; i++ { - t := sum(i, c); - for j := uint(0); j <= i; j++ { - t = t.Sub(mul(bignum.Nat(j), c)); - } - nat_eq(i, t, nat_zero); - } -} - - -func TestNatMul(t *testing.T) { - tester = t; - test_msg = "NatMulA"; - nat_eq(0, mul(c, nat_zero), nat_zero); - nat_eq(1, mul(c, nat_one), c); - - test_msg = "NatMulB"; - nat_eq(0, b.Mul(bignum.MulRange(0, 100)), nat_zero); - nat_eq(1, b.Mul(bignum.MulRange(21, 100)), c); - - test_msg = "NatMulC"; - const n = 100; - p := b.Mul(c).Shl(n); - for i := uint(0); i < n; i++ { - nat_eq(i, mul(b.Shl(i), c.Shl(n-i)), p); - } -} - - -func TestNatDiv(t *testing.T) { - tester = t; - test_msg = "NatDivA"; - nat_eq(0, c.Div(nat_one), c); - nat_eq(1, c.Div(bignum.Nat(100)), bignum.Fact(99)); - nat_eq(2, b.Div(c), nat_zero); - nat_eq(4, nat_one.Shl(100).Div(nat_one.Shl(90)), nat_one.Shl(10)); - nat_eq(5, c.Div(b), bignum.MulRange(21, 100)); - - test_msg = "NatDivB"; - const n = 100; - p := bignum.Fact(n); - for i := uint(0); i < n; i++ { - nat_eq(100+i, p.Div(bignum.MulRange(1, i)), bignum.MulRange(i+1, n)); - } -} - - -func TestIntQuoRem(t *testing.T) { - tester = t; - test_msg = "IntQuoRem"; - type T struct { x, y, q, r int }; - a := []T{ - T{+8, +3, +2, +2}, - T{+8, -3, -2, +2}, - T{-8, +3, -2, -2}, - T{-8, -3, +2, -2}, - T{+1, +2, 0, +1}, - T{+1, -2, 0, +1}, - T{-1, +2, 0, -1}, - T{-1, -2, 0, -1}, - }; - for i := uint(0); i < uint(len(a)); i++ { - e := &a[i]; - x, y := bignum.Int(e.x).Mul(ip), bignum.Int(e.y).Mul(ip); - q, r := bignum.Int(e.q), bignum.Int(e.r).Mul(ip); - qq, rr := x.QuoRem(y); - int_eq(4*i+0, x.Quo(y), q); - int_eq(4*i+1, x.Rem(y), r); - int_eq(4*i+2, qq, q); - int_eq(4*i+3, rr, r); - } -} - - -func TestIntDivMod(t *testing.T) { - tester = t; - test_msg = "IntDivMod"; - type T struct { x, y, q, r int }; - a := []T{ - T{+8, +3, +2, +2}, - T{+8, -3, -2, +2}, - T{-8, +3, -3, +1}, - T{-8, -3, +3, +1}, - T{+1, +2, 0, +1}, - T{+1, -2, 0, +1}, - T{-1, +2, -1, +1}, - T{-1, -2, +1, +1}, - }; - for i := uint(0); i < uint(len(a)); i++ { - e := &a[i]; - x, y := bignum.Int(e.x).Mul(ip), bignum.Int(e.y).Mul(ip); - q, r := bignum.Int(e.q), bignum.Int(e.r).Mul(ip); - qq, rr := x.DivMod(y); - int_eq(4*i+0, x.Div(y), q); - int_eq(4*i+1, x.Mod(y), r); - int_eq(4*i+2, qq, q); - int_eq(4*i+3, rr, r); - } -} - - -func TestNatMod(t *testing.T) { - tester = t; - test_msg = "NatModA"; - for i := uint(0); ; i++ { - d := nat_one.Shl(i); - if d.Cmp(c) < 0 { - nat_eq(i, c.Add(d).Mod(c), d); - } else { - nat_eq(i, c.Add(d).Div(c), nat_two); - nat_eq(i, c.Add(d).Mod(c), d.Sub(c)); - break; - } - } -} - - -func TestNatShift(t *testing.T) { - tester = t; - test_msg = "NatShift1L"; - test(0, b.Shl(0).Cmp(b) == 0); - test(1, c.Shl(1).Cmp(c) > 0); - - test_msg = "NatShift1R"; - test(3, b.Shr(0).Cmp(b) == 0); - test(4, c.Shr(1).Cmp(c) < 0); - - test_msg = "NatShift2"; - for i := uint(0); i < 100; i++ { - test(i, c.Shl(i).Shr(i).Cmp(c) == 0); - } - - test_msg = "NatShift3L"; - { const m = 3; - p := b; - f := bignum.Nat(1<<m); - for i := uint(0); i < 100; i++ { - nat_eq(i, b.Shl(i*m), p); - p = mul(p, f); - } - } - - test_msg = "NatShift3R"; - { p := c; - for i := uint(0); !p.IsZero(); i++ { - nat_eq(i, c.Shr(i), p); - p = p.Shr(1); - } - } -} - - -func TestIntShift(t *testing.T) { - tester = t; - test_msg = "IntShift1L"; - test(0, ip.Shl(0).Cmp(ip) == 0); - test(1, ip.Shl(1).Cmp(ip) > 0); - - test_msg = "IntShift1R"; - test(0, ip.Shr(0).Cmp(ip) == 0); - test(1, ip.Shr(1).Cmp(ip) < 0); - - test_msg = "IntShift2"; - for i := uint(0); i < 100; i++ { - test(i, ip.Shl(i).Shr(i).Cmp(ip) == 0); - } - - test_msg = "IntShift3L"; - { const m = 3; - p := ip; - f := bignum.Int(1<<m); - for i := uint(0); i < 100; i++ { - int_eq(i, ip.Shl(i*m), p); - p = p.Mul(f); - } - } - - test_msg = "IntShift3R"; - { p := ip; - for i := uint(0); p.IsPos(); i++ { - int_eq(i, ip.Shr(i), p); - p = p.Shr(1); - } - } - - test_msg = "IntShift4R"; - //int_eq(0, bignum.Int(-43).Shr(1), bignum.Int(-43 >> 1)); - //int_eq(1, ip.Neg().Shr(10), ip.Neg().Div(bignum.Int(1).Shl(10))); -} - - -func TestNatCmp(t *testing.T) { - tester = t; - test_msg = "NatCmp"; - test(0, a.Cmp(a) == 0); - test(1, a.Cmp(b) < 0); - test(2, b.Cmp(a) > 0); - test(3, a.Cmp(c) < 0); - d := c.Add(b); - test(4, c.Cmp(d) < 0); - test(5, d.Cmp(c) > 0); -} - - -func TestNatLog2(t *testing.T) { - tester = t; - test_msg = "NatLog2A"; - test(0, nat_one.Log2() == 0); - test(1, nat_two.Log2() == 1); - test(2, bignum.Nat(3).Log2() == 1); - test(3, bignum.Nat(4).Log2() == 2); - - test_msg = "NatLog2B"; - for i := uint(0); i < 100; i++ { - test(i, nat_one.Shl(i).Log2() == i); - } -} - - -func TestNatGcd(t *testing.T) { - tester = t; - test_msg = "NatGcdA"; - f := bignum.Nat(99991); - nat_eq(0, b.Mul(f).Gcd(c.Mul(f)), bignum.MulRange(1, 20).Mul(f)); -} - - -func TestNatPow(t *testing.T) { - tester = t; - test_msg = "NatPowA"; - nat_eq(0, nat_two.Pow(0), nat_one); - - test_msg = "NatPowB"; - for i := uint(0); i < 100; i++ { - nat_eq(i, nat_two.Pow(i), nat_one.Shl(i)); - } -} - - -func TestNatPop(t *testing.T) { - tester = t; - test_msg = "NatPopA"; - test(0, nat_zero.Pop() == 0); - test(1, nat_one.Pop() == 1); - test(2, bignum.Nat(10).Pop() == 2); - test(3, bignum.Nat(30).Pop() == 4); - test(4, bignum.Nat(0x1248f).Shl(33).Pop() == 8); - - test_msg = "NatPopB"; - for i := uint(0); i < 100; i++ { - test(i, nat_one.Shl(i).Sub(nat_one).Pop() == i); - } -} - |
