note description: "A Mersenne twister RNG" author: "Colin LeMahieu" date: "$Date$" revision: "$Revision$" quote: "A censor is a man who knows more than he thinks you ought to. - Granville Hicks (1901-1982)" class MERSENNE_TWISTER_RNG inherit RANDOM_NUMBER_GENERATOR INTEGER_X_ARITHMETIC rename cmp as cmp_special, bit_xor_lshift as bit_xor_lshift_special, bit_xor as bit_xor_special end INTEGER_X_DIVISION rename cmp as cmp_special, mod as mod_integer_x, bit_xor_lshift as bit_xor_lshift_special, bit_xor as bit_xor_special end INTEGER_X_COMPARISON INTEGER_X_LOGIC rename add as add_special, sub as sub_special, mul as mul_special end create make feature make do create mt.make_filled (0, n) randinit_mt_noseed end feature randinit_mt_noseed local i: INTEGER do from i := 0 until i >= n loop mt [i] := default_state (i) i := i + 1 end mti := warm_up \\ n end mangle_seed (r: READABLE_INTEGER_X; b_orig: READABLE_INTEGER_X) local t: INTEGER_X b: INTEGER_X e: NATURAL_32 bit_l: NATURAL_32 sign: INTEGER reduce: BOOLEAN do e := 0x40118124 bit_l := 0x20000000 create t create b.make_set (b_orig) r.copy (b) from until bit_l = 0 loop from reduce := True until not reduce loop from sign := 1 until sign = 0 loop tdiv_q_2exp (t, r, 0x19937) sign := t.sign if sign /= 0 then tdiv_r_2exp (r, r, 0x19937) addmul_ui (r, r, 0x20023) end end if e.bit_and (bit_l) /= 0 then e := e.bit_and (bit_l.bit_not) mul (r, r, b) else reduce := False end end bit_l := bit_l |>> 1 end end randseed (seed: READABLE_INTEGER_X) local i: INTEGER count: INTEGER mod: INTEGER_X seed1: INTEGER_X do create mod.make_from_natural (0) create seed1 bit_set (mod, 19937) sub_ui (mod, mod, 20027) mod_integer_x (seed1, seed, mod) add_ui (seed1, seed1, 2) mangle_seed (seed1, seed1) if bit_test (seed1, 19936) then mt [0] := 0x80000000 else mt [0] := 0x0 end bit_clear (seed1, 19936) mt.copy_data (seed1.item, 0, 1, seed1.count) count := count + 1 from until count >= n loop mt [count] := 0 count := count + 1 end if warm_up /= 0 then from i := 0 until i >= warm_up // n loop recalc_buffer i := i + 1 end end mti := warm_up \\ n end recalc_buffer local y: NATURAL_32 kk: INTEGER do from kk := 0 until kk >= n - m loop y := mt [kk].bit_and (0x80000000).bit_or (mt [kk + 1].bit_and (0x7fffffff)) if y.bit_test (0) then mt [kk] := mt [kk + m].bit_xor (y |>> 1).bit_xor (matrix_a) else mt [kk] := mt [kk + m].bit_xor (y |>> 1) end kk := kk + 1 end from until kk >= n - 1 loop y := mt [kk].bit_and (0x80000000).bit_or (mt [kk + 1].bit_and (0x7fffffff)) if y.bit_test (0) then mt [kk] := mt [kk - (n - m)].bit_xor (y |>> 1).bit_xor (matrix_a) else mt [kk] := mt [kk - (n - m)].bit_xor (y |>> 1) end kk := kk + 1 end y := mt [n - 1].bit_and (0x80000000).bit_or (mt [0].bit_and (0x7fffffff)) if y.bit_test (0) then mt [n - 1] := mt [m - 1].bit_xor (y |>> 1).bit_xor (matrix_a) else mt [n - 1] := mt [m - 1].bit_xor (y |>> 1) end end next_random (y: CELL [NATURAL_32]) do if mti >= n then recalc_buffer mti := 0 end y.put (mt [mti]) mti := mti + 1 y.put (y.item.bit_xor (y.item |>> 11)) y.put (y.item.bit_xor ((y.item |<< 7).bit_and (mask_1))) y.put (y.item.bit_xor ((y.item |<< 15).bit_and (mask_2))) y.put (y.item.bit_xor (y.item |>> 18)) end randget (target: SPECIAL [NATURAL_32]; target_offset: INTEGER_32; count: INTEGER_32) local y: CELL [NATURAL_32] rbits: INTEGER i: INTEGER nlimbs: INTEGER do create y.put (0) nlimbs := count // 32 rbits := count \\ 32 from i := 0 until i >= nlimbs loop next_random (y) target [target_offset + i] := y.item i := i + 1 end if rbits /= 0 then next_random (y) target [target_offset + nlimbs] := y.item.bit_and (((0xffffffff).to_natural_32 |<< rbits).bit_not) end end mti: INTEGER mt: SPECIAL [NATURAL_32] n: INTEGER = 624 m: INTEGER = 397 matrix_a: NATURAL_32 = 0x9908b0df warm_up: INTEGER = 2000 default_seed: INTEGER = 5489 mask_1: NATURAL_32 = 0x9d2c5680 mask_2: NATURAL_32 = 0xefc60000 default_state (i: INTEGER): NATURAL_32 do inspect i when 0 then Result := 0xD247B233 when 1 then Result := 0x9E5AA8F1 when 2 then Result := 0x0FFA981B when 3 then Result := 0x9DCB0980 when 4 then Result := 0x74200F2B when 5 then Result := 0xA576D044 when 6 then Result := 0xE9F05ADF when 7 then Result := 0x1538BFF5 when 8 then Result := 0x59818BBF when 9 then Result := 0xCF9E58D8 when 10 then Result := 0x09FCE032 when 11 then Result := 0x6A1C663F when 12 then Result := 0x5116E78A when 13 then Result := 0x69B3E0FA when 14 then Result := 0x6D92D665 when 15 then Result := 0xD0A8BE98 when 16 then Result := 0xF669B734 when 17 then Result := 0x41AC1B68 when 18 then Result := 0x630423F1 when 19 then Result := 0x4B8D6B8A when 20 then Result := 0xC2C46DD7 when 21 then Result := 0x5680747D when 22 then Result := 0x43703E8F when 23 then Result := 0x3B6103D2 when 24 then Result := 0x49E5EB3F when 25 then Result := 0xCBDAB4C1 when 26 then Result := 0x9C988E23 when 27 then Result := 0x747BEE0B when 28 then Result := 0x9111E329 when 29 then Result := 0x9F031B5A when 30 then Result := 0xECCA71B9 when 31 then Result := 0x2AFE4EF8 when 32 then Result := 0x8421C7ED when 33 then Result := 0xAC89AFF1 when 34 then Result := 0xAED90DF3 when 35 then Result := 0x2DD74F01 when 36 then Result := 0x14906A13 when 37 then Result := 0x75873FA9 when 38 then Result := 0xFF83F877 when 39 then Result := 0x5028A0C9 when 40 then Result := 0x11B4C41D when 41 then Result := 0x7CAEDBC4 when 42 then Result := 0x8672D0A7 when 43 then Result := 0x48A7C109 when 44 then Result := 0x8320E59F when 45 then Result := 0xBC0B3D5F when 46 then Result := 0x75A30886 when 47 then Result := 0xF9E0D128 when 48 then Result := 0x41AF7580 when 49 then Result := 0x239BB94D when 50 then Result := 0xC67A3C81 when 51 then Result := 0x74EEBD6E when 52 then Result := 0xBC02B53C when 53 then Result := 0x727EA449 when 54 then Result := 0x6B8A2806 when 55 then Result := 0x5853B0DA when 56 then Result := 0xBDE032F4 when 57 then Result := 0xCE234885 when 58 then Result := 0x320D6145 when 59 then Result := 0x48CC053F when 60 then Result := 0x00DBC4D2 when 61 then Result := 0xD55A2397 when 62 then Result := 0xE1059B6F when 63 then Result := 0x1C3E05D1 when 64 then Result := 0x09657C64 when 65 then Result := 0xD07CB661 when 66 then Result := 0x6E982E34 when 67 then Result := 0x6DD1D777 when 68 then Result := 0xEDED1071 when 69 then Result := 0xD79DFD65 when 70 then Result := 0xF816DDCE when 71 then Result := 0xB6FAF1E4 when 72 then Result := 0x1C771074 when 73 then Result := 0x311835BD when 74 then Result := 0x18F952F7 when 75 then Result := 0xF8F40350 when 76 then Result := 0x4ECED354 when 77 then Result := 0x7C8AC12B when 78 then Result := 0x31A9994D when 79 then Result := 0x4FD47747 when 80 then Result := 0xDC227A23 when 81 then Result := 0x6DFAFDDF when 82 then Result := 0x6796E748 when 83 then Result := 0x0C6F634F when 84 then Result := 0xF992FA1D when 85 then Result := 0x4CF670C9 when 86 then Result := 0x067DFD31 when 87 then Result := 0xA7A3E1A5 when 88 then Result := 0x8CD7D9DF when 89 then Result := 0x972CCB34 when 90 then Result := 0x67C82156 when 91 then Result := 0xD548F6A8 when 92 then Result := 0x045CEC21 when 93 then Result := 0xF3240BFB when 94 then Result := 0xDEF656A7 when 95 then Result := 0x43DE08C5 when 96 then Result := 0xDAD1F92F when 97 then Result := 0x3726C56B when 98 then Result := 0x1409F19A when 99 then Result := 0x942FD147 when 100 then Result := 0xB926749C when 101 then Result := 0xADDC31B8 when 102 then Result := 0x53D0D869 when 103 then Result := 0xD1BA52FE when 104 then Result := 0x6722DF8C when 105 then Result := 0x22D95A74 when 106 then Result := 0x7DC1B52A when 107 then Result := 0x1DEC6FD5 when 108 then Result := 0x7262874D when 109 then Result := 0x0A725DC9 when 110 then Result := 0xE6A8193D when 111 then Result := 0xA052835A when 112 then Result := 0xDC9AD928 when 113 then Result := 0xE59EBB90 when 114 then Result := 0x70DBA9FF when 115 then Result := 0xD612749D when 116 then Result := 0x5A5A638C when 117 then Result := 0x6086EC37 when 118 then Result := 0x2A579709 when 119 then Result := 0x1449EA3A when 120 then Result := 0xBC8E3C06 when 121 then Result := 0x2F900666 when 122 then Result := 0xFBE74FD1 when 123 then Result := 0x6B35B911 when 124 then Result := 0xF8335008 when 125 then Result := 0xEF1E979D when 126 then Result := 0x738AB29D when 127 then Result := 0xA2DC0FDC when 128 then Result := 0x7696305D when 129 then Result := 0xF5429DAC when 130 then Result := 0x8C41813B when 131 then Result := 0x8073E02E when 132 then Result := 0xBEF83CCD when 133 then Result := 0x7B50A95A when 134 then Result := 0x05EE5862 when 135 then Result := 0x00829ECE when 136 then Result := 0x8CA1958C when 137 then Result := 0xBE4EA2E2 when 138 then Result := 0x4293BB73 when 139 then Result := 0x656F7B23 when 140 then Result := 0x417316D8 when 141 then Result := 0x4467D7CF when 142 then Result := 0x2200E63B when 143 then Result := 0x109050C8 when 144 then Result := 0x814CBE47 when 145 then Result := 0x36B1D4A8 when 146 then Result := 0x36AF9305 when 147 then Result := 0x308327B3 when 148 then Result := 0xEBCD7344 when 149 then Result := 0xA738DE27 when 150 then Result := 0x5A10C399 when 151 then Result := 0x4142371D when 152 then Result := 0x64A18528 when 153 then Result := 0x0B31E8B2 when 154 then Result := 0x641057B9 when 155 then Result := 0x6AFC363B when 156 then Result := 0x108AD953 when 157 then Result := 0x9D4DA234 when 158 then Result := 0x0C2D9159 when 159 then Result := 0x1C8A1A1F when 160 then Result := 0x310C66BA when 161 then Result := 0x87AA1070 when 162 then Result := 0xDAC832FF when 163 then Result := 0x0A433422 when 164 then Result := 0x7AF15812 when 165 then Result := 0x2D8D9BD0 when 166 then Result := 0x995A25E9 when 167 then Result := 0x25326CAC when 168 then Result := 0xA34384DB when 169 then Result := 0x4C8421CC when 170 then Result := 0x4F0315EC when 171 then Result := 0x29E8649E when 172 then Result := 0xA7732D6F when 173 then Result := 0x2E94D3E3 when 174 then Result := 0x7D98A340 when 175 then Result := 0x397C4D74 when 176 then Result := 0x659DB4DE when 177 then Result := 0x747D4E9A when 178 then Result := 0xD9DB8435 when 179 then Result := 0x4659DBE9 when 180 then Result := 0x313E6DC5 when 181 then Result := 0x29D104DC when 182 then Result := 0x9F226CBA when 183 then Result := 0x452F18B0 when 184 then Result := 0xD0BC5068 when 185 then Result := 0x844CA299 when 186 then Result := 0x782B294E when 187 then Result := 0x4AE2EB7B when 188 then Result := 0xA4C475F8 when 189 then Result := 0x70A81311 when 190 then Result := 0x4B3E8BCC when 191 then Result := 0x7E20D4BA when 192 then Result := 0xABCA33C9 when 193 then Result := 0x57BE2960 when 194 then Result := 0x44F9B419 when 195 then Result := 0x2E567746 when 196 then Result := 0x72EB757A when 197 then Result := 0x102CC0E8 when 198 then Result := 0xB07F32B9 when 199 then Result := 0xD0DABD59 when 200 then Result := 0xBA85AD6B when 201 then Result := 0xF3E20667 when 202 then Result := 0x98D77D81 when 203 then Result := 0x197AFA47 when 204 then Result := 0x518EE9AC when 205 then Result := 0xE10CE5A2 when 206 then Result := 0x01CF2C2A when 207 then Result := 0xD3A3AF3D when 208 then Result := 0x16DDFD65 when 209 then Result := 0x669232F8 when 210 then Result := 0x1C50A301 when 211 then Result := 0xB93D9151 when 212 then Result := 0x9354D3F4 when 213 then Result := 0x847D79D0 when 214 then Result := 0xD5FE2EC6 when 215 then Result := 0x1F7B0610 when 216 then Result := 0xFA6B90A5 when 217 then Result := 0xC5879041 when 218 then Result := 0x2E7DC05E when 219 then Result := 0x423F1F32 when 220 then Result := 0xEF623DDB when 221 then Result := 0x49C13280 when 222 then Result := 0x98714E92 when 223 then Result := 0xC7B6E4AD when 224 then Result := 0xC4318466 when 225 then Result := 0x0737F312 when 226 then Result := 0x4D3C003F when 227 then Result := 0x9ACC1F1F when 228 then Result := 0x5F1C926D when 229 then Result := 0x085FA771 when 230 then Result := 0x185A83A2 when 231 then Result := 0xF9AA159D when 232 then Result := 0x0B0B0132 when 233 then Result := 0xF98E7A43 when 234 then Result := 0xCD9EBDBE when 235 then Result := 0x0190CB29 when 236 then Result := 0x10D93FB6 when 237 then Result := 0x3B8A4D97 when 238 then Result := 0x66A65A41 when 239 then Result := 0xE43E766F when 240 then Result := 0x77BE3C41 when 241 then Result := 0xB9686364 when 242 then Result := 0xCB36994D when 243 then Result := 0x6846A287 when 244 then Result := 0x567E77F7 when 245 then Result := 0x36178DD8 when 246 then Result := 0xBDE6B1F2 when 247 then Result := 0xB6EFDC64 when 248 then Result := 0x82950324 when 249 then Result := 0x42053F47 when 250 then Result := 0xC09BE51C when 251 then Result := 0x0942D762 when 252 then Result := 0x35F92C7F when 253 then Result := 0x367DEC61 when 254 then Result := 0x6EE3D983 when 255 then Result := 0xDBAAF78A when 256 then Result := 0x265D2C47 when 257 then Result := 0x8EB4BF5C when 258 then Result := 0x33B232D7 when 259 then Result := 0xB0137E77 when 260 then Result := 0x373C39A7 when 261 then Result := 0x8D2B2E76 when 262 then Result := 0xC7510F01 when 263 then Result := 0x50F9E032 when 264 then Result := 0x7B1FDDDB when 265 then Result := 0x724C2AAE when 266 then Result := 0xB10ECB31 when 267 then Result := 0xCCA3D1B8 when 268 then Result := 0x7F0BCF10 when 269 then Result := 0x4254BBBD when 270 then Result := 0xE3F93B97 when 271 then Result := 0x2305039B when 272 then Result := 0x53120E22 when 273 then Result := 0x1A2F3B9A when 274 then Result := 0x0FDDBD97 when 275 then Result := 0x0118561E when 276 then Result := 0x0A798E13 when 277 then Result := 0x9E0B3ACD when 278 then Result := 0xDB6C9F15 when 279 then Result := 0xF512D0A2 when 280 then Result := 0x9E8C3A28 when 281 then Result := 0xEE2184AE when 282 then Result := 0x0051EC2F when 283 then Result := 0x2432F74F when 284 then Result := 0xB0AA66EA when 285 then Result := 0x55128D88 when 286 then Result := 0xF7D83A38 when 287 then Result := 0x4DAE8E82 when 288 then Result := 0x3FDC98D6 when 289 then Result := 0x5F0BD341 when 290 then Result := 0x7244BE1D when 291 then Result := 0xC7B48E78 when 292 then Result := 0x2D473053 when 293 then Result := 0x43892E20 when 294 then Result := 0xBA0F1F2A when 295 then Result := 0x524D4895 when 296 then Result := 0x2E10BCB1 when 297 then Result := 0x4C372D81 when 298 then Result := 0x5C3E50CD when 299 then Result := 0xCF61CC2E when 300 then Result := 0x931709AB when 301 then Result := 0x81B3AEFC when 302 then Result := 0x39E9405E when 303 then Result := 0x7FFE108C when 304 then Result := 0x4FBB3FF8 when 305 then Result := 0x06ABE450 when 306 then Result := 0x7F5BF51E when 307 then Result := 0xA4E3CDFD when 308 then Result := 0xDB0F6C6F when 309 then Result := 0x159A1227 when 310 then Result := 0x3B9FED55 when 311 then Result := 0xD20B6F7F when 312 then Result := 0xFBE9CC83 when 313 then Result := 0x64856619 when 314 then Result := 0xBF52B8AF when 315 then Result := 0x9D7006B0 when 316 then Result := 0x71165BC6 when 317 then Result := 0xAE324AEE when 318 then Result := 0x29D27F2C when 319 then Result := 0x794C2086 when 320 then Result := 0x74445CE2 when 321 then Result := 0x782915CC when 322 then Result := 0xD4CE6886 when 323 then Result := 0x3289AE7C when 324 then Result := 0x53DEF297 when 325 then Result := 0x4185F7ED when 326 then Result := 0x88B72400 when 327 then Result := 0x3C09DC11 when 328 then Result := 0xBCE3AAB6 when 329 then Result := 0x6A75934A when 330 then Result := 0xB267E399 when 331 then Result := 0x000DF1BF when 332 then Result := 0x193BA5E2 when 333 then Result := 0xFA3E1977 when 334 then Result := 0x179E14F6 when 335 then Result := 0x1EEDE298 when 336 then Result := 0x691F0B06 when 337 then Result := 0xB84F78AC when 338 then Result := 0xC1C15316 when 339 then Result := 0xFFFF3AD6 when 340 then Result := 0x0B457383 when 341 then Result := 0x518CD612 when 342 then Result := 0x05A00F3E when 343 then Result := 0xD5B7D275 when 344 then Result := 0x4C5ECCD7 when 345 then Result := 0xE02CD0BE when 346 then Result := 0x5558E9F2 when 347 then Result := 0x0C89BBF0 when 348 then Result := 0xA3D96227 when 349 then Result := 0x2832D2B2 when 350 then Result := 0xF667B897 when 351 then Result := 0xD4556554 when 352 then Result := 0xF9D2F01F when 353 then Result := 0xFA1E3FAE when 354 then Result := 0x52C2E1EE when 355 then Result := 0xE5451F31 when 356 then Result := 0x7E849729 when 357 then Result := 0xDABDB67A when 358 then Result := 0x54BF5E7E when 359 then Result := 0xF831C271 when 360 then Result := 0x5F1A17E3 when 361 then Result := 0x9D140AFE when 362 then Result := 0x92741C47 when 363 then Result := 0x48CFABCE when 364 then Result := 0x9CBBE477 when 365 then Result := 0x9C3EE57F when 366 then Result := 0xB07D4C39 when 367 then Result := 0xCC21BCE2 when 368 then Result := 0x697708B1 when 369 then Result := 0x58DA2A6B when 370 then Result := 0x2370DB16 when 371 then Result := 0x6E641948 when 372 then Result := 0xACC5BD52 when 373 then Result := 0x868F24CC when 374 then Result := 0xCA1DB0F5 when 375 then Result := 0x4CADA492 when 376 then Result := 0x3F443E54 when 377 then Result := 0xC4A4D5E9 when 378 then Result := 0xF00AD670 when 379 then Result := 0xE93C86E0 when 380 then Result := 0xFE90651A when 381 then Result := 0xDDE532A3 when 382 then Result := 0xA66458DF when 383 then Result := 0xAB7D7151 when 384 then Result := 0x0E2E775F when 385 then Result := 0xC9109F99 when 386 then Result := 0x8D96D59F when 387 then Result := 0x73CEF14C when 388 then Result := 0xC74E88E9 when 389 then Result := 0x02712DC0 when 390 then Result := 0x04F41735 when 391 then Result := 0x2E5914A2 when 392 then Result := 0x59F4B2FB when 393 then Result := 0x0287FC83 when 394 then Result := 0x80BC0343 when 395 then Result := 0xF6B32559 when 396 then Result := 0xC74178D4 when 397 then Result := 0xF1D99123 when 398 then Result := 0x383CCC07 when 399 then Result := 0xACC0637D when 400 then Result := 0x0863A548 when 401 then Result := 0xA6FCAC85 when 402 then Result := 0x2A13EFF0 when 403 then Result := 0xAF2EEDB1 when 404 then Result := 0x41E72750 when 405 then Result := 0xE0C6B342 when 406 then Result := 0x5DA22B46 when 407 then Result := 0x635559E0 when 408 then Result := 0xD2EA40AC when 409 then Result := 0x10AA98C0 when 410 then Result := 0x19096497 when 411 then Result := 0x112C542B when 412 then Result := 0x2C85040C when 413 then Result := 0xA868E7D0 when 414 then Result := 0x6E260188 when 415 then Result := 0xF596D390 when 416 then Result := 0xC3BB5D7A when 417 then Result := 0x7A2AA937 when 418 then Result := 0xDFD15032 when 419 then Result := 0x6780AE3B when 420 then Result := 0xDB5F9CD8 when 421 then Result := 0x8BD266B0 when 422 then Result := 0x7744AF12 when 423 then Result := 0xB463B1B0 when 424 then Result := 0x589629C9 when 425 then Result := 0xE30DBC6E when 426 then Result := 0x880F5569 when 427 then Result := 0x209E6E16 when 428 then Result := 0x9DECA50C when 429 then Result := 0x02987A57 when 430 then Result := 0xBED3EA57 when 431 then Result := 0xD3A678AA when 432 then Result := 0x70DD030D when 433 then Result := 0x0CFD9C5D when 434 then Result := 0x92A18E99 when 435 then Result := 0xF5740619 when 436 then Result := 0x7F6F0A7D when 437 then Result := 0x134CAF9A when 438 then Result := 0x70F5BAE4 when 439 then Result := 0x23DCA7B5 when 440 then Result := 0x4D788FCD when 441 then Result := 0xC7F07847 when 442 then Result := 0xBCF77DA1 when 443 then Result := 0x9071D568 when 444 then Result := 0xFC627EA1 when 445 then Result := 0xAE004B77 when 446 then Result := 0x66B54BCB when 447 then Result := 0x7EF2DAAC when 448 then Result := 0xDCD5AC30 when 449 then Result := 0xB9BDF730 when 450 then Result := 0x505A97A7 when 451 then Result := 0x9D881FD3 when 452 then Result := 0xADB796CC when 453 then Result := 0x94A1D202 when 454 then Result := 0x97535D7F when 455 then Result := 0x31EC20C0 when 456 then Result := 0xB1887A98 when 457 then Result := 0xC1475069 when 458 then Result := 0xA6F73AF3 when 459 then Result := 0x71E4E067 when 460 then Result := 0x46A569DE when 461 then Result := 0xD2ADE430 when 462 then Result := 0x6F0762C7 when 463 then Result := 0xF50876F4 when 464 then Result := 0x53510542 when 465 then Result := 0x03741C3E when 466 then Result := 0x53502224 when 467 then Result := 0xD8E54D60 when 468 then Result := 0x3C44AB1A when 469 then Result := 0x34972B46 when 470 then Result := 0x74BFA89D when 471 then Result := 0xD7D768E0 when 472 then Result := 0x37E605DC when 473 then Result := 0xE13D1BDF when 474 then Result := 0x5051C421 when 475 then Result := 0xB9E057BE when 476 then Result := 0xB717A14C when 477 then Result := 0xA1730C43 when 478 then Result := 0xB99638BE when 479 then Result := 0xB5D5F36D when 480 then Result := 0xE960D9EA when 481 then Result := 0x6B1388D3 when 482 then Result := 0xECB6D3B6 when 483 then Result := 0xBDBE8B83 when 484 then Result := 0x2E29AFC5 when 485 then Result := 0x764D71EC when 486 then Result := 0x4B8F4F43 when 487 then Result := 0xC21DDC00 when 488 then Result := 0xA63F657F when 489 then Result := 0x82678130 when 490 then Result := 0xDBF535AC when 491 then Result := 0xA594FC58 when 492 then Result := 0x942686BC when 493 then Result := 0xBD9B657B when 494 then Result := 0x4A0F9B61 when 495 then Result := 0x44FF184F when 496 then Result := 0x38E10A2F when 497 then Result := 0x61910626 when 498 then Result := 0x5E247636 when 499 then Result := 0x7106D137 when 500 then Result := 0xC62802F0 when 501 then Result := 0xBD1D1F00 when 502 then Result := 0x7CC0DCB2 when 503 then Result := 0xED634909 when 504 then Result := 0xDC13B24E when 505 then Result := 0x9799C499 when 506 then Result := 0xD77E3D6A when 507 then Result := 0x14773B68 when 508 then Result := 0x967A4FB7 when 509 then Result := 0x35EECFB1 when 510 then Result := 0x2A5110B8 when 511 then Result := 0xE2F0AF94 when 512 then Result := 0x9D09DEA5 when 513 then Result := 0x20255D27 when 514 then Result := 0x5771D34B when 515 then Result := 0xE1089EE4 when 516 then Result := 0x246F330B when 517 then Result := 0x8F7CAEE5 when 518 then Result := 0xD3064712 when 519 then Result := 0x75CAFBEE when 520 then Result := 0xB94F7028 when 521 then Result := 0xED953666 when 522 then Result := 0x5D1975B4 when 523 then Result := 0x5AF81271 when 524 then Result := 0x13BE2025 when 525 then Result := 0x85194659 when 526 then Result := 0x30805331 when 527 then Result := 0xEC9D46C0 when 528 then Result := 0xBC027C36 when 529 then Result := 0x2AF84188 when 530 then Result := 0xC2141B80 when 531 then Result := 0xC02B1E4A when 532 then Result := 0x04D36177 when 533 then Result := 0xFC50E9D7 when 534 then Result := 0x39CE79DA when 535 then Result := 0x917E0A00 when 536 then Result := 0xEF7A0BF4 when 537 then Result := 0xA98BD8D1 when 538 then Result := 0x19424DD2 when 539 then Result := 0x9439DF1F when 540 then Result := 0xC42AF746 when 541 then Result := 0xADDBE83E when 542 then Result := 0x85221F0D when 543 then Result := 0x45563E90 when 544 then Result := 0x9095EC52 when 545 then Result := 0x77887B25 when 546 then Result := 0x8AE46064 when 547 then Result := 0xBD43B71A when 548 then Result := 0xBB541956 when 549 then Result := 0x7366CF9D when 550 then Result := 0xEE8E1737 when 551 then Result := 0xB5A727C9 when 552 then Result := 0x5076B3E7 when 553 then Result := 0xFC70BACA when 554 then Result := 0xCE135B75 when 555 then Result := 0xC4E91AA3 when 556 then Result := 0xF0341911 when 557 then Result := 0x53430C3F when 558 then Result := 0x886B0824 when 559 then Result := 0x6BB5B8B7 when 560 then Result := 0x33E21254 when 561 then Result := 0xF193B456 when 562 then Result := 0x5B09617F when 563 then Result := 0x215FFF50 when 564 then Result := 0x48D97EF1 when 565 then Result := 0x356479AB when 566 then Result := 0x6EA9DDC4 when 567 then Result := 0x0D352746 when 568 then Result := 0xA2F5CE43 when 569 then Result := 0xB226A1B3 when 570 then Result := 0x1329EA3C when 571 then Result := 0x7A337CC2 when 572 then Result := 0xB5CCE13D when 573 then Result := 0x563E3B5B when 574 then Result := 0x534E8E8F when 575 then Result := 0x561399C9 when 576 then Result := 0xE1596392 when 577 then Result := 0xB0F03125 when 578 then Result := 0x4586645B when 579 then Result := 0x1F371847 when 580 then Result := 0x94EAABD1 when 581 then Result := 0x41F97EDD when 582 then Result := 0xE3E5A39B when 583 then Result := 0x71C774E2 when 584 then Result := 0x507296F4 when 585 then Result := 0x5960133B when 586 then Result := 0x7852C494 when 587 then Result := 0x3F5B2691 when 588 then Result := 0xA3F87774 when 589 then Result := 0x5A7AF89E when 590 then Result := 0x17DA3F28 when 591 then Result := 0xE9D9516D when 592 then Result := 0xFCC1C1D5 when 593 then Result := 0xE4618628 when 594 then Result := 0x04081047 when 595 then Result := 0xD8E4DB5F when 596 then Result := 0xDC380416 when 597 then Result := 0x8C4933E2 when 598 then Result := 0x95074D53 when 599 then Result := 0xB1B0032D when 600 then Result := 0xCC8102EA when 601 then Result := 0x71641243 when 602 then Result := 0x98D6EB6A when 603 then Result := 0x90FEC945 when 604 then Result := 0xA0914345 when 605 then Result := 0x6FAB037D when 606 then Result := 0x70F49C4D when 607 then Result := 0x05BF5B0E when 608 then Result := 0x927AAF7F when 609 then Result := 0xA1940F61 when 610 then Result := 0xFEE0756F when 611 then Result := 0xF815369F when 612 then Result := 0x5C00253B when 613 then Result := 0xF2B9762F when 614 then Result := 0x4AEB3CCC when 615 then Result := 0x1069F386 when 616 then Result := 0xFBA4E7B9 when 617 then Result := 0x70332665 when 618 then Result := 0x6BCA810E when 619 then Result := 0x85AB8058 when 620 then Result := 0xAE4B2B2F when 621 then Result := 0x9D120712 when 622 then Result := 0xBEE8EACB when 623 then Result := 0x776A1112 end end end