RegressionTests__IntegerTest.st
changeset 2395 36ac67677f1f
parent 2333 9f171deab019
child 2397 4ad7fc96b77d
equal deleted inserted replaced
2394:168fb84c7806 2395:36ac67677f1f
   733     "
   733     "
   734 
   734 
   735     "Modified: / 31.10.2000 / 20:23:20 / cg"
   735     "Modified: / 31.10.2000 / 20:23:20 / cg"
   736 !
   736 !
   737 
   737 
   738 testBinco
       
   739      self assert: (10 binomialCoefficient:5) = (10 factorial / (5 factorial * 5 factorial)).
       
   740      self assert: (100 binomialCoefficient:78) = (100 factorial / (78 factorial * (100-78) factorial)).
       
   741      self assert: (1000 binomialCoefficient:5) = (1000 factorial / (5 factorial * (1000-5) factorial)).
       
   742      self assert: (10000 binomialCoefficient:78) = (10000 factorial / (78 factorial * (10000-78) factorial)).
       
   743 
       
   744     "
       
   745      self basicNew testBinco
       
   746     "
       
   747 !
       
   748 
       
   749 testByteSwap
       
   750     "/ <testedMethods: #( (Integer >> #byteSwapped32) (Integer >> #byteSwapped64)) >
       
   751 
       
   752     self assert:(16r1122 byteSwapped16) = 16r2211.
       
   753     self assert:(16r2211 byteSwapped16) = 16r1122.
       
   754 
       
   755     self assert:(16r11223344 byteSwapped32) = 16r44332211.
       
   756     self assert:(16r44332211 byteSwapped32) = 16r11223344.
       
   757 
       
   758     self assert:(16r11223344 byteSwapped64) = 16r4433221100000000.
       
   759     self assert:(16r44332211 byteSwapped64) = 16r1122334400000000.
       
   760 
       
   761     self assert:(16r8877665544332211 byteSwapped64) = 16r1122334455667788.
       
   762     self assert:(16r1122334455667788 byteSwapped64) = 16r8877665544332211.
       
   763 
       
   764     "/ higher bits are ignored!!
       
   765     self assert:(16r33441122 byteSwapped16) = 16r2211.
       
   766 
       
   767     self assert:(16r9911223344 byteSwapped32) = 16r44332211.
       
   768     self assert:(16r8877665544332211 byteSwapped32) = 16r11223344.
       
   769     self assert:(16r998877665544332211 byteSwapped64) = 16r1122334455667788.
       
   770     self assert:(16r991122334455667788 byteSwapped64) = 16r8877665544332211.
       
   771 
       
   772     "
       
   773      self basicNew testByteSwap
       
   774     "
       
   775 !
       
   776 
       
   777 testComparing
   738 testComparing
   778     |a b|
   739     |a b|
   779 
   740 
   780     a := 12.
   741     a := 12.
   781     b := 16r80000000.
   742     b := 16r80000000.
   881 
   842 
   882     "
   843     "
   883      self basicNew testConstants
   844      self basicNew testConstants
   884     "
   845     "
   885 !
   846 !
       
   847 
       
   848 testILC
       
   849     "inline-cache"
       
   850 
       
   851     self assert:((self checkIsInteger:1) == true).
       
   852     self assert:((self checkIsInteger:nil) == false).
       
   853     self assert:((self checkIsInteger:1) == true).
       
   854     self assert:((self checkIsInteger:nil) == false).
       
   855 
       
   856     self assert:((self checkIsInteger:0) == true).
       
   857     self assert:((self checkIsInteger:nil) == false).
       
   858     self assert:((self checkIsInteger:0) == true).
       
   859     self assert:((self checkIsInteger:nil) == false).
       
   860 
       
   861     "
       
   862      self basicNew testILC
       
   863     "
       
   864 
       
   865     "Created: / 6.6.1999 / 14:47:51 / cg"
       
   866     "Modified: / 9.6.1999 / 17:49:57 / cg"
       
   867 !
       
   868 
       
   869 testInline1
       
   870     "inlined tests.
       
   871      Notice, the arithmetic tests are both performed via regular sends
       
   872      and via constructed performs. The reason is to test both inlined
       
   873      JIT-compiler code AND the regular methods code."
       
   874 
       
   875     self assert:( (self absPlusOneOf:1) = 2 ).
       
   876     self assert:( (self absPlusOneOf:-1) = 2 ).
       
   877     self assert:( (self absPlusOneOf:1.0) = 2 ).
       
   878     self assert:( (self absPlusOneOf:-1.0) = 2 ).
       
   879 
       
   880     "
       
   881      self basicNew testInline1
       
   882     "
       
   883 
       
   884     "Created: / 31.10.2000 / 20:22:48 / cg"
       
   885     "Modified: / 31.10.2000 / 20:23:06 / cg"
       
   886 !
       
   887 
       
   888 testInteger1
       
   889     "general conversion & arithmetic tests.
       
   890      Notice, the arithmetic tests are both performed via regular sends
       
   891      and via constructed performs. The reason is to test both inlined
       
   892      JIT-compiler code AND the regular method's code."
       
   893 
       
   894     |minVal maxVal maxValPlus1 minValMinus1 halfMin halfMax t|
       
   895 
       
   896     minVal := SmallInteger perform:('minVal' asSymbol).
       
   897     maxVal := SmallInteger perform:('maxVal' asSymbol).
       
   898 
       
   899     self assert:(minVal class == SmallInteger).
       
   900     self assert:(maxVal class == SmallInteger).
       
   901 
       
   902     self assert:(minVal == self num_smallInt_minVal).
       
   903     self assert:(maxVal == self num_smallInt_maxVal).
       
   904 
       
   905     self assert:(minVal == SmallInteger minVal).
       
   906     self assert:(maxVal == SmallInteger maxVal).
       
   907 
       
   908     t := SmallInteger perform:('maxBytes' asSymbol).
       
   909     self assert:(t == SmallInteger maxBytes).
       
   910     t := SmallInteger perform:('maxBits' asSymbol).
       
   911     self assert:(t == SmallInteger maxBits).
       
   912 
       
   913     self testPrinting1.
       
   914 
       
   915     self assert:(SmallInteger maxBytes == ExternalAddress pointerSize).
       
   916     "/ again, preventing inlining by compiler
       
   917     self assert:(SmallInteger perform:#maxBytes) == (ExternalAddress perform:#pointerSize).
       
   918     self assert:(SmallInteger perform:'maxBytes' asSymbol) == (ExternalAddress perform:'pointerSize' asSymbol).
       
   919 
       
   920     SmallInteger maxBytes == 4 ifTrue:[
       
   921         self assert:(minVal hexPrintString = '-40000000').
       
   922         self assert:(maxVal hexPrintString = '3FFFFFFF').
       
   923         self assert:(minVal == -1073741824).
       
   924         self assert:(maxVal == 1073741823).
       
   925         maxValPlus1 := 1073741824.
       
   926         minValMinus1 := -1073741825.
       
   927         self assert:(minValMinus1 hexPrintString = '-40000001').
       
   928         self assert:(maxValPlus1 hexPrintString = '40000000').
       
   929         halfMin := 16r-20000000.
       
   930         halfMax := 16r20000000.
       
   931     ].
       
   932     SmallInteger maxBytes == 8 ifTrue:[
       
   933         self assert:(minVal hexPrintString = '-4000000000000000').
       
   934         self assert:(maxVal hexPrintString = '3FFFFFFFFFFFFFFF').
       
   935         self assert:(minVal == -4611686018427387904).
       
   936         self assert:(maxVal == 4611686018427387903).
       
   937         maxValPlus1 := 4611686018427387904.
       
   938         minValMinus1 := -4611686018427387905.
       
   939         self assert:(minValMinus1 hexPrintString = '-4000000000000001').
       
   940         self assert:(maxValPlus1 hexPrintString = '4000000000000000').
       
   941         halfMin := 16r-2000000000000000.
       
   942         halfMax := 16r2000000000000000.
       
   943     ].
       
   944     
       
   945     self assert:(minValMinus1 class == LargeInteger).
       
   946     self assert:(maxValPlus1 class == LargeInteger).
       
   947 
       
   948     "arithmetic overFlow checks"
       
   949 
       
   950 "/    self assert:((maxVal + 1) inspect.maxValPlus1 inspect. true).
       
   951     self assert:((maxVal perform:'+' asSymbol with:1) = maxValPlus1).
       
   952     self assert:((maxVal + 1) = maxValPlus1).
       
   953     self assert:((minVal perform:'-' asSymbol with:1) = minValMinus1).
       
   954     self assert:((minVal - 1) = minValMinus1).
       
   955 
       
   956     self assert:((halfMax perform:'+' asSymbol with:halfMax) = maxValPlus1).
       
   957     self assert:((halfMax + halfMax) = maxValPlus1).
       
   958     self assert:((halfMin perform:'+' asSymbol with:halfMin) == minVal).
       
   959     self assert:((halfMin + halfMin) == minVal).
       
   960     self assert:((halfMax perform:'*' asSymbol with:2) = maxValPlus1).
       
   961     self assert:((halfMax * 2) = maxValPlus1).
       
   962     self assert:((halfMin perform:'*' asSymbol with:2) == minVal).
       
   963     self assert:((halfMin * 2) == minVal).
       
   964     self assert:((maxValPlus1 perform:'//' asSymbol with:2) == halfMax).
       
   965     self assert:((maxValPlus1 // 2) == halfMax).
       
   966     self assert:((halfMax perform:'bitShift:' asSymbol with:1) = maxValPlus1).
       
   967     self assert:((halfMin perform:'bitShift:' asSymbol with:1) == minVal).
       
   968     self assert:((halfMax bitShift:1) = maxValPlus1).
       
   969     self assert:((halfMin bitShift:1) == minVal).
       
   970 
       
   971     "LargeInt op -> SmallInt result"
       
   972     t := maxVal + 1.
       
   973     self assert:(t - 1 == maxVal).
       
   974     t := minVal - 1.
       
   975     self assert:(t + 1 == minVal).
       
   976 
       
   977     "
       
   978      self basicNew testInteger1
       
   979     "
       
   980 
       
   981     "Modified: / 19-09-2017 / 16:27:24 / stefan"
       
   982     "Modified: / 10-10-2017 / 12:13:02 / cg"
       
   983 !
       
   984 
       
   985 testIntegerMisc
       
   986     "misc tests.
       
   987      Notice, the arithmetic tests are both performed via regular sends
       
   988      and via constructed performs. The reason is to test both inlined
       
   989      JIT-compiler code AND the regular methods code."
       
   990 
       
   991     |n1 n2 s|
       
   992 
       
   993     n1 := 100000.
       
   994     n2 := n1 negated.
       
   995     s := 1.
       
   996 
       
   997     self assert:(n1 printString = '100000').
       
   998 
       
   999     self assert:(n1 negated printString = '-100000').
       
  1000     self assert:((n1 perform:'negated' asSymbol) printString = '-100000').
       
  1001 
       
  1002     self assert:(n1 negated abs printString = '100000').
       
  1003     self assert:((n1 perform:'negated' asSymbol) abs printString = '100000').
       
  1004 
       
  1005     self assert:(n1 abs negated printString = '-100000').
       
  1006     self assert:((n1 perform:'abs' asSymbol) negated printString = '-100000').
       
  1007 
       
  1008     n1 := SmallInteger maxVal.
       
  1009     self assert:(n1 negated class == SmallInteger).
       
  1010     self assert:((n1 perform:'negated' asSymbol) class == SmallInteger).
       
  1011 
       
  1012     n1 := SmallInteger minVal.
       
  1013     self assert:(n1 class == SmallInteger).
       
  1014     "/ Transcript showCR:n1 printString.
       
  1015     "/ Transcript showCR:n1 negated printString.
       
  1016     "/ Transcript showCR:n1 negated class printString.
       
  1017     self assert:(n1 negated class == LargeInteger).
       
  1018     self assert:((n1 perform:'negated' asSymbol) class == LargeInteger).
       
  1019 
       
  1020     n1 := SmallInteger maxVal.
       
  1021     self assert:(n1 negated negated class == SmallInteger).
       
  1022     self assert:(((n1 perform:'negated' asSymbol) perform:'negated' asSymbol) class == SmallInteger).
       
  1023 
       
  1024     n1 := SmallInteger minVal.
       
  1025     self assert:(n1 negated negated class == SmallInteger).
       
  1026     self assert:(((n1 perform:'negated' asSymbol) perform:'negated' asSymbol) class == SmallInteger).
       
  1027 
       
  1028     n1 := SmallInteger minVal negated - 1.
       
  1029     self assert:(n1 negated class == SmallInteger).
       
  1030     self assert:((n1 perform:'negated' asSymbol) class == SmallInteger).
       
  1031     self assert:(n1 == SmallInteger maxVal).
       
  1032 
       
  1033     "
       
  1034      self basicNew testIntegerMisc
       
  1035     "
       
  1036 
       
  1037     "Created: / 6.6.1999 / 14:47:51 / cg"
       
  1038     "Modified: / 9.6.1999 / 17:49:57 / cg"
       
  1039 !
       
  1040 
       
  1041 testIntegerMisc2
       
  1042     "misc tests.
       
  1043      Notice, the arithmetic tests are both performed via regular sends
       
  1044      and via constructed performs. The reason is to test both inlined
       
  1045      JIT-compiler code AND the regular methods code."
       
  1046 
       
  1047     |n sel|
       
  1048 
       
  1049     "/ fib is optional
       
  1050     (0 respondsTo:#fib) ifFalse:[^ self].
       
  1051 
       
  1052     self assert:(0 fib == 0).
       
  1053     self assert:(1 fib == 1).
       
  1054     self assert:(2 fib == 1).
       
  1055     self assert:(3 fib == 2).
       
  1056     self assert:(4 fib == 3).
       
  1057     self assert:(5 fib == 5).
       
  1058     self assert:(6 fib == 8).
       
  1059     self assert:(7 fib == 13).
       
  1060 
       
  1061     n := 0.
       
  1062     self assert:(n fib == 0).
       
  1063     n := 1.
       
  1064     self assert:(n fib == 1).
       
  1065     n := 2.
       
  1066     self assert:(n fib == 1).
       
  1067     n := 3.
       
  1068     self assert:(n fib == 2).
       
  1069     n := 4.
       
  1070     self assert:(n fib == 3).
       
  1071     n := 5.
       
  1072     self assert:(n fib == 5).
       
  1073     n := 6.
       
  1074     self assert:(n fib == 8).
       
  1075     n := 7.
       
  1076     self assert:(n fib == 13).
       
  1077 
       
  1078     #(0 1 2 3 4 5 6 7)
       
  1079     with:#(0 1 1 2 3 5 8 13)
       
  1080     do:[:n :rslt |
       
  1081 	self assert:(n fib == rslt).
       
  1082     ].
       
  1083 
       
  1084 "/    #(0 1 2 3 4 5 6 7)
       
  1085 "/    with:#(0 1 1 2 3 5 8 13)
       
  1086 "/    do:[:n :rslt |
       
  1087 "/        self assert:(n fib_recursive == rslt).
       
  1088 "/    ].
       
  1089 
       
  1090     sel := #fib.
       
  1091     self assert:((0 perform:sel) == 0).
       
  1092     self assert:((1 perform:sel) == 1).
       
  1093     self assert:((2 perform:sel) == 1).
       
  1094     self assert:((3 perform:sel) == 2).
       
  1095     self assert:((4 perform:sel) == 3).
       
  1096     self assert:((5 perform:sel) == 5).
       
  1097     self assert:((6 perform:sel) == 8).
       
  1098     self assert:((7 perform:sel) == 13).
       
  1099 
       
  1100     "
       
  1101      self basicNew testIntegerMisc2
       
  1102     "
       
  1103 !
       
  1104 
       
  1105 testLargeCompare
       
  1106     "compare tests"
       
  1107 
       
  1108     #(
       
  1109         ( 16r3fffffff 16r40000000 #less )
       
  1110         ( 16r40000000 16r3fffffff #greater )
       
  1111         ( 16r40000000 16r40000000 #equal )
       
  1112 
       
  1113         ( 16r40000000 16r40000001 #less )
       
  1114         ( 16r40000001 16r40000000 #greater )
       
  1115         ( 16r40000001 16r40000001 #equal )
       
  1116         
       
  1117         ( 16r3fffffffffffffff 16r4000000000000000 #less )
       
  1118         ( 16r4000000000000000 16r3fffffffffffffff #greater )
       
  1119         ( 16r4000000000000000 16r4000000000000000 #equal )
       
  1120 
       
  1121         ( 16r4000000000000000 16r4000000000000001 #less )
       
  1122         ( 16r4000000000000001 16r4000000000000000 #greater )
       
  1123         ( 16r4000000000000001 16r4000000000000001 #equal )
       
  1124 
       
  1125         ( 16r3fffffffffffffffffffffff 16r400000000000000000000000 #less )
       
  1126         ( 16r400000000000000000000000 16r3fffffffffffffffffffffff #greater )
       
  1127         ( 16r400000000000000000000000 16r400000000000000000000000 #equal )
       
  1128 
       
  1129         ( 16r400000000000000000000000 16r400000000000000000000001 #less )
       
  1130         ( 16r400000000000000000000001 16r400000000000000000000000 #greater )
       
  1131         ( 16r400000000000000000000001 16r400000000000000000000001 #equal )
       
  1132 
       
  1133         ( 16r3fffffff 16r400000000000 #less )
       
  1134         ( 16r400000000000 16r3fffffff #greater )
       
  1135 
       
  1136         ( 16r40000000 16r400000000001 #less )
       
  1137         ( 16r400000000001 16r40000000 #greater )
       
  1138 
       
  1139         ( 16r3fffffffffffffff 16r40000000000000000000 #less )
       
  1140         ( 16r40000000000000000000 16r3fffffffffffffff #greater )
       
  1141 
       
  1142         ( 16r4000000000000000 16r40000000000000000001 #less )
       
  1143         ( 16r40000000000000000001 16r4000000000000000 #greater )
       
  1144 
       
  1145         ( 16r3fffffffffffffffffffffff 16r400000000000000000000000 #less )
       
  1146         ( 16r400000000000000000000000 16r3fffffffffffffffffffffff #greater )
       
  1147         ( 16r400000000000000000000000 16r400000000000000000000000 #equal )
       
  1148 
       
  1149         ( 16r400000000000000000000000 16r400000000000000000000001 #less )
       
  1150         ( 16r400000000000000000000001 16r400000000000000000000000 #greater )
       
  1151         ( 16r400000000000000000000001 16r400000000000000000000001 #equal )
       
  1152     ) do:[:triple |
       
  1153         |v1 v2 expected rslt|
       
  1154         
       
  1155         v1 := triple at:1.
       
  1156         v2 := triple at:2.
       
  1157         expected := triple at:3.
       
  1158         expected == #less ifTrue:[
       
  1159             self assert:(v1 < v2).
       
  1160             self assert:(v1 <= v2).
       
  1161             self assert:(v1 > v2) not.
       
  1162             self assert:(v1 >= v2) not.
       
  1163             self assert:(v1 = v2) not.
       
  1164             self assert:(v1 ~= v2).
       
  1165         ].    
       
  1166         expected == #greater ifTrue:[
       
  1167             self assert:(v1 > v2).
       
  1168             self assert:(v1 >= v2).
       
  1169             self assert:(v1 < v2) not.
       
  1170             self assert:(v1 <= v2) not.
       
  1171             self assert:(v1 = v2) not.
       
  1172             self assert:(v1 ~= v2).
       
  1173         ].    
       
  1174         expected == #equal ifTrue:[
       
  1175             self assert:(v1 > v2) not.
       
  1176             self assert:(v1 >= v2).
       
  1177             self assert:(v1 < v2) not.
       
  1178             self assert:(v1 <= v2).
       
  1179             self assert:(v1 = v2).
       
  1180             self assert:(v1 ~= v2) not.
       
  1181         ].    
       
  1182     ].
       
  1183     self assert:(100 factorial < 101 factorial).
       
  1184     self assert:(100 factorial > 100 factorial negated).
       
  1185     
       
  1186     "
       
  1187      self basicNew testLargeCompare
       
  1188     "
       
  1189 !
       
  1190 
       
  1191 testLargeCompression1
       
  1192     |l nullBytes|
       
  1193 
       
  1194     #(
       
  1195 	#[ 1 ]          16r01
       
  1196 	#[ 1 2 ]        16r0201
       
  1197 	#[ 1 2 3]       16r030201
       
  1198 	#[ 1 2 3 4]     16r04030201
       
  1199     ) pairWiseDo:[:bytes :expected |
       
  1200 	0 to:16 do:[:nNullBytes |
       
  1201 	    nullBytes := ByteArray new:nNullBytes withAll:0.
       
  1202 	    l := LargeInteger digitBytes:(bytes , nullBytes).
       
  1203 	    self assert:( l compressed == expected ).
       
  1204 	].
       
  1205     ].
       
  1206 
       
  1207     #(
       
  1208 	#[ 1 2 3 4 5]       16r0504030201
       
  1209 	#[ 1 2 3 4 5 6]     16r060504030201
       
  1210 	#[ 1 2 3 4 5 6 7]   16r07060504030201
       
  1211 	#[ 1 2 3 4 5 6 7 8] 16r0807060504030201
       
  1212     ) pairWiseDo:[:bytes :expected |
       
  1213 	0 to:16 do:[:nNullBytes |
       
  1214 	    nullBytes := ByteArray new:nNullBytes withAll:0.
       
  1215 	    l := LargeInteger digitBytes:(bytes , nullBytes).
       
  1216 	    ExternalAddress pointerSize == 8 ifTrue:[
       
  1217 		self assert:( l compressed == expected ).
       
  1218 	    ] ifFalse:[
       
  1219 		self assert:( l compressed = expected ).
       
  1220 	    ]
       
  1221 	]
       
  1222     ].
       
  1223 
       
  1224     #(
       
  1225 	#[ 1 2 3 4 5 6 7 8 9]       16r090807060504030201
       
  1226 	#[ 1 2 3 4 5 6 7 8 9 10]    16r0a090807060504030201
       
  1227 	#[ 1 2 3 4 5 6 7 8 9 10 11] 16r0b0a090807060504030201
       
  1228     ) pairWiseDo:[:bytes :expected |
       
  1229 	0 to:16 do:[:nNullBytes |
       
  1230 	    nullBytes := ByteArray new:nNullBytes withAll:0.
       
  1231 	    l := LargeInteger digitBytes:(bytes , nullBytes).
       
  1232 	    self assert:( l compressed = expected ).
       
  1233 	]
       
  1234     ].
       
  1235 
       
  1236     "
       
  1237      self basicNew testLargeCompression1
       
  1238     "
       
  1239 !
       
  1240 
       
  1241 testLargeIntegerHelpers
       
  1242     |t1 t2|
       
  1243 
       
  1244     "/ mul2
       
  1245 
       
  1246     t1 := 16r12345678901234567890.
       
  1247     t2 := t1 deepCopy.
       
  1248     self assert:(t2 mul2 = (t1 * 2)).
       
  1249 
       
  1250     t1 := 16r1234567890123456789012345678901234567890.
       
  1251     t2 := t1 deepCopy.
       
  1252     self assert:(t2 mul2 = (t1 * 2)).
       
  1253 
       
  1254     t1 := 16r123456789012345678901234567890123456789012345678901234567890.
       
  1255     t2 := t1 deepCopy.
       
  1256     self assert:(t2 mul2 = (t1 * 2)).
       
  1257 
       
  1258     t1 := 16r12345678901234567890123456789012345678901234567890123456789012345678901234567890.
       
  1259     t2 := t1 deepCopy.
       
  1260     self assert:(t2 mul2 = (t1 * 2)).
       
  1261 
       
  1262     t1 := 10000 factorial.
       
  1263     t2 := t1 deepCopy.
       
  1264     self assert:(t2 mul2 = (t1 * 2)).
       
  1265 
       
  1266     t1 := 16r123456789012345678901234567890123456789012345678901234567890.
       
  1267     t2 := t1 deepCopy.
       
  1268     self assert:(t2 mul2 = (t1 * 2)).
       
  1269 
       
  1270 "/    t1 := 1000 factorial.
       
  1271 "/    t := Time millisecondsToRun:[ 100000 timesRepeat:[ t1 mul2. ] ].
       
  1272 "/    Transcript showCR:t.
       
  1273 
       
  1274     "/ div2
       
  1275 
       
  1276     t1 := 16r12345678901234567890.
       
  1277     t2 := t1 deepCopy.
       
  1278 
       
  1279     t2 div2.
       
  1280     "/ do not compare t2 = t1 // x, because t2 may be unnormalized
       
  1281     self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
       
  1282 
       
  1283     t2 div2.
       
  1284     self assert:(t2 printStringRadix:16) = ((t1 // 4) printStringRadix:16).
       
  1285     t2 div2.
       
  1286     self assert:(t2 printStringRadix:16) = ((t1 // 8) printStringRadix:16).
       
  1287     t2 div2.
       
  1288     self assert:(t2 printStringRadix:16) = ((t1 // 16) printStringRadix:16).
       
  1289     t2 div2.
       
  1290     self assert:(t2 printStringRadix:16) = ((t1 // 32) printStringRadix:16).
       
  1291     t2 div2.
       
  1292     self assert:(t2 printStringRadix:16) = ((t1 // 64) printStringRadix:16).
       
  1293     t2 div2.
       
  1294     self assert:(t2 printStringRadix:16) = ((t1 // 128) printStringRadix:16).
       
  1295     t2 div2.
       
  1296     self assert:(t2 printStringRadix:16) = ((t1 // 256) printStringRadix:16).
       
  1297     t2 div2.
       
  1298     self assert:(t2 printStringRadix:16) = ((t1 // 512) printStringRadix:16).
       
  1299     t2 div2.
       
  1300     self assert:(t2 printStringRadix:16) = ((t1 // 1024) printStringRadix:16).
       
  1301 
       
  1302     t1 := 16r1234567890123456789012345678901234567890.
       
  1303     t2 := t1 deepCopy.
       
  1304     t2 div2.
       
  1305     self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
       
  1306 
       
  1307     t1 := 16r123456789012345678901234567890123456789012345678901234567890.
       
  1308     t2 := t1 deepCopy.
       
  1309     t2 div2.
       
  1310     self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
       
  1311 
       
  1312     t1 := 16r12345678901234567890123456789012345678901234567890123456789012345678901234567890.
       
  1313     t2 := t1 deepCopy.
       
  1314     t2 div2.
       
  1315     self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
       
  1316     t2 div2.
       
  1317     self assert:(t2 printStringRadix:16) = ((t1 // 4) printStringRadix:16).
       
  1318     t2 div2.
       
  1319     self assert:(t2 printStringRadix:16) = ((t1 // 8) printStringRadix:16).
       
  1320     t2 div2.
       
  1321     self assert:(t2 printStringRadix:16) = ((t1 // 16) printStringRadix:16).
       
  1322 
       
  1323     t1 := 10000 factorial.
       
  1324     t2 := t1 deepCopy.
       
  1325     t2 div2.
       
  1326     self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
       
  1327 
       
  1328     t1 := 16r123456789012345678901234567890123456789012345678901234567890.
       
  1329     t2 := t1 deepCopy.
       
  1330     t2 div2.
       
  1331     self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
       
  1332 
       
  1333     t1 := 12345678901234567890.
       
  1334     t2 := t1 divMod:1000.
       
  1335     self assert:(t2 at:1) = 12345678901234567.
       
  1336     self assert:(t2 at:2) = 890.
       
  1337 
       
  1338 
       
  1339     "
       
  1340      self basicNew testLargeIntegerHelpers
       
  1341     "
       
  1342 
       
  1343     "Modified: / 20.5.1999 / 09:41:19 / cg"
       
  1344 !
       
  1345 
       
  1346 testLargeIntegerHelpers2
       
  1347     |t1 r|
       
  1348 
       
  1349     "/ absSubtract:
       
  1350 
       
  1351     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  1352     r := t1 absDestructiveSubtract:16r00ffffffffffffffff.
       
  1353     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  1354     self assert:(r == true).
       
  1355 
       
  1356     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  1357     r := t1 absDestructiveSubtract:16r010000000000000000.
       
  1358     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  1359     self assert:(r == false).
       
  1360 
       
  1361     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  1362     r := t1 absDestructiveSubtract:16r00ffffffffffffffffff.
       
  1363     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  1364     self assert:(r == true).
       
  1365 
       
  1366     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  1367     r := t1 absDestructiveSubtract:16r01000000000000000000.
       
  1368     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  1369     self assert:(r == false).
       
  1370 
       
  1371     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  1372     r := t1 absDestructiveSubtract:16r00ffffffffffffffffffff.
       
  1373     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  1374     self assert:(r == true).
       
  1375 
       
  1376     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  1377     r := t1 absDestructiveSubtract:16r0100000000000000000000.
       
  1378     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  1379     self assert:(r == false).
       
  1380 
       
  1381     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  1382     r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffff.
       
  1383     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  1384     self assert:(r == true).
       
  1385 
       
  1386     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  1387     r := t1 absDestructiveSubtract:16r010000000000000000000000.
       
  1388     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  1389     self assert:(r == false).
       
  1390 
       
  1391     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  1392     r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffffff.
       
  1393     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  1394     self assert:(r == true).
       
  1395 
       
  1396     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  1397     r := t1 absDestructiveSubtract:16r01000000000000000000000000.
       
  1398     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  1399     self assert:(r == false).
       
  1400 
       
  1401     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  1402     r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffffffff.
       
  1403     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  1404     self assert:(r == true).
       
  1405 
       
  1406     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  1407     r := t1 absDestructiveSubtract:16r0100000000000000000000000000.
       
  1408     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  1409     self assert:(r == false).
       
  1410 
       
  1411     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  1412     r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffffffffff.
       
  1413     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  1414     self assert:(r == true).
       
  1415 
       
  1416     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  1417     r := t1 absDestructiveSubtract:16r010000000000000000000000000000.
       
  1418     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  1419     self assert:(r == false).
       
  1420 
       
  1421     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  1422     r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffffffffffff.
       
  1423     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  1424     self assert:(r == true).
       
  1425 
       
  1426     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  1427     r := t1 absDestructiveSubtract:16r01000000000000000000000000000000.
       
  1428     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  1429     self assert:(r == false).
       
  1430     "
       
  1431      self basicNew testLargeIntegerHelpers2
       
  1432     "
       
  1433 !
       
  1434 
       
  1435 testLargeIntegerHelpers3
       
  1436     "/ absDivMod:
       
  1437 
       
  1438      self assert:(9000000000000000000 absDivMod: 4000) = #(2250000000000000 0).
       
  1439      self assert:(-9000000000000000000 absDivMod: 4000) = #(2250000000000000 0).
       
  1440      self assert:(9000000000000000000 absDivMod: -4000) = #(2250000000000000 0).
       
  1441      self assert:(-9000000000000000000 absDivMod: -4000) = #(2250000000000000 0).
       
  1442 
       
  1443      self assert:(9000000000000000001 absDivMod: 4000) = #(2250000000000000 1).
       
  1444      self assert:(-9000000000000000001 absDivMod: 4000) = #(2250000000000000 1).
       
  1445      self assert:(9000000000000000001 absDivMod: -4000) = #(2250000000000000 1).
       
  1446      self assert:(-9000000000000000001 absDivMod: -4000) = #(2250000000000000 1).
       
  1447 
       
  1448      self assert:(9000000000000000000 absDivMod: 40000) = #(225000000000000 0).
       
  1449      self assert:(-9000000000000000000 absDivMod: 40000) = #(225000000000000 0).
       
  1450      self assert:(9000000000000000000 absDivMod: -40000) = #(225000000000000 0).
       
  1451      self assert:(-9000000000000000000 absDivMod: -40000) = #(225000000000000 0).
       
  1452 
       
  1453      self assert:(9000000000000000000 absDivMod: 400000) = #(22500000000000 0).
       
  1454      self assert:(-9000000000000000000 absDivMod: 400000) = #(22500000000000 0).
       
  1455      self assert:(9000000000000000000 absDivMod: -400000) = #(22500000000000 0).
       
  1456      self assert:(-9000000000000000000 absDivMod: -400000) = #(22500000000000 0).
       
  1457 
       
  1458      self assert:(9000000000000000000 absDivMod: 4000000) = #(2250000000000 0).
       
  1459      self assert:(-9000000000000000000 absDivMod: 4000000) = #(2250000000000 0).
       
  1460      self assert:(9000000000000000000 absDivMod: -4000000) = #(2250000000000 0).
       
  1461      self assert:(-9000000000000000000 absDivMod: -4000000) = #(2250000000000 0).
       
  1462 
       
  1463      self assert:(9000000000000000000 absDivMod: 40000000) = #(225000000000 0).
       
  1464      self assert:(-9000000000000000000 absDivMod: 40000000) = #(225000000000 0).
       
  1465      self assert:(9000000000000000000 absDivMod: -40000000) = #(225000000000 0).
       
  1466      self assert:(-9000000000000000000 absDivMod: -40000000) = #(225000000000 0).
       
  1467 
       
  1468      self assert:(9000000000000000000 absDivMod: 400000000) = #(22500000000 0).
       
  1469      self assert:(-9000000000000000000 absDivMod: 400000000) = #(22500000000 0).
       
  1470      self assert:(9000000000000000000 absDivMod: -400000000) = #(22500000000 0).
       
  1471      self assert:(-9000000000000000000 absDivMod: -400000000) = #(22500000000 0).
       
  1472 
       
  1473      self assert:(9000000000000000000 absDivMod: 4000000000) = #(2250000000 0).
       
  1474      self assert:(-9000000000000000000 absDivMod: 4000000000) = #(2250000000 0).
       
  1475      self assert:(9000000000000000000 absDivMod: -4000000000) = #(2250000000 0).
       
  1476      self assert:(-9000000000000000000 absDivMod: -4000000000) = #(2250000000 0).
       
  1477 
       
  1478      self assert:(9000000000000000000 absDivMod: 40000000000) = #(225000000 0).
       
  1479      self assert:(-9000000000000000000 absDivMod: 40000000000) = #(225000000 0).
       
  1480      self assert:(9000000000000000000 absDivMod: -40000000000) = #(225000000 0).
       
  1481      self assert:(-9000000000000000000 absDivMod: -40000000000) = #(225000000 0).
       
  1482 
       
  1483      self assert:(9000000000000000000 absDivMod: 400000000000) = #(22500000 0).
       
  1484      self assert:(-9000000000000000000 absDivMod: 400000000000) = #(22500000 0).
       
  1485      self assert:(9000000000000000000 absDivMod: -400000000000) = #(22500000 0).
       
  1486      self assert:(-9000000000000000000 absDivMod: -400000000000) = #(22500000 0).
       
  1487 
       
  1488      self assert:(9000000000000000000 absDivMod: 4000000000000) = #(2250000 0).
       
  1489      self assert:(-9000000000000000000 absDivMod: 4000000000000) = #(2250000 0).
       
  1490      self assert:(9000000000000000000 absDivMod: -4000000000000) = #(2250000 0).
       
  1491      self assert:(-9000000000000000000 absDivMod: -4000000000000) = #(2250000 0).
       
  1492 
       
  1493      self assert:(9000000000000000000 absDivMod: 40000000000000) = #(225000 0).
       
  1494      self assert:(-9000000000000000000 absDivMod: 40000000000000) = #(225000 0).
       
  1495      self assert:(9000000000000000000 absDivMod: -40000000000000) = #(225000 0).
       
  1496      self assert:(-9000000000000000000 absDivMod: -40000000000000) = #(225000 0).
       
  1497 
       
  1498      self assert:(9000000000000000000 absDivMod: 400000000000000) = #(22500 0).
       
  1499      self assert:(-9000000000000000000 absDivMod: 400000000000000) = #(22500 0).
       
  1500      self assert:(9000000000000000000 absDivMod: -400000000000000) = #(22500 0).
       
  1501      self assert:(-9000000000000000000 absDivMod: -400000000000000) = #(22500 0).
       
  1502 
       
  1503      self assert:(9000000000000000000 absDivMod: 4000000000000000) = #(2250 0).
       
  1504      self assert:(-9000000000000000000 absDivMod: 4000000000000000) = #(2250 0).
       
  1505      self assert:(9000000000000000000 absDivMod: -4000000000000000) = #(2250 0).
       
  1506      self assert:(-9000000000000000000 absDivMod: -4000000000000000) = #(2250 0).
       
  1507 
       
  1508      self assert:(9000000000000000000 absDivMod: 4000000000000000000) = #(2 1000000000000000000).
       
  1509      self assert:(-9000000000000000000 absDivMod: 4000000000000000000) = #(2 1000000000000000000).
       
  1510      self assert:(9000000000000000000 absDivMod: -4000000000000000000) = #(2 1000000000000000000).
       
  1511      self assert:(-9000000000000000000 absDivMod: -4000000000000000000) = #(2 1000000000000000000).
       
  1512 
       
  1513     "
       
  1514      self basicNew testLargeIntegerHelpers3
       
  1515     "
       
  1516 !
       
  1517 
       
  1518 testLargeIntegerHelpers4
       
  1519     "/ absDivMod:
       
  1520 
       
  1521      self assert:(9000000000000000000 absMod: 4000) = 0.
       
  1522      self assert:(-9000000000000000000 absMod: 4000) = 0.
       
  1523      self assert:(9000000000000000000 absMod: -4000) = 0.
       
  1524      self assert:(-9000000000000000000 absMod: -4000) = 0.
       
  1525 
       
  1526      self assert:(9000000000000000001 absMod: 4000) = 1.
       
  1527      self assert:(-9000000000000000001 absMod: 4000) = 1.
       
  1528      self assert:(9000000000000000001 absMod: -4000) = 1.
       
  1529      self assert:(-9000000000000000001 absMod: -4000) = 1.
       
  1530 
       
  1531      self assert:(9000000000000000000 absMod: 40000) = 0.
       
  1532      self assert:(-9000000000000000000 absMod: 40000) = 0.
       
  1533      self assert:(9000000000000000000 absMod: -40000) = 0.
       
  1534      self assert:(-9000000000000000000 absMod: -40000) = 0.
       
  1535 
       
  1536      self assert:(9000000000000000000 absMod: 400000) = 0.
       
  1537      self assert:(-9000000000000000000 absMod: 400000) = 0.
       
  1538      self assert:(9000000000000000000 absMod: -400000) = 0.
       
  1539      self assert:(-9000000000000000000 absMod: -400000) = 0.
       
  1540 
       
  1541      self assert:(9000000000000000000 absMod: 4000000) = 0.
       
  1542      self assert:(-9000000000000000000 absMod: 4000000) = 0.
       
  1543      self assert:(9000000000000000000 absMod: -4000000) = 0.
       
  1544      self assert:(-9000000000000000000 absMod: -4000000) = 0.
       
  1545 
       
  1546      self assert:(9000000000000000000 absMod: 40000000) = 0.
       
  1547      self assert:(-9000000000000000000 absMod: 40000000) = 0.
       
  1548      self assert:(9000000000000000000 absMod: -40000000) = 0.
       
  1549      self assert:(-9000000000000000000 absMod: -40000000) = 0.
       
  1550 
       
  1551      self assert:(9000000000000000000 absMod: 400000000) = 0.
       
  1552      self assert:(-9000000000000000000 absMod: 400000000) = 0.
       
  1553      self assert:(9000000000000000000 absMod: -400000000) = 0.
       
  1554      self assert:(-9000000000000000000 absMod: -400000000) = 0.
       
  1555 
       
  1556      self assert:(9000000000000000000 absMod: 4000000000) = 0.
       
  1557      self assert:(-9000000000000000000 absMod: 4000000000) = 0.
       
  1558      self assert:(9000000000000000000 absMod: -4000000000) = 0.
       
  1559      self assert:(-9000000000000000000 absMod: -4000000000) = 0.
       
  1560 
       
  1561      self assert:(9000000000000000000 absMod: 40000000000) = 0.
       
  1562      self assert:(-9000000000000000000 absMod: 40000000000) = 0.
       
  1563      self assert:(9000000000000000000 absMod: -40000000000) = 0.
       
  1564      self assert:(-9000000000000000000 absMod: -40000000000) = 0.
       
  1565 
       
  1566      self assert:(9000000000000000000 absMod: 400000000000) = 0.
       
  1567      self assert:(-9000000000000000000 absMod: 400000000000) = 0.
       
  1568      self assert:(9000000000000000000 absMod: -400000000000) = 0.
       
  1569      self assert:(-9000000000000000000 absMod: -400000000000) = 0.
       
  1570 
       
  1571      self assert:(9000000000000000000 absMod: 4000000000000) = 0.
       
  1572      self assert:(-9000000000000000000 absMod: 4000000000000) = 0.
       
  1573      self assert:(9000000000000000000 absMod: -4000000000000) = 0.
       
  1574      self assert:(-9000000000000000000 absMod: -4000000000000) = 0.
       
  1575 
       
  1576      self assert:(9000000000000000000 absMod: 40000000000000) = 0.
       
  1577      self assert:(-9000000000000000000 absMod: 40000000000000) = 0.
       
  1578      self assert:(9000000000000000000 absMod: -40000000000000) = 0.
       
  1579      self assert:(-9000000000000000000 absMod: -40000000000000) = 0.
       
  1580 
       
  1581      self assert:(9000000000000000000 absMod: 400000000000000) = 0.
       
  1582      self assert:(-9000000000000000000 absMod: 400000000000000) = 0.
       
  1583      self assert:(9000000000000000000 absMod: -400000000000000) = 0.
       
  1584      self assert:(-9000000000000000000 absMod: -400000000000000) = 0.
       
  1585 
       
  1586      self assert:(9000000000000000000 absMod: 4000000000000000) = 0.
       
  1587      self assert:(-9000000000000000000 absMod: 4000000000000000) = 0.
       
  1588      self assert:(9000000000000000000 absMod: -4000000000000000) = 0.
       
  1589      self assert:(-9000000000000000000 absMod: -4000000000000000) = 0.
       
  1590 
       
  1591      self assert:(9000000000000000000 absMod: 4000000000000000000) = 1000000000000000000.
       
  1592      self assert:(-9000000000000000000 absMod: 4000000000000000000) = 1000000000000000000.
       
  1593      self assert:(9000000000000000000 absMod: -4000000000000000000) = 1000000000000000000.
       
  1594      self assert:(-9000000000000000000 absMod: -4000000000000000000) = 1000000000000000000.
       
  1595 
       
  1596     "
       
  1597      self basicNew testLargeIntegerHelpers4
       
  1598     "
       
  1599 
       
  1600     "Created: / 05-07-2017 / 16:15:30 / cg"
       
  1601 !
       
  1602 
       
  1603 testMiscMath
       
  1604     self assert:(2 raisedTo:2) == 4.
       
  1605     self assert:(2 raisedTo:2.0) = 4.0.
       
  1606     self assert:(2 raisedTo:100) = 1267650600228229401496703205376.
       
  1607     
       
  1608     self assert:(((2 raisedTo:100) log:2) isAlmostEqualTo:100 nEpsilon:1) 
       
  1609          message:('(2^100)log2 is %1' bindWith:((2 raisedTo:100) log:2)).
       
  1610     self assert:(((2 raisedTo:100) integerLog2) == 100)
       
  1611          message:('(2^100)integerLog2 is %1' bindWith:((2 raisedTo:100) integerLog2)).
       
  1612 
       
  1613     self assert:(((10 raisedTo:100) integerLog10) == 100)
       
  1614          message:('(10^100)integerLog10 is %1' bindWith:((10 raisedTo:100) integerLog10)).
       
  1615 
       
  1616     "/ currently, integerLog10 does not work with largeInts
       
  1617     "/ self assert:(((10 raisedTo:1000) integerLog10) == 1000).
       
  1618 
       
  1619     "
       
  1620      self basicNew testMiscMath
       
  1621     "
       
  1622 
       
  1623     "Created: / 02-07-2017 / 00:52:25 / cg"
       
  1624     "Modified (comment): / 02-07-2017 / 14:39:26 / cg"
       
  1625     "Modified: / 22-07-2019 / 12:44:41 / Claus Gittinger"
       
  1626 !
       
  1627 
       
  1628 testMiscMath2
       
  1629     self assert:(10000000000000000000000001 isPrime) not.
       
  1630     self assert:(76 factorial + 1) isPrime not.
       
  1631 
       
  1632     "/ Would take far too long with fallback implementation.
       
  1633     PrimeNumberGenerator notNil ifTrue:[
       
  1634         self assert:(77 factorial + 1) isPrime.
       
  1635         self assert:(872 factorial + 1) isPrime.
       
  1636         self assert:(1000 factorial + 1) isPrime not.
       
  1637     ].
       
  1638 
       
  1639     "
       
  1640     Time millisecondsToRun:[
       
  1641         1000000 factorial.
       
  1642     ].
       
  1643     "
       
  1644 
       
  1645     "
       
  1646      self basicNew testMiscMath2
       
  1647     "
       
  1648 
       
  1649     "Created: / 05-07-2017 / 16:18:54 / cg"
       
  1650     "Modified (comment): / 26-07-2017 / 12:48:11 / mawalch"
       
  1651 ! !
       
  1652 
       
  1653 !IntegerTest methodsFor:'tests-arithmetic'!
   886 
  1654 
   887 testDivision1
  1655 testDivision1
   888     |a b op rslt|
  1656     |a b op rslt|
   889 
  1657 
   890     "/ 10 divMod:3       -> #(3 1)   because 3*3 + 1 = 10
  1658     "/ 10 divMod:3       -> #(3 1)   because 3*3 + 1 = 10
  1402     "
  2170     "
  1403 
  2171 
  1404     "Created: / 26-02-2016 / 20:21:47 / cg"
  2172     "Created: / 26-02-2016 / 20:21:47 / cg"
  1405 !
  2173 !
  1406 
  2174 
  1407 testEncodeDecode
  2175 testLargeAddition
  1408     self assert:(1 encodeAsBCD hexPrintString = '1').
  2176     "general conversion & arithmetic tests.
  1409     self assert:(12 encodeAsBCD hexPrintString = '12').
  2177      Notice, the arithmetic tests are both performed via regular sends
  1410     self assert:(123 encodeAsBCD hexPrintString = '123').
  2178      and via constructed performs. The reason is to test both inlined
  1411     self assert:(1234 encodeAsBCD hexPrintString = '1234').
  2179      JIT-compiler code AND the regular methods code."
  1412     self assert:(12345 encodeAsBCD hexPrintString = '12345').
  2180 
  1413     self assert:(123456 encodeAsBCD hexPrintString = '123456').
  2181     "Large + Large addition"
  1414     self assert:(1234567 encodeAsBCD hexPrintString = '1234567').
  2182     self testReading1.
  1415     self assert:(12345678 encodeAsBCD hexPrintString = '12345678').
  2183 
  1416     self assert:(123456789 encodeAsBCD hexPrintString = '123456789').
       
  1417     self assert:(1234567890 encodeAsBCD hexPrintString = '1234567890').
       
  1418     self assert:(12345678901 encodeAsBCD hexPrintString = '12345678901').
       
  1419     self assert:(123456789012 encodeAsBCD hexPrintString = '123456789012').
       
  1420     self assert:(1234567890123 encodeAsBCD hexPrintString = '1234567890123').
       
  1421     self assert:(12345678901234 encodeAsBCD hexPrintString = '12345678901234').
       
  1422     self assert:(123456789012345 encodeAsBCD hexPrintString = '123456789012345').
       
  1423     self assert:(1234567890123456 encodeAsBCD hexPrintString = '1234567890123456').
       
  1424     self assert:(12345678901234567 encodeAsBCD hexPrintString = '12345678901234567').
       
  1425     self assert:(123456789012345678 encodeAsBCD hexPrintString = '123456789012345678').
       
  1426     self assert:(1234567890123456789 encodeAsBCD hexPrintString = '1234567890123456789').
       
  1427     self assert:(12345678901234567890 encodeAsBCD hexPrintString = '12345678901234567890').
       
  1428     self assert:(4611686018427387902 encodeAsBCD hexPrintString = '4611686018427387902').
       
  1429     self assert:(4611686018427387903 encodeAsBCD hexPrintString = '4611686018427387903').
       
  1430     self assert:(4611686018427387904 encodeAsBCD hexPrintString = '4611686018427387904').
       
  1431 
       
  1432     self assert:(16r1 decodeFromBCD = 1).
       
  1433     self assert:(16r12 decodeFromBCD = 12).
       
  1434     self assert:(16r123 decodeFromBCD = 123).
       
  1435     self assert:(16r1234 decodeFromBCD = 1234).
       
  1436     self assert:(16r12345 decodeFromBCD = 12345).
       
  1437     self assert:(16r123456 decodeFromBCD = 123456).
       
  1438     self assert:(16r1234567 decodeFromBCD = 1234567).
       
  1439     self assert:(16r12345678 decodeFromBCD = 12345678).
       
  1440     self assert:(16r123456789 decodeFromBCD = 123456789).
       
  1441     self assert:(16r1234567890 decodeFromBCD = 1234567890).
       
  1442     self assert:(16r12345678901 decodeFromBCD = 12345678901).
       
  1443     self assert:(16r123456789012 decodeFromBCD = 123456789012).
       
  1444     self assert:(16r1000000000000 decodeFromBCD = 1000000000000).
       
  1445     self assert:(16r0000500000000 decodeFromBCD = 500000000).
       
  1446     self assert:(16r1234500000000 decodeFromBCD = 1234500000000).
       
  1447     self assert:(16r1234567890000 decodeFromBCD = 1234567890000).
       
  1448 
       
  1449     self assert:(16r1234567890123 decodeFromBCD = 1234567890123).
       
  1450     self assert:(16r12345678901234 decodeFromBCD = 12345678901234).
       
  1451     self assert:(16r123456789012345 decodeFromBCD = 123456789012345).
       
  1452     self assert:(16r1234567890123456 decodeFromBCD = 1234567890123456).
       
  1453     self assert:(16r12345678901234567 decodeFromBCD = 12345678901234567).
       
  1454     self assert:(16r123456789012345678 decodeFromBCD = 123456789012345678).
       
  1455     self assert:(16r1234567890123456789 decodeFromBCD = 1234567890123456789).
       
  1456     self assert:(16r12345678901234567890 decodeFromBCD = 12345678901234567890).
       
  1457     self assert:(16r4611686018427387902 decodeFromBCD = 4611686018427387902).
       
  1458     self assert:(16r4611686018427387903 decodeFromBCD = 4611686018427387903).
       
  1459     self assert:(16r4611686018427387904 decodeFromBCD = 4611686018427387904).
       
  1460 
       
  1461     "
       
  1462      self basicNew testEncodeDecode
       
  1463     "
       
  1464 
       
  1465     "Modified: / 26.10.1999 / 22:01:35 / stefan"
       
  1466 !
       
  1467 
       
  1468 testFactorial
       
  1469     "/ <testedMethods: #( (Integer >> #factorial) (Integer >> #*) ) >
       
  1470 
       
  1471     self assert:(1 factorial = 1).
       
  1472     self assert:(2 factorial = 2).
       
  1473     self assert:(10 factorial = 3628800).
       
  1474     self assert:(11 factorial = 39916800).
       
  1475     self assert:(12 factorial = 479001600).
       
  1476     self assert:(13 factorial digitBytes = #[0 204 40 115 1]).
       
  1477     self assert:(13 factorial = 6227020800).
       
  1478     self assert:(14 factorial digitBytes = #[0 40 59 76 20]).
       
  1479     self assert:(14 factorial = 87178291200).
       
  1480     self assert:(15 factorial digitBytes = #[0 88 119 119 48 1]).
       
  1481     self assert:(15 factorial = 1307674368000).
       
  1482     self assert:(16 factorial digitBytes = #[0 128 117 119 7 19]).
       
  1483     self assert:(16 factorial = 20922789888000).
       
  1484     self assert:(17 factorial digitBytes = #[0 128 205 238 126 67 1]).
       
  1485     self assert:(17 factorial = 355687428096000).
       
  1486     self assert:(18 factorial digitBytes = #[0 0 115 202 236 190 22]).
       
  1487     self assert:(18 factorial = 6402373705728000).
       
  1488     self assert:(19 factorial digitBytes = #[0 0 137 6 147 43 176 1]).
       
  1489     self assert:(19 factorial = 121645100408832000).
       
  1490     self assert:(20 factorial digitBytes = #[0 0 180 130 124 103 195 33]).
       
  1491     self assert:(20 factorial = 2432902008176640000).
  2184     self assert:(20 factorial = 2432902008176640000).
  1492     self assert:(50 factorial = 30414093201713378043612608166064768844377641568960512000000000000).
  2185     self assert:(20 factorial printString = '2432902008176640000').
  1493 
  2186     self assert:((20 factorial + 20 factorial) printString = '4865804016353280000').
  1494     "
  2187     self assert:((20 factorial + 1) printString = '2432902008176640001').
  1495      self basicNew testFactorial
  2188     self assert:((20 factorial + 1000) printString = '2432902008176641000').
  1496     "
  2189 
  1497 
  2190     "Large + Small addition"
  1498     "Created: / 24-04-2010 / 13:52:23 / cg"
  2191 
  1499     "Modified: / 26-02-2016 / 15:43:16 / cg"
  2192     self testLargeAddition1.
  1500 !
  2193 
  1501 
  2194     "Large + Large addition"
  1502 testGCD
  2195 
  1503     "/ <testedMethods: #( (Integer >> #gcd:) ) >
  2196     self testLargeAddition2.
  1504 
  2197 
  1505     self assert:(9 gcd:6) = 3.
  2198     "Large - small subtraction"
  1506     self assert:(6 gcd:9) = 3.
  2199 
  1507     self assert:(2 gcd:0) = 2.
  2200     self testLargeAddition3.
  1508     self assert:(0 gcd:2) = 2.
  2201 
  1509     self assert:(20 factorial gcd:(5*6*7)) = (5*6*7).
  2202     "
  1510     self assert:(20 factorial gcd:(20 factorial / 20)) = (19 factorial).
  2203      self basicNew testLargeAddition
  1511 
  2204     "
  1512     "
  2205 
  1513      self basicNew testGCD
  2206     "Modified: / 26-02-2016 / 15:39:33 / cg"
  1514     "
  2207 !
  1515 
  2208 
  1516     "Created: / 27-04-2010 / 09:49:31 / cg"
  2209 testLargeAddition1
       
  2210     "general conversion & arithmetic tests.
       
  2211      Notice, the arithmetic tests are both performed via regular sends
       
  2212      and via constructed performs. The reason is to test both inlined
       
  2213      JIT-compiler code AND the regular methods code."
       
  2214 
       
  2215     |n1 n2|
       
  2216 
       
  2217     "Large + Small addition"
       
  2218 
       
  2219     n1 := 16r3FFFFFFF. n2 := 1.
       
  2220     self assert:((n1 + n2 ) hexPrintString = '40000000').
       
  2221     self assert:((n1 perform:'+' asSymbol with:n2 ) hexPrintString = '40000000').
       
  2222     n1 := 16r3FFFFFFFF. n2 := 1.
       
  2223     self assert:((n1 + n2 ) hexPrintString = '400000000').
       
  2224     self assert:((n1 perform:'+' asSymbol with:n2 ) hexPrintString = '400000000').
       
  2225     n1 := 16r3FFFFFFFFF. n2 := 1.
       
  2226     self assert:((n1 + n2 ) hexPrintString = '4000000000').
       
  2227     self assert:((n1 perform:'+' asSymbol with:n2 ) hexPrintString = '4000000000').
       
  2228     n1 := 16r3FFFFFFFFFF. n2 := 1.
       
  2229     self assert:((n1 + n2 ) hexPrintString = '40000000000').
       
  2230     self assert:((n1 perform:'+' asSymbol with:n2 ) hexPrintString = '40000000000').
       
  2231     n1 := 16r3FFFFFFFFFFF. n2 := 1.
       
  2232     self assert:((n1 + n2 ) hexPrintString = '400000000000').
       
  2233     self assert:((n1 perform:'+' asSymbol with:n2 ) hexPrintString = '400000000000').
       
  2234     n1 := 16r3FFFFFFFFFFFF. n2 := 1.
       
  2235     self assert:((n1 + n2 ) hexPrintString = '4000000000000').
       
  2236     self assert:((n1 perform:'+' asSymbol with:n2 ) hexPrintString = '4000000000000').
       
  2237     n1 := 16r3FFFFFFFFFFFFF. n2 := 1.
       
  2238     self assert:((n1 + n2 ) hexPrintString = '40000000000000').
       
  2239     self assert:((n1 perform:'+' asSymbol with:n2 ) hexPrintString = '40000000000000').
       
  2240     n1 := 16r3FFFFFFFFFFFFFF. n2 := 1.
       
  2241     self assert:((n1 + n2 ) hexPrintString = '400000000000000').
       
  2242     self assert:((n1 perform:'+' asSymbol with:n2 ) hexPrintString = '400000000000000').
       
  2243     n1 := 16r3FFFFFFFFFFFFFFF. n2 := 1.
       
  2244     self assert:((n1 + n2 ) hexPrintString = '4000000000000000').
       
  2245     self assert:((n1 perform:'+' asSymbol with:n2 ) hexPrintString = '4000000000000000').
       
  2246 
       
  2247     "
       
  2248      self basicNew testLargeAddition1
       
  2249     "
       
  2250 
       
  2251     "Modified: / 4.6.1999 / 15:26:55 / cg"
       
  2252 !
       
  2253 
       
  2254 testLargeAddition2
       
  2255     "general conversion & arithmetic tests.
       
  2256      Notice, the arithmetic tests are both performed via regular sends
       
  2257      and via constructed performs. The reason is to test both inlined
       
  2258      JIT-compiler code AND the regular methods code."
       
  2259 
       
  2260     |n1 n2 x|
       
  2261 
       
  2262     "Large + Large addition"
       
  2263 
       
  2264     n1 := 16r100000000. n2 := 16r7FFFFFFF.
       
  2265     self assert:((n1 - n2 ) hexPrintString = '80000001').
       
  2266     self assert:((16r100000000 - n2 ) hexPrintString = '80000001').
       
  2267     self assert:((n1 - 16r7FFFFFFF ) hexPrintString = '80000001').
       
  2268     self assert:((16r100000000 - 16r7FFFFFFF ) hexPrintString = '80000001').
       
  2269     self assert:((n1 perform:'-' asSymbol with:n2 ) hexPrintString = '80000001').
       
  2270     self assert:((16r100000000 perform:'-' asSymbol with:n2 ) hexPrintString = '80000001').
       
  2271     self assert:((n1 perform:'-' asSymbol with:16r7FFFFFFF ) hexPrintString = '80000001').
       
  2272     self assert:((16r100000000 perform:'-' asSymbol with:16r7FFFFFFF ) hexPrintString = '80000001').
       
  2273 
       
  2274     n1 := 16r100000000. n2 := 16r80000000.
       
  2275     self assert:((n1 - n2 ) hexPrintString = '80000000').
       
  2276     self assert:((16r100000000 - n2 ) hexPrintString = '80000000').
       
  2277     self assert:((n1 - 16r80000000 ) hexPrintString = '80000000').
       
  2278     self assert:((16r100000000 - 16r80000000 ) hexPrintString = '80000000').
       
  2279     self assert:((n1 perform:'-' asSymbol with:n2 ) hexPrintString = '80000000').
       
  2280     self assert:((16r100000000 perform:'-' asSymbol with:n2 ) hexPrintString = '80000000').
       
  2281     self assert:((n1 perform:'-' asSymbol with:16r80000000 ) hexPrintString = '80000000').
       
  2282     self assert:((16r100000000 perform:'-' asSymbol with:16r80000000 ) hexPrintString = '80000000').
       
  2283 
       
  2284     n1 := 16r100000000. n2 := 16rFFFFFFFF.
       
  2285     self assert:((n1 - n2 ) hexPrintString = '1').
       
  2286     self assert:((16r100000000 - n2 ) hexPrintString = '1').
       
  2287     self assert:((x := n1 - 16rFFFFFFFF) == 1).
       
  2288 
       
  2289     self assert:((n1 - 16rFFFFFFFF ) hexPrintString = '1').
       
  2290     self assert:((16r100000000 - 16rFFFFFFFF ) hexPrintString = '1').
       
  2291     self assert:((n1 perform:'-' asSymbol with:n2 ) hexPrintString = '1').
       
  2292     self assert:((16r100000000 perform:'-' asSymbol with:n2 ) hexPrintString = '1').
       
  2293     self assert:((n1 perform:'-' asSymbol with:16rFFFFFFFF ) hexPrintString = '1').
       
  2294     self assert:((16r100000000 perform:'-' asSymbol with:16rFFFFFFFF ) hexPrintString = '1').
       
  2295 
       
  2296     n1 := 16r100000000. n2 := 1.
       
  2297     self assert:((n1 - n2) hexPrintString = 'FFFFFFFF').
       
  2298     self assert:((n1 - n2) hexPrintString = 'FFFFFFFF').
       
  2299     self assert:((16r100000000 - n2) hexPrintString = 'FFFFFFFF').
       
  2300     self assert:((n1 - 1) hexPrintString = 'FFFFFFFF').
       
  2301     self assert:((16r100000000 - 1) hexPrintString = 'FFFFFFFF').
       
  2302     self assert:((n1 perform:'-' asSymbol with:n2) hexPrintString = 'FFFFFFFF').
       
  2303     self assert:((16r100000000 perform:'-' asSymbol with:n2) hexPrintString = 'FFFFFFFF').
       
  2304     self assert:((n1 perform:'-' asSymbol with:1) hexPrintString = 'FFFFFFFF').
       
  2305     self assert:((16r100000000 perform:'-' asSymbol with:1) hexPrintString = 'FFFFFFFF').
       
  2306 
       
  2307     n1 := 16r100000000. n2 := 16r10000000.
       
  2308     self assert:((n1 - n2) hexPrintString = 'F0000000').
       
  2309     self assert:((16r100000000 - n2) hexPrintString = 'F0000000').
       
  2310     self assert:((n1 - 16r10000000) hexPrintString = 'F0000000').
       
  2311     self assert:((16r100000000 - 16r10000000) hexPrintString = 'F0000000').
       
  2312     self assert:((n1 perform:'-' asSymbol with:n2) hexPrintString = 'F0000000').
       
  2313     self assert:((16r100000000 perform:'-' asSymbol with:n2) hexPrintString = 'F0000000').
       
  2314     self assert:((n1 perform:'-' asSymbol with:16r10000000) hexPrintString = 'F0000000').
       
  2315     self assert:((16r100000000 perform:'-' asSymbol with:16r10000000) hexPrintString = 'F0000000').
       
  2316 
       
  2317     "
       
  2318      self basicNew testLargeAddition2
       
  2319     "
       
  2320 !
       
  2321 
       
  2322 testLargeAddition3
       
  2323     "general conversion & arithmetic tests.
       
  2324      Notice, the arithmetic tests are both performed via regular sends
       
  2325      and via constructed performs. The reason is to test both inlined
       
  2326      JIT-compiler code AND the regular methods code."
       
  2327 
       
  2328     |n1 n2|
       
  2329 
       
  2330     "Large - small subtraction"
       
  2331     self assert:((20 factorial + 20 factorial - 1) printString = '4865804016353279999').
       
  2332     self assert:((20 factorial - 10 factorial + 3628800) printString = '2432902008176640000').
       
  2333     self assert:((20 factorial - 11 factorial + 39916800) printString = '2432902008176640000').
       
  2334     self assert:((20 factorial - 12 factorial + 479001600) printString = '2432902008176640000').
       
  2335     self assert:((20 factorial - 13 factorial + 6227020800) printString = '2432902008176640000').
       
  2336     self assert:((20 factorial - 14 factorial + 87178291200) printString = '2432902008176640000').
       
  2337     self assert:((20 factorial - 15 factorial + 1307674368000) printString = '2432902008176640000').
       
  2338     self assert:((20 factorial - 16 factorial + 20922789888000) printString = '2432902008176640000').
       
  2339     self assert:((20 factorial + 10 factorial - 3628800) printString = '2432902008176640000').
       
  2340 
       
  2341     self assert:(1000 factorial printString = '402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000').
       
  2342 
       
  2343     n1 := n2 := 1.
       
  2344     self assert:((1000 factorial + n1 - n2) = 1000 factorial).
       
  2345     n1 := n2 := 1000.
       
  2346     self assert:((1000 factorial + n1 - n2) = 1000 factorial).
       
  2347     n1 := n2 := 16rFFFFFFFF.
       
  2348     self assert:((1000 factorial + n1 - n2) = 1000 factorial).
       
  2349     n1 := n2 := 16rFFFFFFFFFFFF.
       
  2350     self assert:((1000 factorial + n1 - n2) = 1000 factorial).
       
  2351     n1 := n2 := 16rFFFFFFFFFFFFFFFF.
       
  2352     self assert:((1000 factorial + n1 - n2) = 1000 factorial).
       
  2353     n1 := n2 := 1000 factorial.
       
  2354     self assert:((1000 factorial + n1 - n2) = 1000 factorial).
       
  2355 
       
  2356 
       
  2357     "
       
  2358      self basicNew testLargeAddition3
       
  2359     "
       
  2360 
       
  2361     "Modified: / 27.11.1999 / 16:41:54 / cg"
       
  2362 !
       
  2363 
       
  2364 testLargeDivision
       
  2365     |t a b|
       
  2366 
       
  2367     "/ on a 64bit machine, this is actually a smallInteger!!
       
  2368     t := 20 factorial.
       
  2369 
       
  2370     self assert:(t printString = '2432902008176640000').
       
  2371     self assert:(t \\ 10 == 0).
       
  2372     t := t // 10.
       
  2373     self assert:(t printString = '243290200817664000').
       
  2374     self assert:(t \\ 10 == 0).
       
  2375     t := t // 10.
       
  2376     self assert:(t printString = '24329020081766400').
       
  2377     self assert:(t \\ 10 == 0).
       
  2378     t := t // 10.
       
  2379     self assert:(t printString = '2432902008176640').
       
  2380     self assert:(t \\ 10 == 0).
       
  2381     t := t // 10.
       
  2382     self assert:(t printString = '243290200817664').
       
  2383     self assert:(t \\ 10 == 4).
       
  2384     t := t // 10.
       
  2385     self assert:(t printString = '24329020081766').
       
  2386     self assert:(t \\ 10 == 6).
       
  2387     t := t // 10.
       
  2388     self assert:(t printString = '2432902008176').
       
  2389     self assert:(t \\ 10 == 6).
       
  2390     t := t // 10.
       
  2391     self assert:(t printString = '243290200817').
       
  2392     self assert:(t \\ 10 == 7).
       
  2393     t := t // 10.
       
  2394     self assert:(t printString = '24329020081').
       
  2395     self assert:(t \\ 10 == 1).
       
  2396     t := t // 10.
       
  2397     self assert:(t printString = '2432902008').
       
  2398     self assert:(t \\ 10 == 8).
       
  2399     t := t // 10.
       
  2400     self assert:(t printString = '243290200').
       
  2401     self assert:(t \\ 10 == 0).
       
  2402 
       
  2403 
       
  2404     t := 20 factorial.
       
  2405 
       
  2406     self assert:(t printString = '2432902008176640000').
       
  2407     self assert:(t \\ 1000 == 0).
       
  2408     t := t // 1000.
       
  2409     self assert:(t printString = '2432902008176640').
       
  2410     self assert:(t \\ 1000 == 640).
       
  2411     t := t // 1000.
       
  2412     self assert:(t printString = '2432902008176').
       
  2413     self assert:(t \\ 1000 == 176).
       
  2414     t := t // 1000.
       
  2415     self assert:(t printString = '2432902008').
       
  2416     self assert:(t \\ 1000 == 8).
       
  2417     t := t // 1000.
       
  2418     self assert:(t printString = '2432902').
       
  2419     self assert:(t \\ 1000 == 902).
       
  2420     t := t // 1000.
       
  2421     self assert:(t printString = '2432').
       
  2422     self assert:(t \\ 1000 == 432).
       
  2423     t := t // 1000.
       
  2424     self assert:(t == 2).
       
  2425     self assert:(t \\ 1000 == 2).
       
  2426 
       
  2427 
       
  2428     t := 20 factorial.
       
  2429 
       
  2430     "Large // SmallInt division"
       
  2431     t := t // 20.
       
  2432     self assert:(t printString = 19 factorial printString).
       
  2433     t := t // 19.
       
  2434     self assert:(t printString = 18 factorial printString).
       
  2435     t := t // 18.
       
  2436     self assert:(t printString = 17 factorial printString).
       
  2437     t := t // 17.
       
  2438     self assert:(t printString = 16 factorial printString).
       
  2439     t := t // 16.
       
  2440     self assert:(t printString = 15 factorial printString).
       
  2441     t := t // 15.
       
  2442     self assert:(t printString = 14 factorial printString).
       
  2443     t := t // 14.
       
  2444     self assert:(t printString = 13 factorial printString).
       
  2445     t := t // 13.
       
  2446     self assert:(t printString = 12 factorial printString).
       
  2447     t := t // 12.
       
  2448     self assert:(t printString = 11 factorial printString).
       
  2449     t := t // 11.
       
  2450     self assert:(t printString = 10 factorial printString).
       
  2451     self assert:(t == 10 factorial).
       
  2452 
       
  2453     t := 20 factorial.
       
  2454     t := t + 21 factorial.
       
  2455     t absDestructiveSubtract:21 factorial.
       
  2456     self assert:(t compressed = 20 factorial).
       
  2457 
       
  2458     self assert:(
       
  2459              [
       
  2460                |v|
       
  2461                v := 100 factorial copy.
       
  2462                v absDestructiveSubtract:99 factorial.
       
  2463                v compressed = (100 factorial - 99 factorial).
       
  2464              ] value).
       
  2465 
       
  2466     "Large // Large division"
       
  2467     self assert:((20 factorial // 19 factorial) == 20).
       
  2468     self assert:((20 factorial * 21 // 20 // 21) = (19 factorial)).
       
  2469     self assert:((10000 factorial // 9999 factorial) == 10000).
       
  2470     self assert:((10000 factorial // 9999 factorial) == (10000 factorial / 9999 factorial)).
       
  2471 
       
  2472     a := 40 factorial.
       
  2473     b := 39 factorial.
       
  2474     self assert:(a // 40 = b).
       
  2475     self assert:(a / 40 = b).
       
  2476     self assert:(a // b = 40).
       
  2477     self assert:(a // b = 40).
       
  2478 
       
  2479     "
       
  2480      self basicNew testLargeDivision
       
  2481     "
       
  2482 
       
  2483     "Modified: / 4.6.1999 / 23:54:57 / cg"
       
  2484 !
       
  2485 
       
  2486 testLargeDivision2
       
  2487     |t|
       
  2488 
       
  2489     t := 30 factorial.
       
  2490 
       
  2491     self assert:(t printString = '265252859812191058636308480000000').
       
  2492     self assert:(t \\ 10 == 0).
       
  2493     t := t // 10.
       
  2494     self assert:(t printString = '26525285981219105863630848000000').
       
  2495     self assert:(t \\ 10 == 0).
       
  2496     t := t // 10.
       
  2497     self assert:(t printString = '2652528598121910586363084800000').
       
  2498     self assert:(t \\ 10 == 0).
       
  2499     t := t // 10.
       
  2500     self assert:(t printString = '265252859812191058636308480000').
       
  2501     self assert:(t \\ 10 == 0).
       
  2502     t := t // 10.
       
  2503     self assert:(t printString = '26525285981219105863630848000').
       
  2504     self assert:(t \\ 10 == 0).
       
  2505     t := t // 10.
       
  2506     self assert:(t printString = '2652528598121910586363084800').
       
  2507     self assert:(t \\ 10 == 0).
       
  2508     t := t // 10.
       
  2509     self assert:(t printString = '265252859812191058636308480').
       
  2510     self assert:(t \\ 10 == 0).
       
  2511     t := t // 10.
       
  2512     self assert:(t printString = '26525285981219105863630848').
       
  2513     self assert:(t \\ 10 == 8).
       
  2514     t := t // 10.
       
  2515     self assert:(t printString = '2652528598121910586363084').
       
  2516     self assert:(t \\ 10 == 4).
       
  2517     t := t // 10.
       
  2518     self assert:(t printString = '265252859812191058636308').
       
  2519     self assert:(t \\ 10 == 8).
       
  2520     t := t // 10.
       
  2521     self assert:(t printString = '26525285981219105863630').
       
  2522     self assert:(t \\ 10 == 0).
       
  2523     t := t // 10.
       
  2524     self assert:(t printString = '2652528598121910586363').
       
  2525     self assert:(t \\ 10 == 3).
       
  2526 
       
  2527 
       
  2528     t := 30 factorial.
       
  2529 
       
  2530     self assert:(t printString = '265252859812191058636308480000000').
       
  2531     self assert:(t \\ 1000 == 0).
       
  2532     t := t // 1000.
       
  2533     self assert:(t printString = '265252859812191058636308480000').
       
  2534     self assert:(t \\ 1000 == 0).
       
  2535     t := t // 1000.
       
  2536     self assert:(t printString = '265252859812191058636308480').
       
  2537     self assert:(t \\ 1000 == 480).
       
  2538     t := t // 1000.
       
  2539     self assert:(t printString = '265252859812191058636308').
       
  2540     self assert:(t \\ 1000 == 308).
       
  2541     t := t // 1000.
       
  2542     self assert:(t printString = '265252859812191058636').
       
  2543     self assert:(t \\ 1000 == 636).
       
  2544     t := t // 1000.
       
  2545     self assert:(t printString = '265252859812191058').
       
  2546     self assert:(t \\ 1000 == 058).
       
  2547     t := t // 1000.
       
  2548     self assert:(t printString = '265252859812191').
       
  2549     self assert:(t \\ 1000 == 191).
       
  2550     t := t // 1000.
       
  2551     self assert:(t printString = '265252859812').
       
  2552     self assert:(t \\ 1000 == 812).
       
  2553     t := t // 1000.
       
  2554     self assert:(t printString = '265252859').
       
  2555     self assert:(t \\ 1000 == 859).
       
  2556     t := t // 1000.
       
  2557     self assert:(t printString = '265252').
       
  2558     self assert:(t \\ 1000 == 252).
       
  2559     t := t // 1000.
       
  2560     self assert:(t == 265).
       
  2561 
       
  2562 
       
  2563     t := 30 factorial.
       
  2564 
       
  2565     "Large // SmallInt division"
       
  2566     t := t // 30.
       
  2567     self assert:(t printString = 29 factorial printString).
       
  2568     t := t // 29.
       
  2569     self assert:(t printString = 28 factorial printString).
       
  2570     t := t // 28.
       
  2571     self assert:(t printString = 27 factorial printString).
       
  2572     t := t // 27.
       
  2573     self assert:(t printString = 26 factorial printString).
       
  2574     t := t // 26.
       
  2575     self assert:(t printString = 25 factorial printString).
       
  2576     t := t // 25.
       
  2577     self assert:(t printString = 24 factorial printString).
       
  2578     t := t // 24.
       
  2579     self assert:(t printString = 23 factorial printString).
       
  2580     t := t // 23.
       
  2581     self assert:(t printString = 22 factorial printString).
       
  2582     t := t // 22.
       
  2583     self assert:(t printString = 21 factorial printString).
       
  2584     t := t // 21.
       
  2585     self assert:(t printString = 20 factorial printString).
       
  2586     self assert:(t = 20 factorial).
       
  2587 
       
  2588     t := 30 factorial.
       
  2589     t := t + 31 factorial.
       
  2590     t absDestructiveSubtract:31 factorial.
       
  2591     self assert:(t compressed = 30 factorial).
       
  2592 
       
  2593     "Large // Large division"
       
  2594     self assert:((30 factorial // 29 factorial) == 30).
       
  2595     self assert:((30 factorial * 31 // 30 // 31) = (29 factorial)).
       
  2596     self assert:((10000 factorial // 9999 factorial) == 10000).
       
  2597     self assert:((10000 factorial // 9999 factorial) == (10000 factorial / 9999 factorial)).
       
  2598 
       
  2599     "
       
  2600      self basicNew testLargeDivision
       
  2601     "
       
  2602 
       
  2603     "Modified: / 4.6.1999 / 23:54:57 / cg"
       
  2604 !
       
  2605 
       
  2606 testLargeDivision3
       
  2607     |nr nrDiv divMod|
       
  2608 
       
  2609     nr := 7325642811050717153762789776988268826770436380599581066471363310499109217483708146717300025889347764783245287140288431825827761209734375227679364238973902481615726067110515609260483803343004535447652942957373994975597787908243354307547553217414840584715130217408586553614859382487727371958203670203728210853329589615550643569429545464633535838187607553120280274725090757329790353463095413523805494772650078306205912628165850732646863846576998277181504708528835125953362770982762908435490999280519117904719254192978414037497481935495547720579882482124362070304920033554421042496625143517677519951145301160506529078213700153962585026512916970185197699563558140876733107706727253226098498667726495707224022003616065672008153665539817928251568554484739745047105522527635187163056607022536498632737702947013365938133885169902714284727206577408496549992845715870018995222990562233528977494519678931256347544259771346247230580853991022721956676465120007969950427165372994323753297510475028095488055686092040724169139419916609256577729768013251303221252901814408489603855447556799027832316669978641359003225101118289255692054597992816505634077137939488367815415698567236171805308890522013024780344455911750571267472425322111576828023953254628842107966689828686941644594589250192289779894954314728890652959077550610325243691999405204222390497498029651468304746649735170207150423058209700682117896369093708787314191673370934168117103657952473409299633370355921652776795194998872621267955977007414487536764633556057244697184265399074262010357199308106519621332411646090881806679817777934087907609335095266207222734209276892672802559477129431290377781189460543831892579497032750130070072871363403749763492296712949034307352335981485523440716455874989554006840460427619480548908526831960007098095496673990791644237848915619019143304599320077794055989022733836402514795091748221758967378808917944360112901833917971660803687798356056419168537336005651674223355473407003283134339985506017270361538197141299934143152796116511007721239543588850520897247526805181747313555479146618959531019365744636489763407090552996809230736561767841333905734641055297321262233564674390961392651334871664325693448366323216336135114828870644061243807564587592658360508871312414270046251899865884799855978604603846784154676298841585915992392704588348304942478924343918975195923643629685241735276658813975572655538887395894943154837164154459809363283117923392993892589490540925513342593007784719441705148960453180301530851234688957032066907843949205120201720517233228017689397727501528654849506825446097709482577917667243321350295028575684178929416362809008034715382134959864428148337229371113753679702176851066723014671275176890295101957580814878664773530433540963808618303311433527685959104811072639265393597781952115276199443064654238529377585171747088279186943179071921057535680516445246724050154764542596741670850809674306935131178441317280401304117745258603320024189243969889899010725582438207015597258263941269730866138781215790257519260119642107850957073141852969214624609102867275022012968382626510150354544317157440551595548404866365232107076069108476859713524926579046999471537578555696823173917264727038317433492881860460533993043375675559974541501151536956388184229821825202783315175964857435121268159290087988520427001562311888903167219790907449246265211066597617404797684060743206718943066178740881680422221097537985644933108964245133276088549914210990590138516895520058065054329273143605806169872175805617483836108276041444751410352824841438522369961070941467306815885136393083146953817333717600651525643928410853518305074271285893483690402426110481100118592425979094825294009195497071244959721165805259378411459840402202432070097961411127831244002473025945590264209304535568932141934734427207643570840464365672020197014117057179828617184095466170277658012012082773008797284377020045199741711763429387654482036311118363550554573970722123056838391535176046275151704935927285776048526642046962416364731182508311665455959674818084140845113742927564214026026700188662967826830513695781752328070213377525743249206640596503567193612953686078368856837703275526312899731904806336662979992529567407592246922517958210869076841533625492899752157880746671555381617069359816751254049680535425407993431788796501484592904619815876395056294928500125620366251871965592128092071339931385778018271508366059428400618014316995088662886944531660310582304020782381824044296858444495836641436442114508798254022275527819884050205813610927392719427503886961325971042076759694523773397768263944949829047040250671591798699614674593280712438625552771672046770702177630021735604331681545328668356298896381196151818109965073540758004677376198693809341805742022883291609399453480948898873499293263877270932469009419431439504806048534024219695533951970768718607825512258459988039384671119861525055001257711440159711680468030006281596534069339905726514213495715578762483305792208439143804155140484955582807325734068361219604129672905439850247943374888325363536124220790929563183116800098259005080319976250005938202733026601423198594337116340040753176034747789519724367052821548790017492968600851467986834229393664397355394904449416596664697790294348115918027290369660030404309844866514596162383926922191583735197797285879017756435071691692579228371128194336880861331914026966533592778591975677047531809933445220376204094007852062763024256243247594908739310435742528343941136832141474614646195909007856979265090874937138653336279924669848945653923945059917473576073169113163591124139505027406426534299861184296286788678362064462571791247879481439224580152349380317895688368254981040713360197820623097965776497254219906627282182384583338997949322384688868753460332706063133692787241504223050921158385580293599957894628416295533076654622257184754535802725334290973325498566317654571663237347731966894722724226512101772153274798569796914026876025548743598732008731155930322538300118777605906397797200395073085079799720873331462360859558150294524673319774115422392855072805588331909034084940029643726834272412931634977220530411021804722158153773936709148601033954557711082063893472585895524019049770116104251942887519233166694790693305261370262098403931338638500460698273702483237833362913924748030573151235157079682103767162430861730648127306887340728587348584798432641373495081984444066017235036057867001084876034127575741046842705361078008658574057368371382290972551200828394402811129598512908406453163914133239324104176213439651911165723583312125404951908431958612444626832567425682382934966014402623844134480947328804898904457554990223633471152244935360846846872567395324752446056856314223580293777812792119222808747497257154119637357959526560095149732009525437166278985397825839476104252829701681188291604531178056187506204522297781410939426743458996516122417016297219533676135442588829970042448233678230743338567376323339403790517471808179478793371414460742848940080957249583920379222819120854583169254001656959488520268941651760355412230878512385792248057484840320339298745595785121144213305506256309005073307733101215537859103057428564045191401917751767528573372312728646224212563853090004301461656398621398256865950301741795030996394898498315685734194500204859005200129895914605961077480028024084166201706521017250564954091090761794215977943552136119569181253389728669786275631589077849217875992600354179303147875039054389958249338829071558805071696036014384280708136310202474257546110256018595074859205169417210438407668235772264489532840927011474245787805040250578989944089804487191960609374291147892392946334697862368311103975946562702804600592135283262705727886790284962999933595950396917187809872807890634995550768965917896649379618770995853018273642527941803602373748201162016424346818539699731541437191051272370389920430963850766457735997487836796190622801454117965803454310147963735891677695932780724907240409219933741153684518942237155171214800428187139788975348112515841498442346521529922874142809101317753813000222213844775530569928492214119218158311069973450417965826021228115913570997832587000507462134261658894622095296948660838891202843909918507703517052932194777950892934484326759830164241347516373904518928184219267625128730631587594616533889734599461176472989484051646992794549374972941033191680237511998366596928478133425687348377402191597183609913275115410415042943874922013282223036797766687562234708717228407526539793707192821641982045304637501898951672018353203243730498439561247010157326717850275842340724013349962837828262281859810432128342491502593655870623723538391476208736312646369716279126909024702322290468430221078966596856226868416199720051530940142548869537531144513871342122033366003412041325058744123643998708546094783795853752878277029993558821508050352135005532898315183427096073809860479404735696155895314871310840383963606002446025854182161994409438676534109631384937889800633421957669306238761422314292556501189945069931744515842623180008335951569700303152755271126472218857847432207385749882000533990024894030463892512867955227542394178393580753618051116929938385425024087970203342497063966957812547691207822897841681320712411054476647899997427503220523868363438443638138602058216412755412543898409102222405369299283907058054142505144252800800871766217740818073224044997682418836667094039746104705778772576150819423984585572854317991749574311863090200042587643440109185515699468359875803740167627895880258372380256331670270263041712499710565984020613035159213277572556237587993858247481402455200866484793496257416259856493587482957111225529071072537348695594958918648771418745755086539672404243468435455614922691041334875071267875391058155493338089472329161793182872605415502672937446879754623263952587889465083012515482974024506303700547794278667536739029569027539204865836091781842095979099980597464896983833312033418068148036099416870991217256675646972777065922275910262922486960982071022004929591359754288008776666205314556217272149643659129541170220989690332246883597290512968292817547469960138932109624850558843703432530540563548458251740803818389916128884564107380377927554030955090368431293751439829748472706494577940655099832463005901756121683476039133485795695397208495963616009088796806461291782584789937456739904233218852673930490171837518542422869715022557300014464253539379770130907001828679637745393742942924263739420939777245314275120477043103602195417941946982309000073013714022977049299652046646160515486071522858510125026538512532826758076756521229686019516236643861044256103454896600270127497654777352626796048814315579753595410684034930492848275912546385929478301905388366502770922904296261409762621660749049443869640676686234525730982815147070574292105084954509636183802284297900263494202277262106346273298509408501260925964163271527969153455344760075934784461266832139952514330249768607822250546116328645082232537397149287150870610226985594932674312703921712201689647303170983692623648013718537633610994267304884724686274443142818383020753736848287437672619884752757520891254092091290347766004298705684071656448745211379292411880056341949058778325139319915468910315101214860880624074088224739933628426458311629373094570056389962892015767941405606261884441947643048736689186423401799688135324726895945036118240150307617274590470074687290086181786558717205596918177872025497599170920256707122647400323893910027358803516743974239059498348001168404511372867956344817513606052060286270870628439157590311659998045156965274784647124177936899464082765921232150928558673393867832500877514025700053617920434533154013622992297424683989961395195164544773940494933482997619656975002955401823151470278628829447890583331692520608980058918604588771018141614644472760830547004909601105353723205204277054858100220843067696044358489288417053911779777636685862530733028148648527058888734952577662015452662713320998042221873897730242685299799949020919872610901220937556378878376264157771582659279927771096081291387570641227589263660184974304328800241026371644634693496152671628907116378044361348718616751343481441762999387959144794856149633766264287145359338550543502403574450566297906658227167549659449971682569731597042976899648193306364796761430963500027369518502867183892521528424714258941396654757315537208349927345921504783438385098575904450316533205383619867919490492230433428758373474687945215479480124116968494047912748080744896623860514834802919426785508712839994810630938135518361550388522230840646638453183986357427908650074058682630364404843361587964015212755669857078199544466122571728060539385378015602874360055774274800826080107259485947478571241263310480273433269041612018874608869206907030535684348688412466809171164973900200423516515617084359168072722684263238409355982984938645447365604915324694040110296398069636366148511098339986168750667254777835619946102408620138809371209811284079984973613416027249191446901665098739727142152623855284808133782852451728093569697499517366796585724689797742669468565268872539798878428345541861849015666331916000495956355163844447408071342491131776963020645656976892893787238149867119449591069976736262537015469780716243982143936721917630178728713247937607546958966361901328145570841011084562097642232937625937354868187273321107873039743053276603671355685099229683453605499731141681728718378187532065603510822624958972165532522593635204874376810200781275036766022437927240950798250024393364045682189134704845812286037422441193122739522406536732573140710828441743539780377865147861896193389749380659879327866275653179078947651387828111930396337490811270697985089816201218037506115014234142814682385102523425972998593072640770790725982414228544633029642995101682258901254287806742301366208828162477387463756687281252994501452908836547072102623355315709902776432554014376309587952657925497621653825666951796394661574770097931615332475671105408244630930525159146961999288995770715582728242072913256023911103584836889339253743344246510506913924657087924098478903888180830049760169862122162975453447015711932604661405562458098481070408233950340734255196874895090512289072552940802931818483030211719516961595929768810347559895680375914216324687844321700032530945151286243597286377866371612859700311552506351798213870409353454490411358344277477826150792145755992594822938766358675158288011584257616710623663101210097323109887979417370263612584058408561358753317231537698348461655660755380659581072178207477288688962757072265160490600631588197174512903146276684731753628694529596685824595885678007158393374747938101982904430961928841395951711676378080535123188351635638375470401478450523224920448602818895251564437834189202441655076943081483367064127416752887771318611109757781248425601474160571124303096368062074727513104959974456229598353065136721943994007941337054705132775534896527968122420469283611331960766006310601910252893459785872191278971330399395239110974562830357605556211522784691991561501390889806743958122904782088893727818201559345083867749044489168363772143703073453861134806218832960790409704879310579717552309996536217584965576262756407451564345833758720479629349944383529092132517915571954489963418248400511019703249483828204180370506184025113885649509409399769397711510007228728095574770224464446547044693015123777262159249799920884371538510122463960052058020131241942783200854033288826257878667417602086305216692912715536488620698053698022459949861565969545496357876743594887244566194824704556438285754633336308260058711894417742350590911910751979319176563052975803605412148165461044329096028626360061282229073291691883497842134279789428389371821455228942452798912977912958394511561774867405616536174458495043002980673610932445441383719655132197637184668163335110303541471123350976668674100112488910955928337286996714611124366551465792608110489076815010708899544256516556491056127346270833501757113609337499406611359404510795587423010608098938597650459332997781990621787924888569110021893517402845363268426339706716754389272990470513536737039987732318209821574773158004394368361313988432686443321166887644602545565041603076909330007914163941559127137026301018995229723135409029401064752864596947271438965582579277147631406637452843077049145457341837232159559730366551507472354953899625929803225701422561284852163965527957074334769617150236291205879362139935058355563169747778333904452955956839634568402701244925016745087651928608816736896469987882537309453244944834414373262938906464005059484038244572034326521612529650748538305485316521177247308396706868465169508059682590492304730955362364037150109353102703539473481458183308919847959243679572900240943426756852783203732123528501086255095826959561188972056318497725974188808836112899288753036602467405834455922655584156707363544433003151873583632491497489084045609299373141002646109273485527932587471790254082751973899027694147514158739383819684253034890946834373388441862051909883719721456276038041023850094627569248404828269211588662076341724107938139304211383814235573153888420922122069650074118928661037695827085823059008478593607756083868239999584244123010713329522790683394908267830112016051994957975600649644301974822906420255696156580630141761950629199586872747965112569565095469854869800403281833556388965700255873755860649520760282097467209698862605898434981759137733994266863639515406534007603175251563989668595260982955865634557781963224702857431711084062719151650997813779049906730415588122420262881103439896718580338498764211791089444646113690306378896098332737896635627635707772111276121536695313757806801348052118367819007399440960078665432399602377589467171594166195848994511848676342889852715337165791189020515662167204773204943614199127918332127383021743482576248998849902385077500814075914415851227356664528451616748460466665152976847232020446712913142880265960029344991220490001756182292717800761425879396636844902717038165543316666346164629380858250514747045491468395622679634227153126619733161441602334688751330958487543155598758421785605951110820924317190126071560389113736027517764010449768122991989484777981503183676348308768180078944633796744764632437921469707222455070766402087305156639658996955592139453843175790298794847443059643374415249421787873000204116964718653377159672324783600759484527475614449099007219842795509953657219555506013243218552996721200522560495144292673408433365706761513733674234568711615287301193667910837956568423438400639397963485968493623913712571443662496434067716848785221486690871940013498223030548187623888628374477709165936052912242994609169592340209437745724218818144600119064099826714575548308046604766436374108048400515726390133789845668096714784867008407173380319008417622029995593936143909536352013256938215644416531080180324802324618594097721172967615098799962908130441684305713015684547786299489529752824756501155428933939409296205517218276045889777478407568327206299474573691014209950666820875099905758278156965131476983278829571931391277816150330174477625273228440900552716318825768863185688529954386089451175385273662218329372749649446918354724443567025222349254449500617488028496361898409264103494905512190685896563250346346478211054441208028146386655248314336718654702652948137658435253312869829785373710193043688043958388972024841165561464326457180133203136125912400081649557668375744383899632969559862047404192319326563366004043695206668245499093118179837855729834168890145742251325448274416525637217013782454651636292195303239600214499858171679843470201696427000689391939448538191864553657744525021360343641380208086955930529022030426160885726040281673029309222840802065136346172382864319126701138148007706597835132695333947879760079153539055868548576156789850188497064536338026379929631234929007846807334812010645525172679991044333308985640292227558092752377643275995472992776698475790987837268792851399292228646489527461685929270374165049749069600603160046531920796900241727037869527459596145880819238533080519265651802795555015701064625591610129446123733504319175294781249602732333862539881844001174584054522255651608769617444327599828563581084600909669099440890092395641857086470399143117454131045827055159803551495132022116760892488889653153960587625841910867118206599437776258771080930144854653198726857646093716759295479410273617910942457821712732399190660866650490310710185557517394324308553105747144650750856879369349462377069251837917999202072251775088629659288184803660320127706626903128184146348671588370808814878328754655521943032817668859558325837576523141169778965733166386323397421920651468704737017814665502038341659575691927370030081718281672624943907725801459555157666049437494098603486817488433976626337340941222390329751486891908768166184463762670896534403352931457546379158595470562519774115429755212992688771218914551662191667783721153049023035595877690703411366361819400655202920269631805916454568041073107237253371890381490738743213309620059159993003849604331778047563116240972981607042015453452120068390822980655208034481099171665126640420489382675390866694573945421665672978524248517728079136569669375989021101850354217557422960696302555361297444201614660760149578194625887224649588332477042831119096972466903323569062428962777789251193844890660811230501531481978959612097815608680381821610023703044066176422964276045425566045824291045559057543333711029208777182180667218083104949199239136505834286628001776139959001219218905737418785641440851285017285337841944056173947452985842634788119839741235296336597559262487718554614436546822943903751831157623580674824591472930566041078221877158999849916636775398181102018674052880692512951698697513480517091515255566537032339412246743208266441707025164363377133880339650825219697569785046171337552332893545340847276858565496437706766030630722861762469516812573460899602135044490222233011994495526330459680983366359908902306295944044245771154099378936054217933392621460294966444315839619038214146393712002594553326031581417561314908364002486755770223569034363166238351234653984593425868697240971720773578144266846388819244504828181776390586079945560272760789021959416347716506857324409906002813134675432442066171228067068885528419141038131029179667706526774372963054478099683768936725773364000366960379562118197023510329482012107157344155875448591161595391919815262096502829728473187341874733253651529919979538531811286641534627778595530733985639584783830665988435302841891713116049103963675865435203124837066057645535281252657153315351003929269787455814660826997441903167459298690397042785489023802967671956590687562052329368827775864424049524191769265315949730487923955413049297486674195881931530552325062629106937559254886715285149290376041517510254575017089126238369735731441459908323625000391457129028083634733044760593008952189043595506011162821891237685214611886906091274976179324857590706091796406177625733347163004518021058299015360077008619141355691143129132531858006034134859471413635076801228545121952706746023220117837638086686354108957435599629954680243222435069621658931397374328297390779950081057015375721056239174253648058468325719338788133801151936515595963203703897529311280939274519350260938124229883720011888795447147955456430451126315978438040080489704091830058887795299872925112565712154018417162739997545058930991575800581788972727456060664226272478064852420923999507537882444320718854395590876566227281632171045068514052351501673709403201037188250295301734415546890351185372093093868842689894001551600934381797141922487365311721131325628216317486392434826534327444835813827040146040623702648032380447448136154616398503109030818895785037281436914811186726407883525589623745784053150256537820204779390766220428603926382471986845043607824571153400160052404381575056198801845131518390346351149303614811547311242885120974347678264504367422058114110590584616857433600543740991959073794058140903494097716255074997440636144720728479858818431649567101409884610735460498756656979805396736031128522080195025672224591817816046577402276820084711291274356314869576152330615815241767096386124487945441087050607753895420887678873857176400381643559607194474756870418606846938092225072149441622787084691405251105866384641135662322242739576886322176214547207279725762284255464168735963793003697380346821240816624664408301727144025359059144838660419650159844461274414337264603692360330829781038559372304769177150910295526218586671075425593440499090198871740910802116275754099660717081809348908577040588631693074984232662360693119209505027983812508319223671439887199802525968038619436452231817179841365769913890926114871474823986102558248984056751171047487920908703881344710413315117402556245735859539904885030456237268421343054705364347991234047913856137332488820079750762203668981258672591585746354112878783999551179429905553595428779319618205955760109855092613527644960822047320473227114766963811143741244543560984456111125291941526870369848525824391192559998244670495612381361646167116316134254469202262396491358927397506005317375010817174654504297216767011458286649844846972401675100964256583057423372220731293103426957596949490693959409243387593122271779730186895385509002372128203913747196497707222954185403205774019431819289117303305570247189365499173945821877882947041265338660691701329332190962248344273179360681417405107489124186407998243259234573342968597256163713209217434289027957190422218111924387788256131382512827800678950844810180746534889923898689642780000177422130718538953322034407815417934026037724751662822483375107800778896663583289121202278023801612863043235964927529347161048346388661293376210119688831516982901549177542348947159080101505257893914409911057786247888178114455119581370181777267188461192806263311755813332788407091502471672700680467132633477533561142293966656214747737409578555062844314602141692485230285966094671781847301987395271366469630767558062112328885393287218169191308218491026790992185940472657740498984495459678622709378403150335318468905992328881663104160804687882440812818881405288046436227297457076591968843740953385063083343962623712923639380484489819982491016361780280276169822287192392447562183004485125881771767301867399126196483636819125433619352232936820141550863954332722336201898117119322617189636537779715466381486919126946687930671216141452922541147106709679828617423994874259063229649123229518230937878691439874612244954074507844778683128526476317639118125371158467622560854714456375919537991303413072742967677940130456040692658489636525122293276481109808057346731810379189856938253679165389325994448637996699383494712921721075102752165363287472411045626443402092824653856031130579486630852299223562415803848929872524176136572203720259791428116844323532933588350929434768591652396279151377056649946904423876773164294300631366488764834105010682185485963623493414811764796197305673062714223556389869461430429375897012606458055194019727119699064615147436243860806192462008343479759672764808835547065006227356966938579183385683242312914357531439848379226427244818697458161912778146111681862542149788668492334979217146007920768310239137555938899242435302928517891968231720891496735372779516584037533540785957755005709202109126682981133492715169216867882096335742028123146922474139806442352071726795065748233286421357136259478075789617951692483512515306524891863357257717679489398290018317806682896210611402661100160374226086537049073243154990027642836396613193310176604504810534893772428808909650946232081171095067517581083996381726077971297100787766219854892974450821766776476654920958360090137474327967048906416972057811898669752411033820021430818244474866948828089694542481365682716635711181667411943506580099933345985254871356053492593961261410022611611638590502797062851727396497071058602567774355094747163736356397095850006997424923531112267182732864620909866113824820058603582958531094555020510236027027614431361800988521200399586673119547081726414690946264630190526634425644735734369461310520499007520355499508585543263341743900683573459238052117903500693000834091101712801538465402378378788144062565678935408582810427199506747176661448934111477635429452999529543080018774599929511274133290665853831807027349385053891990116923477073601573652090791807519295421039777391917621497541985415302633144183175238454215017098774097235275853537209261772618306543730724023082803885507581143607139751832537169456162439207812666381128402696526892293998914258723768720017499847984266585234913600117422675602853831759174426206891377825107340342701248119230213445536811698998359038183296563935302499327006034285845728896557943782923399556727004316890263067394203880281380073469638121484580199160819715617289728021829847401418693279991820133854136572587461373226302598594529298221390370775366987990983177009324833219732528831629990421797299223802093648161616663879975810476101783579393868468502081257564874766384664501509001183842063196032638224612125668482059082665228528142159069942060893915606313181707310505441794055294071663547920016602694400545595432136470930681411209271045562029874387463078108850054385998584637189771275294132908369193659781957985776433491190297689914665426509472196522411323928378195300561602310224530015347222547875758340039768542111436297653638278662369121460476330673013642837634923317515965253459144537815213719135592442299298816576373126634138038960909820457612677675783457258671339723120179633081955516804990831567693301696939699672015449317249971642551286584808129342788832029436801657018628358004798080608105909323093198784846845645325386979597398678978830345672780153323968476179576140696425471821998947380199201341358406139850774495886929512793237490160142870088261156365616557904316857668388922739833923102142619761438181312790544717406255524534509231320343527106989160031768626195806563471881286599066109601085681638916394858229430951462409147214901977476398310691648884105776491098520166157330063939443875435796943355719969632950102186397143687779839736579836206933338819143959159363406579332971362010077679786530037433544098847138689261158878246792507024969634114253622560056328316234987527324602651240456647339013865004249242977561395674701577956969389900249185989776680415380350732334128309923836114711035017617747769595002949511282687656602753426366555822017768660677216237740216507472925748667967000999718713527274444690963987157522627787202354721060271353729547313866987732075979117079846732413636459165812839433882317207155027374226318776368857252794717448645253705770992655896057862954179644123532323636460584760744250739359102987786758637467637353356965608822802371506831339109050545031443083639828791912591491173211826408402061094497140550687518456511418634831704222491420398551252188798829570316127890035938622709348295255719221696461602749283552993638948947540135681555161478489620846449605430044941872799703773058974361817501697061476133321363775760636069455030846228779531268123378895993835780337827038608856140980413745864293745914406340229750270769504339465352030356216744024238713735806990797168008854280945697224613839870090197940155282712750709172194380153634146926816676024515823584088231400463312382777203125668639972061892098691453960817235720605917593037228214044515858127191970494660211930516466145592663099310492447409876759547267269546121606395117066909754582947520241309163725053673240679714256180891234020254453276258233353933830411269188099460453101101892000756745988828048282222284444127415763956898935615592190117456834504468742950360516492684416298793335152967766928852074366733814540857573444455528985644845185065034346112640402659226060116640258934520978930605038249624160204759818066247093333611839083145229529279417098896841881437979538519201155777645178826287972935358996390354906995489934248530800713546948968183148003843919015314165041496161557496179086007896577579617867935268933548581362341854451994408726034928832137826659990639338937799609636453283954242809205539456878416214070953644356943389856818432600837207778616720748676938374167354667834832060534863893167858537784770073045535612859851873945303743454718296695298634664951824381963669712257445362562336753508214174025503527830539500054913297955051787866102185934642635331258792400637526092515185350299170488147855128705105659867618088688753087658254737196930525115823965358676681318054168230606026317957031887517498191886041759009170380803971677533808855847935963302413449922868960528689064335811771892647412655405511386556297232825727620645847030173878179578724353115411237535609238689560816107970307741703445451087116907161445232553198068240181847253666995114428407076706548882661985472194213910892387669936605281007133618963508657753133705642673696817486635123227343786590893113124229529397388254617250179612431485026422687552078010821860291619515171241168065674667610207596394151847581338526738718950716228321620075816773740443990198310650129401028199155101511828634637136915354619277160368249371381078808111483113736277999666680765128118757290998894150630894070077301710464719965589744182899605947453537434325424659568476976257807998688140297038415134478560327804024687366732279706746035700937983217159762314919697722630018306620851175305234116716106843307138903094060632759586446063354844094943376435539651295604866223836562905109269402588222614796293798277799468218379916416521276024309764723016595827980045529911394304000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.
       
  2610     nrDiv := nr // 1099511627776.
       
  2611     self assert:(nrDiv = 6662633323731567683137463770425046119972136130490599558899123904210782000048955657546048338089665562423074595372134746708823296293971339062117626089251555169190147414256458077270948527569093617282899634080762548342679827245086339014549187793286219479991932728270136570804297100483133701307636938694238970905034502371154888869049996596580545736458232161676533246213776471749761506965201454953608385742563840091139275162427885091025804146353946887012629948484423153743921621737866106228003445067333011961381320536910074258682909144677567128910488902078543169686709037300189304457148994986416728307763424855244492462783182558234861995982025264479668930619989751791520673311176554512802339256928913261821455310942897696812136624011889515033152342298071512274969356920005509130584511715402639886394993433908317400104247253605275804809213311644722625708569208536590845345008858415466399942051501903967025595429523806385287189963483817993580193128873368523227715891492147715101325512000610702205499988933334611073532341758081435343892524554804643431682872519021193151143459141893825137519042963177852473768417547297991124700818539000925406141630391619735578765993129524005603624473698812857747129288247152154569878280492149839872603436792477479782943819217222827905602197688669811923223236876518868169077065932115442814112611272507112872060586623457737282248353708537440207167545131324624997338441147538821782465377847014831893014759727951431431968895008978190868943052008828655078064891320004323949219391175626919627742850388198587106996637256185312818463363915808151256605758842792136336001326613101088899142459264924284800653801657455269721850699589180141531487149252598219454805868157021677473942233257684196639595334983355790828424192909541992782433644995416653317905481191664882406344528748368967757631115924249587936451097739407299792209435266919538221186568760660301420447293747151306991237865002378076318280180526977727975952198908682179738530497531431395267954927026964715297743348074891340859860789456898608224255025187495012594124570391779113664193099927268994661989714354273464562908966902793335276088839025616229178681024727936638794047725854753445121469971920000103358186939952444241621483187255438734831666410707469056761064049453502111688296190428340923841441148946475354163955033838270461267159320949165980839533335114464512294874697208511171752685785408153217445523193778985790372496161721264624578255386880658073907934058789510812259862184677985571129419404726995982428753663670210728075205992308115237575948883416665937774630699551861339250087280966997886464539913201627606531742484162972849780468425532497380768638445224373234076062753384679812079141062759905910765766089004401051262864330797018433052954090763672692099410879958238807338698107808012778508416688011598376942350173207376910229491087872782626788596807338691230630211536158864622893956734099080442020613927228902807774992144293064849356703912470587347365098361451500658414011543243947940570486265588687939149293725873385717495020907919850152172396648759758331493330026994294732515271227954608685062834699381201564024694020978463624585016140470976879181330265581934326720818333847725464851389246839097102050339237267017355400679094305414741521873249018386912379564657226367474609265595843167030823823815888307326919859008114043629727548060061462134640542960003237935595902000153006810199318514370026314665866355006060662101944184764882516982242954519270451909066555817897156024927674610449508845588002992024015689920157493765829176802821931631590241487238873985285696003426340287794076918847820343809440277189797464887583441187676629382340618054613952244943532083179065762391482344807692465983310435881557512776871445023245934926397204809407259057481926925852885928369964436177662848362828687829863675543005561550690069465524227034464836091588464269332378546107140912689644468971000647070233491616299386491375149772573753171449947304356213004974407827081491882519644546780260294370715784722926779399796198511750540506872925851061282487638657519313905164405423591836522816111495281603995252289872385086476469229310711401528527506301257816056801709876959217865896545758738590541706792036682061363760042257088762989112039152701520742768623568505674079807810875863485081257794882308576605276750150366298371039105968353284329219873078273054143543278652910514327315532991571113396292522800982678225773832322663106505081384006672724636320985174081562785472030426212309827534624166323291136226564299729779926610904852724095137745669038747074706380810381924397482883612399986254740569208516035970744086352728731611278556045932012031400560563908745853060950689115708469515692155527082269323865892247308760070844077451853262294943617058144830374014063090229211365020886204814145346309426230627122487421279225644442725951826590928222475412083281764588227804815128066475027958454121524220172577508201782648035333837955540129683619410765000534937610139700875341476734142047589998542737528010306112593043148198988006188165170845763794500602249285494318364329213288147091824616909725569939842842543596840734083524325194154098463289461537667911688662904500980902221288027220544655818218265475837746996472010236584007176738575972462375026150791464142148497925800115687265675808142920616038812782060447067014154305466101224458342793123964105995474584535180862955288460196781648553085262219550209211207588026816531112456709030305544360916191463216584932837523535301571859795009182479596217471466926212940178314362383320867455900637582040017075517949772956047275866807594416084072169300543338235271482325223007196166301392848144570452154384977210957293114632528390739972304218279369363788615170503593817472053417243282259131772615839858816679000902088506393860091327261674653574046859271748229366456048072374228952936986954461812960776844852566037819383835600381330161020048169786575176406335437161125603009418044684750306284400745015540086325935345626867567751378481969009868769532841174689642757402653727086965191901579737800170435839185407005418578658287140871751975359929956215389060409882342023572364751463302859267203670036848697371716329102635164492370580294469523800234173695676967556158058431931901118142098589725146905128352892769397385982936860912089503320533289229159009276510219167066390676852427014511459354368805077084042375052908754180535991959079169140810351777905505393392636393431646479931302422033114524318678899414743110703321665415570194813338103931163016485158053150293320176682849865950119830732697413244124732414049420578484034599229592065444814927955090765319822680007274309290373729622349451338071624805845426576853103003370567780916419402325897239482929120438541569564424943334867982370378410776501847576669342499380514197733899878037687667052618283223365943911896105902249524831410057706578101179674765029139049616899153094252341846800968999185743059608692632244338477301941908375137612702490034105885096135690595893486578406810583373575282511613130846721636016131016419385094668786170270105099382118058667752659173909237179323408143996490057471550438372565855669568075707259687274506958695435449557449093301254608165917100788931501161845710670470989502338362996305132945287246866702609436316376008925088459078082627911685321128243349354229036144786259708802466926683070160849866228958572801968143008687496651087821709717221337749533437341262096267973190948389492727237032475272862079136719557335553937772424498412907282167253204658036522663912861489967343545754246593032273458846618876337536007203682712249257269146062576546910876450005243718339617735736623482032784880126505138707551223982569305519703270511483547382579404918839636852647345161672956598447115365954967174398002999413589275624553356118459301663295512883021676137652660825734676124215499674882903247218052630206577642084012432827740455157014364420171474367291740649414319526344397807373512379561085192818359161938505367228336721095291925155065811136228538259401638220286361061736441517811291787368531134060596121120227508274377982866581596616462970013543016021749257061326685130571812001938788851323431118096288750404400065801469551796490885764071976072881177700325727466583683008951024461863889728341965881114787320729126972054716702704109258400053128328990837507682205316986695881175358221798319366772405548254243978588753267948484911744969711778505544859566371008691126381031647673694280468482450520966964802539436922158737077121750002067704209950517947895275485187950536800011107737855580525830416272726621826086807998163498280837268646635732040394769166712960660791026071702275406585969427586620725056827465122411839751932641129741050664123546627575912560511096417077652349819389991841973046133599693459503547277028739085889123201599430748088793537859468190507211174911898362104739455512577053830969074103537490200197207200049611998015566197237458603889177541028426143550097544365997852341124263498329937465890381606795295955418098232523840580315613869908469965450988802338848428525762122401606821882953426082028665593848700047602082113394220896647213988097023709581111850996949900598384480808761859793798146684096848272987669550104826786271426406384927141254967004421494402774831090228439159876359957377770662840899979305879736692449207314353197306703720694762653242964236415719707807709474598662585817690053244256584634094675588772387320728876893030232700378159568564796767815881221577040003142829035992250009683957501514432958745506657813505062455380239289536840908567419834056655066010679741591568523506419291023346414842722152449355047334627139443779463897483726315136235890415753009343093216483474653995240946721005159273994166538118965875301947867114969329009355586236318538876250685609005070430253377255824432219814984476455677020466705546834887611998078233503929866669094433324734408933206886290341422947478206056966064334662828420717990695296446636482902339973289591596091373182364602203890422888673967906434865718458245218781812358691248643177646331019984492877159627032179896760671627209600850253346391553616574626603287596419349597318213312704240279836597936499176049259238779919659359224267409788742546907956321200282485507559458481839743848993694568980420138364844893768971338467175415458491804391538574796876754405099255829357011671106608209724284478263756619062561946992484466017881479781226530089273673529323906138417286165020182482970033492405254420136568337797393833604513114189281093733322434044566828573546466011111351374026204357974607838989739784779000309310988838440677460786200468664461583688408649555734386828226224795341890764896222022843007212559090108162021383514450324833808323442944564068880379969871474643609232099524672432072065066171371327688290179617734777653046940553660629197979241904416814835983950855274272068765736863745858963201045536085042989062938403688763487261963686964428476887533136063512074332363974690948558717214002383604926898703662000671308292653459533824119645680367911743181294681283019279375110761642291430932623265766493454469257647709146798421760001872528500721048437772780065726775583559870942098046438397119753740490868306016527691410327914835147693629474332656459501972550133927210561728079422781253432105249315186092695867012382237378862014890057147969807959315163943016544546298690088701484361031394763122216597928194997139212034462694811542459062553095389537586038839071235015814370056111693269389352305878495387099950893625189881278100442169827936555834473905275492197948797975758169884639129722925686252861191664712463696502617916924251331904225415709036855212464161811580220910449150251619842632875245719603685469328376161861492205183767960018924893683703862737234341532850039837857211248675033249758162682137534755933837705941315666354487585368176046276495167470532765222994435005694159229340308269782771538682076344939357692679425354738694430715010693246526855161993822050738084109068988456669010456828514452172338697819097988850645322196559280542955237043845644875480294191294243671628138352015652035502147832020273418517146314693212385602848033983824623687143092609964470596861648812591181885313558137704270635608088146327043933109509820109861326543893172335781445926340867738481148623616697386431217916074089554450405103150269058917608330277763824073839949907229906564057762087349990311778587768856946330357372471841275187565424737767435082996992995284357197931917849454730570975669701554500305138158088651708126085216389971524685018121085532248742434165580153047378399460873550609161599238566767462611149933427772707403493393907424627064456087353573406713733285621911399526086839253252364920421564239246508902633182467505840796787479557927720879016862471757675729538193109452262750608872435631538942265160767804915408866767719853735545879556628651112971951932782255758506758251945975744362293034679502078243875384929350503323125647362412515669719705455290178369806457412764733465715860119591022250156219106181326562931513112569640527774437694546186046408836197585138256444950223039512425447239856838567382824787147773363964308297000112321579912390413854219643773041550014586978847525545364794414262966819887507035652321303620752105217176216667343339142387440168685055366893363995549376670079553282967791356972668015843949376745456315682701891383756331415264006206237965084878941733844343257714837038003432752137257495692759685719124680847167412614538657367006068680166919216423380951198784933649947788603088487475981482143383660343066401239813051800174000533422015517445025423914324655725411380579191151076329105654312915546930776739081083130851209560307261559808003595454190858699636192994182698489579919753682299765480387055479694566268008903344458287769365183187828409240957337041346594822068020495286153916970285888477298328581357959138997929436797741893882044055962890321491207955092531472430580766283693859646215925564679002104430854098259562738959271344578729377212911592288946202639427352171631575468303031833703338256634096377869121483169247318904967557580606897753481360433243071165788807886349764388293820695191793366944295901792867034972217834675333738411495592200037471295720880155324101436263128307034059249353748610108195767389020979150086248268345752906071488861276742315827848748423651031498876866413731293699920942666225974254628767337160594389199237190034723264888058437168327407572709723914804838989858772126647736411522980570465381410084236050678330973124991667963023842876969302469279748200467545110485810034399278411447631362160061302813940661759884034612358568237683981191908865801458121853442888039446172937851735631594598045659655670606785063854069117622544099869154206792904842994724111936422163524033921205447454737571280459967114554653337916325943852925554693909749040789538931789414251732580009709193386661331220447753688008685205153591603394795178887882480498680277349305852539404087412513732493890167379734424193689730774421124197396598209807938986005281190551806069183559876875280125104661004987176879496554550976559950467476559304258484634527452519381498017040813588033614753804422807393056528398772163482132360711680090004176924055583698960466571152646455948292335532725821865747613587236595247530568040947130838943692837511089697894954146145800686471738817451943314160624802839788362893581912928352442591061642144413099049343949783668458733212864946888676178097687428090333954322728693913329532371868758870453268823927363537857721619750427589553115439726294751268818431424046653951176908373270894803348106787107152478615187412606784084264974789511303754855340051658833679689870263545431979424720394747263593027757345678621399456268980783872231272861374648345111361698362447451983621128788960537508008651496314069548689924381907425158401685801106563911310636385954732278263100830980578484843580473312548144610442900203565265247985546564550976724435723289297624666247935684674418868117603325806261281593378413719037238943924955877274085741135966282362763193106721357060382514254442887152906589877023423856680625901166776450727839358966536601644959153609144391132902459862060242188807417448009183469264503039581145496052228654052676496725272553819319933882997243226530495493561285061107687030878215808993975387490670647281729045828867173573105303000586136076645167624071720961141090470782549551314716665078642257836261666920413308268644174214574267682237346033030519874726249630752547960543633630157639983049125491329584885469201996544958519723770711888804039467535780543824274815473477301096898595071283422404678758221733495070552923171978588751150443266365227380501603502573111410088460947042358483807313590240913510077173949793948813061142184688143009613447113936857687916497981028674162941533323818450350080181784482364317988060883443497947703206051150533242121659128958857349455686882605353850969092935960402982618118713619556828483369397811281916611054914712416483805731465976494964146531569215799109721805847028410300528694173153527532373153045249500878187581518800314615156447564073770740022098961439234138937750297512946800381652855912829289926467970595537813845166063837126428330597144158673094574735851632185151893903271146216711815228383779829505875249782822697691614321461835203609216607002918525904157716238810383010391065426897393809125134642778347338844701765770751671444268397042348815101706901167231064172608725124761680162478484393439069367788364606593491099359158275214720362749380640577721088524470104995681138292437981278208476931579225731985482925571630931097842007340469617197091896460102706347332362145513466773659918337317572988046499916670479070806370253529002190952670353070666744678967350036570834703676333309881112517065360307108417452733002563964433340667896821473681133465222881870547446871335962511010619755236243761374511519456442193793333594411207392794004105476372366726747732579235992618924015878318955393497608385365476617805871466249190595260047214394069820212568325902033965922654033888417912286484711896882467251228378354183552293400075258206316865187130275079433360393164503976387026629881917025668725831325016331687957472029777811248536434487962818526601321326034011639998240520767133091723253262191478889477732161417549504821178703052409631566820999340775276726216946712534308446072712286153652680439930352040093862145659622442078648977666579419037446128195327816883541805521638906205222812059694261274802822911995857217067861269000490423940129053596411898677534589257055289125128765042939890889550610075923551852304168673133714809214526655242363576702244447943074362796222547671711899207308354482159297375955786574385854460819445028523296167863099823730022352090642566296479684850099511564373087943558717295760938927621289992360634932091140965012523878555060864106373640658546915478306374170806816257322333143836404972687537427918835335849909537778979043364004415979697596187929554163161291338782947874465678267621156819384376292481035494619822724135714643080670449194349117313575477023852251462157100442647234811207590910430078679631359082941846933243892425583167722406828385000563844537531315125606281753470690926728570451420660194661881586853830856879082022622614444211189862027995955847075720472590981636180405264920542673876523908199231895835194289372937814963109185400558429783080140339774478333285537556699238361330987736558384436762855693888604544252644467982372255364280010369297262804435889271193485633563494271128632242998571978869071398448928214066950611845110439059878457358040260838872377738188879643075650321115830111195188171223607598166789592316367410292281897474240707780500277373863291840300035279288645802844513739755083609307623251094215604446493961519719176201768010830924261149752008240975627953538656464432802892397239873841558197762448235088987744283265644123580215828629229847756497333042088017137113845417927907308370118694686418872787249521013870679592265695912127418059324065039553961809510883312277292682811136302844531110387585647794846826942508306109847156295035588893190647972929310585300837929143605036855209909095078529616878524697187949533912616220353861101335179781717322334159325535950830348702683903956713848030991031789277686038206518291309335679266186892665696297646824642372383904924530689265908078515046434592113144186677137514316332139654331264735125017720528644967462490620083319716124344933995590200417291717086036610960506908963278468132327493231742534480298990695134370300218432020485190379781750952733353355873678374453180937874211107688414514621736824496909620169986303101752871651896892513684703338313893053933255183789081818233099194429728174343667583800232334087537030361427268946243458842786771044962553296095536703477989698602508257697525945310759504846774891475733740196021161653485418777347759620656145992080798847727381685645525539961559324870188895773727580412516237803781935982581716437412611301343261776643304819481868619659753341516913182720637517474858444413157832505693243741288479267641371737999729095261543591838054428973561736725472157668326318183044945915784847874576066830414147706853941955038585159805208300597749734377901157203392876608064388184267818682399190422948501056958194837938391733278658784527755984424606731034448309440295924193353554895405585796132948214826002362174122627776551327343879146573828709566085927128207558802117131623323460157076665769242068403665185141160275937828400136620241192456176652835846834240452613661806597521514177023165047302341679295555551508051653415609814912335474376911818568116936865517199968267319797266790612855146314008776741341483924545019506352746861761799184869747515293258290656922190388865397288264923207565564444569202307046632552992848187855320763025731448044322626818272002953585947000990139604564002024944509293877714454845365556042038716302410519861492901060742979671634076805703004367909180382050303746373376482562884571531258606847571505895674729168873404018309675988438701948374926299395721307787395239134493403106002139242002160785480851729136172763278326205183918096527325878045633695581592505417560999763617198587755156744222535295963451807660480724900277337461447992209534969141734072233109797259073570248716353319773293544532922325041060565932210392148625152030199085590108347217176792108238881854901342897723225511945547225075822119388548782819368313852606548106078809355851189880251783054363594122321357531048537249744113050418065369091565603073630514273403592269082568082618298317632108493592673811785028807085323208525403120854794483676644319669608513326174279234197287824669726834966393161538408455310478065279133231953852910635361742906178576755214111517056327801824696461817882594873856805222646175203300964795337063208197930123387100035611442898962537621189321957513145288545491320961201783084023485230318684859529665194381535043030992718697406456699814963178889130392858728202451771804840042186083208062615168997950766084371341242335363877881080966617516431705681821487035566981405152551846308469495319182057575043059043266754766612593919342214655158708509550193047862153144017813642739949190337390404536833912770771422453449645873712360457151269709782651006515869206669914944100670221090425818628601774379853413256806505273043406959924949474450066150399316439803729716402849663145119931714415440906395699971756190018053547116471909246270169142909777111146276158913184245342769165725317045526866422285400296863663896924113569981788011574855928342975415991851606735244243464910312696061102300896479291942510255551582184891858463744530673406535967971578872825659092205865479824130931221984452835683846238511093397524783198334851506279344401387929443807027481880885621453705681630631089489476296770158650928120354413431647606394294397787931502924588063599432632004248814905232532874069922767722869190218991066223241787471443921552795301565594166172669223986011515539182639311651756170781133603153285133649653252244928860946768958545104628751685086750644332576921314119710268248219481287934045631571968130610735349124325810882583205080365791756610466151484981561971003167210505449761394244116973473697036540303439437127913553092230911492056676149949338521015670614036534613837352259788911948678049240902575683723282770265260665156443670989248071839321931056089748674072520359193076479425403027075088844834493105461097317694330573999345150061096450395197333950671837028176159805717611029046806473790966566257139710214116625838120990838702278978040950346826860768941596869691912534837789531369798770098970462048699643710814263334282244825464986836886245787380161175413667682434097411896621020758210415293844773093205586852281989095832718586711802332595251072220032029846195189676026260605198977294380817877532759426557768078860163274145878332404258531245748591785784732434092195479770525481182815991797959825445637531042041590611915627213811517825520630848877424983543969674297016002608547715519350568204779042177473285067882211063589224482812938087537556266733962298371253557488669907498202166954216996752726405369916819110824141254269240923809780103852072731728780585669680264810684354097106594938306148015694140288412584934322450220045927342286585818050261340652821302794356397253238260769202499770588659806660140473202066417966673912609639439160027102210101993702837140062159911232700217576203854458672769125159295245759720586896200403026721146586614053545788918421075536183109733062570888899435174093277080789621706770150853469920781327693942173755821341587589068464271704145993398599584907221853546360342946465638677014265280400684536972824228071999739587025848471588041430734190747718105615643467867746521139598415490025819320522905508995637789651392767316376511141387782210136045154208122686266311800762358065599182356318289546167933132158219689983303226956912482902682742562956882890951086189973976745290171180581408168481701573057620693909613412402204890864681757904552161551141827082091941308643128752309062650317371816701150436066224566268088838544515729608051056365801398632700878033879524508762180929699446191226165581504065642383358322411410368865560901282689855037225200599153216302477288730118415860928953243258084527371265976649892602187894583446506824661341966822666806639851892328985271557775491086085232594029385055865408461916306201785026239230612752353078156174629354046816769484345684696264666983054596622557352665971692310835346574330345201496241524653879367068558567438787799759733850664614404312057082568243566243264611755532824513206338793606426398858650893765086655494206257608941685693604563423189826136067320528442662007709432015815995036214543984892269361804846433637715492042002645350444584698809568222374258222855882789968774096068488352877738383142437491050195487809265738698926470769757932536635347362729215411426989493149132973739280148089755991263176726327550836049914656986188523756036995278451253055657993910940418752312028175505678115214204318754518113471033399453567830296130632358712878292350291176995772240851095811885600382819425746733946859746508324478039308526824527611422610279849667882833495985958014136406544044904587156035768010650365190466997906703837332597903821402668562989161094199987830477977441561503597197569903604778604440785745969156513821971317777734960593729892222534437766021930681857290367110308403828050424387397529924995329948939921686795128871033695479567097677596871009758030829941780656916571404797474936364060896633110223920424892718562704497565532610704069917480058569081099089548670722155086358551588683391157320485122061215935067590527729478682246827509303529818583205679553217829813233875900878129084480249700435621359221893555421656631016079536513126020731283339909012365473738538062828153338806425078848354593519707062428992917258579885576722482493469235679741940285114466917413417283111876766818175178154974443863226366736031059196645787709286298438367096300335933725467680069467499909440931418935197607639590412522403641379231449900907670483429271445608187324020277292393554157047806016393560149763762182381033522232890923572325247499885048067389323525383500510263730424495499130718179426732948176129997648391216839998908481381658481720639121202961279302722168225045179081535042109498981072896761625693992602288769693937005187754145411851890095543833095500128837825669543033101870261359674246173474451228851808299126983017321230451884981315322155989426954244248673352579392307130099271620208255400787072330291414290702789609332401962725750210933255324797504516682254234045089348533324403979456676711927551725019997708120073528175550873441080737501788656523364635812866580670909840195177187069318284588267347979941912802844784345831364593611297335034936808260937486987558839356538174069247197363090244587530678334043312764406429614731545495099078344877149268175885053368093750005550979938553594526646815969088249884254428243750041746556055016888568949674554438216069776702697157696519299935296262333182662282071313712716657449342194593759461100188202234751465974594013604537342017369078900004007398193157716190449076813514282475822804094059889026022698518255021018566613789118518865859608084164256119389391264701034534732838558655538866932858543792259691591598582535802657208941556924876214292388229473818284170474930333525978514942722320793145416739308926751303841482388060395770004407198042502238999916987737347202218320069564664408185847098410976119863674399888748702288385011759248916565214546843591360560021875820058954120036097112067812578695283900444351683579270658485758109768365219991018268073673245141452415153257605271035668837906171755807778795902163789814583104706779368230557138443440606785024625551792656071322197883437365090995952783614348640636205281691939705970217021667929894789600090514708714961369322666305228197508897774024661140458911672537766440222671471229951151624033617881679464177246524344329265010491386519425837542838886652005593924469815109793867033638413339131777000951938840890851243026333877482047177068521520544305276389089112946918609981082936282961399989478134865584383041240801873372522978899733132202333335987926642791396387737460062342731173436754915777886939051823043272012214390567646298815125607368226168423465650669620628282859526350836831070319248452496846476074443081172225109466966238064479543952636729745422601763049244880363951554887868547504711176462185190973960030994451631839790904451546992926093730097537412791241442962734438292246577722247574954339022031246782698069255135790093514932928713132636296283824008266832812586268454522044334878454397088449487448684427415958411238210941094006226613223371481809171527041133037308679802333566255552440291287322458475809170568522887554612352531686985995739790461654054890515084932431410095449297397334371300261611842343335002853735931084493419009859313463150746745937117993181979237854420065153129725284950418550289719097671413347458337380367124698634870313774680629978154230863821318174197007261464601533093656004192580013539666996526642684130218028293355797487475150542981549502578133197157285640759714023684275189549422742879177088739931596862486920921838596493421040431594601794077020970428521385813104989350571619913186328653424264834109846015474715734651184107559529340562123342071075931760092972222917153919505120979479996210276995493277547148424188113124421851635354366780917880121039406318342668232723614810087913563184193944074400000020651241097090115446220825337562270086194397603167464030037171560664411210284016084866369808922429203707401145416737524009418498819459380189832249442354578023256629134645025981931351423342611135080339166792819794476094517020997632103158198364641168737218921911389876768461303546227036899870881483511952646784326359096061070739854717639472509669848383820755259857413438295366884308513205076426798185817815788056573628577324171420253648601799962441876999872888804170580893843687132338423914822285568896284471765223814674175029590016487790058849831286477480407475595110497851792057602582603288109754011617841039164041788939682140507881575497413757336997711464163036851800068102118379858493913037721693270703130811009983095221159466631384296982518861383773854535925194635985429767708644654123929591836266094263942708064706075219923980783237358798820516481950692318906711800446498751709909979900020671710215406281991004707258633142090505396170787878142555678201300875442645229957683266757709158189715737432850344877702847733425342431295550047738114568208344247343496544929502270432466561338343828440563277268125158467734124526783241545350253573063926687226489187301386880367871743773831272945217558791867709670520632159570091273556679942194188558690863824371652669539531915581994312990167794769961244737657221122396671143145348339888308788106472726956314213678731306378350284933844004198724531538225392232209225298926342191000074318091592696527655035644027580633217085239808870166459729569875652231485870496109437295505607599301574917545303951011217758746262472258090053525770922187145661490148423928147902289750267060551777528126663244728440341531399236037845248645045749494529414359698587668031857404946489919370523756221679157359175122237772519306540269608674683717879240004803893267340482396305758047458143591664086334293012096942379962669398733948440446637417238944756499755791140482728310365361208405057637360065404060663154368075449918453718779613880795113316906626929645900669151442129735202430154440704000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000).
       
  2612     self assert:(nrDiv * 1099511627776 = nr).
       
  2613 
       
  2614     divMod := nr divMod: 1099511627776.
       
  2615     self assert:((divMod at:1) = nrDiv).
       
  2616     self assert:((divMod at:2) = 0).
       
  2617     
       
  2618     divMod := nr divMod: 1099511627775.
       
  2619     self assert:((divMod at:1) = (nr // 1099511627775)).
       
  2620     self assert:((divMod at:2) = (nr \\ 1099511627775)).
       
  2621 
       
  2622     self assert:((divMod at:1) * 1099511627775 + (divMod at:2) = nr).
       
  2623     
       
  2624     "
       
  2625      self basicNew testLargeDivision3
       
  2626     "
       
  2627 !
       
  2628 
       
  2629 testLargeDivision4
       
  2630     self assert:(9000000000 \\ 4000000000)    = (900 \\ 400 * 10000000).
       
  2631     self assert:(-9000000000 \\ 4000000000)   = (-900 \\ 400 * 10000000).
       
  2632     self assert:(9000000000 \\ -4000000000)   = (900 \\ -400 * 10000000).
       
  2633     self assert:(-9000000000 \\ -4000000000)  = (-900 \\ -400 * 10000000).
       
  2634     self assert:(16000000000 \\ 4000000000)   = (1600 \\ 400 * 10000000).
       
  2635     self assert:(-16000000000 \\ 4000000000)  = (-1600 \\ 400 * 10000000).
       
  2636     self assert:(16000000000 \\ -4000000000)  = (1600 \\ -400 * 10000000).
       
  2637     self assert:(-16000000000 \\ -4000000000) = (-1600 \\ -400 * 10000000).
       
  2638 
       
  2639     self assert:(9000000000000000000 \\ 4000000000000000000)    = (900 \\ 400 * 10000000000000000).
       
  2640     self assert:(-9000000000000000000 \\ 4000000000000000000)   = (-900 \\ 400 * 10000000000000000).
       
  2641     self assert:(9000000000000000000 \\ -4000000000000000000)   = (900 \\ -400 * 10000000000000000).
       
  2642     self assert:(-9000000000000000000 \\ -4000000000000000000)  = (-900 \\ -400 * 10000000000000000).
       
  2643     self assert:(16000000000000000000 \\ 4000000000000000000)   = (1600 \\ 400 * 10000000000000000).
       
  2644     self assert:(-16000000000000000000 \\ 4000000000000000000)  = (-1600 \\ 400 * 10000000000000000).
       
  2645     self assert:(16000000000000000000 \\ -4000000000000000000)  = (1600 \\ -400 * 10000000000000000).
       
  2646     self assert:(-16000000000000000000 \\ -4000000000000000000) = (-1600 \\ -400 * 10000000000000000).
       
  2647 
       
  2648     self assert:(9000000000 \\ 7) = 5.
       
  2649     self assert:(-9000000000 \\ 7) = 2.
       
  2650     self assert:(9000000000 \\ -7) = -2.
       
  2651     self assert:(-9000000000 \\ -7) = -5.
       
  2652 
       
  2653     self assert:(900 rem: 400) = 100.
       
  2654     self assert:(-900 rem: 400) = -100.
       
  2655     self assert:(900 rem: -400) = 100.
       
  2656     self assert:(-900 rem: -400) = -100.
       
  2657 
       
  2658     self assert:(9000000000 rem: 4000000000) = 1000000000.
       
  2659     self assert:(-9000000000 rem: 4000000000) = -1000000000.
       
  2660     self assert:(9000000000 rem: -4000000000) = 1000000000.
       
  2661     self assert:(-9000000000 rem: -4000000000) = -1000000000.
       
  2662     
       
  2663     "
       
  2664      self basicNew testLargeDivision4
       
  2665     "
       
  2666 !
       
  2667 
       
  2668 testLargeDivision5
       
  2669     self assert:(9000000000 quo: 4000000000)    = ((900 quo: 400) ).
       
  2670     self assert:(-9000000000 quo: 4000000000)   = ((-900 quo: 400) ).
       
  2671     self assert:(9000000000 quo: -4000000000)   = ((900 quo: -400) ).
       
  2672     self assert:(-9000000000 quo: -4000000000)  = ((-900 quo: -400) ).
       
  2673     self assert:(16000000000 quo: 4000000000)   = ((1600 quo: 400) ).
       
  2674     self assert:(-16000000000 quo: 4000000000)  = ((-1600 quo: 400) ).
       
  2675     self assert:(16000000000 quo: -4000000000)  = ((1600 quo: -400) ).
       
  2676     self assert:(-16000000000 quo: -4000000000) = ((-1600 quo: -400) ).
       
  2677 
       
  2678     self assert:(9000000000000000000 quo: 4000000000000000000)    = ((900 quo: 400) ).
       
  2679     self assert:(-9000000000000000000 quo: 4000000000000000000)   = ((-900 quo: 400) ).
       
  2680     self assert:(9000000000000000000 quo: -4000000000000000000)   = ((900 quo: -400) ).
       
  2681     self assert:(-9000000000000000000 quo: -4000000000000000000)  = ((-900 quo: -400) ).
       
  2682     self assert:(16000000000000000000 quo: 4000000000000000000)   = ((1600 quo: 400) ).
       
  2683     self assert:(-16000000000000000000 quo: 4000000000000000000)  = ((-1600 quo: 400) ).
       
  2684     self assert:(16000000000000000000 quo: -4000000000000000000)  = ((1600 quo: -400) ).
       
  2685     self assert:(-16000000000000000000 quo: -4000000000000000000) = ((-1600 quo: -400) ).
       
  2686 
       
  2687     self assert:(9000000000 quo: 7) = 1285714285.
       
  2688     self assert:(-9000000000 quo: 7) = -1285714285.
       
  2689     self assert:(9000000000 quo: -7) = -1285714285.
       
  2690     self assert:(-9000000000 quo: -7) = 1285714285.
       
  2691     
       
  2692     "
       
  2693      self basicNew testLargeDivision5
       
  2694     "
       
  2695 !
       
  2696 
       
  2697 testLargeDivision6
       
  2698     |t|
       
  2699 
       
  2700     t := 20 factorial.
       
  2701     self assert:(t = 2432902008176640000).
       
  2702     t := t / 20.
       
  2703     self assert:(t = 19 factorial).
       
  2704     self assert:(t = 121645100408832000).
       
  2705     
       
  2706     t := t / 19.
       
  2707     self assert:(t = 18 factorial).
       
  2708     self assert:(t = 6402373705728000).
       
  2709 
       
  2710     t := t / 18.
       
  2711     self assert:(t = 17 factorial).
       
  2712     self assert:(t = 355687428096000).
       
  2713 
       
  2714     t := t / 17.
       
  2715     self assert:(t = 16 factorial).
       
  2716     self assert:(t = 20922789888000).
       
  2717 
       
  2718     t := t / 16.
       
  2719     self assert:(t = 15 factorial).
       
  2720     self assert:(t = 1307674368000).
       
  2721 
       
  2722     t := t / 15.
       
  2723     self assert:(t = 14 factorial).
       
  2724     self assert:(t = 87178291200).
       
  2725 
       
  2726     t := t / 14.
       
  2727     self assert:(t = 13 factorial).
       
  2728     self assert:(t = 6227020800).
       
  2729 
       
  2730     t := t / 13.
       
  2731     self assert:(t = 12 factorial).
       
  2732     self assert:(t = 479001600).
       
  2733 
       
  2734     t := t / 12.
       
  2735     self assert:(t = 11 factorial).
       
  2736     self assert:(t = 39916800).
       
  2737 
       
  2738     t := t / 11.
       
  2739     self assert:(t = 10 factorial).
       
  2740     self assert:(t = 3628800).
       
  2741 
       
  2742     "
       
  2743      self basicNew testLargeDivision6
       
  2744     "
       
  2745 !
       
  2746 
       
  2747 testLargeDivision7
       
  2748     self assert:(  90000000000000000000 rem: 40000000000000000000 ) = 10000000000000000000. 
       
  2749     self assert:( (((90000000000000000000 quo: 40000000000000000000)*40000000000000000000) + ( 90000000000000000000 rem: 40000000000000000000 )) = 90000000000000000000 ).
       
  2750 
       
  2751     self assert:(  -90000000000000000000 rem: 40000000000000000000 ) = -10000000000000000000. 
       
  2752     self assert:( (((-90000000000000000000 quo: 40000000000000000000)*40000000000000000000) + ( -90000000000000000000 rem: 40000000000000000000 )) = -90000000000000000000 ).
       
  2753 
       
  2754     self assert:(  90000000000000000000 rem: -40000000000000000000 ) = 10000000000000000000. 
       
  2755     self assert:( (((90000000000000000000 quo: -40000000000000000000) * -40000000000000000000) + ( 90000000000000000000 rem: -40000000000000000000 )) = 90000000000000000000 ).
       
  2756 
       
  2757     self assert:(  -90000000000000000000 rem: -40000000000000000000 ) = -10000000000000000000. 
       
  2758     self assert:( (((-90000000000000000000 quo: -40000000000000000000) * -40000000000000000000) + ( -90000000000000000000 rem: -40000000000000000000 )) = -90000000000000000000 ).
       
  2759 
       
  2760     "
       
  2761      self basicNew testLargeDivision7
       
  2762     "
       
  2763 
       
  2764     "Created: / 05-07-2017 / 16:37:06 / cg"
       
  2765 !
       
  2766 
       
  2767 testLargeMultiplication
       
  2768     |t1 t2 p|
       
  2769 
       
  2770     "multiplication"
       
  2771     t1 := 100.
       
  2772     self assert:(t1 * t1 == 10000).
       
  2773     self assert:((t1 perform:'*' asSymbol with:t1) == 10000).
       
  2774     self assert:((t1 * t1) printString = '10000').
       
  2775     self assert:((t1 perform:'*' asSymbol with:t1) printString = '10000').
       
  2776 
       
  2777     t1 := 1000.
       
  2778     self assert:(t1 * t1 == 1000000).
       
  2779     self assert:((t1 perform:'*' asSymbol with:t1) == 1000000).
       
  2780     self assert:((t1 * t1) printString = '1000000').
       
  2781     self assert:((t1 perform:'*' asSymbol with:t1) printString = '1000000').
       
  2782 
       
  2783     t1 := 10000.
       
  2784     self assert:(t1 * t1 == 100000000).
       
  2785     self assert:((t1 perform:'*' asSymbol with:t1) == 100000000).
       
  2786     self assert:((t1 * t1) printString = '100000000').
       
  2787     self assert:((t1 perform:'*' asSymbol with:t1) printString = '100000000').
       
  2788 
       
  2789     t1 := 100000.
       
  2790     SmallInteger maxBytes == 4 ifTrue:[
       
  2791         self assert:(t1 * t1 = 10000000000).
       
  2792         self assert:((t1 perform:'*' asSymbol with:t1) = 10000000000).
       
  2793     ].
       
  2794     SmallInteger maxBytes == 8 ifTrue:[
       
  2795         self assert:(t1 * t1 == 10000000000).
       
  2796         self assert:((t1 perform:'*' asSymbol with:t1) == 10000000000).
       
  2797     ].
       
  2798 
       
  2799     self assert:((t1 * t1) printString = '10000000000').
       
  2800     self assert:((t1 perform:'*' asSymbol with:t1) printString = '10000000000').
       
  2801 
       
  2802     t1 := 1000000.
       
  2803     self assert:((t1 * t1) printString = '1000000000000').
       
  2804     self assert:((t1 perform:'*' asSymbol with:t1) printString = '1000000000000').
       
  2805 
       
  2806     t1 := 10000000.
       
  2807     self assert:((t1 * t1) printString = '100000000000000').
       
  2808     self assert:((t1 perform:'*' asSymbol with:t1) printString = '100000000000000').
       
  2809 
       
  2810     t1 := 100000000.
       
  2811     self assert:((t1 * t1) printString = '10000000000000000').
       
  2812     self assert:((t1 perform:'*' asSymbol with:t1) printString = '10000000000000000').
       
  2813 
       
  2814     t1 := 1000000000.
       
  2815     self assert:((t1 * t1) printString = '1000000000000000000').
       
  2816     self assert:((t1 perform:'*' asSymbol with:t1) printString = '1000000000000000000').
       
  2817 
       
  2818 
       
  2819     "Large * SmallInt multiplication"
       
  2820     self assert:(10 factorial printString = '3628800').
       
  2821     self assert:(20 factorial printString = '2432902008176640000').
       
  2822     self assert:(100 factorial printString = '93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000').
       
  2823     self assert:(1000 factorial printString = '402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000').
       
  2824 
       
  2825     t1 := 100000000.                            "/ small
       
  2826     t2 := 100000000000000000.                   "/ large on 32bit; small on 64bt machines
       
  2827     p := t1 * t2.
       
  2828     self assert:(p = 10000000000000000000000000).
       
  2829     p := t2 * t1.
       
  2830     self assert:(p = 10000000000000000000000000).
       
  2831     self assert:((t1 * t2) = 10000000000000000000000000).
       
  2832     self assert:((t2 * t1) = 10000000000000000000000000).
       
  2833 
       
  2834     t1 := 100000000.                            "/ small
       
  2835     t2 := 1000000000000000000.                  "/ large on 32bit; small on 64bt machines
       
  2836     p := t1 * t2.
       
  2837     self assert:(p = 100000000000000000000000000).
       
  2838     p := t2 * t1.
       
  2839     self assert:(p = 100000000000000000000000000).
       
  2840     self assert:(t1 * t2) = 100000000000000000000000000.
       
  2841     self assert:(t2 * t1) = 100000000000000000000000000.
       
  2842 
       
  2843     t1 := 100000000.                            "/ small
       
  2844     t2 := 10000000000000000000.                 "/ large
       
  2845     self assert:(t1 * t2) = 1000000000000000000000000000.
       
  2846     self assert:(t2 * t1) = 1000000000000000000000000000.
       
  2847 
       
  2848     t1 := 100000000.                            "/ small
       
  2849     t2 := 100000000000000000000.                "/ large
       
  2850     self assert:(t1 * t2) = 10000000000000000000000000000.
       
  2851     self assert:(t2 * t1) = 10000000000000000000000000000.
       
  2852 
       
  2853     t1 := 100000000.                            "/ small
       
  2854     t2 := 1000000000000000000000.               "/ large
       
  2855     self assert:(t1 * t2) = 100000000000000000000000000000.
       
  2856     self assert:(t2 * t1) = 100000000000000000000000000000.
       
  2857 
       
  2858     t1 := 100000000.                            "/ small
       
  2859     t2 := 10000000000000000000000.              "/ large
       
  2860     self assert:(t1 * t2) = 1000000000000000000000000000000.
       
  2861     self assert:(t2 * t1) = 1000000000000000000000000000000.
       
  2862 
       
  2863     t1 := 100000000.                            "/ small
       
  2864     t2 := 100000000000000000000000.             "/ large
       
  2865     self assert:(t1 * t2) = 10000000000000000000000000000000.
       
  2866     self assert:(t2 * t1) = 10000000000000000000000000000000.
       
  2867 
       
  2868     t1 := 100000000.                            "/ small
       
  2869     t2 := 1000000000000000000000000.            "/ large
       
  2870     self assert:(t1 * t2) = 100000000000000000000000000000000.
       
  2871     self assert:(t2 * t1) = 100000000000000000000000000000000.
       
  2872 
       
  2873     t1 := 100000000.                            "/ small
       
  2874     t2 := 10000000000000000000000000.           "/ large
       
  2875     self assert:(t1 * t2) = 1000000000000000000000000000000000.
       
  2876     self assert:(t2 * t1) = 1000000000000000000000000000000000.
       
  2877 
       
  2878     t1 := 100000000.                            "/ small
       
  2879     t2 := 100000000000000000000000000.          "/ large
       
  2880     self assert:(t1 * t2) = 10000000000000000000000000000000000.
       
  2881     self assert:(t2 * t1) = 10000000000000000000000000000000000.
       
  2882 
       
  2883     t1 := 100000000.                            "/ small
       
  2884     t2 := 1000000000000000000000000000.         "/ large
       
  2885     self assert:(t1 * t2) = 100000000000000000000000000000000000.
       
  2886     self assert:(t2 * t1) = 100000000000000000000000000000000000.
       
  2887 
       
  2888     t1 := 100000000.                            "/ small
       
  2889     t2 := 10000000000000000000000000000.        "/ large
       
  2890     self assert:(t1 * t2) = 1000000000000000000000000000000000000.
       
  2891     self assert:(t2 * t1) = 1000000000000000000000000000000000000.
       
  2892 
       
  2893     t1 := 100000000.                            "/ small
       
  2894     t2 := 100000000000000000000000000000.       "/ large
       
  2895     self assert:(t1 * t2) = 10000000000000000000000000000000000000.
       
  2896     self assert:(t2 * t1) = 10000000000000000000000000000000000000.
       
  2897 
       
  2898     t1 := 100000000.                            "/ small
       
  2899     t2 := 1000000000000000000000000000000.      "/ large
       
  2900     self assert:(t1 * t2) = 100000000000000000000000000000000000000.
       
  2901     self assert:(t2 * t1) = 100000000000000000000000000000000000000.
       
  2902 
       
  2903     t1 := 100000000.                            "/ small
       
  2904     t2 := 10000000000000000000000000000000.     "/ large
       
  2905     self assert:(t1 * t2) = 1000000000000000000000000000000000000000.
       
  2906     self assert:(t2 * t1) = 1000000000000000000000000000000000000000.
       
  2907 
       
  2908     t1 := 100000000.                            "/ small
       
  2909     t2 := 100000000000000000000000000000000.    "/ large
       
  2910     self assert:(t1 * t2) = 10000000000000000000000000000000000000000.
       
  2911     self assert:(t2 * t1) = 10000000000000000000000000000000000000000.
       
  2912 
       
  2913     "Large * Large multiplication"
       
  2914 
       
  2915     self assert:((16r3FFF * 16r3FFF) hexPrintString = 'FFF8001').
       
  2916     self assert:((16r7FFF * 16r7FFF) hexPrintString = '3FFF0001').
       
  2917     self assert:((16rFFFF * 16rFFFF) hexPrintString = 'FFFE0001').
       
  2918     self assert:((16r3FFFFF * 16r3FFFFF) hexPrintString = 'FFFFF800001').
       
  2919     self assert:((16r7FFFFF * 16r7FFFFF) hexPrintString = '3FFFFF000001').
       
  2920     self assert:((16rFFFFFF * 16rFFFFFF) hexPrintString = 'FFFFFE000001').
       
  2921     self assert:((16r3FFFFFFF * 16r3FFFFFFF) hexPrintString = 'FFFFFFF80000001').
       
  2922     self assert:((16r7FFFFFFF * 16r7FFFFFFF) hexPrintString = '3FFFFFFF00000001').
       
  2923     self assert:((16rFFFFFFFF * 16rFFFFFFFF) hexPrintString = 'FFFFFFFE00000001').
       
  2924     self assert:((16r3FFFFFFFFF * 16r3FFFFFFFFF) hexPrintString = 'FFFFFFFFF8000000001').
       
  2925     self assert:((16r7FFFFFFFFF * 16r7FFFFFFFFF) hexPrintString = '3FFFFFFFFF0000000001').
       
  2926     self assert:((16rFFFFFFFFFF * 16rFFFFFFFFFF) hexPrintString = 'FFFFFFFFFE0000000001').
       
  2927     self assert:((20 factorial * 20 factorial) printString = '5919012181389927685417441689600000000').
       
  2928 
       
  2929     self assert:((16rFFFFFFFFFFFF * 16rFFFFFFFFFF) hexPrintString = 'FFFFFFFFFEFF0000000001').
       
  2930     self assert:((16rFFFFFFFFFFFFFF * 16rFFFFFFFFFF) hexPrintString = 'FFFFFFFFFEFFFF0000000001').
       
  2931     self assert:((t1 := 16rFFFFFFFFFFFFFFFF * 16rFFFFFFFFFF) hexPrintString = 'FFFFFFFFFEFFFFFF0000000001').
       
  2932     self assert:((16rFFFFFFFFFFFFFFFFFF * 16rFFFFFFFFFF) hexPrintString = 'FFFFFFFFFEFFFFFFFF0000000001').
       
  2933     self assert:((16rFFFFFFFFFFFFFFFFFFFF * 16rFFFFFFFFFF) hexPrintString = 'FFFFFFFFFEFFFFFFFFFF0000000001').
       
  2934     self assert:((16rFFFFFFFFFFFFFFFFFFFFFF * 16rFFFFFFFFFF) hexPrintString = 'FFFFFFFFFEFFFFFFFFFFFF0000000001').
       
  2935 
       
  2936     self assert:((16rFFFFFFFFFFFF * 16rFFFFFFFFFFFF) hexPrintString = 'FFFFFFFFFFFE000000000001').
       
  2937     self assert:((16rFFFFFFFFFFFFFF * 16rFFFFFFFFFFFFFF) hexPrintString = 'FFFFFFFFFFFFFE00000000000001').
       
  2938     self assert:((t2 := (t1 := 16rFFFFFFFFFFFFFFFF * 16rFFFFFFFFFFFFFFFF) hexPrintString) = 'FFFFFFFFFFFFFFFE0000000000000001').
       
  2939     self assert:((16rFFFFFFFFFFFFFFFF * 16rFFFFFFFFFFFFFFFF) hexPrintString = 'FFFFFFFFFFFFFFFE0000000000000001').
       
  2940     self assert:((16rFFFFFFFFFFFFFFFFFF * 16rFFFFFFFFFFFFFFFFFF) hexPrintString = 'FFFFFFFFFFFFFFFFFE000000000000000001').
       
  2941     self assert:((16rFFFFFFFFFFFFFFFFFFFF * 16rFFFFFFFFFFFFFFFFFFFF) hexPrintString = 'FFFFFFFFFFFFFFFFFFFE00000000000000000001').
       
  2942     self assert:((16rFFFFFFFFFFFFFFFFFFFFFF * 16rFFFFFFFFFFFFFFFFFFFFFF) hexPrintString = 'FFFFFFFFFFFFFFFFFFFFFE0000000000000000000001').
       
  2943 
       
  2944     t1 := 699697179634740272935560322271216335182775596927422865716399200802062765682314102885264570100200211251370690926108604161579425545019863369232209949922751354278329212124724267803033599595114924195721823679025053720850308776953208134469115885358619139670731195605237506312288263327925364912720266772715929600.
       
  2945     self assert:(t1 printString = '699697179634740272935560322271216335182775596927422865716399200802062765682314102885264570100200211251370690926108604161579425545019863369232209949922751354278329212124724267803033599595114924195721823679025053720850308776953208134469115885358619139670731195605237506312288263327925364912720266772715929600').
       
  2946     self assert:((t1 * t1) = 489576143188809998144298426641311496989165214458056165805143410866108690058261346129614030084813851082564698610174813898740525406243367146120734370570458429364167811695064904353093506532695086211301649001517008746471464304183710723162864634442619484210170532881759249266026059786349673031239277666195699357198366128286910123306594912484590029738722281929300359929462301099981920256369394887701755497894820998573896950238852994224811101315810851671448056042419257789317787959570728520197146733902575090480065597582292177085754523686580725860228636039424698638422538988050350726807943014483010988455057592156160000).
       
  2947     self assert:((t1 * t1) printString = '489576143188809998144298426641311496989165214458056165805143410866108690058261346129614030084813851082564698610174813898740525406243367146120734370570458429364167811695064904353093506532695086211301649001517008746471464304183710723162864634442619484210170532881759249266026059786349673031239277666195699357198366128286910123306594912484590029738722281929300359929462301099981920256369394887701755497894820998573896950238852994224811101315810851671448056042419257789317787959570728520197146733902575090480065597582292177085754523686580725860228636039424698638422538988050350726807943014483010988455057592156160000').
       
  2948 
       
  2949     #(
       
  2950         16rFF
       
  2951         16rFFFF
       
  2952         16rFFFFFF
       
  2953         16rFFFFFFFF
       
  2954         16rFFFFFFFFFF
       
  2955         16rFFFFFFFFFFFF
       
  2956         16rFFFFFFFFFFFFFF
       
  2957         16rFFFFFFFFFFFFFFFF
       
  2958         16rFFFFFFFFFFFFFFFFFF
       
  2959         16rFFFFFFFFFFFFFFFFFFFF
       
  2960         16rFFFFFFFFFFFFFFFFFFFFFF
       
  2961         16rFFFFFFFFFFFFFFFFFFFFFFFF
       
  2962     ) do:[:eachFactor1 |
       
  2963         #(
       
  2964             16rFF
       
  2965             16rFFFF
       
  2966             16rFFFFFF
       
  2967             16rFFFFFFFF
       
  2968             16rFFFFFFFFFF
       
  2969             16rFFFFFFFFFFFF
       
  2970             16rFFFFFFFFFFFFFF
       
  2971             16rFFFFFFFFFFFFFFFF
       
  2972             16rFFFFFFFFFFFFFFFFFF
       
  2973             16rFFFFFFFFFFFFFFFFFFFF
       
  2974             16rFFFFFFFFFFFFFFFFFFFFFF
       
  2975             16rFFFFFFFFFFFFFFFFFFFFFFFF
       
  2976         ) do:[:eachFactor2 |
       
  2977             |t3|
       
  2978 
       
  2979             t1 := (eachFactor1 * eachFactor2).
       
  2980             t2 := (eachFactor2 * eachFactor1).
       
  2981 
       
  2982             self assert:(t1 = t2).
       
  2983 t1 = 20203181441155852828228393631745 ifTrue:[
       
  2984  eachFactor1 = 1099511627775 ifTrue:[
       
  2985 self halt
       
  2986 ]].
       
  2987 
       
  2988             self assert:(t1 / eachFactor1) = eachFactor2.
       
  2989             self assert:(t1 / eachFactor2) = eachFactor1.
       
  2990             t3 := (eachFactor1 asLargeInteger * eachFactor2 asLargeInteger).
       
  2991             self assert: t1 = t3.
       
  2992         ].
       
  2993     ].
       
  2994 
       
  2995     "
       
  2996      self basicNew testLargeMultiplication
       
  2997     "
       
  2998 
       
  2999     "Modified: / 02-12-2013 / 15:45:39 / cg"
       
  3000 !
       
  3001 
       
  3002 testLargeMultiplication2
       
  3003     "tests many divisions and multiplications (of largeInts by smallInts)"
       
  3004 
       
  3005     |n n2|
       
  3006 
       
  3007     self assert:(1000 factorial printString = '402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000').
       
  3008 
       
  3009     n := 1000 factorial.
       
  3010     1000 to:2 by:-1 do:[:d |
       
  3011         n2 := n / d.
       
  3012         self assert:((d-1) factorial = n2).
       
  3013         self assert:(Integer readFrom:n2 printString) * d = n.
       
  3014         n := n2.
       
  3015     ].
       
  3016 !
       
  3017 
       
  3018 testLargeMultiplicationHelpers1
       
  3019     |t1 t2 r|
       
  3020 
       
  3021     t1 := LargeInteger digitBytes:#[ 16r00 16rE1 16rF5 16r05 ].
       
  3022     t2 := LargeInteger digitBytes:#[ 16r00 16r00 16r40 16rB2 16rBA 16rC9 16rE0 16r19 16r1E 16r02].
       
  3023     r := t1 absMul:t2.
       
  3024     self assert:(r printString = '1000000000000000000000000000000').
       
  3025     self assert:(r hexPrintString = 'C9F2C9CD04674EDEA40000000').
       
  3026 
       
  3027     t1 := LargeInteger digitBytes:#[ 16r00 16rE1 16rF5 16r05 ].
       
  3028     t2 := LargeInteger digitBytes:#[ 16r00 16r00 16rA0 16rDE   16rC5 16rAD 16rC9 16r35   16r36].
       
  3029     r := t1 absMul:t2.
       
  3030     self assert:(r printString = '100000000000000000000000000000').
       
  3031     self assert:(r hexPrintString = '1431E0FAE6D7217CAA0000000').
       
  3032 
       
  3033     "/ -----
       
  3034 
       
  3035     t1 := LargeInteger digitBytes:#[ 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF].
       
  3036     t2 := LargeInteger digitBytes:#[ 16rFF 16rFF 16rFF 16rFF 0 0 0 0].
       
  3037     r := t1 absMul:t2.
       
  3038     self assert:(r hexPrintString = 'FFFFFFFEFFFFFFFF00000001').
       
  3039 
       
  3040     t1 := LargeInteger digitBytes:#[ 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF].
       
  3041     t2 := LargeInteger digitBytes:#[ 16rFF 16rFF 16rFF 16rFF 16rFF 0 0 0].
       
  3042     r := t1 absMul:t2.
       
  3043     self assert:(r printString = '20282409603633223678774030106625').
       
  3044     self assert:(r hexPrintString = 'FFFFFFFFFEFFFFFF0000000001').
       
  3045 
       
  3046     t1 := LargeInteger digitBytes:#[ 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF].
       
  3047     t2 := LargeInteger digitBytes:#[ 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 0 0].
       
  3048     r := t1 absMul:t2.
       
  3049     self assert:(r printString = '5192296858534809181504947642957825').
       
  3050     self assert:(r hexPrintString = 'FFFFFFFFFFFEFFFF000000000001').
       
  3051 
       
  3052     t1 := LargeInteger digitBytes:#[ 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF].
       
  3053     t2 := LargeInteger digitBytes:#[ 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 0].
       
  3054     r := t1 absMul:t2.
       
  3055     self assert:(r printString = '1329227995784915854385005392532865025').
       
  3056     self assert:(r hexPrintString = 'FFFFFFFFFFFFFEFF00000000000001').
       
  3057 
       
  3058     "
       
  3059      self basicNew testLargeMultiplicationHelpers1
       
  3060     "
       
  3061 
       
  3062     "Modified: / 02-12-2013 / 18:48:00 / cg"
       
  3063 !
       
  3064 
       
  3065 testLargeMultiplicationHelpers2
       
  3066     |t1 t2 r|
       
  3067 
       
  3068     "/ testing internal multiplication method
       
  3069     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8].
       
  3070     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0].
       
  3071     r := t1 absMul:t2.
       
  3072     self assert:(r hexPrintString = '100E0C0A08060402').
       
  3073 
       
  3074     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9].
       
  3075     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0].
       
  3076     r := t1 absMul:t2.
       
  3077     self assert:(r hexPrintString = '12100E0C0A08060402').
       
  3078 
       
  3079     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10].
       
  3080     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0].
       
  3081     r := t1 absMul:t2.
       
  3082     self assert:(r hexPrintString = '1412100E0C0A08060402').
       
  3083 
       
  3084     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10 11].
       
  3085     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0].
       
  3086     r := t1 absMul:t2.
       
  3087     self assert:(r hexPrintString = '161412100E0C0A08060402').
       
  3088 
       
  3089     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10 11 12].
       
  3090     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0].
       
  3091     r := t1 absMul:t2.
       
  3092     self assert:(r hexPrintString = '18161412100E0C0A08060402').
       
  3093 
       
  3094     "/ --------
       
  3095 
       
  3096     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8].
       
  3097     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0].
       
  3098     r := t1 absMul:t2.
       
  3099     self assert:(r hexPrintString = '100E0C0A08060402').
       
  3100 
       
  3101     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9].
       
  3102     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0].
       
  3103     r := t1 absMul:t2.
       
  3104     self assert:(r hexPrintString = '12100E0C0A08060402').
       
  3105 
       
  3106     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10].
       
  3107     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0].
       
  3108     r := t1 absMul:t2.
       
  3109     self assert:(r hexPrintString = '1412100E0C0A08060402').
       
  3110 
       
  3111     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10 11].
       
  3112     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0].
       
  3113     r := t1 absMul:t2.
       
  3114     self assert:(r hexPrintString = '161412100E0C0A08060402').
       
  3115 
       
  3116     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10 11 12].
       
  3117     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0].
       
  3118     r := t1 absMul:t2.
       
  3119     self assert:(r hexPrintString = '18161412100E0C0A08060402').
       
  3120 
       
  3121     "/ --------
       
  3122 
       
  3123     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8].
       
  3124     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0].
       
  3125     r := t1 absMul:t2.
       
  3126     self assert:(r hexPrintString = '100E0C0A08060402').
       
  3127 
       
  3128     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9].
       
  3129     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0].
       
  3130     r := t1 absMul:t2.
       
  3131     self assert:(r hexPrintString = '12100E0C0A08060402').
       
  3132 
       
  3133     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10].
       
  3134     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0 ].
       
  3135     r := t1 absMul:t2.
       
  3136     self assert:(r hexPrintString = '1412100E0C0A08060402').
       
  3137 
       
  3138     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10 11].
       
  3139     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0].
       
  3140     r := t1 absMul:t2.
       
  3141     self assert:(r hexPrintString = '161412100E0C0A08060402').
       
  3142 
       
  3143     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10 11 12].
       
  3144     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0].
       
  3145     r := t1 absMul:t2.
       
  3146     self assert:(r hexPrintString = '18161412100E0C0A08060402').
       
  3147 
       
  3148     "/ --------
       
  3149 
       
  3150     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8].
       
  3151     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0 0].
       
  3152     r := t1 absMul:t2.
       
  3153     self assert:(r hexPrintString = '100E0C0A08060402').
       
  3154 
       
  3155     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9].
       
  3156     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0 0].
       
  3157     r := t1 absMul:t2.
       
  3158     self assert:(r hexPrintString = '12100E0C0A08060402').
       
  3159 
       
  3160     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10].
       
  3161     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0 0].
       
  3162     r := t1 absMul:t2.
       
  3163     self assert:(r hexPrintString = '1412100E0C0A08060402').
       
  3164 
       
  3165     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10 11].
       
  3166     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0 0].
       
  3167     r := t1 absMul:t2.
       
  3168     self assert:(r hexPrintString = '161412100E0C0A08060402').
       
  3169 
       
  3170     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10 11 12].
       
  3171     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0 0].
       
  3172     r := t1 absMul:t2.
       
  3173     self assert:(r hexPrintString = '18161412100E0C0A08060402').
       
  3174 
       
  3175 
       
  3176     "/ ==================0
       
  3177 
       
  3178     t1 := LargeInteger digitBytes:#[ 128 1 1 1 1 1 1 1].
       
  3179     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0].
       
  3180     r := t1 absMul:t2.
       
  3181     self assert:(r hexPrintString = '202020202020300').
       
  3182 
       
  3183     t1 := LargeInteger digitBytes:#[ 128 1 1 1 1 1 1 1].
       
  3184     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0].
       
  3185     r := t1 absMul:t2.
       
  3186     self assert:(r hexPrintString = '202020202020300').
       
  3187 
       
  3188     t1 := LargeInteger digitBytes:#[ 128 1 1 1 1 1 1 1].
       
  3189     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0].
       
  3190     r := t1 absMul:t2.
       
  3191     self assert:(r hexPrintString = '202020202020300').
       
  3192 
       
  3193     t1 := LargeInteger digitBytes:#[ 128 1 1 1 1 1 1 1].
       
  3194     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0 0].
       
  3195     r := t1 absMul:t2.
       
  3196     self assert:(r hexPrintString = '202020202020300').
       
  3197 
       
  3198     "/ ---------
       
  3199 
       
  3200     t1 := LargeInteger digitBytes:#[ 0 128 1 1 1 1 1 1 1].
       
  3201     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0].
       
  3202     r := t1 absMul:t2.
       
  3203     self assert:(r hexPrintString = '20202020202030000').
       
  3204 
       
  3205     t1 := LargeInteger digitBytes:#[ 0 128 1 1 1 1 1 1 1].
       
  3206     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0].
       
  3207     r := t1 absMul:t2.
       
  3208     self assert:(r hexPrintString = '20202020202030000').
       
  3209 
       
  3210     t1 := LargeInteger digitBytes:#[ 0 128 1 1 1 1 1 1 1].
       
  3211     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0].
       
  3212     r := t1 absMul:t2.
       
  3213     self assert:(r hexPrintString = '20202020202030000').
       
  3214 
       
  3215     t1 := LargeInteger digitBytes:#[ 0 128 1 1 1 1 1 1 1].
       
  3216     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0 0].
       
  3217     r := t1 absMul:t2.
       
  3218     self assert:(r hexPrintString = '20202020202030000').
       
  3219 
       
  3220     "/ ---------
       
  3221 
       
  3222     t1 := LargeInteger digitBytes:#[ 0 0 128 1 1 1 1 1 1 1].
       
  3223     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0].
       
  3224     r := t1 absMul:t2.
       
  3225     self assert:(r hexPrintString = '2020202020203000000').
       
  3226 
       
  3227     t1 := LargeInteger digitBytes:#[ 0 0 128 1 1 1 1 1 1 1].
       
  3228     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0].
       
  3229     r := t1 absMul:t2.
       
  3230     self assert:(r hexPrintString = '2020202020203000000').
       
  3231 
       
  3232     t1 := LargeInteger digitBytes:#[ 0 0 128 1 1 1 1 1 1 1].
       
  3233     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0].
       
  3234     r := t1 absMul:t2.
       
  3235     self assert:(r hexPrintString = '2020202020203000000').
       
  3236 
       
  3237     t1 := LargeInteger digitBytes:#[ 0 0 128 1 1 1 1 1 1 1].
       
  3238     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0 0].
       
  3239     r := t1 absMul:t2.
       
  3240     self assert:(r hexPrintString = '2020202020203000000').
       
  3241 
       
  3242     "/ ---------
       
  3243 
       
  3244     t1 := LargeInteger digitBytes:#[ 0 0 0 128 1 1 1 1 1 1 1].
       
  3245     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0].
       
  3246     r := t1 absMul:t2.
       
  3247     self assert:(r hexPrintString = '202020202020300000000').
       
  3248 
       
  3249     t1 := LargeInteger digitBytes:#[ 0 0 0 128 1 1 1 1 1 1 1].
       
  3250     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0].
       
  3251     r := t1 absMul:t2.
       
  3252     self assert:(r hexPrintString = '202020202020300000000').
       
  3253 
       
  3254     t1 := LargeInteger digitBytes:#[ 0 0 0 128 1 1 1 1 1 1 1].
       
  3255     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0].
       
  3256     r := t1 absMul:t2.
       
  3257     self assert:(r hexPrintString = '202020202020300000000').
       
  3258 
       
  3259     t1 := LargeInteger digitBytes:#[ 0 0 0 128 1 1 1 1 1 1 1].
       
  3260     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0 0].
       
  3261     r := t1 absMul:t2.
       
  3262     self assert:(r hexPrintString = '202020202020300000000').
       
  3263 
       
  3264     "
       
  3265      self basicNew testLargeMultiplicationHelpers2
       
  3266     "
       
  3267 
       
  3268     "Modified: / 02-12-2013 / 15:45:39 / cg"
       
  3269 !
       
  3270 
       
  3271 testLargeSubtraction1
       
  3272     |a1 a2 a b1 b2 b c1 c2 c|
       
  3273 
       
  3274     "/ on 32bit machines - these lead to smallint overflow
       
  3275     self assert:((2770568 + 2770568) printString = '5541136').
       
  3276     self assert:((2770568 - 2770568) printString = '0').
       
  3277     self assert:((2770568 negated + 2770568 negated) printString = '-5541136').
       
  3278     self assert:((5541136 negated - 2770568 negated) printString = '-2770568').
       
  3279 
       
  3280     "Large - small subtraction"
       
  3281 
       
  3282     self assert:((2770568900 + 2770568900) printString = '5541137800').
       
  3283     self assert:((2770568900 - 2770568900) printString = '0').
       
  3284     self assert:((2770568900 negated + 2770568900 negated) printString = '-5541137800').
       
  3285     self assert:((5541137800 negated - 2770568900 negated) printString = '-2770568900').
       
  3286     self assert:((2770568900 negated - 5541137800 negated) printString = '2770568900').
       
  3287 
       
  3288     a1 := -2770568900. a2 := 59049.
       
  3289     a := (a1 / a2) negated.
       
  3290     b1 := -5872025600. b2 := 59049.
       
  3291     b := (b1 / b2) negated.
       
  3292     c1 := 344606300. c2 := 6561.
       
  3293     c := (c1 / c2) negated.
       
  3294     self assert:(a - b closeTo: c).
       
  3295     self assert:((a - b) asFloat closeTo: c asFloat).
       
  3296     self assert:((a asFloat - b) closeTo: c asFloat).
       
  3297     self assert:((a - b asFloat) closeTo: c asFloat).
       
  3298 
       
  3299     a := -10.
       
  3300     b := -12.
       
  3301     self assert:(a - b = 2).
       
  3302 
       
  3303     a := -10000000.
       
  3304     b := -12000000.
       
  3305     self assert:(a - b = 2000000).
       
  3306 
       
  3307     a := -100000000000000.
       
  3308     b := -120000000000000.
       
  3309     self assert:(a - b = 20000000000000).
       
  3310 
       
  3311     "smallInteger - largeInteger"
       
  3312     self assert:(-1000000000 - -2000000000 = 1000000000).
       
  3313     "largeInteger - smallInteger"
       
  3314     self assert:(-2000000000 - -1000000000 = -1000000000).
       
  3315 
       
  3316     a := 40 factorial.
       
  3317     b := 39 factorial.
       
  3318     self assert:(a - b + b = a).
       
  3319 
       
  3320     "
       
  3321      self basicNew testLargeSubtraction1
       
  3322     "
       
  3323 
       
  3324     "Modified: / 27.11.1999 / 16:41:54 / cg"
       
  3325 !
       
  3326 
       
  3327 testLargeSubtraction2
       
  3328     "/ on 64bit machines - these lead to smallint overflow
       
  3329     self assert:((16r3FFFFFFFFFFFFFFF negated - 1 - 1) printString = '-4611686018427387905').
       
  3330 
       
  3331     "
       
  3332      self basicNew testLargeSubtraction2
       
  3333     "
       
  3334 !
       
  3335 
       
  3336 testModulu
       
  3337     |a b op|
       
  3338 
       
  3339     op := #\\.
       
  3340     a := -1.
       
  3341     b := 8.
       
  3342     self assert:(-1 \\ 8 == 7).
       
  3343     self assert:(a \\ 8 == 7).
       
  3344     self assert:(-1 \\ b == 7).
       
  3345     self assert:(a \\ b == 7).
       
  3346 
       
  3347     self assert:((-1 perform:op with: 8) == 7).
       
  3348     self assert:((a perform:op with: 8) == 7).
       
  3349     self assert:((-1 perform:op with: b) == 7).
       
  3350     self assert:((a perform:op with: b) == 7).
       
  3351 
       
  3352     a := 1.
       
  3353     b := -8.
       
  3354     self assert:(1 \\ -8 == -7).
       
  3355     self assert:(a \\ -8 == -7).
       
  3356     self assert:(1 \\ b == -7).
       
  3357     self assert:(a \\ b == -7).
       
  3358 
       
  3359     self assert:((1 perform:op with: -8) == -7).
       
  3360     self assert:((a perform:op with: -8) == -7).
       
  3361     self assert:((1 perform:op with: b) == -7).
       
  3362     self assert:((a perform:op with: b) == -7).
       
  3363 
       
  3364     a := -1.
       
  3365     b := -8.
       
  3366     self assert:(-1 \\ -8 == -1).
       
  3367     self assert:(a \\ -8 == -1).
       
  3368     self assert:(-1 \\ b == -1).
       
  3369     self assert:(a \\ b == -1).
       
  3370 
       
  3371     self assert:((-1 perform:op with: -8) == -1).
       
  3372     self assert:((a perform:op with: -8) == -1).
       
  3373     self assert:((-1 perform:op with: b) == -1).
       
  3374     self assert:((a perform:op with: b) == -1).
       
  3375 
       
  3376     a := 1.
       
  3377     b := 8.
       
  3378     self assert:(1 \\ 8 == 1).
       
  3379     self assert:(a \\ 8 == 1).
       
  3380     self assert:(1 \\ b == 1).
       
  3381     self assert:(a \\ b == 1).
       
  3382 
       
  3383     self assert:((1 perform:op with: 8) == 1).
       
  3384     self assert:((a perform:op with: 8) == 1).
       
  3385     self assert:((1 perform:op with: b) == 1).
       
  3386     self assert:((a perform:op with: b) == 1).
       
  3387 
       
  3388 
       
  3389     a := -17.
       
  3390     b := 8.
       
  3391     self assert:(-17 \\ 8 == 7).
       
  3392     self assert:(a \\ 8 == 7).
       
  3393     self assert:(-17 \\ b == 7).
       
  3394     self assert:(a \\ b == 7).
       
  3395 
       
  3396     self assert:((-17 perform:op with: 8) == 7).
       
  3397     self assert:((a perform:op with: 8) == 7).
       
  3398     self assert:((-17 perform:op with: b) == 7).
       
  3399     self assert:((a perform:op with: b) == 7).
       
  3400 
       
  3401     a := 17.
       
  3402     b := -8.
       
  3403     self assert:(17 \\ -8 == -7).
       
  3404     self assert:(a \\ -8 == -7).
       
  3405     self assert:(17 \\ b == -7).
       
  3406     self assert:(a \\ b == -7).
       
  3407 
       
  3408     self assert:((17 perform:op with: -8) == -7).
       
  3409     self assert:((a perform:op with: -8) == -7).
       
  3410     self assert:((17 perform:op with: b) == -7).
       
  3411     self assert:((a perform:op with: b) == -7).
       
  3412 
       
  3413     a := -17.
       
  3414     b := -8.
       
  3415     self assert:(-17 \\ -8 == -1).
       
  3416     self assert:(a \\ -8 == -1).
       
  3417     self assert:(-17 \\ b == -1).
       
  3418     self assert:(a \\ b == -1).
       
  3419 
       
  3420     self assert:((-17 perform:op with: -8) == -1).
       
  3421     self assert:((a perform:op with: -8) == -1).
       
  3422     self assert:((-17 perform:op with: b) == -1).
       
  3423     self assert:((a perform:op with: b) == -1).
       
  3424 
       
  3425     a := 17.
       
  3426     b := 8.
       
  3427     self assert:(17 \\ 8 == 1).
       
  3428     self assert:(a \\ 8 == 1).
       
  3429     self assert:(17 \\ b == 1).
       
  3430     self assert:(a \\ b == 1).
       
  3431 
       
  3432     self assert:((17 perform:op with: 8) == 1).
       
  3433     self assert:((a perform:op with: 8) == 1).
       
  3434     self assert:((17 perform:op with: b) == 1).
       
  3435     self assert:((a perform:op with: b) == 1).
       
  3436 
       
  3437 
       
  3438     op := #rem:.
       
  3439     a := -1.
       
  3440     b := 8.
       
  3441     self assert:((-1 rem: 8) == -1).
       
  3442     self assert:((a rem: 8) == -1).
       
  3443     self assert:((-1 rem: b) == -1).
       
  3444     self assert:((a rem: b) == -1).
       
  3445 
       
  3446     self assert:((-1 perform:op with: -8) == -1).
       
  3447     self assert:((a perform:op with: -8) == -1).
       
  3448     self assert:((-1 perform:op with: b) == -1).
       
  3449     self assert:((a perform:op with: b) == -1).
       
  3450 
       
  3451     a := 1.
       
  3452     b := -8.
       
  3453     self assert:((1 rem: -8) == 1).
       
  3454     self assert:((a rem: -8) == 1).
       
  3455     self assert:((1 rem: b) == 1).
       
  3456     self assert:((a rem: b) == 1).
       
  3457 
       
  3458     self assert:((1 perform:op with: -8) == 1).
       
  3459     self assert:((a perform:op with: -8) == 1).
       
  3460     self assert:((1 perform:op with: b) == 1).
       
  3461     self assert:((a perform:op with: b) == 1).
       
  3462 
       
  3463     a := -1.
       
  3464     b := -8.
       
  3465     self assert:((-1 rem: -8) == -1).
       
  3466     self assert:((a rem: -8) == -1).
       
  3467     self assert:((-1 rem: b) == -1).
       
  3468     self assert:((a rem: b) == -1).
       
  3469 
       
  3470     self assert:((-1 perform:op with: -8) == -1).
       
  3471     self assert:((a perform:op with: -8) == -1).
       
  3472     self assert:((-1 perform:op with: b) == -1).
       
  3473     self assert:((a perform:op with: b) == -1).
       
  3474 
       
  3475     a := 1.
       
  3476     b := 8.
       
  3477     self assert:((1 rem: 8) == 1).
       
  3478     self assert:((a rem: 8) == 1).
       
  3479     self assert:((1 rem: b) == 1).
       
  3480     self assert:((a rem: b) == 1).
       
  3481 
       
  3482     self assert:((1 perform:op with: 8) == 1).
       
  3483     self assert:((a perform:op with: 8) == 1).
       
  3484     self assert:((1 perform:op with: b) == 1).
       
  3485     self assert:((a perform:op with: b) == 1).
       
  3486 
       
  3487     a := -17.
       
  3488     b := 8.
       
  3489     self assert:((-17 rem: 8) == -1).
       
  3490     self assert:((a rem: 8) == -1).
       
  3491     self assert:((-17 rem: b) == -1).
       
  3492     self assert:((a rem: b) == -1).
       
  3493 
       
  3494     self assert:((-17 perform:op with: -8) == -1).
       
  3495     self assert:((a perform:op with: -8) == -1).
       
  3496     self assert:((-17 perform:op with: b) == -1).
       
  3497     self assert:((a perform:op with: b) == -1).
       
  3498 
       
  3499     a := 17.
       
  3500     b := -8.
       
  3501     self assert:((17 rem: -8) == 1).
       
  3502     self assert:((a rem: -8) == 1).
       
  3503     self assert:((17 rem: b) == 1).
       
  3504     self assert:((a rem: b) == 1).
       
  3505 
       
  3506     self assert:((17 perform:op with: -8) == 1).
       
  3507     self assert:((a perform:op with: -8) == 1).
       
  3508     self assert:((17 perform:op with: b) == 1).
       
  3509     self assert:((a perform:op with: b) == 1).
       
  3510 
       
  3511     a := -17.
       
  3512     b := -8.
       
  3513     self assert:((-17 rem: -8) == -1).
       
  3514     self assert:((a rem: -8) == -1).
       
  3515     self assert:((-17 rem: b) == -1).
       
  3516     self assert:((a rem: b) == -1).
       
  3517 
       
  3518     self assert:((-17 perform:op with: -8) == -1).
       
  3519     self assert:((a perform:op with: -8) == -1).
       
  3520     self assert:((-17 perform:op with: b) == -1).
       
  3521     self assert:((a perform:op with: b) == -1).
       
  3522 
       
  3523     a := 17.
       
  3524     b := 8.
       
  3525     self assert:((17 rem: 8) == 1).
       
  3526     self assert:((a rem: 8) == 1).
       
  3527     self assert:((17 rem: b) == 1).
       
  3528     self assert:((a rem: b) == 1).
       
  3529 
       
  3530     self assert:((17 perform:op with: 8) == 1).
       
  3531     self assert:((a perform:op with: 8) == 1).
       
  3532     self assert:((17 perform:op with: b) == 1).
       
  3533     self assert:((a perform:op with: b) == 1).
       
  3534 
       
  3535     "
       
  3536      self basicNew testModulu
       
  3537     "
       
  3538 !
       
  3539 
       
  3540 testNegation
       
  3541     self assert:(self doNegate:SmallInteger minVal) class = LargeInteger.
       
  3542     self assert:(self doNegate:SmallInteger minVal) = (SmallInteger maxVal + 1).
       
  3543 
       
  3544     self assert:(self doNegate2:SmallInteger minVal) class = LargeInteger.
       
  3545     self assert:(self doNegate2:SmallInteger minVal) = (SmallInteger maxVal + 1).
       
  3546 !
       
  3547 
       
  3548 testSmallIntegerArithmetic
       
  3549     "arithmetic tests.
       
  3550      Notice, the arithmetic tests are both performed via regular sends
       
  3551      and via constructed performs. The reason is to test both inlined
       
  3552      JIT-compiler code AND the regular methods code."
       
  3553 
       
  3554     |n1 n2 t|
       
  3555 
       
  3556     "/ test division and modulu ...
       
  3557     self assert:(1 printString = '1').
       
  3558     self assert:(10 printString = '10').
       
  3559     self assert:(100 printString = '100').
       
  3560     self assert:(1000 printString = '1000').
       
  3561     self assert:(10000 printString = '10000').
       
  3562     self assert:(100000 printString = '100000').
       
  3563 
       
  3564     self assert:(1 - 1 = 0).
       
  3565     self assert:(1 + -1 = 0).
       
  3566     self assert:(-1 + 1 = 0).
       
  3567     self assert:(-1 - -1 = 0).
       
  3568 
       
  3569     "addition with overflow"
       
  3570 
       
  3571     SmallInteger maxBytes == 4 ifTrue:[
       
  3572         n1 := 16r3FFFFFFF.
       
  3573         n2 := 16r-40000000.
       
  3574     ] ifFalse:[
       
  3575         n1 := 16r3FFFFFFFFFFFFFFF.
       
  3576         n2 := 16r-4000000000000000.
       
  3577     ].
       
  3578     self assert:(n1 class == SmallInteger).
       
  3579     self assert:(n2 class == SmallInteger).
       
  3580 
       
  3581     self assert:((n1 + 1) class == LargeInteger).
       
  3582     t := n1 + 1.
       
  3583     self assert:((t - 1) class == SmallInteger).
       
  3584 
       
  3585     self assert:((n2 - 1) class == LargeInteger).
       
  3586     t := n2 - 1.
       
  3587     self assert:((t + 1) class == SmallInteger).
       
  3588 
       
  3589     self assert:((n1 negated) class == SmallInteger).
       
  3590     self assert:((n2 negated) class == LargeInteger).
       
  3591     self assert:((n1 perform:'negated' asSymbol) class == SmallInteger).
       
  3592     self assert:((n2 perform:'negated' asSymbol) class == LargeInteger).
       
  3593 
       
  3594     self assert:((n1 abs == n1)).
       
  3595     self assert:((n2 abs = n2 negated)).
       
  3596     self assert:((n1 perform:'abs' asSymbol) == n1).
       
  3597     self assert:((n2 perform:'abs' asSymbol) = n2 negated).
       
  3598 
       
  3599     self testSmallIntegerMultiplication1.
       
  3600     self testSmallIntegerMultiplication1b.
       
  3601     self testSmallIntegerMultiplication2.
       
  3602     self testSmallIntegerDivision1.
       
  3603 
       
  3604     "
       
  3605      self basicNew testSmallIntegerArithmetic
       
  3606     "
       
  3607 
       
  3608     "Created: / 06-06-1999 / 14:47:51 / cg"
       
  3609     "Modified: / 09-06-1999 / 17:49:57 / cg"
       
  3610     "Modified (format): / 19-09-2017 / 16:28:09 / stefan"
       
  3611     "Modified: / 12-03-2018 / 16:18:59 / mawalch"
       
  3612 !
       
  3613 
       
  3614 testSmallIntegerDivision1
       
  3615     "division tests.
       
  3616      Notice, the arithmetic tests are both performed via regular sends
       
  3617      and via constructed performs. The reason is to test both inlined
       
  3618      JIT-compiler code AND the regular methods code."
       
  3619 
       
  3620     |n1 n2|
       
  3621 
       
  3622     n1 := 1000.
       
  3623 
       
  3624     "/ truncation towards...
       
  3625 
       
  3626     "/ ... negative infinity
       
  3627     n2 := 3.
       
  3628     self assert:((n1 // n2) == 333).
       
  3629     self assert:((n1 // n2) printString = '333').
       
  3630     self assert:((n1 perform:'//' asSymbol with:n2) == 333).
       
  3631 
       
  3632     n2 := -3.
       
  3633     self assert:((n1 // n2) == -334).
       
  3634     self assert:((n1 // n2) printString = '-334').
       
  3635     self assert:((n1 perform:'//' asSymbol with:n2) == -334).
       
  3636 
       
  3637     n2 := 3600000.
       
  3638     self assert:((n1 // n2) == 0).
       
  3639     self assert:((n1 // n2) printString = '0').
       
  3640     self assert:((n1 perform:'//' asSymbol with:n2) == 0).
       
  3641 
       
  3642     n2 := -3600000.
       
  3643     self assert:((n1 // n2) == -1).
       
  3644     self assert:((n1 // n2) printString = '-1').
       
  3645     self assert:((n1 perform:'//' asSymbol with:n2) == -1).
       
  3646 
       
  3647     self assert:( (9000000000 \\ 4000000000)   = (900 \\ 400 * 10000000)).
       
  3648     self assert:( (-9000000000 \\ 4000000000)  = (-900 \\ 400 * 10000000)).
       
  3649     self assert:( (9000000000 \\ -4000000000)  = (900 \\ -400 * 10000000)).
       
  3650     self assert:( (-9000000000 \\ -4000000000) = (-900 \\ -400 * 10000000)).
       
  3651     self assert:( (16000000000 \\ 4000000000)  = (1600 \\ 400 * 10000000)).
       
  3652     self assert:( (-16000000000 \\ 4000000000)  = (-1600 \\ 400 * 10000000)).
       
  3653     self assert:( (16000000000 \\ -4000000000)  = (1600 \\ -400 * 10000000)).
       
  3654     self assert:( (-16000000000 \\ -4000000000)  = (-1600 \\ -400 * 10000000)).
       
  3655 
       
  3656     self assert:(( 9000000000 \\ 7 ) == 5).
       
  3657     self assert:( (((9000000000 // 7)*  7) + (9000000000 \\ 7)) = 9000000000 ).
       
  3658 
       
  3659     self assert:(( -9000000000 \\ 7) == 2).
       
  3660     self assert:( (((-9000000000 // 7) * 7) + (-9000000000 \\ 7)) = -9000000000 ).
       
  3661 
       
  3662     self assert:(( 9000000000 \\ -7) == -2).
       
  3663     self assert:( (((9000000000 // -7) * -7) + (9000000000 \\ -7)) = 9000000000 ).
       
  3664 
       
  3665     self assert:(( -9000000000 \\ -7) == -5).
       
  3666     self assert:( (((-9000000000 // -7) * -7) + (-9000000000 \\ -7)) = -9000000000 ).
       
  3667 
       
  3668     "/ ---------------------------
       
  3669     "/ towards zero
       
  3670     n2 := 3.
       
  3671     self assert:((n1 quo: n2) == 333).
       
  3672     self assert:((n1 quo: n2) printString = '333').
       
  3673     self assert:((n1 perform:'quo:' asSymbol with:n2) == 333).
       
  3674 
       
  3675     n2 := -3.
       
  3676     self assert:((n1 quo: n2) == -333).
       
  3677     self assert:((n1 quo: n2) printString = '-333').
       
  3678     self assert:((n1 perform:'quo:' asSymbol with:n2) == -333).
       
  3679 
       
  3680     n2 := 3600000.
       
  3681     self assert:((n1 quo: n2) == 0).
       
  3682     self assert:((n1 quo: n2) printString = '0').
       
  3683     self assert:((n1 perform:'quo:' asSymbol with:n2) == 0).
       
  3684 
       
  3685     n2 := -3600000.
       
  3686     self assert:((n1 quo: n2) == 0).
       
  3687     self assert:((n1 quo: n2) printString = '0').
       
  3688     self assert:((n1 perform:'quo:' asSymbol with:n2) == 0).
       
  3689 
       
  3690     self assert:( 900 rem: 400 ) == 100.
       
  3691     self assert:( (((900 quo: 400) * 400) + ( 900 rem: 400 )) == 900 ).
       
  3692 
       
  3693     self assert:( -900 rem: 400) == -100.  
       
  3694     self assert:( (((-900 quo: 400) * 400) + ( -900 rem: 400 )) == -900 ).
       
  3695 
       
  3696     self assert:( 900 rem: -400) == 100.  
       
  3697     self assert:( (((900 quo: -400) * -400) + ( 900 rem: -400 )) == 900 ).
       
  3698 
       
  3699     self assert:( -900 rem: -400) == -100.  
       
  3700     self assert:( (((-900 quo: -400) * -400) + ( -900 rem: -400 )) == -900 ).
       
  3701 
       
  3702     self assert:(  9000000000 rem: 4000000000 ) = 1000000000. 
       
  3703     self assert:( (((9000000000 quo: 4000000000)*4000000000) + ( 9000000000 rem: 4000000000 )) = 9000000000 ).
       
  3704 
       
  3705     self assert:(  -9000000000 rem: 4000000000 ) = -1000000000. 
       
  3706     self assert:( (((-9000000000 quo: 4000000000) * 4000000000) + ( -9000000000 rem: 4000000000 )) = -9000000000 ).
       
  3707 
       
  3708     self assert:(  9000000000 rem: -4000000000 ) = 1000000000. 
       
  3709     self assert:( (((9000000000 quo: -4000000000) * -4000000000) + ( 9000000000 rem: -4000000000 )) = 9000000000 ).
       
  3710 
       
  3711     self assert:(  -9000000000 rem: -4000000000 ) = -1000000000. 
       
  3712     self assert:( (((-9000000000 quo: -4000000000) * -4000000000) + ( -9000000000 rem: -4000000000 )) = -9000000000 ).
       
  3713 
       
  3714     "
       
  3715      self basicNew testSmallIntegerDivision1
       
  3716     "
       
  3717 
       
  3718     "Created: / 09-06-1999 / 17:49:45 / cg"
       
  3719     "Modified: / 05-07-2017 / 16:38:27 / cg"
       
  3720 !
       
  3721 
       
  3722 testSmallIntegerMultiplication1
       
  3723     "multiply tests (var * const).
       
  3724      Notice, the arithmetic tests are both performed via regular sends
       
  3725      and via constructed performs. The reason is to test both inlined
       
  3726      JIT-compiler code AND the regular methods code."
       
  3727 
       
  3728     |n1 n2|
       
  3729 
       
  3730     n1 := 100000.
       
  3731     n2 := n1 negated.
       
  3732 
       
  3733     self assert:(n1 printString = '100000').
       
  3734     self assert:(n2 printString = '-100000').
       
  3735 
       
  3736     self assert:((n1 * 0) printString = '0').
       
  3737     self assert:((n1 perform:'*' asSymbol with:0) printString = '0').
       
  3738 
       
  3739     self assert:((n1 * 1) printString = '100000').
       
  3740     self assert:((n1 perform:'*' asSymbol with:1) printString = '100000').
       
  3741     self assert:((n2 * 1) printString = '-100000').
       
  3742     self assert:((n2 perform:'*' asSymbol with:1) printString = '-100000').
       
  3743 
       
  3744     self assert:((n1 * -1) printString = '-100000').
       
  3745     self assert:((n1 perform:'*' asSymbol with:-1) printString = '-100000').
       
  3746     self assert:((n2 * -1) printString = '100000').
       
  3747     self assert:((n2 perform:'*' asSymbol with:-1) printString = '100000').
       
  3748 
       
  3749     self assert:((n1 * 2) printString = '200000').
       
  3750     self assert:((n1 perform:'*' asSymbol with:2) printString = '200000').
       
  3751     self assert:((n1 * 3) printString = '300000').
       
  3752     self assert:((n1 perform:'*' asSymbol with:3) printString = '300000').
       
  3753     self assert:((n1 * 4) printString = '400000').
       
  3754     self assert:((n1 perform:'*' asSymbol with:4) printString = '400000').
       
  3755     self assert:((n1 * 5) printString = '500000').
       
  3756     self assert:((n1 perform:'*' asSymbol with:5) printString = '500000').
       
  3757     self assert:((n1 * 6) printString = '600000').
       
  3758     self assert:((n1 perform:'*' asSymbol with:6) printString = '600000').
       
  3759     self assert:((n1 * 7) printString = '700000').
       
  3760     self assert:((n1 perform:'*' asSymbol with:7) printString = '700000').
       
  3761     self assert:((n1 * 8) printString = '800000').
       
  3762     self assert:((n1 perform:'*' asSymbol with:8) printString = '800000').
       
  3763     self assert:((n1 * 9) printString = '900000').
       
  3764     self assert:((n1 perform:'*' asSymbol with:9) printString = '900000').
       
  3765     self assert:((n1 * 10) printString = '1000000').
       
  3766     self assert:((n1 perform:'*' asSymbol with:10) printString = '1000000').
       
  3767     self assert:((n1 * 11) printString = '1100000').
       
  3768     self assert:((n1 perform:'*' asSymbol with:11) printString = '1100000').
       
  3769     self assert:((n1 * 12) printString = '1200000').
       
  3770     self assert:((n1 perform:'*' asSymbol with:12) printString = '1200000').
       
  3771     self assert:((n1 * 13) printString = '1300000').
       
  3772     self assert:((n1 perform:'*' asSymbol with:13) printString = '1300000').
       
  3773     self assert:((n1 * 14) printString = '1400000').
       
  3774     self assert:((n1 perform:'*' asSymbol with:14) printString = '1400000').
       
  3775     self assert:((n1 * 15) printString = '1500000').
       
  3776     self assert:((n1 perform:'*' asSymbol with:15) printString = '1500000').
       
  3777     self assert:((n1 * 16) printString = '1600000').
       
  3778     self assert:((n1 perform:'*' asSymbol with:16) printString = '1600000').
       
  3779 
       
  3780     n1 := 1.
       
  3781     n2 := 10.
       
  3782     self assert:((n1 * n2) printString = '10').
       
  3783     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10').
       
  3784     n2 := n2 * 10.
       
  3785     self assert:((n1 * n2) printString = '100').
       
  3786     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100').
       
  3787     n2 := n2 * 10.
       
  3788     self assert:((n1 * n2) printString = '1000').
       
  3789     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000').
       
  3790     n2 := n2 * 10.
       
  3791     self assert:((n1 * n2) printString = '10000').
       
  3792     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000').
       
  3793     n2 := n2 * 10.
       
  3794     self assert:((n1 * n2) printString = '100000').
       
  3795     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100000').
       
  3796     n2 := n2 * 10.
       
  3797     self assert:((n1 * n2) printString = '1000000').
       
  3798     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000000').
       
  3799     n2 := n2 * 10.
       
  3800     self assert:((n1 * n2) printString = '10000000').
       
  3801     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000000').
       
  3802     n2 := n2 * 10.
       
  3803     self assert:((n1 * n2) printString = '100000000').
       
  3804     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100000000').
       
  3805     n2 := n2 * 10.
       
  3806     self assert:((n1 * n2) printString = '1000000000').
       
  3807     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000000000').
       
  3808     n2 := n2 * 10.
       
  3809     self assert:((n1 * n2) printString = '10000000000').
       
  3810     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000000000').
       
  3811     n2 := n2 * 10.
       
  3812     self assert:((n1 * n2) printString = '100000000000').
       
  3813     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100000000000').
       
  3814     n2 := n2 * 10.
       
  3815     self assert:((n1 * n2) printString = '1000000000000').
       
  3816     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000000000000').
       
  3817     n2 := n2 * 10.
       
  3818     self assert:((n1 * n2) printString = '10000000000000').
       
  3819     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000000000000').
       
  3820 
       
  3821     n1 := 1.
       
  3822     n2 := 10.
       
  3823     self assert:((n1 * n2) printString = '10').
       
  3824     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10').
       
  3825     n1 := n1 * 10.
       
  3826     self assert:((n1 * n2) printString = '100').
       
  3827     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100').
       
  3828     n1 := n1 * 10.
       
  3829     self assert:((n1 * n2) printString = '1000').
       
  3830     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000').
       
  3831     n1 := n1 * 10.
       
  3832     self assert:((n1 * n2) printString = '10000').
       
  3833     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000').
       
  3834     n1 := n1 * 10.
       
  3835     self assert:((n1 * n2) printString = '100000').
       
  3836     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100000').
       
  3837     n1 := n1 * 10.
       
  3838     self assert:((n1 * n2) printString = '1000000').
       
  3839     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000000').
       
  3840     n1 := n1 * 10.
       
  3841     self assert:((n1 * n2) printString = '10000000').
       
  3842     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000000').
       
  3843     n1 := n1 * 10.
       
  3844     self assert:((n1 * n2) printString = '100000000').
       
  3845     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100000000').
       
  3846     n1 := n1 * 10.
       
  3847     self assert:((n1 * n2) printString = '1000000000').
       
  3848     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000000000').
       
  3849     n1 := n1 * 10.
       
  3850     self assert:((n1 * n2) printString = '10000000000').
       
  3851     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000000000').
       
  3852     n1 := n1 * 10.
       
  3853     self assert:((n1 * n2) printString = '100000000000').
       
  3854     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100000000000').
       
  3855     n1 := n1 * 10.
       
  3856     self assert:((n1 * n2) printString = '1000000000000').
       
  3857     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000000000000').
       
  3858     n1 := n1 * 10.
       
  3859     self assert:((n1 * n2) printString = '10000000000000').
       
  3860     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000000000000').
       
  3861 
       
  3862     n1 := 10.
       
  3863     n2 := 10.
       
  3864     self assert:((n1 * n2) printString = '100').
       
  3865     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100').
       
  3866     n1 := n1 * 10.
       
  3867     n2 := n2 * 10.
       
  3868     self assert:((n1 * n2) printString = '10000').
       
  3869     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000').
       
  3870     n1 := n1 * 10.
       
  3871     n2 := n2 * 10.
       
  3872     self assert:((n1 * n2) printString = '1000000').
       
  3873     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000000').
       
  3874     n1 := n1 * 10.
       
  3875     n2 := n2 * 10.
       
  3876     self assert:((n1 * n2) printString = '100000000').
       
  3877     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100000000').
       
  3878     n1 := n1 * 10.
       
  3879     n2 := n2 * 10.
       
  3880     self assert:((n1 * n2) printString = '10000000000').
       
  3881     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000000000').
       
  3882     n1 := n1 * 10.
       
  3883     n2 := n2 * 10.
       
  3884     self assert:((n1 * n2) printString = '1000000000000').
       
  3885     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000000000000').
       
  3886     n1 := n1 * 10.
       
  3887     n2 := n2 * 10.
       
  3888     self assert:((n1 * n2) printString = '100000000000000').
       
  3889     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100000000000000').
       
  3890     n1 := n1 * 10.
       
  3891     n2 := n2 * 10.
       
  3892     self assert:((n1 * n2) printString = '10000000000000000').
       
  3893     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000000000000000').
       
  3894     n1 := n1 * 10.
       
  3895     n2 := n2 * 10.
       
  3896     self assert:((n1 * n2) printString = '1000000000000000000').
       
  3897     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000000000000000000').
       
  3898     n1 := n1 * 10.
       
  3899     n2 := n2 * 10.
       
  3900     self assert:((n1 * n2) printString = '100000000000000000000').
       
  3901     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100000000000000000000').
       
  3902     n1 := n1 * 10.
       
  3903     n2 := n2 * 10.
       
  3904     self assert:((n1 * n2) printString = '10000000000000000000000').
       
  3905     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000000000000000000000').
       
  3906     n1 := n1 * 10.
       
  3907     n2 := n2 * 10.
       
  3908     self assert:((n1 * n2) printString = '1000000000000000000000000').
       
  3909     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000000000000000000000000').
       
  3910     n1 := n1 * 10.
       
  3911     n2 := n2 * 10.
       
  3912     self assert:((n1 * n2) printString = '100000000000000000000000000').
       
  3913     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100000000000000000000000000').
       
  3914 
       
  3915     "
       
  3916      self basicNew testSmallIntegerMultiplication1
       
  3917     "
       
  3918 
       
  3919     "Modified: / 9.6.1999 / 17:47:56 / cg"
       
  3920     "Created: / 9.6.1999 / 17:49:45 / cg"
       
  3921 !
       
  3922 
       
  3923 testSmallIntegerMultiplication1b
       
  3924     "multiply tests (const * var).
       
  3925      Notice, the arithmetic tests are both performed via regular sends
       
  3926      and via constructed performs. The reason is to test both inlined
       
  3927      JIT-compiler code AND the regular methods code."
       
  3928 
       
  3929     |n1 n2|
       
  3930 
       
  3931     n1 := 100000.
       
  3932     n2 := n1 negated.
       
  3933 
       
  3934     self assert:((0 * n1) printString = '0').
       
  3935     self assert:((0 perform:'*' asSymbol with:n1) printString = '0').
       
  3936 
       
  3937     self assert:((1 * n1) printString = '100000').
       
  3938     self assert:((1 perform:'*' asSymbol with:n1) printString = '100000').
       
  3939     self assert:((1 * n2) printString = '-100000').
       
  3940     self assert:((1 perform:'*' asSymbol with:n2) printString = '-100000').
       
  3941 
       
  3942     self assert:((-1 * n1) printString = '-100000').
       
  3943     self assert:((-1 perform:'*' asSymbol with:n1) printString = '-100000').
       
  3944     self assert:((-1 * n2) printString = '100000').
       
  3945     self assert:((-1 perform:'*' asSymbol with:n2) printString = '100000').
       
  3946 
       
  3947     self assert:((2 * n1) printString = '200000').
       
  3948     self assert:((2 perform:'*' asSymbol with:n1) printString = '200000').
       
  3949     self assert:((3 * n1) printString = '300000').
       
  3950     self assert:((3 perform:'*' asSymbol with:n1) printString = '300000').
       
  3951     self assert:((4 * n1) printString = '400000').
       
  3952     self assert:((4 perform:'*' asSymbol with:n1) printString = '400000').
       
  3953     self assert:((5 * n1) printString = '500000').
       
  3954     self assert:((5 perform:'*' asSymbol with:n1) printString = '500000').
       
  3955     self assert:((6 * n1) printString = '600000').
       
  3956     self assert:((6 perform:'*' asSymbol with:n1) printString = '600000').
       
  3957     self assert:((7 * n1) printString = '700000').
       
  3958     self assert:((7 perform:'*' asSymbol with:n1) printString = '700000').
       
  3959     self assert:((8 * n1) printString = '800000').
       
  3960     self assert:((8 perform:'*' asSymbol with:n1) printString = '800000').
       
  3961     self assert:((9 * n1) printString = '900000').
       
  3962     self assert:((9 perform:'*' asSymbol with:n1) printString = '900000').
       
  3963     self assert:((10 * n1) printString = '1000000').
       
  3964     self assert:((10 perform:'*' asSymbol with:n1) printString = '1000000').
       
  3965     self assert:((11 * n1) printString = '1100000').
       
  3966     self assert:((11 perform:'*' asSymbol with:n1) printString = '1100000').
       
  3967 
       
  3968     "
       
  3969      self basicNew testSmallIntegerMultiplication1b
       
  3970     "
       
  3971 
       
  3972     "Modified: / 9.6.1999 / 17:47:56 / cg"
       
  3973     "Created: / 9.6.1999 / 17:49:45 / cg"
       
  3974 !
       
  3975 
       
  3976 testSmallIntegerMultiplication2
       
  3977     "multiply tests.
       
  3978      Notice, the arithmetic tests are both performed via regular sends
       
  3979      and via constructed performs. The reason is to test both inlined
       
  3980      JIT-compiler code AND the regular methods code."
       
  3981 
       
  3982     |n1 n2|
       
  3983 
       
  3984     n1 := 100000.
       
  3985     n2 := n1 negated.
       
  3986 
       
  3987     self assert:((n1 * 2) printString = '200000').
       
  3988     self assert:((n1 perform:'*' asSymbol with:2) printString = '200000').
       
  3989     self assert:((n1 * 3) printString = '300000').
       
  3990     self assert:((n1 perform:'*' asSymbol with:3) printString = '300000').
       
  3991     self assert:((n1 * 4) printString = '400000').
       
  3992     self assert:((n1 perform:'*' asSymbol with:4) printString = '400000').
       
  3993     self assert:((n1 * 5) printString = '500000').
       
  3994     self assert:((n1 perform:'*' asSymbol with:5) printString = '500000').
       
  3995     self assert:((n1 * 6) printString = '600000').
       
  3996     self assert:((n1 perform:'*' asSymbol with:6) printString = '600000').
       
  3997     self assert:((n1 * 7) printString = '700000').
       
  3998     self assert:((n1 perform:'*' asSymbol with:7) printString = '700000').
       
  3999     self assert:((n1 * 8) printString = '800000').
       
  4000     self assert:((n1 perform:'*' asSymbol with:8) printString = '800000').
       
  4001     self assert:((n1 * 9) printString = '900000').
       
  4002     self assert:((n1 perform:'*' asSymbol with:9) printString = '900000').
       
  4003     self assert:((n1 * 10) printString = '1000000').
       
  4004     self assert:((n1 perform:'*' asSymbol with:10) printString = '1000000').
       
  4005     self assert:((n1 * 11) printString = '1100000').
       
  4006     self assert:((n1 perform:'*' asSymbol with:11) printString = '1100000').
       
  4007     self assert:((n1 * 12) printString = '1200000').
       
  4008     self assert:((n1 perform:'*' asSymbol with:12) printString = '1200000').
       
  4009     self assert:((n1 * 13) printString = '1300000').
       
  4010     self assert:((n1 perform:'*' asSymbol with:13) printString = '1300000').
       
  4011     self assert:((n1 * 14) printString = '1400000').
       
  4012     self assert:((n1 perform:'*' asSymbol with:14) printString = '1400000').
       
  4013     self assert:((n1 * 15) printString = '1500000').
       
  4014     self assert:((n1 perform:'*' asSymbol with:15) printString = '1500000').
       
  4015     self assert:((n1 * 16) printString = '1600000').
       
  4016     self assert:((n1 perform:'*' asSymbol with:16) printString = '1600000').
       
  4017     self assert:((n1 * 17) printString = '1700000').
       
  4018     self assert:((n1 perform:'*' asSymbol with:17) printString = '1700000').
       
  4019     self assert:((n1 * 18) printString = '1800000').
       
  4020     self assert:((n1 perform:'*' asSymbol with:18) printString = '1800000').
       
  4021     self assert:((n1 * 19) printString = '1900000').
       
  4022     self assert:((n1 perform:'*' asSymbol with:19) printString = '1900000').
       
  4023 
       
  4024     "
       
  4025      self basicNew testSmallIntegerMultiplication2
       
  4026     "
       
  4027 
       
  4028     "Modified: / 9.6.1999 / 17:47:56 / cg"
       
  4029     "Created: / 9.6.1999 / 17:49:45 / cg"
       
  4030 !
       
  4031 
       
  4032 testSmallIntegerMultiplication3
       
  4033     "multiply tests.
       
  4034      Notice, the arithmetic tests are both performed via regular sends
       
  4035      and via constructed performs. The reason is to test both inlined
       
  4036      JIT-compiler code AND the regular methods code."
       
  4037 
       
  4038     |n1 n2|
       
  4039 
       
  4040     n1 := 16rFFFF.
       
  4041     n2 := n1 negated.
       
  4042 
       
  4043     self assert:((n1 * 2) printString = '131070').
       
  4044     self assert:((n1 perform:'*' asSymbol with:2) printString = '131070').
       
  4045     self assert:((n2 * 2) printString = '-131070').
       
  4046     self assert:((n2 perform:'*' asSymbol with:2) printString = '-131070').
       
  4047 
       
  4048     n1 := 16rFFFFFF.
       
  4049     n2 := n1 negated.
       
  4050 
       
  4051     self assert:((n1 * 2) printString = '33554430').
       
  4052     self assert:((n1 perform:'*' asSymbol with:2) printString = '33554430').
       
  4053     self assert:((n2 * 2) printString = '-33554430').
       
  4054     self assert:((n2 perform:'*' asSymbol with:2) printString = '-33554430').
       
  4055 
       
  4056     n1 := 16r3FFFFFFF.
       
  4057     n2 := n1 negated.
       
  4058 
       
  4059     self assert:((n1 * 2) printString = '2147483646').
       
  4060     self assert:((n1 perform:'*' asSymbol with:2) printString = '2147483646').
       
  4061     self assert:((n2 * 2) printString = '-2147483646').
       
  4062     self assert:((n2 perform:'*' asSymbol with:2) printString = '-2147483646').
       
  4063 
       
  4064     SmallInteger maxBytes == 4 ifTrue:[
       
  4065         n1 := 16r3FFFFFFF.
       
  4066     ] ifFalse:[
       
  4067         n1 := 16r3FFFFFFFFFFFFFFF.
       
  4068     ].
       
  4069     self assert:(n1 class == SmallInteger).
       
  4070     self assert:((n1 * 2) class == LargeInteger).
       
  4071     self assert:((n1 perform:'*' asSymbol with:2) class == LargeInteger).
       
  4072 
       
  4073     n1 := SmallInteger maxVal // 11.
       
  4074     self assert:((n1 * 11) class == SmallInteger).
       
  4075 
       
  4076     n1 := n1 + 1.
       
  4077     self assert:((n1 * 11) class == LargeInteger).
       
  4078 
       
  4079     "
       
  4080      self basicNew testSmallIntegerMultiplication3
       
  4081     "
       
  4082 
       
  4083     "Modified: / 9.6.1999 / 17:47:56 / cg"
       
  4084     "Created: / 9.6.1999 / 17:49:45 / cg"
       
  4085 !
       
  4086 
       
  4087 testSmallIntegerNegation
       
  4088     "tests boundary conditions at small/large phase change."
       
  4089 
       
  4090     |n1 n2 n3|
       
  4091 
       
  4092     n1 := 16r3fffffff.
       
  4093     n2 := n1 negated.
       
  4094     n3 := n2 negated.
       
  4095 
       
  4096     self assert:(n1 class == SmallInteger).
       
  4097     self assert:(n2 class == SmallInteger).
       
  4098     self assert:(n3 == n1).
       
  4099 
       
  4100     self assert:(n1 = 16r3FFFFFFF).
       
  4101     self assert:(n2 = 16r-3FFFFFFF).
       
  4102     self assert:(n1 == 16r3FFFFFFF).
       
  4103     self assert:(n2 == 16r-3FFFFFFF).
       
  4104     self assert:(n1 printString = '1073741823').
       
  4105     self assert:(n2 printString = '-1073741823').
       
  4106 
       
  4107     "/ ---------------------
       
  4108 
       
  4109     n1 := 16rffffffff.
       
  4110     n2 := n1 negated.
       
  4111     n3 := n2 negated.
       
  4112 
       
  4113     SmallInteger maxBytes == 8 ifTrue:[
       
  4114         self assert:(n1 class == SmallInteger).
       
  4115         self assert:(n2 class == SmallInteger).
       
  4116         self assert:(n3 == n1).
       
  4117         self assert:(n2 == 16r-fFFFFFFF).
       
  4118         self assert:(n1 == 16rfFFFFFFF).
       
  4119     ] ifFalse:[
       
  4120         self assert:(n1 class == LargeInteger).
       
  4121         self assert:(n2 class == LargeInteger).
       
  4122         self assert:(n3 = n1).
       
  4123     ].
       
  4124     self assert:(n1 = 16rfFFFFFFF).
       
  4125     self assert:(n2 = 16r-fFFFFFFF).
       
  4126     self assert:(n1 printString = '4294967295').
       
  4127     self assert:(n2 printString = '-4294967295').
       
  4128 
       
  4129     "/ ---------------------
       
  4130 
       
  4131     n1 := SmallInteger maxVal.
       
  4132     n2 := n1 negated.
       
  4133     n3 := n2 negated.
       
  4134 
       
  4135     self assert:(n1 class == SmallInteger).
       
  4136     self assert:(n2 class == SmallInteger).
       
  4137     self assert:(n3 == n1).
       
  4138 
       
  4139     SmallInteger maxBytes == 4 ifTrue:[
       
  4140         self assert:(n1 = 16r3FFFFFFF).
       
  4141         self assert:(n2 = 16r-3FFFFFFF).
       
  4142         self assert:(n1 == 16r3FFFFFFF).
       
  4143         self assert:(n2 == 16r-3FFFFFFF).
       
  4144         self assert:(n1 printString = '1073741823').
       
  4145         self assert:(n2 printString = '-1073741823').
       
  4146     ] ifFalse:[
       
  4147         self assert:(n1 printString = '4611686018427387903').
       
  4148         self assert:(n2 printString = '-4611686018427387903').
       
  4149         self assert:(n1 =   16r3FFFFFFFFFFFFFFF).
       
  4150         self assert:(n2 =  16r-3FFFFFFFFFFFFFFF).
       
  4151         self assert:(n1 ==  16r3FFFFFFFFFFFFFFF).
       
  4152         self assert:(n2 == 16r-3FFFFFFFFFFFFFFF).
       
  4153     ].
       
  4154 
       
  4155     "
       
  4156      self basicNew testSmallIntegerNegation
       
  4157     "
       
  4158 
       
  4159     "Modified: / 10-10-2016 / 23:31:11 / cg"
       
  4160     "Modified (format): / 19-09-2017 / 16:28:22 / stefan"
       
  4161 ! !
       
  4162 
       
  4163 !IntegerTest methodsFor:'tests-bit fiddling'!
       
  4164 
       
  4165 testAnyBit
       
  4166     self assert:(0 anyBitOfMagnitudeFrom:1 to:1) not.
       
  4167     self assert:(1 anyBitOfMagnitudeFrom:1 to:1).
       
  4168     self assert:(1 anyBitOfMagnitudeFrom:2 to:2) not.
       
  4169     self assert:(1 anyBitOfMagnitudeFrom:1 to:10).
       
  4170     self assert:(1 anyBitOfMagnitudeFrom:2 to:10) not.
       
  4171 
       
  4172     self assert:(128 anyBitOfMagnitudeFrom:1 to:7) not.
       
  4173     self assert:(128 anyBitOfMagnitudeFrom:1 to:8).
       
  4174     self assert:(128 anyBitOfMagnitudeFrom:8 to:16).
       
  4175     self assert:(128 anyBitOfMagnitudeFrom:1 to:24).
       
  4176 
       
  4177     self assert:(256 anyBitOfMagnitudeFrom:1 to:7) not.
       
  4178     self assert:(256 anyBitOfMagnitudeFrom:1 to:8) not.
       
  4179     self assert:(256 anyBitOfMagnitudeFrom:9 to:9).
       
  4180     self assert:(256 anyBitOfMagnitudeFrom:4 to:9).
       
  4181     self assert:(256 anyBitOfMagnitudeFrom:9 to:25).
       
  4182     self assert:(256 anyBitOfMagnitudeFrom:8 to:16).
       
  4183     self assert:(256 anyBitOfMagnitudeFrom:1 to:24).
       
  4184 
       
  4185     "Created: / 27-05-2019 / 08:39:19 / Claus Gittinger"
       
  4186 !
       
  4187 
       
  4188 testBitCount
       
  4189      #( 16r100000000
       
  4190         16r1000000000 
       
  4191         16r100000000000
       
  4192         16r10000000000000
       
  4193         16r1000000000000000
       
  4194         16r100000000000000000 
       
  4195         16r10000000000000000000
       
  4196         16r1000000000000000000000
       
  4197         16r100000000000000000000000
       
  4198         16r10000000000000000000000000 
       
  4199         16r1000000000000000000000000000 
       
  4200         16r100000000000000000000000000000 
       
  4201         16r10000000000000000000000000000000 
       
  4202         16r1000000000000000000000000000000000
       
  4203      ) do:[:n |
       
  4204          self assert:(n bitCount == 1)
       
  4205     ].
       
  4206      #( 16rA0A0A0A0A
       
  4207         16rA0A0A0A0A0 
       
  4208         16rA0A0A0A0A0A0
       
  4209         16rA0A0A0A0A0A0A0
       
  4210         16rA0A0A0A0A0A0A0A0
       
  4211         16rA0A0A0A0A0A0A0A0A0 
       
  4212         16rA0A0A0A0A0A0A0A0A0A0
       
  4213         16rA0A0A0A0A0A0A0A0A0A0A0
       
  4214         16rA0A0A0A0A0A0A0A0A0A0A0A0
       
  4215         16rA0A0A0A0A0A0A0A0A0A0A0A0A0 
       
  4216         16rA0A0A0A0A0A0A0A0A0A0A0A0A0A0 
       
  4217         16rA0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 
       
  4218         16rA0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 
       
  4219         16rA0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0
       
  4220      ) do:[:n |
       
  4221          self assert:(n bitCount == ((n hexPrintString occurrencesOf:$A)*2))
       
  4222     ].
       
  4223 
       
  4224     "Created: / 20-03-2019 / 12:45:37 / Claus Gittinger"
       
  4225 !
       
  4226 
       
  4227 testBitInterleaving
       
  4228     "check Morton number generation
       
  4229      -> https://en.wikipedia.org/wiki/Morton_number_(number_theory))"
       
  4230      
       
  4231                                                 "/       0 0 1 1                
       
  4232                                                 "/      1 0 1 0                
       
  4233      self assert:(2r0011 bitInterleaveWith:2r1010) == 2r10001101.
       
  4234      self assert:(2r10001101 bitDeinterleave:2) = #(2r0011 2r1010).
       
  4235 
       
  4236                                                 "/                   0  0  1  1                
       
  4237                                                 "/                  1  0  1  0                
       
  4238                                                 "/                 1  1  0  1                
       
  4239      self assert:(2r0011 bitInterleaveWith:2r1010 and:2r1101) == 2r110100011101.
       
  4240      self assert:(2r110100011101 bitDeinterleave:3) = #(2r0011 2r1010 2r1101).
       
  4241 
       
  4242     "Created: / 04-06-2019 / 01:16:09 / Claus Gittinger"
       
  4243 !
       
  4244 
       
  4245 testBitReversed
       
  4246     #( 
       
  4247         2r10000000 2r00000001
       
  4248         2r01000000 2r00000010
       
  4249         2r00100000 2r00000100
       
  4250         2r00010000 2r00001000
       
  4251         2r00001000 2r00010000
       
  4252         2r00000100 2r00100000
       
  4253         2r00000010 2r01000000
       
  4254         2r00000001 2r10000000
       
  4255 
       
  4256         "/ high bits are to be ignored (i.e. clear) 
       
  4257         2r100000001 2r10000000
       
  4258         2r110000000 2r00000001
       
  4259     )
       
  4260     pairWiseDo:[:in :expected |
       
  4261         self assert:(in bitReversed8 == expected)
       
  4262     ].
       
  4263 
       
  4264     #( 
       
  4265         2r1000000000000000 2r0000000000000001
       
  4266         2r0100000000000000 2r0000000000000010
       
  4267         2r0010000000000000 2r0000000000000100
       
  4268         2r0001000000000000 2r0000000000001000
       
  4269         2r0000100000000000 2r0000000000010000
       
  4270         2r0000010000000000 2r0000000000100000
       
  4271         2r0000001000000000 2r0000000001000000
       
  4272         2r0000000100000000 2r0000000010000000
       
  4273 
       
  4274         2r0000000010000000 2r0000000100000000
       
  4275         2r0000000001000000 2r0000001000000000
       
  4276         2r0000000000100000 2r0000010000000000
       
  4277         2r0000000000010000 2r0000100000000000
       
  4278         2r0000000000001000 2r0001000000000000
       
  4279         2r0000000000000100 2r0010000000000000
       
  4280         2r0000000000000010 2r0100000000000000
       
  4281         2r0000000000000001 2r1000000000000000
       
  4282 
       
  4283         "/ high bits are to be ignored (i.e. clear) 
       
  4284         2r10000000000000001 2r1000000000000000
       
  4285         2r11000000000000000 2r0000000000000001
       
  4286     )
       
  4287     pairWiseDo:[:in :expected |
       
  4288         self assert:(in bitReversed16 == expected)
       
  4289     ].
       
  4290 
       
  4291     0 to:64 do:[:n |
       
  4292         |nr|
       
  4293         
       
  4294         nr := 1 bitShift:n.
       
  4295         n < 16 ifTrue:[
       
  4296             self assert:((nr bitReversed16) bitReversed16) = nr.
       
  4297         ].    
       
  4298         n < 32 ifTrue:[
       
  4299             self assert:((nr bitReversed32) bitReversed32) = nr.
       
  4300         ].    
       
  4301         n < 64 ifTrue:[
       
  4302             self assert:((nr bitReversed64) bitReversed64) = nr.
       
  4303         ].    
       
  4304     ].
       
  4305     
       
  4306     #(
       
  4307       16r12345678 
       
  4308       16r23456781 
       
  4309       16r34567812 
       
  4310       16r45678123 
       
  4311       16r56781234 
       
  4312       16r67812345 
       
  4313       16r78123456 
       
  4314       16r81234567 
       
  4315     ) do:[:each |
       
  4316         |s1 s2 s1Padded s2Padded|
       
  4317 
       
  4318         s1 := each printStringRadix:2.
       
  4319         s2 := each bitReversed32 printStringRadix:2.
       
  4320         s1Padded := s1 leftPaddedTo:32 with:$0.
       
  4321         s2Padded := s2 leftPaddedTo:32 with:$0.
       
  4322         self assert:(s1Padded = s2Padded reversed).
       
  4323     ].
       
  4324 
       
  4325     #(
       
  4326       16r0123456789ABCDEF 
       
  4327       16r123456789ABCDEF0 
       
  4328       16r23456789ABCDEF01 
       
  4329       16r3456789ABCDEF012 
       
  4330       16r456789ABCDEF0123 
       
  4331       16r56789ABCDEF01234 
       
  4332       16r6789ABCDEF012345 
       
  4333       16r789ABCDEF0123456 
       
  4334       16r89ABCDEF01234567 
       
  4335     ) do:[:each |
       
  4336         |s1 s2 s1Padded s2Padded|
       
  4337 
       
  4338         s1 := each printStringRadix:2.
       
  4339         s2 := each bitReversed64 printStringRadix:2.
       
  4340         s1Padded := s1 leftPaddedTo:64 with:$0.
       
  4341         s2Padded := s2 leftPaddedTo:64 with:$0.
       
  4342         self assert:(s1Padded = s2Padded reversed).
       
  4343     ].
       
  4344 
       
  4345     "Created: / 24-03-2019 / 11:36:18 / Claus Gittinger"
       
  4346     "Modified: / 27-03-2019 / 15:16:43 / stefan"
       
  4347     "Modified: / 28-03-2019 / 16:59:52 / Claus Gittinger"
       
  4348 !
       
  4349 
       
  4350 testBitShift
       
  4351     self assert:(1 bitShift:1) = 2.
       
  4352     self assert:(-1 bitShift:1) = -2.
       
  4353 
       
  4354     self assert:(1 bitShift:7) = 128.
       
  4355     self assert:(-1 bitShift:7) = -128.
       
  4356 
       
  4357     self assert:(1 bitShift:8) = 16r100.
       
  4358     self assert:(-1 bitShift:8) = 16r-100.
       
  4359 
       
  4360     self assert:(1 bitShift:16) = 16r10000.
       
  4361     self assert:(-1 bitShift:16) = 16r-10000.
       
  4362 
       
  4363     self assert:(1 bitShift:24) = 16r1000000.
       
  4364     self assert:(-1 bitShift:24) = 16r-1000000.
       
  4365 
       
  4366     "/ the following are out of the smallInteger range on 32bit systems
       
  4367     self assert:(1 bitShift:30) = 16r40000000.
       
  4368     self assert:(-1 bitShift:30) = 16r-40000000.
       
  4369 
       
  4370     self assert:(1 bitShift:31) = 16r80000000.
       
  4371     self assert:(-1 bitShift:31) = 16r-80000000.
       
  4372 
       
  4373     self assert:(1 bitShift:32) = 16r100000000.
       
  4374     self assert:(-1 bitShift:32) = 16r-100000000.
       
  4375 
       
  4376     self assert:(1 bitShift:40) = 16r10000000000.
       
  4377     self assert:(-1 bitShift:40) = 16r-10000000000.
       
  4378 
       
  4379     self assert:(1 bitShift:56) = 16r100000000000000.
       
  4380     self assert:(-1 bitShift:56) = 16r-100000000000000.
       
  4381 
       
  4382     "/ the following are out of the smallInteger range on 32bit systems
       
  4383     self assert:(1 bitShift:62) = 16r4000000000000000.
       
  4384     self assert:(-1 bitShift:62) = 16r-4000000000000000.
       
  4385 
       
  4386     self assert:(1 bitShift:63) = 16r8000000000000000.
       
  4387     self assert:(-1 bitShift:63) = 16r-8000000000000000.
       
  4388 
       
  4389     self assert:(1 bitShift:64) = 16r10000000000000000.
       
  4390     self assert:(-1 bitShift:64) = 16r-10000000000000000.
       
  4391 
       
  4392     "Created: / 04-06-2019 / 00:58:47 / Claus Gittinger"
       
  4393 !
       
  4394 
       
  4395 testByteSwap
       
  4396     "/ <testedMethods: #( (Integer >> #byteSwapped32) (Integer >> #byteSwapped64)) >
       
  4397 
       
  4398     self assert:(16r1122 byteSwapped16) = 16r2211.
       
  4399     self assert:(16r2211 byteSwapped16) = 16r1122.
       
  4400 
       
  4401     self assert:(16r11223344 byteSwapped32) = 16r44332211.
       
  4402     self assert:(16r44332211 byteSwapped32) = 16r11223344.
       
  4403 
       
  4404     self assert:(16r11223344 byteSwapped64) = 16r4433221100000000.
       
  4405     self assert:(16r44332211 byteSwapped64) = 16r1122334400000000.
       
  4406 
       
  4407     self assert:(16r8877665544332211 byteSwapped64) = 16r1122334455667788.
       
  4408     self assert:(16r1122334455667788 byteSwapped64) = 16r8877665544332211.
       
  4409 
       
  4410     "/ higher bits are ignored!!
       
  4411     self assert:(16r33441122 byteSwapped16) = 16r2211.
       
  4412 
       
  4413     self assert:(16r9911223344 byteSwapped32) = 16r44332211.
       
  4414     self assert:(16r8877665544332211 byteSwapped32) = 16r11223344.
       
  4415     self assert:(16r998877665544332211 byteSwapped64) = 16r1122334455667788.
       
  4416     self assert:(16r991122334455667788 byteSwapped64) = 16r8877665544332211.
       
  4417 
       
  4418     "
       
  4419      self basicNew testByteSwap
       
  4420     "
  1517 !
  4421 !
  1518 
  4422 
  1519 testHighBitLowBit
  4423 testHighBitLowBit
  1520     self assert:( 2r0 highBit == 0).
  4424     self assert:( 2r0 highBit == 0).
  1521     self assert:( 2r1 highBit == 1).
  4425     self assert:( 2r1 highBit == 1).
  1619     "
  4523     "
  1620 
  4524 
  1621     "Modified: / 05-07-2017 / 16:00:51 / cg"
  4525     "Modified: / 05-07-2017 / 16:00:51 / cg"
  1622 !
  4526 !
  1623 
  4527 
  1624 testILC
       
  1625     "inline-cache"
       
  1626 
       
  1627     self assert:((self checkIsInteger:1) == true).
       
  1628     self assert:((self checkIsInteger:nil) == false).
       
  1629     self assert:((self checkIsInteger:1) == true).
       
  1630     self assert:((self checkIsInteger:nil) == false).
       
  1631 
       
  1632     self assert:((self checkIsInteger:0) == true).
       
  1633     self assert:((self checkIsInteger:nil) == false).
       
  1634     self assert:((self checkIsInteger:0) == true).
       
  1635     self assert:((self checkIsInteger:nil) == false).
       
  1636 
       
  1637     "
       
  1638      self basicNew testILC
       
  1639     "
       
  1640 
       
  1641     "Created: / 6.6.1999 / 14:47:51 / cg"
       
  1642     "Modified: / 9.6.1999 / 17:49:57 / cg"
       
  1643 !
       
  1644 
       
  1645 testInline1
       
  1646     "inlined tests.
       
  1647      Notice, the arithmetic tests are both performed via regular sends
       
  1648      and via constructed performs. The reason is to test both inlined
       
  1649      JIT-compiler code AND the regular methods code."
       
  1650 
       
  1651     self assert:( (self absPlusOneOf:1) = 2 ).
       
  1652     self assert:( (self absPlusOneOf:-1) = 2 ).
       
  1653     self assert:( (self absPlusOneOf:1.0) = 2 ).
       
  1654     self assert:( (self absPlusOneOf:-1.0) = 2 ).
       
  1655 
       
  1656     "
       
  1657      self basicNew testInline1
       
  1658     "
       
  1659 
       
  1660     "Created: / 31.10.2000 / 20:22:48 / cg"
       
  1661     "Modified: / 31.10.2000 / 20:23:06 / cg"
       
  1662 !
       
  1663 
       
  1664 testInteger1
       
  1665     "general conversion & arithmetic tests.
       
  1666      Notice, the arithmetic tests are both performed via regular sends
       
  1667      and via constructed performs. The reason is to test both inlined
       
  1668      JIT-compiler code AND the regular method's code."
       
  1669 
       
  1670     |minVal maxVal maxValPlus1 minValMinus1 halfMin halfMax t|
       
  1671 
       
  1672     minVal := SmallInteger perform:('minVal' asSymbol).
       
  1673     maxVal := SmallInteger perform:('maxVal' asSymbol).
       
  1674 
       
  1675     self assert:(minVal class == SmallInteger).
       
  1676     self assert:(maxVal class == SmallInteger).
       
  1677 
       
  1678     self assert:(minVal == self num_smallInt_minVal).
       
  1679     self assert:(maxVal == self num_smallInt_maxVal).
       
  1680 
       
  1681     self assert:(minVal == SmallInteger minVal).
       
  1682     self assert:(maxVal == SmallInteger maxVal).
       
  1683 
       
  1684     t := SmallInteger perform:('maxBytes' asSymbol).
       
  1685     self assert:(t == SmallInteger maxBytes).
       
  1686     t := SmallInteger perform:('maxBits' asSymbol).
       
  1687     self assert:(t == SmallInteger maxBits).
       
  1688 
       
  1689     self testPrinting1.
       
  1690 
       
  1691     self assert:(SmallInteger maxBytes == ExternalAddress pointerSize).
       
  1692     "/ again, preventing inlining by compiler
       
  1693     self assert:(SmallInteger perform:#maxBytes) == (ExternalAddress perform:#pointerSize).
       
  1694     self assert:(SmallInteger perform:'maxBytes' asSymbol) == (ExternalAddress perform:'pointerSize' asSymbol).
       
  1695 
       
  1696     SmallInteger maxBytes == 4 ifTrue:[
       
  1697         self assert:(minVal hexPrintString = '-40000000').
       
  1698         self assert:(maxVal hexPrintString = '3FFFFFFF').
       
  1699         self assert:(minVal == -1073741824).
       
  1700         self assert:(maxVal == 1073741823).
       
  1701         maxValPlus1 := 1073741824.
       
  1702         minValMinus1 := -1073741825.
       
  1703         self assert:(minValMinus1 hexPrintString = '-40000001').
       
  1704         self assert:(maxValPlus1 hexPrintString = '40000000').
       
  1705         halfMin := 16r-20000000.
       
  1706         halfMax := 16r20000000.
       
  1707     ].
       
  1708     SmallInteger maxBytes == 8 ifTrue:[
       
  1709         self assert:(minVal hexPrintString = '-4000000000000000').
       
  1710         self assert:(maxVal hexPrintString = '3FFFFFFFFFFFFFFF').
       
  1711         self assert:(minVal == -4611686018427387904).
       
  1712         self assert:(maxVal == 4611686018427387903).
       
  1713         maxValPlus1 := 4611686018427387904.
       
  1714         minValMinus1 := -4611686018427387905.
       
  1715         self assert:(minValMinus1 hexPrintString = '-4000000000000001').
       
  1716         self assert:(maxValPlus1 hexPrintString = '4000000000000000').
       
  1717         halfMin := 16r-2000000000000000.
       
  1718         halfMax := 16r2000000000000000.
       
  1719     ].
       
  1720     
       
  1721     self assert:(minValMinus1 class == LargeInteger).
       
  1722     self assert:(maxValPlus1 class == LargeInteger).
       
  1723 
       
  1724     "arithmetic overFlow checks"
       
  1725 
       
  1726 "/    self assert:((maxVal + 1) inspect.maxValPlus1 inspect. true).
       
  1727     self assert:((maxVal perform:'+' asSymbol with:1) = maxValPlus1).
       
  1728     self assert:((maxVal + 1) = maxValPlus1).
       
  1729     self assert:((minVal perform:'-' asSymbol with:1) = minValMinus1).
       
  1730     self assert:((minVal - 1) = minValMinus1).
       
  1731 
       
  1732     self assert:((halfMax perform:'+' asSymbol with:halfMax) = maxValPlus1).
       
  1733     self assert:((halfMax + halfMax) = maxValPlus1).
       
  1734     self assert:((halfMin perform:'+' asSymbol with:halfMin) == minVal).
       
  1735     self assert:((halfMin + halfMin) == minVal).
       
  1736     self assert:((halfMax perform:'*' asSymbol with:2) = maxValPlus1).
       
  1737     self assert:((halfMax * 2) = maxValPlus1).
       
  1738     self assert:((halfMin perform:'*' asSymbol with:2) == minVal).
       
  1739     self assert:((halfMin * 2) == minVal).
       
  1740     self assert:((maxValPlus1 perform:'//' asSymbol with:2) == halfMax).
       
  1741     self assert:((maxValPlus1 // 2) == halfMax).
       
  1742     self assert:((halfMax perform:'bitShift:' asSymbol with:1) = maxValPlus1).
       
  1743     self assert:((halfMin perform:'bitShift:' asSymbol with:1) == minVal).
       
  1744     self assert:((halfMax bitShift:1) = maxValPlus1).
       
  1745     self assert:((halfMin bitShift:1) == minVal).
       
  1746 
       
  1747     "LargeInt op -> SmallInt result"
       
  1748     t := maxVal + 1.
       
  1749     self assert:(t - 1 == maxVal).
       
  1750     t := minVal - 1.
       
  1751     self assert:(t + 1 == minVal).
       
  1752 
       
  1753     "
       
  1754      self basicNew testInteger1
       
  1755     "
       
  1756 
       
  1757     "Modified: / 19-09-2017 / 16:27:24 / stefan"
       
  1758     "Modified: / 10-10-2017 / 12:13:02 / cg"
       
  1759 !
       
  1760 
       
  1761 testIntegerMisc
       
  1762     "misc tests.
       
  1763      Notice, the arithmetic tests are both performed via regular sends
       
  1764      and via constructed performs. The reason is to test both inlined
       
  1765      JIT-compiler code AND the regular methods code."
       
  1766 
       
  1767     |n1 n2 s|
       
  1768 
       
  1769     n1 := 100000.
       
  1770     n2 := n1 negated.
       
  1771     s := 1.
       
  1772 
       
  1773     self assert:(n1 printString = '100000').
       
  1774 
       
  1775     self assert:(n1 negated printString = '-100000').
       
  1776     self assert:((n1 perform:'negated' asSymbol) printString = '-100000').
       
  1777 
       
  1778     self assert:(n1 negated abs printString = '100000').
       
  1779     self assert:((n1 perform:'negated' asSymbol) abs printString = '100000').
       
  1780 
       
  1781     self assert:(n1 abs negated printString = '-100000').
       
  1782     self assert:((n1 perform:'abs' asSymbol) negated printString = '-100000').
       
  1783 
       
  1784     n1 := SmallInteger maxVal.
       
  1785     self assert:(n1 negated class == SmallInteger).
       
  1786     self assert:((n1 perform:'negated' asSymbol) class == SmallInteger).
       
  1787 
       
  1788     n1 := SmallInteger minVal.
       
  1789     self assert:(n1 class == SmallInteger).
       
  1790     "/ Transcript showCR:n1 printString.
       
  1791     "/ Transcript showCR:n1 negated printString.
       
  1792     "/ Transcript showCR:n1 negated class printString.
       
  1793     self assert:(n1 negated class == LargeInteger).
       
  1794     self assert:((n1 perform:'negated' asSymbol) class == LargeInteger).
       
  1795 
       
  1796     n1 := SmallInteger maxVal.
       
  1797     self assert:(n1 negated negated class == SmallInteger).
       
  1798     self assert:(((n1 perform:'negated' asSymbol) perform:'negated' asSymbol) class == SmallInteger).
       
  1799 
       
  1800     n1 := SmallInteger minVal.
       
  1801     self assert:(n1 negated negated class == SmallInteger).
       
  1802     self assert:(((n1 perform:'negated' asSymbol) perform:'negated' asSymbol) class == SmallInteger).
       
  1803 
       
  1804     n1 := SmallInteger minVal negated - 1.
       
  1805     self assert:(n1 negated class == SmallInteger).
       
  1806     self assert:((n1 perform:'negated' asSymbol) class == SmallInteger).
       
  1807     self assert:(n1 == SmallInteger maxVal).
       
  1808 
       
  1809     "
       
  1810      self basicNew testIntegerMisc
       
  1811     "
       
  1812 
       
  1813     "Created: / 6.6.1999 / 14:47:51 / cg"
       
  1814     "Modified: / 9.6.1999 / 17:49:57 / cg"
       
  1815 !
       
  1816 
       
  1817 testIntegerMisc2
       
  1818     "misc tests.
       
  1819      Notice, the arithmetic tests are both performed via regular sends
       
  1820      and via constructed performs. The reason is to test both inlined
       
  1821      JIT-compiler code AND the regular methods code."
       
  1822 
       
  1823     |n sel|
       
  1824 
       
  1825     "/ fib is optional
       
  1826     (0 respondsTo:#fib) ifFalse:[^ self].
       
  1827 
       
  1828     self assert:(0 fib == 0).
       
  1829     self assert:(1 fib == 1).
       
  1830     self assert:(2 fib == 1).
       
  1831     self assert:(3 fib == 2).
       
  1832     self assert:(4 fib == 3).
       
  1833     self assert:(5 fib == 5).
       
  1834     self assert:(6 fib == 8).
       
  1835     self assert:(7 fib == 13).
       
  1836 
       
  1837     n := 0.
       
  1838     self assert:(n fib == 0).
       
  1839     n := 1.
       
  1840     self assert:(n fib == 1).
       
  1841     n := 2.
       
  1842     self assert:(n fib == 1).
       
  1843     n := 3.
       
  1844     self assert:(n fib == 2).
       
  1845     n := 4.
       
  1846     self assert:(n fib == 3).
       
  1847     n := 5.
       
  1848     self assert:(n fib == 5).
       
  1849     n := 6.
       
  1850     self assert:(n fib == 8).
       
  1851     n := 7.
       
  1852     self assert:(n fib == 13).
       
  1853 
       
  1854     #(0 1 2 3 4 5 6 7)
       
  1855     with:#(0 1 1 2 3 5 8 13)
       
  1856     do:[:n :rslt |
       
  1857 	self assert:(n fib == rslt).
       
  1858     ].
       
  1859 
       
  1860 "/    #(0 1 2 3 4 5 6 7)
       
  1861 "/    with:#(0 1 1 2 3 5 8 13)
       
  1862 "/    do:[:n :rslt |
       
  1863 "/        self assert:(n fib_recursive == rslt).
       
  1864 "/    ].
       
  1865 
       
  1866     sel := #fib.
       
  1867     self assert:((0 perform:sel) == 0).
       
  1868     self assert:((1 perform:sel) == 1).
       
  1869     self assert:((2 perform:sel) == 1).
       
  1870     self assert:((3 perform:sel) == 2).
       
  1871     self assert:((4 perform:sel) == 3).
       
  1872     self assert:((5 perform:sel) == 5).
       
  1873     self assert:((6 perform:sel) == 8).
       
  1874     self assert:((7 perform:sel) == 13).
       
  1875 
       
  1876     "
       
  1877      self basicNew testIntegerMisc2
       
  1878     "
       
  1879 !
       
  1880 
       
  1881 testIntegerShifts
  4528 testIntegerShifts
  1882     "arithmetic tests.
  4529     "arithmetic tests.
  1883      Notice, the arithmetic tests are both performed via regular sends
  4530      Notice, the arithmetic tests are both performed via regular sends
  1884      and via constructed performs. The reason is to test both inlined
  4531      and via constructed performs. The reason is to test both inlined
  1885      JIT-compiler code AND the regular methods code."
  4532      JIT-compiler code AND the regular methods code."
  2108     "
  4755     "
  2109      self basicNew testIntegerShifts4
  4756      self basicNew testIntegerShifts4
  2110     "
  4757     "
  2111 !
  4758 !
  2112 
  4759 
  2113 testIsPowerOfTwo
       
  2114     self assert:(1 isPowerOfTwo).
       
  2115     self assert:(2 isPowerOfTwo).
       
  2116     self assert:(4 isPowerOfTwo).
       
  2117     self assert:(3 isPowerOfTwo not).
       
  2118     self assert:(16r100000000000000000000000 isPowerOfTwo).
       
  2119     self assert:(16r300000000000000000000000 isPowerOfTwo not).
       
  2120 
       
  2121     "
       
  2122      self basicNew testIsPowerOfTwo
       
  2123     "
       
  2124 
       
  2125     "Created: / 27-04-2010 / 10:35:36 / cg"
       
  2126 !
       
  2127 
       
  2128 testLargeAddition
       
  2129     "general conversion & arithmetic tests.
       
  2130      Notice, the arithmetic tests are both performed via regular sends
       
  2131      and via constructed performs. The reason is to test both inlined
       
  2132      JIT-compiler code AND the regular methods code."
       
  2133 
       
  2134     "Large + Large addition"
       
  2135     self testReading1.
       
  2136 
       
  2137     self assert:(20 factorial = 2432902008176640000).
       
  2138     self assert:(20 factorial printString = '2432902008176640000').
       
  2139     self assert:((20 factorial + 20 factorial) printString = '4865804016353280000').
       
  2140     self assert:((20 factorial + 1) printString = '2432902008176640001').
       
  2141     self assert:((20 factorial + 1000) printString = '2432902008176641000').
       
  2142 
       
  2143     "Large + Small addition"
       
  2144 
       
  2145     self testLargeAddition1.
       
  2146 
       
  2147     "Large + Large addition"
       
  2148 
       
  2149     self testLargeAddition2.
       
  2150 
       
  2151     "Large - small subtraction"
       
  2152 
       
  2153     self testLargeAddition3.
       
  2154 
       
  2155     "
       
  2156      self basicNew testLargeAddition
       
  2157     "
       
  2158 
       
  2159     "Modified: / 26-02-2016 / 15:39:33 / cg"
       
  2160 !
       
  2161 
       
  2162 testLargeAddition1
       
  2163     "general conversion & arithmetic tests.
       
  2164      Notice, the arithmetic tests are both performed via regular sends
       
  2165      and via constructed performs. The reason is to test both inlined
       
  2166      JIT-compiler code AND the regular methods code."
       
  2167 
       
  2168     |n1 n2|
       
  2169 
       
  2170     "Large + Small addition"
       
  2171 
       
  2172     n1 := 16r3FFFFFFF. n2 := 1.
       
  2173     self assert:((n1 + n2 ) hexPrintString = '40000000').
       
  2174     self assert:((n1 perform:'+' asSymbol with:n2 ) hexPrintString = '40000000').
       
  2175     n1 := 16r3FFFFFFFF. n2 := 1.
       
  2176     self assert:((n1 + n2 ) hexPrintString = '400000000').
       
  2177     self assert:((n1 perform:'+' asSymbol with:n2 ) hexPrintString = '400000000').
       
  2178     n1 := 16r3FFFFFFFFF. n2 := 1.
       
  2179     self assert:((n1 + n2 ) hexPrintString = '4000000000').
       
  2180     self assert:((n1 perform:'+' asSymbol with:n2 ) hexPrintString = '4000000000').
       
  2181     n1 := 16r3FFFFFFFFFF. n2 := 1.
       
  2182     self assert:((n1 + n2 ) hexPrintString = '40000000000').
       
  2183     self assert:((n1 perform:'+' asSymbol with:n2 ) hexPrintString = '40000000000').
       
  2184     n1 := 16r3FFFFFFFFFFF. n2 := 1.
       
  2185     self assert:((n1 + n2 ) hexPrintString = '400000000000').
       
  2186     self assert:((n1 perform:'+' asSymbol with:n2 ) hexPrintString = '400000000000').
       
  2187     n1 := 16r3FFFFFFFFFFFF. n2 := 1.
       
  2188     self assert:((n1 + n2 ) hexPrintString = '4000000000000').
       
  2189     self assert:((n1 perform:'+' asSymbol with:n2 ) hexPrintString = '4000000000000').
       
  2190     n1 := 16r3FFFFFFFFFFFFF. n2 := 1.
       
  2191     self assert:((n1 + n2 ) hexPrintString = '40000000000000').
       
  2192     self assert:((n1 perform:'+' asSymbol with:n2 ) hexPrintString = '40000000000000').
       
  2193     n1 := 16r3FFFFFFFFFFFFFF. n2 := 1.
       
  2194     self assert:((n1 + n2 ) hexPrintString = '400000000000000').
       
  2195     self assert:((n1 perform:'+' asSymbol with:n2 ) hexPrintString = '400000000000000').
       
  2196     n1 := 16r3FFFFFFFFFFFFFFF. n2 := 1.
       
  2197     self assert:((n1 + n2 ) hexPrintString = '4000000000000000').
       
  2198     self assert:((n1 perform:'+' asSymbol with:n2 ) hexPrintString = '4000000000000000').
       
  2199 
       
  2200     "
       
  2201      self basicNew testLargeAddition1
       
  2202     "
       
  2203 
       
  2204     "Modified: / 4.6.1999 / 15:26:55 / cg"
       
  2205 !
       
  2206 
       
  2207 testLargeAddition2
       
  2208     "general conversion & arithmetic tests.
       
  2209      Notice, the arithmetic tests are both performed via regular sends
       
  2210      and via constructed performs. The reason is to test both inlined
       
  2211      JIT-compiler code AND the regular methods code."
       
  2212 
       
  2213     |n1 n2 x|
       
  2214 
       
  2215     "Large + Large addition"
       
  2216 
       
  2217     n1 := 16r100000000. n2 := 16r7FFFFFFF.
       
  2218     self assert:((n1 - n2 ) hexPrintString = '80000001').
       
  2219     self assert:((16r100000000 - n2 ) hexPrintString = '80000001').
       
  2220     self assert:((n1 - 16r7FFFFFFF ) hexPrintString = '80000001').
       
  2221     self assert:((16r100000000 - 16r7FFFFFFF ) hexPrintString = '80000001').
       
  2222     self assert:((n1 perform:'-' asSymbol with:n2 ) hexPrintString = '80000001').
       
  2223     self assert:((16r100000000 perform:'-' asSymbol with:n2 ) hexPrintString = '80000001').
       
  2224     self assert:((n1 perform:'-' asSymbol with:16r7FFFFFFF ) hexPrintString = '80000001').
       
  2225     self assert:((16r100000000 perform:'-' asSymbol with:16r7FFFFFFF ) hexPrintString = '80000001').
       
  2226 
       
  2227     n1 := 16r100000000. n2 := 16r80000000.
       
  2228     self assert:((n1 - n2 ) hexPrintString = '80000000').
       
  2229     self assert:((16r100000000 - n2 ) hexPrintString = '80000000').
       
  2230     self assert:((n1 - 16r80000000 ) hexPrintString = '80000000').
       
  2231     self assert:((16r100000000 - 16r80000000 ) hexPrintString = '80000000').
       
  2232     self assert:((n1 perform:'-' asSymbol with:n2 ) hexPrintString = '80000000').
       
  2233     self assert:((16r100000000 perform:'-' asSymbol with:n2 ) hexPrintString = '80000000').
       
  2234     self assert:((n1 perform:'-' asSymbol with:16r80000000 ) hexPrintString = '80000000').
       
  2235     self assert:((16r100000000 perform:'-' asSymbol with:16r80000000 ) hexPrintString = '80000000').
       
  2236 
       
  2237     n1 := 16r100000000. n2 := 16rFFFFFFFF.
       
  2238     self assert:((n1 - n2 ) hexPrintString = '1').
       
  2239     self assert:((16r100000000 - n2 ) hexPrintString = '1').
       
  2240     self assert:((x := n1 - 16rFFFFFFFF) == 1).
       
  2241 
       
  2242     self assert:((n1 - 16rFFFFFFFF ) hexPrintString = '1').
       
  2243     self assert:((16r100000000 - 16rFFFFFFFF ) hexPrintString = '1').
       
  2244     self assert:((n1 perform:'-' asSymbol with:n2 ) hexPrintString = '1').
       
  2245     self assert:((16r100000000 perform:'-' asSymbol with:n2 ) hexPrintString = '1').
       
  2246     self assert:((n1 perform:'-' asSymbol with:16rFFFFFFFF ) hexPrintString = '1').
       
  2247     self assert:((16r100000000 perform:'-' asSymbol with:16rFFFFFFFF ) hexPrintString = '1').
       
  2248 
       
  2249     n1 := 16r100000000. n2 := 1.
       
  2250     self assert:((n1 - n2) hexPrintString = 'FFFFFFFF').
       
  2251     self assert:((n1 - n2) hexPrintString = 'FFFFFFFF').
       
  2252     self assert:((16r100000000 - n2) hexPrintString = 'FFFFFFFF').
       
  2253     self assert:((n1 - 1) hexPrintString = 'FFFFFFFF').
       
  2254     self assert:((16r100000000 - 1) hexPrintString = 'FFFFFFFF').
       
  2255     self assert:((n1 perform:'-' asSymbol with:n2) hexPrintString = 'FFFFFFFF').
       
  2256     self assert:((16r100000000 perform:'-' asSymbol with:n2) hexPrintString = 'FFFFFFFF').
       
  2257     self assert:((n1 perform:'-' asSymbol with:1) hexPrintString = 'FFFFFFFF').
       
  2258     self assert:((16r100000000 perform:'-' asSymbol with:1) hexPrintString = 'FFFFFFFF').
       
  2259 
       
  2260     n1 := 16r100000000. n2 := 16r10000000.
       
  2261     self assert:((n1 - n2) hexPrintString = 'F0000000').
       
  2262     self assert:((16r100000000 - n2) hexPrintString = 'F0000000').
       
  2263     self assert:((n1 - 16r10000000) hexPrintString = 'F0000000').
       
  2264     self assert:((16r100000000 - 16r10000000) hexPrintString = 'F0000000').
       
  2265     self assert:((n1 perform:'-' asSymbol with:n2) hexPrintString = 'F0000000').
       
  2266     self assert:((16r100000000 perform:'-' asSymbol with:n2) hexPrintString = 'F0000000').
       
  2267     self assert:((n1 perform:'-' asSymbol with:16r10000000) hexPrintString = 'F0000000').
       
  2268     self assert:((16r100000000 perform:'-' asSymbol with:16r10000000) hexPrintString = 'F0000000').
       
  2269 
       
  2270     "
       
  2271      self basicNew testLargeAddition2
       
  2272     "
       
  2273 !
       
  2274 
       
  2275 testLargeAddition3
       
  2276     "general conversion & arithmetic tests.
       
  2277      Notice, the arithmetic tests are both performed via regular sends
       
  2278      and via constructed performs. The reason is to test both inlined
       
  2279      JIT-compiler code AND the regular methods code."
       
  2280 
       
  2281     |n1 n2|
       
  2282 
       
  2283     "Large - small subtraction"
       
  2284     self assert:((20 factorial + 20 factorial - 1) printString = '4865804016353279999').
       
  2285     self assert:((20 factorial - 10 factorial + 3628800) printString = '2432902008176640000').
       
  2286     self assert:((20 factorial - 11 factorial + 39916800) printString = '2432902008176640000').
       
  2287     self assert:((20 factorial - 12 factorial + 479001600) printString = '2432902008176640000').
       
  2288     self assert:((20 factorial - 13 factorial + 6227020800) printString = '2432902008176640000').
       
  2289     self assert:((20 factorial - 14 factorial + 87178291200) printString = '2432902008176640000').
       
  2290     self assert:((20 factorial - 15 factorial + 1307674368000) printString = '2432902008176640000').
       
  2291     self assert:((20 factorial - 16 factorial + 20922789888000) printString = '2432902008176640000').
       
  2292     self assert:((20 factorial + 10 factorial - 3628800) printString = '2432902008176640000').
       
  2293 
       
  2294     self assert:(1000 factorial printString = '402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000').
       
  2295 
       
  2296     n1 := n2 := 1.
       
  2297     self assert:((1000 factorial + n1 - n2) = 1000 factorial).
       
  2298     n1 := n2 := 1000.
       
  2299     self assert:((1000 factorial + n1 - n2) = 1000 factorial).
       
  2300     n1 := n2 := 16rFFFFFFFF.
       
  2301     self assert:((1000 factorial + n1 - n2) = 1000 factorial).
       
  2302     n1 := n2 := 16rFFFFFFFFFFFF.
       
  2303     self assert:((1000 factorial + n1 - n2) = 1000 factorial).
       
  2304     n1 := n2 := 16rFFFFFFFFFFFFFFFF.
       
  2305     self assert:((1000 factorial + n1 - n2) = 1000 factorial).
       
  2306     n1 := n2 := 1000 factorial.
       
  2307     self assert:((1000 factorial + n1 - n2) = 1000 factorial).
       
  2308 
       
  2309 
       
  2310     "
       
  2311      self basicNew testLargeAddition3
       
  2312     "
       
  2313 
       
  2314     "Modified: / 27.11.1999 / 16:41:54 / cg"
       
  2315 !
       
  2316 
       
  2317 testLargeBitOperations
  4760 testLargeBitOperations
  2318     "large bit operations test."
  4761     "large bit operations test."
  2319 
  4762 
  2320      self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFF) hexPrintString = '2211'.
  4763      self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFF) hexPrintString = '2211'.
  2321      self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFF) hexPrintString  = '332211'.
  4764      self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFF) hexPrintString  = '332211'.
  2393     "
  4836     "
  2394      self basicNew testLargeBitOperations
  4837      self basicNew testLargeBitOperations
  2395     "
  4838     "
  2396 
  4839 
  2397     "Modified: / 26-02-2016 / 19:47:25 / cg"
  4840     "Modified: / 26-02-2016 / 19:47:25 / cg"
  2398 !
       
  2399 
       
  2400 testLargeCompare
       
  2401     "compare tests"
       
  2402 
       
  2403     #(
       
  2404         ( 16r3fffffff 16r40000000 #less )
       
  2405         ( 16r40000000 16r3fffffff #greater )
       
  2406         ( 16r40000000 16r40000000 #equal )
       
  2407 
       
  2408         ( 16r40000000 16r40000001 #less )
       
  2409         ( 16r40000001 16r40000000 #greater )
       
  2410         ( 16r40000001 16r40000001 #equal )
       
  2411         
       
  2412         ( 16r3fffffffffffffff 16r4000000000000000 #less )
       
  2413         ( 16r4000000000000000 16r3fffffffffffffff #greater )
       
  2414         ( 16r4000000000000000 16r4000000000000000 #equal )
       
  2415 
       
  2416         ( 16r4000000000000000 16r4000000000000001 #less )
       
  2417         ( 16r4000000000000001 16r4000000000000000 #greater )
       
  2418         ( 16r4000000000000001 16r4000000000000001 #equal )
       
  2419 
       
  2420         ( 16r3fffffffffffffffffffffff 16r400000000000000000000000 #less )
       
  2421         ( 16r400000000000000000000000 16r3fffffffffffffffffffffff #greater )
       
  2422         ( 16r400000000000000000000000 16r400000000000000000000000 #equal )
       
  2423 
       
  2424         ( 16r400000000000000000000000 16r400000000000000000000001 #less )
       
  2425         ( 16r400000000000000000000001 16r400000000000000000000000 #greater )
       
  2426         ( 16r400000000000000000000001 16r400000000000000000000001 #equal )
       
  2427 
       
  2428         ( 16r3fffffff 16r400000000000 #less )
       
  2429         ( 16r400000000000 16r3fffffff #greater )
       
  2430 
       
  2431         ( 16r40000000 16r400000000001 #less )
       
  2432         ( 16r400000000001 16r40000000 #greater )
       
  2433 
       
  2434         ( 16r3fffffffffffffff 16r40000000000000000000 #less )
       
  2435         ( 16r40000000000000000000 16r3fffffffffffffff #greater )
       
  2436 
       
  2437         ( 16r4000000000000000 16r40000000000000000001 #less )
       
  2438         ( 16r40000000000000000001 16r4000000000000000 #greater )
       
  2439 
       
  2440         ( 16r3fffffffffffffffffffffff 16r400000000000000000000000 #less )
       
  2441         ( 16r400000000000000000000000 16r3fffffffffffffffffffffff #greater )
       
  2442         ( 16r400000000000000000000000 16r400000000000000000000000 #equal )
       
  2443 
       
  2444         ( 16r400000000000000000000000 16r400000000000000000000001 #less )
       
  2445         ( 16r400000000000000000000001 16r400000000000000000000000 #greater )
       
  2446         ( 16r400000000000000000000001 16r400000000000000000000001 #equal )
       
  2447     ) do:[:triple |
       
  2448         |v1 v2 expected rslt|
       
  2449         
       
  2450         v1 := triple at:1.
       
  2451         v2 := triple at:2.
       
  2452         expected := triple at:3.
       
  2453         expected == #less ifTrue:[
       
  2454             self assert:(v1 < v2).
       
  2455             self assert:(v1 <= v2).
       
  2456             self assert:(v1 > v2) not.
       
  2457             self assert:(v1 >= v2) not.
       
  2458             self assert:(v1 = v2) not.
       
  2459             self assert:(v1 ~= v2).
       
  2460         ].    
       
  2461         expected == #greater ifTrue:[
       
  2462             self assert:(v1 > v2).
       
  2463             self assert:(v1 >= v2).
       
  2464             self assert:(v1 < v2) not.
       
  2465             self assert:(v1 <= v2) not.
       
  2466             self assert:(v1 = v2) not.
       
  2467             self assert:(v1 ~= v2).
       
  2468         ].    
       
  2469         expected == #equal ifTrue:[
       
  2470             self assert:(v1 > v2) not.
       
  2471             self assert:(v1 >= v2).
       
  2472             self assert:(v1 < v2) not.
       
  2473             self assert:(v1 <= v2).
       
  2474             self assert:(v1 = v2).
       
  2475             self assert:(v1 ~= v2) not.
       
  2476         ].    
       
  2477     ].
       
  2478     self assert:(100 factorial < 101 factorial).
       
  2479     self assert:(100 factorial > 100 factorial negated).
       
  2480     
       
  2481     "
       
  2482      self basicNew testLargeCompare
       
  2483     "
       
  2484 !
       
  2485 
       
  2486 testLargeCompression1
       
  2487     |l nullBytes|
       
  2488 
       
  2489     #(
       
  2490 	#[ 1 ]          16r01
       
  2491 	#[ 1 2 ]        16r0201
       
  2492 	#[ 1 2 3]       16r030201
       
  2493 	#[ 1 2 3 4]     16r04030201
       
  2494     ) pairWiseDo:[:bytes :expected |
       
  2495 	0 to:16 do:[:nNullBytes |
       
  2496 	    nullBytes := ByteArray new:nNullBytes withAll:0.
       
  2497 	    l := LargeInteger digitBytes:(bytes , nullBytes).
       
  2498 	    self assert:( l compressed == expected ).
       
  2499 	].
       
  2500     ].
       
  2501 
       
  2502     #(
       
  2503 	#[ 1 2 3 4 5]       16r0504030201
       
  2504 	#[ 1 2 3 4 5 6]     16r060504030201
       
  2505 	#[ 1 2 3 4 5 6 7]   16r07060504030201
       
  2506 	#[ 1 2 3 4 5 6 7 8] 16r0807060504030201
       
  2507     ) pairWiseDo:[:bytes :expected |
       
  2508 	0 to:16 do:[:nNullBytes |
       
  2509 	    nullBytes := ByteArray new:nNullBytes withAll:0.
       
  2510 	    l := LargeInteger digitBytes:(bytes , nullBytes).
       
  2511 	    ExternalAddress pointerSize == 8 ifTrue:[
       
  2512 		self assert:( l compressed == expected ).
       
  2513 	    ] ifFalse:[
       
  2514 		self assert:( l compressed = expected ).
       
  2515 	    ]
       
  2516 	]
       
  2517     ].
       
  2518 
       
  2519     #(
       
  2520 	#[ 1 2 3 4 5 6 7 8 9]       16r090807060504030201
       
  2521 	#[ 1 2 3 4 5 6 7 8 9 10]    16r0a090807060504030201
       
  2522 	#[ 1 2 3 4 5 6 7 8 9 10 11] 16r0b0a090807060504030201
       
  2523     ) pairWiseDo:[:bytes :expected |
       
  2524 	0 to:16 do:[:nNullBytes |
       
  2525 	    nullBytes := ByteArray new:nNullBytes withAll:0.
       
  2526 	    l := LargeInteger digitBytes:(bytes , nullBytes).
       
  2527 	    self assert:( l compressed = expected ).
       
  2528 	]
       
  2529     ].
       
  2530 
       
  2531     "
       
  2532      self basicNew testLargeCompression1
       
  2533     "
       
  2534 !
       
  2535 
       
  2536 testLargeDivision
       
  2537     |t a b|
       
  2538 
       
  2539     "/ on a 64bit machine, this is actually a smallInteger!!
       
  2540     t := 20 factorial.
       
  2541 
       
  2542     self assert:(t printString = '2432902008176640000').
       
  2543     self assert:(t \\ 10 == 0).
       
  2544     t := t // 10.
       
  2545     self assert:(t printString = '243290200817664000').
       
  2546     self assert:(t \\ 10 == 0).
       
  2547     t := t // 10.
       
  2548     self assert:(t printString = '24329020081766400').
       
  2549     self assert:(t \\ 10 == 0).
       
  2550     t := t // 10.
       
  2551     self assert:(t printString = '2432902008176640').
       
  2552     self assert:(t \\ 10 == 0).
       
  2553     t := t // 10.
       
  2554     self assert:(t printString = '243290200817664').
       
  2555     self assert:(t \\ 10 == 4).
       
  2556     t := t // 10.
       
  2557     self assert:(t printString = '24329020081766').
       
  2558     self assert:(t \\ 10 == 6).
       
  2559     t := t // 10.
       
  2560     self assert:(t printString = '2432902008176').
       
  2561     self assert:(t \\ 10 == 6).
       
  2562     t := t // 10.
       
  2563     self assert:(t printString = '243290200817').
       
  2564     self assert:(t \\ 10 == 7).
       
  2565     t := t // 10.
       
  2566     self assert:(t printString = '24329020081').
       
  2567     self assert:(t \\ 10 == 1).
       
  2568     t := t // 10.
       
  2569     self assert:(t printString = '2432902008').
       
  2570     self assert:(t \\ 10 == 8).
       
  2571     t := t // 10.
       
  2572     self assert:(t printString = '243290200').
       
  2573     self assert:(t \\ 10 == 0).
       
  2574 
       
  2575 
       
  2576     t := 20 factorial.
       
  2577 
       
  2578     self assert:(t printString = '2432902008176640000').
       
  2579     self assert:(t \\ 1000 == 0).
       
  2580     t := t // 1000.
       
  2581     self assert:(t printString = '2432902008176640').
       
  2582     self assert:(t \\ 1000 == 640).
       
  2583     t := t // 1000.
       
  2584     self assert:(t printString = '2432902008176').
       
  2585     self assert:(t \\ 1000 == 176).
       
  2586     t := t // 1000.
       
  2587     self assert:(t printString = '2432902008').
       
  2588     self assert:(t \\ 1000 == 8).
       
  2589     t := t // 1000.
       
  2590     self assert:(t printString = '2432902').
       
  2591     self assert:(t \\ 1000 == 902).
       
  2592     t := t // 1000.
       
  2593     self assert:(t printString = '2432').
       
  2594     self assert:(t \\ 1000 == 432).
       
  2595     t := t // 1000.
       
  2596     self assert:(t == 2).
       
  2597     self assert:(t \\ 1000 == 2).
       
  2598 
       
  2599 
       
  2600     t := 20 factorial.
       
  2601 
       
  2602     "Large // SmallInt division"
       
  2603     t := t // 20.
       
  2604     self assert:(t printString = 19 factorial printString).
       
  2605     t := t // 19.
       
  2606     self assert:(t printString = 18 factorial printString).
       
  2607     t := t // 18.
       
  2608     self assert:(t printString = 17 factorial printString).
       
  2609     t := t // 17.
       
  2610     self assert:(t printString = 16 factorial printString).
       
  2611     t := t // 16.
       
  2612     self assert:(t printString = 15 factorial printString).
       
  2613     t := t // 15.
       
  2614     self assert:(t printString = 14 factorial printString).
       
  2615     t := t // 14.
       
  2616     self assert:(t printString = 13 factorial printString).
       
  2617     t := t // 13.
       
  2618     self assert:(t printString = 12 factorial printString).
       
  2619     t := t // 12.
       
  2620     self assert:(t printString = 11 factorial printString).
       
  2621     t := t // 11.
       
  2622     self assert:(t printString = 10 factorial printString).
       
  2623     self assert:(t == 10 factorial).
       
  2624 
       
  2625     t := 20 factorial.
       
  2626     t := t + 21 factorial.
       
  2627     t absDestructiveSubtract:21 factorial.
       
  2628     self assert:(t compressed = 20 factorial).
       
  2629 
       
  2630     self assert:(
       
  2631              [
       
  2632                |v|
       
  2633                v := 100 factorial copy.
       
  2634                v absDestructiveSubtract:99 factorial.
       
  2635                v compressed = (100 factorial - 99 factorial).
       
  2636              ] value).
       
  2637 
       
  2638     "Large // Large division"
       
  2639     self assert:((20 factorial // 19 factorial) == 20).
       
  2640     self assert:((20 factorial * 21 // 20 // 21) = (19 factorial)).
       
  2641     self assert:((10000 factorial // 9999 factorial) == 10000).
       
  2642     self assert:((10000 factorial // 9999 factorial) == (10000 factorial / 9999 factorial)).
       
  2643 
       
  2644     a := 40 factorial.
       
  2645     b := 39 factorial.
       
  2646     self assert:(a // 40 = b).
       
  2647     self assert:(a / 40 = b).
       
  2648     self assert:(a // b = 40).
       
  2649     self assert:(a // b = 40).
       
  2650 
       
  2651     "
       
  2652      self basicNew testLargeDivision
       
  2653     "
       
  2654 
       
  2655     "Modified: / 4.6.1999 / 23:54:57 / cg"
       
  2656 !
       
  2657 
       
  2658 testLargeDivision2
       
  2659     |t|
       
  2660 
       
  2661     t := 30 factorial.
       
  2662 
       
  2663     self assert:(t printString = '265252859812191058636308480000000').
       
  2664     self assert:(t \\ 10 == 0).
       
  2665     t := t // 10.
       
  2666     self assert:(t printString = '26525285981219105863630848000000').
       
  2667     self assert:(t \\ 10 == 0).
       
  2668     t := t // 10.
       
  2669     self assert:(t printString = '2652528598121910586363084800000').
       
  2670     self assert:(t \\ 10 == 0).
       
  2671     t := t // 10.
       
  2672     self assert:(t printString = '265252859812191058636308480000').
       
  2673     self assert:(t \\ 10 == 0).
       
  2674     t := t // 10.
       
  2675     self assert:(t printString = '26525285981219105863630848000').
       
  2676     self assert:(t \\ 10 == 0).
       
  2677     t := t // 10.
       
  2678     self assert:(t printString = '2652528598121910586363084800').
       
  2679     self assert:(t \\ 10 == 0).
       
  2680     t := t // 10.
       
  2681     self assert:(t printString = '265252859812191058636308480').
       
  2682     self assert:(t \\ 10 == 0).
       
  2683     t := t // 10.
       
  2684     self assert:(t printString = '26525285981219105863630848').
       
  2685     self assert:(t \\ 10 == 8).
       
  2686     t := t // 10.
       
  2687     self assert:(t printString = '2652528598121910586363084').
       
  2688     self assert:(t \\ 10 == 4).
       
  2689     t := t // 10.
       
  2690     self assert:(t printString = '265252859812191058636308').
       
  2691     self assert:(t \\ 10 == 8).
       
  2692     t := t // 10.
       
  2693     self assert:(t printString = '26525285981219105863630').
       
  2694     self assert:(t \\ 10 == 0).
       
  2695     t := t // 10.
       
  2696     self assert:(t printString = '2652528598121910586363').
       
  2697     self assert:(t \\ 10 == 3).
       
  2698 
       
  2699 
       
  2700     t := 30 factorial.
       
  2701 
       
  2702     self assert:(t printString = '265252859812191058636308480000000').
       
  2703     self assert:(t \\ 1000 == 0).
       
  2704     t := t // 1000.
       
  2705     self assert:(t printString = '265252859812191058636308480000').
       
  2706     self assert:(t \\ 1000 == 0).
       
  2707     t := t // 1000.
       
  2708     self assert:(t printString = '265252859812191058636308480').
       
  2709     self assert:(t \\ 1000 == 480).
       
  2710     t := t // 1000.
       
  2711     self assert:(t printString = '265252859812191058636308').
       
  2712     self assert:(t \\ 1000 == 308).
       
  2713     t := t // 1000.
       
  2714     self assert:(t printString = '265252859812191058636').
       
  2715     self assert:(t \\ 1000 == 636).
       
  2716     t := t // 1000.
       
  2717     self assert:(t printString = '265252859812191058').
       
  2718     self assert:(t \\ 1000 == 058).
       
  2719     t := t // 1000.
       
  2720     self assert:(t printString = '265252859812191').
       
  2721     self assert:(t \\ 1000 == 191).
       
  2722     t := t // 1000.
       
  2723     self assert:(t printString = '265252859812').
       
  2724     self assert:(t \\ 1000 == 812).
       
  2725     t := t // 1000.
       
  2726     self assert:(t printString = '265252859').
       
  2727     self assert:(t \\ 1000 == 859).
       
  2728     t := t // 1000.
       
  2729     self assert:(t printString = '265252').
       
  2730     self assert:(t \\ 1000 == 252).
       
  2731     t := t // 1000.
       
  2732     self assert:(t == 265).
       
  2733 
       
  2734 
       
  2735     t := 30 factorial.
       
  2736 
       
  2737     "Large // SmallInt division"
       
  2738     t := t // 30.
       
  2739     self assert:(t printString = 29 factorial printString).
       
  2740     t := t // 29.
       
  2741     self assert:(t printString = 28 factorial printString).
       
  2742     t := t // 28.
       
  2743     self assert:(t printString = 27 factorial printString).
       
  2744     t := t // 27.
       
  2745     self assert:(t printString = 26 factorial printString).
       
  2746     t := t // 26.
       
  2747     self assert:(t printString = 25 factorial printString).
       
  2748     t := t // 25.
       
  2749     self assert:(t printString = 24 factorial printString).
       
  2750     t := t // 24.
       
  2751     self assert:(t printString = 23 factorial printString).
       
  2752     t := t // 23.
       
  2753     self assert:(t printString = 22 factorial printString).
       
  2754     t := t // 22.
       
  2755     self assert:(t printString = 21 factorial printString).
       
  2756     t := t // 21.
       
  2757     self assert:(t printString = 20 factorial printString).
       
  2758     self assert:(t = 20 factorial).
       
  2759 
       
  2760     t := 30 factorial.
       
  2761     t := t + 31 factorial.
       
  2762     t absDestructiveSubtract:31 factorial.
       
  2763     self assert:(t compressed = 30 factorial).
       
  2764 
       
  2765     "Large // Large division"
       
  2766     self assert:((30 factorial // 29 factorial) == 30).
       
  2767     self assert:((30 factorial * 31 // 30 // 31) = (29 factorial)).
       
  2768     self assert:((10000 factorial // 9999 factorial) == 10000).
       
  2769     self assert:((10000 factorial // 9999 factorial) == (10000 factorial / 9999 factorial)).
       
  2770 
       
  2771     "
       
  2772      self basicNew testLargeDivision
       
  2773     "
       
  2774 
       
  2775     "Modified: / 4.6.1999 / 23:54:57 / cg"
       
  2776 !
       
  2777 
       
  2778 testLargeDivision3
       
  2779     |nr nrDiv divMod|
       
  2780 
       
  2781     nr := 7325642811050717153762789776988268826770436380599581066471363310499109217483708146717300025889347764783245287140288431825827761209734375227679364238973902481615726067110515609260483803343004535447652942957373994975597787908243354307547553217414840584715130217408586553614859382487727371958203670203728210853329589615550643569429545464633535838187607553120280274725090757329790353463095413523805494772650078306205912628165850732646863846576998277181504708528835125953362770982762908435490999280519117904719254192978414037497481935495547720579882482124362070304920033554421042496625143517677519951145301160506529078213700153962585026512916970185197699563558140876733107706727253226098498667726495707224022003616065672008153665539817928251568554484739745047105522527635187163056607022536498632737702947013365938133885169902714284727206577408496549992845715870018995222990562233528977494519678931256347544259771346247230580853991022721956676465120007969950427165372994323753297510475028095488055686092040724169139419916609256577729768013251303221252901814408489603855447556799027832316669978641359003225101118289255692054597992816505634077137939488367815415698567236171805308890522013024780344455911750571267472425322111576828023953254628842107966689828686941644594589250192289779894954314728890652959077550610325243691999405204222390497498029651468304746649735170207150423058209700682117896369093708787314191673370934168117103657952473409299633370355921652776795194998872621267955977007414487536764633556057244697184265399074262010357199308106519621332411646090881806679817777934087907609335095266207222734209276892672802559477129431290377781189460543831892579497032750130070072871363403749763492296712949034307352335981485523440716455874989554006840460427619480548908526831960007098095496673990791644237848915619019143304599320077794055989022733836402514795091748221758967378808917944360112901833917971660803687798356056419168537336005651674223355473407003283134339985506017270361538197141299934143152796116511007721239543588850520897247526805181747313555479146618959531019365744636489763407090552996809230736561767841333905734641055297321262233564674390961392651334871664325693448366323216336135114828870644061243807564587592658360508871312414270046251899865884799855978604603846784154676298841585915992392704588348304942478924343918975195923643629685241735276658813975572655538887395894943154837164154459809363283117923392993892589490540925513342593007784719441705148960453180301530851234688957032066907843949205120201720517233228017689397727501528654849506825446097709482577917667243321350295028575684178929416362809008034715382134959864428148337229371113753679702176851066723014671275176890295101957580814878664773530433540963808618303311433527685959104811072639265393597781952115276199443064654238529377585171747088279186943179071921057535680516445246724050154764542596741670850809674306935131178441317280401304117745258603320024189243969889899010725582438207015597258263941269730866138781215790257519260119642107850957073141852969214624609102867275022012968382626510150354544317157440551595548404866365232107076069108476859713524926579046999471537578555696823173917264727038317433492881860460533993043375675559974541501151536956388184229821825202783315175964857435121268159290087988520427001562311888903167219790907449246265211066597617404797684060743206718943066178740881680422221097537985644933108964245133276088549914210990590138516895520058065054329273143605806169872175805617483836108276041444751410352824841438522369961070941467306815885136393083146953817333717600651525643928410853518305074271285893483690402426110481100118592425979094825294009195497071244959721165805259378411459840402202432070097961411127831244002473025945590264209304535568932141934734427207643570840464365672020197014117057179828617184095466170277658012012082773008797284377020045199741711763429387654482036311118363550554573970722123056838391535176046275151704935927285776048526642046962416364731182508311665455959674818084140845113742927564214026026700188662967826830513695781752328070213377525743249206640596503567193612953686078368856837703275526312899731904806336662979992529567407592246922517958210869076841533625492899752157880746671555381617069359816751254049680535425407993431788796501484592904619815876395056294928500125620366251871965592128092071339931385778018271508366059428400618014316995088662886944531660310582304020782381824044296858444495836641436442114508798254022275527819884050205813610927392719427503886961325971042076759694523773397768263944949829047040250671591798699614674593280712438625552771672046770702177630021735604331681545328668356298896381196151818109965073540758004677376198693809341805742022883291609399453480948898873499293263877270932469009419431439504806048534024219695533951970768718607825512258459988039384671119861525055001257711440159711680468030006281596534069339905726514213495715578762483305792208439143804155140484955582807325734068361219604129672905439850247943374888325363536124220790929563183116800098259005080319976250005938202733026601423198594337116340040753176034747789519724367052821548790017492968600851467986834229393664397355394904449416596664697790294348115918027290369660030404309844866514596162383926922191583735197797285879017756435071691692579228371128194336880861331914026966533592778591975677047531809933445220376204094007852062763024256243247594908739310435742528343941136832141474614646195909007856979265090874937138653336279924669848945653923945059917473576073169113163591124139505027406426534299861184296286788678362064462571791247879481439224580152349380317895688368254981040713360197820623097965776497254219906627282182384583338997949322384688868753460332706063133692787241504223050921158385580293599957894628416295533076654622257184754535802725334290973325498566317654571663237347731966894722724226512101772153274798569796914026876025548743598732008731155930322538300118777605906397797200395073085079799720873331462360859558150294524673319774115422392855072805588331909034084940029643726834272412931634977220530411021804722158153773936709148601033954557711082063893472585895524019049770116104251942887519233166694790693305261370262098403931338638500460698273702483237833362913924748030573151235157079682103767162430861730648127306887340728587348584798432641373495081984444066017235036057867001084876034127575741046842705361078008658574057368371382290972551200828394402811129598512908406453163914133239324104176213439651911165723583312125404951908431958612444626832567425682382934966014402623844134480947328804898904457554990223633471152244935360846846872567395324752446056856314223580293777812792119222808747497257154119637357959526560095149732009525437166278985397825839476104252829701681188291604531178056187506204522297781410939426743458996516122417016297219533676135442588829970042448233678230743338567376323339403790517471808179478793371414460742848940080957249583920379222819120854583169254001656959488520268941651760355412230878512385792248057484840320339298745595785121144213305506256309005073307733101215537859103057428564045191401917751767528573372312728646224212563853090004301461656398621398256865950301741795030996394898498315685734194500204859005200129895914605961077480028024084166201706521017250564954091090761794215977943552136119569181253389728669786275631589077849217875992600354179303147875039054389958249338829071558805071696036014384280708136310202474257546110256018595074859205169417210438407668235772264489532840927011474245787805040250578989944089804487191960609374291147892392946334697862368311103975946562702804600592135283262705727886790284962999933595950396917187809872807890634995550768965917896649379618770995853018273642527941803602373748201162016424346818539699731541437191051272370389920430963850766457735997487836796190622801454117965803454310147963735891677695932780724907240409219933741153684518942237155171214800428187139788975348112515841498442346521529922874142809101317753813000222213844775530569928492214119218158311069973450417965826021228115913570997832587000507462134261658894622095296948660838891202843909918507703517052932194777950892934484326759830164241347516373904518928184219267625128730631587594616533889734599461176472989484051646992794549374972941033191680237511998366596928478133425687348377402191597183609913275115410415042943874922013282223036797766687562234708717228407526539793707192821641982045304637501898951672018353203243730498439561247010157326717850275842340724013349962837828262281859810432128342491502593655870623723538391476208736312646369716279126909024702322290468430221078966596856226868416199720051530940142548869537531144513871342122033366003412041325058744123643998708546094783795853752878277029993558821508050352135005532898315183427096073809860479404735696155895314871310840383963606002446025854182161994409438676534109631384937889800633421957669306238761422314292556501189945069931744515842623180008335951569700303152755271126472218857847432207385749882000533990024894030463892512867955227542394178393580753618051116929938385425024087970203342497063966957812547691207822897841681320712411054476647899997427503220523868363438443638138602058216412755412543898409102222405369299283907058054142505144252800800871766217740818073224044997682418836667094039746104705778772576150819423984585572854317991749574311863090200042587643440109185515699468359875803740167627895880258372380256331670270263041712499710565984020613035159213277572556237587993858247481402455200866484793496257416259856493587482957111225529071072537348695594958918648771418745755086539672404243468435455614922691041334875071267875391058155493338089472329161793182872605415502672937446879754623263952587889465083012515482974024506303700547794278667536739029569027539204865836091781842095979099980597464896983833312033418068148036099416870991217256675646972777065922275910262922486960982071022004929591359754288008776666205314556217272149643659129541170220989690332246883597290512968292817547469960138932109624850558843703432530540563548458251740803818389916128884564107380377927554030955090368431293751439829748472706494577940655099832463005901756121683476039133485795695397208495963616009088796806461291782584789937456739904233218852673930490171837518542422869715022557300014464253539379770130907001828679637745393742942924263739420939777245314275120477043103602195417941946982309000073013714022977049299652046646160515486071522858510125026538512532826758076756521229686019516236643861044256103454896600270127497654777352626796048814315579753595410684034930492848275912546385929478301905388366502770922904296261409762621660749049443869640676686234525730982815147070574292105084954509636183802284297900263494202277262106346273298509408501260925964163271527969153455344760075934784461266832139952514330249768607822250546116328645082232537397149287150870610226985594932674312703921712201689647303170983692623648013718537633610994267304884724686274443142818383020753736848287437672619884752757520891254092091290347766004298705684071656448745211379292411880056341949058778325139319915468910315101214860880624074088224739933628426458311629373094570056389962892015767941405606261884441947643048736689186423401799688135324726895945036118240150307617274590470074687290086181786558717205596918177872025497599170920256707122647400323893910027358803516743974239059498348001168404511372867956344817513606052060286270870628439157590311659998045156965274784647124177936899464082765921232150928558673393867832500877514025700053617920434533154013622992297424683989961395195164544773940494933482997619656975002955401823151470278628829447890583331692520608980058918604588771018141614644472760830547004909601105353723205204277054858100220843067696044358489288417053911779777636685862530733028148648527058888734952577662015452662713320998042221873897730242685299799949020919872610901220937556378878376264157771582659279927771096081291387570641227589263660184974304328800241026371644634693496152671628907116378044361348718616751343481441762999387959144794856149633766264287145359338550543502403574450566297906658227167549659449971682569731597042976899648193306364796761430963500027369518502867183892521528424714258941396654757315537208349927345921504783438385098575904450316533205383619867919490492230433428758373474687945215479480124116968494047912748080744896623860514834802919426785508712839994810630938135518361550388522230840646638453183986357427908650074058682630364404843361587964015212755669857078199544466122571728060539385378015602874360055774274800826080107259485947478571241263310480273433269041612018874608869206907030535684348688412466809171164973900200423516515617084359168072722684263238409355982984938645447365604915324694040110296398069636366148511098339986168750667254777835619946102408620138809371209811284079984973613416027249191446901665098739727142152623855284808133782852451728093569697499517366796585724689797742669468565268872539798878428345541861849015666331916000495956355163844447408071342491131776963020645656976892893787238149867119449591069976736262537015469780716243982143936721917630178728713247937607546958966361901328145570841011084562097642232937625937354868187273321107873039743053276603671355685099229683453605499731141681728718378187532065603510822624958972165532522593635204874376810200781275036766022437927240950798250024393364045682189134704845812286037422441193122739522406536732573140710828441743539780377865147861896193389749380659879327866275653179078947651387828111930396337490811270697985089816201218037506115014234142814682385102523425972998593072640770790725982414228544633029642995101682258901254287806742301366208828162477387463756687281252994501452908836547072102623355315709902776432554014376309587952657925497621653825666951796394661574770097931615332475671105408244630930525159146961999288995770715582728242072913256023911103584836889339253743344246510506913924657087924098478903888180830049760169862122162975453447015711932604661405562458098481070408233950340734255196874895090512289072552940802931818483030211719516961595929768810347559895680375914216324687844321700032530945151286243597286377866371612859700311552506351798213870409353454490411358344277477826150792145755992594822938766358675158288011584257616710623663101210097323109887979417370263612584058408561358753317231537698348461655660755380659581072178207477288688962757072265160490600631588197174512903146276684731753628694529596685824595885678007158393374747938101982904430961928841395951711676378080535123188351635638375470401478450523224920448602818895251564437834189202441655076943081483367064127416752887771318611109757781248425601474160571124303096368062074727513104959974456229598353065136721943994007941337054705132775534896527968122420469283611331960766006310601910252893459785872191278971330399395239110974562830357605556211522784691991561501390889806743958122904782088893727818201559345083867749044489168363772143703073453861134806218832960790409704879310579717552309996536217584965576262756407451564345833758720479629349944383529092132517915571954489963418248400511019703249483828204180370506184025113885649509409399769397711510007228728095574770224464446547044693015123777262159249799920884371538510122463960052058020131241942783200854033288826257878667417602086305216692912715536488620698053698022459949861565969545496357876743594887244566194824704556438285754633336308260058711894417742350590911910751979319176563052975803605412148165461044329096028626360061282229073291691883497842134279789428389371821455228942452798912977912958394511561774867405616536174458495043002980673610932445441383719655132197637184668163335110303541471123350976668674100112488910955928337286996714611124366551465792608110489076815010708899544256516556491056127346270833501757113609337499406611359404510795587423010608098938597650459332997781990621787924888569110021893517402845363268426339706716754389272990470513536737039987732318209821574773158004394368361313988432686443321166887644602545565041603076909330007914163941559127137026301018995229723135409029401064752864596947271438965582579277147631406637452843077049145457341837232159559730366551507472354953899625929803225701422561284852163965527957074334769617150236291205879362139935058355563169747778333904452955956839634568402701244925016745087651928608816736896469987882537309453244944834414373262938906464005059484038244572034326521612529650748538305485316521177247308396706868465169508059682590492304730955362364037150109353102703539473481458183308919847959243679572900240943426756852783203732123528501086255095826959561188972056318497725974188808836112899288753036602467405834455922655584156707363544433003151873583632491497489084045609299373141002646109273485527932587471790254082751973899027694147514158739383819684253034890946834373388441862051909883719721456276038041023850094627569248404828269211588662076341724107938139304211383814235573153888420922122069650074118928661037695827085823059008478593607756083868239999584244123010713329522790683394908267830112016051994957975600649644301974822906420255696156580630141761950629199586872747965112569565095469854869800403281833556388965700255873755860649520760282097467209698862605898434981759137733994266863639515406534007603175251563989668595260982955865634557781963224702857431711084062719151650997813779049906730415588122420262881103439896718580338498764211791089444646113690306378896098332737896635627635707772111276121536695313757806801348052118367819007399440960078665432399602377589467171594166195848994511848676342889852715337165791189020515662167204773204943614199127918332127383021743482576248998849902385077500814075914415851227356664528451616748460466665152976847232020446712913142880265960029344991220490001756182292717800761425879396636844902717038165543316666346164629380858250514747045491468395622679634227153126619733161441602334688751330958487543155598758421785605951110820924317190126071560389113736027517764010449768122991989484777981503183676348308768180078944633796744764632437921469707222455070766402087305156639658996955592139453843175790298794847443059643374415249421787873000204116964718653377159672324783600759484527475614449099007219842795509953657219555506013243218552996721200522560495144292673408433365706761513733674234568711615287301193667910837956568423438400639397963485968493623913712571443662496434067716848785221486690871940013498223030548187623888628374477709165936052912242994609169592340209437745724218818144600119064099826714575548308046604766436374108048400515726390133789845668096714784867008407173380319008417622029995593936143909536352013256938215644416531080180324802324618594097721172967615098799962908130441684305713015684547786299489529752824756501155428933939409296205517218276045889777478407568327206299474573691014209950666820875099905758278156965131476983278829571931391277816150330174477625273228440900552716318825768863185688529954386089451175385273662218329372749649446918354724443567025222349254449500617488028496361898409264103494905512190685896563250346346478211054441208028146386655248314336718654702652948137658435253312869829785373710193043688043958388972024841165561464326457180133203136125912400081649557668375744383899632969559862047404192319326563366004043695206668245499093118179837855729834168890145742251325448274416525637217013782454651636292195303239600214499858171679843470201696427000689391939448538191864553657744525021360343641380208086955930529022030426160885726040281673029309222840802065136346172382864319126701138148007706597835132695333947879760079153539055868548576156789850188497064536338026379929631234929007846807334812010645525172679991044333308985640292227558092752377643275995472992776698475790987837268792851399292228646489527461685929270374165049749069600603160046531920796900241727037869527459596145880819238533080519265651802795555015701064625591610129446123733504319175294781249602732333862539881844001174584054522255651608769617444327599828563581084600909669099440890092395641857086470399143117454131045827055159803551495132022116760892488889653153960587625841910867118206599437776258771080930144854653198726857646093716759295479410273617910942457821712732399190660866650490310710185557517394324308553105747144650750856879369349462377069251837917999202072251775088629659288184803660320127706626903128184146348671588370808814878328754655521943032817668859558325837576523141169778965733166386323397421920651468704737017814665502038341659575691927370030081718281672624943907725801459555157666049437494098603486817488433976626337340941222390329751486891908768166184463762670896534403352931457546379158595470562519774115429755212992688771218914551662191667783721153049023035595877690703411366361819400655202920269631805916454568041073107237253371890381490738743213309620059159993003849604331778047563116240972981607042015453452120068390822980655208034481099171665126640420489382675390866694573945421665672978524248517728079136569669375989021101850354217557422960696302555361297444201614660760149578194625887224649588332477042831119096972466903323569062428962777789251193844890660811230501531481978959612097815608680381821610023703044066176422964276045425566045824291045559057543333711029208777182180667218083104949199239136505834286628001776139959001219218905737418785641440851285017285337841944056173947452985842634788119839741235296336597559262487718554614436546822943903751831157623580674824591472930566041078221877158999849916636775398181102018674052880692512951698697513480517091515255566537032339412246743208266441707025164363377133880339650825219697569785046171337552332893545340847276858565496437706766030630722861762469516812573460899602135044490222233011994495526330459680983366359908902306295944044245771154099378936054217933392621460294966444315839619038214146393712002594553326031581417561314908364002486755770223569034363166238351234653984593425868697240971720773578144266846388819244504828181776390586079945560272760789021959416347716506857324409906002813134675432442066171228067068885528419141038131029179667706526774372963054478099683768936725773364000366960379562118197023510329482012107157344155875448591161595391919815262096502829728473187341874733253651529919979538531811286641534627778595530733985639584783830665988435302841891713116049103963675865435203124837066057645535281252657153315351003929269787455814660826997441903167459298690397042785489023802967671956590687562052329368827775864424049524191769265315949730487923955413049297486674195881931530552325062629106937559254886715285149290376041517510254575017089126238369735731441459908323625000391457129028083634733044760593008952189043595506011162821891237685214611886906091274976179324857590706091796406177625733347163004518021058299015360077008619141355691143129132531858006034134859471413635076801228545121952706746023220117837638086686354108957435599629954680243222435069621658931397374328297390779950081057015375721056239174253648058468325719338788133801151936515595963203703897529311280939274519350260938124229883720011888795447147955456430451126315978438040080489704091830058887795299872925112565712154018417162739997545058930991575800581788972727456060664226272478064852420923999507537882444320718854395590876566227281632171045068514052351501673709403201037188250295301734415546890351185372093093868842689894001551600934381797141922487365311721131325628216317486392434826534327444835813827040146040623702648032380447448136154616398503109030818895785037281436914811186726407883525589623745784053150256537820204779390766220428603926382471986845043607824571153400160052404381575056198801845131518390346351149303614811547311242885120974347678264504367422058114110590584616857433600543740991959073794058140903494097716255074997440636144720728479858818431649567101409884610735460498756656979805396736031128522080195025672224591817816046577402276820084711291274356314869576152330615815241767096386124487945441087050607753895420887678873857176400381643559607194474756870418606846938092225072149441622787084691405251105866384641135662322242739576886322176214547207279725762284255464168735963793003697380346821240816624664408301727144025359059144838660419650159844461274414337264603692360330829781038559372304769177150910295526218586671075425593440499090198871740910802116275754099660717081809348908577040588631693074984232662360693119209505027983812508319223671439887199802525968038619436452231817179841365769913890926114871474823986102558248984056751171047487920908703881344710413315117402556245735859539904885030456237268421343054705364347991234047913856137332488820079750762203668981258672591585746354112878783999551179429905553595428779319618205955760109855092613527644960822047320473227114766963811143741244543560984456111125291941526870369848525824391192559998244670495612381361646167116316134254469202262396491358927397506005317375010817174654504297216767011458286649844846972401675100964256583057423372220731293103426957596949490693959409243387593122271779730186895385509002372128203913747196497707222954185403205774019431819289117303305570247189365499173945821877882947041265338660691701329332190962248344273179360681417405107489124186407998243259234573342968597256163713209217434289027957190422218111924387788256131382512827800678950844810180746534889923898689642780000177422130718538953322034407815417934026037724751662822483375107800778896663583289121202278023801612863043235964927529347161048346388661293376210119688831516982901549177542348947159080101505257893914409911057786247888178114455119581370181777267188461192806263311755813332788407091502471672700680467132633477533561142293966656214747737409578555062844314602141692485230285966094671781847301987395271366469630767558062112328885393287218169191308218491026790992185940472657740498984495459678622709378403150335318468905992328881663104160804687882440812818881405288046436227297457076591968843740953385063083343962623712923639380484489819982491016361780280276169822287192392447562183004485125881771767301867399126196483636819125433619352232936820141550863954332722336201898117119322617189636537779715466381486919126946687930671216141452922541147106709679828617423994874259063229649123229518230937878691439874612244954074507844778683128526476317639118125371158467622560854714456375919537991303413072742967677940130456040692658489636525122293276481109808057346731810379189856938253679165389325994448637996699383494712921721075102752165363287472411045626443402092824653856031130579486630852299223562415803848929872524176136572203720259791428116844323532933588350929434768591652396279151377056649946904423876773164294300631366488764834105010682185485963623493414811764796197305673062714223556389869461430429375897012606458055194019727119699064615147436243860806192462008343479759672764808835547065006227356966938579183385683242312914357531439848379226427244818697458161912778146111681862542149788668492334979217146007920768310239137555938899242435302928517891968231720891496735372779516584037533540785957755005709202109126682981133492715169216867882096335742028123146922474139806442352071726795065748233286421357136259478075789617951692483512515306524891863357257717679489398290018317806682896210611402661100160374226086537049073243154990027642836396613193310176604504810534893772428808909650946232081171095067517581083996381726077971297100787766219854892974450821766776476654920958360090137474327967048906416972057811898669752411033820021430818244474866948828089694542481365682716635711181667411943506580099933345985254871356053492593961261410022611611638590502797062851727396497071058602567774355094747163736356397095850006997424923531112267182732864620909866113824820058603582958531094555020510236027027614431361800988521200399586673119547081726414690946264630190526634425644735734369461310520499007520355499508585543263341743900683573459238052117903500693000834091101712801538465402378378788144062565678935408582810427199506747176661448934111477635429452999529543080018774599929511274133290665853831807027349385053891990116923477073601573652090791807519295421039777391917621497541985415302633144183175238454215017098774097235275853537209261772618306543730724023082803885507581143607139751832537169456162439207812666381128402696526892293998914258723768720017499847984266585234913600117422675602853831759174426206891377825107340342701248119230213445536811698998359038183296563935302499327006034285845728896557943782923399556727004316890263067394203880281380073469638121484580199160819715617289728021829847401418693279991820133854136572587461373226302598594529298221390370775366987990983177009324833219732528831629990421797299223802093648161616663879975810476101783579393868468502081257564874766384664501509001183842063196032638224612125668482059082665228528142159069942060893915606313181707310505441794055294071663547920016602694400545595432136470930681411209271045562029874387463078108850054385998584637189771275294132908369193659781957985776433491190297689914665426509472196522411323928378195300561602310224530015347222547875758340039768542111436297653638278662369121460476330673013642837634923317515965253459144537815213719135592442299298816576373126634138038960909820457612677675783457258671339723120179633081955516804990831567693301696939699672015449317249971642551286584808129342788832029436801657018628358004798080608105909323093198784846845645325386979597398678978830345672780153323968476179576140696425471821998947380199201341358406139850774495886929512793237490160142870088261156365616557904316857668388922739833923102142619761438181312790544717406255524534509231320343527106989160031768626195806563471881286599066109601085681638916394858229430951462409147214901977476398310691648884105776491098520166157330063939443875435796943355719969632950102186397143687779839736579836206933338819143959159363406579332971362010077679786530037433544098847138689261158878246792507024969634114253622560056328316234987527324602651240456647339013865004249242977561395674701577956969389900249185989776680415380350732334128309923836114711035017617747769595002949511282687656602753426366555822017768660677216237740216507472925748667967000999718713527274444690963987157522627787202354721060271353729547313866987732075979117079846732413636459165812839433882317207155027374226318776368857252794717448645253705770992655896057862954179644123532323636460584760744250739359102987786758637467637353356965608822802371506831339109050545031443083639828791912591491173211826408402061094497140550687518456511418634831704222491420398551252188798829570316127890035938622709348295255719221696461602749283552993638948947540135681555161478489620846449605430044941872799703773058974361817501697061476133321363775760636069455030846228779531268123378895993835780337827038608856140980413745864293745914406340229750270769504339465352030356216744024238713735806990797168008854280945697224613839870090197940155282712750709172194380153634146926816676024515823584088231400463312382777203125668639972061892098691453960817235720605917593037228214044515858127191970494660211930516466145592663099310492447409876759547267269546121606395117066909754582947520241309163725053673240679714256180891234020254453276258233353933830411269188099460453101101892000756745988828048282222284444127415763956898935615592190117456834504468742950360516492684416298793335152967766928852074366733814540857573444455528985644845185065034346112640402659226060116640258934520978930605038249624160204759818066247093333611839083145229529279417098896841881437979538519201155777645178826287972935358996390354906995489934248530800713546948968183148003843919015314165041496161557496179086007896577579617867935268933548581362341854451994408726034928832137826659990639338937799609636453283954242809205539456878416214070953644356943389856818432600837207778616720748676938374167354667834832060534863893167858537784770073045535612859851873945303743454718296695298634664951824381963669712257445362562336753508214174025503527830539500054913297955051787866102185934642635331258792400637526092515185350299170488147855128705105659867618088688753087658254737196930525115823965358676681318054168230606026317957031887517498191886041759009170380803971677533808855847935963302413449922868960528689064335811771892647412655405511386556297232825727620645847030173878179578724353115411237535609238689560816107970307741703445451087116907161445232553198068240181847253666995114428407076706548882661985472194213910892387669936605281007133618963508657753133705642673696817486635123227343786590893113124229529397388254617250179612431485026422687552078010821860291619515171241168065674667610207596394151847581338526738718950716228321620075816773740443990198310650129401028199155101511828634637136915354619277160368249371381078808111483113736277999666680765128118757290998894150630894070077301710464719965589744182899605947453537434325424659568476976257807998688140297038415134478560327804024687366732279706746035700937983217159762314919697722630018306620851175305234116716106843307138903094060632759586446063354844094943376435539651295604866223836562905109269402588222614796293798277799468218379916416521276024309764723016595827980045529911394304000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.
       
  2782     nrDiv := nr // 1099511627776.
       
  2783     self assert:(nrDiv = 6662633323731567683137463770425046119972136130490599558899123904210782000048955657546048338089665562423074595372134746708823296293971339062117626089251555169190147414256458077270948527569093617282899634080762548342679827245086339014549187793286219479991932728270136570804297100483133701307636938694238970905034502371154888869049996596580545736458232161676533246213776471749761506965201454953608385742563840091139275162427885091025804146353946887012629948484423153743921621737866106228003445067333011961381320536910074258682909144677567128910488902078543169686709037300189304457148994986416728307763424855244492462783182558234861995982025264479668930619989751791520673311176554512802339256928913261821455310942897696812136624011889515033152342298071512274969356920005509130584511715402639886394993433908317400104247253605275804809213311644722625708569208536590845345008858415466399942051501903967025595429523806385287189963483817993580193128873368523227715891492147715101325512000610702205499988933334611073532341758081435343892524554804643431682872519021193151143459141893825137519042963177852473768417547297991124700818539000925406141630391619735578765993129524005603624473698812857747129288247152154569878280492149839872603436792477479782943819217222827905602197688669811923223236876518868169077065932115442814112611272507112872060586623457737282248353708537440207167545131324624997338441147538821782465377847014831893014759727951431431968895008978190868943052008828655078064891320004323949219391175626919627742850388198587106996637256185312818463363915808151256605758842792136336001326613101088899142459264924284800653801657455269721850699589180141531487149252598219454805868157021677473942233257684196639595334983355790828424192909541992782433644995416653317905481191664882406344528748368967757631115924249587936451097739407299792209435266919538221186568760660301420447293747151306991237865002378076318280180526977727975952198908682179738530497531431395267954927026964715297743348074891340859860789456898608224255025187495012594124570391779113664193099927268994661989714354273464562908966902793335276088839025616229178681024727936638794047725854753445121469971920000103358186939952444241621483187255438734831666410707469056761064049453502111688296190428340923841441148946475354163955033838270461267159320949165980839533335114464512294874697208511171752685785408153217445523193778985790372496161721264624578255386880658073907934058789510812259862184677985571129419404726995982428753663670210728075205992308115237575948883416665937774630699551861339250087280966997886464539913201627606531742484162972849780468425532497380768638445224373234076062753384679812079141062759905910765766089004401051262864330797018433052954090763672692099410879958238807338698107808012778508416688011598376942350173207376910229491087872782626788596807338691230630211536158864622893956734099080442020613927228902807774992144293064849356703912470587347365098361451500658414011543243947940570486265588687939149293725873385717495020907919850152172396648759758331493330026994294732515271227954608685062834699381201564024694020978463624585016140470976879181330265581934326720818333847725464851389246839097102050339237267017355400679094305414741521873249018386912379564657226367474609265595843167030823823815888307326919859008114043629727548060061462134640542960003237935595902000153006810199318514370026314665866355006060662101944184764882516982242954519270451909066555817897156024927674610449508845588002992024015689920157493765829176802821931631590241487238873985285696003426340287794076918847820343809440277189797464887583441187676629382340618054613952244943532083179065762391482344807692465983310435881557512776871445023245934926397204809407259057481926925852885928369964436177662848362828687829863675543005561550690069465524227034464836091588464269332378546107140912689644468971000647070233491616299386491375149772573753171449947304356213004974407827081491882519644546780260294370715784722926779399796198511750540506872925851061282487638657519313905164405423591836522816111495281603995252289872385086476469229310711401528527506301257816056801709876959217865896545758738590541706792036682061363760042257088762989112039152701520742768623568505674079807810875863485081257794882308576605276750150366298371039105968353284329219873078273054143543278652910514327315532991571113396292522800982678225773832322663106505081384006672724636320985174081562785472030426212309827534624166323291136226564299729779926610904852724095137745669038747074706380810381924397482883612399986254740569208516035970744086352728731611278556045932012031400560563908745853060950689115708469515692155527082269323865892247308760070844077451853262294943617058144830374014063090229211365020886204814145346309426230627122487421279225644442725951826590928222475412083281764588227804815128066475027958454121524220172577508201782648035333837955540129683619410765000534937610139700875341476734142047589998542737528010306112593043148198988006188165170845763794500602249285494318364329213288147091824616909725569939842842543596840734083524325194154098463289461537667911688662904500980902221288027220544655818218265475837746996472010236584007176738575972462375026150791464142148497925800115687265675808142920616038812782060447067014154305466101224458342793123964105995474584535180862955288460196781648553085262219550209211207588026816531112456709030305544360916191463216584932837523535301571859795009182479596217471466926212940178314362383320867455900637582040017075517949772956047275866807594416084072169300543338235271482325223007196166301392848144570452154384977210957293114632528390739972304218279369363788615170503593817472053417243282259131772615839858816679000902088506393860091327261674653574046859271748229366456048072374228952936986954461812960776844852566037819383835600381330161020048169786575176406335437161125603009418044684750306284400745015540086325935345626867567751378481969009868769532841174689642757402653727086965191901579737800170435839185407005418578658287140871751975359929956215389060409882342023572364751463302859267203670036848697371716329102635164492370580294469523800234173695676967556158058431931901118142098589725146905128352892769397385982936860912089503320533289229159009276510219167066390676852427014511459354368805077084042375052908754180535991959079169140810351777905505393392636393431646479931302422033114524318678899414743110703321665415570194813338103931163016485158053150293320176682849865950119830732697413244124732414049420578484034599229592065444814927955090765319822680007274309290373729622349451338071624805845426576853103003370567780916419402325897239482929120438541569564424943334867982370378410776501847576669342499380514197733899878037687667052618283223365943911896105902249524831410057706578101179674765029139049616899153094252341846800968999185743059608692632244338477301941908375137612702490034105885096135690595893486578406810583373575282511613130846721636016131016419385094668786170270105099382118058667752659173909237179323408143996490057471550438372565855669568075707259687274506958695435449557449093301254608165917100788931501161845710670470989502338362996305132945287246866702609436316376008925088459078082627911685321128243349354229036144786259708802466926683070160849866228958572801968143008687496651087821709717221337749533437341262096267973190948389492727237032475272862079136719557335553937772424498412907282167253204658036522663912861489967343545754246593032273458846618876337536007203682712249257269146062576546910876450005243718339617735736623482032784880126505138707551223982569305519703270511483547382579404918839636852647345161672956598447115365954967174398002999413589275624553356118459301663295512883021676137652660825734676124215499674882903247218052630206577642084012432827740455157014364420171474367291740649414319526344397807373512379561085192818359161938505367228336721095291925155065811136228538259401638220286361061736441517811291787368531134060596121120227508274377982866581596616462970013543016021749257061326685130571812001938788851323431118096288750404400065801469551796490885764071976072881177700325727466583683008951024461863889728341965881114787320729126972054716702704109258400053128328990837507682205316986695881175358221798319366772405548254243978588753267948484911744969711778505544859566371008691126381031647673694280468482450520966964802539436922158737077121750002067704209950517947895275485187950536800011107737855580525830416272726621826086807998163498280837268646635732040394769166712960660791026071702275406585969427586620725056827465122411839751932641129741050664123546627575912560511096417077652349819389991841973046133599693459503547277028739085889123201599430748088793537859468190507211174911898362104739455512577053830969074103537490200197207200049611998015566197237458603889177541028426143550097544365997852341124263498329937465890381606795295955418098232523840580315613869908469965450988802338848428525762122401606821882953426082028665593848700047602082113394220896647213988097023709581111850996949900598384480808761859793798146684096848272987669550104826786271426406384927141254967004421494402774831090228439159876359957377770662840899979305879736692449207314353197306703720694762653242964236415719707807709474598662585817690053244256584634094675588772387320728876893030232700378159568564796767815881221577040003142829035992250009683957501514432958745506657813505062455380239289536840908567419834056655066010679741591568523506419291023346414842722152449355047334627139443779463897483726315136235890415753009343093216483474653995240946721005159273994166538118965875301947867114969329009355586236318538876250685609005070430253377255824432219814984476455677020466705546834887611998078233503929866669094433324734408933206886290341422947478206056966064334662828420717990695296446636482902339973289591596091373182364602203890422888673967906434865718458245218781812358691248643177646331019984492877159627032179896760671627209600850253346391553616574626603287596419349597318213312704240279836597936499176049259238779919659359224267409788742546907956321200282485507559458481839743848993694568980420138364844893768971338467175415458491804391538574796876754405099255829357011671106608209724284478263756619062561946992484466017881479781226530089273673529323906138417286165020182482970033492405254420136568337797393833604513114189281093733322434044566828573546466011111351374026204357974607838989739784779000309310988838440677460786200468664461583688408649555734386828226224795341890764896222022843007212559090108162021383514450324833808323442944564068880379969871474643609232099524672432072065066171371327688290179617734777653046940553660629197979241904416814835983950855274272068765736863745858963201045536085042989062938403688763487261963686964428476887533136063512074332363974690948558717214002383604926898703662000671308292653459533824119645680367911743181294681283019279375110761642291430932623265766493454469257647709146798421760001872528500721048437772780065726775583559870942098046438397119753740490868306016527691410327914835147693629474332656459501972550133927210561728079422781253432105249315186092695867012382237378862014890057147969807959315163943016544546298690088701484361031394763122216597928194997139212034462694811542459062553095389537586038839071235015814370056111693269389352305878495387099950893625189881278100442169827936555834473905275492197948797975758169884639129722925686252861191664712463696502617916924251331904225415709036855212464161811580220910449150251619842632875245719603685469328376161861492205183767960018924893683703862737234341532850039837857211248675033249758162682137534755933837705941315666354487585368176046276495167470532765222994435005694159229340308269782771538682076344939357692679425354738694430715010693246526855161993822050738084109068988456669010456828514452172338697819097988850645322196559280542955237043845644875480294191294243671628138352015652035502147832020273418517146314693212385602848033983824623687143092609964470596861648812591181885313558137704270635608088146327043933109509820109861326543893172335781445926340867738481148623616697386431217916074089554450405103150269058917608330277763824073839949907229906564057762087349990311778587768856946330357372471841275187565424737767435082996992995284357197931917849454730570975669701554500305138158088651708126085216389971524685018121085532248742434165580153047378399460873550609161599238566767462611149933427772707403493393907424627064456087353573406713733285621911399526086839253252364920421564239246508902633182467505840796787479557927720879016862471757675729538193109452262750608872435631538942265160767804915408866767719853735545879556628651112971951932782255758506758251945975744362293034679502078243875384929350503323125647362412515669719705455290178369806457412764733465715860119591022250156219106181326562931513112569640527774437694546186046408836197585138256444950223039512425447239856838567382824787147773363964308297000112321579912390413854219643773041550014586978847525545364794414262966819887507035652321303620752105217176216667343339142387440168685055366893363995549376670079553282967791356972668015843949376745456315682701891383756331415264006206237965084878941733844343257714837038003432752137257495692759685719124680847167412614538657367006068680166919216423380951198784933649947788603088487475981482143383660343066401239813051800174000533422015517445025423914324655725411380579191151076329105654312915546930776739081083130851209560307261559808003595454190858699636192994182698489579919753682299765480387055479694566268008903344458287769365183187828409240957337041346594822068020495286153916970285888477298328581357959138997929436797741893882044055962890321491207955092531472430580766283693859646215925564679002104430854098259562738959271344578729377212911592288946202639427352171631575468303031833703338256634096377869121483169247318904967557580606897753481360433243071165788807886349764388293820695191793366944295901792867034972217834675333738411495592200037471295720880155324101436263128307034059249353748610108195767389020979150086248268345752906071488861276742315827848748423651031498876866413731293699920942666225974254628767337160594389199237190034723264888058437168327407572709723914804838989858772126647736411522980570465381410084236050678330973124991667963023842876969302469279748200467545110485810034399278411447631362160061302813940661759884034612358568237683981191908865801458121853442888039446172937851735631594598045659655670606785063854069117622544099869154206792904842994724111936422163524033921205447454737571280459967114554653337916325943852925554693909749040789538931789414251732580009709193386661331220447753688008685205153591603394795178887882480498680277349305852539404087412513732493890167379734424193689730774421124197396598209807938986005281190551806069183559876875280125104661004987176879496554550976559950467476559304258484634527452519381498017040813588033614753804422807393056528398772163482132360711680090004176924055583698960466571152646455948292335532725821865747613587236595247530568040947130838943692837511089697894954146145800686471738817451943314160624802839788362893581912928352442591061642144413099049343949783668458733212864946888676178097687428090333954322728693913329532371868758870453268823927363537857721619750427589553115439726294751268818431424046653951176908373270894803348106787107152478615187412606784084264974789511303754855340051658833679689870263545431979424720394747263593027757345678621399456268980783872231272861374648345111361698362447451983621128788960537508008651496314069548689924381907425158401685801106563911310636385954732278263100830980578484843580473312548144610442900203565265247985546564550976724435723289297624666247935684674418868117603325806261281593378413719037238943924955877274085741135966282362763193106721357060382514254442887152906589877023423856680625901166776450727839358966536601644959153609144391132902459862060242188807417448009183469264503039581145496052228654052676496725272553819319933882997243226530495493561285061107687030878215808993975387490670647281729045828867173573105303000586136076645167624071720961141090470782549551314716665078642257836261666920413308268644174214574267682237346033030519874726249630752547960543633630157639983049125491329584885469201996544958519723770711888804039467535780543824274815473477301096898595071283422404678758221733495070552923171978588751150443266365227380501603502573111410088460947042358483807313590240913510077173949793948813061142184688143009613447113936857687916497981028674162941533323818450350080181784482364317988060883443497947703206051150533242121659128958857349455686882605353850969092935960402982618118713619556828483369397811281916611054914712416483805731465976494964146531569215799109721805847028410300528694173153527532373153045249500878187581518800314615156447564073770740022098961439234138937750297512946800381652855912829289926467970595537813845166063837126428330597144158673094574735851632185151893903271146216711815228383779829505875249782822697691614321461835203609216607002918525904157716238810383010391065426897393809125134642778347338844701765770751671444268397042348815101706901167231064172608725124761680162478484393439069367788364606593491099359158275214720362749380640577721088524470104995681138292437981278208476931579225731985482925571630931097842007340469617197091896460102706347332362145513466773659918337317572988046499916670479070806370253529002190952670353070666744678967350036570834703676333309881112517065360307108417452733002563964433340667896821473681133465222881870547446871335962511010619755236243761374511519456442193793333594411207392794004105476372366726747732579235992618924015878318955393497608385365476617805871466249190595260047214394069820212568325902033965922654033888417912286484711896882467251228378354183552293400075258206316865187130275079433360393164503976387026629881917025668725831325016331687957472029777811248536434487962818526601321326034011639998240520767133091723253262191478889477732161417549504821178703052409631566820999340775276726216946712534308446072712286153652680439930352040093862145659622442078648977666579419037446128195327816883541805521638906205222812059694261274802822911995857217067861269000490423940129053596411898677534589257055289125128765042939890889550610075923551852304168673133714809214526655242363576702244447943074362796222547671711899207308354482159297375955786574385854460819445028523296167863099823730022352090642566296479684850099511564373087943558717295760938927621289992360634932091140965012523878555060864106373640658546915478306374170806816257322333143836404972687537427918835335849909537778979043364004415979697596187929554163161291338782947874465678267621156819384376292481035494619822724135714643080670449194349117313575477023852251462157100442647234811207590910430078679631359082941846933243892425583167722406828385000563844537531315125606281753470690926728570451420660194661881586853830856879082022622614444211189862027995955847075720472590981636180405264920542673876523908199231895835194289372937814963109185400558429783080140339774478333285537556699238361330987736558384436762855693888604544252644467982372255364280010369297262804435889271193485633563494271128632242998571978869071398448928214066950611845110439059878457358040260838872377738188879643075650321115830111195188171223607598166789592316367410292281897474240707780500277373863291840300035279288645802844513739755083609307623251094215604446493961519719176201768010830924261149752008240975627953538656464432802892397239873841558197762448235088987744283265644123580215828629229847756497333042088017137113845417927907308370118694686418872787249521013870679592265695912127418059324065039553961809510883312277292682811136302844531110387585647794846826942508306109847156295035588893190647972929310585300837929143605036855209909095078529616878524697187949533912616220353861101335179781717322334159325535950830348702683903956713848030991031789277686038206518291309335679266186892665696297646824642372383904924530689265908078515046434592113144186677137514316332139654331264735125017720528644967462490620083319716124344933995590200417291717086036610960506908963278468132327493231742534480298990695134370300218432020485190379781750952733353355873678374453180937874211107688414514621736824496909620169986303101752871651896892513684703338313893053933255183789081818233099194429728174343667583800232334087537030361427268946243458842786771044962553296095536703477989698602508257697525945310759504846774891475733740196021161653485418777347759620656145992080798847727381685645525539961559324870188895773727580412516237803781935982581716437412611301343261776643304819481868619659753341516913182720637517474858444413157832505693243741288479267641371737999729095261543591838054428973561736725472157668326318183044945915784847874576066830414147706853941955038585159805208300597749734377901157203392876608064388184267818682399190422948501056958194837938391733278658784527755984424606731034448309440295924193353554895405585796132948214826002362174122627776551327343879146573828709566085927128207558802117131623323460157076665769242068403665185141160275937828400136620241192456176652835846834240452613661806597521514177023165047302341679295555551508051653415609814912335474376911818568116936865517199968267319797266790612855146314008776741341483924545019506352746861761799184869747515293258290656922190388865397288264923207565564444569202307046632552992848187855320763025731448044322626818272002953585947000990139604564002024944509293877714454845365556042038716302410519861492901060742979671634076805703004367909180382050303746373376482562884571531258606847571505895674729168873404018309675988438701948374926299395721307787395239134493403106002139242002160785480851729136172763278326205183918096527325878045633695581592505417560999763617198587755156744222535295963451807660480724900277337461447992209534969141734072233109797259073570248716353319773293544532922325041060565932210392148625152030199085590108347217176792108238881854901342897723225511945547225075822119388548782819368313852606548106078809355851189880251783054363594122321357531048537249744113050418065369091565603073630514273403592269082568082618298317632108493592673811785028807085323208525403120854794483676644319669608513326174279234197287824669726834966393161538408455310478065279133231953852910635361742906178576755214111517056327801824696461817882594873856805222646175203300964795337063208197930123387100035611442898962537621189321957513145288545491320961201783084023485230318684859529665194381535043030992718697406456699814963178889130392858728202451771804840042186083208062615168997950766084371341242335363877881080966617516431705681821487035566981405152551846308469495319182057575043059043266754766612593919342214655158708509550193047862153144017813642739949190337390404536833912770771422453449645873712360457151269709782651006515869206669914944100670221090425818628601774379853413256806505273043406959924949474450066150399316439803729716402849663145119931714415440906395699971756190018053547116471909246270169142909777111146276158913184245342769165725317045526866422285400296863663896924113569981788011574855928342975415991851606735244243464910312696061102300896479291942510255551582184891858463744530673406535967971578872825659092205865479824130931221984452835683846238511093397524783198334851506279344401387929443807027481880885621453705681630631089489476296770158650928120354413431647606394294397787931502924588063599432632004248814905232532874069922767722869190218991066223241787471443921552795301565594166172669223986011515539182639311651756170781133603153285133649653252244928860946768958545104628751685086750644332576921314119710268248219481287934045631571968130610735349124325810882583205080365791756610466151484981561971003167210505449761394244116973473697036540303439437127913553092230911492056676149949338521015670614036534613837352259788911948678049240902575683723282770265260665156443670989248071839321931056089748674072520359193076479425403027075088844834493105461097317694330573999345150061096450395197333950671837028176159805717611029046806473790966566257139710214116625838120990838702278978040950346826860768941596869691912534837789531369798770098970462048699643710814263334282244825464986836886245787380161175413667682434097411896621020758210415293844773093205586852281989095832718586711802332595251072220032029846195189676026260605198977294380817877532759426557768078860163274145878332404258531245748591785784732434092195479770525481182815991797959825445637531042041590611915627213811517825520630848877424983543969674297016002608547715519350568204779042177473285067882211063589224482812938087537556266733962298371253557488669907498202166954216996752726405369916819110824141254269240923809780103852072731728780585669680264810684354097106594938306148015694140288412584934322450220045927342286585818050261340652821302794356397253238260769202499770588659806660140473202066417966673912609639439160027102210101993702837140062159911232700217576203854458672769125159295245759720586896200403026721146586614053545788918421075536183109733062570888899435174093277080789621706770150853469920781327693942173755821341587589068464271704145993398599584907221853546360342946465638677014265280400684536972824228071999739587025848471588041430734190747718105615643467867746521139598415490025819320522905508995637789651392767316376511141387782210136045154208122686266311800762358065599182356318289546167933132158219689983303226956912482902682742562956882890951086189973976745290171180581408168481701573057620693909613412402204890864681757904552161551141827082091941308643128752309062650317371816701150436066224566268088838544515729608051056365801398632700878033879524508762180929699446191226165581504065642383358322411410368865560901282689855037225200599153216302477288730118415860928953243258084527371265976649892602187894583446506824661341966822666806639851892328985271557775491086085232594029385055865408461916306201785026239230612752353078156174629354046816769484345684696264666983054596622557352665971692310835346574330345201496241524653879367068558567438787799759733850664614404312057082568243566243264611755532824513206338793606426398858650893765086655494206257608941685693604563423189826136067320528442662007709432015815995036214543984892269361804846433637715492042002645350444584698809568222374258222855882789968774096068488352877738383142437491050195487809265738698926470769757932536635347362729215411426989493149132973739280148089755991263176726327550836049914656986188523756036995278451253055657993910940418752312028175505678115214204318754518113471033399453567830296130632358712878292350291176995772240851095811885600382819425746733946859746508324478039308526824527611422610279849667882833495985958014136406544044904587156035768010650365190466997906703837332597903821402668562989161094199987830477977441561503597197569903604778604440785745969156513821971317777734960593729892222534437766021930681857290367110308403828050424387397529924995329948939921686795128871033695479567097677596871009758030829941780656916571404797474936364060896633110223920424892718562704497565532610704069917480058569081099089548670722155086358551588683391157320485122061215935067590527729478682246827509303529818583205679553217829813233875900878129084480249700435621359221893555421656631016079536513126020731283339909012365473738538062828153338806425078848354593519707062428992917258579885576722482493469235679741940285114466917413417283111876766818175178154974443863226366736031059196645787709286298438367096300335933725467680069467499909440931418935197607639590412522403641379231449900907670483429271445608187324020277292393554157047806016393560149763762182381033522232890923572325247499885048067389323525383500510263730424495499130718179426732948176129997648391216839998908481381658481720639121202961279302722168225045179081535042109498981072896761625693992602288769693937005187754145411851890095543833095500128837825669543033101870261359674246173474451228851808299126983017321230451884981315322155989426954244248673352579392307130099271620208255400787072330291414290702789609332401962725750210933255324797504516682254234045089348533324403979456676711927551725019997708120073528175550873441080737501788656523364635812866580670909840195177187069318284588267347979941912802844784345831364593611297335034936808260937486987558839356538174069247197363090244587530678334043312764406429614731545495099078344877149268175885053368093750005550979938553594526646815969088249884254428243750041746556055016888568949674554438216069776702697157696519299935296262333182662282071313712716657449342194593759461100188202234751465974594013604537342017369078900004007398193157716190449076813514282475822804094059889026022698518255021018566613789118518865859608084164256119389391264701034534732838558655538866932858543792259691591598582535802657208941556924876214292388229473818284170474930333525978514942722320793145416739308926751303841482388060395770004407198042502238999916987737347202218320069564664408185847098410976119863674399888748702288385011759248916565214546843591360560021875820058954120036097112067812578695283900444351683579270658485758109768365219991018268073673245141452415153257605271035668837906171755807778795902163789814583104706779368230557138443440606785024625551792656071322197883437365090995952783614348640636205281691939705970217021667929894789600090514708714961369322666305228197508897774024661140458911672537766440222671471229951151624033617881679464177246524344329265010491386519425837542838886652005593924469815109793867033638413339131777000951938840890851243026333877482047177068521520544305276389089112946918609981082936282961399989478134865584383041240801873372522978899733132202333335987926642791396387737460062342731173436754915777886939051823043272012214390567646298815125607368226168423465650669620628282859526350836831070319248452496846476074443081172225109466966238064479543952636729745422601763049244880363951554887868547504711176462185190973960030994451631839790904451546992926093730097537412791241442962734438292246577722247574954339022031246782698069255135790093514932928713132636296283824008266832812586268454522044334878454397088449487448684427415958411238210941094006226613223371481809171527041133037308679802333566255552440291287322458475809170568522887554612352531686985995739790461654054890515084932431410095449297397334371300261611842343335002853735931084493419009859313463150746745937117993181979237854420065153129725284950418550289719097671413347458337380367124698634870313774680629978154230863821318174197007261464601533093656004192580013539666996526642684130218028293355797487475150542981549502578133197157285640759714023684275189549422742879177088739931596862486920921838596493421040431594601794077020970428521385813104989350571619913186328653424264834109846015474715734651184107559529340562123342071075931760092972222917153919505120979479996210276995493277547148424188113124421851635354366780917880121039406318342668232723614810087913563184193944074400000020651241097090115446220825337562270086194397603167464030037171560664411210284016084866369808922429203707401145416737524009418498819459380189832249442354578023256629134645025981931351423342611135080339166792819794476094517020997632103158198364641168737218921911389876768461303546227036899870881483511952646784326359096061070739854717639472509669848383820755259857413438295366884308513205076426798185817815788056573628577324171420253648601799962441876999872888804170580893843687132338423914822285568896284471765223814674175029590016487790058849831286477480407475595110497851792057602582603288109754011617841039164041788939682140507881575497413757336997711464163036851800068102118379858493913037721693270703130811009983095221159466631384296982518861383773854535925194635985429767708644654123929591836266094263942708064706075219923980783237358798820516481950692318906711800446498751709909979900020671710215406281991004707258633142090505396170787878142555678201300875442645229957683266757709158189715737432850344877702847733425342431295550047738114568208344247343496544929502270432466561338343828440563277268125158467734124526783241545350253573063926687226489187301386880367871743773831272945217558791867709670520632159570091273556679942194188558690863824371652669539531915581994312990167794769961244737657221122396671143145348339888308788106472726956314213678731306378350284933844004198724531538225392232209225298926342191000074318091592696527655035644027580633217085239808870166459729569875652231485870496109437295505607599301574917545303951011217758746262472258090053525770922187145661490148423928147902289750267060551777528126663244728440341531399236037845248645045749494529414359698587668031857404946489919370523756221679157359175122237772519306540269608674683717879240004803893267340482396305758047458143591664086334293012096942379962669398733948440446637417238944756499755791140482728310365361208405057637360065404060663154368075449918453718779613880795113316906626929645900669151442129735202430154440704000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000).
       
  2784     self assert:(nrDiv * 1099511627776 = nr).
       
  2785 
       
  2786     divMod := nr divMod: 1099511627776.
       
  2787     self assert:((divMod at:1) = nrDiv).
       
  2788     self assert:((divMod at:2) = 0).
       
  2789     
       
  2790     divMod := nr divMod: 1099511627775.
       
  2791     self assert:((divMod at:1) = (nr // 1099511627775)).
       
  2792     self assert:((divMod at:2) = (nr \\ 1099511627775)).
       
  2793 
       
  2794     self assert:((divMod at:1) * 1099511627775 + (divMod at:2) = nr).
       
  2795     
       
  2796     "
       
  2797      self basicNew testLargeDivision3
       
  2798     "
       
  2799 !
       
  2800 
       
  2801 testLargeDivision4
       
  2802     self assert:(9000000000 \\ 4000000000)    = (900 \\ 400 * 10000000).
       
  2803     self assert:(-9000000000 \\ 4000000000)   = (-900 \\ 400 * 10000000).
       
  2804     self assert:(9000000000 \\ -4000000000)   = (900 \\ -400 * 10000000).
       
  2805     self assert:(-9000000000 \\ -4000000000)  = (-900 \\ -400 * 10000000).
       
  2806     self assert:(16000000000 \\ 4000000000)   = (1600 \\ 400 * 10000000).
       
  2807     self assert:(-16000000000 \\ 4000000000)  = (-1600 \\ 400 * 10000000).
       
  2808     self assert:(16000000000 \\ -4000000000)  = (1600 \\ -400 * 10000000).
       
  2809     self assert:(-16000000000 \\ -4000000000) = (-1600 \\ -400 * 10000000).
       
  2810 
       
  2811     self assert:(9000000000000000000 \\ 4000000000000000000)    = (900 \\ 400 * 10000000000000000).
       
  2812     self assert:(-9000000000000000000 \\ 4000000000000000000)   = (-900 \\ 400 * 10000000000000000).
       
  2813     self assert:(9000000000000000000 \\ -4000000000000000000)   = (900 \\ -400 * 10000000000000000).
       
  2814     self assert:(-9000000000000000000 \\ -4000000000000000000)  = (-900 \\ -400 * 10000000000000000).
       
  2815     self assert:(16000000000000000000 \\ 4000000000000000000)   = (1600 \\ 400 * 10000000000000000).
       
  2816     self assert:(-16000000000000000000 \\ 4000000000000000000)  = (-1600 \\ 400 * 10000000000000000).
       
  2817     self assert:(16000000000000000000 \\ -4000000000000000000)  = (1600 \\ -400 * 10000000000000000).
       
  2818     self assert:(-16000000000000000000 \\ -4000000000000000000) = (-1600 \\ -400 * 10000000000000000).
       
  2819 
       
  2820     self assert:(9000000000 \\ 7) = 5.
       
  2821     self assert:(-9000000000 \\ 7) = 2.
       
  2822     self assert:(9000000000 \\ -7) = -2.
       
  2823     self assert:(-9000000000 \\ -7) = -5.
       
  2824 
       
  2825     self assert:(900 rem: 400) = 100.
       
  2826     self assert:(-900 rem: 400) = -100.
       
  2827     self assert:(900 rem: -400) = 100.
       
  2828     self assert:(-900 rem: -400) = -100.
       
  2829 
       
  2830     self assert:(9000000000 rem: 4000000000) = 1000000000.
       
  2831     self assert:(-9000000000 rem: 4000000000) = -1000000000.
       
  2832     self assert:(9000000000 rem: -4000000000) = 1000000000.
       
  2833     self assert:(-9000000000 rem: -4000000000) = -1000000000.
       
  2834     
       
  2835     "
       
  2836      self basicNew testLargeDivision4
       
  2837     "
       
  2838 !
       
  2839 
       
  2840 testLargeDivision5
       
  2841     self assert:(9000000000 quo: 4000000000)    = ((900 quo: 400) ).
       
  2842     self assert:(-9000000000 quo: 4000000000)   = ((-900 quo: 400) ).
       
  2843     self assert:(9000000000 quo: -4000000000)   = ((900 quo: -400) ).
       
  2844     self assert:(-9000000000 quo: -4000000000)  = ((-900 quo: -400) ).
       
  2845     self assert:(16000000000 quo: 4000000000)   = ((1600 quo: 400) ).
       
  2846     self assert:(-16000000000 quo: 4000000000)  = ((-1600 quo: 400) ).
       
  2847     self assert:(16000000000 quo: -4000000000)  = ((1600 quo: -400) ).
       
  2848     self assert:(-16000000000 quo: -4000000000) = ((-1600 quo: -400) ).
       
  2849 
       
  2850     self assert:(9000000000000000000 quo: 4000000000000000000)    = ((900 quo: 400) ).
       
  2851     self assert:(-9000000000000000000 quo: 4000000000000000000)   = ((-900 quo: 400) ).
       
  2852     self assert:(9000000000000000000 quo: -4000000000000000000)   = ((900 quo: -400) ).
       
  2853     self assert:(-9000000000000000000 quo: -4000000000000000000)  = ((-900 quo: -400) ).
       
  2854     self assert:(16000000000000000000 quo: 4000000000000000000)   = ((1600 quo: 400) ).
       
  2855     self assert:(-16000000000000000000 quo: 4000000000000000000)  = ((-1600 quo: 400) ).
       
  2856     self assert:(16000000000000000000 quo: -4000000000000000000)  = ((1600 quo: -400) ).
       
  2857     self assert:(-16000000000000000000 quo: -4000000000000000000) = ((-1600 quo: -400) ).
       
  2858 
       
  2859     self assert:(9000000000 quo: 7) = 1285714285.
       
  2860     self assert:(-9000000000 quo: 7) = -1285714285.
       
  2861     self assert:(9000000000 quo: -7) = -1285714285.
       
  2862     self assert:(-9000000000 quo: -7) = 1285714285.
       
  2863     
       
  2864     "
       
  2865      self basicNew testLargeDivision5
       
  2866     "
       
  2867 !
       
  2868 
       
  2869 testLargeDivision6
       
  2870     |t|
       
  2871 
       
  2872     t := 20 factorial.
       
  2873     self assert:(t = 2432902008176640000).
       
  2874     t := t / 20.
       
  2875     self assert:(t = 19 factorial).
       
  2876     self assert:(t = 121645100408832000).
       
  2877     
       
  2878     t := t / 19.
       
  2879     self assert:(t = 18 factorial).
       
  2880     self assert:(t = 6402373705728000).
       
  2881 
       
  2882     t := t / 18.
       
  2883     self assert:(t = 17 factorial).
       
  2884     self assert:(t = 355687428096000).
       
  2885 
       
  2886     t := t / 17.
       
  2887     self assert:(t = 16 factorial).
       
  2888     self assert:(t = 20922789888000).
       
  2889 
       
  2890     t := t / 16.
       
  2891     self assert:(t = 15 factorial).
       
  2892     self assert:(t = 1307674368000).
       
  2893 
       
  2894     t := t / 15.
       
  2895     self assert:(t = 14 factorial).
       
  2896     self assert:(t = 87178291200).
       
  2897 
       
  2898     t := t / 14.
       
  2899     self assert:(t = 13 factorial).
       
  2900     self assert:(t = 6227020800).
       
  2901 
       
  2902     t := t / 13.
       
  2903     self assert:(t = 12 factorial).
       
  2904     self assert:(t = 479001600).
       
  2905 
       
  2906     t := t / 12.
       
  2907     self assert:(t = 11 factorial).
       
  2908     self assert:(t = 39916800).
       
  2909 
       
  2910     t := t / 11.
       
  2911     self assert:(t = 10 factorial).
       
  2912     self assert:(t = 3628800).
       
  2913 
       
  2914     "
       
  2915      self basicNew testLargeDivision6
       
  2916     "
       
  2917 !
       
  2918 
       
  2919 testLargeDivision7
       
  2920     self assert:(  90000000000000000000 rem: 40000000000000000000 ) = 10000000000000000000. 
       
  2921     self assert:( (((90000000000000000000 quo: 40000000000000000000)*40000000000000000000) + ( 90000000000000000000 rem: 40000000000000000000 )) = 90000000000000000000 ).
       
  2922 
       
  2923     self assert:(  -90000000000000000000 rem: 40000000000000000000 ) = -10000000000000000000. 
       
  2924     self assert:( (((-90000000000000000000 quo: 40000000000000000000)*40000000000000000000) + ( -90000000000000000000 rem: 40000000000000000000 )) = -90000000000000000000 ).
       
  2925 
       
  2926     self assert:(  90000000000000000000 rem: -40000000000000000000 ) = 10000000000000000000. 
       
  2927     self assert:( (((90000000000000000000 quo: -40000000000000000000) * -40000000000000000000) + ( 90000000000000000000 rem: -40000000000000000000 )) = 90000000000000000000 ).
       
  2928 
       
  2929     self assert:(  -90000000000000000000 rem: -40000000000000000000 ) = -10000000000000000000. 
       
  2930     self assert:( (((-90000000000000000000 quo: -40000000000000000000) * -40000000000000000000) + ( -90000000000000000000 rem: -40000000000000000000 )) = -90000000000000000000 ).
       
  2931 
       
  2932     "
       
  2933      self basicNew testLargeDivision7
       
  2934     "
       
  2935 
       
  2936     "Created: / 05-07-2017 / 16:37:06 / cg"
       
  2937 !
       
  2938 
       
  2939 testLargeIntegerHelpers
       
  2940     |t1 t2|
       
  2941 
       
  2942     "/ mul2
       
  2943 
       
  2944     t1 := 16r12345678901234567890.
       
  2945     t2 := t1 deepCopy.
       
  2946     self assert:(t2 mul2 = (t1 * 2)).
       
  2947 
       
  2948     t1 := 16r1234567890123456789012345678901234567890.
       
  2949     t2 := t1 deepCopy.
       
  2950     self assert:(t2 mul2 = (t1 * 2)).
       
  2951 
       
  2952     t1 := 16r123456789012345678901234567890123456789012345678901234567890.
       
  2953     t2 := t1 deepCopy.
       
  2954     self assert:(t2 mul2 = (t1 * 2)).
       
  2955 
       
  2956     t1 := 16r12345678901234567890123456789012345678901234567890123456789012345678901234567890.
       
  2957     t2 := t1 deepCopy.
       
  2958     self assert:(t2 mul2 = (t1 * 2)).
       
  2959 
       
  2960     t1 := 10000 factorial.
       
  2961     t2 := t1 deepCopy.
       
  2962     self assert:(t2 mul2 = (t1 * 2)).
       
  2963 
       
  2964     t1 := 16r123456789012345678901234567890123456789012345678901234567890.
       
  2965     t2 := t1 deepCopy.
       
  2966     self assert:(t2 mul2 = (t1 * 2)).
       
  2967 
       
  2968 "/    t1 := 1000 factorial.
       
  2969 "/    t := Time millisecondsToRun:[ 100000 timesRepeat:[ t1 mul2. ] ].
       
  2970 "/    Transcript showCR:t.
       
  2971 
       
  2972     "/ div2
       
  2973 
       
  2974     t1 := 16r12345678901234567890.
       
  2975     t2 := t1 deepCopy.
       
  2976 
       
  2977     t2 div2.
       
  2978     "/ do not compare t2 = t1 // x, because t2 may be unnormalized
       
  2979     self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
       
  2980 
       
  2981     t2 div2.
       
  2982     self assert:(t2 printStringRadix:16) = ((t1 // 4) printStringRadix:16).
       
  2983     t2 div2.
       
  2984     self assert:(t2 printStringRadix:16) = ((t1 // 8) printStringRadix:16).
       
  2985     t2 div2.
       
  2986     self assert:(t2 printStringRadix:16) = ((t1 // 16) printStringRadix:16).
       
  2987     t2 div2.
       
  2988     self assert:(t2 printStringRadix:16) = ((t1 // 32) printStringRadix:16).
       
  2989     t2 div2.
       
  2990     self assert:(t2 printStringRadix:16) = ((t1 // 64) printStringRadix:16).
       
  2991     t2 div2.
       
  2992     self assert:(t2 printStringRadix:16) = ((t1 // 128) printStringRadix:16).
       
  2993     t2 div2.
       
  2994     self assert:(t2 printStringRadix:16) = ((t1 // 256) printStringRadix:16).
       
  2995     t2 div2.
       
  2996     self assert:(t2 printStringRadix:16) = ((t1 // 512) printStringRadix:16).
       
  2997     t2 div2.
       
  2998     self assert:(t2 printStringRadix:16) = ((t1 // 1024) printStringRadix:16).
       
  2999 
       
  3000     t1 := 16r1234567890123456789012345678901234567890.
       
  3001     t2 := t1 deepCopy.
       
  3002     t2 div2.
       
  3003     self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
       
  3004 
       
  3005     t1 := 16r123456789012345678901234567890123456789012345678901234567890.
       
  3006     t2 := t1 deepCopy.
       
  3007     t2 div2.
       
  3008     self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
       
  3009 
       
  3010     t1 := 16r12345678901234567890123456789012345678901234567890123456789012345678901234567890.
       
  3011     t2 := t1 deepCopy.
       
  3012     t2 div2.
       
  3013     self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
       
  3014     t2 div2.
       
  3015     self assert:(t2 printStringRadix:16) = ((t1 // 4) printStringRadix:16).
       
  3016     t2 div2.
       
  3017     self assert:(t2 printStringRadix:16) = ((t1 // 8) printStringRadix:16).
       
  3018     t2 div2.
       
  3019     self assert:(t2 printStringRadix:16) = ((t1 // 16) printStringRadix:16).
       
  3020 
       
  3021     t1 := 10000 factorial.
       
  3022     t2 := t1 deepCopy.
       
  3023     t2 div2.
       
  3024     self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
       
  3025 
       
  3026     t1 := 16r123456789012345678901234567890123456789012345678901234567890.
       
  3027     t2 := t1 deepCopy.
       
  3028     t2 div2.
       
  3029     self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
       
  3030 
       
  3031     t1 := 12345678901234567890.
       
  3032     t2 := t1 divMod:1000.
       
  3033     self assert:(t2 at:1) = 12345678901234567.
       
  3034     self assert:(t2 at:2) = 890.
       
  3035 
       
  3036 
       
  3037     "
       
  3038      self basicNew testLargeIntegerHelpers
       
  3039     "
       
  3040 
       
  3041     "Modified: / 20.5.1999 / 09:41:19 / cg"
       
  3042 !
       
  3043 
       
  3044 testLargeIntegerHelpers2
       
  3045     |t1 r|
       
  3046 
       
  3047     "/ absSubtract:
       
  3048 
       
  3049     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  3050     r := t1 absDestructiveSubtract:16r00ffffffffffffffff.
       
  3051     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  3052     self assert:(r == true).
       
  3053 
       
  3054     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  3055     r := t1 absDestructiveSubtract:16r010000000000000000.
       
  3056     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  3057     self assert:(r == false).
       
  3058 
       
  3059     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  3060     r := t1 absDestructiveSubtract:16r00ffffffffffffffffff.
       
  3061     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  3062     self assert:(r == true).
       
  3063 
       
  3064     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  3065     r := t1 absDestructiveSubtract:16r01000000000000000000.
       
  3066     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  3067     self assert:(r == false).
       
  3068 
       
  3069     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  3070     r := t1 absDestructiveSubtract:16r00ffffffffffffffffffff.
       
  3071     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  3072     self assert:(r == true).
       
  3073 
       
  3074     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  3075     r := t1 absDestructiveSubtract:16r0100000000000000000000.
       
  3076     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  3077     self assert:(r == false).
       
  3078 
       
  3079     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  3080     r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffff.
       
  3081     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  3082     self assert:(r == true).
       
  3083 
       
  3084     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  3085     r := t1 absDestructiveSubtract:16r010000000000000000000000.
       
  3086     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  3087     self assert:(r == false).
       
  3088 
       
  3089     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  3090     r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffffff.
       
  3091     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  3092     self assert:(r == true).
       
  3093 
       
  3094     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  3095     r := t1 absDestructiveSubtract:16r01000000000000000000000000.
       
  3096     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  3097     self assert:(r == false).
       
  3098 
       
  3099     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  3100     r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffffffff.
       
  3101     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  3102     self assert:(r == true).
       
  3103 
       
  3104     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  3105     r := t1 absDestructiveSubtract:16r0100000000000000000000000000.
       
  3106     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  3107     self assert:(r == false).
       
  3108 
       
  3109     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  3110     r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffffffffff.
       
  3111     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  3112     self assert:(r == true).
       
  3113 
       
  3114     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  3115     r := t1 absDestructiveSubtract:16r010000000000000000000000000000.
       
  3116     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  3117     self assert:(r == false).
       
  3118 
       
  3119     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  3120     r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffffffffffff.
       
  3121     self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  3122     self assert:(r == true).
       
  3123 
       
  3124     t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
       
  3125     r := t1 absDestructiveSubtract:16r01000000000000000000000000000000.
       
  3126     self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
       
  3127     self assert:(r == false).
       
  3128     "
       
  3129      self basicNew testLargeIntegerHelpers2
       
  3130     "
       
  3131 !
       
  3132 
       
  3133 testLargeIntegerHelpers3
       
  3134     "/ absDivMod:
       
  3135 
       
  3136      self assert:(9000000000000000000 absDivMod: 4000) = #(2250000000000000 0).
       
  3137      self assert:(-9000000000000000000 absDivMod: 4000) = #(2250000000000000 0).
       
  3138      self assert:(9000000000000000000 absDivMod: -4000) = #(2250000000000000 0).
       
  3139      self assert:(-9000000000000000000 absDivMod: -4000) = #(2250000000000000 0).
       
  3140 
       
  3141      self assert:(9000000000000000001 absDivMod: 4000) = #(2250000000000000 1).
       
  3142      self assert:(-9000000000000000001 absDivMod: 4000) = #(2250000000000000 1).
       
  3143      self assert:(9000000000000000001 absDivMod: -4000) = #(2250000000000000 1).
       
  3144      self assert:(-9000000000000000001 absDivMod: -4000) = #(2250000000000000 1).
       
  3145 
       
  3146      self assert:(9000000000000000000 absDivMod: 40000) = #(225000000000000 0).
       
  3147      self assert:(-9000000000000000000 absDivMod: 40000) = #(225000000000000 0).
       
  3148      self assert:(9000000000000000000 absDivMod: -40000) = #(225000000000000 0).
       
  3149      self assert:(-9000000000000000000 absDivMod: -40000) = #(225000000000000 0).
       
  3150 
       
  3151      self assert:(9000000000000000000 absDivMod: 400000) = #(22500000000000 0).
       
  3152      self assert:(-9000000000000000000 absDivMod: 400000) = #(22500000000000 0).
       
  3153      self assert:(9000000000000000000 absDivMod: -400000) = #(22500000000000 0).
       
  3154      self assert:(-9000000000000000000 absDivMod: -400000) = #(22500000000000 0).
       
  3155 
       
  3156      self assert:(9000000000000000000 absDivMod: 4000000) = #(2250000000000 0).
       
  3157      self assert:(-9000000000000000000 absDivMod: 4000000) = #(2250000000000 0).
       
  3158      self assert:(9000000000000000000 absDivMod: -4000000) = #(2250000000000 0).
       
  3159      self assert:(-9000000000000000000 absDivMod: -4000000) = #(2250000000000 0).
       
  3160 
       
  3161      self assert:(9000000000000000000 absDivMod: 40000000) = #(225000000000 0).
       
  3162      self assert:(-9000000000000000000 absDivMod: 40000000) = #(225000000000 0).
       
  3163      self assert:(9000000000000000000 absDivMod: -40000000) = #(225000000000 0).
       
  3164      self assert:(-9000000000000000000 absDivMod: -40000000) = #(225000000000 0).
       
  3165 
       
  3166      self assert:(9000000000000000000 absDivMod: 400000000) = #(22500000000 0).
       
  3167      self assert:(-9000000000000000000 absDivMod: 400000000) = #(22500000000 0).
       
  3168      self assert:(9000000000000000000 absDivMod: -400000000) = #(22500000000 0).
       
  3169      self assert:(-9000000000000000000 absDivMod: -400000000) = #(22500000000 0).
       
  3170 
       
  3171      self assert:(9000000000000000000 absDivMod: 4000000000) = #(2250000000 0).
       
  3172      self assert:(-9000000000000000000 absDivMod: 4000000000) = #(2250000000 0).
       
  3173      self assert:(9000000000000000000 absDivMod: -4000000000) = #(2250000000 0).
       
  3174      self assert:(-9000000000000000000 absDivMod: -4000000000) = #(2250000000 0).
       
  3175 
       
  3176      self assert:(9000000000000000000 absDivMod: 40000000000) = #(225000000 0).
       
  3177      self assert:(-9000000000000000000 absDivMod: 40000000000) = #(225000000 0).
       
  3178      self assert:(9000000000000000000 absDivMod: -40000000000) = #(225000000 0).
       
  3179      self assert:(-9000000000000000000 absDivMod: -40000000000) = #(225000000 0).
       
  3180 
       
  3181      self assert:(9000000000000000000 absDivMod: 400000000000) = #(22500000 0).
       
  3182      self assert:(-9000000000000000000 absDivMod: 400000000000) = #(22500000 0).
       
  3183      self assert:(9000000000000000000 absDivMod: -400000000000) = #(22500000 0).
       
  3184      self assert:(-9000000000000000000 absDivMod: -400000000000) = #(22500000 0).
       
  3185 
       
  3186      self assert:(9000000000000000000 absDivMod: 4000000000000) = #(2250000 0).
       
  3187      self assert:(-9000000000000000000 absDivMod: 4000000000000) = #(2250000 0).
       
  3188      self assert:(9000000000000000000 absDivMod: -4000000000000) = #(2250000 0).
       
  3189      self assert:(-9000000000000000000 absDivMod: -4000000000000) = #(2250000 0).
       
  3190 
       
  3191      self assert:(9000000000000000000 absDivMod: 40000000000000) = #(225000 0).
       
  3192      self assert:(-9000000000000000000 absDivMod: 40000000000000) = #(225000 0).
       
  3193      self assert:(9000000000000000000 absDivMod: -40000000000000) = #(225000 0).
       
  3194      self assert:(-9000000000000000000 absDivMod: -40000000000000) = #(225000 0).
       
  3195 
       
  3196      self assert:(9000000000000000000 absDivMod: 400000000000000) = #(22500 0).
       
  3197      self assert:(-9000000000000000000 absDivMod: 400000000000000) = #(22500 0).
       
  3198      self assert:(9000000000000000000 absDivMod: -400000000000000) = #(22500 0).
       
  3199      self assert:(-9000000000000000000 absDivMod: -400000000000000) = #(22500 0).
       
  3200 
       
  3201      self assert:(9000000000000000000 absDivMod: 4000000000000000) = #(2250 0).
       
  3202      self assert:(-9000000000000000000 absDivMod: 4000000000000000) = #(2250 0).
       
  3203      self assert:(9000000000000000000 absDivMod: -4000000000000000) = #(2250 0).
       
  3204      self assert:(-9000000000000000000 absDivMod: -4000000000000000) = #(2250 0).
       
  3205 
       
  3206      self assert:(9000000000000000000 absDivMod: 4000000000000000000) = #(2 1000000000000000000).
       
  3207      self assert:(-9000000000000000000 absDivMod: 4000000000000000000) = #(2 1000000000000000000).
       
  3208      self assert:(9000000000000000000 absDivMod: -4000000000000000000) = #(2 1000000000000000000).
       
  3209      self assert:(-9000000000000000000 absDivMod: -4000000000000000000) = #(2 1000000000000000000).
       
  3210 
       
  3211     "
       
  3212      self basicNew testLargeIntegerHelpers3
       
  3213     "
       
  3214 !
       
  3215 
       
  3216 testLargeIntegerHelpers4
       
  3217     "/ absDivMod:
       
  3218 
       
  3219      self assert:(9000000000000000000 absMod: 4000) = 0.
       
  3220      self assert:(-9000000000000000000 absMod: 4000) = 0.
       
  3221      self assert:(9000000000000000000 absMod: -4000) = 0.
       
  3222      self assert:(-9000000000000000000 absMod: -4000) = 0.
       
  3223 
       
  3224      self assert:(9000000000000000001 absMod: 4000) = 1.
       
  3225      self assert:(-9000000000000000001 absMod: 4000) = 1.
       
  3226      self assert:(9000000000000000001 absMod: -4000) = 1.
       
  3227      self assert:(-9000000000000000001 absMod: -4000) = 1.
       
  3228 
       
  3229      self assert:(9000000000000000000 absMod: 40000) = 0.
       
  3230      self assert:(-9000000000000000000 absMod: 40000) = 0.
       
  3231      self assert:(9000000000000000000 absMod: -40000) = 0.
       
  3232      self assert:(-9000000000000000000 absMod: -40000) = 0.
       
  3233 
       
  3234      self assert:(9000000000000000000 absMod: 400000) = 0.
       
  3235      self assert:(-9000000000000000000 absMod: 400000) = 0.
       
  3236      self assert:(9000000000000000000 absMod: -400000) = 0.
       
  3237      self assert:(-9000000000000000000 absMod: -400000) = 0.
       
  3238 
       
  3239      self assert:(9000000000000000000 absMod: 4000000) = 0.
       
  3240      self assert:(-9000000000000000000 absMod: 4000000) = 0.
       
  3241      self assert:(9000000000000000000 absMod: -4000000) = 0.
       
  3242      self assert:(-9000000000000000000 absMod: -4000000) = 0.
       
  3243 
       
  3244      self assert:(9000000000000000000 absMod: 40000000) = 0.
       
  3245      self assert:(-9000000000000000000 absMod: 40000000) = 0.
       
  3246      self assert:(9000000000000000000 absMod: -40000000) = 0.
       
  3247      self assert:(-9000000000000000000 absMod: -40000000) = 0.
       
  3248 
       
  3249      self assert:(9000000000000000000 absMod: 400000000) = 0.
       
  3250      self assert:(-9000000000000000000 absMod: 400000000) = 0.
       
  3251      self assert:(9000000000000000000 absMod: -400000000) = 0.
       
  3252      self assert:(-9000000000000000000 absMod: -400000000) = 0.
       
  3253 
       
  3254      self assert:(9000000000000000000 absMod: 4000000000) = 0.
       
  3255      self assert:(-9000000000000000000 absMod: 4000000000) = 0.
       
  3256      self assert:(9000000000000000000 absMod: -4000000000) = 0.
       
  3257      self assert:(-9000000000000000000 absMod: -4000000000) = 0.
       
  3258 
       
  3259      self assert:(9000000000000000000 absMod: 40000000000) = 0.
       
  3260      self assert:(-9000000000000000000 absMod: 40000000000) = 0.
       
  3261      self assert:(9000000000000000000 absMod: -40000000000) = 0.
       
  3262      self assert:(-9000000000000000000 absMod: -40000000000) = 0.
       
  3263 
       
  3264      self assert:(9000000000000000000 absMod: 400000000000) = 0.
       
  3265      self assert:(-9000000000000000000 absMod: 400000000000) = 0.
       
  3266      self assert:(9000000000000000000 absMod: -400000000000) = 0.
       
  3267      self assert:(-9000000000000000000 absMod: -400000000000) = 0.
       
  3268 
       
  3269      self assert:(9000000000000000000 absMod: 4000000000000) = 0.
       
  3270      self assert:(-9000000000000000000 absMod: 4000000000000) = 0.
       
  3271      self assert:(9000000000000000000 absMod: -4000000000000) = 0.
       
  3272      self assert:(-9000000000000000000 absMod: -4000000000000) = 0.
       
  3273 
       
  3274      self assert:(9000000000000000000 absMod: 40000000000000) = 0.
       
  3275      self assert:(-9000000000000000000 absMod: 40000000000000) = 0.
       
  3276      self assert:(9000000000000000000 absMod: -40000000000000) = 0.
       
  3277      self assert:(-9000000000000000000 absMod: -40000000000000) = 0.
       
  3278 
       
  3279      self assert:(9000000000000000000 absMod: 400000000000000) = 0.
       
  3280      self assert:(-9000000000000000000 absMod: 400000000000000) = 0.
       
  3281      self assert:(9000000000000000000 absMod: -400000000000000) = 0.
       
  3282      self assert:(-9000000000000000000 absMod: -400000000000000) = 0.
       
  3283 
       
  3284      self assert:(9000000000000000000 absMod: 4000000000000000) = 0.
       
  3285      self assert:(-9000000000000000000 absMod: 4000000000000000) = 0.
       
  3286      self assert:(9000000000000000000 absMod: -4000000000000000) = 0.
       
  3287      self assert:(-9000000000000000000 absMod: -4000000000000000) = 0.
       
  3288 
       
  3289      self assert:(9000000000000000000 absMod: 4000000000000000000) = 1000000000000000000.
       
  3290      self assert:(-9000000000000000000 absMod: 4000000000000000000) = 1000000000000000000.
       
  3291      self assert:(9000000000000000000 absMod: -4000000000000000000) = 1000000000000000000.
       
  3292      self assert:(-9000000000000000000 absMod: -4000000000000000000) = 1000000000000000000.
       
  3293 
       
  3294     "
       
  3295      self basicNew testLargeIntegerHelpers4
       
  3296     "
       
  3297 
       
  3298     "Created: / 05-07-2017 / 16:15:30 / cg"
       
  3299 !
       
  3300 
       
  3301 testLargeMultiplication
       
  3302     |t1 t2 p|
       
  3303 
       
  3304     "multiplication"
       
  3305     t1 := 100.
       
  3306     self assert:(t1 * t1 == 10000).
       
  3307     self assert:((t1 perform:'*' asSymbol with:t1) == 10000).
       
  3308     self assert:((t1 * t1) printString = '10000').
       
  3309     self assert:((t1 perform:'*' asSymbol with:t1) printString = '10000').
       
  3310 
       
  3311     t1 := 1000.
       
  3312     self assert:(t1 * t1 == 1000000).
       
  3313     self assert:((t1 perform:'*' asSymbol with:t1) == 1000000).
       
  3314     self assert:((t1 * t1) printString = '1000000').
       
  3315     self assert:((t1 perform:'*' asSymbol with:t1) printString = '1000000').
       
  3316 
       
  3317     t1 := 10000.
       
  3318     self assert:(t1 * t1 == 100000000).
       
  3319     self assert:((t1 perform:'*' asSymbol with:t1) == 100000000).
       
  3320     self assert:((t1 * t1) printString = '100000000').
       
  3321     self assert:((t1 perform:'*' asSymbol with:t1) printString = '100000000').
       
  3322 
       
  3323     t1 := 100000.
       
  3324     SmallInteger maxBytes == 4 ifTrue:[
       
  3325         self assert:(t1 * t1 = 10000000000).
       
  3326         self assert:((t1 perform:'*' asSymbol with:t1) = 10000000000).
       
  3327     ].
       
  3328     SmallInteger maxBytes == 8 ifTrue:[
       
  3329         self assert:(t1 * t1 == 10000000000).
       
  3330         self assert:((t1 perform:'*' asSymbol with:t1) == 10000000000).
       
  3331     ].
       
  3332 
       
  3333     self assert:((t1 * t1) printString = '10000000000').
       
  3334     self assert:((t1 perform:'*' asSymbol with:t1) printString = '10000000000').
       
  3335 
       
  3336     t1 := 1000000.
       
  3337     self assert:((t1 * t1) printString = '1000000000000').
       
  3338     self assert:((t1 perform:'*' asSymbol with:t1) printString = '1000000000000').
       
  3339 
       
  3340     t1 := 10000000.
       
  3341     self assert:((t1 * t1) printString = '100000000000000').
       
  3342     self assert:((t1 perform:'*' asSymbol with:t1) printString = '100000000000000').
       
  3343 
       
  3344     t1 := 100000000.
       
  3345     self assert:((t1 * t1) printString = '10000000000000000').
       
  3346     self assert:((t1 perform:'*' asSymbol with:t1) printString = '10000000000000000').
       
  3347 
       
  3348     t1 := 1000000000.
       
  3349     self assert:((t1 * t1) printString = '1000000000000000000').
       
  3350     self assert:((t1 perform:'*' asSymbol with:t1) printString = '1000000000000000000').
       
  3351 
       
  3352 
       
  3353     "Large * SmallInt multiplication"
       
  3354     self assert:(10 factorial printString = '3628800').
       
  3355     self assert:(20 factorial printString = '2432902008176640000').
       
  3356     self assert:(100 factorial printString = '93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000').
       
  3357     self assert:(1000 factorial printString = '402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000').
       
  3358 
       
  3359     t1 := 100000000.                            "/ small
       
  3360     t2 := 100000000000000000.                   "/ large on 32bit; small on 64bt machines
       
  3361     p := t1 * t2.
       
  3362     self assert:(p = 10000000000000000000000000).
       
  3363     p := t2 * t1.
       
  3364     self assert:(p = 10000000000000000000000000).
       
  3365     self assert:((t1 * t2) = 10000000000000000000000000).
       
  3366     self assert:((t2 * t1) = 10000000000000000000000000).
       
  3367 
       
  3368     t1 := 100000000.                            "/ small
       
  3369     t2 := 1000000000000000000.                  "/ large on 32bit; small on 64bt machines
       
  3370     p := t1 * t2.
       
  3371     self assert:(p = 100000000000000000000000000).
       
  3372     p := t2 * t1.
       
  3373     self assert:(p = 100000000000000000000000000).
       
  3374     self assert:(t1 * t2) = 100000000000000000000000000.
       
  3375     self assert:(t2 * t1) = 100000000000000000000000000.
       
  3376 
       
  3377     t1 := 100000000.                            "/ small
       
  3378     t2 := 10000000000000000000.                 "/ large
       
  3379     self assert:(t1 * t2) = 1000000000000000000000000000.
       
  3380     self assert:(t2 * t1) = 1000000000000000000000000000.
       
  3381 
       
  3382     t1 := 100000000.                            "/ small
       
  3383     t2 := 100000000000000000000.                "/ large
       
  3384     self assert:(t1 * t2) = 10000000000000000000000000000.
       
  3385     self assert:(t2 * t1) = 10000000000000000000000000000.
       
  3386 
       
  3387     t1 := 100000000.                            "/ small
       
  3388     t2 := 1000000000000000000000.               "/ large
       
  3389     self assert:(t1 * t2) = 100000000000000000000000000000.
       
  3390     self assert:(t2 * t1) = 100000000000000000000000000000.
       
  3391 
       
  3392     t1 := 100000000.                            "/ small
       
  3393     t2 := 10000000000000000000000.              "/ large
       
  3394     self assert:(t1 * t2) = 1000000000000000000000000000000.
       
  3395     self assert:(t2 * t1) = 1000000000000000000000000000000.
       
  3396 
       
  3397     t1 := 100000000.                            "/ small
       
  3398     t2 := 100000000000000000000000.             "/ large
       
  3399     self assert:(t1 * t2) = 10000000000000000000000000000000.
       
  3400     self assert:(t2 * t1) = 10000000000000000000000000000000.
       
  3401 
       
  3402     t1 := 100000000.                            "/ small
       
  3403     t2 := 1000000000000000000000000.            "/ large
       
  3404     self assert:(t1 * t2) = 100000000000000000000000000000000.
       
  3405     self assert:(t2 * t1) = 100000000000000000000000000000000.
       
  3406 
       
  3407     t1 := 100000000.                            "/ small
       
  3408     t2 := 10000000000000000000000000.           "/ large
       
  3409     self assert:(t1 * t2) = 1000000000000000000000000000000000.
       
  3410     self assert:(t2 * t1) = 1000000000000000000000000000000000.
       
  3411 
       
  3412     t1 := 100000000.                            "/ small
       
  3413     t2 := 100000000000000000000000000.          "/ large
       
  3414     self assert:(t1 * t2) = 10000000000000000000000000000000000.
       
  3415     self assert:(t2 * t1) = 10000000000000000000000000000000000.
       
  3416 
       
  3417     t1 := 100000000.                            "/ small
       
  3418     t2 := 1000000000000000000000000000.         "/ large
       
  3419     self assert:(t1 * t2) = 100000000000000000000000000000000000.
       
  3420     self assert:(t2 * t1) = 100000000000000000000000000000000000.
       
  3421 
       
  3422     t1 := 100000000.                            "/ small
       
  3423     t2 := 10000000000000000000000000000.        "/ large
       
  3424     self assert:(t1 * t2) = 1000000000000000000000000000000000000.
       
  3425     self assert:(t2 * t1) = 1000000000000000000000000000000000000.
       
  3426 
       
  3427     t1 := 100000000.                            "/ small
       
  3428     t2 := 100000000000000000000000000000.       "/ large
       
  3429     self assert:(t1 * t2) = 10000000000000000000000000000000000000.
       
  3430     self assert:(t2 * t1) = 10000000000000000000000000000000000000.
       
  3431 
       
  3432     t1 := 100000000.                            "/ small
       
  3433     t2 := 1000000000000000000000000000000.      "/ large
       
  3434     self assert:(t1 * t2) = 100000000000000000000000000000000000000.
       
  3435     self assert:(t2 * t1) = 100000000000000000000000000000000000000.
       
  3436 
       
  3437     t1 := 100000000.                            "/ small
       
  3438     t2 := 10000000000000000000000000000000.     "/ large
       
  3439     self assert:(t1 * t2) = 1000000000000000000000000000000000000000.
       
  3440     self assert:(t2 * t1) = 1000000000000000000000000000000000000000.
       
  3441 
       
  3442     t1 := 100000000.                            "/ small
       
  3443     t2 := 100000000000000000000000000000000.    "/ large
       
  3444     self assert:(t1 * t2) = 10000000000000000000000000000000000000000.
       
  3445     self assert:(t2 * t1) = 10000000000000000000000000000000000000000.
       
  3446 
       
  3447     "Large * Large multiplication"
       
  3448 
       
  3449     self assert:((16r3FFF * 16r3FFF) hexPrintString = 'FFF8001').
       
  3450     self assert:((16r7FFF * 16r7FFF) hexPrintString = '3FFF0001').
       
  3451     self assert:((16rFFFF * 16rFFFF) hexPrintString = 'FFFE0001').
       
  3452     self assert:((16r3FFFFF * 16r3FFFFF) hexPrintString = 'FFFFF800001').
       
  3453     self assert:((16r7FFFFF * 16r7FFFFF) hexPrintString = '3FFFFF000001').
       
  3454     self assert:((16rFFFFFF * 16rFFFFFF) hexPrintString = 'FFFFFE000001').
       
  3455     self assert:((16r3FFFFFFF * 16r3FFFFFFF) hexPrintString = 'FFFFFFF80000001').
       
  3456     self assert:((16r7FFFFFFF * 16r7FFFFFFF) hexPrintString = '3FFFFFFF00000001').
       
  3457     self assert:((16rFFFFFFFF * 16rFFFFFFFF) hexPrintString = 'FFFFFFFE00000001').
       
  3458     self assert:((16r3FFFFFFFFF * 16r3FFFFFFFFF) hexPrintString = 'FFFFFFFFF8000000001').
       
  3459     self assert:((16r7FFFFFFFFF * 16r7FFFFFFFFF) hexPrintString = '3FFFFFFFFF0000000001').
       
  3460     self assert:((16rFFFFFFFFFF * 16rFFFFFFFFFF) hexPrintString = 'FFFFFFFFFE0000000001').
       
  3461     self assert:((20 factorial * 20 factorial) printString = '5919012181389927685417441689600000000').
       
  3462 
       
  3463     self assert:((16rFFFFFFFFFFFF * 16rFFFFFFFFFF) hexPrintString = 'FFFFFFFFFEFF0000000001').
       
  3464     self assert:((16rFFFFFFFFFFFFFF * 16rFFFFFFFFFF) hexPrintString = 'FFFFFFFFFEFFFF0000000001').
       
  3465     self assert:((t1 := 16rFFFFFFFFFFFFFFFF * 16rFFFFFFFFFF) hexPrintString = 'FFFFFFFFFEFFFFFF0000000001').
       
  3466     self assert:((16rFFFFFFFFFFFFFFFFFF * 16rFFFFFFFFFF) hexPrintString = 'FFFFFFFFFEFFFFFFFF0000000001').
       
  3467     self assert:((16rFFFFFFFFFFFFFFFFFFFF * 16rFFFFFFFFFF) hexPrintString = 'FFFFFFFFFEFFFFFFFFFF0000000001').
       
  3468     self assert:((16rFFFFFFFFFFFFFFFFFFFFFF * 16rFFFFFFFFFF) hexPrintString = 'FFFFFFFFFEFFFFFFFFFFFF0000000001').
       
  3469 
       
  3470     self assert:((16rFFFFFFFFFFFF * 16rFFFFFFFFFFFF) hexPrintString = 'FFFFFFFFFFFE000000000001').
       
  3471     self assert:((16rFFFFFFFFFFFFFF * 16rFFFFFFFFFFFFFF) hexPrintString = 'FFFFFFFFFFFFFE00000000000001').
       
  3472     self assert:((t2 := (t1 := 16rFFFFFFFFFFFFFFFF * 16rFFFFFFFFFFFFFFFF) hexPrintString) = 'FFFFFFFFFFFFFFFE0000000000000001').
       
  3473     self assert:((16rFFFFFFFFFFFFFFFF * 16rFFFFFFFFFFFFFFFF) hexPrintString = 'FFFFFFFFFFFFFFFE0000000000000001').
       
  3474     self assert:((16rFFFFFFFFFFFFFFFFFF * 16rFFFFFFFFFFFFFFFFFF) hexPrintString = 'FFFFFFFFFFFFFFFFFE000000000000000001').
       
  3475     self assert:((16rFFFFFFFFFFFFFFFFFFFF * 16rFFFFFFFFFFFFFFFFFFFF) hexPrintString = 'FFFFFFFFFFFFFFFFFFFE00000000000000000001').
       
  3476     self assert:((16rFFFFFFFFFFFFFFFFFFFFFF * 16rFFFFFFFFFFFFFFFFFFFFFF) hexPrintString = 'FFFFFFFFFFFFFFFFFFFFFE0000000000000000000001').
       
  3477 
       
  3478     t1 := 699697179634740272935560322271216335182775596927422865716399200802062765682314102885264570100200211251370690926108604161579425545019863369232209949922751354278329212124724267803033599595114924195721823679025053720850308776953208134469115885358619139670731195605237506312288263327925364912720266772715929600.
       
  3479     self assert:(t1 printString = '699697179634740272935560322271216335182775596927422865716399200802062765682314102885264570100200211251370690926108604161579425545019863369232209949922751354278329212124724267803033599595114924195721823679025053720850308776953208134469115885358619139670731195605237506312288263327925364912720266772715929600').
       
  3480     self assert:((t1 * t1) = 489576143188809998144298426641311496989165214458056165805143410866108690058261346129614030084813851082564698610174813898740525406243367146120734370570458429364167811695064904353093506532695086211301649001517008746471464304183710723162864634442619484210170532881759249266026059786349673031239277666195699357198366128286910123306594912484590029738722281929300359929462301099981920256369394887701755497894820998573896950238852994224811101315810851671448056042419257789317787959570728520197146733902575090480065597582292177085754523686580725860228636039424698638422538988050350726807943014483010988455057592156160000).
       
  3481     self assert:((t1 * t1) printString = '489576143188809998144298426641311496989165214458056165805143410866108690058261346129614030084813851082564698610174813898740525406243367146120734370570458429364167811695064904353093506532695086211301649001517008746471464304183710723162864634442619484210170532881759249266026059786349673031239277666195699357198366128286910123306594912484590029738722281929300359929462301099981920256369394887701755497894820998573896950238852994224811101315810851671448056042419257789317787959570728520197146733902575090480065597582292177085754523686580725860228636039424698638422538988050350726807943014483010988455057592156160000').
       
  3482 
       
  3483     #(
       
  3484         16rFF
       
  3485         16rFFFF
       
  3486         16rFFFFFF
       
  3487         16rFFFFFFFF
       
  3488         16rFFFFFFFFFF
       
  3489         16rFFFFFFFFFFFF
       
  3490         16rFFFFFFFFFFFFFF
       
  3491         16rFFFFFFFFFFFFFFFF
       
  3492         16rFFFFFFFFFFFFFFFFFF
       
  3493         16rFFFFFFFFFFFFFFFFFFFF
       
  3494         16rFFFFFFFFFFFFFFFFFFFFFF
       
  3495         16rFFFFFFFFFFFFFFFFFFFFFFFF
       
  3496     ) do:[:eachFactor1 |
       
  3497         #(
       
  3498             16rFF
       
  3499             16rFFFF
       
  3500             16rFFFFFF
       
  3501             16rFFFFFFFF
       
  3502             16rFFFFFFFFFF
       
  3503             16rFFFFFFFFFFFF
       
  3504             16rFFFFFFFFFFFFFF
       
  3505             16rFFFFFFFFFFFFFFFF
       
  3506             16rFFFFFFFFFFFFFFFFFF
       
  3507             16rFFFFFFFFFFFFFFFFFFFF
       
  3508             16rFFFFFFFFFFFFFFFFFFFFFF
       
  3509             16rFFFFFFFFFFFFFFFFFFFFFFFF
       
  3510         ) do:[:eachFactor2 |
       
  3511             |t3|
       
  3512 
       
  3513             t1 := (eachFactor1 * eachFactor2).
       
  3514             t2 := (eachFactor2 * eachFactor1).
       
  3515 
       
  3516             self assert:(t1 = t2).
       
  3517 t1 = 20203181441155852828228393631745 ifTrue:[
       
  3518  eachFactor1 = 1099511627775 ifTrue:[
       
  3519 self halt
       
  3520 ]].
       
  3521 
       
  3522             self assert:(t1 / eachFactor1) = eachFactor2.
       
  3523             self assert:(t1 / eachFactor2) = eachFactor1.
       
  3524             t3 := (eachFactor1 asLargeInteger * eachFactor2 asLargeInteger).
       
  3525             self assert: t1 = t3.
       
  3526         ].
       
  3527     ].
       
  3528 
       
  3529     "
       
  3530      self basicNew testLargeMultiplication
       
  3531     "
       
  3532 
       
  3533     "Modified: / 02-12-2013 / 15:45:39 / cg"
       
  3534 !
       
  3535 
       
  3536 testLargeMultiplication2
       
  3537     "tests many divisions and multiplications (of largeInts by smallInts)"
       
  3538 
       
  3539     |n n2|
       
  3540 
       
  3541     self assert:(1000 factorial printString = '402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000').
       
  3542 
       
  3543     n := 1000 factorial.
       
  3544     1000 to:2 by:-1 do:[:d |
       
  3545         n2 := n / d.
       
  3546         self assert:((d-1) factorial = n2).
       
  3547         self assert:(Integer readFrom:n2 printString) * d = n.
       
  3548         n := n2.
       
  3549     ].
       
  3550 !
       
  3551 
       
  3552 testLargeMultiplicationHelpers1
       
  3553     |t1 t2 r|
       
  3554 
       
  3555     t1 := LargeInteger digitBytes:#[ 16r00 16rE1 16rF5 16r05 ].
       
  3556     t2 := LargeInteger digitBytes:#[ 16r00 16r00 16r40 16rB2 16rBA 16rC9 16rE0 16r19 16r1E 16r02].
       
  3557     r := t1 absMul:t2.
       
  3558     self assert:(r printString = '1000000000000000000000000000000').
       
  3559     self assert:(r hexPrintString = 'C9F2C9CD04674EDEA40000000').
       
  3560 
       
  3561     t1 := LargeInteger digitBytes:#[ 16r00 16rE1 16rF5 16r05 ].
       
  3562     t2 := LargeInteger digitBytes:#[ 16r00 16r00 16rA0 16rDE   16rC5 16rAD 16rC9 16r35   16r36].
       
  3563     r := t1 absMul:t2.
       
  3564     self assert:(r printString = '100000000000000000000000000000').
       
  3565     self assert:(r hexPrintString = '1431E0FAE6D7217CAA0000000').
       
  3566 
       
  3567     "/ -----
       
  3568 
       
  3569     t1 := LargeInteger digitBytes:#[ 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF].
       
  3570     t2 := LargeInteger digitBytes:#[ 16rFF 16rFF 16rFF 16rFF 0 0 0 0].
       
  3571     r := t1 absMul:t2.
       
  3572     self assert:(r hexPrintString = 'FFFFFFFEFFFFFFFF00000001').
       
  3573 
       
  3574     t1 := LargeInteger digitBytes:#[ 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF].
       
  3575     t2 := LargeInteger digitBytes:#[ 16rFF 16rFF 16rFF 16rFF 16rFF 0 0 0].
       
  3576     r := t1 absMul:t2.
       
  3577     self assert:(r printString = '20282409603633223678774030106625').
       
  3578     self assert:(r hexPrintString = 'FFFFFFFFFEFFFFFF0000000001').
       
  3579 
       
  3580     t1 := LargeInteger digitBytes:#[ 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF].
       
  3581     t2 := LargeInteger digitBytes:#[ 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 0 0].
       
  3582     r := t1 absMul:t2.
       
  3583     self assert:(r printString = '5192296858534809181504947642957825').
       
  3584     self assert:(r hexPrintString = 'FFFFFFFFFFFEFFFF000000000001').
       
  3585 
       
  3586     t1 := LargeInteger digitBytes:#[ 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF].
       
  3587     t2 := LargeInteger digitBytes:#[ 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 0].
       
  3588     r := t1 absMul:t2.
       
  3589     self assert:(r printString = '1329227995784915854385005392532865025').
       
  3590     self assert:(r hexPrintString = 'FFFFFFFFFFFFFEFF00000000000001').
       
  3591 
       
  3592     "
       
  3593      self basicNew testLargeMultiplicationHelpers1
       
  3594     "
       
  3595 
       
  3596     "Modified: / 02-12-2013 / 18:48:00 / cg"
       
  3597 !
       
  3598 
       
  3599 testLargeMultiplicationHelpers2
       
  3600     |t1 t2 r|
       
  3601 
       
  3602     "/ testing internal multiplication method
       
  3603     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8].
       
  3604     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0].
       
  3605     r := t1 absMul:t2.
       
  3606     self assert:(r hexPrintString = '100E0C0A08060402').
       
  3607 
       
  3608     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9].
       
  3609     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0].
       
  3610     r := t1 absMul:t2.
       
  3611     self assert:(r hexPrintString = '12100E0C0A08060402').
       
  3612 
       
  3613     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10].
       
  3614     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0].
       
  3615     r := t1 absMul:t2.
       
  3616     self assert:(r hexPrintString = '1412100E0C0A08060402').
       
  3617 
       
  3618     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10 11].
       
  3619     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0].
       
  3620     r := t1 absMul:t2.
       
  3621     self assert:(r hexPrintString = '161412100E0C0A08060402').
       
  3622 
       
  3623     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10 11 12].
       
  3624     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0].
       
  3625     r := t1 absMul:t2.
       
  3626     self assert:(r hexPrintString = '18161412100E0C0A08060402').
       
  3627 
       
  3628     "/ --------
       
  3629 
       
  3630     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8].
       
  3631     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0].
       
  3632     r := t1 absMul:t2.
       
  3633     self assert:(r hexPrintString = '100E0C0A08060402').
       
  3634 
       
  3635     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9].
       
  3636     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0].
       
  3637     r := t1 absMul:t2.
       
  3638     self assert:(r hexPrintString = '12100E0C0A08060402').
       
  3639 
       
  3640     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10].
       
  3641     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0].
       
  3642     r := t1 absMul:t2.
       
  3643     self assert:(r hexPrintString = '1412100E0C0A08060402').
       
  3644 
       
  3645     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10 11].
       
  3646     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0].
       
  3647     r := t1 absMul:t2.
       
  3648     self assert:(r hexPrintString = '161412100E0C0A08060402').
       
  3649 
       
  3650     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10 11 12].
       
  3651     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0].
       
  3652     r := t1 absMul:t2.
       
  3653     self assert:(r hexPrintString = '18161412100E0C0A08060402').
       
  3654 
       
  3655     "/ --------
       
  3656 
       
  3657     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8].
       
  3658     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0].
       
  3659     r := t1 absMul:t2.
       
  3660     self assert:(r hexPrintString = '100E0C0A08060402').
       
  3661 
       
  3662     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9].
       
  3663     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0].
       
  3664     r := t1 absMul:t2.
       
  3665     self assert:(r hexPrintString = '12100E0C0A08060402').
       
  3666 
       
  3667     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10].
       
  3668     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0 ].
       
  3669     r := t1 absMul:t2.
       
  3670     self assert:(r hexPrintString = '1412100E0C0A08060402').
       
  3671 
       
  3672     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10 11].
       
  3673     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0].
       
  3674     r := t1 absMul:t2.
       
  3675     self assert:(r hexPrintString = '161412100E0C0A08060402').
       
  3676 
       
  3677     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10 11 12].
       
  3678     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0].
       
  3679     r := t1 absMul:t2.
       
  3680     self assert:(r hexPrintString = '18161412100E0C0A08060402').
       
  3681 
       
  3682     "/ --------
       
  3683 
       
  3684     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8].
       
  3685     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0 0].
       
  3686     r := t1 absMul:t2.
       
  3687     self assert:(r hexPrintString = '100E0C0A08060402').
       
  3688 
       
  3689     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9].
       
  3690     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0 0].
       
  3691     r := t1 absMul:t2.
       
  3692     self assert:(r hexPrintString = '12100E0C0A08060402').
       
  3693 
       
  3694     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10].
       
  3695     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0 0].
       
  3696     r := t1 absMul:t2.
       
  3697     self assert:(r hexPrintString = '1412100E0C0A08060402').
       
  3698 
       
  3699     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10 11].
       
  3700     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0 0].
       
  3701     r := t1 absMul:t2.
       
  3702     self assert:(r hexPrintString = '161412100E0C0A08060402').
       
  3703 
       
  3704     t1 := LargeInteger digitBytes:#[ 1 2 3 4 5 6 7 8 9 10 11 12].
       
  3705     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0 0].
       
  3706     r := t1 absMul:t2.
       
  3707     self assert:(r hexPrintString = '18161412100E0C0A08060402').
       
  3708 
       
  3709 
       
  3710     "/ ==================0
       
  3711 
       
  3712     t1 := LargeInteger digitBytes:#[ 128 1 1 1 1 1 1 1].
       
  3713     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0].
       
  3714     r := t1 absMul:t2.
       
  3715     self assert:(r hexPrintString = '202020202020300').
       
  3716 
       
  3717     t1 := LargeInteger digitBytes:#[ 128 1 1 1 1 1 1 1].
       
  3718     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0].
       
  3719     r := t1 absMul:t2.
       
  3720     self assert:(r hexPrintString = '202020202020300').
       
  3721 
       
  3722     t1 := LargeInteger digitBytes:#[ 128 1 1 1 1 1 1 1].
       
  3723     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0].
       
  3724     r := t1 absMul:t2.
       
  3725     self assert:(r hexPrintString = '202020202020300').
       
  3726 
       
  3727     t1 := LargeInteger digitBytes:#[ 128 1 1 1 1 1 1 1].
       
  3728     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0 0].
       
  3729     r := t1 absMul:t2.
       
  3730     self assert:(r hexPrintString = '202020202020300').
       
  3731 
       
  3732     "/ ---------
       
  3733 
       
  3734     t1 := LargeInteger digitBytes:#[ 0 128 1 1 1 1 1 1 1].
       
  3735     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0].
       
  3736     r := t1 absMul:t2.
       
  3737     self assert:(r hexPrintString = '20202020202030000').
       
  3738 
       
  3739     t1 := LargeInteger digitBytes:#[ 0 128 1 1 1 1 1 1 1].
       
  3740     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0].
       
  3741     r := t1 absMul:t2.
       
  3742     self assert:(r hexPrintString = '20202020202030000').
       
  3743 
       
  3744     t1 := LargeInteger digitBytes:#[ 0 128 1 1 1 1 1 1 1].
       
  3745     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0].
       
  3746     r := t1 absMul:t2.
       
  3747     self assert:(r hexPrintString = '20202020202030000').
       
  3748 
       
  3749     t1 := LargeInteger digitBytes:#[ 0 128 1 1 1 1 1 1 1].
       
  3750     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0 0].
       
  3751     r := t1 absMul:t2.
       
  3752     self assert:(r hexPrintString = '20202020202030000').
       
  3753 
       
  3754     "/ ---------
       
  3755 
       
  3756     t1 := LargeInteger digitBytes:#[ 0 0 128 1 1 1 1 1 1 1].
       
  3757     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0].
       
  3758     r := t1 absMul:t2.
       
  3759     self assert:(r hexPrintString = '2020202020203000000').
       
  3760 
       
  3761     t1 := LargeInteger digitBytes:#[ 0 0 128 1 1 1 1 1 1 1].
       
  3762     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0].
       
  3763     r := t1 absMul:t2.
       
  3764     self assert:(r hexPrintString = '2020202020203000000').
       
  3765 
       
  3766     t1 := LargeInteger digitBytes:#[ 0 0 128 1 1 1 1 1 1 1].
       
  3767     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0].
       
  3768     r := t1 absMul:t2.
       
  3769     self assert:(r hexPrintString = '2020202020203000000').
       
  3770 
       
  3771     t1 := LargeInteger digitBytes:#[ 0 0 128 1 1 1 1 1 1 1].
       
  3772     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0 0].
       
  3773     r := t1 absMul:t2.
       
  3774     self assert:(r hexPrintString = '2020202020203000000').
       
  3775 
       
  3776     "/ ---------
       
  3777 
       
  3778     t1 := LargeInteger digitBytes:#[ 0 0 0 128 1 1 1 1 1 1 1].
       
  3779     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0].
       
  3780     r := t1 absMul:t2.
       
  3781     self assert:(r hexPrintString = '202020202020300000000').
       
  3782 
       
  3783     t1 := LargeInteger digitBytes:#[ 0 0 0 128 1 1 1 1 1 1 1].
       
  3784     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0].
       
  3785     r := t1 absMul:t2.
       
  3786     self assert:(r hexPrintString = '202020202020300000000').
       
  3787 
       
  3788     t1 := LargeInteger digitBytes:#[ 0 0 0 128 1 1 1 1 1 1 1].
       
  3789     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0].
       
  3790     r := t1 absMul:t2.
       
  3791     self assert:(r hexPrintString = '202020202020300000000').
       
  3792 
       
  3793     t1 := LargeInteger digitBytes:#[ 0 0 0 128 1 1 1 1 1 1 1].
       
  3794     t2 := LargeInteger digitBytes:#[ 2 0 0 0 0 0 0 0 0 0 0].
       
  3795     r := t1 absMul:t2.
       
  3796     self assert:(r hexPrintString = '202020202020300000000').
       
  3797 
       
  3798     "
       
  3799      self basicNew testLargeMultiplicationHelpers2
       
  3800     "
       
  3801 
       
  3802     "Modified: / 02-12-2013 / 15:45:39 / cg"
       
  3803 !
       
  3804 
       
  3805 testLargeSubtraction1
       
  3806     |a1 a2 a b1 b2 b c1 c2 c|
       
  3807 
       
  3808     "/ on 32bit machines - these lead to smallint overflow
       
  3809     self assert:((2770568 + 2770568) printString = '5541136').
       
  3810     self assert:((2770568 - 2770568) printString = '0').
       
  3811     self assert:((2770568 negated + 2770568 negated) printString = '-5541136').
       
  3812     self assert:((5541136 negated - 2770568 negated) printString = '-2770568').
       
  3813 
       
  3814     "Large - small subtraction"
       
  3815 
       
  3816     self assert:((2770568900 + 2770568900) printString = '5541137800').
       
  3817     self assert:((2770568900 - 2770568900) printString = '0').
       
  3818     self assert:((2770568900 negated + 2770568900 negated) printString = '-5541137800').
       
  3819     self assert:((5541137800 negated - 2770568900 negated) printString = '-2770568900').
       
  3820     self assert:((2770568900 negated - 5541137800 negated) printString = '2770568900').
       
  3821 
       
  3822     a1 := -2770568900. a2 := 59049.
       
  3823     a := (a1 / a2) negated.
       
  3824     b1 := -5872025600. b2 := 59049.
       
  3825     b := (b1 / b2) negated.
       
  3826     c1 := 344606300. c2 := 6561.
       
  3827     c := (c1 / c2) negated.
       
  3828     self assert:(a - b closeTo: c).
       
  3829     self assert:((a - b) asFloat closeTo: c asFloat).
       
  3830     self assert:((a asFloat - b) closeTo: c asFloat).
       
  3831     self assert:((a - b asFloat) closeTo: c asFloat).
       
  3832 
       
  3833     a := -10.
       
  3834     b := -12.
       
  3835     self assert:(a - b = 2).
       
  3836 
       
  3837     a := -10000000.
       
  3838     b := -12000000.
       
  3839     self assert:(a - b = 2000000).
       
  3840 
       
  3841     a := -100000000000000.
       
  3842     b := -120000000000000.
       
  3843     self assert:(a - b = 20000000000000).
       
  3844 
       
  3845     "smallInteger - largeInteger"
       
  3846     self assert:(-1000000000 - -2000000000 = 1000000000).
       
  3847     "largeInteger - smallInteger"
       
  3848     self assert:(-2000000000 - -1000000000 = -1000000000).
       
  3849 
       
  3850     a := 40 factorial.
       
  3851     b := 39 factorial.
       
  3852     self assert:(a - b + b = a).
       
  3853 
       
  3854     "
       
  3855      self basicNew testLargeSubtraction1
       
  3856     "
       
  3857 
       
  3858     "Modified: / 27.11.1999 / 16:41:54 / cg"
       
  3859 !
       
  3860 
       
  3861 testLargeSubtraction2
       
  3862     "/ on 64bit machines - these lead to smallint overflow
       
  3863     self assert:((16r3FFFFFFFFFFFFFFF negated - 1 - 1) printString = '-4611686018427387905').
       
  3864 
       
  3865     "
       
  3866      self basicNew testLargeSubtraction2
       
  3867     "
       
  3868 !
       
  3869 
       
  3870 testMiscMath
       
  3871     self assert:(2 raisedTo:2) == 4.
       
  3872     self assert:(2 raisedTo:2.0) = 4.0.
       
  3873     self assert:(2 raisedTo:100) = 1267650600228229401496703205376.
       
  3874     
       
  3875     self assert:(((2 raisedTo:100) log:2) isAlmostEqualTo:100 nEpsilon:1) 
       
  3876          message:('(2^100)log2 is %1' bindWith:((2 raisedTo:100) log:2)).
       
  3877     self assert:(((2 raisedTo:100) integerLog2) == 100)
       
  3878          message:('(2^100)integerLog2 is %1' bindWith:((2 raisedTo:100) integerLog2)).
       
  3879 
       
  3880     self assert:(((10 raisedTo:100) integerLog10) == 100)
       
  3881          message:('(10^100)integerLog10 is %1' bindWith:((10 raisedTo:100) integerLog10)).
       
  3882 
       
  3883     "/ currently, integerLog10 does not work with largeInts
       
  3884     "/ self assert:(((10 raisedTo:1000) integerLog10) == 1000).
       
  3885 
       
  3886     "
       
  3887      self basicNew testMiscMath
       
  3888     "
       
  3889 
       
  3890     "Created: / 02-07-2017 / 00:52:25 / cg"
       
  3891     "Modified (comment): / 02-07-2017 / 14:39:26 / cg"
       
  3892     "Modified: / 22-07-2019 / 12:44:41 / Claus Gittinger"
       
  3893 !
       
  3894 
       
  3895 testMiscMath2
       
  3896     self assert:(10000000000000000000000001 isPrime) not.
       
  3897     self assert:(76 factorial + 1) isPrime not.
       
  3898 
       
  3899     "/ Would take far too long with fallback implementation.
       
  3900     PrimeNumberGenerator notNil ifTrue:[
       
  3901         self assert:(77 factorial + 1) isPrime.
       
  3902         self assert:(872 factorial + 1) isPrime.
       
  3903         self assert:(1000 factorial + 1) isPrime not.
       
  3904     ].
       
  3905 
       
  3906     "
       
  3907     Time millisecondsToRun:[
       
  3908         1000000 factorial.
       
  3909     ].
       
  3910     "
       
  3911 
       
  3912     "
       
  3913      self basicNew testMiscMath2
       
  3914     "
       
  3915 
       
  3916     "Created: / 05-07-2017 / 16:18:54 / cg"
       
  3917     "Modified (comment): / 26-07-2017 / 12:48:11 / mawalch"
       
  3918 !
       
  3919 
       
  3920 testModulu
       
  3921     |a b op|
       
  3922 
       
  3923     op := #\\.
       
  3924     a := -1.
       
  3925     b := 8.
       
  3926     self assert:(-1 \\ 8 == 7).
       
  3927     self assert:(a \\ 8 == 7).
       
  3928     self assert:(-1 \\ b == 7).
       
  3929     self assert:(a \\ b == 7).
       
  3930 
       
  3931     self assert:((-1 perform:op with: 8) == 7).
       
  3932     self assert:((a perform:op with: 8) == 7).
       
  3933     self assert:((-1 perform:op with: b) == 7).
       
  3934     self assert:((a perform:op with: b) == 7).
       
  3935 
       
  3936     a := 1.
       
  3937     b := -8.
       
  3938     self assert:(1 \\ -8 == -7).
       
  3939     self assert:(a \\ -8 == -7).
       
  3940     self assert:(1 \\ b == -7).
       
  3941     self assert:(a \\ b == -7).
       
  3942 
       
  3943     self assert:((1 perform:op with: -8) == -7).
       
  3944     self assert:((a perform:op with: -8) == -7).
       
  3945     self assert:((1 perform:op with: b) == -7).
       
  3946     self assert:((a perform:op with: b) == -7).
       
  3947 
       
  3948     a := -1.
       
  3949     b := -8.
       
  3950     self assert:(-1 \\ -8 == -1).
       
  3951     self assert:(a \\ -8 == -1).
       
  3952     self assert:(-1 \\ b == -1).
       
  3953     self assert:(a \\ b == -1).
       
  3954 
       
  3955     self assert:((-1 perform:op with: -8) == -1).
       
  3956     self assert:((a perform:op with: -8) == -1).
       
  3957     self assert:((-1 perform:op with: b) == -1).
       
  3958     self assert:((a perform:op with: b) == -1).
       
  3959 
       
  3960     a := 1.
       
  3961     b := 8.
       
  3962     self assert:(1 \\ 8 == 1).
       
  3963     self assert:(a \\ 8 == 1).
       
  3964     self assert:(1 \\ b == 1).
       
  3965     self assert:(a \\ b == 1).
       
  3966 
       
  3967     self assert:((1 perform:op with: 8) == 1).
       
  3968     self assert:((a perform:op with: 8) == 1).
       
  3969     self assert:((1 perform:op with: b) == 1).
       
  3970     self assert:((a perform:op with: b) == 1).
       
  3971 
       
  3972 
       
  3973     a := -17.
       
  3974     b := 8.
       
  3975     self assert:(-17 \\ 8 == 7).
       
  3976     self assert:(a \\ 8 == 7).
       
  3977     self assert:(-17 \\ b == 7).
       
  3978     self assert:(a \\ b == 7).
       
  3979 
       
  3980     self assert:((-17 perform:op with: 8) == 7).
       
  3981     self assert:((a perform:op with: 8) == 7).
       
  3982     self assert:((-17 perform:op with: b) == 7).
       
  3983     self assert:((a perform:op with: b) == 7).
       
  3984 
       
  3985     a := 17.
       
  3986     b := -8.
       
  3987     self assert:(17 \\ -8 == -7).
       
  3988     self assert:(a \\ -8 == -7).
       
  3989     self assert:(17 \\ b == -7).
       
  3990     self assert:(a \\ b == -7).
       
  3991 
       
  3992     self assert:((17 perform:op with: -8) == -7).
       
  3993     self assert:((a perform:op with: -8) == -7).
       
  3994     self assert:((17 perform:op with: b) == -7).
       
  3995     self assert:((a perform:op with: b) == -7).
       
  3996 
       
  3997     a := -17.
       
  3998     b := -8.
       
  3999     self assert:(-17 \\ -8 == -1).
       
  4000     self assert:(a \\ -8 == -1).
       
  4001     self assert:(-17 \\ b == -1).
       
  4002     self assert:(a \\ b == -1).
       
  4003 
       
  4004     self assert:((-17 perform:op with: -8) == -1).
       
  4005     self assert:((a perform:op with: -8) == -1).
       
  4006     self assert:((-17 perform:op with: b) == -1).
       
  4007     self assert:((a perform:op with: b) == -1).
       
  4008 
       
  4009     a := 17.
       
  4010     b := 8.
       
  4011     self assert:(17 \\ 8 == 1).
       
  4012     self assert:(a \\ 8 == 1).
       
  4013     self assert:(17 \\ b == 1).
       
  4014     self assert:(a \\ b == 1).
       
  4015 
       
  4016     self assert:((17 perform:op with: 8) == 1).
       
  4017     self assert:((a perform:op with: 8) == 1).
       
  4018     self assert:((17 perform:op with: b) == 1).
       
  4019     self assert:((a perform:op with: b) == 1).
       
  4020 
       
  4021 
       
  4022     op := #rem:.
       
  4023     a := -1.
       
  4024     b := 8.
       
  4025     self assert:((-1 rem: 8) == -1).
       
  4026     self assert:((a rem: 8) == -1).
       
  4027     self assert:((-1 rem: b) == -1).
       
  4028     self assert:((a rem: b) == -1).
       
  4029 
       
  4030     self assert:((-1 perform:op with: -8) == -1).
       
  4031     self assert:((a perform:op with: -8) == -1).
       
  4032     self assert:((-1 perform:op with: b) == -1).
       
  4033     self assert:((a perform:op with: b) == -1).
       
  4034 
       
  4035     a := 1.
       
  4036     b := -8.
       
  4037     self assert:((1 rem: -8) == 1).
       
  4038     self assert:((a rem: -8) == 1).
       
  4039     self assert:((1 rem: b) == 1).
       
  4040     self assert:((a rem: b) == 1).
       
  4041 
       
  4042     self assert:((1 perform:op with: -8) == 1).
       
  4043     self assert:((a perform:op with: -8) == 1).
       
  4044     self assert:((1 perform:op with: b) == 1).
       
  4045     self assert:((a perform:op with: b) == 1).
       
  4046 
       
  4047     a := -1.
       
  4048     b := -8.
       
  4049     self assert:((-1 rem: -8) == -1).
       
  4050     self assert:((a rem: -8) == -1).
       
  4051     self assert:((-1 rem: b) == -1).
       
  4052     self assert:((a rem: b) == -1).
       
  4053 
       
  4054     self assert:((-1 perform:op with: -8) == -1).
       
  4055     self assert:((a perform:op with: -8) == -1).
       
  4056     self assert:((-1 perform:op with: b) == -1).
       
  4057     self assert:((a perform:op with: b) == -1).
       
  4058 
       
  4059     a := 1.
       
  4060     b := 8.
       
  4061     self assert:((1 rem: 8) == 1).
       
  4062     self assert:((a rem: 8) == 1).
       
  4063     self assert:((1 rem: b) == 1).
       
  4064     self assert:((a rem: b) == 1).
       
  4065 
       
  4066     self assert:((1 perform:op with: 8) == 1).
       
  4067     self assert:((a perform:op with: 8) == 1).
       
  4068     self assert:((1 perform:op with: b) == 1).
       
  4069     self assert:((a perform:op with: b) == 1).
       
  4070 
       
  4071     a := -17.
       
  4072     b := 8.
       
  4073     self assert:((-17 rem: 8) == -1).
       
  4074     self assert:((a rem: 8) == -1).
       
  4075     self assert:((-17 rem: b) == -1).
       
  4076     self assert:((a rem: b) == -1).
       
  4077 
       
  4078     self assert:((-17 perform:op with: -8) == -1).
       
  4079     self assert:((a perform:op with: -8) == -1).
       
  4080     self assert:((-17 perform:op with: b) == -1).
       
  4081     self assert:((a perform:op with: b) == -1).
       
  4082 
       
  4083     a := 17.
       
  4084     b := -8.
       
  4085     self assert:((17 rem: -8) == 1).
       
  4086     self assert:((a rem: -8) == 1).
       
  4087     self assert:((17 rem: b) == 1).
       
  4088     self assert:((a rem: b) == 1).
       
  4089 
       
  4090     self assert:((17 perform:op with: -8) == 1).
       
  4091     self assert:((a perform:op with: -8) == 1).
       
  4092     self assert:((17 perform:op with: b) == 1).
       
  4093     self assert:((a perform:op with: b) == 1).
       
  4094 
       
  4095     a := -17.
       
  4096     b := -8.
       
  4097     self assert:((-17 rem: -8) == -1).
       
  4098     self assert:((a rem: -8) == -1).
       
  4099     self assert:((-17 rem: b) == -1).
       
  4100     self assert:((a rem: b) == -1).
       
  4101 
       
  4102     self assert:((-17 perform:op with: -8) == -1).
       
  4103     self assert:((a perform:op with: -8) == -1).
       
  4104     self assert:((-17 perform:op with: b) == -1).
       
  4105     self assert:((a perform:op with: b) == -1).
       
  4106 
       
  4107     a := 17.
       
  4108     b := 8.
       
  4109     self assert:((17 rem: 8) == 1).
       
  4110     self assert:((a rem: 8) == 1).
       
  4111     self assert:((17 rem: b) == 1).
       
  4112     self assert:((a rem: b) == 1).
       
  4113 
       
  4114     self assert:((17 perform:op with: 8) == 1).
       
  4115     self assert:((a perform:op with: 8) == 1).
       
  4116     self assert:((17 perform:op with: b) == 1).
       
  4117     self assert:((a perform:op with: b) == 1).
       
  4118 
       
  4119     "
       
  4120      self basicNew testModulu
       
  4121     "
       
  4122 !
       
  4123 
       
  4124 testNegation
       
  4125     self assert:(self doNegate:SmallInteger minVal) class = LargeInteger.
       
  4126     self assert:(self doNegate:SmallInteger minVal) = (SmallInteger maxVal + 1).
       
  4127 
       
  4128     self assert:(self doNegate2:SmallInteger minVal) class = LargeInteger.
       
  4129     self assert:(self doNegate2:SmallInteger minVal) = (SmallInteger maxVal + 1).
       
  4130 !
       
  4131 
       
  4132 testNextPowerOfTwo
       
  4133     "/ self assert:(0 nextPowerOf2 = 0).
       
  4134     self assert:(1 nextPowerOf2 = 1).
       
  4135     self assert:(2 nextPowerOf2 = 2).
       
  4136     self assert:(3 nextPowerOf2 = 4).
       
  4137     self assert:(4 nextPowerOf2 = 4).
       
  4138     self assert:(5 nextPowerOf2 = 8).
       
  4139     self assert:(6 nextPowerOf2 = 8).
       
  4140     self assert:(7 nextPowerOf2 = 8).
       
  4141     self assert:(8 nextPowerOf2 = 8).
       
  4142     self assert:(9 nextPowerOf2 = 16).
       
  4143 
       
  4144     self assert:(22 nextPowerOf2 = 32).
       
  4145     self assert:(32 nextPowerOf2 = 32).
       
  4146     self assert:(16rFFFF nextPowerOf2 = 16r10000).  
       
  4147     self assert:(16r1FFFFFFF nextPowerOf2 = 16r20000000).  
       
  4148     self assert:(16r3FFFFFFF nextPowerOf2 = 16r40000000).  
       
  4149     self assert:(16r7FFFFFFF nextPowerOf2 = 16r80000000).  
       
  4150     self assert:(16rFFFFFFFF nextPowerOf2 = 16r100000000). 
       
  4151     self assert:(16r1FFFFFFFFFFFFFFF nextPowerOf2 = 16r2000000000000000).  
       
  4152     self assert:(16r3FFFFFFFFFFFFFFF nextPowerOf2 = 16r4000000000000000).  
       
  4153     self assert:(16r7FFFFFFFFFFFFFFF nextPowerOf2 = 16r8000000000000000).  
       
  4154     self assert:(16rFFFFFFFFFFFFFFFF nextPowerOf2 = 16r10000000000000000).  
       
  4155     self assert:(16rFFFFFFFFFFFFFFFFFFFF nextPowerOf2 = 16r100000000000000000000).  
       
  4156 
       
  4157     "
       
  4158      self basicNew testNextPowerOfTwo
       
  4159     "
       
  4160 !
       
  4161 
       
  4162 testSignExtension
       
  4163     "/ 8bit
       
  4164     self assert:( 16r80 signExtendedByteValue = -128 ).
       
  4165     self assert:( 16r7F signExtendedByteValue = 127 ).  
       
  4166     self assert:( 16rFF signExtendedByteValue = -1 ).
       
  4167 
       
  4168     "/ higher bits are ignored
       
  4169     self assert:( 16rF80 signExtendedByteValue = -128 ).
       
  4170     self assert:( 16rF7F signExtendedByteValue = 127 ).  
       
  4171     self assert:( 16rFFF signExtendedByteValue = -1 ).
       
  4172 
       
  4173     "/ 16bit
       
  4174     self assert:( 16r8000 signExtendedShortValue = -32768 ).
       
  4175     self assert:( 16r7FFF signExtendedShortValue = 32767 ).  
       
  4176     self assert:( 16rFFFF signExtendedShortValue = -1 ).
       
  4177 
       
  4178     "/ higher bits are ignored
       
  4179     self assert:( 16rF8000 signExtendedShortValue = -32768 ).
       
  4180     self assert:( 16rF7FFF signExtendedShortValue = 32767 ).  
       
  4181     self assert:( 16rFFFFF signExtendedShortValue = -1 ).
       
  4182 
       
  4183     "/ 24bit
       
  4184     self assert:( 16r800000 signExtended24BitValue = -8388608 ).
       
  4185     self assert:( 16r7FFFFF signExtended24BitValue = 8388607 ).  
       
  4186     self assert:( 16rFFFFFF signExtended24BitValue = -1 ).
       
  4187 
       
  4188     "/ higher bits are ignored
       
  4189     self assert:( 16rF800000 signExtended24BitValue = -8388608 ).
       
  4190     self assert:( 16rF7FFFFF signExtended24BitValue = 8388607 ).  
       
  4191     self assert:( 16rFFFFFFF signExtended24BitValue = -1 ).
       
  4192 
       
  4193     "/ 32bit
       
  4194     self assert:( 16r80000000 signExtendedLongValue = -2147483648 ).
       
  4195     self assert:( 16r7FFFFFFF signExtendedLongValue = 2147483647 ).  
       
  4196     self assert:( 16rFFFFFFFF signExtendedLongValue = -1 ).
       
  4197 
       
  4198     "/ higher bits are ignored
       
  4199     self assert:( 16rF80000000 signExtendedLongValue = -2147483648 ).
       
  4200     self assert:( 16rF7FFFFFFF signExtendedLongValue = 2147483647 ).  
       
  4201     self assert:( 16rFFFFFFFFF signExtendedLongValue = -1 ).
       
  4202 
       
  4203     "/ 64bit
       
  4204     self assert:( 16r8000000000000000 signExtendedLongLongValue = -9223372036854775808 ).
       
  4205     self assert:( 16r7FFFFFFFFFFFFFFF signExtendedLongLongValue = 9223372036854775807 ).  
       
  4206     self assert:( 16rFFFFFFFFFFFFFFFF signExtendedLongLongValue = -1 ).
       
  4207 
       
  4208     "/ higher bits are ignored
       
  4209     self assert:( 16rF8000000000000000 signExtendedLongLongValue = -9223372036854775808 ).
       
  4210     self assert:( 16rF7FFFFFFFFFFFFFFF signExtendedLongLongValue = 9223372036854775807 ).  
       
  4211     self assert:( 16rFFFFFFFFFFFFFFFFF signExtendedLongLongValue = -1 ).
       
  4212 
       
  4213     "/ arbitrary nr of bits
       
  4214     self assert:( 2r1000 signExtendedFromBit:4) = -8 .
       
  4215     self assert:( 2r0111 signExtendedFromBit:4) = 7 .  
       
  4216     self assert:( 2r1111 signExtendedFromBit:4) = -1 .
       
  4217 
       
  4218     "Created: / 21-07-2017 / 15:15:53 / cg"
       
  4219 !
       
  4220 
       
  4221 testSmallIntegerArithmetic
       
  4222     "arithmetic tests.
       
  4223      Notice, the arithmetic tests are both performed via regular sends
       
  4224      and via constructed performs. The reason is to test both inlined
       
  4225      JIT-compiler code AND the regular methods code."
       
  4226 
       
  4227     |n1 n2 t|
       
  4228 
       
  4229     "/ test division and modulu ...
       
  4230     self assert:(1 printString = '1').
       
  4231     self assert:(10 printString = '10').
       
  4232     self assert:(100 printString = '100').
       
  4233     self assert:(1000 printString = '1000').
       
  4234     self assert:(10000 printString = '10000').
       
  4235     self assert:(100000 printString = '100000').
       
  4236 
       
  4237     self assert:(1 - 1 = 0).
       
  4238     self assert:(1 + -1 = 0).
       
  4239     self assert:(-1 + 1 = 0).
       
  4240     self assert:(-1 - -1 = 0).
       
  4241 
       
  4242     "addition with overflow"
       
  4243 
       
  4244     SmallInteger maxBytes == 4 ifTrue:[
       
  4245         n1 := 16r3FFFFFFF.
       
  4246         n2 := 16r-40000000.
       
  4247     ] ifFalse:[
       
  4248         n1 := 16r3FFFFFFFFFFFFFFF.
       
  4249         n2 := 16r-4000000000000000.
       
  4250     ].
       
  4251     self assert:(n1 class == SmallInteger).
       
  4252     self assert:(n2 class == SmallInteger).
       
  4253 
       
  4254     self assert:((n1 + 1) class == LargeInteger).
       
  4255     t := n1 + 1.
       
  4256     self assert:((t - 1) class == SmallInteger).
       
  4257 
       
  4258     self assert:((n2 - 1) class == LargeInteger).
       
  4259     t := n2 - 1.
       
  4260     self assert:((t + 1) class == SmallInteger).
       
  4261 
       
  4262     self assert:((n1 negated) class == SmallInteger).
       
  4263     self assert:((n2 negated) class == LargeInteger).
       
  4264     self assert:((n1 perform:'negated' asSymbol) class == SmallInteger).
       
  4265     self assert:((n2 perform:'negated' asSymbol) class == LargeInteger).
       
  4266 
       
  4267     self assert:((n1 abs == n1)).
       
  4268     self assert:((n2 abs = n2 negated)).
       
  4269     self assert:((n1 perform:'abs' asSymbol) == n1).
       
  4270     self assert:((n2 perform:'abs' asSymbol) = n2 negated).
       
  4271 
       
  4272     self testSmallIntegerMultiplication1.
       
  4273     self testSmallIntegerMultiplication1b.
       
  4274     self testSmallIntegerMultiplication2.
       
  4275     self testSmallIntegerDivision1.
       
  4276 
       
  4277     "
       
  4278      self basicNew testSmallIntegerArithmetic
       
  4279     "
       
  4280 
       
  4281     "Created: / 06-06-1999 / 14:47:51 / cg"
       
  4282     "Modified: / 09-06-1999 / 17:49:57 / cg"
       
  4283     "Modified (format): / 19-09-2017 / 16:28:09 / stefan"
       
  4284     "Modified: / 12-03-2018 / 16:18:59 / mawalch"
       
  4285 !
       
  4286 
       
  4287 testSmallIntegerDivision1
       
  4288     "division tests.
       
  4289      Notice, the arithmetic tests are both performed via regular sends
       
  4290      and via constructed performs. The reason is to test both inlined
       
  4291      JIT-compiler code AND the regular methods code."
       
  4292 
       
  4293     |n1 n2|
       
  4294 
       
  4295     n1 := 1000.
       
  4296 
       
  4297     "/ truncation towards...
       
  4298 
       
  4299     "/ ... negative infinity
       
  4300     n2 := 3.
       
  4301     self assert:((n1 // n2) == 333).
       
  4302     self assert:((n1 // n2) printString = '333').
       
  4303     self assert:((n1 perform:'//' asSymbol with:n2) == 333).
       
  4304 
       
  4305     n2 := -3.
       
  4306     self assert:((n1 // n2) == -334).
       
  4307     self assert:((n1 // n2) printString = '-334').
       
  4308     self assert:((n1 perform:'//' asSymbol with:n2) == -334).
       
  4309 
       
  4310     n2 := 3600000.
       
  4311     self assert:((n1 // n2) == 0).
       
  4312     self assert:((n1 // n2) printString = '0').
       
  4313     self assert:((n1 perform:'//' asSymbol with:n2) == 0).
       
  4314 
       
  4315     n2 := -3600000.
       
  4316     self assert:((n1 // n2) == -1).
       
  4317     self assert:((n1 // n2) printString = '-1').
       
  4318     self assert:((n1 perform:'//' asSymbol with:n2) == -1).
       
  4319 
       
  4320     self assert:( (9000000000 \\ 4000000000)   = (900 \\ 400 * 10000000)).
       
  4321     self assert:( (-9000000000 \\ 4000000000)  = (-900 \\ 400 * 10000000)).
       
  4322     self assert:( (9000000000 \\ -4000000000)  = (900 \\ -400 * 10000000)).
       
  4323     self assert:( (-9000000000 \\ -4000000000) = (-900 \\ -400 * 10000000)).
       
  4324     self assert:( (16000000000 \\ 4000000000)  = (1600 \\ 400 * 10000000)).
       
  4325     self assert:( (-16000000000 \\ 4000000000)  = (-1600 \\ 400 * 10000000)).
       
  4326     self assert:( (16000000000 \\ -4000000000)  = (1600 \\ -400 * 10000000)).
       
  4327     self assert:( (-16000000000 \\ -4000000000)  = (-1600 \\ -400 * 10000000)).
       
  4328 
       
  4329     self assert:(( 9000000000 \\ 7 ) == 5).
       
  4330     self assert:( (((9000000000 // 7)*  7) + (9000000000 \\ 7)) = 9000000000 ).
       
  4331 
       
  4332     self assert:(( -9000000000 \\ 7) == 2).
       
  4333     self assert:( (((-9000000000 // 7) * 7) + (-9000000000 \\ 7)) = -9000000000 ).
       
  4334 
       
  4335     self assert:(( 9000000000 \\ -7) == -2).
       
  4336     self assert:( (((9000000000 // -7) * -7) + (9000000000 \\ -7)) = 9000000000 ).
       
  4337 
       
  4338     self assert:(( -9000000000 \\ -7) == -5).
       
  4339     self assert:( (((-9000000000 // -7) * -7) + (-9000000000 \\ -7)) = -9000000000 ).
       
  4340 
       
  4341     "/ ---------------------------
       
  4342     "/ towards zero
       
  4343     n2 := 3.
       
  4344     self assert:((n1 quo: n2) == 333).
       
  4345     self assert:((n1 quo: n2) printString = '333').
       
  4346     self assert:((n1 perform:'quo:' asSymbol with:n2) == 333).
       
  4347 
       
  4348     n2 := -3.
       
  4349     self assert:((n1 quo: n2) == -333).
       
  4350     self assert:((n1 quo: n2) printString = '-333').
       
  4351     self assert:((n1 perform:'quo:' asSymbol with:n2) == -333).
       
  4352 
       
  4353     n2 := 3600000.
       
  4354     self assert:((n1 quo: n2) == 0).
       
  4355     self assert:((n1 quo: n2) printString = '0').
       
  4356     self assert:((n1 perform:'quo:' asSymbol with:n2) == 0).
       
  4357 
       
  4358     n2 := -3600000.
       
  4359     self assert:((n1 quo: n2) == 0).
       
  4360     self assert:((n1 quo: n2) printString = '0').
       
  4361     self assert:((n1 perform:'quo:' asSymbol with:n2) == 0).
       
  4362 
       
  4363     self assert:( 900 rem: 400 ) == 100.
       
  4364     self assert:( (((900 quo: 400) * 400) + ( 900 rem: 400 )) == 900 ).
       
  4365 
       
  4366     self assert:( -900 rem: 400) == -100.  
       
  4367     self assert:( (((-900 quo: 400) * 400) + ( -900 rem: 400 )) == -900 ).
       
  4368 
       
  4369     self assert:( 900 rem: -400) == 100.  
       
  4370     self assert:( (((900 quo: -400) * -400) + ( 900 rem: -400 )) == 900 ).
       
  4371 
       
  4372     self assert:( -900 rem: -400) == -100.  
       
  4373     self assert:( (((-900 quo: -400) * -400) + ( -900 rem: -400 )) == -900 ).
       
  4374 
       
  4375     self assert:(  9000000000 rem: 4000000000 ) = 1000000000. 
       
  4376     self assert:( (((9000000000 quo: 4000000000)*4000000000) + ( 9000000000 rem: 4000000000 )) = 9000000000 ).
       
  4377 
       
  4378     self assert:(  -9000000000 rem: 4000000000 ) = -1000000000. 
       
  4379     self assert:( (((-9000000000 quo: 4000000000) * 4000000000) + ( -9000000000 rem: 4000000000 )) = -9000000000 ).
       
  4380 
       
  4381     self assert:(  9000000000 rem: -4000000000 ) = 1000000000. 
       
  4382     self assert:( (((9000000000 quo: -4000000000) * -4000000000) + ( 9000000000 rem: -4000000000 )) = 9000000000 ).
       
  4383 
       
  4384     self assert:(  -9000000000 rem: -4000000000 ) = -1000000000. 
       
  4385     self assert:( (((-9000000000 quo: -4000000000) * -4000000000) + ( -9000000000 rem: -4000000000 )) = -9000000000 ).
       
  4386 
       
  4387     "
       
  4388      self basicNew testSmallIntegerDivision1
       
  4389     "
       
  4390 
       
  4391     "Created: / 09-06-1999 / 17:49:45 / cg"
       
  4392     "Modified: / 05-07-2017 / 16:38:27 / cg"
       
  4393 !
       
  4394 
       
  4395 testSmallIntegerMultiplication1
       
  4396     "multiply tests (var * const).
       
  4397      Notice, the arithmetic tests are both performed via regular sends
       
  4398      and via constructed performs. The reason is to test both inlined
       
  4399      JIT-compiler code AND the regular methods code."
       
  4400 
       
  4401     |n1 n2|
       
  4402 
       
  4403     n1 := 100000.
       
  4404     n2 := n1 negated.
       
  4405 
       
  4406     self assert:(n1 printString = '100000').
       
  4407     self assert:(n2 printString = '-100000').
       
  4408 
       
  4409     self assert:((n1 * 0) printString = '0').
       
  4410     self assert:((n1 perform:'*' asSymbol with:0) printString = '0').
       
  4411 
       
  4412     self assert:((n1 * 1) printString = '100000').
       
  4413     self assert:((n1 perform:'*' asSymbol with:1) printString = '100000').
       
  4414     self assert:((n2 * 1) printString = '-100000').
       
  4415     self assert:((n2 perform:'*' asSymbol with:1) printString = '-100000').
       
  4416 
       
  4417     self assert:((n1 * -1) printString = '-100000').
       
  4418     self assert:((n1 perform:'*' asSymbol with:-1) printString = '-100000').
       
  4419     self assert:((n2 * -1) printString = '100000').
       
  4420     self assert:((n2 perform:'*' asSymbol with:-1) printString = '100000').
       
  4421 
       
  4422     self assert:((n1 * 2) printString = '200000').
       
  4423     self assert:((n1 perform:'*' asSymbol with:2) printString = '200000').
       
  4424     self assert:((n1 * 3) printString = '300000').
       
  4425     self assert:((n1 perform:'*' asSymbol with:3) printString = '300000').
       
  4426     self assert:((n1 * 4) printString = '400000').
       
  4427     self assert:((n1 perform:'*' asSymbol with:4) printString = '400000').
       
  4428     self assert:((n1 * 5) printString = '500000').
       
  4429     self assert:((n1 perform:'*' asSymbol with:5) printString = '500000').
       
  4430     self assert:((n1 * 6) printString = '600000').
       
  4431     self assert:((n1 perform:'*' asSymbol with:6) printString = '600000').
       
  4432     self assert:((n1 * 7) printString = '700000').
       
  4433     self assert:((n1 perform:'*' asSymbol with:7) printString = '700000').
       
  4434     self assert:((n1 * 8) printString = '800000').
       
  4435     self assert:((n1 perform:'*' asSymbol with:8) printString = '800000').
       
  4436     self assert:((n1 * 9) printString = '900000').
       
  4437     self assert:((n1 perform:'*' asSymbol with:9) printString = '900000').
       
  4438     self assert:((n1 * 10) printString = '1000000').
       
  4439     self assert:((n1 perform:'*' asSymbol with:10) printString = '1000000').
       
  4440     self assert:((n1 * 11) printString = '1100000').
       
  4441     self assert:((n1 perform:'*' asSymbol with:11) printString = '1100000').
       
  4442     self assert:((n1 * 12) printString = '1200000').
       
  4443     self assert:((n1 perform:'*' asSymbol with:12) printString = '1200000').
       
  4444     self assert:((n1 * 13) printString = '1300000').
       
  4445     self assert:((n1 perform:'*' asSymbol with:13) printString = '1300000').
       
  4446     self assert:((n1 * 14) printString = '1400000').
       
  4447     self assert:((n1 perform:'*' asSymbol with:14) printString = '1400000').
       
  4448     self assert:((n1 * 15) printString = '1500000').
       
  4449     self assert:((n1 perform:'*' asSymbol with:15) printString = '1500000').
       
  4450     self assert:((n1 * 16) printString = '1600000').
       
  4451     self assert:((n1 perform:'*' asSymbol with:16) printString = '1600000').
       
  4452 
       
  4453     n1 := 1.
       
  4454     n2 := 10.
       
  4455     self assert:((n1 * n2) printString = '10').
       
  4456     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10').
       
  4457     n2 := n2 * 10.
       
  4458     self assert:((n1 * n2) printString = '100').
       
  4459     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100').
       
  4460     n2 := n2 * 10.
       
  4461     self assert:((n1 * n2) printString = '1000').
       
  4462     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000').
       
  4463     n2 := n2 * 10.
       
  4464     self assert:((n1 * n2) printString = '10000').
       
  4465     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000').
       
  4466     n2 := n2 * 10.
       
  4467     self assert:((n1 * n2) printString = '100000').
       
  4468     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100000').
       
  4469     n2 := n2 * 10.
       
  4470     self assert:((n1 * n2) printString = '1000000').
       
  4471     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000000').
       
  4472     n2 := n2 * 10.
       
  4473     self assert:((n1 * n2) printString = '10000000').
       
  4474     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000000').
       
  4475     n2 := n2 * 10.
       
  4476     self assert:((n1 * n2) printString = '100000000').
       
  4477     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100000000').
       
  4478     n2 := n2 * 10.
       
  4479     self assert:((n1 * n2) printString = '1000000000').
       
  4480     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000000000').
       
  4481     n2 := n2 * 10.
       
  4482     self assert:((n1 * n2) printString = '10000000000').
       
  4483     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000000000').
       
  4484     n2 := n2 * 10.
       
  4485     self assert:((n1 * n2) printString = '100000000000').
       
  4486     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100000000000').
       
  4487     n2 := n2 * 10.
       
  4488     self assert:((n1 * n2) printString = '1000000000000').
       
  4489     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000000000000').
       
  4490     n2 := n2 * 10.
       
  4491     self assert:((n1 * n2) printString = '10000000000000').
       
  4492     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000000000000').
       
  4493 
       
  4494     n1 := 1.
       
  4495     n2 := 10.
       
  4496     self assert:((n1 * n2) printString = '10').
       
  4497     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10').
       
  4498     n1 := n1 * 10.
       
  4499     self assert:((n1 * n2) printString = '100').
       
  4500     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100').
       
  4501     n1 := n1 * 10.
       
  4502     self assert:((n1 * n2) printString = '1000').
       
  4503     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000').
       
  4504     n1 := n1 * 10.
       
  4505     self assert:((n1 * n2) printString = '10000').
       
  4506     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000').
       
  4507     n1 := n1 * 10.
       
  4508     self assert:((n1 * n2) printString = '100000').
       
  4509     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100000').
       
  4510     n1 := n1 * 10.
       
  4511     self assert:((n1 * n2) printString = '1000000').
       
  4512     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000000').
       
  4513     n1 := n1 * 10.
       
  4514     self assert:((n1 * n2) printString = '10000000').
       
  4515     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000000').
       
  4516     n1 := n1 * 10.
       
  4517     self assert:((n1 * n2) printString = '100000000').
       
  4518     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100000000').
       
  4519     n1 := n1 * 10.
       
  4520     self assert:((n1 * n2) printString = '1000000000').
       
  4521     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000000000').
       
  4522     n1 := n1 * 10.
       
  4523     self assert:((n1 * n2) printString = '10000000000').
       
  4524     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000000000').
       
  4525     n1 := n1 * 10.
       
  4526     self assert:((n1 * n2) printString = '100000000000').
       
  4527     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100000000000').
       
  4528     n1 := n1 * 10.
       
  4529     self assert:((n1 * n2) printString = '1000000000000').
       
  4530     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000000000000').
       
  4531     n1 := n1 * 10.
       
  4532     self assert:((n1 * n2) printString = '10000000000000').
       
  4533     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000000000000').
       
  4534 
       
  4535     n1 := 10.
       
  4536     n2 := 10.
       
  4537     self assert:((n1 * n2) printString = '100').
       
  4538     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100').
       
  4539     n1 := n1 * 10.
       
  4540     n2 := n2 * 10.
       
  4541     self assert:((n1 * n2) printString = '10000').
       
  4542     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000').
       
  4543     n1 := n1 * 10.
       
  4544     n2 := n2 * 10.
       
  4545     self assert:((n1 * n2) printString = '1000000').
       
  4546     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000000').
       
  4547     n1 := n1 * 10.
       
  4548     n2 := n2 * 10.
       
  4549     self assert:((n1 * n2) printString = '100000000').
       
  4550     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100000000').
       
  4551     n1 := n1 * 10.
       
  4552     n2 := n2 * 10.
       
  4553     self assert:((n1 * n2) printString = '10000000000').
       
  4554     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000000000').
       
  4555     n1 := n1 * 10.
       
  4556     n2 := n2 * 10.
       
  4557     self assert:((n1 * n2) printString = '1000000000000').
       
  4558     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000000000000').
       
  4559     n1 := n1 * 10.
       
  4560     n2 := n2 * 10.
       
  4561     self assert:((n1 * n2) printString = '100000000000000').
       
  4562     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100000000000000').
       
  4563     n1 := n1 * 10.
       
  4564     n2 := n2 * 10.
       
  4565     self assert:((n1 * n2) printString = '10000000000000000').
       
  4566     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000000000000000').
       
  4567     n1 := n1 * 10.
       
  4568     n2 := n2 * 10.
       
  4569     self assert:((n1 * n2) printString = '1000000000000000000').
       
  4570     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000000000000000000').
       
  4571     n1 := n1 * 10.
       
  4572     n2 := n2 * 10.
       
  4573     self assert:((n1 * n2) printString = '100000000000000000000').
       
  4574     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100000000000000000000').
       
  4575     n1 := n1 * 10.
       
  4576     n2 := n2 * 10.
       
  4577     self assert:((n1 * n2) printString = '10000000000000000000000').
       
  4578     self assert:((n1 perform:'*' asSymbol with:n2) printString = '10000000000000000000000').
       
  4579     n1 := n1 * 10.
       
  4580     n2 := n2 * 10.
       
  4581     self assert:((n1 * n2) printString = '1000000000000000000000000').
       
  4582     self assert:((n1 perform:'*' asSymbol with:n2) printString = '1000000000000000000000000').
       
  4583     n1 := n1 * 10.
       
  4584     n2 := n2 * 10.
       
  4585     self assert:((n1 * n2) printString = '100000000000000000000000000').
       
  4586     self assert:((n1 perform:'*' asSymbol with:n2) printString = '100000000000000000000000000').
       
  4587 
       
  4588     "
       
  4589      self basicNew testSmallIntegerMultiplication1
       
  4590     "
       
  4591 
       
  4592     "Modified: / 9.6.1999 / 17:47:56 / cg"
       
  4593     "Created: / 9.6.1999 / 17:49:45 / cg"
       
  4594 !
       
  4595 
       
  4596 testSmallIntegerMultiplication1b
       
  4597     "multiply tests (const * var).
       
  4598      Notice, the arithmetic tests are both performed via regular sends
       
  4599      and via constructed performs. The reason is to test both inlined
       
  4600      JIT-compiler code AND the regular methods code."
       
  4601 
       
  4602     |n1 n2|
       
  4603 
       
  4604     n1 := 100000.
       
  4605     n2 := n1 negated.
       
  4606 
       
  4607     self assert:((0 * n1) printString = '0').
       
  4608     self assert:((0 perform:'*' asSymbol with:n1) printString = '0').
       
  4609 
       
  4610     self assert:((1 * n1) printString = '100000').
       
  4611     self assert:((1 perform:'*' asSymbol with:n1) printString = '100000').
       
  4612     self assert:((1 * n2) printString = '-100000').
       
  4613     self assert:((1 perform:'*' asSymbol with:n2) printString = '-100000').
       
  4614 
       
  4615     self assert:((-1 * n1) printString = '-100000').
       
  4616     self assert:((-1 perform:'*' asSymbol with:n1) printString = '-100000').
       
  4617     self assert:((-1 * n2) printString = '100000').
       
  4618     self assert:((-1 perform:'*' asSymbol with:n2) printString = '100000').
       
  4619 
       
  4620     self assert:((2 * n1) printString = '200000').
       
  4621     self assert:((2 perform:'*' asSymbol with:n1) printString = '200000').
       
  4622     self assert:((3 * n1) printString = '300000').
       
  4623     self assert:((3 perform:'*' asSymbol with:n1) printString = '300000').
       
  4624     self assert:((4 * n1) printString = '400000').
       
  4625     self assert:((4 perform:'*' asSymbol with:n1) printString = '400000').
       
  4626     self assert:((5 * n1) printString = '500000').
       
  4627     self assert:((5 perform:'*' asSymbol with:n1) printString = '500000').
       
  4628     self assert:((6 * n1) printString = '600000').
       
  4629     self assert:((6 perform:'*' asSymbol with:n1) printString = '600000').
       
  4630     self assert:((7 * n1) printString = '700000').
       
  4631     self assert:((7 perform:'*' asSymbol with:n1) printString = '700000').
       
  4632     self assert:((8 * n1) printString = '800000').
       
  4633     self assert:((8 perform:'*' asSymbol with:n1) printString = '800000').
       
  4634     self assert:((9 * n1) printString = '900000').
       
  4635     self assert:((9 perform:'*' asSymbol with:n1) printString = '900000').
       
  4636     self assert:((10 * n1) printString = '1000000').
       
  4637     self assert:((10 perform:'*' asSymbol with:n1) printString = '1000000').
       
  4638     self assert:((11 * n1) printString = '1100000').
       
  4639     self assert:((11 perform:'*' asSymbol with:n1) printString = '1100000').
       
  4640 
       
  4641     "
       
  4642      self basicNew testSmallIntegerMultiplication1b
       
  4643     "
       
  4644 
       
  4645     "Modified: / 9.6.1999 / 17:47:56 / cg"
       
  4646     "Created: / 9.6.1999 / 17:49:45 / cg"
       
  4647 !
       
  4648 
       
  4649 testSmallIntegerMultiplication2
       
  4650     "multiply tests.
       
  4651      Notice, the arithmetic tests are both performed via regular sends
       
  4652      and via constructed performs. The reason is to test both inlined
       
  4653      JIT-compiler code AND the regular methods code."
       
  4654 
       
  4655     |n1 n2|
       
  4656 
       
  4657     n1 := 100000.
       
  4658     n2 := n1 negated.
       
  4659 
       
  4660     self assert:((n1 * 2) printString = '200000').
       
  4661     self assert:((n1 perform:'*' asSymbol with:2) printString = '200000').
       
  4662     self assert:((n1 * 3) printString = '300000').
       
  4663     self assert:((n1 perform:'*' asSymbol with:3) printString = '300000').
       
  4664     self assert:((n1 * 4) printString = '400000').
       
  4665     self assert:((n1 perform:'*' asSymbol with:4) printString = '400000').
       
  4666     self assert:((n1 * 5) printString = '500000').
       
  4667     self assert:((n1 perform:'*' asSymbol with:5) printString = '500000').
       
  4668     self assert:((n1 * 6) printString = '600000').
       
  4669     self assert:((n1 perform:'*' asSymbol with:6) printString = '600000').
       
  4670     self assert:((n1 * 7) printString = '700000').
       
  4671     self assert:((n1 perform:'*' asSymbol with:7) printString = '700000').
       
  4672     self assert:((n1 * 8) printString = '800000').
       
  4673     self assert:((n1 perform:'*' asSymbol with:8) printString = '800000').
       
  4674     self assert:((n1 * 9) printString = '900000').
       
  4675     self assert:((n1 perform:'*' asSymbol with:9) printString = '900000').
       
  4676     self assert:((n1 * 10) printString = '1000000').
       
  4677     self assert:((n1 perform:'*' asSymbol with:10) printString = '1000000').
       
  4678     self assert:((n1 * 11) printString = '1100000').
       
  4679     self assert:((n1 perform:'*' asSymbol with:11) printString = '1100000').
       
  4680     self assert:((n1 * 12) printString = '1200000').
       
  4681     self assert:((n1 perform:'*' asSymbol with:12) printString = '1200000').
       
  4682     self assert:((n1 * 13) printString = '1300000').
       
  4683     self assert:((n1 perform:'*' asSymbol with:13) printString = '1300000').
       
  4684     self assert:((n1 * 14) printString = '1400000').
       
  4685     self assert:((n1 perform:'*' asSymbol with:14) printString = '1400000').
       
  4686     self assert:((n1 * 15) printString = '1500000').
       
  4687     self assert:((n1 perform:'*' asSymbol with:15) printString = '1500000').
       
  4688     self assert:((n1 * 16) printString = '1600000').
       
  4689     self assert:((n1 perform:'*' asSymbol with:16) printString = '1600000').
       
  4690     self assert:((n1 * 17) printString = '1700000').
       
  4691     self assert:((n1 perform:'*' asSymbol with:17) printString = '1700000').
       
  4692     self assert:((n1 * 18) printString = '1800000').
       
  4693     self assert:((n1 perform:'*' asSymbol with:18) printString = '1800000').
       
  4694     self assert:((n1 * 19) printString = '1900000').
       
  4695     self assert:((n1 perform:'*' asSymbol with:19) printString = '1900000').
       
  4696 
       
  4697     "
       
  4698      self basicNew testSmallIntegerMultiplication2
       
  4699     "
       
  4700 
       
  4701     "Modified: / 9.6.1999 / 17:47:56 / cg"
       
  4702     "Created: / 9.6.1999 / 17:49:45 / cg"
       
  4703 !
       
  4704 
       
  4705 testSmallIntegerMultiplication3
       
  4706     "multiply tests.
       
  4707      Notice, the arithmetic tests are both performed via regular sends
       
  4708      and via constructed performs. The reason is to test both inlined
       
  4709      JIT-compiler code AND the regular methods code."
       
  4710 
       
  4711     |n1 n2|
       
  4712 
       
  4713     n1 := 16rFFFF.
       
  4714     n2 := n1 negated.
       
  4715 
       
  4716     self assert:((n1 * 2) printString = '131070').
       
  4717     self assert:((n1 perform:'*' asSymbol with:2) printString = '131070').
       
  4718     self assert:((n2 * 2) printString = '-131070').
       
  4719     self assert:((n2 perform:'*' asSymbol with:2) printString = '-131070').
       
  4720 
       
  4721     n1 := 16rFFFFFF.
       
  4722     n2 := n1 negated.
       
  4723 
       
  4724     self assert:((n1 * 2) printString = '33554430').
       
  4725     self assert:((n1 perform:'*' asSymbol with:2) printString = '33554430').
       
  4726     self assert:((n2 * 2) printString = '-33554430').
       
  4727     self assert:((n2 perform:'*' asSymbol with:2) printString = '-33554430').
       
  4728 
       
  4729     n1 := 16r3FFFFFFF.
       
  4730     n2 := n1 negated.
       
  4731 
       
  4732     self assert:((n1 * 2) printString = '2147483646').
       
  4733     self assert:((n1 perform:'*' asSymbol with:2) printString = '2147483646').
       
  4734     self assert:((n2 * 2) printString = '-2147483646').
       
  4735     self assert:((n2 perform:'*' asSymbol with:2) printString = '-2147483646').
       
  4736 
       
  4737     SmallInteger maxBytes == 4 ifTrue:[
       
  4738         n1 := 16r3FFFFFFF.
       
  4739     ] ifFalse:[
       
  4740         n1 := 16r3FFFFFFFFFFFFFFF.
       
  4741     ].
       
  4742     self assert:(n1 class == SmallInteger).
       
  4743     self assert:((n1 * 2) class == LargeInteger).
       
  4744     self assert:((n1 perform:'*' asSymbol with:2) class == LargeInteger).
       
  4745 
       
  4746     n1 := SmallInteger maxVal // 11.
       
  4747     self assert:((n1 * 11) class == SmallInteger).
       
  4748 
       
  4749     n1 := n1 + 1.
       
  4750     self assert:((n1 * 11) class == LargeInteger).
       
  4751 
       
  4752     "
       
  4753      self basicNew testSmallIntegerMultiplication3
       
  4754     "
       
  4755 
       
  4756     "Modified: / 9.6.1999 / 17:47:56 / cg"
       
  4757     "Created: / 9.6.1999 / 17:49:45 / cg"
       
  4758 !
       
  4759 
       
  4760 testSmallIntegerNegation
       
  4761     "tests boundary conditions at small/large phase change."
       
  4762 
       
  4763     |n1 n2 n3|
       
  4764 
       
  4765     n1 := 16r3fffffff.
       
  4766     n2 := n1 negated.
       
  4767     n3 := n2 negated.
       
  4768 
       
  4769     self assert:(n1 class == SmallInteger).
       
  4770     self assert:(n2 class == SmallInteger).
       
  4771     self assert:(n3 == n1).
       
  4772 
       
  4773     self assert:(n1 = 16r3FFFFFFF).
       
  4774     self assert:(n2 = 16r-3FFFFFFF).
       
  4775     self assert:(n1 == 16r3FFFFFFF).
       
  4776     self assert:(n2 == 16r-3FFFFFFF).
       
  4777     self assert:(n1 printString = '1073741823').
       
  4778     self assert:(n2 printString = '-1073741823').
       
  4779 
       
  4780     "/ ---------------------
       
  4781 
       
  4782     n1 := 16rffffffff.
       
  4783     n2 := n1 negated.
       
  4784     n3 := n2 negated.
       
  4785 
       
  4786     SmallInteger maxBytes == 8 ifTrue:[
       
  4787         self assert:(n1 class == SmallInteger).
       
  4788         self assert:(n2 class == SmallInteger).
       
  4789         self assert:(n3 == n1).
       
  4790         self assert:(n2 == 16r-fFFFFFFF).
       
  4791         self assert:(n1 == 16rfFFFFFFF).
       
  4792     ] ifFalse:[
       
  4793         self assert:(n1 class == LargeInteger).
       
  4794         self assert:(n2 class == LargeInteger).
       
  4795         self assert:(n3 = n1).
       
  4796     ].
       
  4797     self assert:(n1 = 16rfFFFFFFF).
       
  4798     self assert:(n2 = 16r-fFFFFFFF).
       
  4799     self assert:(n1 printString = '4294967295').
       
  4800     self assert:(n2 printString = '-4294967295').
       
  4801 
       
  4802     "/ ---------------------
       
  4803 
       
  4804     n1 := SmallInteger maxVal.
       
  4805     n2 := n1 negated.
       
  4806     n3 := n2 negated.
       
  4807 
       
  4808     self assert:(n1 class == SmallInteger).
       
  4809     self assert:(n2 class == SmallInteger).
       
  4810     self assert:(n3 == n1).
       
  4811 
       
  4812     SmallInteger maxBytes == 4 ifTrue:[
       
  4813         self assert:(n1 = 16r3FFFFFFF).
       
  4814         self assert:(n2 = 16r-3FFFFFFF).
       
  4815         self assert:(n1 == 16r3FFFFFFF).
       
  4816         self assert:(n2 == 16r-3FFFFFFF).
       
  4817         self assert:(n1 printString = '1073741823').
       
  4818         self assert:(n2 printString = '-1073741823').
       
  4819     ] ifFalse:[
       
  4820         self assert:(n1 printString = '4611686018427387903').
       
  4821         self assert:(n2 printString = '-4611686018427387903').
       
  4822         self assert:(n1 =   16r3FFFFFFFFFFFFFFF).
       
  4823         self assert:(n2 =  16r-3FFFFFFFFFFFFFFF).
       
  4824         self assert:(n1 ==  16r3FFFFFFFFFFFFFFF).
       
  4825         self assert:(n2 == 16r-3FFFFFFFFFFFFFFF).
       
  4826     ].
       
  4827 
       
  4828     "
       
  4829      self basicNew testSmallIntegerNegation
       
  4830     "
       
  4831 
       
  4832     "Modified: / 10-10-2016 / 23:31:11 / cg"
       
  4833     "Modified (format): / 19-09-2017 / 16:28:22 / stefan"
       
  4834 ! !
       
  4835 
       
  4836 !IntegerTest methodsFor:'tests-bit fiddling'!
       
  4837 
       
  4838 testAnyBit
       
  4839     self assert:(0 anyBitOfMagnitudeFrom:1 to:1) not.
       
  4840     self assert:(1 anyBitOfMagnitudeFrom:1 to:1).
       
  4841     self assert:(1 anyBitOfMagnitudeFrom:2 to:2) not.
       
  4842     self assert:(1 anyBitOfMagnitudeFrom:1 to:10).
       
  4843     self assert:(1 anyBitOfMagnitudeFrom:2 to:10) not.
       
  4844 
       
  4845     self assert:(128 anyBitOfMagnitudeFrom:1 to:7) not.
       
  4846     self assert:(128 anyBitOfMagnitudeFrom:1 to:8).
       
  4847     self assert:(128 anyBitOfMagnitudeFrom:8 to:16).
       
  4848     self assert:(128 anyBitOfMagnitudeFrom:1 to:24).
       
  4849 
       
  4850     self assert:(256 anyBitOfMagnitudeFrom:1 to:7) not.
       
  4851     self assert:(256 anyBitOfMagnitudeFrom:1 to:8) not.
       
  4852     self assert:(256 anyBitOfMagnitudeFrom:9 to:9).
       
  4853     self assert:(256 anyBitOfMagnitudeFrom:4 to:9).
       
  4854     self assert:(256 anyBitOfMagnitudeFrom:9 to:25).
       
  4855     self assert:(256 anyBitOfMagnitudeFrom:8 to:16).
       
  4856     self assert:(256 anyBitOfMagnitudeFrom:1 to:24).
       
  4857 
       
  4858     "Created: / 27-05-2019 / 08:39:19 / Claus Gittinger"
       
  4859 !
       
  4860 
       
  4861 testBitCount
       
  4862      #( 16r100000000
       
  4863         16r1000000000 
       
  4864         16r100000000000
       
  4865         16r10000000000000
       
  4866         16r1000000000000000
       
  4867         16r100000000000000000 
       
  4868         16r10000000000000000000
       
  4869         16r1000000000000000000000
       
  4870         16r100000000000000000000000
       
  4871         16r10000000000000000000000000 
       
  4872         16r1000000000000000000000000000 
       
  4873         16r100000000000000000000000000000 
       
  4874         16r10000000000000000000000000000000 
       
  4875         16r1000000000000000000000000000000000
       
  4876      ) do:[:n |
       
  4877          self assert:(n bitCount == 1)
       
  4878     ].
       
  4879      #( 16rA0A0A0A0A
       
  4880         16rA0A0A0A0A0 
       
  4881         16rA0A0A0A0A0A0
       
  4882         16rA0A0A0A0A0A0A0
       
  4883         16rA0A0A0A0A0A0A0A0
       
  4884         16rA0A0A0A0A0A0A0A0A0 
       
  4885         16rA0A0A0A0A0A0A0A0A0A0
       
  4886         16rA0A0A0A0A0A0A0A0A0A0A0
       
  4887         16rA0A0A0A0A0A0A0A0A0A0A0A0
       
  4888         16rA0A0A0A0A0A0A0A0A0A0A0A0A0 
       
  4889         16rA0A0A0A0A0A0A0A0A0A0A0A0A0A0 
       
  4890         16rA0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 
       
  4891         16rA0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 
       
  4892         16rA0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0
       
  4893      ) do:[:n |
       
  4894          self assert:(n bitCount == ((n hexPrintString occurrencesOf:$A)*2))
       
  4895     ].
       
  4896 
       
  4897     "Created: / 20-03-2019 / 12:45:37 / Claus Gittinger"
       
  4898 !
       
  4899 
       
  4900 testBitInterleaving
       
  4901     "check Morton number generation
       
  4902      -> https://en.wikipedia.org/wiki/Morton_number_(number_theory))"
       
  4903      
       
  4904                                                 "/       0 0 1 1                
       
  4905                                                 "/      1 0 1 0                
       
  4906      self assert:(2r0011 bitInterleaveWith:2r1010) == 2r10001101.
       
  4907      self assert:(2r10001101 bitDeinterleave:2) = #(2r0011 2r1010).
       
  4908 
       
  4909                                                 "/                   0  0  1  1                
       
  4910                                                 "/                  1  0  1  0                
       
  4911                                                 "/                 1  1  0  1                
       
  4912      self assert:(2r0011 bitInterleaveWith:2r1010 and:2r1101) == 2r110100011101.
       
  4913      self assert:(2r110100011101 bitDeinterleave:3) = #(2r0011 2r1010 2r1101).
       
  4914 
       
  4915     "Created: / 04-06-2019 / 01:16:09 / Claus Gittinger"
       
  4916 !
       
  4917 
       
  4918 testBitReversed
       
  4919     #( 
       
  4920         2r10000000 2r00000001
       
  4921         2r01000000 2r00000010
       
  4922         2r00100000 2r00000100
       
  4923         2r00010000 2r00001000
       
  4924         2r00001000 2r00010000
       
  4925         2r00000100 2r00100000
       
  4926         2r00000010 2r01000000
       
  4927         2r00000001 2r10000000
       
  4928 
       
  4929         "/ high bits are to be ignored (i.e. clear) 
       
  4930         2r100000001 2r10000000
       
  4931         2r110000000 2r00000001
       
  4932     )
       
  4933     pairWiseDo:[:in :expected |
       
  4934         self assert:(in bitReversed8 == expected)
       
  4935     ].
       
  4936 
       
  4937     #( 
       
  4938         2r1000000000000000 2r0000000000000001
       
  4939         2r0100000000000000 2r0000000000000010
       
  4940         2r0010000000000000 2r0000000000000100
       
  4941         2r0001000000000000 2r0000000000001000
       
  4942         2r0000100000000000 2r0000000000010000
       
  4943         2r0000010000000000 2r0000000000100000
       
  4944         2r0000001000000000 2r0000000001000000
       
  4945         2r0000000100000000 2r0000000010000000
       
  4946 
       
  4947         2r0000000010000000 2r0000000100000000
       
  4948         2r0000000001000000 2r0000001000000000
       
  4949         2r0000000000100000 2r0000010000000000
       
  4950         2r0000000000010000 2r0000100000000000
       
  4951         2r0000000000001000 2r0001000000000000
       
  4952         2r0000000000000100 2r0010000000000000
       
  4953         2r0000000000000010 2r0100000000000000
       
  4954         2r0000000000000001 2r1000000000000000
       
  4955 
       
  4956         "/ high bits are to be ignored (i.e. clear) 
       
  4957         2r10000000000000001 2r1000000000000000
       
  4958         2r11000000000000000 2r0000000000000001
       
  4959     )
       
  4960     pairWiseDo:[:in :expected |
       
  4961         self assert:(in bitReversed16 == expected)
       
  4962     ].
       
  4963 
       
  4964     0 to:64 do:[:n |
       
  4965         |nr|
       
  4966         
       
  4967         nr := 1 bitShift:n.
       
  4968         n < 16 ifTrue:[
       
  4969             self assert:((nr bitReversed16) bitReversed16) = nr.
       
  4970         ].    
       
  4971         n < 32 ifTrue:[
       
  4972             self assert:((nr bitReversed32) bitReversed32) = nr.
       
  4973         ].    
       
  4974         n < 64 ifTrue:[
       
  4975             self assert:((nr bitReversed64) bitReversed64) = nr.
       
  4976         ].    
       
  4977     ].
       
  4978     
       
  4979     #(
       
  4980       16r12345678 
       
  4981       16r23456781 
       
  4982       16r34567812 
       
  4983       16r45678123 
       
  4984       16r56781234 
       
  4985       16r67812345 
       
  4986       16r78123456 
       
  4987       16r81234567 
       
  4988     ) do:[:each |
       
  4989         |s1 s2 s1Padded s2Padded|
       
  4990 
       
  4991         s1 := each printStringRadix:2.
       
  4992         s2 := each bitReversed32 printStringRadix:2.
       
  4993         s1Padded := s1 leftPaddedTo:32 with:$0.
       
  4994         s2Padded := s2 leftPaddedTo:32 with:$0.
       
  4995         self assert:(s1Padded = s2Padded reversed).
       
  4996     ].
       
  4997 
       
  4998     #(
       
  4999       16r0123456789ABCDEF 
       
  5000       16r123456789ABCDEF0 
       
  5001       16r23456789ABCDEF01 
       
  5002       16r3456789ABCDEF012 
       
  5003       16r456789ABCDEF0123 
       
  5004       16r56789ABCDEF01234 
       
  5005       16r6789ABCDEF012345 
       
  5006       16r789ABCDEF0123456 
       
  5007       16r89ABCDEF01234567 
       
  5008     ) do:[:each |
       
  5009         |s1 s2 s1Padded s2Padded|
       
  5010 
       
  5011         s1 := each printStringRadix:2.
       
  5012         s2 := each bitReversed64 printStringRadix:2.
       
  5013         s1Padded := s1 leftPaddedTo:64 with:$0.
       
  5014         s2Padded := s2 leftPaddedTo:64 with:$0.
       
  5015         self assert:(s1Padded = s2Padded reversed).
       
  5016     ].
       
  5017 
       
  5018     "Created: / 24-03-2019 / 11:36:18 / Claus Gittinger"
       
  5019     "Modified: / 27-03-2019 / 15:16:43 / stefan"
       
  5020     "Modified: / 28-03-2019 / 16:59:52 / Claus Gittinger"
       
  5021 !
       
  5022 
       
  5023 testBitShift
       
  5024     self assert:(1 bitShift:1) = 2.
       
  5025     self assert:(-1 bitShift:1) = -2.
       
  5026 
       
  5027     self assert:(1 bitShift:7) = 128.
       
  5028     self assert:(-1 bitShift:7) = -128.
       
  5029 
       
  5030     self assert:(1 bitShift:8) = 16r100.
       
  5031     self assert:(-1 bitShift:8) = 16r-100.
       
  5032 
       
  5033     self assert:(1 bitShift:16) = 16r10000.
       
  5034     self assert:(-1 bitShift:16) = 16r-10000.
       
  5035 
       
  5036     self assert:(1 bitShift:24) = 16r1000000.
       
  5037     self assert:(-1 bitShift:24) = 16r-1000000.
       
  5038 
       
  5039     "/ the following are out of the smallInteger range on 32bit systems
       
  5040     self assert:(1 bitShift:30) = 16r40000000.
       
  5041     self assert:(-1 bitShift:30) = 16r-40000000.
       
  5042 
       
  5043     self assert:(1 bitShift:31) = 16r80000000.
       
  5044     self assert:(-1 bitShift:31) = 16r-80000000.
       
  5045 
       
  5046     self assert:(1 bitShift:32) = 16r100000000.
       
  5047     self assert:(-1 bitShift:32) = 16r-100000000.
       
  5048 
       
  5049     self assert:(1 bitShift:40) = 16r10000000000.
       
  5050     self assert:(-1 bitShift:40) = 16r-10000000000.
       
  5051 
       
  5052     self assert:(1 bitShift:56) = 16r100000000000000.
       
  5053     self assert:(-1 bitShift:56) = 16r-100000000000000.
       
  5054 
       
  5055     "/ the following are out of the smallInteger range on 32bit systems
       
  5056     self assert:(1 bitShift:62) = 16r4000000000000000.
       
  5057     self assert:(-1 bitShift:62) = 16r-4000000000000000.
       
  5058 
       
  5059     self assert:(1 bitShift:63) = 16r8000000000000000.
       
  5060     self assert:(-1 bitShift:63) = 16r-8000000000000000.
       
  5061 
       
  5062     self assert:(1 bitShift:64) = 16r10000000000000000.
       
  5063     self assert:(-1 bitShift:64) = 16r-10000000000000000.
       
  5064 
       
  5065     "Created: / 04-06-2019 / 00:58:47 / Claus Gittinger"
       
  5066 !
  4841 !
  5067 
  4842 
  5068 testRightShift
  4843 testRightShift
  5069     "right shifts must preserve the sign - even for large integers"
  4844     "right shifts must preserve the sign - even for large integers"
  5070     
  4845     
  5079         self assert:((1 bitShift:cnt) bitShift:cnt negated) = 1.
  4854         self assert:((1 bitShift:cnt) bitShift:cnt negated) = 1.
  5080         self assert:((-1 bitShift:cnt) bitShift:cnt negated) = -1.
  4855         self assert:((-1 bitShift:cnt) bitShift:cnt negated) = -1.
  5081     ].
  4856     ].
  5082 
  4857 
  5083     "Created: / 04-06-2019 / 01:05:30 / Claus Gittinger"
  4858     "Created: / 04-06-2019 / 01:05:30 / Claus Gittinger"
       
  4859 !
       
  4860 
       
  4861 testSignExtension
       
  4862     "/ 8bit
       
  4863     self assert:( 16r80 signExtendedByteValue = -128 ).
       
  4864     self assert:( 16r7F signExtendedByteValue = 127 ).  
       
  4865     self assert:( 16rFF signExtendedByteValue = -1 ).
       
  4866 
       
  4867     "/ higher bits are ignored
       
  4868     self assert:( 16rF80 signExtendedByteValue = -128 ).
       
  4869     self assert:( 16rF7F signExtendedByteValue = 127 ).  
       
  4870     self assert:( 16rFFF signExtendedByteValue = -1 ).
       
  4871 
       
  4872     "/ 16bit
       
  4873     self assert:( 16r8000 signExtendedShortValue = -32768 ).
       
  4874     self assert:( 16r7FFF signExtendedShortValue = 32767 ).  
       
  4875     self assert:( 16rFFFF signExtendedShortValue = -1 ).
       
  4876 
       
  4877     "/ higher bits are ignored
       
  4878     self assert:( 16rF8000 signExtendedShortValue = -32768 ).
       
  4879     self assert:( 16rF7FFF signExtendedShortValue = 32767 ).  
       
  4880     self assert:( 16rFFFFF signExtendedShortValue = -1 ).
       
  4881 
       
  4882     "/ 24bit
       
  4883     self assert:( 16r800000 signExtended24BitValue = -8388608 ).
       
  4884     self assert:( 16r7FFFFF signExtended24BitValue = 8388607 ).  
       
  4885     self assert:( 16rFFFFFF signExtended24BitValue = -1 ).
       
  4886 
       
  4887     "/ higher bits are ignored
       
  4888     self assert:( 16rF800000 signExtended24BitValue = -8388608 ).
       
  4889     self assert:( 16rF7FFFFF signExtended24BitValue = 8388607 ).  
       
  4890     self assert:( 16rFFFFFFF signExtended24BitValue = -1 ).
       
  4891 
       
  4892     "/ 32bit
       
  4893     self assert:( 16r80000000 signExtendedLongValue = -2147483648 ).
       
  4894     self assert:( 16r7FFFFFFF signExtendedLongValue = 2147483647 ).  
       
  4895     self assert:( 16rFFFFFFFF signExtendedLongValue = -1 ).
       
  4896 
       
  4897     "/ higher bits are ignored
       
  4898     self assert:( 16rF80000000 signExtendedLongValue = -2147483648 ).
       
  4899     self assert:( 16rF7FFFFFFF signExtendedLongValue = 2147483647 ).  
       
  4900     self assert:( 16rFFFFFFFFF signExtendedLongValue = -1 ).
       
  4901 
       
  4902     "/ 64bit
       
  4903     self assert:( 16r8000000000000000 signExtendedLongLongValue = -9223372036854775808 ).
       
  4904     self assert:( 16r7FFFFFFFFFFFFFFF signExtendedLongLongValue = 9223372036854775807 ).  
       
  4905     self assert:( 16rFFFFFFFFFFFFFFFF signExtendedLongLongValue = -1 ).
       
  4906 
       
  4907     "/ higher bits are ignored
       
  4908     self assert:( 16rF8000000000000000 signExtendedLongLongValue = -9223372036854775808 ).
       
  4909     self assert:( 16rF7FFFFFFFFFFFFFFF signExtendedLongLongValue = 9223372036854775807 ).  
       
  4910     self assert:( 16rFFFFFFFFFFFFFFFFF signExtendedLongLongValue = -1 ).
       
  4911 
       
  4912     "/ arbitrary nr of bits
       
  4913     self assert:( 2r1000 signExtendedFromBit:4) = -8 .
       
  4914     self assert:( 2r0111 signExtendedFromBit:4) = 7 .  
       
  4915     self assert:( 2r1111 signExtendedFromBit:4) = -1 .
       
  4916 
       
  4917     "Created: / 21-07-2017 / 15:15:53 / cg"
  5084 !
  4918 !
  5085 
  4919 
  5086 testZigZagCoding
  4920 testZigZagCoding
  5087     "zigzag is used by google's protocol buffer encoding"
  4921     "zigzag is used by google's protocol buffer encoding"
  5088     
  4922     
  5281     "Modified: / 27-04-2010 / 00:02:15 / cg"
  5115     "Modified: / 27-04-2010 / 00:02:15 / cg"
  5282 ! !
  5116 ! !
  5283 
  5117 
  5284 !IntegerTest methodsFor:'tests-misc'!
  5118 !IntegerTest methodsFor:'tests-misc'!
  5285 
  5119 
       
  5120 testBinco
       
  5121      self assert: (10 binomialCoefficient:5) = (10 factorial / (5 factorial * 5 factorial)).
       
  5122      self assert: (100 binomialCoefficient:78) = (100 factorial / (78 factorial * (100-78) factorial)).
       
  5123      self assert: (1000 binomialCoefficient:5) = (1000 factorial / (5 factorial * (1000-5) factorial)).
       
  5124      self assert: (10000 binomialCoefficient:78) = (10000 factorial / (78 factorial * (10000-78) factorial)).
       
  5125      self assert: (0 binomialCoefficient:0) = 1.
       
  5126      self assert: (10 binomialCoefficient:10) = 1.
       
  5127 
       
  5128     "
       
  5129      self basicNew testBinco
       
  5130     "
       
  5131 !
       
  5132 
       
  5133 testEncodeDecode
       
  5134     self assert:(1 encodeAsBCD hexPrintString = '1').
       
  5135     self assert:(12 encodeAsBCD hexPrintString = '12').
       
  5136     self assert:(123 encodeAsBCD hexPrintString = '123').
       
  5137     self assert:(1234 encodeAsBCD hexPrintString = '1234').
       
  5138     self assert:(12345 encodeAsBCD hexPrintString = '12345').
       
  5139     self assert:(123456 encodeAsBCD hexPrintString = '123456').
       
  5140     self assert:(1234567 encodeAsBCD hexPrintString = '1234567').
       
  5141     self assert:(12345678 encodeAsBCD hexPrintString = '12345678').
       
  5142     self assert:(123456789 encodeAsBCD hexPrintString = '123456789').
       
  5143     self assert:(1234567890 encodeAsBCD hexPrintString = '1234567890').
       
  5144     self assert:(12345678901 encodeAsBCD hexPrintString = '12345678901').
       
  5145     self assert:(123456789012 encodeAsBCD hexPrintString = '123456789012').
       
  5146     self assert:(1234567890123 encodeAsBCD hexPrintString = '1234567890123').
       
  5147     self assert:(12345678901234 encodeAsBCD hexPrintString = '12345678901234').
       
  5148     self assert:(123456789012345 encodeAsBCD hexPrintString = '123456789012345').
       
  5149     self assert:(1234567890123456 encodeAsBCD hexPrintString = '1234567890123456').
       
  5150     self assert:(12345678901234567 encodeAsBCD hexPrintString = '12345678901234567').
       
  5151     self assert:(123456789012345678 encodeAsBCD hexPrintString = '123456789012345678').
       
  5152     self assert:(1234567890123456789 encodeAsBCD hexPrintString = '1234567890123456789').
       
  5153     self assert:(12345678901234567890 encodeAsBCD hexPrintString = '12345678901234567890').
       
  5154     self assert:(4611686018427387902 encodeAsBCD hexPrintString = '4611686018427387902').
       
  5155     self assert:(4611686018427387903 encodeAsBCD hexPrintString = '4611686018427387903').
       
  5156     self assert:(4611686018427387904 encodeAsBCD hexPrintString = '4611686018427387904').
       
  5157 
       
  5158     self assert:(16r1 decodeFromBCD = 1).
       
  5159     self assert:(16r12 decodeFromBCD = 12).
       
  5160     self assert:(16r123 decodeFromBCD = 123).
       
  5161     self assert:(16r1234 decodeFromBCD = 1234).
       
  5162     self assert:(16r12345 decodeFromBCD = 12345).
       
  5163     self assert:(16r123456 decodeFromBCD = 123456).
       
  5164     self assert:(16r1234567 decodeFromBCD = 1234567).
       
  5165     self assert:(16r12345678 decodeFromBCD = 12345678).
       
  5166     self assert:(16r123456789 decodeFromBCD = 123456789).
       
  5167     self assert:(16r1234567890 decodeFromBCD = 1234567890).
       
  5168     self assert:(16r12345678901 decodeFromBCD = 12345678901).
       
  5169     self assert:(16r123456789012 decodeFromBCD = 123456789012).
       
  5170     self assert:(16r1000000000000 decodeFromBCD = 1000000000000).
       
  5171     self assert:(16r0000500000000 decodeFromBCD = 500000000).
       
  5172     self assert:(16r1234500000000 decodeFromBCD = 1234500000000).
       
  5173     self assert:(16r1234567890000 decodeFromBCD = 1234567890000).
       
  5174 
       
  5175     self assert:(16r1234567890123 decodeFromBCD = 1234567890123).
       
  5176     self assert:(16r12345678901234 decodeFromBCD = 12345678901234).
       
  5177     self assert:(16r123456789012345 decodeFromBCD = 123456789012345).
       
  5178     self assert:(16r1234567890123456 decodeFromBCD = 1234567890123456).
       
  5179     self assert:(16r12345678901234567 decodeFromBCD = 12345678901234567).
       
  5180     self assert:(16r123456789012345678 decodeFromBCD = 123456789012345678).
       
  5181     self assert:(16r1234567890123456789 decodeFromBCD = 1234567890123456789).
       
  5182     self assert:(16r12345678901234567890 decodeFromBCD = 12345678901234567890).
       
  5183     self assert:(16r4611686018427387902 decodeFromBCD = 4611686018427387902).
       
  5184     self assert:(16r4611686018427387903 decodeFromBCD = 4611686018427387903).
       
  5185     self assert:(16r4611686018427387904 decodeFromBCD = 4611686018427387904).
       
  5186 
       
  5187     "
       
  5188      self basicNew testEncodeDecode
       
  5189     "
       
  5190 
       
  5191     "Modified: / 26.10.1999 / 22:01:35 / stefan"
       
  5192 !
       
  5193 
       
  5194 testFactorial
       
  5195     "/ <testedMethods: #( (Integer >> #factorial) (Integer >> #*) ) >
       
  5196 
       
  5197     self assert:(0 factorial = 1).
       
  5198     self assert:(1 factorial = 1).
       
  5199     self assert:(2 factorial = 2).
       
  5200     self assert:(10 factorial = 3628800).
       
  5201     self assert:(11 factorial = 39916800).
       
  5202     self assert:(12 factorial = 479001600).
       
  5203     self assert:(13 factorial digitBytes = #[0 204 40 115 1]).
       
  5204     self assert:(13 factorial = 6227020800).
       
  5205     self assert:(14 factorial digitBytes = #[0 40 59 76 20]).
       
  5206     self assert:(14 factorial = 87178291200).
       
  5207     self assert:(15 factorial digitBytes = #[0 88 119 119 48 1]).
       
  5208     self assert:(15 factorial = 1307674368000).
       
  5209     self assert:(16 factorial digitBytes = #[0 128 117 119 7 19]).
       
  5210     self assert:(16 factorial = 20922789888000).
       
  5211     self assert:(17 factorial digitBytes = #[0 128 205 238 126 67 1]).
       
  5212     self assert:(17 factorial = 355687428096000).
       
  5213     self assert:(18 factorial digitBytes = #[0 0 115 202 236 190 22]).
       
  5214     self assert:(18 factorial = 6402373705728000).
       
  5215     self assert:(19 factorial digitBytes = #[0 0 137 6 147 43 176 1]).
       
  5216     self assert:(19 factorial = 121645100408832000).
       
  5217     self assert:(20 factorial digitBytes = #[0 0 180 130 124 103 195 33]).
       
  5218     self assert:(20 factorial = 2432902008176640000).
       
  5219     self assert:(50 factorial = 30414093201713378043612608166064768844377641568960512000000000000).
       
  5220 
       
  5221     "
       
  5222      self basicNew testFactorial
       
  5223     "
       
  5224 
       
  5225     "Created: / 24-04-2010 / 13:52:23 / cg"
       
  5226     "Modified: / 26-02-2016 / 15:43:16 / cg"
       
  5227 !
       
  5228 
       
  5229 testGCD
       
  5230     "/ <testedMethods: #( (Integer >> #gcd:) ) >
       
  5231 
       
  5232     self assert:(9 gcd:6) = 3.
       
  5233     self assert:(6 gcd:9) = 3.
       
  5234     self assert:(2 gcd:0) = 2.
       
  5235     self assert:(0 gcd:2) = 2.
       
  5236     self assert:(20 factorial gcd:(5*6*7)) = (5*6*7).
       
  5237     self assert:(20 factorial gcd:(20 factorial / 20)) = (19 factorial).
       
  5238 
       
  5239     "
       
  5240      self basicNew testGCD
       
  5241     "
       
  5242 
       
  5243     "Created: / 27-04-2010 / 09:49:31 / cg"
       
  5244 !
       
  5245 
       
  5246 testIsPowerOfTwo
       
  5247     self assert:(1 isPowerOfTwo).
       
  5248     self assert:(2 isPowerOfTwo).
       
  5249     self assert:(4 isPowerOfTwo).
       
  5250     self assert:(3 isPowerOfTwo not).
       
  5251     self assert:(16r100000000000000000000000 isPowerOfTwo).
       
  5252     self assert:(16r300000000000000000000000 isPowerOfTwo not).
       
  5253 
       
  5254     "
       
  5255      self basicNew testIsPowerOfTwo
       
  5256     "
       
  5257 
       
  5258     "Created: / 27-04-2010 / 10:35:36 / cg"
       
  5259 !
       
  5260 
       
  5261 testNextPowerOfTwo
       
  5262     "/ self assert:(0 nextPowerOf2 = 0).
       
  5263     self assert:(1 nextPowerOf2 = 1).
       
  5264     self assert:(2 nextPowerOf2 = 2).
       
  5265     self assert:(3 nextPowerOf2 = 4).
       
  5266     self assert:(4 nextPowerOf2 = 4).
       
  5267     self assert:(5 nextPowerOf2 = 8).
       
  5268     self assert:(6 nextPowerOf2 = 8).
       
  5269     self assert:(7 nextPowerOf2 = 8).
       
  5270     self assert:(8 nextPowerOf2 = 8).
       
  5271     self assert:(9 nextPowerOf2 = 16).
       
  5272 
       
  5273     self assert:(22 nextPowerOf2 = 32).
       
  5274     self assert:(32 nextPowerOf2 = 32).
       
  5275     self assert:(16rFFFF nextPowerOf2 = 16r10000).  
       
  5276     self assert:(16r1FFFFFFF nextPowerOf2 = 16r20000000).  
       
  5277     self assert:(16r3FFFFFFF nextPowerOf2 = 16r40000000).  
       
  5278     self assert:(16r7FFFFFFF nextPowerOf2 = 16r80000000).  
       
  5279     self assert:(16rFFFFFFFF nextPowerOf2 = 16r100000000). 
       
  5280     self assert:(16r1FFFFFFFFFFFFFFF nextPowerOf2 = 16r2000000000000000).  
       
  5281     self assert:(16r3FFFFFFFFFFFFFFF nextPowerOf2 = 16r4000000000000000).  
       
  5282     self assert:(16r7FFFFFFFFFFFFFFF nextPowerOf2 = 16r8000000000000000).  
       
  5283     self assert:(16rFFFFFFFFFFFFFFFF nextPowerOf2 = 16r10000000000000000).  
       
  5284     self assert:(16rFFFFFFFFFFFFFFFFFFFF nextPowerOf2 = 16r100000000000000000000).  
       
  5285 
       
  5286     "
       
  5287      self basicNew testNextPowerOfTwo
       
  5288     "
       
  5289 !
       
  5290 
       
  5291 testProduct
       
  5292     self assert:(1 to:1) product = 1.
       
  5293     self assert:(1 to:100) product = 100 factorial.
       
  5294     self assert:(1 to:0) product = 1.
       
  5295 
       
  5296     self assert:(1 to:1) asArray product = 1.
       
  5297     self assert:(1 to:100) asArray product = 100 factorial.
       
  5298     self assert:#() product = 1.
       
  5299     self assert:#(2) product = 2.
       
  5300 
       
  5301     "
       
  5302      self basicNew testSum
       
  5303     "
       
  5304 !
       
  5305 
       
  5306 testSum
       
  5307     self assert:(1 to:1) sum = 1.
       
  5308     self assert:(1 to:100) sum = 5050.
       
  5309     self assert:(1 to:0) sum = 0.
       
  5310 
       
  5311     self assert:(1 to:1) asArray sum = 1.
       
  5312     self assert:(1 to:100) asArray sum = 5050.
       
  5313     self assert:#() sum = 0.
       
  5314     self assert:#(2) sum = 2.
       
  5315 
       
  5316     "
       
  5317      self basicNew testSum
       
  5318     "
       
  5319 !
       
  5320 
  5286 test_primes
  5321 test_primes
  5287     self 
  5322     self 
  5288         assert: ((1 to: 30) select: [:i | i isPrime] as:Array) 
  5323         assert: ((1 to: 30) select: [:i | i isPrime] as:Array) 
  5289                             = #(2 3 5 7 11 13 17 19 23 29);
  5324                             = #(2 3 5 7 11 13 17 19 23 29);
  5290         assert: ((0 to: 30) collect: [:i | i nextPrime] as:Array)
  5325         assert: ((0 to: 30) collect: [:i | i nextPrime] as:Array)