Merge branch 'list' into io
[cantaveria.git] / rng.c
blobf17d665b8ed11d076f557182a4ac0e2c6e354ef1
1 /*
2 rng.c
3 random number generator
5 Copyright (C) 2009 Evan Rinehart
7 This software comes with no warranty.
8 1. This software can be used for any purpose, good or evil.
9 2. Modifications must retain this license, at least in spirit.
12 Theory of Operation
13 Lag-1024 complimentary multiply-with-carry (CMWC) generator
15 This algorithm performs the following operation
16 ax + c
17 where a, x, and c are numbers less than b (the base, 2^32)
18 using the rth last products (complimented) mod b as x and the
19 last associated carry as c. a is a constant and r is the size
20 of the rng state.
22 Another way to explain the above is
23 z = a*x[i-r] + c
24 x[i] = ~(z % b)
25 c = z / b
27 r, a, and b must be chosen carefully or the period will be
28 very much less than the maximum 2^(32*(r+1)). For cmwc we choose
29 them so that p = ab^r + 1 is prime.
31 The first r x's and the initial c serve as the generator seed.
32 For the generator to produce high quality random numbers as soon
33 as possible, x should be prepopulated with r random numbers.
35 If the following parameters are used
36 b = 2^32
37 r = 1024
38 a = 109111
39 the resulting rng has a period of 109111*2^327652
41 The period of this rng is so large that is will effectively
42 never repeat. It will generate high quality random numbers for
43 the forseeable future. The state of the generator can be
44 saved and restored in case of program interruption. Besides
45 the initial seed the generator will never need to be reseeded.
47 When the generator is initialized for the very first time there
48 are three options. You can reset it, which loads the state with
49 static data stored in the module. This data was generated with
50 a high quality RNG and should be the default initial state of the
51 generator. You may also initialize the generator with output of
52 the c library rand function using your desired seed. You may also
53 initialize the generator using /dev/urandom to put it into an
54 unpredictable state. Besides these three initialization methods you
55 may load whatever data you wish into the state.
57 zrand - return the next number in the current sequence
58 zseed - set the current sequence using 1024+1 numbers
59 zsrand - set the current sequence using 1 number and C srand
60 zsrand_u - put the generator into an unpredictable state using urandom
61 zread - return the generator state which can later be passed to zseed
63 refs:
64 http://tbf.coe.wayne.edu/jmasm/vol2_no1.pdf
65 http://en.wikipedia.org/wiki/Multiply-with-carry
66 google multiply with carry generator
70 #include <stdio.h>
71 #include <stdlib.h>
72 #include <string.h>
75 #define A 109111ULL
76 #define R 1024
78 static unsigned x[R];
79 static unsigned c = 0;
80 static unsigned long long z;
81 static int i = 0;
82 static unsigned n;
84 static const unsigned seed[R];
86 unsigned zrand(){
87 z = A*x[i] + c;
88 n = ~z;
89 x[i] = n;
90 c = z >> 32;
91 i = (i+1) & (R-1);
92 return n;
95 void zseed(unsigned data[], unsigned carry){
96 memcpy(x, data, R*sizeof(unsigned));
97 c = carry;
100 void zread(unsigned data[], unsigned* carry){
101 memcpy(data, x, R*sizeof(unsigned));
102 *carry = c;
105 void zreset(){
106 memcpy(x, seed, 4*R);
107 c = 0;
110 void zsrand(unsigned s){
111 int i;
112 srand(s);
113 for(i=0; i<R; i++){
114 x[i] = rand();
116 c = 0;
119 void zsrand_u(){
120 FILE* f = fopen("/dev/urandom", "r");
121 fread(x, 4, R, f);
122 fclose(f);
123 c = 0;
128 static const unsigned seed[R] = {
129 0x78ccb683,0x3481a375,0x5f9e6898,0xf9800e83,
130 0x572d893b,0x70fff9bb,0xf70ac0ed,0x6141c9e5,
131 0x56952454,0xe390e62b,0x506ab7f2,0xba359e85,
132 0x9651ba89,0x2db34285,0xb9e4e900,0xc2c441bf,
133 0xee4c1b28,0xe7b8dbb8,0x1d503c0c,0xe7b898a0,
134 0x8973343d,0x83edcea2,0xc4594719,0x1278dfd4,
135 0x19284537,0x93dce563,0x0f5dcba7,0x10326602,
136 0x50622b42,0x52fd6472,0x0eab0e1c,0x86726558,
137 0xd0e942c6,0x1b8b7f7f,0xacfdda30,0xbf546229,
138 0x86c73055,0x1c4e38d6,0x7c9b6485,0xf1255a28,
139 0xbf7d2776,0x245ec55a,0xa11b17da,0x5790130f,
140 0x8aa4c429,0x7b42ce04,0x05de0f3b,0x4e5fcf14,
141 0xbe728848,0x66309ddd,0xfdde7c99,0x7506dd9c,
142 0x3d3dc7fe,0xd764811b,0x0fb1d105,0xf8f1f0b4,
143 0x6b551bbb,0x59dba288,0xa2057ef2,0xb5cec6c3,
144 0x325edf2a,0x738f018a,0xa0a1595f,0xe07e75b2,
145 0x2ed4e01e,0xe49e9cf8,0xd81169d0,0xc33d4959,
146 0xd3c292ef,0xa2b44c50,0x872477c9,0xbd17555a,
147 0xca1553d9,0xbe07313f,0x98a5b066,0x0352aff0,
148 0x26b1e8cb,0x33a579e9,0x385bc3c8,0xf0e159b5,
149 0x7b328475,0x5e4e2476,0x826e3993,0xd2ecff8f,
150 0x7cce1681,0x45211af5,0x465b7c0a,0xc371aeb3,
151 0xf1955cf4,0x40ff8fda,0x4d7bf519,0xeaf544d6,
152 0xff059143,0x97f801d1,0x9ba5d97d,0x3481e4e6,
153 0x0a7adf1a,0x683d6419,0x1b0c23cc,0x81e96d4d,
154 0x2d696bb8,0x5501ab1d,0xdc4d40dc,0x0a94689a,
155 0x0b2e9d49,0x5a54142e,0xc5f53ec4,0x05b99e81,
156 0xf6d3ad93,0xfa3a35c0,0xd824ca5a,0x9cc48f0f,
157 0x0824427d,0x68f9ff01,0x2935fccd,0x54b3c756,
158 0x49577f74,0x2ce4d756,0x13f28c99,0xa1f8eb08,
159 0x25e5b692,0x146c87f7,0x2a52b5f6,0x38a167e2,
160 0xf85e0cc5,0x0f1dcfca,0xd587d7d9,0xe670a74f,
161 0x293cfc4f,0x441598a2,0xc33802d6,0x77611818,
162 0x324f28ac,0xfc5e95a8,0x8d565d14,0x364cc747,
163 0xe893601f,0x4a239063,0x4bfe992c,0xa11cccf4,
164 0x5076fb6a,0x9f82534f,0xd55c4556,0xe67e5278,
165 0x2713682d,0x3f67bfef,0x5e340226,0xc3827e00,
166 0x7cb65e4d,0x96ca1fbc,0xa634377c,0xbcd99761,
167 0xcbf9f020,0x1fe1c5f7,0x11b6c429,0xc50582a8,
168 0x9a3d4dd6,0x08e33e56,0xc4062d25,0xc86bf8e3,
169 0x3492f08a,0xf5a3ce2c,0x76a37a2c,0x7a03e627,
170 0xbd08a762,0xafd09713,0x8dee4875,0xecad968c,
171 0x1a503997,0x9079d84a,0xd47bf00d,0x8993e4b3,
172 0x0cc997a7,0xd3692b89,0x71e6bc52,0x43f1083c,
173 0x43ca213d,0xf55fca42,0xb8b3abff,0x9f2f07f3,
174 0x450eb777,0x69ab46a0,0x468ef3c9,0x9a3dfded,
175 0xb12a4324,0xbfa78f40,0x4974cd9d,0x3bd6065a,
176 0xf22c2b23,0x9d61aab0,0x6ec63c14,0xbdb74178,
177 0x1e79ec34,0x1ca968ce,0x46f53c5c,0xa3e7a02d,
178 0x89116891,0xdb212284,0xf76788b0,0xc3e9b8bb,
179 0xbe634032,0x6d4d79cc,0x19ab0387,0xca0375c7,
180 0x6694d1a0,0xd19e9ccc,0xde2942b5,0x8eebab87,
181 0x563942e0,0x63ab7b3a,0x3ef3b2e7,0x6fc8f783,
182 0x76219787,0xa13e7dcd,0x4f303de9,0xc29bded4,
183 0x1b2698d6,0x6a69d2dc,0x1a8b8baa,0x85c70b2f,
184 0x97ca278f,0x5f688eb8,0x56ba8212,0x5bc13245,
185 0xaaf7059b,0x4b9630bc,0x6a6cf57d,0xa6fff589,
186 0x2c3bc80d,0x8aa32824,0xbd31bcc7,0xaba8239f,
187 0xef1f58a5,0x85f26400,0x69f18d3c,0x4920b415,
188 0xe43439a3,0xceadc396,0x949b2e24,0xc99ba482,
189 0x1b94752e,0x3f0a9520,0xa5e241c3,0x7433b591,
190 0xd84ef68e,0x24cac645,0x019b6ceb,0xb87fbbec,
191 0x5d4b3bb0,0x6e4dc037,0xb99945c9,0xac400e3b,
192 0x1ba21e36,0x2827b514,0x9a519e3f,0x08113a64,
193 0x8284e8a9,0x85269c90,0xc8002367,0xf68917be,
194 0x35ea12f1,0x20010bc0,0xef70eaa4,0xb58d113b,
195 0xf9c1b996,0xfb851f82,0x47d38c93,0x3f9ecf44,
196 0x676571e8,0x4da20222,0xfb3e90d4,0x637238d5,
197 0x133493f6,0xe6e7b50b,0x6782a425,0x89a898b6,
198 0xe75a0349,0x07acd03f,0xe318ac70,0x68c9c705,
199 0x24a1cfa1,0x994e441f,0xd9d7deed,0x2945eaeb,
200 0xaaf00caf,0x9187d425,0x66ad8ade,0xc886ffa3,
201 0xeaec9646,0x70cffcf4,0x5857f917,0x11cf60f5,
202 0x237d5194,0x028aec76,0x2f71ef65,0x0e3dc017,
203 0x5b57ad5b,0x2c7f8c2d,0x240c370c,0xee756fdb,
204 0x14c42734,0xd7e72c62,0x77e74166,0x4efd0b01,
205 0xc9db1cd2,0x44be9730,0x63f18a83,0x4f8b4338,
206 0xa6b8b99d,0x5624b383,0xcf005b92,0xdad5b8e6,
207 0xaf7d8e31,0xb103ee60,0x5c2d0688,0x458454ad,
208 0x488e7e33,0x603ccf6b,0x51e2de47,0x4c47cfc0,
209 0xa26f91bf,0xade37619,0x3f00bff2,0xab40e158,
210 0x0255cfcb,0x86f2b7ff,0x6759c53c,0xfbef40e2,
211 0xdd7a83ed,0xcd5347e0,0x0e106d40,0x0640608c,
212 0x2c9ef901,0x78b76d8b,0x5e7f4eef,0xd216b10d,
213 0x886c2275,0x8b1d0f79,0xa4b35dac,0x457abe80,
214 0x404102d0,0x155f7659,0x94d22808,0xb44ce43f,
215 0xfc90ca4c,0xd8632508,0xca4ae466,0x70b057b3,
216 0x000636e1,0x43f4348b,0x2683eddd,0x06617c3f,
217 0xa271f9a0,0x5b8fe19c,0x7f005a2e,0xa7f38cc5,
218 0x0e35248c,0xb0b924ca,0xb4c240a2,0xc8b90031,
219 0x146b51c8,0x763e0b09,0xc03a9944,0x9935bf09,
220 0xfd5c6d44,0x624d91ff,0xcc165723,0xa0112178,
221 0x56976668,0xebcd0f8b,0x5d93b3d3,0x085bd6f0,
222 0x84543c6a,0x0ce05ee6,0x57ac79db,0xdc06d8de,
223 0x90cfe3b1,0x8aa9a759,0xc7828fe4,0x20cf002e,
224 0x274ec237,0x2903502c,0x9f29fa6d,0x677f044e,
225 0xc99ed8eb,0xdbe2a291,0x6a6de59b,0x0586cf4a,
226 0x97bdb15b,0x8f9d7a7f,0xa86f079f,0x1936774d,
227 0xaf99474b,0x09d34689,0xcdc33564,0x1832e6bf,
228 0x86c10bf5,0x8748f0bd,0xd261c0c4,0x9a500ba6,
229 0xe09dbde3,0x1de20a01,0x0c31bfa7,0xef1315a4,
230 0x4960b046,0x22247379,0xf74eb94d,0x33caf43a,
231 0xe723c02a,0x7dfa339b,0xa3771fc2,0x60a12776,
232 0x4fd24a1d,0x79c7180e,0xa29d4d14,0x5d3a4258,
233 0xabd02a93,0xc74407ac,0x6de3e324,0xeb3cc2e0,
234 0x40f67f0e,0x510aeb60,0x7e6aa493,0x8b9711f2,
235 0x0adedf8f,0xc6d4641a,0x590f31fe,0x72944abd,
236 0xecafecf3,0xe4a560d2,0x8c7cf2d2,0x72252c0c,
237 0xe21d7b60,0xd12084a5,0x3cd70790,0xe06927d4,
238 0x52cbda5b,0xaa5a4d46,0xbd0d334b,0x70079756,
239 0x6444eff8,0x7e9aff56,0x660a5e3e,0xa231cacb,
240 0xf287ee23,0x5e286f4f,0x37b2d779,0xe8618016,
241 0x2322f60b,0x0235ab4b,0xc788e32d,0x23788080,
242 0xe6b7ce71,0xbdf2c30b,0xf89c28ce,0xbaa4dd64,
243 0x7fb78637,0xf80054f2,0xda8a954b,0x53b2c79c,
244 0x472181a0,0x55fa9f39,0x4d5a46e6,0x471ca40f,
245 0xbb7ce1c4,0x80bdda5d,0xd6e43a9a,0xa62569b5,
246 0x1b1ba751,0x3de2c78a,0xebcca99a,0x756ec1f5,
247 0xb23615da,0x9bbca3c9,0x855639b6,0x13573a5a,
248 0x90cabd4d,0xe22ac854,0xa80d9bb3,0xb93886ed,
249 0x391930c0,0x1ab7dd5f,0x1e64bb37,0xe547b420,
250 0x0a2e934b,0x6f017028,0xadf47a8b,0x1a3c0002,
251 0xb56e47b0,0x7e7b953b,0x0c463808,0xd15f880b,
252 0xf8b0f3d4,0xcd829c10,0xd7f3bd5d,0x8f773cc4,
253 0x5aa36693,0xd08bc8b1,0xae1af81a,0x1fd7b980,
254 0xb8666bd0,0xe3742d04,0x4c7dde81,0x5af48b8b,
255 0x41039866,0x1e080901,0x12aafdf6,0x2b9a488f,
256 0xccee6671,0xfe0f3664,0x1613867d,0x1925442a,
257 0xa3d0ff13,0xc75bec5a,0x4b385188,0x5afc94c2,
258 0x80c17d0f,0x91901bb5,0x650855c3,0xa8dace10,
259 0xfacbb9e3,0x69d2de39,0xdd42f20a,0xf147960c,
260 0x5a587906,0xc6e725b4,0x27d0886d,0xf462065b,
261 0xe21bef3c,0x1fd233aa,0x99ed9b31,0xe6ec751e,
262 0x6cb2994a,0x8131886a,0x3145e5a8,0xf558a152,
263 0x34cb4ae8,0xa3652156,0x741e3dd5,0x5e3cb33a,
264 0xec72dc96,0x2ebcf3d9,0x4befb0e2,0xfca149a2,
265 0x74eee63c,0x4570a0e4,0xf9e7efd0,0x7f3d3dc4,
266 0x211a4623,0x7fe53c8f,0x0114126b,0xc2ab46b1,
267 0xf6fbbc22,0x07e6d02e,0x88ad479b,0x95679e16,
268 0xb3fc5046,0xa576a264,0x471ec40c,0x4a2d62eb,
269 0x4438e83d,0x854d650e,0xe224e45e,0x16bc6a50,
270 0xbab37736,0x43e3ef2b,0xaf92772e,0x275da723,
271 0xe0aea5d6,0x41e9e4fa,0x1ae44657,0x6a3a894b,
272 0x9ae2d49f,0xe4b09222,0x2439e401,0x3c7e0cea,
273 0x0ebd9895,0xcf5632f6,0x6030543e,0x429d9edb,
274 0x2ff98a12,0x96c33e76,0xda74ba0f,0x2bd84112,
275 0x20ded070,0xfadb4f71,0x70950006,0x87a5d4fb,
276 0xc3df2020,0xa0dab835,0x4b4f4c0a,0x3358a676,
277 0xfa02770e,0x5ba5cc28,0x2cd45d8c,0x63d0e809,
278 0x542aa98f,0x7e024718,0xf05544fd,0x1d6483d7,
279 0xf9955a3e,0xe063b004,0x18a8d0cb,0x83ca36c3,
280 0x87f8af41,0x24356b37,0x87381c1e,0x2e7f8766,
281 0x1d38e26a,0x1345efcf,0x700c8bbe,0x351d6ed1,
282 0xbd061dec,0xa08f572d,0xd50f1cfd,0x3aa4120d,
283 0xf751b9c8,0xc7df7503,0x54f2dacb,0x93e834bf,
284 0x7687e44d,0x2c919332,0xf847bf8e,0x6e18cdb2,
285 0x4ea165b1,0xb64fc741,0x655a252d,0x2be1e10c,
286 0x81622059,0xe3efe002,0xfbd0003b,0x7f3fb5de,
287 0x0213539a,0x19c16ab7,0xc95f0da3,0x16a3354b,
288 0x591b7289,0xa8762dcf,0x07669c50,0x4bdbcbda,
289 0xa3f833d2,0xb0e453d3,0x62ad9e76,0x96d63c01,
290 0x2dc71a74,0xc2700652,0xaf812ed8,0x58bdb8ee,
291 0x31194cbd,0x6cc94a8c,0xdbd6721b,0x0b47b413,
292 0x032f62d4,0x662b8d44,0xe22709fb,0xf391ab6a,
293 0x75205ed0,0xae56f40d,0xe4a38906,0xde446c0a,
294 0xcbe7633f,0x15eb029b,0xe483fd69,0x53169fca,
295 0xf11c2dc7,0x50923fee,0x17091a3e,0x618dc7c0,
296 0x33494049,0x56a7c2d6,0x3ee64506,0x7b38446f,
297 0xc16e318f,0xda219fab,0xb8220def,0xdb6e5cff,
298 0x193dd0f1,0xa3205a84,0xa12a6c53,0x8c802cf5,
299 0x600f80ff,0xe91425ec,0xfca8dbfa,0x3a284a25,
300 0xd3ebda03,0x32d8ec03,0x63ef3e64,0x1611e012,
301 0x5dd8ef17,0x3e9b0525,0x23802863,0xabe1bbbb,
302 0xc062c84e,0x22191bef,0x6678f71b,0xced7fa52,
303 0x7d16ab68,0x46b53255,0xb6b4b754,0x585ee57f,
304 0xad004ebd,0x8d0eb7ba,0x496a4358,0x003a76da,
305 0x45d8a5f5,0xc7d457c6,0x38f47353,0xe6cf9032,
306 0x0e22692e,0x617c53d2,0x9d8d4905,0x7b3c48fc,
307 0x20179377,0xeee8a0a8,0xa1505f61,0x5579ee38,
308 0xc70f8dab,0x1030ff8f,0x0235bdc7,0xa2435abd,
309 0x42be7ad0,0x95340af8,0x2c5eecc9,0xc6377722,
310 0x2df31134,0xe27e7de0,0x11e053f7,0x7395aa54,
311 0x15ca6f6a,0xc6f999b5,0x3c4e4ba5,0xea34d68e,
312 0xf5427a59,0xce5c4d06,0xe16d2494,0x3ae219ee,
313 0x80c2ef1b,0x3259e75d,0x67127bfb,0x0f3163c5,
314 0xdc6d34a1,0xaa4b95ed,0x7487ac64,0x413df8a8,
315 0xdebc5b26,0xb5011148,0xd899ec53,0xb093c566,
316 0x889ad5e7,0x5ddfa97d,0xa1cb7749,0xc3e31de8,
317 0xaaec178a,0x4ff11de5,0x8942cc38,0x52dd5db6,
318 0x4789b3c7,0x7e52610b,0xa41fbcc3,0xf8081823,
319 0x54420030,0x46c27d0e,0x1a67966d,0xa66e320a,
320 0xd3be6dee,0x0ec03c4e,0xc9bd6e7b,0xe87e5b7b,
321 0x58c22e12,0x9fd0a92a,0x5095127e,0xf9434224,
322 0x0a4a9fc6,0x50b37439,0x11451b9e,0x69a59028,
323 0x00366203,0xf816c308,0x620173d0,0x9fc4dd84,
324 0x497a7f1f,0xaaba033b,0x8fd4c439,0x1868ee3d,
325 0xb222ba46,0xa0c3a09a,0x5fa25e0b,0x5a21f132,
326 0xc12dba9b,0x855f8b4d,0x67009272,0x11f2e885,
327 0xc455b065,0x44aa4ae4,0xc61b6fb4,0x84cd83b0,
328 0x0dadacef,0xcf01c1f4,0x992d49f3,0x6f19c165,
329 0xf8f819ee,0x0094daae,0x7f123269,0xa83ef1fb,
330 0x38b5fb9b,0xa1094c7f,0x78b880cd,0x4c8c8d12,
331 0xe6b7b0de,0x1bcc790e,0x2c43ae95,0xa8921cd1,
332 0x2d97286e,0x844dcfd0,0xf2825de7,0x0d357b5c,
333 0x63259e87,0x46cbb174,0x7bf4ea7f,0xb16f9c2d,
334 0x55c138cb,0x33a02270,0xa2b84686,0x19cbe730,
335 0x37bb8813,0x00e4e6c8,0xde365a1a,0x5e90e5d3,
336 0xc206f6cd,0x26a56e98,0x6f6de8b3,0x4aed90ca,
337 0xdedcc216,0xedcb8b04,0x4cd2e06b,0x135d765b,
338 0xcbdab903,0x1e8623bc,0xf4dd5959,0x58f72256,
339 0x0cc68c76,0x9385e695,0x0df07923,0x25780fa6,
340 0xf9aa17d3,0x79ca3daa,0x7de341f3,0x858ebe32,
341 0x113164a5,0x39bd5133,0xd4e5ae8a,0xe3b00fc0,
342 0x7b07df0d,0xd3a3b026,0xd576a9a1,0x8bfac055,
343 0xfa4ee836,0xfa708691,0x5b46911b,0x44e1f903,
344 0x0eb679e1,0xbc945613,0x977d7ed7,0x1a305f22,
345 0x0c9bc435,0xada73b62,0x7bb53db9,0x3e7dfc20,
346 0xb36c4434,0x37075fa0,0x6a5cfc72,0x497abcca,
347 0x4922d0ab,0xd6cc674b,0xdfaaa1c7,0x09f7e0b0,
348 0xe9150218,0x53c661d9,0xe24d095b,0xbf9b03c4,
349 0x9aaeee7e,0x335b206a,0xf60b8e4a,0x996b7933,
350 0xc4adfbcb,0x588a2ccb,0x80757000,0x1e895e88,
351 0x4d73fb03,0x65ed62f0,0x03448eb0,0xf349d162,
352 0xe849f8b7,0xebe423b1,0xc81187a7,0x201e4c9a,
353 0x1afaa893,0x7803d25b,0xb4f1e9e7,0x6b6eadec,
354 0xcaef703e,0x3361407d,0x7014c8b6,0x9edeb022,
355 0xd4b9a3ba,0xbc74f0ad,0x3d00f7f5,0x6e556e31,
356 0x4ab88abc,0xeae0f853,0xb2d4039d,0xf38f1441,
357 0xa1ce980e,0x99f874e3,0x894d41be,0xc474fb9f,
358 0x05af1e82,0xde824b66,0xfc86f0f5,0x93d9f6f3,
359 0xcd4f6d72,0x9d52f00b,0x87418c3d,0x661689a5,
360 0x6abd7ce1,0x79890d4f,0x9ddb73b8,0xd19d251c,
361 0xe2527680,0xef92f5d7,0xd3c94750,0xe0d5a177,
362 0xbbab5e1e,0xd24b75d2,0x08a46507,0x9e4ecbb5,
363 0x9e3d0c0f,0x8258ec58,0x6a289d70,0xf58bfe7e,
364 0x1db04252,0x1e27c93e,0x7f269ba3,0x031e994a,
365 0x61d00429,0x563751b4,0x0a89cdc6,0x6dfece7a,
366 0x889611b0,0x86a215e5,0xbcbca365,0x4191770a,
367 0x60dcc19e,0x607f5121,0x49611e62,0x30a04b14,
368 0xad538ef1,0x0a48c1ae,0xdc2fd80d,0xf48e5375,
369 0xc8f7d9fb,0x964c0d8e,0x252641be,0xe552ca6a,
370 0x3a806a22,0x78c6788f,0x0eb9a73c,0x5cf8eba4,
371 0xee4ce76e,0xca24d902,0xd81d4257,0xba4f4373,
372 0xa4e6d2fc,0xcdff8c5d,0xf04452a0,0xd24ed156,
373 0xe3135ea0,0xfdb8846e,0x54cdd95c,0x3285f5f0,
374 0x8a5aefe3,0x6c68d56b,0x1e9b5109,0xf34f2aef,
375 0x84e3071b,0x46b82e1d,0xd970b8ba,0x08bee27d,
376 0x7408b4ef,0x2a9e6edc,0x3cbf57bb,0xfe3c8cf9,
377 0x44c2dbfe,0x45206d53,0x5ace5ff5,0x099bf422,
378 0xbf99926c,0x5aaaf1b7,0xbecee19b,0x878d8917,
379 0xa4e6b59c,0x181d373d,0x9926d5d1,0x9c79a6b9,
380 0x21f94776,0xa8fce4be,0x9eb14285,0x5709faa5,
381 0x9a72dec5,0x2dcbef6c,0xb00e107c,0x635c25d3,
382 0xf9c6a9c5,0x94fb2617,0x99bf9c4a,0x36b717cd,
383 0x1e5af761,0x224336ab,0x3d928cdb,0x8104788b,
384 0x3caa7ea5,0x31eec558,0xc0cf133e,0x787100a9