--- a/RegressionTests__IntegerTest.st Wed Feb 24 18:31:47 2016 +0000
+++ b/RegressionTests__IntegerTest.st Fri Feb 26 16:36:47 2016 +0000
@@ -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 ]
"
!
@@ -1325,6 +1339,22 @@
self assert:(2 factorial = 2).
self assert:(10 factorial = 3628800).
self assert:(11 factorial = 39916800).
+ self assert:(12 factorial = 479001600).
+ self assert:(13 factorial digitBytes = #[0 204 40 115 1]).
+ self assert:(13 factorial = 6227020800).
+ self assert:(14 factorial digitBytes = #[0 40 59 76 20]).
+ self assert:(14 factorial = 87178291200).
+ self assert:(15 factorial digitBytes = #[0 88 119 119 48 1]).
+ self assert:(15 factorial = 1307674368000).
+ self assert:(16 factorial digitBytes = #[0 128 117 119 7 19]).
+ self assert:(16 factorial = 20922789888000).
+ self assert:(17 factorial digitBytes = #[0 128 205 238 126 67 1]).
+ self assert:(17 factorial = 355687428096000).
+ self assert:(18 factorial digitBytes = #[0 0 115 202 236 190 22]).
+ self assert:(18 factorial = 6402373705728000).
+ self assert:(19 factorial digitBytes = #[0 0 137 6 147 43 176 1]).
+ self assert:(19 factorial = 121645100408832000).
+ self assert:(20 factorial digitBytes = #[0 0 180 130 124 103 195 33]).
self assert:(20 factorial = 2432902008176640000).
self assert:(50 factorial = 30414093201713378043612608166064768844377641568960512000000000000).
@@ -1333,7 +1363,7 @@
"
"Created: / 24-04-2010 / 13:52:23 / cg"
- "Modified: / 27-04-2010 / 10:34:22 / cg"
+ "Modified: / 26-02-2016 / 15:43:16 / cg"
!
testGCD
@@ -1844,11 +1874,11 @@
and via constructed performs. The reason is to test both inlined
JIT-compiler code AND the regular methods code."
- |s n1 n2 x|
-
"Large + Large addition"
self testReading1.
+ self assert:(20 factorial = 2432902008176640000).
+ self assert:(20 factorial printString = '2432902008176640000').
self assert:((20 factorial + 20 factorial) printString = '4865804016353280000').
self assert:((20 factorial + 1) printString = '2432902008176640001').
self assert:((20 factorial + 1000) printString = '2432902008176641000').
@@ -1869,7 +1899,7 @@
self basicNew testLargeAddition
"
- "Modified: / 4.6.1999 / 15:26:55 / cg"
+ "Modified: / 26-02-2016 / 15:39:33 / cg"
!
testLargeAddition1
@@ -2303,16 +2333,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 +2468,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 +2507,124 @@
"
!
+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
+ "
+!
+
+testLargeDivision6
+ |t|
+
+ t := 20 factorial.
+ self assert:(t = 2432902008176640000).
+ t := t / 20.
+ self assert:(t = 19 factorial).
+ self assert:(t = 121645100408832000).
+
+ t := t / 19.
+ self assert:(t = 18 factorial).
+ self assert:(t = 6402373705728000).
+
+ t := t / 18.
+ self assert:(t = 17 factorial).
+ self assert:(t = 355687428096000).
+
+ t := t / 17.
+ self assert:(t = 16 factorial).
+ self assert:(t = 20922789888000).
+
+ t := t / 16.
+ self assert:(t = 15 factorial).
+ self assert:(t = 1307674368000).
+
+ t := t / 15.
+ self assert:(t = 14 factorial).
+ self assert:(t = 87178291200).
+
+ t := t / 14.
+ self assert:(t = 13 factorial).
+ self assert:(t = 6227020800).
+
+ t := t / 13.
+ self assert:(t = 12 factorial).
+ self assert:(t = 479001600).
+
+ t := t / 12.
+ self assert:(t = 11 factorial).
+ self assert:(t = 39916800).
+
+ t := t / 11.
+ self assert:(t = 10 factorial).
+ self assert:(t = 3628800).
+
+ "
+ self basicNew testLargeDivision6
+ "
+!
+
testLargeIntegerHelpers
|t1 t2|
@@ -2582,6 +2730,178 @@
"Modified: / 20.5.1999 / 09:41:19 / cg"
!
+testLargeIntegerHelpers2
+ |t1 r|
+
+ "/ absSubtract:
+
+ 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 ] 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 ] 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 ] 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 ] 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 ] 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 ] 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 ] 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 ] 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 ] 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 ] 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 ] 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 ] 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 ] 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 ] 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 ] 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).
+ "
+ self basicNew testLargeIntegerHelpers2
+ "
+!
+
+testLargeIntegerHelpers3
+ "/ absDivMod:
+
+ self assert:(9000000000000000000 absDivMod: 4000) = #(2250000000000000 0).
+ self assert:(-9000000000000000000 absDivMod: 4000) = #(2250000000000000 0).
+ self assert:(9000000000000000000 absDivMod: -4000) = #(2250000000000000 0).
+ self assert:(-9000000000000000000 absDivMod: -4000) = #(2250000000000000 0).
+
+ self assert:(9000000000000000001 absDivMod: 4000) = #(2250000000000000 1).
+ self assert:(-9000000000000000001 absDivMod: 4000) = #(2250000000000000 1).
+ self assert:(9000000000000000001 absDivMod: -4000) = #(2250000000000000 1).
+ self assert:(-9000000000000000001 absDivMod: -4000) = #(2250000000000000 1).
+
+ self assert:(9000000000000000000 absDivMod: 40000) = #(225000000000000 0).
+ self assert:(-9000000000000000000 absDivMod: 40000) = #(225000000000000 0).
+ self assert:(9000000000000000000 absDivMod: -40000) = #(225000000000000 0).
+ self assert:(-9000000000000000000 absDivMod: -40000) = #(225000000000000 0).
+
+ self assert:(9000000000000000000 absDivMod: 400000) = #(22500000000000 0).
+ self assert:(-9000000000000000000 absDivMod: 400000) = #(22500000000000 0).
+ self assert:(9000000000000000000 absDivMod: -400000) = #(22500000000000 0).
+ self assert:(-9000000000000000000 absDivMod: -400000) = #(22500000000000 0).
+
+ self assert:(9000000000000000000 absDivMod: 4000000) = #(2250000000000 0).
+ self assert:(-9000000000000000000 absDivMod: 4000000) = #(2250000000000 0).
+ self assert:(9000000000000000000 absDivMod: -4000000) = #(2250000000000 0).
+ self assert:(-9000000000000000000 absDivMod: -4000000) = #(2250000000000 0).
+
+ self assert:(9000000000000000000 absDivMod: 40000000) = #(225000000000 0).
+ self assert:(-9000000000000000000 absDivMod: 40000000) = #(225000000000 0).
+ self assert:(9000000000000000000 absDivMod: -40000000) = #(225000000000 0).
+ self assert:(-9000000000000000000 absDivMod: -40000000) = #(225000000000 0).
+
+ self assert:(9000000000000000000 absDivMod: 400000000) = #(22500000000 0).
+ self assert:(-9000000000000000000 absDivMod: 400000000) = #(22500000000 0).
+ self assert:(9000000000000000000 absDivMod: -400000000) = #(22500000000 0).
+ self assert:(-9000000000000000000 absDivMod: -400000000) = #(22500000000 0).
+
+ self assert:(9000000000000000000 absDivMod: 4000000000) = #(2250000000 0).
+ self assert:(-9000000000000000000 absDivMod: 4000000000) = #(2250000000 0).
+ self assert:(9000000000000000000 absDivMod: -4000000000) = #(2250000000 0).
+ self assert:(-9000000000000000000 absDivMod: -4000000000) = #(2250000000 0).
+
+ self assert:(9000000000000000000 absDivMod: 40000000000) = #(225000000 0).
+ self assert:(-9000000000000000000 absDivMod: 40000000000) = #(225000000 0).
+ self assert:(9000000000000000000 absDivMod: -40000000000) = #(225000000 0).
+ self assert:(-9000000000000000000 absDivMod: -40000000000) = #(225000000 0).
+
+ self assert:(9000000000000000000 absDivMod: 400000000000) = #(22500000 0).
+ self assert:(-9000000000000000000 absDivMod: 400000000000) = #(22500000 0).
+ self assert:(9000000000000000000 absDivMod: -400000000000) = #(22500000 0).
+ self assert:(-9000000000000000000 absDivMod: -400000000000) = #(22500000 0).
+
+ self assert:(9000000000000000000 absDivMod: 4000000000000) = #(2250000 0).
+ self assert:(-9000000000000000000 absDivMod: 4000000000000) = #(2250000 0).
+ self assert:(9000000000000000000 absDivMod: -4000000000000) = #(2250000 0).
+ self assert:(-9000000000000000000 absDivMod: -4000000000000) = #(2250000 0).
+
+ self assert:(9000000000000000000 absDivMod: 40000000000000) = #(225000 0).
+ self assert:(-9000000000000000000 absDivMod: 40000000000000) = #(225000 0).
+ self assert:(9000000000000000000 absDivMod: -40000000000000) = #(225000 0).
+ self assert:(-9000000000000000000 absDivMod: -40000000000000) = #(225000 0).
+
+ self assert:(9000000000000000000 absDivMod: 400000000000000) = #(22500 0).
+ self assert:(-9000000000000000000 absDivMod: 400000000000000) = #(22500 0).
+ self assert:(9000000000000000000 absDivMod: -400000000000000) = #(22500 0).
+ self assert:(-9000000000000000000 absDivMod: -400000000000000) = #(22500 0).
+
+ self assert:(9000000000000000000 absDivMod: 4000000000000000) = #(2250 0).
+ self assert:(-9000000000000000000 absDivMod: 4000000000000000) = #(2250 0).
+ self assert:(9000000000000000000 absDivMod: -4000000000000000) = #(2250 0).
+ self assert:(-9000000000000000000 absDivMod: -4000000000000000) = #(2250 0).
+
+ self assert:(9000000000000000000 absDivMod: 4000000000000000000) = #(2 1000000000000000000).
+ self assert:(-9000000000000000000 absDivMod: 4000000000000000000) = #(2 1000000000000000000).
+ self assert:(9000000000000000000 absDivMod: -4000000000000000000) = #(2 1000000000000000000).
+ self assert:(-9000000000000000000 absDivMod: -4000000000000000000) = #(2 1000000000000000000).
+
+ "
+ self basicNew testLargeIntegerHelpers3
+ "
+!
+
testLargeMultiplication
|t1 t2|