- implemented Multiplication
- changed Cmp to return -1, 0, +1
- added corresponding test cases
R=rsc
DELTA=173 (136 added, 3 deleted, 34 changed)
OCL=33431
CL=33459
diff --git a/src/pkg/big/int_test.go b/src/pkg/big/int_test.go
index 528afdd..4e150ee 100644
--- a/src/pkg/big/int_test.go
+++ b/src/pkg/big/int_test.go
@@ -25,6 +25,14 @@
argZZ{newZ(-1111111110), newZ(-123456789), newZ(-987654321)},
}
+var prodZZ = []argZZ{
+ argZZ{newZ(0), newZ(0), newZ(0)},
+ argZZ{newZ(0), newZ(1), newZ(0)},
+ argZZ{newZ(1), newZ(1), newZ(1)},
+ argZZ{newZ(-991*991), newZ(991), newZ(-991)},
+ // TODO(gri) add larger products
+}
+
func TestSetZ(t *testing.T) {
for _, a := range sumZZ {
@@ -46,7 +54,7 @@
}
-func TestFunZZ(t *testing.T) {
+func TestSumZZ(t *testing.T) {
AddZZ := func(z, x, y *Int) *Int { return z.Add(x, y) };
SubZZ := func(z, x, y *Int) *Int { return z.Sub(x, y) };
for _, a := range sumZZ {
@@ -63,3 +71,49 @@
testFunZZ(t, "SubZZ symmetric", SubZZ, arg);
}
}
+
+
+func TestProdZZ(t *testing.T) {
+ MulZZ := func(z, x, y *Int) *Int { return z.Mul(x, y) };
+ for _, a := range prodZZ {
+ arg := a;
+ testFunZZ(t, "MulZZ", MulZZ, arg);
+
+ arg = argZZ{a.z, a.y, a.x};
+ testFunZZ(t, "MulZZ symmetric", MulZZ, arg);
+ }
+}
+
+
+var facts = map[int] string {
+ 0: "1",
+ 1: "1",
+ 2: "2",
+ 10: "3628800",
+ 20: "2432902008176640000",
+ 100: "933262154439441526816992388562667004907159682643816214685929"
+ "638952175999932299156089414639761565182862536979208272237582"
+ "51185210916864000000000000000000000000",
+}
+
+
+func fact(n int) *Int {
+ var z Int;
+ z.New(1);
+ for i := 2; i <= n; i++ {
+ var t Int;
+ t.New(int64(i));
+ z.Mul(&z, &t);
+ }
+ return &z;
+}
+
+
+func TestFact(t *testing.T) {
+ for n, s := range facts {
+ f := fact(n).String();
+ if f != s {
+ t.Errorf("%d! = %s; want %s", n, f, s);
+ }
+ }
+}