#FEATURE
authorClaus Gittinger <cg@exept.de>
Fri, 26 Feb 2016 11:11:21 +0100
changeset 1313 fa1a08692b4d
parent 1312 b7172ac2c2bd
child 1314 b17d08bc2aef
#FEATURE class: RegressionTests::IntegerTest added: #testBinco #testLargeDivision4 #testLargeDivision5 changed: #testDivision3 #testLargeDivision (send #absDestructiveSubtract: instead of #absSubtract:) #testLargeDivision2 (send #absDestructiveSubtract: instead of #absSubtract:) #testLargeIntegerHelpers2
RegressionTests__IntegerTest.st
--- a/RegressionTests__IntegerTest.st	Fri Feb 26 09:30:52 2016 +0100
+++ b/RegressionTests__IntegerTest.st	Fri Feb 26 11:11:21 2016 +0100
@@ -704,6 +704,17 @@
     "Modified: / 31.10.2000 / 20:23:20 / cg"
 !
 
+testBinco
+     self assert: (10 binomialCoefficient:5) = (10 factorial / (5 factorial * 5 factorial)).
+     self assert: (100 binomialCoefficient:78) = (100 factorial / (78 factorial * (100-78) factorial)).
+     self assert: (1000 binomialCoefficient:5) = (1000 factorial / (5 factorial * (1000-5) factorial)).
+     self assert: (10000 binomialCoefficient:78) = (10000 factorial / (78 factorial * (10000-78) factorial)).
+
+    "
+     self basicNew testBinco
+    "
+!
+
 testByteSwap
     "/ <testedMethods: #( (Integer >> #byteSwapped32) (Integer >> #byteSwapped64)) >
 
@@ -1242,18 +1253,21 @@
         16r00FFFFFFFFFFFFFFFF
         16rFFFFFFFFFFFFFFFFFF
     ) do:[:m |
+        Transcript showCR:m.
         nr := 1.
-        1 to:1000 do:[:n |
+        1 to:100 do:[:n |
             nr := nr * m
         ].
-        1 to:1000 do:[:n |
+        1 to:100 do:[:n |
             nr := nr / m
         ].
         self assert:(nr == 1).
     ].
 
     "
-     self new testDivision2
+     self new testDivision3
+     Time millisecondsToRun:[ self new testDivision3 ] 14440
+     MessageTally spyOn:[ self new testDivision3 ] 
     "
 !
 
@@ -2303,16 +2317,16 @@
 
     t := 20 factorial.
     t := t + 21 factorial.
-    t absSubtract:21 factorial.
+    t absDestructiveSubtract:21 factorial.
     self assert:(t compressed = 20 factorial).
 
     self assert:(
-	     [
-	       |v|
-	       v := 100 factorial copy.
-	       v absSubtract:99 factorial.
-	       v compressed = (100 factorial - 99 factorial).
-	     ] value).
+             [
+               |v|
+               v := 100 factorial copy.
+               v absDestructiveSubtract:99 factorial.
+               v compressed = (100 factorial - 99 factorial).
+             ] value).
 
     "Large // Large division"
     self assert:((20 factorial // 19 factorial) == 20).
@@ -2438,7 +2452,7 @@
 
     t := 30 factorial.
     t := t + 31 factorial.
-    t absSubtract:31 factorial.
+    t absDestructiveSubtract:31 factorial.
     self assert:(t compressed = 30 factorial).
 
     "Large // Large division"
@@ -2477,6 +2491,74 @@
     "
 !
 
+testLargeDivision4
+    self assert:(9000000000 \\ 4000000000)    = (900 \\ 400 * 10000000).
+    self assert:(-9000000000 \\ 4000000000)   = (-900 \\ 400 * 10000000).
+    self assert:(9000000000 \\ -4000000000)   = (900 \\ -400 * 10000000).
+    self assert:(-9000000000 \\ -4000000000)  = (-900 \\ -400 * 10000000).
+    self assert:(16000000000 \\ 4000000000)   = (1600 \\ 400 * 10000000).
+    self assert:(-16000000000 \\ 4000000000)  = (-1600 \\ 400 * 10000000).
+    self assert:(16000000000 \\ -4000000000)  = (1600 \\ -400 * 10000000).
+    self assert:(-16000000000 \\ -4000000000) = (-1600 \\ -400 * 10000000).
+
+    self assert:(9000000000000000000 \\ 4000000000000000000)    = (900 \\ 400 * 10000000000000000).
+    self assert:(-9000000000000000000 \\ 4000000000000000000)   = (-900 \\ 400 * 10000000000000000).
+    self assert:(9000000000000000000 \\ -4000000000000000000)   = (900 \\ -400 * 10000000000000000).
+    self assert:(-9000000000000000000 \\ -4000000000000000000)  = (-900 \\ -400 * 10000000000000000).
+    self assert:(16000000000000000000 \\ 4000000000000000000)   = (1600 \\ 400 * 10000000000000000).
+    self assert:(-16000000000000000000 \\ 4000000000000000000)  = (-1600 \\ 400 * 10000000000000000).
+    self assert:(16000000000000000000 \\ -4000000000000000000)  = (1600 \\ -400 * 10000000000000000).
+    self assert:(-16000000000000000000 \\ -4000000000000000000) = (-1600 \\ -400 * 10000000000000000).
+
+    self assert:(9000000000 \\ 7) = 5.
+    self assert:(-9000000000 \\ 7) = 2.
+    self assert:(9000000000 \\ -7) = -2.
+    self assert:(-9000000000 \\ -7) = -5.
+
+    self assert:(900 rem: 400) = 100.
+    self assert:(-900 rem: 400) = -100.
+    self assert:(900 rem: -400) = 100.
+    self assert:(-900 rem: -400) = -100.
+
+    self assert:(9000000000 rem: 4000000000) = 1000000000.
+    self assert:(-9000000000 rem: 4000000000) = -1000000000.
+    self assert:(9000000000 rem: -4000000000) = 1000000000.
+    self assert:(-9000000000 rem: -4000000000) = -1000000000.
+    
+    "
+     self basicNew testLargeDivision4
+    "
+!
+
+testLargeDivision5
+    self assert:(9000000000 quo: 4000000000)    = ((900 quo: 400) ).
+    self assert:(-9000000000 quo: 4000000000)   = ((-900 quo: 400) ).
+    self assert:(9000000000 quo: -4000000000)   = ((900 quo: -400) ).
+    self assert:(-9000000000 quo: -4000000000)  = ((-900 quo: -400) ).
+    self assert:(16000000000 quo: 4000000000)   = ((1600 quo: 400) ).
+    self assert:(-16000000000 quo: 4000000000)  = ((-1600 quo: 400) ).
+    self assert:(16000000000 quo: -4000000000)  = ((1600 quo: -400) ).
+    self assert:(-16000000000 quo: -4000000000) = ((-1600 quo: -400) ).
+
+    self assert:(9000000000000000000 quo: 4000000000000000000)    = ((900 quo: 400) ).
+    self assert:(-9000000000000000000 quo: 4000000000000000000)   = ((-900 quo: 400) ).
+    self assert:(9000000000000000000 quo: -4000000000000000000)   = ((900 quo: -400) ).
+    self assert:(-9000000000000000000 quo: -4000000000000000000)  = ((-900 quo: -400) ).
+    self assert:(16000000000000000000 quo: 4000000000000000000)   = ((1600 quo: 400) ).
+    self assert:(-16000000000000000000 quo: 4000000000000000000)  = ((-1600 quo: 400) ).
+    self assert:(16000000000000000000 quo: -4000000000000000000)  = ((1600 quo: -400) ).
+    self assert:(-16000000000000000000 quo: -4000000000000000000) = ((-1600 quo: -400) ).
+
+    self assert:(9000000000 quo: 7) = 1285714285.
+    self assert:(-9000000000 quo: 7) = -1285714285.
+    self assert:(9000000000 quo: -7) = -1285714285.
+    self assert:(-9000000000 quo: -7) = 1285714285.
+    
+    "
+     self basicNew testLargeDivision5
+    "
+!
+
 testLargeIntegerHelpers
     |t1 t2|
 
@@ -2587,83 +2669,83 @@
 
     "/ absSubtract:
 
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] sign:1.
-    r := t1 absSubtract:16r00ffffffffffffffff.
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r00ffffffffffffffff.
     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
     self assert:(r == true).
 
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] sign:1.
-    r := t1 absSubtract:16r010000000000000000.
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r010000000000000000.
     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
     self assert:(r == false).
 
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] sign:1.
-    r := t1 absSubtract:16r00ffffffffffffffffff.
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r00ffffffffffffffffff.
     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
     self assert:(r == true).
 
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] sign:1.
-    r := t1 absSubtract:16r01000000000000000000.
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r01000000000000000000.
     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
     self assert:(r == false).
 
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] sign:1.
-    r := t1 absSubtract:16r00ffffffffffffffffffff.
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r00ffffffffffffffffffff.
     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
     self assert:(r == true).
 
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] sign:1.
-    r := t1 absSubtract:16r0100000000000000000000.
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r0100000000000000000000.
     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
     self assert:(r == false).
 
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] sign:1.
-    r := t1 absSubtract:16r00ffffffffffffffffffffff.
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffff.
     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
     self assert:(r == true).
 
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] sign:1.
-    r := t1 absSubtract:16r010000000000000000000000.
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r010000000000000000000000.
     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
     self assert:(r == false).
 
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] sign:1.
-    r := t1 absSubtract:16r00ffffffffffffffffffffffff.
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffffff.
     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
     self assert:(r == true).
 
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] sign:1.
-    r := t1 absSubtract:16r01000000000000000000000000.
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r01000000000000000000000000.
     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
     self assert:(r == false).
 
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] sign:1.
-    r := t1 absSubtract:16r00ffffffffffffffffffffffffff.
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffffffff.
     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
     self assert:(r == true).
 
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] sign:1.
-    r := t1 absSubtract:16r0100000000000000000000000000.
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r0100000000000000000000000000.
     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
     self assert:(r == false).
 
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] sign:1.
-    r := t1 absSubtract:16r00ffffffffffffffffffffffffffff.
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffffffffff.
     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
     self assert:(r == true).
 
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] sign:1.
-    r := t1 absSubtract:16r010000000000000000000000000000.
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r010000000000000000000000000000.
     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
     self assert:(r == false).
 
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] sign:1.
-    r := t1 absSubtract:16r00ffffffffffffffffffffffffffffff.
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffffffffffff.
     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
     self assert:(r == true).
 
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] sign:1.
-    r := t1 absSubtract:16r01000000000000000000000000000000.
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r01000000000000000000000000000000.
     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
     self assert:(r == false).
     "